Add a component that tracks global requirements

There is a separate repository that stores the whole set of
package requrements of various OpenStack components. So it
makes sense to add such component-helper to anvil.

Change-Id: Id32af1262c881c1bf5e0cbe4f13ce543b95747c9
This commit is contained in:
Alexander Gorodnev 2014-01-30 15:53:22 +04:00
parent 83a9d4eb38
commit c031bb0cfa
9 changed files with 125 additions and 61 deletions

View File

@ -16,10 +16,14 @@
from anvil import exceptions as excp from anvil import exceptions as excp
from anvil import log as logging from anvil import log as logging
from anvil import patcher
from anvil import settings
from anvil import shell as sh from anvil import shell as sh
from anvil import trace as tr
from anvil import type_utils as tu from anvil import type_utils as tu
from anvil import utils from anvil import utils
from anvil.components.configurators import base as conf
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@ -124,3 +128,35 @@ class Component(object):
except KeyError: except KeyError:
names.add("openstack-%s-%s" % (self.name, key)) names.add("openstack-%s-%s" % (self.name, key))
return names return names
class BasicComponent(Component):
def __init__(self, *args, **kargs):
super(BasicComponent, self).__init__(*args, **kargs)
trace_fn = tr.trace_filename(self.get_option('trace_dir'), 'created')
self.tracewriter = tr.TraceWriter(trace_fn, break_if_there=False)
self.configurator = conf.Configurator(self)
def download(self):
return []
def list_patches(self, section):
what_patches = self.get_option('patches', section)
if not what_patches:
what_patches = [sh.joinpths(settings.CONFIG_DIR, 'patches',
self.name, section)]
canon_what_patches = []
for path in what_patches:
if sh.isdir(path):
patches = sorted(fn for fn in sh.listdir(path, files_only=True)
if fn.endswith('patch'))
canon_what_patches.extend(patches)
elif sh.isfile(path):
canon_what_patches.append(path)
return canon_what_patches
def patch(self, section):
canon_what_patches = self.list_patches(section)
if canon_what_patches:
target_dir = self.get_option('app_dir')
patcher.apply_patches(canon_what_patches, target_dir)

View File

@ -15,70 +15,16 @@
from anvil.components import base from anvil.components import base
from anvil import downloader as down from anvil import downloader as down
from anvil import log as logging from anvil import log as logging
from anvil import patcher
from anvil import settings
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.helpers import pip_helper from anvil.packaging.helpers import pip_helper
from anvil.components.configurators import base as conf
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
class PkgInstallComponent(base.Component): class InstallableMixin(base.Component):
def __init__(self, *args, **kargs):
super(PkgInstallComponent, self).__init__(*args, **kargs)
trace_fn = tr.trace_filename(self.get_option('trace_dir'), 'created')
self.tracewriter = tr.TraceWriter(trace_fn, break_if_there=False)
self.configurator = conf.Configurator(self)
def download(self):
return []
def list_patches(self, section):
what_patches = self.get_option('patches', section)
if not what_patches:
what_patches = [sh.joinpths(settings.CONFIG_DIR, 'patches',
self.name, section)]
canon_what_patches = []
for path in what_patches:
if sh.isdir(path):
patches = sorted(fn for fn in sh.listdir(path, files_only=True)
if fn.endswith('patch'))
canon_what_patches.extend(patches)
elif sh.isfile(path):
canon_what_patches.append(path)
return canon_what_patches
def patch(self, section):
canon_what_patches = self.list_patches(section)
if canon_what_patches:
target_dir = self.get_option('app_dir')
patcher.apply_patches(canon_what_patches, target_dir)
def config_params(self, config_fn):
mp = dict(self.params)
if config_fn:
mp['CONFIG_FN'] = config_fn
return mp
@property
def packages(self):
return self.extended_packages()
def extended_packages(self):
pkg_list = self.get_option('packages', default_value=[])
if not pkg_list:
pkg_list = []
for name, values in self.subsystems.items():
if 'packages' in values:
LOG.debug("Extending package list with packages for subsystem: %r", name)
pkg_list.extend(values.get('packages'))
return pkg_list
def pre_install(self): def pre_install(self):
pkgs = self.packages pkgs = self.packages
for p in pkgs: for p in pkgs:
@ -124,10 +70,24 @@ class PkgInstallComponent(base.Component):
self.cfg_dir, uid, gid, e) self.cfg_dir, uid, gid, e)
return files return files
@property
def packages(self):
return self.extended_packages()
class PythonInstallComponent(PkgInstallComponent): def extended_packages(self):
pkg_list = self.get_option('packages', default_value=[])
if not pkg_list:
pkg_list = []
for name, values in self.subsystems.items():
if 'packages' in values:
LOG.debug("Extending package list with packages for subsystem: %r", name)
pkg_list.extend(values.get('packages'))
return pkg_list
class PythonComponent(base.BasicComponent):
def __init__(self, *args, **kargs): def __init__(self, *args, **kargs):
PkgInstallComponent.__init__(self, *args, **kargs) super(PythonComponent, self).__init__(*args, **kargs)
app_dir = self.get_option('app_dir') app_dir = self.get_option('app_dir')
tools_dir = sh.joinpths(app_dir, 'tools') tools_dir = sh.joinpths(app_dir, 'tools')
self.requires_files = [ self.requires_files = [
@ -140,6 +100,12 @@ class PythonInstallComponent(PkgInstallComponent):
] ]
self._origins_fn = kargs['origins_fn'] self._origins_fn = kargs['origins_fn']
def config_params(self, config_fn):
mp = dict(self.params)
if config_fn:
mp['CONFIG_FN'] = config_fn
return mp
def download(self): def download(self):
"""Download sources needed to build the component, if any.""" """Download sources needed to build the component, if any."""
target_dir = self.get_option('app_dir') target_dir = self.get_option('app_dir')
@ -171,6 +137,14 @@ class PythonInstallComponent(PkgInstallComponent):
return egg_info return egg_info
class PkgInstallComponent(base.BasicComponent, InstallableMixin):
pass
class PythonInstallComponent(PythonComponent, InstallableMixin):
pass
class PkgUninstallComponent(base.Component): class PkgUninstallComponent(base.Component):
def __init__(self, *args, **kargs): def __init__(self, *args, **kargs):
super(PkgUninstallComponent, self).__init__(*args, **kargs) super(PkgUninstallComponent, self).__init__(*args, **kargs)

