Selaa lähdekoodia

Add unit tests for `osmorphing.ubuntu.py` module

Signed-off-by: Mihaela Balutoiu <mbalutoiu@cloudbasesolutions.com>
Mihaela Balutoiu 2 vuotta sitten
vanhempi
sitoutus
92da4a99b6
1 muutettua tiedostoa jossa 167 lisäystä ja 0 poistoa
  1. 167 0
      coriolis/tests/osmorphing/test_ubuntu.py

+ 167 - 0
coriolis/tests/osmorphing/test_ubuntu.py

@@ -0,0 +1,167 @@
+# Copyright 2024 Cloudbase Solutions Srl
+# All Rights Reserved.
+
+import logging
+from unittest import mock
+
+from coriolis.osmorphing import base
+from coriolis.osmorphing import ubuntu
+from coriolis.tests import test_base
+
+
+class BaseUbuntuMorphingToolsTestCase(test_base.CoriolisBaseTestCase):
+    """Test suite for the BaseUbuntuMophingTools class."""
+
+    def setUp(self):
+        super(BaseUbuntuMorphingToolsTestCase, self).setUp()
+        self.detected_os_info = {
+            'os_type': 'linux',
+            'distribution_name': 'Ubuntu',
+            'release_version': '22.04',
+            'friendly_release_name': mock.sentinel.friendly_release_name,
+        }
+        self.event_manager = mock.MagicMock()
+        self.os_root_dir = '/root'
+        self.morphing_tools = ubuntu.BaseUbuntuMorphingTools(
+            mock.sentinel.conn, self.os_root_dir,
+            mock.sentinel.os_root_dev, mock.sentinel.hypervisor,
+            self.event_manager, self.detected_os_info,
+            mock.sentinel.osmorphing_parameters,
+            mock.sentinel.operation_timeout)
+
+    def test_check_os_supported_not_supported(self):
+        self.detected_os_info['distribution_name'] = 'unsupported'
+
+        result = ubuntu.BaseUbuntuMorphingTools.check_os_supported(
+            self.detected_os_info)
+
+        self.assertFalse(result)
+
+    def test_check_os_supported_lts_release(self):
+        self.detected_os_info['release_version'] = '20.04'
+
+        result = ubuntu.BaseUbuntuMorphingTools.check_os_supported(
+            self.detected_os_info)
+
+        self.assertTrue(result)
+
+    def test_check_os_supported_non_lts_release(self):
+        result = ubuntu.BaseUbuntuMorphingTools.check_os_supported(
+            self.detected_os_info)
+
+        self.assertTrue(result)
+
+    @mock.patch.object(base.BaseLinuxOSMorphingTools, '_exec_cmd')
+    @mock.patch.object(base.BaseLinuxOSMorphingTools, '_write_file_sudo')
+    @mock.patch.object(base.BaseLinuxOSMorphingTools, '_read_file')
+    @mock.patch.object(base.BaseLinuxOSMorphingTools, '_list_dir')
+    def test__set_netplan_ethernet_configs(
+            self, mock_list_dir, mock_read_file, mock_write_file_sudo,
+            mock_exec_cmd):
+        mock_list_dir.return_value = ['file1', 'file2.yaml']
+        mock_read_file.return_value = (
+            b'network: {version: 2, ethernets: {eth0: {dhcp4: true}}}')
+        nics_info = [
+            {'name': 'eth0', 'mac_address': '00:00:00:00:00:00'},
+            {'name': 'eth1', 'mac_address': '00:00:00:00:00:01'}]
+        config_data = {
+            'network': {
+                'ethernets': {
+                    'test0': {
+                        'dhcp4': True,
+                        'dhcp6': True
+                    }
+                },
+                'version': 2
+            }
+        }
+
+        self.morphing_tools._set_netplan_ethernet_configs(
+            nics_info, dhcp=True, iface_name_prefix='test')
+
+        mock_exec_cmd.assert_called_once_with(
+            "sudo cp '%s/etc/netplan/file2.yaml' "
+            "'%s/etc/netplan/file2.yaml.bak'" % (
+                self.os_root_dir, self.os_root_dir))
+        mock_read_file.assert_called_once_with('etc/netplan/file2.yaml')
+        mock_write_file_sudo.assert_called_once_with(
+            'etc/netplan/file2.yaml', ubuntu.yaml.dump(config_data))
+
+    @mock.patch.object(base.BaseLinuxOSMorphingTools, '_exec_cmd')
+    @mock.patch.object(base.BaseLinuxOSMorphingTools, '_write_file_sudo')
+    @mock.patch.object(base.BaseLinuxOSMorphingTools, '_read_file')
+    @mock.patch.object(base.BaseLinuxOSMorphingTools, '_list_dir')
+    def test__set_netplan_ethernet_configs_no_network_data(
+            self, mock_list_dir, mock_read_file, mock_write_file_sudo,
+            mock_exec_cmd):
+        mock_list_dir.return_value = ['file1.yaml']
+        mock_read_file.return_value = b'{}'
+
+        with self.assertLogs('coriolis.osmorphing.ubuntu',
+                             level=logging.DEBUG):
+            self.morphing_tools._set_netplan_ethernet_configs(
+                mock.sentinel.nics_info)
+
+        mock_read_file.assert_called_once_with('etc/netplan/file1.yaml')
+        mock_exec_cmd.assert_called_once_with(
+            "sudo cp '%s/etc/netplan/file1.yaml' "
+            "'%s/etc/netplan/file1.yaml.bak'" % (
+                self.os_root_dir, self.os_root_dir))
+        mock_write_file_sudo.assert_not_called()
+
+    @mock.patch.object(base.BaseLinuxOSMorphingTools, '_exec_cmd')
+    @mock.patch.object(base.BaseLinuxOSMorphingTools, '_write_file_sudo')
+    @mock.patch.object(base.BaseLinuxOSMorphingTools, '_read_file')
+    @mock.patch.object(base.BaseLinuxOSMorphingTools, '_list_dir')
+    def test__set_netplan_ethernet_configs_incompatible_version(
+            self, mock_list_dir, mock_read_file, mock_write_file_sudo,
+            mock_exec_cmd):
+        mock_list_dir.return_value = ['file1.yaml']
+        mock_read_file.return_value = b'network: {version: 4}'
+
+        with self.assertLogs('coriolis.osmorphing.ubuntu',
+                             level=logging.DEBUG):
+            self.morphing_tools._set_netplan_ethernet_configs(
+                mock.sentinel.nics_info)
+
+        mock_read_file.assert_called_once_with('etc/netplan/file1.yaml')
+        mock_exec_cmd.assert_called_once_with(
+            "sudo cp '%s/etc/netplan/file1.yaml' "
+            "'%s/etc/netplan/file1.yaml.bak'" % (
+                self.os_root_dir, self.os_root_dir))
+        mock_write_file_sudo.assert_not_called()
+
+    @mock.patch.object(base.BaseLinuxOSMorphingTools, '_exec_cmd')
+    @mock.patch.object(base.BaseLinuxOSMorphingTools, '_write_file_sudo')
+    @mock.patch.object(base.BaseLinuxOSMorphingTools, '_read_file')
+    @mock.patch.object(base.BaseLinuxOSMorphingTools, '_list_dir')
+    def test__set_netplan_ethernet_configs_no_ethernet_configs(
+            self, mock_list_dir, mock_read_file, mock_write_file_sudo,
+            mock_exec_cmd):
+        mock_list_dir.return_value = ['file1.yaml']
+        mock_read_file.return_value = (
+            b'network: {version: 2, ethernets: {eth0: {dhcp4: true}}}')
+
+        nics_info = [{'name': 'eth0', 'mac_address': '00:00:00:00:00:00'}]
+
+        with self.assertLogs('coriolis.osmorphing.ubuntu',
+                             level=logging.DEBUG):
+            self.morphing_tools._set_netplan_ethernet_configs(nics_info)
+
+        config_data = {
+            'network': {
+                'ethernets': {
+                    'eth0': {
+                        'dhcp4': True,
+                    }
+                },
+                'version': 2
+            }
+        }
+        mock_read_file.assert_called_once_with('etc/netplan/file1.yaml')
+        mock_exec_cmd.assert_called_once_with(
+            "sudo cp '%s/etc/netplan/file1.yaml' "
+            "'%s/etc/netplan/file1.yaml.bak'" % (
+                self.os_root_dir, self.os_root_dir))
+        mock_write_file_sudo.assert_called_once_with(
+            'etc/netplan/file1.yaml', ubuntu.yaml.dump(config_data))