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))
|
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."""
|
||||||
|
@ -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
|
||||||
|
@ -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):
|
||||||
|
@ -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)
|
||||||
|
@ -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))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user