Cleanups around packager construction and use a shared registry for the same types

This commit is contained in:
Joshua Harlow 2012-04-20 13:36:22 -07:00
parent 13de143839
commit 88fea5263c
5 changed files with 24 additions and 23 deletions

View File

@ -126,9 +126,9 @@ class Distro(object):
"""
return bool(self._distro_pattern.search(distro_name))
def get_default_package_manager(self):
def get_default_package_manager_cls(self):
"""Return a package manager that will work for this distro."""
return importer.import_entry_point(self._packager_name)(self)
return importer.import_entry_point(self._packager_name)
def extract_component(self, name, action):
"""Return the class + component info to use for doing the action w/the component."""

View File

@ -34,9 +34,9 @@ class Packager(object):
__meta__ = abc.ABCMeta
def __init__(self, distro):
def __init__(self, distro, registry):
self.distro = distro
self.registry = PackageRegistry()
self.registry = registry
def install(self, pkg):
name = pkg['name']
@ -102,20 +102,30 @@ class PackagerFactory(object):
PACKAGER_KEY_NAME = 'packager_name'
def __init__(self, distro, default_packager):
self.default_packager = default_packager
def __init__(self, distro, default_packager_cls):
self.default_packager = None
self.default_packager_cls = default_packager_cls
self.distro = distro
self.fetched_packagers = dict()
self.registry = PackageRegistry()
def _construct_pkger(self, cls):
return cls(self.distro, self.registry)
def _get_default_pkgr(self):
if not self.default_packager:
self.default_packager = self._construct_pkger(self.default_packager_cls)
return self.default_packager
def get_packager_for(self, pkg_info):
if self.PACKAGER_KEY_NAME in pkg_info:
packager_name = pkg_info[self.PACKAGER_KEY_NAME]
packager_name = pkg_info.get(self.PACKAGER_KEY_NAME)
if not packager_name or not packager_name.strip():
packager = self._get_default_pkgr()
else:
if packager_name in self.fetched_packagers:
packager = self.fetched_packagers[packager_name]
else:
LOG.debug('Loading custom package manager %r for package %r', packager_name, pkg_info['name'])
packager = importer.import_entry_point(packager_name)(self.distro)
packager = self._construct_pkger(importer.import_entry_point(packager_name))
self.fetched_packagers[packager_name] = packager
else:
packager = self.default_packager
return packager

View File

@ -41,11 +41,6 @@ VERSION_TEMPL = "%s=%s"
class AptPackager(pack.Packager):
def __init__(self, distro):
pack.Packager.__init__(self, distro)
# FIXME: Should this be coming from a setting somewhere?
self.auto_remove = True
def _format_pkg_name(self, name, version):
if version:
return VERSION_TEMPL % (name, version)
@ -64,8 +59,7 @@ class AptPackager(pack.Packager):
pkg_full = self._format_pkg_name(name, pkg.get("version"))
cmd = APT_DO_REMOVE + [pkg_full]
self._execute_apt(cmd)
if self.auto_remove:
self._execute_apt(APT_AUTOREMOVE)
self._execute_apt(APT_AUTOREMOVE)
return True
def _install(self, pkg):

View File

@ -33,9 +33,6 @@ VERSION_TEMPL = "%s-%s"
class YumPackager(pack.Packager):
def __init__(self, distro):
pack.Packager.__init__(self, distro)
def _format_pkg_name(self, name, version):
if version:
return VERSION_TEMPL % (name, version)

View File

@ -77,8 +77,8 @@ class ActionRunner(object):
desired_subsystems = persona.wanted_subsystems or {}
component_opts = persona.component_options or {}
instances = {}
pip_factory = packager.PackagerFactory(self.distro, pip.Packager(self.distro))
pkg_factory = packager.PackagerFactory(self.distro, self.distro.get_default_package_manager())
pip_factory = packager.PackagerFactory(self.distro, pip.Packager)
pkg_factory = packager.PackagerFactory(self.distro, self.distro.get_default_package_manager_cls())
for c in components:
(cls, my_info) = self.distro.extract_component(c, self.NAME)
LOG.debug("Constructing class %s" % (cls))