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 fc8e18b
Show file tree
Hide file tree
Showing 7 changed files with 56 additions and 4 deletions.
17 changes: 17 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,19 @@ def _version_supported_util(cls, version, minimum, maximum=None):

return True

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

packages = [
pkg for pkg in package_names if not any(
pkg in installed_pkg for installed_pkg in 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
17 changes: 13 additions & 4 deletions coriolis/osmorphing/redhat.py
Original file line number Diff line number Diff line change
Expand Up @@ -209,16 +209,25 @@ 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 check_installed_package(self, package_name):
cmd = 'rpm -q %s' % package_name
try:
self._exec_cmd_chroot(cmd)
self._exec_cmd_chroot(cmd).splitlines()
return True
except exception.CoriolisException:
LOG.warning(f"Package ${package_name} is not installed")
LOG.trace(utils.get_exception_details())
return False

def get_installed_packages(self):
cmd = 'rpm -qa'
try:
return self._exec_cmd_chroot(cmd)
except exception.CoriolisException:
LOG.warning("Failed to get installed packages")
LOG.trace(utils.get_exception_details())
return []

def _yum_install(self, package_names, enable_repos=[]):
try:
yum_cmd = 'yum install %s -y%s' % (
Expand Down Expand Up @@ -295,7 +304,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 self.check_installed_package('grubby'):
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 fc8e18b

Please sign in to comment.