diff --git a/.cirrus.yml b/.cirrus.yml index a4c5d92b36..7bd019bd71 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -21,6 +21,7 @@ env: FEDORA_PROJECT: "fedora-cloud" SOS_PROJECT: "sos-devel-jobs" UBUNTU_PROJECT: "ubuntu-os-cloud" + UBUNTU_DEVEL_PROJECT: "ubuntu-os-cloud-devel" # Images exist on GCP already CENTOS_9_IMAGE_NAME: "centos-stream-9-v20230809" @@ -28,12 +29,14 @@ env: DEBIAN_IMAGE_NAME: "debian-11-bullseye-v20230809" FEDORA_IMAGE_NAME: "fedora-cloud-base-gcp-38-1-6-x86-64" FEDORA_PRIOR_IMAGE_NAME: "fedora-cloud-base-gcp-37-1-7-x86-64" + UBUNTU_DEB_IMAGE_NAME: "ubuntu-minimal-2310-mantic-amd64-v20231030" UBUNTU_LATEST_IMAGE_NAME: "ubuntu-2310-mantic-amd64-v20231031" UBUNTU_IMAGE_NAME: "ubuntu-2204-jammy-v20231030" UBUNTU_PRIOR_IMAGE_NAME: "ubuntu-2004-focal-v20231101" UBUNTU_PRIOR2_IMAGE_NAME: "ubuntu-1804-bionic-v20230605" UBUNTU_SNAP_IMAGE_NAME: "ubuntu-2204-jammy-v20231030" + UBUNTU_DEVEL_FAMILY_NAME: "ubuntu-2404-lts-amd64" # Curl-command prefix for downloading task artifacts, simply add the # the url-encoded task name, artifact name, and path as a suffix. @@ -226,14 +229,40 @@ report_stageone_task: pip3 install avocado-framework==94.0 ${PIP_EXTRA} # run the unittests separately as they require a different PYTHONPATH in # order for the imports to work properly under avocado - unittest_script: PYTHONPATH=. avocado run tests/unittests/ - main_script: PYTHONPATH=tests/ avocado run -p TESTLOCAL=true --test-runner=runner -t stageone tests/{cleaner,collect,report,vendor}_tests + unittest_script: &unit_test | + PYTHONPATH=. avocado run tests/unittests/ + main_script: &stageone_test + PYTHONPATH=tests/ avocado run -p TESTLOCAL=true --test-runner=runner -t stageone tests/{cleaner,collect,report,vendor}_tests on_failure: fail_script: &faillogs | ls -d /var/tmp/avocado* /root/avocado* 2> /dev/null | xargs tar cf sos-fail-logs.tar log_artifacts: &logs path: "sos-fail-logs.tar" +report_stageone_daily_task: + alias: "stageone_daily_report" + name: "Report Stage One - ${UBUNTU_DEVEL_FAMILY_NAME}" + allow_failures: true + depends_on: + - snap_build + gce_instance: + image_project: ${UBUNTU_DEVEL_PROJECT} + image_family: ${UBUNTU_DEVEL_FAMILY_NAME} + type: e2-medium + environment: + PKG: "snap" + setup_script: *setup + avocado_install_script: &avocado_setup | + pip3 uninstall -y avocado-framework --break-system-packages + git clone --single-branch -b 92lts https://github.com/avocado-framework/avocado.git + cd avocado + make install + unittest_script: *unit_test + main_script: *stageone_test + on_failure: + fail_script: *faillogs + log_artifacts: *logs + # IFF the stage one tests all pass, then run stage two for latest distros report_stagetwo_task: alias: "stagetwo_report" @@ -255,7 +284,27 @@ report_stagetwo_task: if [ $(command -v dnf) ]; then dnf -y install python3-pexpect fi - main_script: PYTHONPATH=tests/ avocado run -p TESTLOCAL=true --test-runner=runner -t stagetwo tests/{cleaner,collect,report,vendor}_tests + main_script: &stagetwo_test | + PYTHONPATH=tests/ avocado run -p TESTLOCAL=true --test-runner=runner -t stagetwo tests/{cleaner,collect,report,vendor}_tests + on_failure: + fail_script: *faillogs + log_artifacts: *logs + +report_stagetwo_daily_task: + alias: "stagetwo_daily_report" + name: "Report Stage Two - ${UBUNTU_DEVEL_FAMILY_NAME}" + allow_failures: true + depends_on: stageone_daily_report + timeout_in: 45m + gce_instance: + image_project: ${UBUNTU_DEVEL_PROJECT} + image_family: ${UBUNTU_DEVEL_FAMILY_NAME} + type: e2-medium + environment: + PKG: "snap" + setup_script: *setup + avocado_install_script: *avocado_setup + main_script: *stagetwo_test on_failure: fail_script: *faillogs log_artifacts: *logs diff --git a/sos/policies/runtimes/lxd.py b/sos/policies/runtimes/lxd.py index 2d0b5b4816..a6962782c7 100644 --- a/sos/policies/runtimes/lxd.py +++ b/sos/policies/runtimes/lxd.py @@ -24,6 +24,7 @@ class LxdContainerRuntime(ContainerRuntime): def check_is_active(self): # the daemon must be running if (is_executable('lxc', self.policy.sysroot) and + self.policy.package_manager.pkg_by_name('lxd') and (self.policy.init_system.is_running('lxd') or self.policy.init_system.is_running('snap.lxd.daemon'))): self.active = True diff --git a/tests/cleaner_tests/basic_function_tests/report_with_mask.py b/tests/cleaner_tests/basic_function_tests/report_with_mask.py index 06bb212246..bb72cdde0a 100644 --- a/tests/cleaner_tests/basic_function_tests/report_with_mask.py +++ b/tests/cleaner_tests/basic_function_tests/report_with_mask.py @@ -119,7 +119,7 @@ def test_binary_removed(self): self.assertFileNotCollected('var/log/binary_test.tar.xz') def test_binaries_removed_reported(self): - self.assertOutputContains('\[removed .* unprocessable files\]') + self.assertOutputContains(r'\[removed .* unprocessable files\]') class KeepBinaryFilesTest(StageTwoReportTest): @@ -142,4 +142,4 @@ def test_binary_is_in_archive(self): self.assertFileCollected('var/log/binary_test.tar.xz') def test_no_binaries_reported_removed(self): - self.assertOutputNotContains('\[removed .* unprocessable files\]') + self.assertOutputNotContains(r'\[removed .* unprocessable files\]') diff --git a/tests/collect_tests/help_output_tests.py b/tests/collect_tests/help_output_tests.py index 258bb8d7bb..584ad4985c 100644 --- a/tests/collect_tests/help_output_tests.py +++ b/tests/collect_tests/help_output_tests.py @@ -65,7 +65,7 @@ class CollectOptionsHelpTest(StageOneOutputTest): @skipIf(PEXPECT_PRESENT is False, "python3-pexpect not installed locally") def test_cluster_profiles_shown(self): - _out = re.search("Use the short name with --cluster-type or cluster options \(-c\)(.*?)The following cluster options are available:", + _out = re.search(r"Use the short name with --cluster-type or cluster options \(-c\)(.*?)The following cluster options are available:", self.cmd_output.stdout, re.S).group(1).splitlines() _profs = {} for ln in _out: diff --git a/tests/report_tests/basic_report_tests.py b/tests/report_tests/basic_report_tests.py index a6fdf0035c..58618cbcdf 100644 --- a/tests/report_tests/basic_report_tests.py +++ b/tests/report_tests/basic_report_tests.py @@ -23,7 +23,7 @@ def test_debug_in_logs_verbose(self): def test_debug_not_printed_to_console(self): self.assertOutputNotContains('added cmd output') - self.assertOutputNotContains('\[archive:.*\]') + self.assertOutputNotContains(r'\[archive:.*\]') def test_postproc_called(self): self.assertSosLogContains('substituting scrpath') @@ -61,11 +61,11 @@ class LogLevelTest(StageOneReportTest): sos_cmd = '-vvv -o kernel,host,boot,filesys' def test_archive_logging_enabled(self): - self.assertSosLogContains('DEBUG: \[archive:.*\]') + self.assertSosLogContains(r'DEBUG: \[archive:.*\]') self.assertSosLogContains('Making leading paths for') def test_debug_printed_to_console(self): - self.assertOutputContains('\[plugin:.*\]') + self.assertOutputContains(r'\[plugin:.*\]') class RestrictedSoSReport(StageOneReportTest): diff --git a/tests/report_tests/encryption_tests.py b/tests/report_tests/encryption_tests.py index 9ce401ecf3..d60d9d783b 100644 --- a/tests/report_tests/encryption_tests.py +++ b/tests/report_tests/encryption_tests.py @@ -22,10 +22,11 @@ class EncryptedReportTest(StageOneReportTest): sos_cmd = "-o kernel --encrypt-pass %s" % encrypt_pass def test_archive_gpg_encrypted(self): - self.assertOutputContains('/.*sosreport-.*tar.*\.gpg') + self.assertOutputContains(r'/.*sosreport-.*tar.*\.gpg') _cmd = "file %s" % self.encrypted_path res = process.run(_cmd) - self.assertTrue("GPG symmetrically encrypted data" in res.stdout.decode()) + self.assertTrue(("GPG symmetrically encrypted data" in res.stdout.decode()) + or ("PGP symmetric key encrypted data" in res.stdout.decode())) def test_tarball_named_secure(self): self.assertTrue('secured-' in self.encrypted_path) diff --git a/tests/report_tests/exception_tests.py b/tests/report_tests/exception_tests.py index 769954a04a..678c06d696 100644 --- a/tests/report_tests/exception_tests.py +++ b/tests/report_tests/exception_tests.py @@ -17,7 +17,7 @@ class InvalidPluginEnabledTest(StageOneReportExceptionTest): sos_cmd = '-o foobar' def test_caught_invalid_plugin(self): - self.assertOutputContains('a non-existing plugin \(foobar\)') + self.assertOutputContains(r'a non-existing plugin \(foobar\)') class InvalidPluginOptionTest(StageOneReportExceptionTest): @@ -28,7 +28,7 @@ class InvalidPluginOptionTest(StageOneReportExceptionTest): sos_cmd = '-o kernel -k kernel.colonel=on' def test_caught_invalid_plugin_option(self): - self.assertOutputContains('no such option "colonel" for plugin \(kernel\)') + self.assertOutputContains(r'no such option "colonel" for plugin \(kernel\)') class InvalidReportOptionTest(StageOneReportExceptionTest): @@ -39,7 +39,7 @@ class InvalidReportOptionTest(StageOneReportExceptionTest): sos_cmd = '--magic' def test_caught_invalid_option(self): - self.assertOutputContains('unrecognized arguments\: --magic') + self.assertOutputContains(r'unrecognized arguments\: --magic') class InvalidPluginDisableTest(StageOneReportTest): diff --git a/tests/report_tests/options_tests/options_tests.py b/tests/report_tests/options_tests/options_tests.py index 997042ba65..e912da8db5 100644 --- a/tests/report_tests/options_tests/options_tests.py +++ b/tests/report_tests/options_tests/options_tests.py @@ -27,10 +27,10 @@ def test_plugins_only_from_config(self): def test_plugopts_logged_from_config(self): self.assertSosLogContains( - "Set kernel plugin option to \(name=with-timer, desc='gather /proc/timer\* statistics', value=True, default=False\)" + r"Set kernel plugin option to \(name=with-timer, desc='gather /proc/timer\* statistics', value=True, default=False\)" ) self.assertSosLogContains( - "Set kernel plugin option to \(name=trace, desc='gather /sys/kernel/debug/tracing/trace file', value=True, default=False\)" + r"Set kernel plugin option to \(name=trace, desc='gather /sys/kernel/debug/tracing/trace file', value=True, default=False\)" ) def test_disabled_plugopts_not_loaded(self): diff --git a/tests/sos_tests.py b/tests/sos_tests.py index d15395f035..1fb318750f 100644 --- a/tests/sos_tests.py +++ b/tests/sos_tests.py @@ -424,7 +424,7 @@ def get_encrypted_path(self): override """ try: - return re.findall('/.*sosreport-.*tar.*\.gpg', self.cmd_output.stdout)[-1] + return re.findall(r'/.*sosreport-.*tar.*\.gpg', self.cmd_output.stdout)[-1] except: return None diff --git a/tests/unittests/policy_tests.py b/tests/unittests/policy_tests.py index 1cefaab70a..a64275b8cb 100644 --- a/tests/unittests/policy_tests.py +++ b/tests/unittests/policy_tests.py @@ -108,7 +108,7 @@ def setUp(self): self.pm = RpmPackageManager() def test_load_all_packages(self): - self.assertNotEquals(self.pm.packages, {}) + self.assertNotEqual(self.pm.packages, {}) def test_pkg_is_formatted(self): kpkg = self.pm.pkg_by_name('coreutils') @@ -125,7 +125,7 @@ def setUp(self): self.pm = DpkgPackageManager() def test_load_all_packages(self): - self.assertNotEquals(self.pm.packages, {}) + self.assertNotEqual(self.pm.packages, {}) def test_pkg_is_formatted(self): kpkg = self.pm.pkg_by_name('coreutils') @@ -141,7 +141,7 @@ def setUp(self): fallbacks=[DpkgPackageManager]) def test_load_all_packages(self): - self.assertNotEquals(self.pm.packages, {}) + self.assertNotEqual(self.pm.packages, {}) def test_pkg_is_formatted(self): kpkg = self.pm.pkg_by_name('coreutils')