Exemplo n.º 1
0
    def network_config(self):
        """Return a network config dict for rendering ENI or netplan files."""
        if self._network_config != sources.UNSET:
            return self._network_config

        if self.metadata is None:
            # this would happen if get_data hadn't been called. leave as UNSET
            LOG.warning(
                "Unexpected call to network_config when metadata is None.")
            return None

        result = None
        no_network_metadata_on_aws = bool(
            'network' not in self.metadata and
            self.cloud_platform == Platforms.AWS)
        if no_network_metadata_on_aws:
            LOG.debug("Metadata 'network' not present:"
                      " Refreshing stale metadata from prior to upgrade.")
            util.log_time(
                logfunc=LOG.debug, msg='Re-crawl of metadata service',
                func=self._crawl_metadata)

        # Limit network configuration to only the primary/fallback nic
        iface = self.fallback_interface
        macs_to_nics = {net.get_interface_mac(iface): iface}
        net_md = self.metadata.get('network')
        if isinstance(net_md, dict):
            result = convert_ec2_metadata_network_config(
                net_md, macs_to_nics=macs_to_nics, fallback_nic=iface)
        else:
            LOG.warning("Metadata 'network' key not valid: %s.", net_md)
        self._network_config = result

        return self._network_config
Exemplo n.º 2
0
 def test_get_interface_mac_grabs_bonding_address(self):
     """get_interfaces returns the source device mac for bonded devices."""
     source_dev_mac = 'aa:bb:cc:aa:bb:cc'
     bonded_mac = 'dd:ee:ff:dd:ee:ff'
     write_file(os.path.join(self.sysdir, 'eth1', 'address'), bonded_mac)
     write_file(
         os.path.join(self.sysdir, 'eth1', 'bonding_slave', 'perm_hwaddr'),
         source_dev_mac)
     self.assertEqual(source_dev_mac, net.get_interface_mac('eth1'))
Exemplo n.º 3
0
 def test_get_interface_mac_grabs_bonding_address(self):
     """get_interfaces returns the source device mac for bonded devices."""
     source_dev_mac = 'aa:bb:cc:aa:bb:cc'
     bonded_mac = 'dd:ee:ff:dd:ee:ff'
     write_file(os.path.join(self.sysdir, 'eth1', 'address'), bonded_mac)
     write_file(
         os.path.join(self.sysdir, 'eth1', 'bonding_slave', 'perm_hwaddr'),
         source_dev_mac)
     self.assertEqual(source_dev_mac, net.get_interface_mac('eth1'))
Exemplo n.º 4
0
    def network_config(self):
        """Return a network config dict for rendering ENI or netplan files."""
        if self._network_config != sources.UNSET:
            return self._network_config

        if self.metadata is None:
            # this would happen if get_data hadn't been called. leave as UNSET
            LOG.warning(
                "Unexpected call to network_config when metadata is None.")
            return None

        result = None
        no_network_metadata_on_aws = bool(
            'network' not in self.metadata and
            self.cloud_name == CloudNames.AWS)
        if no_network_metadata_on_aws:
            LOG.debug("Metadata 'network' not present:"
                      " Refreshing stale metadata from prior to upgrade.")
            util.log_time(
                logfunc=LOG.debug, msg='Re-crawl of metadata service',
                func=self.get_data)

        # Limit network configuration to only the primary/fallback nic
        iface = self.fallback_interface
        macs_to_nics = {net.get_interface_mac(iface): iface}
        net_md = self.metadata.get('network')
        if isinstance(net_md, dict):
            result = convert_ec2_metadata_network_config(
                net_md, macs_to_nics=macs_to_nics, fallback_nic=iface)

            # RELEASE_BLOCKER: xenial should drop the below if statement,
            # because the issue being addressed doesn't exist pre-netplan.
            # (This datasource doesn't implement check_instance_id() so the
            # datasource object is recreated every boot; this means we don't
            # need to modify update_events on cloud-init upgrade.)

            # Non-VPC (aka Classic) Ec2 instances need to rewrite the
            # network config file every boot due to MAC address change.
            if self.is_classic_instance():
                self.update_events['network'].add(EventType.BOOT)
        else:
            LOG.warning("Metadata 'network' key not valid: %s.", net_md)
        self._network_config = result

        return self._network_config
