Ver Fonte

osmorphing: Check installed packages before installing packages

Cristian Matiut há 1 ano atrás
pai
commit
8b0dc4b36d

+ 5 - 0
coriolis/osmorphing/base.py

@@ -78,6 +78,10 @@ class BaseOSMorphingTools(object, with_metaclass(abc.ABCMeta)):
             "OS compatibility check not implemented for tools class %s" % (
                 cls.__name__))
 
+    @abc.abstractmethod
+    def get_installed_packages(self, package_name):
+        pass
+
     @abc.abstractmethod
     def set_net_config(self, nics_info, dhcp):
         pass
@@ -121,6 +125,7 @@ class BaseOSMorphingTools(object, with_metaclass(abc.ABCMeta)):
 class BaseLinuxOSMorphingTools(BaseOSMorphingTools):
 
     _packages = {}
+    installed_packages = []
 
     def __init__(self, conn, os_root_dir, os_root_dev, hypervisor,
                  event_manager, detected_os_info, osmorphing_parameters,

+ 3 - 0
coriolis/osmorphing/coreos.py

@@ -14,6 +14,9 @@ class BaseCoreOSMorphingTools(base.BaseLinuxOSMorphingTools):
             return True
         return False
 
+    def get_installed_package(self):
+        pass
+
     def disable_predictable_nic_names(self):
         pass
 

+ 8 - 0
coriolis/osmorphing/debian.py

@@ -122,6 +122,14 @@ class BaseDebianMorphingTools(base.BaseLinuxOSMorphingTools):
             cfg_name = "%s/coriolis_netplan.yaml" % netplan_base
             self._write_file_sudo(cfg_name, new_cfg)
 
+    def get_installed_packages(self):
+        cmd = "dpkg-query -f '${binary:Package}\\n' -W"
+        try:
+            self.installed_packages = self._exec_cmd_chroot(
+                cmd).decode('utf-8').splitlines()
+        except exception.CoriolisException:
+            pass
+
     def pre_packages_install(self, package_names):
         super(BaseDebianMorphingTools, self).pre_packages_install(
             package_names)

+ 5 - 0
coriolis/osmorphing/manager.py

@@ -239,6 +239,11 @@ def morph_image(origin_provider, destination_provider, connection_info,
         LOG.info("Post packages uninstall")
         export_os_morphing_tools.post_packages_uninstall(packages_remove)
 
+    LOG.info("Checking for packages already installed")
+    import_os_morphing_tools.get_installed_packages()
+    packages_add = list(
+        set(packages_add) - set(import_os_morphing_tools.installed_packages))
+
     LOG.info("Pre packages install")
     import_os_morphing_tools.pre_packages_install(packages_add)
 

+ 3 - 0
coriolis/osmorphing/openwrt.py

@@ -17,6 +17,9 @@ class BaseOpenWRTMorphingTools(base.BaseLinuxOSMorphingTools):
             return True
         return False
 
+    def get_installed_package(self):
+        pass
+
     def disable_predictable_nic_names(self):
         pass
 

+ 6 - 7
coriolis/osmorphing/redhat.py

@@ -209,15 +209,14 @@ class BaseRedHatMorphingTools(base.BaseLinuxOSMorphingTools):
                                                     mac_addresses)
         self._add_net_udev_rules(net_ifaces_info)
 
-    def _has_package_installed(self, package_name):
-        cmd = 'rpm -q %s' % ("".join(package_name))
+    def get_installed_packages(self):
+        cmd = 'rpm -qa --qf "%{NAME}\\n"'
         try:
-            self._exec_cmd_chroot(cmd)
-            return True
+            self.installed_packages = self._exec_cmd_chroot(
+                cmd).decode('utf-8').splitlines()
         except exception.CoriolisException:
-            LOG.warning(f"Package ${package_name} is not installed")
+            LOG.warning("Failed to get installed packages")
             LOG.trace(utils.get_exception_details())
-            return False
 
     def _yum_install(self, package_names, enable_repos=[]):
         try:
@@ -295,7 +294,7 @@ class BaseRedHatMorphingTools(base.BaseLinuxOSMorphingTools):
         super(BaseRedHatMorphingTools, self).pre_packages_install(
             package_names)
         self._yum_clean_all()
-        if not self._has_package_installed('grubby'):
+        if 'grubby' not in self.installed_packages:
             self._yum_install(['grubby'])
         else:
             LOG.debug("Skipping package 'grubby' as it's already installed")

+ 9 - 0
coriolis/osmorphing/suse.py

@@ -65,6 +65,15 @@ class BaseSUSEMorphingTools(base.BaseLinuxOSMorphingTools):
         # TODO(alexpilotti): add networking support
         pass
 
+    def get_installed_packages(self):
+        cmd = 'rpm -qa --qf "%{NAME}\\n"'
+        try:
+            self.installed_packages = self._exec_cmd_chroot(
+                cmd).decode('utf-8').splitlines()
+        except exception.CoriolisException:
+            LOG.warning("Failed to get installed packages")
+            LOG.trace(utils.get_exception_details())
+
     def get_update_grub2_command(self):
         location = self._get_grub2_cfg_location()
         return "grub2-mkconfig -o %s" % location

+ 3 - 0
coriolis/osmorphing/windows.py

@@ -610,6 +610,9 @@ class BaseWindowsMorphingTools(base.BaseOSMorphingTools):
     def get_packages(self):
         return [], []
 
+    def get_installed_packages(self):
+        pass
+
     def pre_packages_install(self, package_names):
         pass