View File

@ -0,0 +1,28 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# Copyright (C) 2014 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 shell as sh
from anvil.components import base_install as base
class GlobalRequirements(base.PythonComponent):
def __init__(self, *args, **kargs):
super(GlobalRequirements, self).__init__(*args, **kargs)
app_dir = self.get_option('app_dir')
self.requires_files = [
sh.joinpths(app_dir, 'global-requirements.txt'),
]

View File

@ -46,6 +46,7 @@ class Helper(object):
"--rpm-base", "--rpm-base",
self._rpmbuild_dir self._rpmbuild_dir
] ]
if self._epoch_map:
cmdline += [ cmdline += [
"--epoch-map" "--epoch-map"
] + ["%s==%s" % (key, value) ] + ["%s==%s" % (key, value)

View File

@ -0,0 +1,4 @@
# Settings for component global_requirements
---
...

View File

@ -23,6 +23,7 @@ dependency_handler:
sqlalchemy-migrate: python-migrate sqlalchemy-migrate: python-migrate
qpid-python: python-qpid # Why is this one backwards :-/ qpid-python: python-qpid # Why is this one backwards :-/
PyYAML: PyYAML PyYAML: PyYAML
pyzmq: python-zmq
arch_dependent: arch_dependent:
- selenium - selenium
- xattr - xattr
@ -407,6 +408,13 @@ components:
api-cfn: openstack-heat-api-cfn api-cfn: openstack-heat-api-cfn
api-cloudwatch: openstack-heat-api-cloudwatch api-cloudwatch: openstack-heat-api-cloudwatch
engine: openstack-heat-engine engine: openstack-heat-engine
global-requirements:
action_classes:
install: anvil.components.global_requirements:GlobalRequirements
running: anvil.components.base_runtime:EmptyRuntime
test: anvil.components.base_testing:PythonTestingComponent
coverage: anvil.components.base_testing:PythonTestingComponent
uninstall: anvil.components.base_install:PkgUninstallComponent
ceilometer: ceilometer:
pip: pip:
- name: wsme - name: wsme

View File

@ -19,6 +19,9 @@ glance-client:
glance: glance:
repo: git://github.com/openstack/glance.git repo: git://github.com/openstack/glance.git
branch: stable/havana branch: stable/havana
global-requirements:
repo: git://github.com/openstack/requirements.git
branch: stable/havana
heat-client: heat-client:
repo: git://github.com/openstack/python-heatclient.git repo: git://github.com/openstack/python-heatclient.git
tag: 0.2.5 tag: 0.2.5

View File

@ -19,6 +19,9 @@ glance-client:
glance: glance:
repo: git://github.com/openstack/glance.git repo: git://github.com/openstack/glance.git
branch: master branch: master
global-requirements:
repo: git://github.com/openstack/requirements.git
branch: master
heat-client: heat-client:
repo: git://github.com/openstack/python-heatclient.git repo: git://github.com/openstack/python-heatclient.git
branch: master branch: master

View File

@ -0,0 +1,7 @@
---
components:
- general
- global-requirements
supports:
- rhel
...