diff options
| -rw-r--r-- | cloudinit/sources/DataSourceEc2.py | 3 | ||||
| -rw-r--r-- | tests/unittests/test_datasource/test_aliyun.py | 30 | 
2 files changed, 32 insertions, 1 deletions
| diff --git a/cloudinit/sources/DataSourceEc2.py b/cloudinit/sources/DataSourceEc2.py index 1930a509..a2105dc7 100644 --- a/cloudinit/sources/DataSourceEc2.py +++ b/cloudinit/sources/DataSourceEc2.py @@ -765,13 +765,14 @@ def convert_ec2_metadata_network_config(          netcfg['ethernets'][nic_name] = dev_config          return netcfg      # Apply network config for all nics and any secondary IPv4/v6 addresses +    nic_idx = 0      for mac, nic_name in sorted(macs_to_nics.items()):          nic_metadata = macs_metadata.get(mac)          if not nic_metadata:              continue  # Not a physical nic represented in metadata          # device-number is zero-indexed, we want it 1-indexed for the          # multiplication on the following line -        nic_idx = int(nic_metadata['device-number']) + 1 +        nic_idx = int(nic_metadata.get('device-number', nic_idx)) + 1          dhcp_override = {'route-metric': nic_idx * 100}          dev_config = {'dhcp4': True, 'dhcp4-overrides': dhcp_override,                        'dhcp6': False, diff --git a/tests/unittests/test_datasource/test_aliyun.py b/tests/unittests/test_datasource/test_aliyun.py index eb2828d5..cab1ac2b 100644 --- a/tests/unittests/test_datasource/test_aliyun.py +++ b/tests/unittests/test_datasource/test_aliyun.py @@ -7,6 +7,7 @@ from unittest import mock  from cloudinit import helpers  from cloudinit.sources import DataSourceAliYun as ay +from cloudinit.sources.DataSourceEc2 import convert_ec2_metadata_network_config  from cloudinit.tests import helpers as test_helpers  DEFAULT_METADATA = { @@ -183,6 +184,35 @@ class TestAliYunDatasource(test_helpers.HttprettyTestCase):          self.assertEqual(ay.parse_public_keys(public_keys),                           public_keys['key-pair-0']['openssh-key']) +    def test_route_metric_calculated_without_device_number(self): +        """Test that route-metric code works without `device-number` + +        `device-number` is part of EC2 metadata, but not supported on aliyun. +        Attempting to access it will raise a KeyError. + +        LP: #1917875 +        """ +        netcfg = convert_ec2_metadata_network_config( +            {"interfaces": {"macs": { +                "06:17:04:d7:26:09": { +                    "interface-id": "eni-e44ef49e", +                }, +                "06:17:04:d7:26:08": { +                    "interface-id": "eni-e44ef49f", +                } +            }}}, +            macs_to_nics={ +                '06:17:04:d7:26:09': 'eth0', +                '06:17:04:d7:26:08': 'eth1', +            } +        ) + +        met0 = netcfg['ethernets']['eth0']['dhcp4-overrides']['route-metric'] +        met1 = netcfg['ethernets']['eth1']['dhcp4-overrides']['route-metric'] + +        # route-metric numbers should be 100 apart +        assert 100 == abs(met0 - met1) +  class TestIsAliYun(test_helpers.CiTestCase):      ALIYUN_PRODUCT = 'Alibaba Cloud ECS' | 
