From bcfd6aaf30a5fc24dbe59974eb4df7e602af50e2 Mon Sep 17 00:00:00 2001 From: Liam Young Date: Thu, 19 Apr 2018 10:28:35 +0000 Subject: [PATCH] Add tests for vault authorize-charm action Add tests for the authorize-charm action on the vault app. To support this add get_action method to return an applications actions. However, this is not implemented in libjuju yet so fallback to subprocess --- unit_tests/test_zaza_model.py | 9 +++++++++ zaza/charm_tests/vault/tests.py | 22 +++++++++++++++++++--- zaza/charm_tests/vault/utils.py | 9 +++++++++ zaza/model.py | 19 +++++++++++++++++++ 4 files changed, 56 insertions(+), 3 deletions(-) diff --git a/unit_tests/test_zaza_model.py b/unit_tests/test_zaza_model.py index 64f3617..5922d2d 100644 --- a/unit_tests/test_zaza_model.py +++ b/unit_tests/test_zaza_model.py @@ -166,3 +166,12 @@ class TestModel(ut_utils.BaseTestCase): self.unit1.run_action.assert_called_once_with( 'backup', backup_dir='/dev/null') + + def test_get_actions(self): + self.patch_object(model.subprocess, 'check_output') + self.check_output.return_value = 'action: "action desc"' + self.assertEqual( + model.get_actions('mname', 'myapp'), + {'action': "action desc"}) + self.check_output.assert_called_once_with( + ['juju', 'actions', '-m', 'mname', 'myapp', '--format', 'yaml']) diff --git a/zaza/charm_tests/vault/tests.py b/zaza/charm_tests/vault/tests.py index dff2663..18d5ff0 100644 --- a/zaza/charm_tests/vault/tests.py +++ b/zaza/charm_tests/vault/tests.py @@ -5,8 +5,10 @@ import time import unittest import uuid +import zaza.charm_lifecycle.utils as lifecycle_utils import zaza.charm_tests.test_utils as test_utils import zaza.charm_tests.vault.utils as vault_utils +import zaza.model class VaultTest(unittest.TestCase): @@ -17,9 +19,9 @@ class VaultTest(unittest.TestCase): cls.vip_client = vault_utils.get_vip_client() if cls.vip_client: cls.clients.append(cls.vip_client) - vault_creds = vault_utils.get_credentails() - vault_utils.unseal_all(cls.clients, vault_creds['keys'][0]) - vault_utils.auth_all(cls.clients, vault_creds['root_token']) + cls.vault_creds = vault_utils.get_credentails() + vault_utils.unseal_all(cls.clients, cls.vault_creds['keys'][0]) + vault_utils.auth_all(cls.clients, cls.vault_creds['root_token']) def test_all_clients_authenticated(self): for client in self.clients: @@ -72,6 +74,20 @@ class VaultTest(unittest.TestCase): self.assertFalse(client.hvac_client.seal_status['sealed']) self.assertTrue(client.hvac_client.seal_status['cluster_name']) + def test_vault_authorize_charm_action(self): + vault_actions = zaza.model.get_actions( + lifecycle_utils.get_juju_model(), + 'vault') + if 'authorize-charm' not in vault_actions: + raise unittest.SkipTest('Action not defined') + action = vault_utils.run_charm_authorize( + self.vault_creds['root_token']) + self.assertEqual(action.status, 'completed') + client = self.clients[0] + self.assertIn( + 'local-charm-policy', + client.hvac_client.list_policies()) + if __name__ == '__main__': unittest.main() diff --git a/zaza/charm_tests/vault/utils.py b/zaza/charm_tests/vault/utils.py index 4d67870..0e8ed1f 100644 --- a/zaza/charm_tests/vault/utils.py +++ b/zaza/charm_tests/vault/utils.py @@ -200,3 +200,12 @@ def auth_all(clients, token): """ for client in clients: client.hvac_client.token = token + + +def run_charm_authorize(token): + unit = zaza.model.get_first_unit_name(utils.get_juju_model(), 'vault') + return zaza.model.run_action( + utils.get_juju_model(), + unit, + 'authorize-charm', + action_params={'token': token}) diff --git a/zaza/model.py b/zaza/model.py index 061a08f..d5b8365 100644 --- a/zaza/model.py +++ b/zaza/model.py @@ -1,5 +1,7 @@ import asyncio from async_generator import async_generator, yield_, asynccontextmanager +import subprocess +import yaml from juju import loop from juju.model import Model @@ -362,6 +364,23 @@ async def async_run_action(model_name, unit_name, action_name, run_action = sync_wrapper(async_run_action) +def get_actions(model_name, application_name): + """Get the actions an applications supports + + :param model_name: Name of model to query. + :type model_name: str + :param application_name: Name of application + :type application_name: str + :returns: Dictionary of actions and their descriptions + :rtype: dict + """ + # libjuju has not implemented get_actions yet + # https://github.com/juju/python-libjuju/issues/226 + cmd = ['juju', 'actions', '-m', model_name, application_name, + '--format', 'yaml'] + return yaml.load(subprocess.check_output(cmd)) + + def main(): # Run the deploy coroutine in an asyncio event loop, using a helper # that abstracts loop creation and teardown.