From 4bea23cad234f803bfe612a71e0dcd838f6579a4 Mon Sep 17 00:00:00 2001 From: Cristian Matiut Date: Thu, 29 Aug 2024 14:23:50 +0300 Subject: [PATCH] osmorphing: Check installed packages before installing packages --- coriolis/osmorphing/base.py | 5 +++++ coriolis/osmorphing/coreos.py | 3 +++ coriolis/osmorphing/debian.py | 8 ++++++++ coriolis/osmorphing/manager.py | 5 +++++ coriolis/osmorphing/openwrt.py | 3 +++ coriolis/osmorphing/redhat.py | 13 ++++++------- coriolis/osmorphing/suse.py | 9 +++++++++ 7 files changed, 39 insertions(+), 7 deletions(-) diff --git a/coriolis/osmorphing/base.py b/coriolis/osmorphing/base.py index fbf7445e3..fa1ecb1c8 100644 --- a/coriolis/osmorphing/base.py +++ b/coriolis/osmorphing/base.py @@ -78,6 +78,10 @@ def check_os_supported(cls, detected_os_info): "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 @@ def set_environment(self, environment): class BaseLinuxOSMorphingTools(BaseOSMorphingTools): _packages = {} + installed_packages = [] def __init__(self, conn, os_root_dir, os_root_dev, hypervisor, event_manager, detected_os_info, osmorphing_parameters, diff --git a/coriolis/osmorphing/coreos.py b/coriolis/osmorphing/coreos.py index 4cc3628c2..30c9d0568 100644 --- a/coriolis/osmorphing/coreos.py +++ b/coriolis/osmorphing/coreos.py @@ -14,6 +14,9 @@ def check_os_supported(cls, detected_os_info): return True return False + def get_installed_package(self): + pass + def disable_predictable_nic_names(self): pass diff --git a/coriolis/osmorphing/debian.py b/coriolis/osmorphing/debian.py index 6f87c1ef9..29d0b77b7 100644 --- a/coriolis/osmorphing/debian.py +++ b/coriolis/osmorphing/debian.py @@ -122,6 +122,14 @@ def set_net_config(self, nics_info, dhcp): 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) diff --git a/coriolis/osmorphing/manager.py b/coriolis/osmorphing/manager.py index bf900d03c..50493b8a1 100644 --- a/coriolis/osmorphing/manager.py +++ b/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) diff --git a/coriolis/osmorphing/openwrt.py b/coriolis/osmorphing/openwrt.py index 63acbbf08..c0b9afaed 100644 --- a/coriolis/osmorphing/openwrt.py +++ b/coriolis/osmorphing/openwrt.py @@ -17,6 +17,9 @@ def check_os_supported(cls, detected_os_info): return True return False + def get_installed_package(self): + pass + def disable_predictable_nic_names(self): pass diff --git a/coriolis/osmorphing/redhat.py b/coriolis/osmorphing/redhat.py index 7d0fa93f7..2f01698e4 100644 --- a/coriolis/osmorphing/redhat.py +++ b/coriolis/osmorphing/redhat.py @@ -209,15 +209,14 @@ def set_net_config(self, nics_info, dhcp): 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 @@ def pre_packages_install(self, package_names): 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") diff --git a/coriolis/osmorphing/suse.py b/coriolis/osmorphing/suse.py index 5ef6bda04..fc792c1ec 100644 --- a/coriolis/osmorphing/suse.py +++ b/coriolis/osmorphing/suse.py @@ -65,6 +65,15 @@ def set_net_config(self, nics_info, dhcp): # 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