diff --git a/src/actions/run-tempest.py b/src/actions/run-tempest.py index 49633c8..bd34562 100755 --- a/src/actions/run-tempest.py +++ b/src/actions/run-tempest.py @@ -4,9 +4,26 @@ sys.path.append('lib') import charm.openstack.tempest as tempest import charms.reactive as reactive +import charms.reactive.bus as bus +import charmhelpers.core.hookenv as hookenv +# Make sure that reactive is bootstrapped and all the states are setup +# properly +from charms.layer import basic +basic.bootstrap_charm_deps() +basic.init_config_states() if __name__ == '__main__': + # charms.reactive 0.4.6 moved the auto discovery of interfaces out of the + # module load and into the main() function. Actions don't want to run the + # main (as we don't want the handlers/hooks to run) so this just finds the + # interfaces to the '.from_state()' function will get the interface object. + bus.discover() identity_int = reactive.RelationBase.from_state('identity-admin.available') - tempest.render_configs([identity_int]) - tempest.run_test('smoke') + if identity_int is None: + # The interface isn't connected, so we can't do this yet + hookenv.action_fail( + "The identity-admin interface is not available - bailing") + else: + tempest.render_configs([identity_int]) + tempest.run_test('smoke') diff --git a/src/test-requirements.txt b/src/test-requirements.txt index 613b081..3cb4ae7 100644 --- a/src/test-requirements.txt +++ b/src/test-requirements.txt @@ -1,5 +1,12 @@ -# charm-proof +# The order of packages is significant, because pip processes them in the order +# of appearance. Changing the order has an impact on the overall integration +# process, which may cause wedges in the gate later. +coverage>=3.6 +mock>=1.2 +flake8>=2.2.4,<=2.4.1 +os-testr>=0.4.1 charm-tools>=2.0.0 +requests==2.6.0 # amulet deployment helpers bzr+lp:charm-helpers#egg=charmhelpers # BEGIN: Amulet OpenStack Charm Helper Requirements @@ -7,15 +14,18 @@ bzr+lp:charm-helpers#egg=charmhelpers amulet>=1.14.3,<2.0 bundletester>=0.6.1,<1.0 aodhclient>=0.1.0 -python-ceilometerclient>=1.5.0,<2.0 -python-cinderclient>=1.4.0,<2.0 -python-glanceclient>=1.1.0,<2.0 -python-heatclient>=0.8.0,<1.0 -python-keystoneclient>=1.7.1,<2.0 -python-neutronclient>=3.1.0,<4.0 -python-novaclient>=2.30.1,<3.0 -python-openstackclient>=1.7.0,<2.0 -python-swiftclient>=2.6.0,<3.0 +python-barbicanclient>=4.0.1 +python-ceilometerclient>=1.5.0 +python-cinderclient>=1.4.0 +python-designateclient>=1.5 +python-glanceclient>=1.1.0 +python-heatclient>=0.8.0 +python-keystoneclient>=1.7.1 +python-manilaclient>=1.8.1 +python-neutronclient>=3.1.0 +python-novaclient>=2.30.1 +python-openstackclient>=1.7.0 +python-swiftclient>=2.6.0 pika>=0.10.0,<1.0 distro-info # END: Amulet OpenStack Charm Helper Requirements diff --git a/src/tests/basic_deployment.py b/src/tests/basic_deployment.py index 8b0cea0..490a082 100644 --- a/src/tests/basic_deployment.py +++ b/src/tests/basic_deployment.py @@ -1,6 +1,3 @@ -import subprocess -import json -import time from charmhelpers.contrib.openstack.amulet.deployment import ( OpenStackAmuletDeployment @@ -98,36 +95,10 @@ class TempestBasicDeployment(OpenStackAmuletDeployment): u.log.debug('openstack release str: {}'.format( self._get_openstack_release_string())) - def _run_action(self, unit_id, action, *args): - command = ["juju", "action", "do", "--format=json", unit_id, action] - command.extend(args) - print("Running command: %s\n" % " ".join(command)) - output = subprocess.check_output(command) - output_json = output.decode(encoding="UTF-8") - data = json.loads(output_json) - action_id = data[u'Action queued with id'] - return action_id - - def _wait_on_action(self, action_id): - command = ["juju", "action", "fetch", "--format=json", action_id] - while True: - try: - output = subprocess.check_output(command) - except Exception as e: - print(e) - return False - output_json = output.decode(encoding="UTF-8") - data = json.loads(output_json) - if data[u"status"] == "completed": - return True - elif data[u"status"] == "failed": - return False - time.sleep(2) - def test_run_tempest(self): u.log.debug('Running Tempest...') unit = self.tempest_sentry assert u.status_get(unit)[0] == "active" - action_id = self._run_action(unit.info['unit_name'], "run-tempest") - assert self._wait_on_action(action_id), "run-tempest action failed." + action_id = u.run_action(unit, "run-tempest") + assert u.wait_on_action(action_id), "run-tempest action failed." diff --git a/src/tox.ini b/src/tox.ini index 3bc4d0b..276db2f 100644 --- a/src/tox.ini +++ b/src/tox.ini @@ -10,7 +10,7 @@ setenv = VIRTUAL_ENV={envdir} PYTHONHASHSEED=0 AMULET_SETUP_TIMEOUT=2700 whitelist_externals = juju -passenv = HOME TERM AMULET_* CS_API_URL +passenv = HOME TERM AMULET_* CS_API_* deps = -r{toxinidir}/test-requirements.txt install_command = pip install --allow-unverified python-apt {opts} {packages}