summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChad Smith <chad.smith@canonical.com>2022-03-23 20:10:41 -0600
committergit-ubuntu importer <ubuntu-devel-discuss@lists.ubuntu.com>2022-03-24 16:16:10 +0000
commitdf9a8c12dec374a94bf7683bd0c65a053501f7bd (patch)
treefef6b051e6d2459f8392e3410111f43d3b535e8c
parentdb75674a7b3b4b5ec7b9497698c359dec9c7aaa9 (diff)
downloadcloud-init-git-df9a8c12dec374a94bf7683bd0c65a053501f7bd.tar.gz
22.1-14-g2e17a0d6-0ubuntu1~22.04.4 (patches unapplied)
Imported using git-ubuntu import.
-rw-r--r--debian/changelog8
-rw-r--r--debian/patches/cpick-eee60329-Fix-cloud-init-status-wait-when-no-datasource-found172
-rw-r--r--debian/patches/series1
3 files changed, 181 insertions, 0 deletions
diff --git a/debian/changelog b/debian/changelog
index 4d332a61..5922e51b 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+cloud-init (22.1-14-g2e17a0d6-0ubuntu1~22.04.4) jammy; urgency=medium
+
+ * d/p/cpick-eee60329-Fix-cloud-init-status-wait-when-no-datasource-found:
+ cherry-pick eee60329: Fix cloud-init status --wait when no datasource
+ found (#1349)
+
+ -- Chad Smith <chad.smith@canonical.com> Wed, 23 Mar 2022 20:10:41 -0600
+
cloud-init (22.1-14-g2e17a0d6-0ubuntu1~22.04.3) jammy; urgency=medium
* d/patches: include the missing quilt patch from v. 22.04.2 upload
diff --git a/debian/patches/cpick-eee60329-Fix-cloud-init-status-wait-when-no-datasource-found b/debian/patches/cpick-eee60329-Fix-cloud-init-status-wait-when-no-datasource-found
new file mode 100644
index 00000000..3227517e
--- /dev/null
+++ b/debian/patches/cpick-eee60329-Fix-cloud-init-status-wait-when-no-datasource-found
@@ -0,0 +1,172 @@
+From eee603294f120cf98696351433e7e6dbc9a3dbc2 Mon Sep 17 00:00:00 2001
+From: James Falcon <james.falcon@canonical.com>
+Date: Wed, 23 Mar 2022 18:03:00 -0500
+Subject: [PATCH] Fix cloud-init status --wait when no datasource found (#1349)
+
+* Fix cloud-init status --wait when no datasource found
+
+In 0de7acb1, we modified status checks to wait until we get an "enabled"
+or "disabled" file from ds-identiy. ds-identify never outputs a
+"disabled" file, so "status --wait" will wait indefinitely if no
+datasource is found.
+
+LP: #1966085
+---
+ systemd/cloud-init-generator.tmpl | 7 +++
+ tests/integration_tests/clouds.py | 16 ++++--
+ tests/integration_tests/cmd/test_status.py | 65 ++++++++++++++++++++++
+ 3 files changed, 82 insertions(+), 6 deletions(-)
+ create mode 100644 tests/integration_tests/cmd/test_status.py
+
+Origin: backport, https://github.com/canonical/cloud-init/commit/eee60329
+Bug-Ubuntu: https://bugs.launchpad.net/bugs/1966085
+Last-Update: 2022-03-24
+Index: cloud-init/systemd/cloud-init-generator.tmpl
+===================================================================
+--- cloud-init.orig/systemd/cloud-init-generator.tmpl
++++ cloud-init/systemd/cloud-init-generator.tmpl
+@@ -10,6 +10,7 @@ DISABLE="disabled"
+ FOUND="found"
+ NOTFOUND="notfound"
+ RUN_ENABLED_FILE="$LOG_D/$ENABLE"
++RUN_DISABLED_FILE="$LOG_D/$DISABLE"
+ {% if variant in ["suse"] %}
+ CLOUD_SYSTEM_TARGET="/usr/lib/systemd/system/cloud-init.target"
+ {% else %}
+@@ -154,6 +155,10 @@ main() {
+ "ln $CLOUD_SYSTEM_TARGET $link_path"
+ fi
+ fi
++ if [ -e $RUN_DISABLED_FILE ]; then
++ debug 1 "removing $RUN_DISABLED_FILE and creating $RUN_ENABLED_FILE"
++ rm -f $RUN_DISABLED_FILE
++ fi
+ : > "$RUN_ENABLED_FILE"
+ elif [ "$result" = "$DISABLE" ]; then
+ if [ -f "$link_path" ]; then
+@@ -167,8 +172,10 @@ main() {
+ debug 1 "already disabled: no change needed [no $link_path]"
+ fi
+ if [ -e "$RUN_ENABLED_FILE" ]; then
++ debug 1 "removing $RUN_ENABLED_FILE and creating $RUN_DISABLED_FILE"
+ rm -f "$RUN_ENABLED_FILE"
+ fi
++ : > "$RUN_DISABLED_FILE"
+ else
+ debug 0 "unexpected result '$result' 'ds=$ds'"
+ ret=3
+Index: cloud-init/tests/integration_tests/clouds.py
+===================================================================
+--- cloud-init.orig/tests/integration_tests/clouds.py
++++ cloud-init/tests/integration_tests/clouds.py
+@@ -5,6 +5,7 @@ import os.path
+ import random
+ import string
+ from abc import ABC, abstractmethod
++from copy import deepcopy
+ from typing import Optional, Type
+ from uuid import UUID
+
+@@ -291,12 +292,15 @@ class _LxdIntegrationCloud(IntegrationCl
+ subp(command.split())
+
+ def _perform_launch(self, launch_kwargs, **kwargs):
+- launch_kwargs["inst_type"] = launch_kwargs.pop("instance_type", None)
+- wait = launch_kwargs.pop("wait", True)
+- release = launch_kwargs.pop("image_id")
++ instance_kwargs = deepcopy(launch_kwargs)
++ instance_kwargs["inst_type"] = instance_kwargs.pop(
++ "instance_type", None
++ )
++ wait = instance_kwargs.pop("wait", True)
++ release = instance_kwargs.pop("image_id")
+
+ try:
+- profile_list = launch_kwargs["profile_list"]
++ profile_list = instance_kwargs["profile_list"]
+ except KeyError:
+ profile_list = self._get_or_set_profile_list(release)
+
+@@ -305,10 +309,10 @@ class _LxdIntegrationCloud(IntegrationCl
+ random.choices(string.ascii_lowercase + string.digits, k=8)
+ )
+ pycloudlib_instance = self.cloud_instance.init(
+- launch_kwargs.pop("name", default_name),
++ instance_kwargs.pop("name", default_name),
+ release,
+ profile_list=profile_list,
+- **launch_kwargs,
++ **instance_kwargs,
+ )
+ if self.settings.CLOUD_INIT_SOURCE == "IN_PLACE":
+ self._mount_source(pycloudlib_instance)
+Index: cloud-init/tests/integration_tests/cmd/test_status.py
+===================================================================
+--- /dev/null
++++ cloud-init/tests/integration_tests/cmd/test_status.py
+@@ -0,0 +1,65 @@
++"""Tests for `cloud-init status`"""
++from time import sleep
++
++import pytest
++
++from tests.integration_tests.clouds import ImageSpecification, IntegrationCloud
++from tests.integration_tests.instances import IntegrationInstance
++
++
++# We're implementing our own here in case cloud-init status --wait
++# isn't working correctly (LP: #1966085)
++def _wait_for_cloud_init(client: IntegrationInstance):
++ last_exception = None
++ for _ in range(30):
++ try:
++ result = client.execute("cloud-init status --long")
++ if result and result.ok:
++ return result
++ except Exception as e:
++ last_exception = e
++ sleep(1)
++ raise Exception(
++ "cloud-init status did not return successfully."
++ ) from last_exception
++
++
++def _remove_nocloud_dir_and_reboot(client: IntegrationInstance):
++ # On Impish and below, NoCloud will be detected on an LXD container.
++ # If we remove this directory, it will no longer be detected.
++ client.execute("rm -rf /var/lib/cloud/seed/nocloud-net")
++ client.execute("cloud-init clean --logs --reboot")
++
++
++@pytest.mark.ubuntu
++@pytest.mark.lxd_container
++def test_wait_when_no_datasource(session_cloud: IntegrationCloud, setup_image):
++ """Ensure that when no datasource is found, we get status: disabled
++
++ LP: #1966085
++ """
++ with session_cloud.launch(
++ launch_kwargs={
++ # On Jammy and above, we detect the LXD datasource using a
++ # socket available to the container. This prevents the socket
++ # from being exposed in the container, causing datasource detection
++ # to fail. ds-identify will then have failed to detect a datasource
++ "config_dict": {"security.devlxd": False},
++ "wait": False, # to prevent cloud-init status --wait
++ }
++ ) as client:
++ # We know this will be an LXD instance due to our pytest mark
++ client.instance.execute_via_ssh = False # type: ignore
++ # No ubuntu user if cloud-init didn't run
++ client.instance.username = "root"
++ # Jammy and above will use LXD datasource by default
++ if ImageSpecification.from_os_image().release in [
++ "bionic",
++ "focal",
++ "impish",
++ ]:
++ _remove_nocloud_dir_and_reboot(client)
++ status_out = _wait_for_cloud_init(client).stdout.strip()
++ assert "status: disabled" in status_out
++ assert "Cloud-init disabled by cloud-init-generator" in status_out
++ assert client.execute("cloud-init status --wait").ok
diff --git a/debian/patches/series b/debian/patches/series
index 31b7bc63..604a0c7e 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1 +1,2 @@
cpick-5e347d25-Revert-Ensure-system_cfg-read-before-ds-net-config-on
+cpick-eee60329-Fix-cloud-init-status-wait-when-no-datasource-found