From 6ed3c5dfcd9392784d2199224ac7d28d1abfdf7b Mon Sep 17 00:00:00 2001 From: Chad Smith Date: Wed, 2 Feb 2022 21:38:56 -0700 Subject: integration: do not LXD bind mount /etc/cloud/cloud.cfg.d (#1234) Since lxc bind mounts will be read-only as nobody:nogroup we don't want to bind mount /etc/cloud/cloud.cfg.d into the instance because some tests add artifacts to /etc/cloud/cloud.cfg.d. Also make LXD push_file pull_file methods assert that the file transfer was a success, otherwise we miss the root-cause for test failures. This resulted in failed Jenkins runs in test_lxd_discovery with a symptom of NoCloud being detected instead of LXD datasource. The root-case was that instance.file_push failed due to permission errors for root on the bind mounted /etc/cloud/cloud.cfg.d. Also bump pycloudlib commitish to get Azure Jammy image support. --- tests/integration_tests/clouds.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) (limited to 'tests/integration_tests/clouds.py') diff --git a/tests/integration_tests/clouds.py b/tests/integration_tests/clouds.py index 81d5b9a0..ef613339 100644 --- a/tests/integration_tests/clouds.py +++ b/tests/integration_tests/clouds.py @@ -134,7 +134,7 @@ class IntegrationCloud(ABC): user_data=None, launch_kwargs=None, settings=integration_settings, - **kwargs + **kwargs, ) -> IntegrationInstance: if launch_kwargs is None: launch_kwargs = {} @@ -258,10 +258,6 @@ class _LxdIntegrationCloud(IntegrationCloud): cloudinit_path = cloudinit.__path__[0] mounts = [ (cloudinit_path, "/usr/lib/python3/dist-packages/cloudinit"), - ( - os.path.join(cloudinit_path, "..", "config", "cloud.cfg.d"), - "/etc/cloud/cloud.cfg.d", - ), ( os.path.join(cloudinit_path, "..", "templates"), "/etc/cloud/templates", @@ -286,6 +282,21 @@ class _LxdIntegrationCloud(IntegrationCloud): ).format(**format_variables) subp(command.split()) + # /etc/cloud/cloud.cfg.d is a directory we write to in some + # integration tests. We can't use lxc mount in the container + # as /etc/cloud/cloud.cfg.d will then be owned nobody:nogroup and be + # read-only for root. + # Instead copy static files to the instance under test. + config_dir = os.path.join( + cloudinit_path, "..", "config", "cloud.cfg.d" + ) + for src_file in os.listdir(config_dir): + command = ( + f"lxc file push {config_dir}/{src_file} " + f"{instance.name}/etc/cloud/cloud.cfg.d/" + ) + 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) @@ -304,7 +315,7 @@ class _LxdIntegrationCloud(IntegrationCloud): launch_kwargs.pop("name", default_name), release, profile_list=profile_list, - **launch_kwargs + **launch_kwargs, ) if self.settings.CLOUD_INIT_SOURCE == "IN_PLACE": self._mount_source(pycloudlib_instance) -- cgit v1.2.3