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)) 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 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): def extract_component(self, name, action):
"""Return the class + component info to use for doing the action w/the component.""" """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 __meta__ = abc.ABCMeta
def __init__(self, distro): def __init__(self, distro, registry):
self.distro = distro self.distro = distro
self.registry = PackageRegistry() self.registry = registry
def install(self, pkg): def install(self, pkg):
name = pkg['name'] name = pkg['name']
@ -102,20 +102,30 @@ class PackagerFactory(object):
PACKAGER_KEY_NAME = 'packager_name' PACKAGER_KEY_NAME = 'packager_name'
def __init__(self, distro, default_packager): def __init__(self, distro, default_packager_cls):
self.default_packager = default_packager self.default_packager = None
self.default_packager_cls = default_packager_cls
self.distro = distro self.distro = distro
self.fetched_packagers = dict() 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): def get_packager_for(self, pkg_info):
if self.PACKAGER_KEY_NAME in pkg_info: packager_name = pkg_info.get(self.PACKAGER_KEY_NAME)
packager_name = pkg_info[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: if packager_name in self.fetched_packagers:
packager = self.fetched_packagers[packager_name] packager = self.fetched_packagers[packager_name]
else: else:
LOG.debug('Loading custom package manager %r for package %r', packager_name, pkg_info['name']) 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 self.fetched_packagers[packager_name] = packager
else:
packager = self.default_packager
return packager return packager

View File

@ -41,11 +41,6 @@ VERSION_TEMPL = "%s=%s"
class AptPackager(pack.Packager): 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): def _format_pkg_name(self, name, version):
if version: if version:
return VERSION_TEMPL % (name, version) return VERSION_TEMPL % (name, version)
@ -64,8 +59,7 @@ class AptPackager(pack.Packager):
pkg_full = self._format_pkg_name(name, pkg.get("version")) pkg_full = self._format_pkg_name(name, pkg.get("version"))
cmd = APT_DO_REMOVE + [pkg_full] cmd = APT_DO_REMOVE + [pkg_full]
self._execute_apt(cmd) self._execute_apt(cmd)
if self.auto_remove: self._execute_apt(APT_AUTOREMOVE)
self._execute_apt(APT_AUTOREMOVE)
return True return True
def _install(self, pkg): def _install(self, pkg):

View File

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

View File

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