def test_convert_ec2_metadata_network_config_handles_only_dhcp6(self): """Config dhcp6 when ipv6s is in metadata for a mac.""" macs_to_nics = {self.mac1: 'eth9'} network_metadata_ipv6 = copy.deepcopy(self.network_metadata) nic1_metadata = ( network_metadata_ipv6['interfaces']['macs'][self.mac1]) nic1_metadata['ipv6s'] = '2620:0:1009:fd00:e442:c88d:c04d:dc85/64' nic1_metadata.pop('public-ipv4s') expected = { 'version': 2, 'ethernets': { 'eth9': { 'match': { 'macaddress': self.mac1 }, 'set-name': 'eth9', 'dhcp4': True, 'dhcp6': True } } } self.assertEqual( expected, ec2.convert_ec2_metadata_network_config(network_metadata_ipv6, macs_to_nics))
def test_md_with_secondary_v4_and_v6_addresses(self): """All secondary addresses are returned from nic metadata""" self.assertEqual( [ "172.31.45.70/20", "2600:1f16:292:100:f152:2222:3333:4444/128", "2600:1f16:292:100:f153:12a3:c37c:11f9/128", ], ec2.get_secondary_addresses(NIC1_MD_IPV4_IPV6_MULTI_IP, self.mac), )
def test_convert_ec2_metadata_network_config_skips_absent_macs(self): """Any mac absent from metadata is skipped by network config.""" macs_to_nics = {self.mac1: 'eth9', 'DE:AD:BE:EF:FF:FF': 'vitualnic2'} # DE:AD:BE:EF:FF:FF represented by OS but not in metadata expected = {'version': 1, 'config': [ {'mac_address': self.mac1, 'type': 'physical', 'name': 'eth9', 'subnets': [{'type': 'dhcp4'}]}]} self.assertEqual( expected, ec2.convert_ec2_metadata_network_config( self.network_metadata, macs_to_nics))
def test_convert_ec2_metadata_gets_macs_from_get_interfaces_by_mac(self): """Convert Ec2 Metadata calls get_interfaces_by_mac by default.""" expected = {'version': 1, 'config': [ {'mac_address': self.mac1, 'type': 'physical', 'name': 'eth9', 'subnets': [{'type': 'dhcp4'}]}]} patch_path = ( 'cloudinit.sources.DataSourceEc2.net.get_interfaces_by_mac') with mock.patch(patch_path) as m_get_interfaces_by_mac: m_get_interfaces_by_mac.return_value = {self.mac1: 'eth9'} self.assertEqual( expected, ec2.convert_ec2_metadata_network_config(self.network_metadata))
def test_convert_ec2_metadata_network_config_handles_local_dhcp4(self): """Config dhcp4 when there are no public addresses in public-ipv4s.""" macs_to_nics = {self.mac1: 'eth9'} network_metadata_ipv6 = copy.deepcopy(self.network_metadata) nic1_metadata = ( network_metadata_ipv6['interfaces']['macs'][self.mac1]) nic1_metadata['local-ipv4s'] = '172.3.3.15' nic1_metadata.pop('public-ipv4s') expected = {'version': 1, 'config': [ {'mac_address': self.mac1, 'type': 'physical', 'name': 'eth9', 'subnets': [{'type': 'dhcp4'}]}]} self.assertEqual( expected, ec2.convert_ec2_metadata_network_config( network_metadata_ipv6, macs_to_nics))
def test_convert_ec2_metadata_network_config_handles_dhcp4_and_dhcp6(self): """Config both dhcp4 and dhcp6 when both vpc-ipv6 and ipv4 exists.""" macs_to_nics = {self.mac1: 'eth9'} network_metadata_both = copy.deepcopy(self.network_metadata) nic1_metadata = ( network_metadata_both['interfaces']['macs'][self.mac1]) nic1_metadata['ipv6s'] = '2620:0:1009:fd00:e442:c88d:c04d:dc85/64' expected = {'version': 1, 'config': [ {'mac_address': self.mac1, 'type': 'physical', 'name': 'eth9', 'subnets': [{'type': 'dhcp4'}, {'type': 'dhcp6'}]}]} self.assertEqual( expected, ec2.convert_ec2_metadata_network_config( network_metadata_both, macs_to_nics))
def test_convert_ec2_metadata_network_config_handles_only_dhcp6(self): """Config dhcp6 when ipv6s is in metadata for a mac.""" macs_to_nics = {self.mac1: 'eth9'} network_metadata_ipv6 = copy.deepcopy(self.network_metadata) nic1_metadata = ( network_metadata_ipv6['interfaces']['macs'][self.mac1]) nic1_metadata['ipv6s'] = '2620:0:1009:fd00:e442:c88d:c04d:dc85/64' nic1_metadata.pop('public-ipv4s') expected = {'version': 1, 'config': [ {'mac_address': self.mac1, 'type': 'physical', 'name': 'eth9', 'subnets': [{'type': 'dhcp6'}]}]} self.assertEqual( expected, ec2.convert_ec2_metadata_network_config( network_metadata_ipv6, macs_to_nics))
def test_convert_ec2_metadata_network_config_handles_absent_dhcp4(self): """Config dhcp4 on fallback_nic when there are no ipv4 addresses.""" macs_to_nics = {self.mac1: 'eth9'} network_metadata_ipv6 = copy.deepcopy(self.network_metadata) nic1_metadata = ( network_metadata_ipv6['interfaces']['macs'][self.mac1]) nic1_metadata['public-ipv4s'] = '' # When no ipv4 or ipv6 content but fallback_nic set, set dhcp4 config. expected = {'version': 1, 'config': [ {'mac_address': self.mac1, 'type': 'physical', 'name': 'eth9', 'subnets': [{'type': 'dhcp4'}]}]} self.assertEqual( expected, ec2.convert_ec2_metadata_network_config( network_metadata_ipv6, macs_to_nics, fallback_nic='eth9'))
def test_convert_ec2_metadata_network_config_handles_multiple_nics(self): """DHCP route-metric increases on secondary NICs for IPv4 and IPv6.""" mac2 = "06:17:04:d7:26:08" macs_to_nics = {self.mac1: "eth9", mac2: "eth10"} network_metadata_both = copy.deepcopy(self.network_metadata) # Add 2nd nic info network_metadata_both["interfaces"]["macs"][mac2] = NIC2_MD nic1_metadata = network_metadata_both["interfaces"]["macs"][self.mac1] nic1_metadata["ipv6s"] = "2620:0:1009:fd00:e442:c88d:c04d:dc85/64" nic1_metadata.pop("public-ipv4s") # No public-ipv4 IPs in cfg nic1_metadata["local-ipv4s"] = "10.0.0.42" # Local ipv4 only on vpc expected = { "version": 2, "ethernets": { "eth9": { "match": { "name": "eth9" }, "set-name": "eth9", "dhcp4": True, "dhcp4-overrides": { "route-metric": 100 }, "dhcp6": True, "dhcp6-overrides": { "route-metric": 100 }, }, "eth10": { "match": { "name": "eth10" }, "set-name": "eth10", "dhcp4": True, "dhcp4-overrides": { "route-metric": 200 }, "dhcp6": False, }, }, } self.assertEqual( expected, ec2.convert_ec2_metadata_network_config(network_metadata_both, macs_to_nics), )
def test_convert_ec2_metadata_network_config_handles_multiple_nics(self): """DHCP route-metric increases on secondary NICs for IPv4 and IPv6.""" mac2 = '06:17:04:d7:26:08' macs_to_nics = {self.mac1: 'eth9', mac2: 'eth10'} network_metadata_both = copy.deepcopy(self.network_metadata) # Add 2nd nic info network_metadata_both['interfaces']['macs'][mac2] = NIC2_MD nic1_metadata = ( network_metadata_both['interfaces']['macs'][self.mac1]) nic1_metadata['ipv6s'] = '2620:0:1009:fd00:e442:c88d:c04d:dc85/64' nic1_metadata.pop('public-ipv4s') # No public-ipv4 IPs in cfg nic1_metadata['local-ipv4s'] = '10.0.0.42' # Local ipv4 only on vpc expected = { 'version': 2, 'ethernets': { 'eth9': { 'match': { 'macaddress': self.mac1 }, 'set-name': 'eth9', 'dhcp4': True, 'dhcp4-overrides': { 'route-metric': 100 }, 'dhcp6': True, 'dhcp6-overrides': { 'route-metric': 100 } }, 'eth10': { 'match': { 'macaddress': mac2 }, 'set-name': 'eth10', 'dhcp4': True, 'dhcp4-overrides': { 'route-metric': 200 }, 'dhcp6': False } } } self.assertEqual( expected, ec2.convert_ec2_metadata_network_config(network_metadata_both, macs_to_nics))
def test_convert_ec2_metadata_network_config_handles_local_v4_and_v6(self): """When dhcp6 is public and dhcp4 is set to local enable both.""" macs_to_nics = {self.mac1: 'eth9'} network_metadata_both = copy.deepcopy(self.network_metadata) nic1_metadata = ( network_metadata_both['interfaces']['macs'][self.mac1]) nic1_metadata['ipv6s'] = '2620:0:1009:fd00:e442:c88d:c04d:dc85/64' nic1_metadata.pop('public-ipv4s') nic1_metadata['local-ipv4s'] = '10.0.0.42' # Local ipv4 only on vpc expected = {'version': 1, 'config': [ {'mac_address': self.mac1, 'type': 'physical', 'name': 'eth9', 'subnets': [{'type': 'dhcp4'}, {'type': 'dhcp6'}]}]} self.assertEqual( expected, ec2.convert_ec2_metadata_network_config( network_metadata_both, macs_to_nics))
def test_convert_ec2_metadata_gets_macs_from_get_interfaces_by_mac(self): """Convert Ec2 Metadata calls get_interfaces_by_mac by default.""" expected = { "version": 2, "ethernets": { "eth9": { "match": {"macaddress": self.mac1}, "set-name": "eth9", "dhcp4": True, "dhcp6": False, } }, } patch_path = M_PATH_NET + "get_interfaces_by_mac" with mock.patch(patch_path) as m_get_interfaces_by_mac: m_get_interfaces_by_mac.return_value = {self.mac1: "eth9"} self.assertEqual( expected, ec2.convert_ec2_metadata_network_config(self.network_metadata), )
def test_invalid_ipv4_ipv6_cidr_metadata_logged_with_defaults(self): """Any invalid subnet-ipv(4|6)-cidr-block values use defaults""" invalid_cidr_md = copy.deepcopy(NIC1_MD_IPV4_IPV6_MULTI_IP) invalid_cidr_md['subnet-ipv4-cidr-block'] = "something-unexpected" invalid_cidr_md['subnet-ipv6-cidr-block'] = "not/sure/what/this/is" self.assertEqual([ '172.31.45.70/24', '2600:1f16:292:100:f152:2222:3333:4444/128', '2600:1f16:292:100:f153:12a3:c37c:11f9/128' ], ec2.get_secondary_addresses(invalid_cidr_md, self.mac)) expected_logs = [ "WARNING: Could not parse subnet-ipv4-cidr-block" " something-unexpected for mac 06:17:04:d7:26:ff." " ipv4 network config prefix defaults to /24", "WARNING: Could not parse subnet-ipv6-cidr-block" " not/sure/what/this/is for mac 06:17:04:d7:26:ff." " ipv6 network config prefix defaults to /128" ] logs = self.logs.getvalue() for log in expected_logs: self.assertIn(log, logs)
def test_convert_ec2_metadata_gets_macs_from_get_interfaces_by_mac(self): """Convert Ec2 Metadata calls get_interfaces_by_mac by default.""" expected = { 'version': 2, 'ethernets': { 'eth9': { 'match': { 'macaddress': self.mac1 }, 'set-name': 'eth9', 'dhcp4': True, 'dhcp6': False } } } patch_path = M_PATH_NET + 'get_interfaces_by_mac' with mock.patch(patch_path) as m_get_interfaces_by_mac: m_get_interfaces_by_mac.return_value = {self.mac1: 'eth9'} self.assertEqual( expected, ec2.convert_ec2_metadata_network_config(self.network_metadata))
def test_convert_ec2_metadata_network_config_skips_absent_macs(self): """Any mac absent from metadata is skipped by network config.""" macs_to_nics = {self.mac1: 'eth9', 'DE:AD:BE:EF:FF:FF': 'vitualnic2'} # DE:AD:BE:EF:FF:FF represented by OS but not in metadata expected = { 'version': 2, 'ethernets': { 'eth9': { 'match': { 'macaddress': self.mac1 }, 'set-name': 'eth9', 'dhcp4': True, 'dhcp6': False } } } self.assertEqual( expected, ec2.convert_ec2_metadata_network_config(self.network_metadata, macs_to_nics))
def test_convert_ec2_metadata_network_config_skips_absent_macs(self): """Any mac absent from metadata is skipped by network config.""" macs_to_nics = {self.mac1: "eth9", "DE:AD:BE:EF:FF:FF": "vitualnic2"} # DE:AD:BE:EF:FF:FF represented by OS but not in metadata expected = { "version": 2, "ethernets": { "eth9": { "match": {"macaddress": self.mac1}, "set-name": "eth9", "dhcp4": True, "dhcp6": False, } }, } self.assertEqual( expected, ec2.convert_ec2_metadata_network_config( self.network_metadata, macs_to_nics ), )
def test_convert_ec2_metadata_network_config_handles_dhcp4_and_dhcp6(self): """Config both dhcp4 and dhcp6 when both vpc-ipv6 and ipv4 exists.""" macs_to_nics = {self.mac1: "eth9"} network_metadata_both = copy.deepcopy(self.network_metadata) nic1_metadata = network_metadata_both["interfaces"]["macs"][self.mac1] nic1_metadata["ipv6s"] = "2620:0:1009:fd00:e442:c88d:c04d:dc85/64" expected = { "version": 2, "ethernets": { "eth9": { "match": {"macaddress": self.mac1}, "set-name": "eth9", "dhcp4": True, "dhcp6": True, } }, } self.assertEqual( expected, ec2.convert_ec2_metadata_network_config( network_metadata_both, macs_to_nics ), )
def test_convert_ec2_metadata_network_config_local_only_dhcp4(self): """Config dhcp4 when there are no public addresses in public-ipv4s.""" macs_to_nics = {self.mac1: "eth9"} network_metadata_ipv6 = copy.deepcopy(self.network_metadata) nic1_metadata = network_metadata_ipv6["interfaces"]["macs"][self.mac1] nic1_metadata["local-ipv4s"] = "172.3.3.15" nic1_metadata.pop("public-ipv4s") expected = { "version": 2, "ethernets": { "eth9": { "match": {"macaddress": self.mac1}, "set-name": "eth9", "dhcp4": True, "dhcp6": False, } }, } self.assertEqual( expected, ec2.convert_ec2_metadata_network_config( network_metadata_ipv6, macs_to_nics ), )
def test_convert_ec2_metadata_network_config_handles_only_dhcp6(self): """Config dhcp6 when ipv6s is in metadata for a mac.""" macs_to_nics = {self.mac1: "eth9"} network_metadata_ipv6 = copy.deepcopy(self.network_metadata) nic1_metadata = network_metadata_ipv6["interfaces"]["macs"][self.mac1] nic1_metadata["ipv6s"] = "2620:0:1009:fd00:e442:c88d:c04d:dc85/64" nic1_metadata.pop("public-ipv4s") expected = { "version": 2, "ethernets": { "eth9": { "match": {"macaddress": self.mac1}, "set-name": "eth9", "dhcp4": True, "dhcp6": True, } }, } self.assertEqual( expected, ec2.convert_ec2_metadata_network_config( network_metadata_ipv6, macs_to_nics ), )
def test_convert_ec2_metadata_network_config_handles_dhcp4_and_dhcp6(self): """Config both dhcp4 and dhcp6 when both vpc-ipv6 and ipv4 exists.""" macs_to_nics = {self.mac1: 'eth9'} network_metadata_both = copy.deepcopy(self.network_metadata) nic1_metadata = ( network_metadata_both['interfaces']['macs'][self.mac1]) nic1_metadata['ipv6s'] = '2620:0:1009:fd00:e442:c88d:c04d:dc85/64' expected = { 'version': 2, 'ethernets': { 'eth9': { 'match': { 'macaddress': self.mac1 }, 'set-name': 'eth9', 'dhcp4': True, 'dhcp6': True } } } self.assertEqual( expected, ec2.convert_ec2_metadata_network_config(network_metadata_both, macs_to_nics))
def test_md_with_no_secondary_addresses(self): """Empty list is returned when nic metadata contains no secondary ip""" self.assertEqual([], ec2.get_secondary_addresses(NIC2_MD, self.mac))
def test_identify_zstack(self, m_collect): """zstack should be identified if chassis-asset-tag ends in .zstack.io """ m_collect.return_value = self.collmock(asset_tag='123456.zstack.io') self.assertEqual(ec2.CloudNames.ZSTACK, ec2.identify_platform())
def test_identify_e24cloud(self, m_collect): """e24cloud identified if vendor is e24cloud""" m_collect.return_value = self.collmock(vendor='e24cloud') self.assertEqual(ec2.CloudNames.E24CLOUD, ec2.identify_platform())
def test_identify_zstack_full_domain_only(self, m_collect): """zstack asset-tag matching should match only on full domain boundary. """ m_collect.return_value = self.collmock(asset_tag='123456.buzzstack.io') self.assertEqual(ec2.CloudNames.UNKNOWN, ec2.identify_platform())
def test_identify_e24cloud_negative(self, m_collect): """e24cloud identified if vendor is e24cloud""" m_collect.return_value = self.collmock(vendor='e24cloudyday') self.assertEqual(ec2.CloudNames.UNKNOWN, ec2.identify_platform())