From 6a427372de85f58e82860e8c93820ff949e51e20 Mon Sep 17 00:00:00 2001 From: Corey Bryant Date: Sat, 21 Mar 2015 02:18:45 +0000 Subject: [PATCH] Overall refresh to current install from source approach --- Makefile | 6 +- README.md | 172 +++++++++++------------ actions.yaml | 2 + actions/git-reinstall | 1 + actions/git_reinstall.py | 40 ++++++ charm-helpers-tests.yaml | 3 +- config.yaml | 15 +- hooks/cinder_hooks.py | 9 +- hooks/cinder_utils.py | 50 +++++-- templates/upstart/cinder.upstart | 20 --- tests/11-basic-precise-folsom | 11 -- tests/12-basic-precise-grizzly | 11 -- tests/13-basic-precise-havana | 11 -- tests/16-basic-trusty-icehouse-git | 9 ++ tests/17-basic-trusty-juno | 11 ++ tests/18-basic-trusty-juno-git | 12 ++ tests/basic_deployment.py | 29 ++-- unit_tests/__init__.py | 2 + unit_tests/test_actions_git_reinstall.py | 85 +++++++++++ 19 files changed, 316 insertions(+), 183 deletions(-) create mode 100644 actions.yaml create mode 120000 actions/git-reinstall create mode 100755 actions/git_reinstall.py delete mode 100644 templates/upstart/cinder.upstart delete mode 100755 tests/11-basic-precise-folsom delete mode 100755 tests/12-basic-precise-grizzly delete mode 100755 tests/13-basic-precise-havana create mode 100755 tests/16-basic-trusty-icehouse-git create mode 100755 tests/17-basic-trusty-juno create mode 100755 tests/18-basic-trusty-juno-git create mode 100644 unit_tests/test_actions_git_reinstall.py diff --git a/Makefile b/Makefile index 11a2609f..d027c270 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ PYTHON := /usr/bin/env python lint: - @flake8 --exclude hooks/charmhelpers hooks unit_tests tests + @flake8 --exclude hooks/charmhelpers actions hooks unit_tests tests @charm proof unit_test: @@ -14,7 +14,9 @@ test: #NOTE(beisner): can remove -v after bug 1320357 is fixed # https://bugs.launchpad.net/amulet/+bug/1320357 @juju test -v -p AMULET_HTTP_PROXY --timeout 900 \ - 00-setup 14-basic-precise-icehouse 15-basic-trusty-icehouse + 00-setup 14-basic-precise-icehouse 15-basic-trusty-icehouse \ + 16-basic-trusty-icehouse-git 17-basic-trusty-juno \ + 18-basic-trusty-juno-git bin/charm_helpers_sync.py: @mkdir -p bin diff --git a/README.md b/README.md index c9bb6f65..934de17c 100644 --- a/README.md +++ b/README.md @@ -121,98 +121,90 @@ enabled-services: Can be used to separate cinder services between service Deploying from source --------------------- -The minimal openstack-origin-git config required to deploy from source is: +The minimum openstack-origin-git config required to deploy from source is: openstack-origin-git: - "{'cinder': - {'repository': 'git://git.openstack.org/openstack/cinder.git', - 'branch': 'stable/icehouse'}}" + "repositories: + - {name: requirements, + repository: 'git://git.openstack.org/openstack/requirements', + branch: stable/juno} + - {name: cinder, + repository: 'git://git.openstack.org/openstack/cinder', + branch: stable/juno}" -If you specify a 'requirements' repository, it will be used to update the -requirements.txt files of all other git repos that it applies to, before -they are installed: +Note that there are only two 'name' values the charm knows about: 'requirements' +and 'cinder'. These repositories must correspond to these 'name' values. +Additionally, the requirements repository must be specified first and the +cinder repository must be specified last. All other repostories are installed +in the order in which they are specified. + +The following is a full list of current tip repos (may not be up-to-date): openstack-origin-git: - "{'requirements': - {'repository': 'git://git.openstack.org/openstack/requirements.git', - 'branch': 'master'}, - 'cinder': - {'repository': 'git://git.openstack.org/openstack/cinder.git', - 'branch': 'master'}}" - -Note that there are only two key values the charm knows about for the outermost -dictionary: 'cinder' and 'requirements'. These repositories must correspond to -these keys. If the requirements repository is specified, it will be installed -first. The cinder repository is always installed last. All other repostories -will be installed in between. - -NOTE(coreycb): The following is temporary to keep track of the full list of -current tip repos (may not be up-to-date). - - openstack-origin-git: - "{'requirements': - {'repository': 'git://git.openstack.org/openstack/requirements.git', - 'branch': 'master'}, - 'keystonemiddleware: - {'repository': 'git://git.openstack.org/openstack/keystonemiddleware.git', - 'branch: 'master'}, - 'oslo-concurrency': - {'repository': 'git://git.openstack.org/openstack/oslo.concurrency.git', - 'branch: 'master'}, - 'oslo-config': - {'repository': 'git://git.openstack.org/openstack/oslo.config.git', - 'branch: 'master'}, - 'oslo-context': - {'repository': 'git://git.openstack.org/openstack/oslo.context.git', - 'branch: 'master'}, - 'oslo-db': - {'repository': 'git://git.openstack.org/openstack/oslo.db.git', - 'branch: 'master'}, - 'oslo-i18n': - {'repository': 'git://git.openstack.org/openstack/oslo.i18n.git', - 'branch: 'master'}, - 'oslo-messaging': - {'repository': 'git://git.openstack.org/openstack/oslo.messaging.git', - 'branch: 'master'}, - 'oslo-rootwrap': - {'repository': 'git://git.openstack.org/openstack/oslo.rootwrap.git', - 'branch: 'master'}, - 'oslo-serialization': - {'repository': 'git://git.openstack.org/openstack/oslo.serialization.git', - 'branch: 'master'}, - 'oslo-utils': - {'repository': 'git://git.openstack.org/openstack/oslo.utils.git', - 'branch: 'master'}, - 'oslo-vmware': - {'repository': 'git://git.openstack.org/openstack/oslo.vmware.git', - 'branch: 'master'}, - 'osprofiler': - {'repository': 'git://git.openstack.org/stackforge/osprofiler.git', - 'branch: 'master'}, - 'pbr': - {'repository': 'git://git.openstack.org/openstack-dev/pbr.git', - 'branch: 'master'}, - 'python-barbicanclient': - {'repository': 'git://git.openstack.org/openstack/python-barbicanclient.git', - 'branch: 'master'}, - 'python-glanceclient': - {'repository': 'git://git.openstack.org/openstack/python-glanceclient.git', - 'branch: 'master'}, - 'python-novaclient': - {'repository': 'git://git.openstack.org/openstack/python-novaclient.git', - 'branch: 'master'}, - 'python-swiftclient': - {'repository': 'git://git.openstack.org/openstack/python-swiftclient.git', - 'branch: 'master'}, - 'stevedore': - {'repository': 'git://git.openstack.org/openstack/stevedore.git', - 'branch: 'master'}, - 'sqlalchemy-migrate': - {'repository': 'git://git.openstack.org/stackforge/sqlalchemy-migrate.git', - 'branch: 'master'}, - 'taskflow': - {'repository': 'git://git.openstack.org/openstack/taskflow.git', - 'branch: 'master'}, - 'cinder': - {'repository': 'git://git.openstack.org/openstack/cinder.git', - 'branch': 'master'}}" + "repositories: + - {name: requirements, + repository: 'git://git.openstack.org/openstack/requirements', + branch: master} + - {name: oslo-concurrency, + repository: 'git://git.openstack.org/openstack/oslo.concurrency', + branch: master} + - {name: oslo-config, + repository: 'git://git.openstack.org/openstack/oslo.config', + branch: master} + - {name: oslo-context, + repository': 'git://git.openstack.org/openstack/oslo.context.git', + branch: master} + - {name: oslo-db, + repository: 'git://git.openstack.org/openstack/oslo.db', + branch: master} + - {name: oslo-i18n, + repository: 'git://git.openstack.org/openstack/oslo.i18n', + branch: master} + - {name: oslo-messaging, + repository: 'git://git.openstack.org/openstack/oslo.messaging.git', + branch: master} + - {name: oslo-serialization, + repository: 'git://git.openstack.org/openstack/oslo.serialization', + branch: master} + - {name: oslo-utils, + repository: 'git://git.openstack.org/openstack/oslo.utils', + branch: master} + - {name: oslo-rootwrap, + repository: 'git://git.openstack.org/openstack/oslo.rootwrap.git', + branch: master} + - {name: oslo-vmware, + repository: 'git://git.openstack.org/openstack/oslo.vmware.git', + branch: master} + - {name: osprofiler, + repository: 'git://git.openstack.org/stackforge/osprofiler.git', + branch: master} + - {name: pbr, + repository: 'git://git.openstack.org/openstack-dev/pbr', + branch: master} + - {name: python-barbicanclient, + repository: 'git://git.openstack.org/openstack/python-barbicanclient.git', + branch: master} + - {name: python-glanceclient, + repository: 'git://git.openstack.org/openstack/python-glanceclient.git', + branch: master} + - {name: python-novaclient, + repository: 'git://git.openstack.org/openstack/python-novaclient.git', + branch: master} + - {name: python-swiftclient: + repository: 'git://git.openstack.org/openstack/python-swiftclient.git', + branch: master} + - {name: sqlalchemy-migrate, + repository: 'git://git.openstack.org/stackforge/sqlalchemy-migrate', + branch: master} + - {name: stevedore, + repository: 'git://git.openstack.org/openstack/stevedore.git', + branch: master} + - {name: taskflow, + repository: 'git://git.openstack.org/openstack/taskflow.git', + branch: master} + - {name: keystonemiddleware, + repository: 'git://git.openstack.org/openstack/keystonemiddleware', + branch: master} + - {name: cinder, + repository: 'git://git.openstack.org/openstack/cinder', + branch: master}" diff --git a/actions.yaml b/actions.yaml new file mode 100644 index 00000000..3a7f3355 --- /dev/null +++ b/actions.yaml @@ -0,0 +1,2 @@ +git-reinstall: + description: Reinstall cinder from the openstack-origin-git repositories. diff --git a/actions/git-reinstall b/actions/git-reinstall new file mode 120000 index 00000000..ff684984 --- /dev/null +++ b/actions/git-reinstall @@ -0,0 +1 @@ +git_reinstall.py \ No newline at end of file diff --git a/actions/git_reinstall.py b/actions/git_reinstall.py new file mode 100755 index 00000000..a5a3b0d3 --- /dev/null +++ b/actions/git_reinstall.py @@ -0,0 +1,40 @@ +#!/usr/bin/python +import sys +import traceback + +sys.path.append('hooks/') + +from charmhelpers.contrib.openstack.utils import ( + git_install_requested, +) + +from charmhelpers.core.hookenv import ( + action_set, + action_fail, + config, +) + +from cinder_utils import ( + git_install, +) + + +def git_reinstall(): + """Reinstall from source and restart services. + + If the openstack-origin-git config option was used to install openstack + from source git repositories, then this action can be used to reinstall + from updated git repositories, followed by a restart of services.""" + if not git_install_requested(): + action_fail('openstack-origin-git is not configured') + return + + try: + git_install(config('openstack-origin-git')) + except: + action_set({'traceback': traceback.format_exc()}) + action_fail('git-reinstall resulted in an unexpected error') + + +if __name__ == '__main__': + git_reinstall() diff --git a/charm-helpers-tests.yaml b/charm-helpers-tests.yaml index aaa21c31..48b12f6f 100644 --- a/charm-helpers-tests.yaml +++ b/charm-helpers-tests.yaml @@ -1,5 +1,4 @@ -#branch: lp:charm-helpers -branch: /home/corey/src/charms/git/charm-helpers +branch: lp:charm-helpers destination: tests/charmhelpers include: - contrib.amulet diff --git a/config.yaml b/config.yaml index 849f5a2f..57c375ab 100644 --- a/config.yaml +++ b/config.yaml @@ -16,23 +16,20 @@ options: was not available in the Ubuntu archive for Precise and is only available via the Ubuntu Cloud Archive. - Note that when openstack-origin-git is specified, openstack-specific - packages will be installed from source rather than from the - openstack-origin repository. + Note that when openstack-origin-git is specified, openstack + specific packages will be installed from source rather than + from the openstack-origin repository. openstack-origin-git: default: None type: string description: | - Specifies a YAML-formatted two-dimensional array listing the git - repositories and branches from which to install OpenStack and its - dependencies. + Specifies a YAML-formatted dictionary listing the git + repositories and branches from which to install OpenStack and + its dependencies. Note that the installed config files will be determined based on the OpenStack release of the openstack-origin option. - Note also that this option is processed for the initial install - only. Setting this option after deployment is not supported. - For more details see README.md. enabled-services: default: all diff --git a/hooks/cinder_hooks.py b/hooks/cinder_hooks.py index 1fbe546d..4d1ffacb 100755 --- a/hooks/cinder_hooks.py +++ b/hooks/cinder_hooks.py @@ -51,6 +51,7 @@ from charmhelpers.core.host import ( ) from charmhelpers.contrib.openstack.utils import ( + config_value_changed, configure_installation_source, git_install_requested, openstack_upgrade_available, @@ -101,8 +102,7 @@ def install(): apt_update() apt_install(determine_packages(), fatal=True) - # NOTE(coreycb): This is temporary for sstack proxy, unless we decide - # we need to code proxy support into the charms. + # NOTE(coreycb): This is temporary until bug #1431286 is fixed. os.environ["http_proxy"] = "http://squid.internal:3128" os.environ["https_proxy"] = "https://squid.internal:3128" @@ -127,7 +127,10 @@ def config_changed(): conf['overwrite'] in ['true', 'True', True], conf['remove-missing']) - if not git_install_requested(): + if git_install_requested(): + if config_value_changed('openstack-origin-git'): + git_install(config('openstack-origin-git')) + else: if openstack_upgrade_available('cinder-common'): do_openstack_upgrade(configs=CONFIGS) # NOTE(jamespage) tell any storage-backends we just upgraded diff --git a/hooks/cinder_utils.py b/hooks/cinder_utils.py index 75c4b9ec..43e04171 100644 --- a/hooks/cinder_utils.py +++ b/hooks/cinder_utils.py @@ -70,6 +70,7 @@ from charmhelpers.contrib.openstack.utils import ( get_os_codename_install_source, git_install_requested, git_clone_and_install, + git_src_dir, os_release, ) @@ -507,16 +508,16 @@ def setup_ipv6(): apt_install('haproxy/trusty-backports', fatal=True) -def git_install(projects): +def git_install(projects_yaml): """Perform setup, and install git repos specified in yaml parameter.""" if git_install_requested(): git_pre_install() - git_clone_and_install(yaml.load(projects), core_project='cinder') - git_post_install() + git_clone_and_install(projects_yaml, core_project='cinder') + git_post_install(projects_yaml) def git_pre_install(): - """Perform pre cinder installation setup.""" + """Perform cinder pre-install setup.""" dirs = [ '/etc/cinder', '/etc/cinder/rootwrap.d', @@ -547,9 +548,9 @@ def git_pre_install(): write_file(l, '', owner='cinder', group='cinder', perms=0600) -def git_post_install(): - """Perform post cinder installation setup.""" - src_etc = os.path.join(charm_dir(), '/mnt/openstack-git/cinder.git/etc/cinder') +def git_post_install(projects_yaml): + """Perform cinder post-install setup.""" + src_etc = os.path.join(git_src_dir(projects_yaml, 'cinder'), 'etc') configs = { 'policy': { 'src': os.path.join(src_etc, 'policy.json'), @@ -574,32 +575,51 @@ def git_post_install(): cinder_api_context = { 'service_description': 'Cinder API server', + 'service_name': 'Cinder', + 'user_name': 'cinder', + 'start_dir': '/var/lib/cinder', 'process_name': 'cinder-api', + 'executable_name': '/usr/local/bin/cinder-api', } cinder_backup_context = { 'service_description': 'Cinder backup server', + 'service_name': 'Cinder', + 'user_name': 'cinder', + 'start_dir': '/var/lib/cinder', 'process_name': 'cinder-backup', + 'executable_name': '/usr/local/bin/cinder-backup', } cinder_scheduler_context = { 'service_description': 'Cinder scheduler server', + 'service_name': 'Cinder', + 'user_name': 'cinder', + 'start_dir': '/var/lib/cinder', 'process_name': 'cinder-scheduler', + 'executable_name': '/usr/local/bin/cinder-scheduler', } cinder_volume_context = { 'service_description': 'Cinder volume server', + 'service_name': 'Cinder', + 'user_name': 'cinder', + 'start_dir': '/var/lib/cinder', 'process_name': 'cinder-volume', + 'executable_name': '/usr/local/bin/cinder-volume', } - render('upstart/cinder.upstart', '/etc/init/cinder-api.conf', - cinder_api_context, perms=0o644) - render('upstart/cinder.upstart', '/etc/init/cinder-backup.conf', - cinder_backup_context, perms=0o644) - render('upstart/cinder.upstart', '/etc/init/cinder-scheduler.conf', - cinder_scheduler_context, perms=0o644) - render('upstart/cinder.upstart', '/etc/init/cinder-volume.conf', - cinder_volume_context, perms=0o644) + # NOTE(coreycb): Needs systemd support + templates_dir = 'hooks/charmhelpers/contrib/openstack/templates' + templates_dir = os.path.join(charm_dir(), templates_dir) + render('git.upstart', '/etc/init/cinder-api.conf', + cinder_api_context, perms=0o644, templates_dir=templates_dir) + render('git.upstart', '/etc/init/cinder-backup.conf', + cinder_backup_context, perms=0o644, templates_dir=templates_dir) + render('git.upstart', '/etc/init/cinder-scheduler.conf', + cinder_scheduler_context, perms=0o644, templates_dir=templates_dir) + render('git.upstart', '/etc/init/cinder-volume.conf', + cinder_volume_context, perms=0o644, templates_dir=templates_dir) service_restart('tgtd') diff --git a/templates/upstart/cinder.upstart b/templates/upstart/cinder.upstart deleted file mode 100644 index 7df420b3..00000000 --- a/templates/upstart/cinder.upstart +++ /dev/null @@ -1,20 +0,0 @@ -description "{{ service_description }}" -author "Juju Cinder Charm " - -start on runlevel [2345] -stop on runlevel [!2345] - -chdir /var/run - -pre-start script - mkdir -p /var/run/cinder - chown cinder:cinder /var/run/cinder - - mkdir -p /var/lock/cinder - chown cinder:root /var/lock/cinder -end script - -exec start-stop-daemon --start --chuid cinder \ - --exec /usr/local/bin/{{ process_name }} -- \ - --config-file=/etc/cinder/cinder.conf \ - --log-file=/var/log/cinder/{{ process_name }}.log diff --git a/tests/11-basic-precise-folsom b/tests/11-basic-precise-folsom deleted file mode 100755 index c53aa213..00000000 --- a/tests/11-basic-precise-folsom +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/python - -"""Amulet tests on a basic cinder deployment on precise-folsom.""" - -from basic_deployment import CinderBasicDeployment - -if __name__ == '__main__': - deployment = CinderBasicDeployment(series='precise', - openstack='cloud:precise-folsom', - source='cloud:precise-updates/folsom') - deployment.run_tests() diff --git a/tests/12-basic-precise-grizzly b/tests/12-basic-precise-grizzly deleted file mode 100755 index 5bfb838b..00000000 --- a/tests/12-basic-precise-grizzly +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/python - -"""Amulet tests on a basic cinder deployment on precise-grizzly.""" - -from basic_deployment import CinderBasicDeployment - -if __name__ == '__main__': - deployment = CinderBasicDeployment(series='precise', - openstack='cloud:precise-grizzly', - source='cloud:precise-updates/grizzly') - deployment.run_tests() diff --git a/tests/13-basic-precise-havana b/tests/13-basic-precise-havana deleted file mode 100755 index cc8ae29a..00000000 --- a/tests/13-basic-precise-havana +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/python - -"""Amulet tests on a basic cinder deployment on precise-havana.""" - -from basic_deployment import CinderBasicDeployment - -if __name__ == '__main__': - deployment = CinderBasicDeployment(series='precise', - openstack='cloud:precise-havana', - source='cloud:precise-updates/havana') - deployment.run_tests() diff --git a/tests/16-basic-trusty-icehouse-git b/tests/16-basic-trusty-icehouse-git new file mode 100755 index 00000000..f3e94126 --- /dev/null +++ b/tests/16-basic-trusty-icehouse-git @@ -0,0 +1,9 @@ +#!/usr/bin/python + +"""Amulet tests on a basic Cinder git deployment on trusty-icehouse.""" + +from basic_deployment import CinderBasicDeployment + +if __name__ == '__main__': + deployment = CinderBasicDeployment(series='trusty', git=True) + deployment.run_tests() diff --git a/tests/17-basic-trusty-juno b/tests/17-basic-trusty-juno new file mode 100755 index 00000000..06b4f6e3 --- /dev/null +++ b/tests/17-basic-trusty-juno @@ -0,0 +1,11 @@ +#!/usr/bin/python + +"""Amulet tests on a basic Cinder deployment on trusty-juno.""" + +from basic_deployment import CinderBasicDeployment + +if __name__ == '__main__': + deployment = CinderBasicDeployment(series='trusty', + openstack='cloud:trusty-juno', + source='cloud:trusty-updates/juno') + deployment.run_tests() diff --git a/tests/18-basic-trusty-juno-git b/tests/18-basic-trusty-juno-git new file mode 100755 index 00000000..7500a634 --- /dev/null +++ b/tests/18-basic-trusty-juno-git @@ -0,0 +1,12 @@ +#!/usr/bin/python + +"""Amulet tests on a basic Cinder git deployment on trusty-juno.""" + +from basic_deployment import CinderBasicDeployment + +if __name__ == '__main__': + deployment = CinderBasicDeployment(series='trusty', + openstack='cloud:trusty-juno', + source='cloud:trusty-updates/juno', + git=True) + deployment.run_tests() diff --git a/tests/basic_deployment.py b/tests/basic_deployment.py index 165f33a2..9cf5516e 100755 --- a/tests/basic_deployment.py +++ b/tests/basic_deployment.py @@ -28,10 +28,12 @@ class CinderBasicDeployment(OpenStackAmuletDeployment): # NOTE(beisner): Features and tests vary across Openstack releases. # https://wiki.openstack.org/wiki/CinderSupportMatrix - def __init__(self, series=None, openstack=None, source=None, stable=False): + def __init__(self, series=None, openstack=None, source=None, git=False, + stable=False): '''Deploy the entire test environment.''' super(CinderBasicDeployment, self).__init__(series, openstack, source, stable) + self.git = git self._add_services() self._add_relations() self._configure_services() @@ -67,17 +69,26 @@ class CinderBasicDeployment(OpenStackAmuletDeployment): def _configure_services(self): '''Configure all of the services.''' - keystone_config = {'admin-password': 'openstack', - 'admin-token': 'ubuntutesting'} cinder_config = {'block-device': 'vdb', 'glance-api-version': '2', - 'overwrite': 'true', - # NOTE(coreycb): Added the following temporarily to test deploy from source - 'openstack-origin-git': - "{'cinder':" - " {'repository': 'git://git.openstack.org/openstack/cinder.git'," - " 'branch': 'stable/icehouse'}}"} + 'overwrite': 'true'} + if self.git: + branch = 'stable/' + self._get_openstack_release_string() + openstack_origin_git = { + 'repositories': [ + {'name': 'requirements', + 'repository': 'git://git.openstack.org/openstack/requirements', + 'branch': branch}, + {'name': 'cinder', + 'repository': 'git://git.openstack.org/openstack/cinder', + 'branch': branch}, + ], + 'directory': '/mnt/openstack-git', + } + cinder_config['openstack-origin-git'] = yaml.dump(openstack_origin_git) + keystone_config = {'admin-password': 'openstack', + 'admin-token': 'ubuntutesting'} mysql_config = {'dataset-size': '50%'} configs = {'cinder': cinder_config, 'keystone': keystone_config, diff --git a/unit_tests/__init__.py b/unit_tests/__init__.py index f80aab3d..c9fd5a96 100644 --- a/unit_tests/__init__.py +++ b/unit_tests/__init__.py @@ -1,2 +1,4 @@ import sys + +sys.path.append('actions') sys.path.append('hooks') diff --git a/unit_tests/test_actions_git_reinstall.py b/unit_tests/test_actions_git_reinstall.py new file mode 100644 index 00000000..659f043a --- /dev/null +++ b/unit_tests/test_actions_git_reinstall.py @@ -0,0 +1,85 @@ +from mock import patch + +with patch('charmhelpers.core.hookenv.config') as config: + config.return_value = 'cinder' + import cinder_utils as utils # noqa + +import git_reinstall + +from test_utils import ( + CharmTestCase +) + +TO_PATCH = [ + 'config', +] + + +openstack_origin_git = \ + """repositories: + - {name: requirements, + repository: 'git://git.openstack.org/openstack/requirements', + branch: stable/juno} + - {name: cinder, + repository: 'git://git.openstack.org/openstack/cinder', + branch: stable/juno}""" + + +class TestKeystoneActions(CharmTestCase): + + def setUp(self): + super(TestKeystoneActions, self).setUp(git_reinstall, TO_PATCH) + self.config.side_effect = self.test_config.get + + @patch.object(git_reinstall, 'action_set') + @patch.object(git_reinstall, 'action_fail') + @patch.object(git_reinstall, 'git_install') + def test_git_reinstall(self, git_install, action_fail, action_set): + self.test_config.set('openstack-origin-git', openstack_origin_git) + + git_reinstall.git_reinstall() + + git_install.assert_called_with(openstack_origin_git) + self.assertTrue(git_install.called) + self.assertFalse(action_set.called) + self.assertFalse(action_fail.called) + + @patch.object(git_reinstall, 'action_set') + @patch.object(git_reinstall, 'action_fail') + @patch.object(git_reinstall, 'git_install') + @patch('charmhelpers.contrib.openstack.utils.config') + def test_git_reinstall_not_configured(self, _config, git_install, + action_fail, action_set): + _config.return_value = 'none' + + git_reinstall.git_reinstall() + + msg = 'openstack-origin-git is not configured' + action_fail.assert_called_with(msg) + self.assertFalse(git_install.called) + self.assertFalse(action_set.called) + + @patch.object(git_reinstall, 'action_set') + @patch.object(git_reinstall, 'action_fail') + @patch.object(git_reinstall, 'git_install') + @patch('charmhelpers.contrib.openstack.utils.config') + def test_git_reinstall_exception(self, _config, git_install, + action_fail, action_set): + _config.return_value = openstack_origin_git + e = OSError('something bad happened') + git_install.side_effect = e + traceback = ( + "Traceback (most recent call last):\n" + " File \"actions/git_reinstall.py\", line 33, in git_reinstall\n" + " git_install(config(\'openstack-origin-git\'))\n" + " File \"/usr/lib/python2.7/dist-packages/mock.py\", line 964, in __call__\n" # noqa + " return _mock_self._mock_call(*args, **kwargs)\n" + " File \"/usr/lib/python2.7/dist-packages/mock.py\", line 1019, in _mock_call\n" # noqa + " raise effect\n" + "OSError: something bad happened\n") + + git_reinstall.git_reinstall() + + msg = 'git-reinstall resulted in an unexpected error' + action_fail.assert_called_with(msg) + action_set.assert_called_with({'traceback': traceback})