Blame cloudinit/config/tests/test_grub_dpkg.py

Packit Service 751c4a
# This file is part of cloud-init. See LICENSE file for license information.
Packit Service 751c4a
Packit Service 751c4a
import pytest
Packit Service 751c4a
Packit Service 751c4a
from unittest import mock
Packit Service 751c4a
from logging import Logger
Packit Service 751c4a
from cloudinit.subp import ProcessExecutionError
Packit Service 751c4a
from cloudinit.config.cc_grub_dpkg import fetch_idevs, handle
Packit Service 751c4a
Packit Service 751c4a
Packit Service 751c4a
class TestFetchIdevs:
Packit Service 751c4a
    """Tests cc_grub_dpkg.fetch_idevs()"""
Packit Service 751c4a
Packit Service 751c4a
    # Note: udevadm info returns devices in a large single line string
Packit Service 751c4a
    @pytest.mark.parametrize(
Packit Service 751c4a
        "grub_output,path_exists,expected_log_call,udevadm_output"
Packit Service 751c4a
        ",expected_idevs",
Packit Service 751c4a
        [
Packit Service 751c4a
            # Inside a container, grub not installed
Packit Service 751c4a
            (
Packit Service 751c4a
                ProcessExecutionError(reason=FileNotFoundError()),
Packit Service 751c4a
                False,
Packit Service 751c4a
                mock.call("'grub-probe' not found in $PATH"),
Packit Service 751c4a
                '',
Packit Service 751c4a
                '',
Packit Service 751c4a
            ),
Packit Service 751c4a
            # Inside a container, grub installed
Packit Service 751c4a
            (
Packit Service 751c4a
                ProcessExecutionError(stderr="failed to get canonical path"),
Packit Service 751c4a
                False,
Packit Service 751c4a
                mock.call("grub-probe 'failed to get canonical path'"),
Packit Service 751c4a
                '',
Packit Service 751c4a
                '',
Packit Service 751c4a
            ),
Packit Service 751c4a
            # KVM Instance
Packit Service 751c4a
            (
Packit Service 751c4a
                ['/dev/vda'],
Packit Service 751c4a
                True,
Packit Service 751c4a
                None,
Packit Service 751c4a
                (
Packit Service 751c4a
                    '/dev/disk/by-path/pci-0000:00:00.0 ',
Packit Service 751c4a
                    '/dev/disk/by-path/virtio-pci-0000:00:00.0 '
Packit Service 751c4a
                ),
Packit Service 751c4a
                '/dev/vda',
Packit Service 751c4a
            ),
Packit Service 751c4a
            # Xen Instance
Packit Service 751c4a
            (
Packit Service 751c4a
                ['/dev/xvda'],
Packit Service 751c4a
                True,
Packit Service 751c4a
                None,
Packit Service 751c4a
                '',
Packit Service 751c4a
                '/dev/xvda',
Packit Service 751c4a
            ),
Packit Service 751c4a
            # NVMe Hardware Instance
Packit Service 751c4a
            (
Packit Service 751c4a
                ['/dev/nvme1n1'],
Packit Service 751c4a
                True,
Packit Service 751c4a
                None,
Packit Service 751c4a
                (
Packit Service 751c4a
                    '/dev/disk/by-id/nvme-Company_hash000 ',
Packit Service 751c4a
                    '/dev/disk/by-id/nvme-nvme.000-000-000-000-000 ',
Packit Service 751c4a
                    '/dev/disk/by-path/pci-0000:00:00.0-nvme-0 '
Packit Service 751c4a
                ),
Packit Service 751c4a
                '/dev/disk/by-id/nvme-Company_hash000',
Packit Service 751c4a
            ),
Packit Service 751c4a
            # SCSI Hardware Instance
Packit Service 751c4a
            (
Packit Service 751c4a
                ['/dev/sda'],
Packit Service 751c4a
                True,
Packit Service 751c4a
                None,
Packit Service 751c4a
                (
Packit Service 751c4a
                    '/dev/disk/by-id/company-user-1 ',
Packit Service 751c4a
                    '/dev/disk/by-id/scsi-0Company_user-1 ',
Packit Service 751c4a
                    '/dev/disk/by-path/pci-0000:00:00.0-scsi-0:0:0:0 '
Packit Service 751c4a
                ),
Packit Service 751c4a
                '/dev/disk/by-id/company-user-1',
Packit Service 751c4a
            ),
Packit Service 751c4a
        ],
Packit Service 751c4a
    )
Packit Service 751c4a
    @mock.patch("cloudinit.config.cc_grub_dpkg.util.logexc")
Packit Service 751c4a
    @mock.patch("cloudinit.config.cc_grub_dpkg.os.path.exists")
Packit Service 751c4a
    @mock.patch("cloudinit.config.cc_grub_dpkg.subp.subp")
Packit Service 751c4a
    def test_fetch_idevs(self, m_subp, m_exists, m_logexc, grub_output,
Packit Service 751c4a
                         path_exists, expected_log_call, udevadm_output,
Packit Service 751c4a
                         expected_idevs):
Packit Service 751c4a
        """Tests outputs from grub-probe and udevadm info against grub-dpkg"""