Exemplo n.º 5
0
    def network_config(self):
        """Generate a network config like net.generate_fallback_network() with
           the following execptions.

           1. Probe the drivers of the net-devices present and inject them in
              the network configuration under params: driver: <driver> value
           2. If the driver value is 'mlx4_core', the control mode should be
              set to manual.  The device will be later used to build a bond,
              for now we want to ensure the device gets named but does not
              break any network configuration
        """
        blacklist = ['mlx4_core']
        if not self._network_config:
            LOG.debug('Azure: generating fallback configuration')
            # generate a network config, blacklist picking any mlx4_core devs
            netconfig = net.generate_fallback_config(
                blacklist_drivers=blacklist, config_driver=True)

            # if we have any blacklisted devices, update the network_config to
            # include the device, mac, and driver values, but with no ip
            # config; this ensures udev rules are generated but won't affect
            # ip configuration
            bl_found = 0
            for bl_dev in [
                    dev for dev in net.get_devicelist()
                    if net.device_driver(dev) in blacklist
            ]:
                bl_found += 1
                cfg = {
                    'type': 'physical',
                    'name': 'vf%d' % bl_found,
                    'mac_address': net.get_interface_mac(bl_dev),
                    'params': {
                        'driver': net.device_driver(bl_dev),
                        'device_id': net.device_devid(bl_dev),
                    },
                }
                netconfig['config'].append(cfg)

            self._network_config = netconfig

        return self._network_config
Exemplo n.º 6
0
    def network_config(self):
        """Return a network config dict for rendering ENI or netplan files."""
        if self._network_config != sources.UNSET:
            return self._network_config

        if self.metadata is None:
            # this would happen if get_data hadn't been called. leave as UNSET
            LOG.warning(
                "Unexpected call to network_config when metadata is None.")
            return None

        result = None
        no_network_metadata_on_aws = bool(
            'network' not in self.metadata
            and self.cloud_name == CloudNames.AWS)
        if no_network_metadata_on_aws:
            LOG.debug("Metadata 'network' not present:"
                      " Refreshing stale metadata from prior to upgrade.")
            util.log_time(logfunc=LOG.debug,
                          msg='Re-crawl of metadata service',
                          func=self.get_data)

        # Limit network configuration to only the primary/fallback nic
        iface = self.fallback_interface
        macs_to_nics = {net.get_interface_mac(iface): iface}
        net_md = self.metadata.get('network')
        if isinstance(net_md, dict):
            result = convert_ec2_metadata_network_config(
                net_md, macs_to_nics=macs_to_nics, fallback_nic=iface)
            # RELEASE_BLOCKER: Xenial debian/postinst needs to add
            # EventType.BOOT on upgrade path for classic.

            # Non-VPC (aka Classic) Ec2 instances need to rewrite the
            # network config file every boot due to MAC address change.
            if self.is_classic_instance():
                self.update_events['network'].add(EventType.BOOT)
        else:
            LOG.warning("Metadata 'network' key not valid: %s.", net_md)
        self._network_config = result

        return self._network_config
Exemplo n.º 7
0
 def test_get_interface_mac(self):
     """get_interfaces returns the mac from SYS_CLASS_NET/dev/address."""
     mac = 'aa:bb:cc:aa:bb:cc'
     write_file(os.path.join(self.sysdir, 'eth1', 'address'), mac)
     self.assertEqual(mac, net.get_interface_mac('eth1'))
Exemplo n.º 8
0
 def test_get_interface_mac_false_with_no_mac(self):
     """get_device_list returns False when no mac is reported."""
     ensure_file(os.path.join(self.sysdir, 'eth0', 'bonding'))
     mac_path = os.path.join(self.sysdir, 'eth0', 'address')
     self.assertFalse(os.path.exists(mac_path))
     self.assertFalse(net.get_interface_mac('eth0'))
Exemplo n.º 9
0
 def get_interface_mac(self, devname: DeviceName):
     return net.get_interface_mac(devname)
Exemplo n.º 10
0
 def test_get_interface_mac(self):
     """get_interfaces returns the mac from SYS_CLASS_NET/dev/address."""
     mac = 'aa:bb:cc:aa:bb:cc'
     write_file(os.path.join(self.sysdir, 'eth1', 'address'), mac)
     self.assertEqual(mac, net.get_interface_mac('eth1'))
Exemplo n.º 11
0
 def test_get_interface_mac_false_with_no_mac(self):
     """get_device_list returns False when no mac is reported."""
     ensure_file(os.path.join(self.sysdir, 'eth0', 'bonding'))
     mac_path = os.path.join(self.sysdir, 'eth0', 'address')
     self.assertFalse(os.path.exists(mac_path))
     self.assertFalse(net.get_interface_mac('eth0'))