diff options
| author | Scott Moser <smoser@ubuntu.com> | 2016-06-03 16:22:19 -0400 | 
|---|---|---|
| committer | Scott Moser <smoser@ubuntu.com> | 2016-06-03 16:22:19 -0400 | 
| commit | bc9bd58d1533d996029770da758f73217c15af33 (patch) | |
| tree | 04a23063e872352604042a16171f908f7a8abb83 /cloudinit/sources/DataSourceNoCloud.py | |
| parent | e513fc39555242f0be3049fb36eb04e708e70e66 (diff) | |
| parent | 42a7d2b6d44be5fd6e41734902e08897b709015d (diff) | |
| download | vyos-cloud-init-bc9bd58d1533d996029770da758f73217c15af33.tar.gz vyos-cloud-init-bc9bd58d1533d996029770da758f73217c15af33.zip | |
improve network configuration
This branch accomplishes several things:
 - centrally handle 'dsmode' to be 'local' or 'net.
   This allows local data sources to run before networking
   but still have user-data read by default when networking is available.
 - support networking information being read on dreamcompute
   dreamcompute's openstack declares networking via the
   /etc/network/interfaces style 'network_config' format.
 
 - support reading and applying networking information on SmartOS
 - improve reading networking from openstack network_data.json (LP: #1577982)
   add support for mtu and routes and many miscellaneous fixes.
 - support for renaming devices in a container (LP: #1579130).
   Also rename network devices as instructed by the host on
   every boot where cloud-init networking is enabled.  This is required
   because a.) containers do not get systemd.link files applied
   as they do not have udev. b.) if the initramfs is out of date
   then we need to apply them.
 - remove blocking of udev rules (LP: #1577844, LP: #1571761)
LP: #1577982, #1579130, #1577844, #1571761
Diffstat (limited to 'cloudinit/sources/DataSourceNoCloud.py')
| -rw-r--r-- | cloudinit/sources/DataSourceNoCloud.py | 78 | 
1 files changed, 34 insertions, 44 deletions
| diff --git a/cloudinit/sources/DataSourceNoCloud.py b/cloudinit/sources/DataSourceNoCloud.py index 48c61a90..7e30118c 100644 --- a/cloudinit/sources/DataSourceNoCloud.py +++ b/cloudinit/sources/DataSourceNoCloud.py @@ -24,6 +24,7 @@ import errno  import os  from cloudinit import log as logging +from cloudinit import net  from cloudinit import sources  from cloudinit import util @@ -35,7 +36,6 @@ class DataSourceNoCloud(sources.DataSource):          sources.DataSource.__init__(self, sys_cfg, distro, paths)          self.dsmode = 'local'          self.seed = None -        self.cmdline_id = "ds=nocloud"          self.seed_dirs = [os.path.join(paths.seed_dir, 'nocloud'),                            os.path.join(paths.seed_dir, 'nocloud-net')]          self.seed_dir = None @@ -58,7 +58,7 @@ class DataSourceNoCloud(sources.DataSource):          try:              # Parse the kernel command line, getting data passed in              md = {} -            if parse_cmdline_data(self.cmdline_id, md): +            if load_cmdline_data(md):                  found.append("cmdline")                  mydata = _merge_new_seed(mydata, {'meta-data': md})          except Exception: @@ -123,12 +123,6 @@ class DataSourceNoCloud(sources.DataSource):                      mydata = _merge_new_seed(mydata, seeded) -                    # For seed from a device, the default mode is 'net'. -                    # that is more likely to be what is desired.  If they want -                    # dsmode of local, then they must specify that. -                    if 'dsmode' not in mydata['meta-data']: -                        mydata['meta-data']['dsmode'] = "net" -                      LOG.debug("Using data from %s", dev)                      found.append(dev)                      break @@ -144,7 +138,6 @@ class DataSourceNoCloud(sources.DataSource):          if len(found) == 0:              return False -        seeded_network = None          # The special argument "seedfrom" indicates we should          # attempt to seed the userdata / metadata from its value          # its primarily value is in allowing the user to type less @@ -160,10 +153,6 @@ class DataSourceNoCloud(sources.DataSource):                  LOG.debug("Seed from %s not supported by %s", seedfrom, self)                  return False -            if (mydata['meta-data'].get('network-interfaces') or -                    mydata.get('network-config')): -                seeded_network = self.dsmode -              # This could throw errors, but the user told us to do it              # so if errors are raised, let them raise              (md_seed, ud) = util.read_seeded(seedfrom, timeout=None) @@ -179,35 +168,21 @@ class DataSourceNoCloud(sources.DataSource):          mydata['meta-data'] = util.mergemanydict([mydata['meta-data'],                                                    defaults]) -        netdata = {'format': None, 'data': None} -        if mydata['meta-data'].get('network-interfaces'): -            netdata['format'] = 'interfaces' -            netdata['data'] = mydata['meta-data']['network-interfaces'] -        elif mydata.get('network-config'): -            netdata['format'] = 'network-config' -            netdata['data'] = mydata['network-config'] - -        # if this is the local datasource or 'seedfrom' was used -        # and the source of the seed was self.dsmode. -        # Then see if there is network config to apply. -        # note this is obsolete network-interfaces style seeding. -        if self.dsmode in ("local", seeded_network): -            if mydata['meta-data'].get('network-interfaces'): -                LOG.debug("Updating network interfaces from %s", self) -                self.distro.apply_network( -                    mydata['meta-data']['network-interfaces']) - -        if mydata['meta-data']['dsmode'] == self.dsmode: -            self.seed = ",".join(found) -            self.metadata = mydata['meta-data'] -            self.userdata_raw = mydata['user-data'] -            self.vendordata_raw = mydata['vendor-data'] -            self._network_config = mydata['network-config'] -            return True +        self.dsmode = self._determine_dsmode( +            [mydata['meta-data'].get('dsmode')]) -        LOG.debug("%s: not claiming datasource, dsmode=%s", self, -                  mydata['meta-data']['dsmode']) -        return False +        if self.dsmode == sources.DSMODE_DISABLED: +            LOG.debug("%s: not claiming datasource, dsmode=%s", self, +                      self.dsmode) +            return False + +        self.seed = ",".join(found) +        self.metadata = mydata['meta-data'] +        self.userdata_raw = mydata['user-data'] +        self.vendordata_raw = mydata['vendor-data'] +        self._network_config = mydata['network-config'] +        self._network_eni = mydata['meta-data'].get('network-interfaces') +        return True      def check_instance_id(self, sys_cfg):          # quickly (local check only) if self.instance_id is still valid @@ -227,6 +202,9 @@ class DataSourceNoCloud(sources.DataSource):      @property      def network_config(self): +        if self._network_config is None: +            if self.network_eni is not None: +                self._network_config = net.convert_eni_data(self.network_eni)          return self._network_config @@ -254,8 +232,22 @@ def _quick_read_instance_id(cmdline_id, dirs=None):      return None +def load_cmdline_data(fill, cmdline=None): +    pairs = [("ds=nocloud", sources.DSMODE_LOCAL), +             ("ds=nocloud-net", sources.DSMODE_NETWORK)] +    for idstr, dsmode in pairs: +        if parse_cmdline_data(idstr, fill, cmdline): +            # if dsmode was explicitly in the commanad line, then +            # prefer it to the dsmode based on the command line id +            if 'dsmode' not in fill: +                fill['dsmode'] = dsmode +            return True +    return False + +  # Returns true or false indicating if cmdline indicated -# that this module should be used +# that this module should be used.  Updates dictionary 'fill' +# with data that was found.  # Example cmdline:  #  root=LABEL=uec-rootfs ro ds=nocloud  def parse_cmdline_data(ds_id, fill, cmdline=None): @@ -319,9 +311,7 @@ def _merge_new_seed(cur, seeded):  class DataSourceNoCloudNet(DataSourceNoCloud):      def __init__(self, sys_cfg, distro, paths):          DataSourceNoCloud.__init__(self, sys_cfg, distro, paths) -        self.cmdline_id = "ds=nocloud-net"          self.supported_seed_starts = ("http://", "https://", "ftp://") -        self.dsmode = "net"  # Used to match classes to dependencies | 
