diff --git a/SOURCES/ci-Azure-Return-static-fallback-address-as-if-failed-to.patch b/SOURCES/ci-Azure-Return-static-fallback-address-as-if-failed-to.patch new file mode 100644 index 0000000..78269a0 --- /dev/null +++ b/SOURCES/ci-Azure-Return-static-fallback-address-as-if-failed-to.patch @@ -0,0 +1,102 @@ +From ae0f85f867714009af7d4ec6c58e30c552bab556 Mon Sep 17 00:00:00 2001 +From: Eduardo Otubo +Date: Wed, 3 Jul 2019 13:06:49 +0200 +Subject: [PATCH 2/2] Azure: Return static fallback address as if failed to + find endpoint + +RH-Author: Eduardo Otubo +Message-id: <20190703130649.14511-1-otubo@redhat.com> +Patchwork-id: 89353 +O-Subject: [RHEL-8.0.1/RHEL-8.1.0 cloud-init PATCH] Azure: Return static fallback address as if failed to find endpoint +Bugzilla: 1691986 +RH-Acked-by: Bandan Das +RH-Acked-by: Mohammed Gamal + +commit ade77012c8bbcd215b7e26065981194ce1b6a157 +Author: Jason Zions (MSFT) +Date: Fri May 10 18:38:55 2019 +0000 + + Azure: Return static fallback address as if failed to find endpoint + + The Azure data source helper attempts to use information in the dhcp + lease to find the Wireserver endpoint (IP address). Under some unusual + circumstances, those attempts will fail. This change uses a static + address, known to be always correct in the Azure public and sovereign + clouds, when the helper fails to locate a valid dhcp lease. This + address is not guaranteed to be correct in Azure Stack environments; + it's still best to use the information from the lease whenever possible. + +Signed-off-by: Eduardo Otubo +Signed-off-by: Miroslav Rezanina +--- + cloudinit/sources/helpers/azure.py | 14 +++++++++++--- + tests/unittests/test_datasource/test_azure_helper.py | 9 +++++++-- + 2 files changed, 18 insertions(+), 5 deletions(-) + +diff --git a/cloudinit/sources/helpers/azure.py b/cloudinit/sources/helpers/azure.py +index d3af05e..82c4c8c 100755 +--- a/cloudinit/sources/helpers/azure.py ++++ b/cloudinit/sources/helpers/azure.py +@@ -20,6 +20,9 @@ from cloudinit.reporting import events + + LOG = logging.getLogger(__name__) + ++# This endpoint matches the format as found in dhcp lease files, since this ++# value is applied if the endpoint can't be found within a lease file ++DEFAULT_WIRESERVER_ENDPOINT = "a8:3f:81:10" + + azure_ds_reporter = events.ReportEventStack( + name="azure-ds", +@@ -297,7 +300,12 @@ class WALinuxAgentShim(object): + @azure_ds_telemetry_reporter + def _get_value_from_leases_file(fallback_lease_file): + leases = [] +- content = util.load_file(fallback_lease_file) ++ try: ++ content = util.load_file(fallback_lease_file) ++ except IOError as ex: ++ LOG.error("Failed to read %s: %s", fallback_lease_file, ex) ++ return None ++ + LOG.debug("content is %s", content) + option_name = _get_dhcp_endpoint_option_name() + for line in content.splitlines(): +@@ -372,9 +380,9 @@ class WALinuxAgentShim(object): + fallback_lease_file) + value = WALinuxAgentShim._get_value_from_leases_file( + fallback_lease_file) +- + if value is None: +- raise ValueError('No endpoint found.') ++ LOG.warning("No lease found; using default endpoint") ++ value = DEFAULT_WIRESERVER_ENDPOINT + + endpoint_ip_address = WALinuxAgentShim.get_ip_from_lease_value(value) + LOG.debug('Azure endpoint found at %s', endpoint_ip_address) +diff --git a/tests/unittests/test_datasource/test_azure_helper.py b/tests/unittests/test_datasource/test_azure_helper.py +index 0255616..bd006ab 100644 +--- a/tests/unittests/test_datasource/test_azure_helper.py ++++ b/tests/unittests/test_datasource/test_azure_helper.py +@@ -67,12 +67,17 @@ class TestFindEndpoint(CiTestCase): + self.networkd_leases.return_value = None + + def test_missing_file(self): +- self.assertRaises(ValueError, wa_shim.find_endpoint) ++ """wa_shim find_endpoint uses default endpoint if leasefile not found ++ """ ++ self.assertEqual(wa_shim.find_endpoint(), "168.63.129.16") + + def test_missing_special_azure_line(self): ++ """wa_shim find_endpoint uses default endpoint if leasefile is found ++ but does not contain DHCP Option 245 (whose value is the endpoint) ++ """ + self.load_file.return_value = '' + self.dhcp_options.return_value = {'eth0': {'key': 'value'}} +- self.assertRaises(ValueError, wa_shim.find_endpoint) ++ self.assertEqual(wa_shim.find_endpoint(), "168.63.129.16") + + @staticmethod + def _build_lease_content(encoded_address): +-- +1.8.3.1 + diff --git a/SOURCES/ci-Fix-for-network-configuration-not-persisting-after-r.patch b/SOURCES/ci-Fix-for-network-configuration-not-persisting-after-r.patch new file mode 100644 index 0000000..41e27ff --- /dev/null +++ b/SOURCES/ci-Fix-for-network-configuration-not-persisting-after-r.patch @@ -0,0 +1,107 @@ +From 4ab5a61c0f8378889d2a6b78710f49b0fb71d3c9 Mon Sep 17 00:00:00 2001 +From: Miroslav Rezanina +Date: Fri, 22 Nov 2019 07:46:38 +0100 +Subject: [PATCH 1/2] Fix for network configuration not persisting after reboot + +RH-Author: Eduardo Otubo +Message-id: <20190906121211.23172-1-otubo@redhat.com> +Patchwork-id: 90300 +O-Subject: [RHEL-7.8/RHEL-8.1.0 cloud-init PATCH] Fix for network configuration not persisting after reboot +Bugzilla: 1706482 +RH-Acked-by: Mohammed Gamal +RH-Acked-by: Miroslav Rezanina +RH-Acked-by: Vitaly Kuznetsov + +The reasons the configuration does not persist after reboot includes +different aspects and they're all fixed on this patch: + + 1) The rpm package doesn't include the systemd-generator and +ds-identify. The systemd-generator is called early in the boot process +that calls ds-identify to check if there's any Data Source available in +the current boot. In the current use case, the Data Source is removed +from the VM on the second boot, this means cloud-init should disable +itself in order to keep the configuration it did in the first boot. + + 2) Even after adding those scripts, cloud-init was still being +executed and the configurations were being lost. The reason for this is +that the cloud-init systemd units had a wrong dependency + + WantedBy: multi-user.target + + Which would start them every time no matter the return of +ds-identify. The fix is to replace the dependency by the systemd unit to +cloud-init.target, which is the main cloud-init target enabled - or in +this case, disabled by ds-identify. The file cloud-init.target was also +missing on rpm package. + +After adding both scripts, the main cloud-init systemd target and +adjusting the systemd dependencies the configuration persists after +reboots and shutdowns. + +Signed-off-by: Eduardo Otubo +--- + redhat/cloud-init.spec.template | 15 +++++++++++++++ + rhel/systemd/cloud-config.service | 2 +- + rhel/systemd/cloud-final.service | 2 +- + rhel/systemd/cloud-init-local.service | 2 +- + rhel/systemd/cloud-init.service | 2 +- + rhel/systemd/cloud-init.target | 7 +++++++ + 6 files changed, 26 insertions(+), 4 deletions(-) + create mode 100644 rhel/systemd/cloud-init.target + +diff --git a/rhel/systemd/cloud-config.service b/rhel/systemd/cloud-config.service +index 12ca9df..f3dcd4b 100644 +--- a/rhel/systemd/cloud-config.service ++++ b/rhel/systemd/cloud-config.service +@@ -15,4 +15,4 @@ TimeoutSec=0 + StandardOutput=journal+console + + [Install] +-WantedBy=multi-user.target ++WantedBy=cloud-init.target +diff --git a/rhel/systemd/cloud-final.service b/rhel/systemd/cloud-final.service +index 32a83d8..739b7e3 100644 +--- a/rhel/systemd/cloud-final.service ++++ b/rhel/systemd/cloud-final.service +@@ -16,4 +16,4 @@ KillMode=process + StandardOutput=journal+console + + [Install] +-WantedBy=multi-user.target ++WantedBy=cloud-init.target +diff --git a/rhel/systemd/cloud-init-local.service b/rhel/systemd/cloud-init-local.service +index 656eddb..8f9f6c9 100644 +--- a/rhel/systemd/cloud-init-local.service ++++ b/rhel/systemd/cloud-init-local.service +@@ -28,4 +28,4 @@ TimeoutSec=0 + StandardOutput=journal+console + + [Install] +-WantedBy=multi-user.target ++WantedBy=cloud-init.target +diff --git a/rhel/systemd/cloud-init.service b/rhel/systemd/cloud-init.service +index 68fc5f1..d0023a0 100644 +--- a/rhel/systemd/cloud-init.service ++++ b/rhel/systemd/cloud-init.service +@@ -22,4 +22,4 @@ TimeoutSec=0 + StandardOutput=journal+console + + [Install] +-WantedBy=multi-user.target ++WantedBy=cloud-init.target +diff --git a/rhel/systemd/cloud-init.target b/rhel/systemd/cloud-init.target +new file mode 100644 +index 0000000..083c3b6 +--- /dev/null ++++ b/rhel/systemd/cloud-init.target +@@ -0,0 +1,7 @@ ++# cloud-init target is enabled by cloud-init-generator ++# To disable it you can either: ++# a.) boot with kernel cmdline of 'cloud-init=disabled' ++# b.) touch a file /etc/cloud/cloud-init.disabled ++[Unit] ++Description=Cloud-init target ++After=multi-user.target +-- +1.8.3.1 + diff --git a/SOURCES/ci-Revert-azure-ensure-that-networkmanager-hook-script-.patch b/SOURCES/ci-Revert-azure-ensure-that-networkmanager-hook-script-.patch new file mode 100644 index 0000000..5f1e0ef --- /dev/null +++ b/SOURCES/ci-Revert-azure-ensure-that-networkmanager-hook-script-.patch @@ -0,0 +1,86 @@ +From a00bafbfc54b010d7bbe95536929c678288d4c80 Mon Sep 17 00:00:00 2001 +From: Eduardo Otubo +Date: Mon, 1 Jul 2019 11:22:52 +0200 +Subject: [PATCH 1/2] Revert: azure: ensure that networkmanager hook script + runs + +RH-Author: Eduardo Otubo +Message-id: <20190701112252.32674-1-otubo@redhat.com> +Patchwork-id: 89162 +O-Subject: [rhel-8.1.0 cloud-init PATCH] Revert: azure: ensure that networkmanager hook script runs +Bugzilla: 1692914 +RH-Acked-by: Mohammed Gamal +RH-Acked-by: Miroslav Rezanina + +This patch reverts the commit: + +commit c48497435e8195dbd87262c2f00e484e63fe3343 +Author: Lars Kellogg-Stedman +Date: Thu Jun 15 12:20:39 2017 -0400 + + azure: ensure that networkmanager hook script runs + + The networkmanager hook script was failing to run due to the changes + we made to resolve rhbz#1440831. This corrects the regression by + allowing the NM hook script to run regardless of whether or not + cloud-init is "enabled". + + Resolves: rhbz#1460206 + X-downstream-only: true + +Resolves: rhbz#1692914 +X-downstream-only: true + +Signed-off-by: Eduardo Otubo +Signed-off-by: Miroslav Rezanina +--- + tools/hook-dhclient | 3 ++- + tools/hook-network-manager | 3 ++- + tools/hook-rhel.sh | 3 ++- + 3 files changed, 6 insertions(+), 3 deletions(-) + +diff --git a/tools/hook-dhclient b/tools/hook-dhclient +index 181cd51..02122f3 100755 +--- a/tools/hook-dhclient ++++ b/tools/hook-dhclient +@@ -13,7 +13,8 @@ is_azure() { + } + + is_enabled() { +- # only execute hooks if cloud-init is running on azure ++ # only execute hooks if cloud-init is enabled and on azure ++ [ -e /run/cloud-init/enabled ] || return 1 + is_azure + } + +diff --git a/tools/hook-network-manager b/tools/hook-network-manager +index 1d52cad..67d9044 100755 +--- a/tools/hook-network-manager ++++ b/tools/hook-network-manager +@@ -13,7 +13,8 @@ is_azure() { + } + + is_enabled() { +- # only execute hooks if cloud-init running on azure ++ # only execute hooks if cloud-init is enabled and on azure ++ [ -e /run/cloud-init/enabled ] || return 1 + is_azure + } + +diff --git a/tools/hook-rhel.sh b/tools/hook-rhel.sh +index d75767e..513a551 100755 +--- a/tools/hook-rhel.sh ++++ b/tools/hook-rhel.sh +@@ -13,7 +13,8 @@ is_azure() { + } + + is_enabled() { +- # only execute hooks if cloud-init is running on azure ++ # only execute hooks if cloud-init is enabled and on azure ++ [ -e /run/cloud-init/enabled ] || return 1 + is_azure + } + +-- +1.8.3.1 + diff --git a/SOURCES/ci-util-json.dumps-on-python-2.7-will-handle-UnicodeDec.patch b/SOURCES/ci-util-json.dumps-on-python-2.7-will-handle-UnicodeDec.patch new file mode 100644 index 0000000..d9cdbcc --- /dev/null +++ b/SOURCES/ci-util-json.dumps-on-python-2.7-will-handle-UnicodeDec.patch @@ -0,0 +1,144 @@ +From 4f1c3f5be0306da485135544ced4a676753a9373 Mon Sep 17 00:00:00 2001 +From: Eduardo Otubo +Date: Wed, 16 Oct 2019 12:10:24 +0200 +Subject: [PATCH 2/2] util: json.dumps on python 2.7 will handle + UnicodeDecodeError on binary + +RH-Author: Eduardo Otubo +Message-id: <20191016121024.23694-1-otubo@redhat.com> +Patchwork-id: 91812 +O-Subject: [RHEL-7.8/RHEL-8.1.0 cloud-init PATCH] util: json.dumps on python 2.7 will handle UnicodeDecodeError on binary +Bugzilla: 1744718 +RH-Acked-by: Vitaly Kuznetsov +RH-Acked-by: Mohammed Gamal + +commit 067516d7bc917e4921b9f1424b7a64e92cae0ad2 +Author: Chad Smith +Date: Fri Sep 27 20:46:00 2019 +0000 + + util: json.dumps on python 2.7 will handle UnicodeDecodeError on binary + + Since python 2.7 doesn't handle UnicodeDecodeErrors with the default + handler + + LP: #1801364 + +Signed-off-by: Eduardo Otubo +Signed-off-by: Miroslav Rezanina +--- + cloudinit/sources/tests/test_init.py | 12 +++++------- + cloudinit/tests/test_util.py | 20 ++++++++++++++++++++ + cloudinit/util.py | 27 +++++++++++++++++++++++++-- + 3 files changed, 50 insertions(+), 9 deletions(-) + +diff --git a/cloudinit/sources/tests/test_init.py b/cloudinit/sources/tests/test_init.py +index 6378e98..9698261 100644 +--- a/cloudinit/sources/tests/test_init.py ++++ b/cloudinit/sources/tests/test_init.py +@@ -457,19 +457,17 @@ class TestDataSource(CiTestCase): + instance_json['ds']['meta_data']) + + @skipIf(not six.PY2, "Only python2 hits UnicodeDecodeErrors on non-utf8") +- def test_non_utf8_encoding_logs_warning(self): +- """When non-utf-8 values exist in py2 instance-data is not written.""" ++ def test_non_utf8_encoding_gets_b64encoded(self): ++ """When non-utf-8 values exist in py2 instance-data is b64encoded.""" + tmp = self.tmp_dir() + datasource = DataSourceTestSubclassNet( + self.sys_cfg, self.distro, Paths({'run_dir': tmp}), + custom_metadata={'key1': 'val1', 'key2': {'key2.1': b'ab\xaadef'}}) + self.assertTrue(datasource.get_data()) + json_file = self.tmp_path(INSTANCE_JSON_FILE, tmp) +- self.assertFalse(os.path.exists(json_file)) +- self.assertIn( +- "WARNING: Error persisting instance-data.json: 'utf8' codec can't" +- " decode byte 0xaa in position 2: invalid start byte", +- self.logs.getvalue()) ++ instance_json = util.load_json(util.load_file(json_file)) ++ key21_value = instance_json['ds']['meta_data']['key2']['key2.1'] ++ self.assertEqual('ci-b64:' + util.b64e(b'ab\xaadef'), key21_value) + + def test_get_hostname_subclass_support(self): + """Validate get_hostname signature on all subclasses of DataSource.""" +diff --git a/cloudinit/tests/test_util.py b/cloudinit/tests/test_util.py +index e3d2dba..f4f95e9 100644 +--- a/cloudinit/tests/test_util.py ++++ b/cloudinit/tests/test_util.py +@@ -2,7 +2,9 @@ + + """Tests for cloudinit.util""" + ++import base64 + import logging ++import json + import platform + + import cloudinit.util as util +@@ -528,6 +530,24 @@ class TestGetLinuxDistro(CiTestCase): + self.assertEqual(('foo', '1.1', 'aarch64'), dist) + + ++class TestJsonDumps(CiTestCase): ++ def test_is_str(self): ++ """json_dumps should return a string.""" ++ self.assertTrue(isinstance(util.json_dumps({'abc': '123'}), str)) ++ ++ def test_utf8(self): ++ smiley = '\\ud83d\\ude03' ++ self.assertEqual( ++ {'smiley': smiley}, ++ json.loads(util.json_dumps({'smiley': smiley}))) ++ ++ def test_non_utf8(self): ++ blob = b'\xba\x03Qx-#y\xea' ++ self.assertEqual( ++ {'blob': 'ci-b64:' + base64.b64encode(blob).decode('utf-8')}, ++ json.loads(util.json_dumps({'blob': blob}))) ++ ++ + @mock.patch('os.path.exists') + class TestIsLXD(CiTestCase): + +diff --git a/cloudinit/util.py b/cloudinit/util.py +index a84112a..2c9ac66 100644 +--- a/cloudinit/util.py ++++ b/cloudinit/util.py +@@ -1590,10 +1590,33 @@ def json_serialize_default(_obj): + return 'Warning: redacted unserializable type {0}'.format(type(_obj)) + + ++def json_preserialize_binary(data): ++ """Preserialize any discovered binary values to avoid json.dumps issues. ++ ++ Used only on python 2.7 where default type handling is not honored for ++ failure to encode binary data. LP: #1801364. ++ TODO(Drop this function when py2.7 support is dropped from cloud-init) ++ """ ++ data = obj_copy.deepcopy(data) ++ for key, value in data.items(): ++ if isinstance(value, (dict)): ++ data[key] = json_preserialize_binary(value) ++ if isinstance(value, bytes): ++ data[key] = 'ci-b64:{0}'.format(b64e(value)) ++ return data ++ ++ + def json_dumps(data): + """Return data in nicely formatted json.""" +- return json.dumps(data, indent=1, sort_keys=True, +- separators=(',', ': '), default=json_serialize_default) ++ try: ++ return json.dumps( ++ data, indent=1, sort_keys=True, separators=(',', ': '), ++ default=json_serialize_default) ++ except UnicodeDecodeError: ++ if sys.version_info[:2] == (2, 7): ++ data = json_preserialize_binary(data) ++ return json.dumps(data) ++ raise + + + def yaml_dumps(obj, explicit_start=True, explicit_end=True): +-- +1.8.3.1 + diff --git a/SPECS/cloud-init.spec b/SPECS/cloud-init.spec index 56ed546..822f6bf 100644 --- a/SPECS/cloud-init.spec +++ b/SPECS/cloud-init.spec @@ -6,7 +6,7 @@ Name: cloud-init Version: 18.5 -Release: 4%{?dist} +Release: 8%{?dist} Summary: Cloud instance init scripts Group: System Environment/Base @@ -37,6 +37,14 @@ Patch15: ci-Azure-Changes-to-the-Hyper-V-KVP-Reporter.patch Patch16: ci-DataSourceAzure-Adjust-timeout-for-polling-IMDS.patch # For bz#1691986 - [Azure] [RHEL 8.1] Cloud-init fixes to support fast provisioning for Azure Patch17: ci-cc_mounts-check-if-mount-a-on-no-change-fstab-path.patch +# For bz#1692914 - [8.1] [WALA][cloud] cloud-init dhclient-hook script has some unexpected side-effects on Azure +Patch18: ci-Revert-azure-ensure-that-networkmanager-hook-script-.patch +# For bz#1691986 - [Azure] [RHEL 8.1] Cloud-init fixes to support fast provisioning for Azure +Patch19: ci-Azure-Return-static-fallback-address-as-if-failed-to.patch +# For bz#1706482 - [cloud-init][RHVM]cloud-init network configuration does not persist reboot [RHEL 8.2.0] +Patch20: ci-Fix-for-network-configuration-not-persisting-after-r.patch +# For bz#1744718 - [cloud-init][RHEL8][OpenStack] cloud-init can't persist instance-data.json +Patch21: ci-util-json.dumps-on-python-2.7-will-handle-UnicodeDec.patch BuildArch: noarch @@ -131,6 +139,12 @@ mv $RPM_BUILD_ROOT/etc/NetworkManager/dispatcher.d/hook-network-manager \ mkdir -p $RPM_BUILD_ROOT%{_unitdir} cp rhel/systemd/* $RPM_BUILD_ROOT%{_unitdir}/ +[ ! -d $RPM_BUILD_ROOT/usr/lib/systemd/system-generators ] && mkdir -p $RPM_BUILD_ROOT/usr/lib/systemd/system-generators +cp -p systemd/cloud-init-generator $RPM_BUILD_ROOT/usr/lib/systemd/system-generators + +[ ! -d $RPM_BUILD_ROOT/usr/lib/%{name} ] && mkdir -p $RPM_BUILD_ROOT/usr/lib/%{name} +cp -p tools/ds-identify $RPM_BUILD_ROOT/usr/lib/%{name}/ds-identify + %clean rm -rf $RPM_BUILD_ROOT @@ -144,6 +158,7 @@ if [ $1 -eq 1 ] ; then /bin/systemctl enable cloud-final.service >/dev/null 2>&1 || : /bin/systemctl enable cloud-init.service >/dev/null 2>&1 || : /bin/systemctl enable cloud-init-local.service >/dev/null 2>&1 || : + /bin/systemctl enable cloud-init.target >/dev/null 2>&1 || : elif [ $1 -eq 2 ]; then # Upgrade. If the upgrade is from a version older than 0.7.9-8, # there will be stale systemd config @@ -158,6 +173,9 @@ elif [ $1 -eq 2 ]; then /bin/systemctl is-enabled cloud-init-local.service >/dev/null 2>&1 && /bin/systemctl reenable cloud-init-local.service >/dev/null 2>&1 || : + + /bin/systemctl is-enabled cloud-init.target >/dev/null 2>&1 && + /bin/systemctl reenable cloud-init.target >/dev/null 2>&1 || : fi %preun @@ -167,6 +185,7 @@ if [ $1 -eq 0 ] ; then /bin/systemctl --no-reload disable cloud-final.service >/dev/null 2>&1 || : /bin/systemctl --no-reload disable cloud-init.service >/dev/null 2>&1 || : /bin/systemctl --no-reload disable cloud-init-local.service >/dev/null 2>&1 || : + /bin/systemctl --no-reload disable cloud-init.target >/dev/null 2>&1 || : # One-shot services -> no need to stop fi @@ -188,22 +207,52 @@ fi %{_unitdir}/cloud-final.service %{_unitdir}/cloud-init-local.service %{_unitdir}/cloud-init.service +%{_unitdir}/cloud-init.target %{_tmpfilesdir}/%{name}.conf %{python3_sitelib}/* %{_libexecdir}/%{name} %{_bindir}/cloud-init* %doc %{_datadir}/doc/%{name} -%dir /run/cloud-init +%dir %verify(not mode) /run/cloud-init %dir /var/lib/cloud /etc/NetworkManager/dispatcher.d/cloud-init-azure-hook %{_udevrulesdir}/66-azure-ephemeral.rules %{_sysconfdir}/bash_completion.d/cloud-init %{_bindir}/cloud-id +/usr/lib/%{name}/ds-identify +/usr/lib/systemd/system-generators/cloud-init-generator + %dir %{_sysconfdir}/rsyslog.d %config(noreplace) %{_sysconfdir}/rsyslog.d/21-cloudinit.conf %changelog +* Fri Nov 22 2019 Miroslav Rezanina - 18.5-8.el8 +- ci-Fix-for-network-configuration-not-persisting-after-r.patch [bz#1706482] +- ci-util-json.dumps-on-python-2.7-will-handle-UnicodeDec.patch [bz#1744718] +- Resolves: bz#1706482 + ([cloud-init][RHVM]cloud-init network configuration does not persist reboot [RHEL 8.2.0]) +- Resolves: bz#1744718 + ([cloud-init][RHEL8][OpenStack] cloud-init can't persist instance-data.json) + +* Mon Jul 15 2019 Miroslav Rezanina - 18.5-7.el8 +- Fixing TPS [bz#1729864] +- Resolves: bz#1729864 + (cloud-init tps fail) + +* Thu Jul 04 2019 Miroslav Rezanina - 18.5-6.el8 +- ci-Revert-azure-ensure-that-networkmanager-hook-script-.patch [bz#1692914] +- ci-Azure-Return-static-fallback-address-as-if-failed-to.patch [bz#1691986] +- Resolves: bz#1691986 + ([Azure] [RHEL 8.1] Cloud-init fixes to support fast provisioning for Azure) +- Resolves: bz#1692914 + ([8.1] [WALA][cloud] cloud-init dhclient-hook script has some unexpected side-effects on Azure) + +* Mon Jun 10 2019 Miroslav Rezanina - 18.5-5.el8 +- Improved gating testing [bz#1682786] +- Resolves: bz#1682786 + (cloud-init changes blocked until gating tests are added) + * Mon Jun 03 2019 Miroslav Rezanina - 18.5-4.el8 - ci-Azure-Ensure-platform-random_seed-is-always-serializ.patch [bz#1691986] - ci-DatasourceAzure-add-additional-logging-for-azure-dat.patch [bz#1691986]