Skip to content

Commit

Permalink
osmorphing: Check installed packages before installing packages
Browse files Browse the repository at this point in the history
  • Loading branch information
Cristi1324 committed Sep 2, 2024
1 parent 24c52ea commit b234a6f
Show file tree
Hide file tree
Showing 7 changed files with 50 additions and 7 deletions.
18 changes: 18 additions & 0 deletions coriolis/osmorphing/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -189,6 +193,20 @@ def _version_supported_util(cls, version, minimum, maximum=None):

return True

def check_installed_packages(self, package_names):
self.installed_packages = [
package.decode('utf-8') for package in
self.get_installed_packages()]
LOG.info("Packages installed: %s" % str(self.installed_packages))

packages = [
pkg for pkg in package_names if not any(
pkg in installed_pkg for installed_pkg in
self.installed_packages)]
LOG.info("Packages already installed: %s" %
str(set(package_names) - set(packages)))
return packages

def get_packages(self):
k_add = [h for h in self._packages.keys() if
h is None or h == self._hypervisor]
Expand Down
3 changes: 3 additions & 0 deletions coriolis/osmorphing/coreos.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ def check_os_supported(cls, detected_os_info):
return True
return False

def get_installed_package(self):
return []

def disable_predictable_nic_names(self):
pass

Expand Down
7 changes: 7 additions & 0 deletions coriolis/osmorphing/debian.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,13 @@ 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 = 'apt list --installed'
try:
return self._exec_cmd_chroot(cmd).splitlines()
except exception.CoriolisException:
return []

def pre_packages_install(self, package_names):
super(BaseDebianMorphingTools, self).pre_packages_install(
package_names)
Expand Down
4 changes: 4 additions & 0 deletions coriolis/osmorphing/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,10 @@ 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")
packages_add = import_os_morphing_tools.check_installed_packages(
packages_add)

LOG.info("Pre packages install")
import_os_morphing_tools.pre_packages_install(packages_add)

Expand Down
3 changes: 3 additions & 0 deletions coriolis/osmorphing/openwrt.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ def check_os_supported(cls, detected_os_info):
return True
return False

def get_installed_package(self):
return []

def disable_predictable_nic_names(self):
pass

Expand Down
13 changes: 6 additions & 7 deletions coriolis/osmorphing/redhat.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'
try:
self._exec_cmd_chroot(cmd)
return True
return self._exec_cmd_chroot(cmd)
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
return []

def _yum_install(self, package_names, enable_repos=[]):
try:
Expand Down Expand Up @@ -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 not any('grubby' in package for package in self.installed_packages):
self._yum_install(['grubby'])
else:
LOG.debug("Skipping package 'grubby' as it's already installed")
Expand Down
9 changes: 9 additions & 0 deletions coriolis/osmorphing/suse.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'
try:
return self._exec_cmd_chroot(cmd).splitlines()
except exception.CoriolisException:
LOG.warning("Failed to get installed packages")
LOG.trace(utils.get_exception_details())
return []

def get_update_grub2_command(self):
location = self._get_grub2_cfg_location()
return "grub2-mkconfig -o %s" % location
Expand Down

0 comments on commit b234a6f

Please sign in to comment.