Packit Service 751c4a
        m_subp.side_effect = [
Packit Service 751c4a
            grub_output,
Packit Service 751c4a
            ["".join(udevadm_output)]
Packit Service 751c4a
        ]
Packit Service 751c4a
        m_exists.return_value = path_exists
Packit Service 751c4a
        log = mock.Mock(spec=Logger)
Packit Service 751c4a
        idevs = fetch_idevs(log)
Packit Service 751c4a
        assert expected_idevs == idevs
Packit Service 751c4a
        if expected_log_call is not None:
Packit Service 751c4a
            assert expected_log_call in log.debug.call_args_list
Packit Service 751c4a
Packit Service 751c4a
Packit Service 751c4a
class TestHandle:
Packit Service 751c4a
    """Tests cc_grub_dpkg.handle()"""
Packit Service 751c4a
Packit Service 751c4a
    @pytest.mark.parametrize(
Packit Service 751c4a
        "cfg_idevs,cfg_idevs_empty,fetch_idevs_output,expected_log_output",
Packit Service 751c4a
        [
Packit Service 751c4a
            (
Packit Service 751c4a
                # No configuration
Packit Service 751c4a
                None,
Packit Service 751c4a
                None,
Packit Service 751c4a
                '/dev/disk/by-id/nvme-Company_hash000',
Packit Service 751c4a
                (
Packit Service 751c4a
                    "Setting grub debconf-set-selections with ",
Packit Service 751c4a
                    "'/dev/disk/by-id/nvme-Company_hash000','false'"
Packit Service 751c4a
                ),
Packit Service 751c4a
            ),
Packit Service 751c4a
            (
Packit Service 751c4a
                # idevs set, idevs_empty unset
Packit Service 751c4a
                '/dev/sda',
Packit Service 751c4a
                None,
Packit Service 751c4a
                '/dev/sda',
Packit Service 751c4a
                (
Packit Service 751c4a
                    "Setting grub debconf-set-selections with ",
Packit Service 751c4a
                    "'/dev/sda','false'"
Packit Service 751c4a
                ),
Packit Service 751c4a
            ),
Packit Service 751c4a
            (
Packit Service 751c4a
                # idevs unset, idevs_empty set
Packit Service 751c4a
                None,
Packit Service 751c4a
                'true',
Packit Service 751c4a
                '/dev/xvda',
Packit Service 751c4a
                (
Packit Service 751c4a
                    "Setting grub debconf-set-selections with ",
Packit Service 751c4a
                    "'/dev/xvda','true'"
Packit Service 751c4a
                ),
Packit Service 751c4a
            ),
Packit Service 751c4a
            (
Packit Service 751c4a
                # idevs set, idevs_empty set
Packit Service 751c4a
                '/dev/vda',
Packit Service 751c4a
                'false',
Packit Service 751c4a
                '/dev/disk/by-id/company-user-1',
Packit Service 751c4a
                (
Packit Service 751c4a
                    "Setting grub debconf-set-selections with ",
Packit Service 751c4a
                    "'/dev/vda','false'"
Packit Service 751c4a
                ),
Packit Service 751c4a
            ),
Packit Service 751c4a
            (
Packit Service 751c4a
                # idevs set, idevs_empty set
Packit Service 751c4a
                # Respect what the user defines, even if its logically wrong
Packit Service 751c4a
                '/dev/nvme0n1',
Packit Service 751c4a
                'true',
Packit Service 751c4a
                '',
Packit Service 751c4a
                (
Packit Service 751c4a
                    "Setting grub debconf-set-selections with ",
Packit Service 751c4a
                    "'/dev/nvme0n1','true'"
Packit Service 751c4a
                ),
Packit Service 751c4a
            )
Packit Service 751c4a
        ],
Packit Service 751c4a
    )
Packit Service 751c4a
    @mock.patch("cloudinit.config.cc_grub_dpkg.fetch_idevs")
Packit Service 751c4a
    @mock.patch("cloudinit.config.cc_grub_dpkg.util.get_cfg_option_str")
Packit Service 751c4a
    @mock.patch("cloudinit.config.cc_grub_dpkg.util.logexc")
Packit Service 751c4a
    @mock.patch("cloudinit.config.cc_grub_dpkg.subp.subp")
Packit Service 751c4a
    def test_handle(self, m_subp, m_logexc, m_get_cfg_str, m_fetch_idevs,
Packit Service 751c4a
                    cfg_idevs, cfg_idevs_empty, fetch_idevs_output,
Packit Service 751c4a
                    expected_log_output):
Packit Service 751c4a
        """Test setting of correct debconf database entries"""
Packit Service 751c4a
        m_get_cfg_str.side_effect = [
Packit Service 751c4a
            cfg_idevs,
Packit Service 751c4a
            cfg_idevs_empty
Packit Service 751c4a
        ]
Packit Service 751c4a
        m_fetch_idevs.return_value = fetch_idevs_output
Packit Service 751c4a
        log = mock.Mock(spec=Logger)
Packit Service 751c4a
        handle(mock.Mock(), mock.Mock(), mock.Mock(), log, mock.Mock())
Packit Service 751c4a
        log.debug.assert_called_with("".join(expected_log_output))
Packit Service 751c4a
Packit Service 751c4a
Packit Service 751c4a
# vi: ts=4 expandtab