diff options
Diffstat (limited to 'tests/unittests/distros/test_opensuse.py')
-rw-r--r-- | tests/unittests/distros/test_opensuse.py | 333 |
1 files changed, 327 insertions, 6 deletions
diff --git a/tests/unittests/distros/test_opensuse.py b/tests/unittests/distros/test_opensuse.py index 6b8eea65..3261d629 100644 --- a/tests/unittests/distros/test_opensuse.py +++ b/tests/unittests/distros/test_opensuse.py @@ -1,10 +1,331 @@ # This file is part of cloud-init. See LICENSE file for license information. -from tests.unittests.distros import _get_distro -from tests.unittests.helpers import CiTestCase +from unittest import mock +from cloudinit import distros -class TestopenSUSE(CiTestCase): - def test_get_distro(self): - distro = _get_distro("opensuse") - self.assertEqual(distro.osfamily, "suse") + +@mock.patch("cloudinit.distros.opensuse.subp.subp") +class TestPackageCommands: + distro = distros.fetch("opensuse")("opensuse", {}, None) + + @mock.patch( + "cloudinit.distros.opensuse.util.get_mount_info", + return_value=("/dev/sda1", "xfs", "/"), + ) + @mock.patch( + "cloudinit.distros.opensuse.util.load_file", + return_value="foo\n/dev/sda1 / xfs rw,bar\n", + ) + @mock.patch( + "cloudinit.distros.opensuse.os.path.exists", return_value=False + ) + def test_upgrade_not_btrfs(self, m_tu_path, m_mounts, m_minfo, m_subp): + # Reset state + self.distro.update_method = None + + self.distro.package_command("upgrade") + expected_cmd = ["zypper", "--non-interactive", "update"] + m_subp.assert_called_with(expected_cmd, capture=False) + + @mock.patch( + "cloudinit.distros.opensuse.util.get_mount_info", + return_value=("/dev/sda1", "xfs", "/"), + ) + @mock.patch( + "cloudinit.distros.opensuse.util.load_file", + return_value="foo\n/dev/sda1 / xfs rw,bar\n", + ) + @mock.patch( + "cloudinit.distros.opensuse.os.path.exists", return_value=False + ) + def test_upgrade_not_btrfs_pkg(self, m_tu_path, m_mounts, m_minfo, m_subp): + # Reset state + self.distro.update_method = None + + self.distro.package_command("upgrade", None, ["python36", "gzip"]) + expected_cmd = [ + "zypper", + "--non-interactive", + "update", + "python36", + "gzip", + ] + m_subp.assert_called_with(expected_cmd, capture=False) + + @mock.patch( + "cloudinit.distros.opensuse.util.get_mount_info", + return_value=("/dev/sda1", "xfs", "/"), + ) + @mock.patch( + "cloudinit.distros.opensuse.util.load_file", + return_value="foo\n/dev/sda1 / xfs rw,bar\n", + ) + @mock.patch( + "cloudinit.distros.opensuse.os.path.exists", return_value=False + ) + def test_update_not_btrfs(self, m_tu_path, m_mounts, m_minfo, m_subp): + # Reset state + self.distro.update_method = None + + self.distro.package_command("update") + expected_cmd = ["zypper", "--non-interactive", "update"] + m_subp.assert_called_with(expected_cmd, capture=False) + + @mock.patch( + "cloudinit.distros.opensuse.util.get_mount_info", + return_value=("/dev/sda1", "xfs", "/"), + ) + @mock.patch( + "cloudinit.distros.opensuse.util.load_file", + return_value="foo\n/dev/sda1 / xfs rw,bar\n", + ) + @mock.patch( + "cloudinit.distros.opensuse.os.path.exists", return_value=False + ) + def test_update_not_btrfs_pkg(self, m_tu_path, m_mounts, m_minfo, m_subp): + # Reset state + self.distro.update_method = None + + self.distro.package_command("update", None, ["python36", "gzip"]) + expected_cmd = [ + "zypper", + "--non-interactive", + "update", + "python36", + "gzip", + ] + m_subp.assert_called_with(expected_cmd, capture=False) + + @mock.patch( + "cloudinit.distros.opensuse.util.get_mount_info", + return_value=("/dev/sda1", "xfs", "/"), + ) + @mock.patch( + "cloudinit.distros.opensuse.util.load_file", + return_value="foo\n/dev/sda1 / xfs rw,bar\n", + ) + @mock.patch( + "cloudinit.distros.opensuse.os.path.exists", return_value=False + ) + def test_install_not_btrfs_pkg(self, m_tu_path, m_mounts, m_minfo, m_subp): + # Reset state + self.distro.update_method = None + + self.distro.install_packages(["python36", "gzip"]) + expected_cmd = [ + "zypper", + "--non-interactive", + "install", + "--auto-agree-with-licenses", + "python36", + "gzip", + ] + m_subp.assert_called_with(expected_cmd, capture=False) + + @mock.patch( + "cloudinit.distros.opensuse.util.get_mount_info", + return_value=("/dev/sda1", "btrfs", "/"), + ) + @mock.patch( + "cloudinit.distros.opensuse.util.load_file", + return_value="foo\n/dev/sda1 / btrfs rw,bar\n", + ) + @mock.patch("cloudinit.distros.opensuse.os.path.exists", return_value=True) + def test_upgrade_btrfs(self, m_tu_path, m_mounts, m_minfo, m_subp): + # Reset state + self.distro.update_method = None + + self.distro.package_command("upgrade") + expected_cmd = [ + "transactional-update", + "--non-interactive", + "--drop-if-no-change", + "up", + ] + m_subp.assert_called_with(expected_cmd, capture=False) + + @mock.patch( + "cloudinit.distros.opensuse.util.get_mount_info", + return_value=("/dev/sda1", "btrfs", "/"), + ) + @mock.patch( + "cloudinit.distros.opensuse.util.load_file", + return_value="foo\n/dev/sda1 / btrfs rw,bar\n", + ) + @mock.patch("cloudinit.distros.opensuse.os.path.exists", return_value=True) + def test_upgrade_btrfs_pkg(self, m_tu_path, m_mounts, m_minfo, m_subp): + # Reset state + self.distro.update_method = None + + self.distro.package_command("upgrade", None, ["python36", "gzip"]) + expected_cmd = [ + "transactional-update", + "--non-interactive", + "--drop-if-no-change", + "pkg", + "update", + "python36", + "gzip", + ] + m_subp.assert_called_with(expected_cmd, capture=False) + + @mock.patch( + "cloudinit.distros.opensuse.util.get_mount_info", + return_value=("/dev/sda1", "btrfs", "/"), + ) + @mock.patch( + "cloudinit.distros.opensuse.util.load_file", + return_value="foo\n/dev/sda1 / btrf rw,bar\n", + ) + @mock.patch("cloudinit.distros.opensuse.os.path.exists", return_value=True) + def test_update_btrfs(self, m_tu_path, m_mounts, m_minfo, m_subp): + # Reset state + self.distro.update_method = None + + self.distro.package_command("update") + expected_cmd = [ + "transactional-update", + "--non-interactive", + "--drop-if-no-change", + "up", + ] + m_subp.assert_called_with(expected_cmd, capture=False) + + @mock.patch( + "cloudinit.distros.opensuse.util.get_mount_info", + return_value=("/dev/sda1", "btrfs", "/"), + ) + @mock.patch( + "cloudinit.distros.opensuse.util.load_file", + return_value="foo\n/dev/sda1 / btrfs rw,bar\n", + ) + @mock.patch("cloudinit.distros.opensuse.os.path.exists", return_value=True) + def test_update_btrfs_pkg(self, m_tu_path, m_mounts, m_minfo, m_subp): + # Reset state + self.distro.update_method = None + + self.distro.package_command("update", None, ["python36", "gzip"]) + expected_cmd = [ + "transactional-update", + "--non-interactive", + "--drop-if-no-change", + "pkg", + "update", + "python36", + "gzip", + ] + m_subp.assert_called_with(expected_cmd, capture=False) + + @mock.patch( + "cloudinit.distros.opensuse.util.get_mount_info", + return_value=("/dev/sda1", "btrfs", "/"), + ) + @mock.patch( + "cloudinit.distros.opensuse.util.load_file", + return_value="foo\n/dev/sda1 / btrfs rw,bar\n", + ) + @mock.patch("cloudinit.distros.opensuse.os.path.exists", return_value=True) + def test_install_btrfs_pkg(self, m_tu_path, m_mounts, m_minfo, m_subp): + # Reset state + self.distro.update_method = None + + self.distro.install_packages(["python36", "gzip"]) + expected_cmd = [ + "transactional-update", + "--non-interactive", + "--drop-if-no-change", + "pkg", + "install", + "--auto-agree-with-licenses", + "python36", + "gzip", + ] + m_subp.assert_called_with(expected_cmd, capture=False) + + @mock.patch( + "cloudinit.distros.opensuse.util.get_mount_info", + return_value=("/dev/sda1", "btrfs", "/"), + ) + @mock.patch( + "cloudinit.distros.opensuse.util.load_file", + return_value="foo\n/dev/sda1 / btrfs ro,bar\n", + ) + @mock.patch( + "cloudinit.distros.opensuse.os.path.exists", return_value=False + ) + def test_upgrade_no_transact_up_ro_root( + self, m_tu_path, m_mounts, m_minfo, m_subp + ): + # Reset state + self.distro.update_method = None + + result = self.distro.package_command("upgrade") + assert self.distro.read_only_root + assert result is None + assert not m_subp.called + + @mock.patch( + "cloudinit.distros.opensuse.util.get_mount_info", + return_value=("/dev/sda1", "btrfs", "/"), + ) + @mock.patch( + "cloudinit.distros.opensuse.util.load_file", + return_value="foo\n/dev/sda1 / btrfs rw,bar\n", + ) + @mock.patch( + "cloudinit.distros.opensuse.os.path.exists", return_value=False + ) + def test_upgrade_no_transact_up_rw_root_btrfs( + self, m_tu_path, m_mounts, m_minfo, m_subp + ): + # Reset state + self.distro.update_method = None + + self.distro.package_command("upgrade") + assert self.distro.update_method == "zypper" + assert self.distro.read_only_root is False + expected_cmd = ["zypper", "--non-interactive", "update"] + m_subp.assert_called_with(expected_cmd, capture=False) + + @mock.patch( + "cloudinit.distros.opensuse.util.get_mount_info", + return_value=("/dev/sda1", "xfs", "/"), + ) + @mock.patch( + "cloudinit.distros.opensuse.util.load_file", + return_value="foo\n/dev/sda1 / xfs ro,bar\n", + ) + @mock.patch("cloudinit.distros.opensuse.os.path.exists", return_value=True) + def test_upgrade_transact_up_ro_root( + self, m_tu_path, m_mounts, m_minfo, m_subp + ): + # Reset state + self.distro.update_method = None + + result = self.distro.package_command("upgrade") + assert self.distro.update_method == "zypper" + assert self.distro.read_only_root + assert result is None + assert not m_subp.called + + @mock.patch( + "cloudinit.distros.opensuse.util.get_mount_info", + return_value=("/dev/sda1", "btrfs", "/"), + ) + @mock.patch( + "cloudinit.distros.opensuse.util.load_file", + return_value="foo\n/dev/sda1 / btrfs ro,bar\n", + ) + @mock.patch("cloudinit.distros.opensuse.os.path.exists", return_value=True) + def test_refresh_transact_up_ro_root_btrfs( + self, m_tu_path, m_mounts, m_minfo, m_subp + ): + # Reset state + self.distro.update_method = None + + self.distro.package_command("refresh") + assert self.distro.update_method == "transactional" + assert self.distro.read_only_root + expected_cmd = ["zypper", "--non-interactive", "refresh"] + m_subp.assert_called_with(expected_cmd, capture=False) |