From 604823cf4a6e8632bdf49d05e85159f98c935a67 Mon Sep 17 00:00:00 2001 From: Miroslav Rezanina Date: Fri, 2 Jul 2021 03:55:59 -0400 Subject: [PATCH] * Fri Jul 02 2021 Miroslav Rezanina - 21.1-3 - ci-Fix-requiring-device-number-on-EC2-derivatives-836.patch [bz#1943511] - Resolves: bz#1943511 ([Aliyun][RHEL9.0][cloud-init] cloud-init service failed to start with Alibaba instance) --- ...device-number-on-EC2-derivatives-836.patch | 103 ++++++++++++++++++ cloud-init.spec | 9 +- 2 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 ci-Fix-requiring-device-number-on-EC2-derivatives-836.patch diff --git a/ci-Fix-requiring-device-number-on-EC2-derivatives-836.patch b/ci-Fix-requiring-device-number-on-EC2-derivatives-836.patch new file mode 100644 index 0000000..0ba9401 --- /dev/null +++ b/ci-Fix-requiring-device-number-on-EC2-derivatives-836.patch @@ -0,0 +1,103 @@ +From 83394f05a01b5e1f8e520213537558c1cb5d9051 Mon Sep 17 00:00:00 2001 +From: Eduardo Otubo +Date: Thu, 1 Jul 2021 12:01:34 +0200 +Subject: [PATCH] Fix requiring device-number on EC2 derivatives (#836) + +RH-Author: Eduardo Otubo +RH-MergeRequest: 3: Fix requiring device-number on EC2 derivatives (#836) +RH-Commit: [1/1] a0b7af14a2bc6480bb844a496007737b8807f666 (otubo/cloud-init-src) +RH-Bugzilla: 1943511 +RH-Acked-by: Emanuele Giuseppe Esposito +RH-Acked-by: Mohamed Gamal Morsy + +commit 9bd19645a61586b82e86db6f518dd05c3363b17f +Author: James Falcon +Date: Mon Mar 8 14:09:47 2021 -0600 + + Fix requiring device-number on EC2 derivatives (#836) + + #342 (70dbccbb) introduced the ability to determine route-metrics based on + the `device-number` provided by the EC2 IMDS. Not all datasources that + subclass EC2 will have this attribute, so allow the old behavior if + `device-number` is not present. + + LP: #1917875 + +Signed-off-by: Eduardo Otubo +Signed-off-by: Miroslav Rezanina +--- + cloudinit/sources/DataSourceEc2.py | 3 +- + .../unittests/test_datasource/test_aliyun.py | 30 +++++++++++++++++++ + 2 files changed, 32 insertions(+), 1 deletion(-) + +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' +-- +2.27.0 + diff --git a/cloud-init.spec b/cloud-init.spec index 41b34c0..40d7610 100644 --- a/cloud-init.spec +++ b/cloud-init.spec @@ -1,6 +1,6 @@ Name: cloud-init Version: 21.1 -Release: 2%{?dist} +Release: 3%{?dist} Summary: Cloud instance init scripts License: ASL 2.0 or GPLv3 URL: http://launchpad.net/cloud-init @@ -12,6 +12,8 @@ Patch0002: 0002-Do-not-write-NM_CONTROLLED-no-in-generated-interface.patch Patch0003: 0003-limit-permissions-on-def_log_file.patch # For bz#1970909 - [cloud-init] From RHEL 82+ cloud-init no longer displays sshd keys fingerprints from instance launched from a backup image[rhel-9] Patch4: ci-rhel-cloud.cfg-remove-ssh_genkeytypes-in-settings.py.patch +# For bz#1943511 - [Aliyun][RHEL9.0][cloud-init] cloud-init service failed to start with Alibaba instance +Patch5: ci-Fix-requiring-device-number-on-EC2-derivatives-836.patch # Source-git patches @@ -206,6 +208,11 @@ fi %config(noreplace) %{_sysconfdir}/rsyslog.d/21-cloudinit.conf %changelog +* Fri Jul 02 2021 Miroslav Rezanina - 21.1-3 +- ci-Fix-requiring-device-number-on-EC2-derivatives-836.patch [bz#1943511] +- Resolves: bz#1943511 + ([Aliyun][RHEL9.0][cloud-init] cloud-init service failed to start with Alibaba instance) + * Mon Jun 21 2021 Miroslav Rezanina - 21.1-2 - ci-rhel-cloud.cfg-remove-ssh_genkeytypes-in-settings.py.patch [bz#1970909] - ci-Use-_systemdgeneratordir-macro-for-cloud-init-genera.patch [bz#1971480]