From 373108b5ae19ab4a11d4a7b7b414019733e95e3b Mon Sep 17 00:00:00 2001 From: Sergey Abramov Date: Wed, 6 Apr 2016 12:30:35 +0300 Subject: [PATCH] change get_service_tenant_id function Using openstack cli tool instead of keystone cli tool. Change-Id: I9e79a11fd0552a7d3205fcc02e05be01b33961ac --- octane/tests/test_env.py | 48 ++++++++++++++++++++++++++++++++++++++++ octane/util/env.py | 22 ++++++++++++++---- 2 files changed, 66 insertions(+), 4 deletions(-) diff --git a/octane/tests/test_env.py b/octane/tests/test_env.py index 641fdcf8..d71e4358 100644 --- a/octane/tests/test_env.py +++ b/octane/tests/test_env.py @@ -134,3 +134,51 @@ def test_copy_vips(mock_subprocess): mock_subprocess.assert_called_once_with( ['fuel2', 'env', 'copy', 'vips', str(env_id)] ) + + +@pytest.mark.parametrize("data, exception", [ + ( + '[{"ID": "2aed71d8816f4e5f8d4ad06836521d49", "Name": "admin"}, ' + '{"ID": "09f1c11740ba4bc399387f3995d5160e", "Name": "services"}]', + False + ), + ( + '[{"id": "2aed71d8816f4e5f8d4ad06836521d49", "name": "admin"}, ' + '{"id": "09f1c11740ba4bc399387f3995d5160e", "name": "services"}]', + False, + ), + ( + '[{"ID": "2aed71d8816f4e5f8d4ad06836521d49", "NAME": "admin"}, ' + '{"ID": "09f1c11740ba4bc399387f3995d5160e", "NAME": "services"}]', + False + ), + ( + '[{"ID": "2aed71d8816f4e5f8d4ad06836521d49", "NAME": "admin"}]', + True + ), +]) +@pytest.mark.parametrize("key,value", [ + ("services", "09f1c11740ba4bc399387f3995d5160e"), + ("Services", "09f1c11740ba4bc399387f3995d5160e"), + ("SERVICES", "09f1c11740ba4bc399387f3995d5160e"), +]) +def test_openstack_project_value(mocker, data, key, value, exception): + env = mock.Mock() + node = mock.Mock() + mocker.patch("octane.util.env.get_admin_password", return_value="pswd") + mocker.patch("octane.util.ssh.call_output", return_value=data) + if exception: + with pytest.raises(Exception) as exc_info: + env_util.get_openstack_project_value(env, node, key) + assert "Field {0} not found in openstack project list".format(key) == \ + exc_info.value.message + else: + assert value == env_util.get_openstack_project_value(env, node, key) + + +@pytest.mark.parametrize("node", [mock.Mock(), None]) +def test_get_service_tenant_id(mocker, node): + mock_obj = mocker.patch("octane.util.env.get_openstack_project_value") + env = mock.Mock() + env_util.get_service_tenant_id(env, node) + mock_obj.assert_called_once_with(env, node, "services") diff --git a/octane/util/env.py b/octane/util/env.py index f89ab135..3349007a 100644 --- a/octane/util/env.py +++ b/octane/util/env.py @@ -126,7 +126,7 @@ def parse_tenant_get(output, field): "Field {0} not found in output:\n{1}".format(field, output)) -def get_service_tenant_id(env, node=None): +def get_openstack_project_dict(env, node=None): if node is None: node = get_one_controller(env) @@ -134,13 +134,27 @@ def get_service_tenant_id(env, node=None): tenant_out = ssh.call_output( [ 'sh', '-c', - '. /root/openrc; keystone --os-password={0} tenant-get services' + '. /root/openrc; openstack --os-password {0} project list -f json' .format(password), ], node=node, ) - tenant_id = parse_tenant_get(tenant_out, 'id') - return tenant_id + data = [{k.lower(): v for k, v in d.items()} + for d in json.loads(tenant_out)] + return {i["name"]: i["id"] for i in data} + + +def get_openstack_project_value(env, node, key): + data = get_openstack_project_dict(env, node) + try: + return data[key.lower()] + except KeyError: + raise Exception( + "Field {0} not found in openstack project list".format(key)) + + +def get_service_tenant_id(env, node=None): + return get_openstack_project_value(env, node, "services") def cache_service_tenant_id(env, node=None):