Use the pip code to get an initial pip installed list and same with rpms via yum code
This commit is contained in:
@@ -43,11 +43,12 @@ from anvil import exceptions as excp
|
|||||||
from anvil import importer
|
from anvil import importer
|
||||||
from anvil import log as logging
|
from anvil import log as logging
|
||||||
from anvil import packager
|
from anvil import packager
|
||||||
from anvil import pip
|
|
||||||
from anvil import shell as sh
|
from anvil import shell as sh
|
||||||
from anvil import trace as tr
|
from anvil import trace as tr
|
||||||
from anvil import utils
|
from anvil import utils
|
||||||
|
|
||||||
|
from anvil.packaging import pip
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
####
|
####
|
||||||
@@ -63,6 +64,14 @@ class ProgramStatus(object):
|
|||||||
self.status = status
|
self.status = status
|
||||||
self.details = details
|
self.details = details
|
||||||
|
|
||||||
|
####
|
||||||
|
#### Utils...
|
||||||
|
####
|
||||||
|
|
||||||
|
def make_packager(package, distro, default_class):
|
||||||
|
cls = packager.get_packager_class(package, default_class)
|
||||||
|
return cls(distro)
|
||||||
|
|
||||||
|
|
||||||
####
|
####
|
||||||
#### INSTALL CLASSES
|
#### INSTALL CLASSES
|
||||||
@@ -72,7 +81,6 @@ class PkgInstallComponent(component.Component):
|
|||||||
def __init__(self, *args, **kargs):
|
def __init__(self, *args, **kargs):
|
||||||
component.Component.__init__(self, *args, **kargs)
|
component.Component.__init__(self, *args, **kargs)
|
||||||
self.tracewriter = tr.TraceWriter(self.trace_files['install'], break_if_there=False)
|
self.tracewriter = tr.TraceWriter(self.trace_files['install'], break_if_there=False)
|
||||||
self.package_registries = kargs.get('package_registries', {})
|
|
||||||
|
|
||||||
def _get_download_config(self):
|
def _get_download_config(self):
|
||||||
return None
|
return None
|
||||||
@@ -127,12 +135,6 @@ class PkgInstallComponent(component.Component):
|
|||||||
pkg_list = self._clear_package_duplicates(pkg_list)
|
pkg_list = self._clear_package_duplicates(pkg_list)
|
||||||
return pkg_list
|
return pkg_list
|
||||||
|
|
||||||
def _make_packager(self, name, pkg_info, default_cls):
|
|
||||||
if name not in self.package_registries:
|
|
||||||
self.package_registries[name] = packager.Registry()
|
|
||||||
cls = packager.get_packager_class(pkg_info, default_cls)
|
|
||||||
return cls(self.distro, self.package_registries[name])
|
|
||||||
|
|
||||||
def install(self):
|
def install(self):
|
||||||
LOG.debug('Preparing to install packages for: %r', self.name)
|
LOG.debug('Preparing to install packages for: %r', self.name)
|
||||||
pkgs = self.packages
|
pkgs = self.packages
|
||||||
@@ -142,7 +144,7 @@ class PkgInstallComponent(component.Component):
|
|||||||
header="Setting up %s distribution packages" % (len(pkg_names)))
|
header="Setting up %s distribution packages" % (len(pkg_names)))
|
||||||
with utils.progress_bar('Installing', len(pkgs)) as p_bar:
|
with utils.progress_bar('Installing', len(pkgs)) as p_bar:
|
||||||
for (i, p) in enumerate(pkgs):
|
for (i, p) in enumerate(pkgs):
|
||||||
installer = self._make_packager('distro', p, self.distro.package_manager_class)
|
installer = make_packager(p, self.distro, self.distro.package_manager_class)
|
||||||
self.tracewriter.package_installed(p)
|
self.tracewriter.package_installed(p)
|
||||||
installer.install(p)
|
installer.install(p)
|
||||||
p_bar.update(i + 1)
|
p_bar.update(i + 1)
|
||||||
@@ -150,13 +152,13 @@ class PkgInstallComponent(component.Component):
|
|||||||
def pre_install(self):
|
def pre_install(self):
|
||||||
pkgs = self.packages
|
pkgs = self.packages
|
||||||
for p in pkgs:
|
for p in pkgs:
|
||||||
installer = self._make_packager('distro', p, self.distro.package_manager_class)
|
installer = make_packager(p, self.distro, self.distro.package_manager_class)
|
||||||
installer.pre_install(p, self.params)
|
installer.pre_install(p, self.params)
|
||||||
|
|
||||||
def post_install(self):
|
def post_install(self):
|
||||||
pkgs = self.packages
|
pkgs = self.packages
|
||||||
for p in pkgs:
|
for p in pkgs:
|
||||||
installer = self._make_packager('distro', p, self.distro.package_manager_class)
|
installer = make_packager(p, self.distro, self.distro.package_manager_class)
|
||||||
installer.post_install(p, self.params)
|
installer.post_install(p, self.params)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@@ -378,7 +380,7 @@ class PythonInstallComponent(PkgInstallComponent):
|
|||||||
with utils.progress_bar('Installing', len(pips)) as p_bar:
|
with utils.progress_bar('Installing', len(pips)) as p_bar:
|
||||||
for (i, p) in enumerate(pips):
|
for (i, p) in enumerate(pips):
|
||||||
self.tracewriter.pip_installed(p)
|
self.tracewriter.pip_installed(p)
|
||||||
installer = self._make_packager('pip', p, pip.Packager)
|
installer = make_packager(p, self.distro, pip.Packager)
|
||||||
installer.install(p)
|
installer.install(p)
|
||||||
p_bar.update(i + 1)
|
p_bar.update(i + 1)
|
||||||
|
|
||||||
@@ -416,13 +418,13 @@ class PythonInstallComponent(PkgInstallComponent):
|
|||||||
self._verify_pip_requires()
|
self._verify_pip_requires()
|
||||||
PkgInstallComponent.pre_install(self)
|
PkgInstallComponent.pre_install(self)
|
||||||
for p in self.pips:
|
for p in self.pips:
|
||||||
installer = self._make_packager('pip', p, pip.Packager)
|
installer = make_packager(p, self.distro, pip.Packager)
|
||||||
installer.pre_install(p, self.params)
|
installer.pre_install(p, self.params)
|
||||||
|
|
||||||
def post_install(self):
|
def post_install(self):
|
||||||
PkgInstallComponent.post_install(self)
|
PkgInstallComponent.post_install(self)
|
||||||
for p in self.pips:
|
for p in self.pips:
|
||||||
installer = self._make_packager('pip', p, pip.Packager)
|
installer = make_packager(p, self.distro, pip.Packager)
|
||||||
installer.post_install(p, self.params)
|
installer.post_install(p, self.params)
|
||||||
|
|
||||||
def _install_python_setups(self):
|
def _install_python_setups(self):
|
||||||
@@ -630,13 +632,6 @@ class PkgUninstallComponent(component.Component):
|
|||||||
def __init__(self, *args, **kargs):
|
def __init__(self, *args, **kargs):
|
||||||
component.Component.__init__(self, *args, **kargs)
|
component.Component.__init__(self, *args, **kargs)
|
||||||
self.tracereader = tr.TraceReader(self.trace_files['install'])
|
self.tracereader = tr.TraceReader(self.trace_files['install'])
|
||||||
self.package_registries = kargs.get('package_registries', {})
|
|
||||||
|
|
||||||
def _make_packager(self, name, pkg_info, default_cls):
|
|
||||||
if name not in self.package_registries:
|
|
||||||
self.package_registries[name] = packager.Registry()
|
|
||||||
cls = packager.get_packager_class(pkg_info, default_cls)
|
|
||||||
return cls(self.distro, self.package_registries[name])
|
|
||||||
|
|
||||||
def unconfigure(self):
|
def unconfigure(self):
|
||||||
self._unconfigure_files()
|
self._unconfigure_files()
|
||||||
@@ -680,7 +675,7 @@ class PkgUninstallComponent(component.Component):
|
|||||||
which_removed = set()
|
which_removed = set()
|
||||||
with utils.progress_bar('Uninstalling', len(pkgs), reverse=True) as p_bar:
|
with utils.progress_bar('Uninstalling', len(pkgs), reverse=True) as p_bar:
|
||||||
for (i, p) in enumerate(pkgs):
|
for (i, p) in enumerate(pkgs):
|
||||||
uninstaller = self._make_packager('distro', p, self.distro.package_manager_class)
|
uninstaller = make_packager(p, self.distro, self.distro.package_manager_class)
|
||||||
if uninstaller.remove(p):
|
if uninstaller.remove(p):
|
||||||
which_removed.add(p['name'])
|
which_removed.add(p['name'])
|
||||||
p_bar.update(i + 1)
|
p_bar.update(i + 1)
|
||||||
@@ -731,7 +726,7 @@ class PythonUninstallComponent(PkgUninstallComponent):
|
|||||||
with utils.progress_bar('Uninstalling', len(pips), reverse=True) as p_bar:
|
with utils.progress_bar('Uninstalling', len(pips), reverse=True) as p_bar:
|
||||||
for (i, p) in enumerate(pips):
|
for (i, p) in enumerate(pips):
|
||||||
try:
|
try:
|
||||||
uninstaller = self._make_packager('pip', p, pip.Packager)
|
uninstaller = make_packager(p, self.distro, pip.Packager)
|
||||||
uninstaller.remove(p)
|
uninstaller.remove(p)
|
||||||
except excp.ProcessExecutionError as e:
|
except excp.ProcessExecutionError as e:
|
||||||
# NOTE(harlowja): pip seems to die if a pkg isn't there even in quiet mode
|
# NOTE(harlowja): pip seems to die if a pkg isn't there even in quiet mode
|
||||||
|
|||||||
@@ -212,7 +212,9 @@ class KeystoneRuntime(comp.PythonRuntime):
|
|||||||
**self.get_option('glance'))
|
**self.get_option('glance'))
|
||||||
params['nova'] = nhelper.get_shared_params(ip=self.get_option('ip'),
|
params['nova'] = nhelper.get_shared_params(ip=self.get_option('ip'),
|
||||||
**self.get_option('nova'))
|
**self.get_option('nova'))
|
||||||
init_what = utils.load_yaml_text(utils.expand_template(sh.load_file(fn), params))
|
init_what = utils.load_yaml(sh.load_file(fn))
|
||||||
|
|
||||||
|
init_what = utils.expand_template_deep(init_what, params)
|
||||||
khelper.Initializer(params['keystone']['service_token'],
|
khelper.Initializer(params['keystone']['service_token'],
|
||||||
params['keystone']['endpoints']['admin']['uri']).initialize(**init_what)
|
params['keystone']['endpoints']['admin']['uri']).initialize(**init_what)
|
||||||
# Writing this makes sure that we don't init again
|
# Writing this makes sure that we don't init again
|
||||||
|
|||||||
@@ -191,9 +191,8 @@ class YumPackagerWithRelinks(yum.YumPackager):
|
|||||||
if not tgt or not src:
|
if not tgt or not src:
|
||||||
continue
|
continue
|
||||||
src = glob.glob(src)
|
src = glob.glob(src)
|
||||||
tgt = glob.glob(tgt)
|
if not isinstance(tgt, (list, tuple)):
|
||||||
if not tgt:
|
tgt = [tgt]
|
||||||
tgt = [entry.get('target')]
|
|
||||||
if len(src) != len(tgt):
|
if len(src) != len(tgt):
|
||||||
raise RuntimeError("Unable to link %s sources to %s locations" % (len(src), len(tgt)))
|
raise RuntimeError("Unable to link %s sources to %s locations" % (len(src), len(tgt)))
|
||||||
for i in range(len(src)):
|
for i in range(len(src)):
|
||||||
|
|||||||
@@ -15,7 +15,6 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import abc
|
import abc
|
||||||
import pkg_resources
|
|
||||||
|
|
||||||
from anvil import exceptions as excp
|
from anvil import exceptions as excp
|
||||||
from anvil import colorizer
|
from anvil import colorizer
|
||||||
@@ -29,7 +28,6 @@ VERSION_CHARS = ['=', '>', "<"]
|
|||||||
|
|
||||||
|
|
||||||
class NullVersion(object):
|
class NullVersion(object):
|
||||||
|
|
||||||
def __init__(self, name):
|
def __init__(self, name):
|
||||||
self.name = name
|
self.name = name
|
||||||
|
|
||||||
@@ -37,36 +35,26 @@ class NullVersion(object):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "%s (no version)" % (self.name)
|
return "%s (unknown version)" % (self.name)
|
||||||
|
|
||||||
|
|
||||||
class Registry(object):
|
class Registry(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.installed = {}
|
self.installed = {}
|
||||||
self.removed = {}
|
self.removed = {}
|
||||||
|
|
||||||
|
|
||||||
class Packager(object):
|
class Packager(object):
|
||||||
|
|
||||||
__meta__ = abc.ABCMeta
|
__meta__ = abc.ABCMeta
|
||||||
|
|
||||||
def __init__(self, distro, registry):
|
def __init__(self, distro, registry=None):
|
||||||
self.distro = distro
|
self.distro = distro
|
||||||
|
if not registry:
|
||||||
|
registry = Registry()
|
||||||
self.registry = registry
|
self.registry = registry
|
||||||
|
|
||||||
def _parse_version(self, name, version):
|
def _parse_version(self, name, version):
|
||||||
if version:
|
return NullVersion(name)
|
||||||
# This won't work for all package versions (ie crazy names)
|
|
||||||
# but good enough for now...
|
|
||||||
if contains_version_check(version):
|
|
||||||
full_name = "%s%s" % (name, version)
|
|
||||||
else:
|
|
||||||
full_name = "%s==%s" % (name, version)
|
|
||||||
p_version = pkg_resources.Requirement.parse(full_name)
|
|
||||||
else:
|
|
||||||
p_version = NullVersion(name)
|
|
||||||
return p_version
|
|
||||||
|
|
||||||
def _compare_against_installed(self, incoming_version, installed_version):
|
def _compare_against_installed(self, incoming_version, installed_version):
|
||||||
if not incoming_version and installed_version:
|
if not incoming_version and installed_version:
|
||||||
@@ -76,11 +64,6 @@ class Packager(object):
|
|||||||
# Assume whats installed will work
|
# Assume whats installed will work
|
||||||
# (not really the case all the time)
|
# (not really the case all the time)
|
||||||
return True
|
return True
|
||||||
if contains_version_check(incoming_version):
|
|
||||||
cleaned_version = incoming_version
|
|
||||||
for c in VERSION_CHARS:
|
|
||||||
cleaned_version = cleaned_version.replace(c, '')
|
|
||||||
return self._compare_against_installed(cleaned_version.strip(), installed_version)
|
|
||||||
if not incoming_version in installed_version:
|
if not incoming_version in installed_version:
|
||||||
# Not in the range of the installed version (bad!)
|
# Not in the range of the installed version (bad!)
|
||||||
return False
|
return False
|
||||||
@@ -150,5 +133,4 @@ def get_packager_class(package_info, default_packager_class=None):
|
|||||||
packager_name = packager_name.strip()
|
packager_name = packager_name.strip()
|
||||||
if not packager_name:
|
if not packager_name:
|
||||||
return default_packager_class
|
return default_packager_class
|
||||||
packager_class = importer.import_entry_point(packager_name)
|
return importer.import_entry_point(packager_name)
|
||||||
return packager_class
|
|
||||||
|
|||||||
15
anvil/packaging/helpers/__init__.py
Normal file
15
anvil/packaging/helpers/__init__.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# Copyright (C) 2012 Yahoo! Inc. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
41
anvil/packaging/helpers/pip_helper.py
Normal file
41
anvil/packaging/helpers/pip_helper.py
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# Copyright (C) 2012 Yahoo! Inc. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
|
||||||
|
from anvil import log as logging
|
||||||
|
from anvil import packager as pack
|
||||||
|
from anvil import utils
|
||||||
|
|
||||||
|
import pip
|
||||||
|
from pip.util import get_installed_distributions
|
||||||
|
|
||||||
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def make_registry():
|
||||||
|
installations = {}
|
||||||
|
for dist in get_installed_distributions(local_only=True):
|
||||||
|
freq = pip.FrozenRequirement.from_dist(dist, [])
|
||||||
|
if freq.req and freq.name:
|
||||||
|
name = freq.name.lower()
|
||||||
|
installations[name] = freq.req
|
||||||
|
# TODO(harlowja) use the pip version/requirement to enhance this...
|
||||||
|
reg = pack.Registry()
|
||||||
|
for (name, _req) in installations.items():
|
||||||
|
reg.installed[name] = pack.NullVersion(name)
|
||||||
|
LOG.debug("Identified %s packages already installed by pip", len(reg.installed))
|
||||||
|
utils.log_object(reg.installed, logger=LOG, level=logging.DEBUG)
|
||||||
|
return reg
|
||||||
35
anvil/packaging/helpers/yum_helper.py
Normal file
35
anvil/packaging/helpers/yum_helper.py
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# Copyright (C) 2012 Yahoo! Inc. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from anvil import log as logging
|
||||||
|
from anvil import packager as pack
|
||||||
|
from anvil import utils
|
||||||
|
|
||||||
|
from yum import YumBase
|
||||||
|
|
||||||
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def make_registry():
|
||||||
|
reg = pack.Registry()
|
||||||
|
yb = YumBase()
|
||||||
|
yb.conf.cache = False
|
||||||
|
for p in yb.rpmdb.returnPackages():
|
||||||
|
# TODO(harlowja) use the rpm version comparision to enhance this...
|
||||||
|
reg.installed[p.name] = pack.NullVersion(p.name)
|
||||||
|
LOG.debug("Identified %s packages already installed by yum", len(reg.installed))
|
||||||
|
utils.log_object(reg.installed, logger=LOG, level=logging.DEBUG)
|
||||||
|
return reg
|
||||||
@@ -19,6 +19,8 @@ from anvil import log as logging
|
|||||||
from anvil import shell as sh
|
from anvil import shell as sh
|
||||||
from anvil import packager as pack
|
from anvil import packager as pack
|
||||||
|
|
||||||
|
from anvil.packaging.helpers import pip_helper
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
PIP_UNINSTALL_CMD_OPTS = ['-y', '-q']
|
PIP_UNINSTALL_CMD_OPTS = ['-y', '-q']
|
||||||
@@ -26,6 +28,10 @@ PIP_INSTALL_CMD_OPTS = ['-q']
|
|||||||
|
|
||||||
|
|
||||||
class Packager(pack.Packager):
|
class Packager(pack.Packager):
|
||||||
|
PIP_REGISTRY = pip_helper.make_registry()
|
||||||
|
|
||||||
|
def __init__(self, distro):
|
||||||
|
pack.Packager.__init__(self, distro, Packager.PIP_REGISTRY)
|
||||||
|
|
||||||
def _make_pip_name(self, name, version):
|
def _make_pip_name(self, name, version):
|
||||||
if version is None:
|
if version is None:
|
||||||
@@ -35,6 +41,18 @@ class Packager(pack.Packager):
|
|||||||
else:
|
else:
|
||||||
return "%s==%s" % (name, version)
|
return "%s==%s" % (name, version)
|
||||||
|
|
||||||
|
def _parse_version(self, name, version):
|
||||||
|
if version:
|
||||||
|
# This should work for all pip packages
|
||||||
|
if contains_version_check(version):
|
||||||
|
full_name = "%s%s" % (name, version)
|
||||||
|
else:
|
||||||
|
full_name = "%s==%s" % (name, version)
|
||||||
|
p_version = pkg_resources.Requirement.parse(full_name)
|
||||||
|
else:
|
||||||
|
p_version = pack.Packager._parse_version(self, name, version)
|
||||||
|
return p_version
|
||||||
|
|
||||||
def _get_pip_command(self):
|
def _get_pip_command(self):
|
||||||
return self.distro.get_command_config('pip')
|
return self.distro.get_command_config('pip')
|
||||||
|
|
||||||
@@ -18,6 +18,8 @@ from anvil import log as logging
|
|||||||
from anvil import packager as pack
|
from anvil import packager as pack
|
||||||
from anvil import shell as sh
|
from anvil import shell as sh
|
||||||
|
|
||||||
|
from anvil.packaging.helpers import yum_helper
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
# Root yum command
|
# Root yum command
|
||||||
@@ -34,6 +36,10 @@ VERSION_TEMPL = "%s-%s"
|
|||||||
|
|
||||||
|
|
||||||
class YumPackager(pack.Packager):
|
class YumPackager(pack.Packager):
|
||||||
|
YUM_REGISTRY = yum_helper.make_registry()
|
||||||
|
|
||||||
|
def __init__(self, distro):
|
||||||
|
pack.Packager.__init__(self, distro, YumPackager.YUM_REGISTRY)
|
||||||
|
|
||||||
def _format_pkg_name(self, name, version):
|
def _format_pkg_name(self, name, version):
|
||||||
if version:
|
if version:
|
||||||
@@ -43,9 +49,7 @@ class YumPackager(pack.Packager):
|
|||||||
|
|
||||||
def _execute_yum(self, cmd, **kargs):
|
def _execute_yum(self, cmd, **kargs):
|
||||||
full_cmd = YUM_CMD + cmd
|
full_cmd = YUM_CMD + cmd
|
||||||
return sh.execute(*full_cmd, run_as_root=True,
|
return sh.execute(*full_cmd, run_as_root=True, check_exit_code=True, **kargs)
|
||||||
check_exit_code=True,
|
|
||||||
**kargs)
|
|
||||||
|
|
||||||
def _remove_special(self, name, info):
|
def _remove_special(self, name, info):
|
||||||
return False
|
return False
|
||||||
|
|||||||
@@ -74,6 +74,27 @@ def expand_template(contents, params):
|
|||||||
return Template(str(contents), searchList=[params]).respond()
|
return Template(str(contents), searchList=[params]).respond()
|
||||||
|
|
||||||
|
|
||||||
|
def expand_template_deep(root, params):
|
||||||
|
if isinstance(root, (basestring, str)):
|
||||||
|
return expand_template(root, params)
|
||||||
|
if isinstance(root, (list, tuple)):
|
||||||
|
n_list = []
|
||||||
|
for i in root:
|
||||||
|
n_list.append(expand_template_deep(i, params))
|
||||||
|
return n_list
|
||||||
|
if isinstance(root, (dict)):
|
||||||
|
n_dict = {}
|
||||||
|
for (k, v) in root.items():
|
||||||
|
n_dict[k] = expand_template_deep(v, params)
|
||||||
|
return n_dict
|
||||||
|
if isinstance(root, (set)):
|
||||||
|
n_set = set()
|
||||||
|
for v in root:
|
||||||
|
n_set.add(expand_template_deep(v, params))
|
||||||
|
return n_set
|
||||||
|
return root
|
||||||
|
|
||||||
|
|
||||||
def load_yaml(fn):
|
def load_yaml(fn):
|
||||||
return load_yaml_text(sh.load_file(fn))
|
return load_yaml_text(sh.load_file(fn))
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
##
|
##
|
||||||
## This is a cheetah/yaml template!
|
## This is a yaml template (with cheetah template
|
||||||
|
## strings that will be filled in)...
|
||||||
##
|
##
|
||||||
---
|
---
|
||||||
endpoints:
|
endpoints:
|
||||||
|
|||||||
Reference in New Issue
Block a user