Alessandro Pilotti 10 лет назад
Родитель
Сommit
46aea461e8

+ 2 - 2
coriolis/osmorphing/manager.py

@@ -23,7 +23,7 @@ def morph_image(connection_info, target_hypervisor, target_platform,
 
     os_mount_tools = osmount_factory.get_os_mount_tools(ssh)
     LOG.info("Discovering and mounting OS partitions")
-    os_root_dir, other_mounted_dirs = os_mount_tools.mount_os(ssh, volume_devs)
+    os_root_dir, other_mounted_dirs = os_mount_tools.mount_os(volume_devs)
     os_morphing_tools, os_info = osmorphing_factory.get_os_morphing_tools(
         ssh, os_root_dir, target_hypervisor, target_platform)
 
@@ -48,4 +48,4 @@ def morph_image(connection_info, target_hypervisor, target_platform,
     os_morphing_tools.post_packages_install()
 
     LOG.info("Dismounting OS partitions")
-    os_mount_tools.dismount_os(ssh, other_mounted_dirs + [os_root_dir])
+    os_mount_tools.dismount_os(other_mounted_dirs + [os_root_dir])

+ 25 - 0
coriolis/osmorphing/osmount/base.py

@@ -0,0 +1,25 @@
+import abc
+
+from coriolis import utils
+
+
+class BaseOSMountTools(object):
+    __metaclass__ = abc.ABCMeta
+
+    def __init__(self, ssh):
+        self._ssh = ssh
+
+    @abc.abstractmethod
+    def check_os(self):
+        pass
+
+    @abc.abstractmethod
+    def mount_os(self, volume_devs):
+        pass
+
+    @abc.abstractmethod
+    def dismount_os(self, dirs):
+        pass
+
+    def _exec_cmd(self, cmd):
+        return utils.exec_ssh_cmd(self._ssh, cmd)

+ 3 - 2
coriolis/osmorphing/osmount/factory.py

@@ -6,6 +6,7 @@ def get_os_mount_tools(ssh):
     os_mount_tools = [ubuntu.UbuntuOSMountTools]
 
     for cls in os_mount_tools:
-        if cls.check_os(ssh):
-            return cls()
+        tools = cls(ssh)
+        if tools.check_os():
+            return tools
     raise exception.CoriolisException("OS mount tools not found")

+ 32 - 36
coriolis/osmorphing/osmount/ubuntu.py

@@ -2,20 +2,20 @@ import os
 import re
 
 from coriolis import exception
+from coriolis.osmorphing.osmount import base
 from coriolis import utils
 
 
-class UbuntuOSMountTools(object):
-    @staticmethod
-    def check_os(ssh):
-        os_info = utils.get_linux_os_info(ssh)
+class UbuntuOSMountTools(base.BaseOSMountTools):
+    def check_os(self):
+        os_info = utils.get_linux_os_info(self._ssh)
         if os_info and os_info[0] == 'Ubuntu':
             return True
 
-    def _get_vgnames(self, ssh):
+    def _get_vgnames(self):
         vg_names = []
-        vgscan_out_lines = utils.exec_ssh_cmd(
-            ssh, "sudo vgscan").decode().split('\n')[1:-1]
+        vgscan_out_lines = self._exec_cmd(
+            "sudo vgscan").decode().split('\n')[1:-1]
         for vgscan_out_line in vgscan_out_lines:
             m = re.match(
                 r'\s*Found volume group "(.*)" using metadata type lvm2',
@@ -24,45 +24,42 @@ class UbuntuOSMountTools(object):
                 vg_names.append(m.groups()[0])
         return vg_names
 
-    def mount_os(self, ssh, volume_devs):
+    def mount_os(self, volume_devs):
         dev_paths = []
         other_mounted_dirs = []
 
         for volume_dev in volume_devs:
-            utils.exec_ssh_cmd(
-                ssh,  "sudo partx -v -a %s || true" % volume_dev)
-            dev_paths += utils.exec_ssh_cmd(
-                ssh, "sudo ls %s*" % volume_dev).decode().split('\n')[:-1]
-
-        utils.exec_ssh_cmd(ssh, "sudo apt-get update -y")
-        utils.exec_ssh_cmd(ssh, "sudo apt-get install lvm2 -y")
-        utils.exec_ssh_cmd(ssh, "sudo modprobe dm-mod")
-
-        for vg_name in self._get_vgnames(ssh):
-            utils.exec_ssh_cmd(ssh, "sudo vgchange -ay %s" % vg_name)
-            lvm_dev_paths = utils.exec_ssh_cmd(
-                ssh, "sudo ls /dev/%s/*" % vg_name).decode().split('\n')[:-1]
+            self._exec_cmd("sudo partx -v -a %s || true" % volume_dev)
+            dev_paths += self._exec_cmd(
+                "sudo ls %s*" % volume_dev).decode().split('\n')[:-1]
+
+        self._exec_cmd("sudo apt-get update -y")
+        self._exec_cmd("sudo apt-get install lvm2 -y")
+        self._exec_cmd("sudo modprobe dm-mod")
+
+        for vg_name in self._get_vgnames():
+            self._exec_cmd("sudo vgchange -ay %s" % vg_name)
+            lvm_dev_paths = self._exec_cmd(
+                "sudo ls /dev/%s/*" % vg_name).decode().split('\n')[:-1]
             dev_paths += lvm_dev_paths
 
         valid_filesystems = ['ext2', 'ext3', 'ext4', 'xfs']
 
         dev_paths_to_mount = []
         for dev_path in dev_paths:
-            fs_type = utils.exec_ssh_cmd(
-                ssh, "sudo blkid -o value -s TYPE %s || true" %
+            fs_type = self._exec_cmd(
+                "sudo blkid -o value -s TYPE %s || true" %
                 dev_path).decode().split('\n')[0]
             if fs_type in valid_filesystems:
-                utils.check_fs(ssh, fs_type, dev_path)
+                utils.check_fs(self._ssh, fs_type, dev_path)
                 dev_paths_to_mount.append(dev_path)
 
         os_root_dir = None
         boot_dev_path = None
         for dev_path in dev_paths_to_mount:
-            tmp_dir = utils.exec_ssh_cmd(
-                ssh,  'mktemp -d').decode().split('\n')[0]
-            utils.exec_ssh_cmd(ssh, 'sudo mount %s %s' % (dev_path, tmp_dir))
-            dirs = utils.exec_ssh_cmd(
-                ssh, 'ls %s' % tmp_dir).decode().split('\n')
+            tmp_dir = self._exec_cmd('mktemp -d').decode().split('\n')[0]
+            self._exec_cmd('sudo mount %s %s' % (dev_path, tmp_dir))
+            dirs = self._exec_cmd('ls %s' % tmp_dir).decode().split('\n')
 
             # TODO: better ways to check for a linux root?
             if (not os_root_dir and 'etc' in dirs and 'bin' in dirs and
@@ -75,7 +72,7 @@ class UbuntuOSMountTools(object):
                     # Needs to be remounted under os_root_dir
                     boot_dev_path = dev_path
 
-                utils.exec_ssh_cmd(ssh, 'sudo umount %s' % tmp_dir)
+                self._exec_cmd('sudo umount %s' % tmp_dir)
 
             if os_root_dir and boot_dev_path:
                 break
@@ -85,19 +82,18 @@ class UbuntuOSMountTools(object):
 
         for dir in set(dirs).intersection(['proc', 'sys', 'dev', 'run']):
             mount_dir = os.path.join(os_root_dir, dir)
-            utils.exec_ssh_cmd(
-                ssh, 'sudo mount -o bind /%(dir)s/ %(mount_dir)s' %
+            self._exec_cmd(
+                'sudo mount -o bind /%(dir)s/ %(mount_dir)s' %
                 {'dir': dir, 'mount_dir': mount_dir})
             other_mounted_dirs.append(mount_dir)
 
         if boot_dev_path:
             boot_dir = os.path.join(os_root_dir, 'boot')
-            utils.exec_ssh_cmd(ssh, 'sudo mount %s %s' %
-                               (boot_dev_path, boot_dir))
+            self._exec_cmd('sudo mount %s %s' % (boot_dev_path, boot_dir))
             other_mounted_dirs.append(boot_dir)
 
         return os_root_dir, other_mounted_dirs
 
-    def dismount_os(self, ssh, dirs):
+    def dismount_os(self, dirs):
         for dir in dirs:
-            utils.exec_ssh_cmd(ssh, 'sudo umount %s' % dir)
+            self._exec_cmd('sudo umount %s' % dir)