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
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'))
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
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
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
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'))
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'))
def get_interface_mac(self, devname: DeviceName): return net.get_interface_mac(devname)