Cleanups around packager construction and use a shared registry for the same types
This commit is contained in:
parent
13de143839
commit
88fea5263c
@ -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."""
|
||||
|
@ -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
|
||||
|
@ -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):
|
||||
|
@ -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)
|
||||
|
@ -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))
|
||||
|
Loading…
x
Reference in New Issue
Block a user