]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-deploy.git/commitdiff
[RM-12259] Add classes for Yum and DNF package managers
authorTravis Rhoden <trhoden@redhat.com>
Thu, 16 Jul 2015 01:14:38 +0000 (01:14 +0000)
committerTravis Rhoden <trhoden@redhat.com>
Thu, 16 Jul 2015 01:23:19 +0000 (01:23 +0000)
Introduce Yum and DNF classes that extend a base RPMManager class
that contains all the commonalities between Yum and DNF.

Signed-off-by: Travis Rhoden <trhoden@redhat.com>
ceph_deploy/util/pkg_managers.py

index 40e3bbd8d43d9483c99a0f72cf433f1e7f5653ee..20ab161f0ae059c42de0f89295cc0acd84f2f5ce 100644 (file)
@@ -177,3 +177,102 @@ def zypper_refresh(conn):
         conn,
         cmd
     )
+
+
+class PackageManager(object):
+    """
+    Base class for all Package Managers
+    """
+
+    def __init__(self, remote_conn):
+        self.remote_info = remote_conn
+        self.remote_conn = remote_conn.conn
+
+    def _run(self, cmd):
+        return remoto.process.run(
+            self.remote_conn,
+            cmd
+        )
+
+    def install(self, packages):
+        """Install packages on remote node"""
+        raise NotImplementedError()
+
+    def remove(self, packages):
+        """Uninstall packages on remote node"""
+        raise NotImplementedError()
+
+    def clean(self):
+        """Clean metadata/cache"""
+        raise NotImplementedError()
+
+
+class RPMManagerBase(PackageManager):
+    """
+    Base class to hold common pieces of Yum and DNF
+    """
+
+    executable = None
+
+    def install(self, packages):
+        if isinstance(packages, str):
+            packages = [packages]
+
+        cmd = [
+            self.executable,
+            '-y',
+            'install',
+        ]
+        cmd.extend(packages)
+        return self._run(cmd)
+
+    def remove(self, packages):
+        if isinstance(packages, str):
+            packages = [packages]
+
+        cmd = [
+            self.executable,
+            '-y',
+            '-q',
+            'remove',
+        ]
+        cmd.extend(packages)
+        return self._run(cmd)
+
+    def clean(self, item=None):
+        item = item or 'all'
+        cmd = [
+            self.executable,
+            'clean',
+            item,
+        ]
+
+        return self._run(cmd)
+
+
+class DNF(RPMManagerBase):
+    """
+    The DNF Package manager
+    """
+
+    executable = 'dnf'
+
+    def install_priorities_plugin(self):
+        # DNF supports priorities natively
+        pass
+
+
+class Yum(RPMManagerBase):
+    """
+    The Yum Package manager
+    """
+
+    executable = 'yum'
+
+    def install_priorities_plugin(self):
+        package_name = 'yum-plugin-priorities'
+
+        if self.remote_info.normalized_name == 'centos':
+            if self.remote_info.normalized_release.int_major != 6:
+                package_name = 'yum-priorities'
+        self.install(package_name)