Merge "Makes cache_service_tenant_id compatible with Juno"

This commit is contained in:
Jenkins 2016-04-28 13:24:19 +00:00 committed by Gerrit Code Review
commit c07af0012e
2 changed files with 101 additions and 42 deletions

View File

@ -100,11 +100,6 @@ DEPLOYMENT_INFO = [{
}]
def test_parse_tenant_get():
res = env_util.parse_tenant_get(TENANT_GET_SAMPLE, 'id')
assert res == 'e26c8079d61f46c48f9a6d606631ee5e'
def test_cache_service_tenant_id(mocker, mock_open, mock_os_path, node):
mock_open.return_value.readline.return_value = '111'
test_env = mock.Mock()
@ -114,15 +109,26 @@ def test_cache_service_tenant_id(mocker, mock_open, mock_os_path, node):
res = env_util.cache_service_tenant_id(test_env, node)
assert res == '111'
TENANT_GET_SAMPLE = """
+-------------+-----------------------------------+
| Property | Value |
+-------------+-----------------------------------+
| description | Tenant for the openstack services |
| enabled | True |
| id | e26c8079d61f46c48f9a6d606631ee5e |
| name | services |
+-------------+-----------------------------------+
def test_get_keystone_tenants(mocker):
env = mock.Mock()
node = mock.Mock()
mocker.patch("octane.util.env.get_admin_password", return_value="passwd")
mocker.patch("octane.util.ssh.call_output",
return_value=TENANT_LIST_SAMPLE)
tenants = env_util.get_keystone_tenants(env, node)
assert tenants == {"admin": "45632156d201479cb2c0171590435be1",
"services": "7dafd04613524cd4a34524bfa7533c8c"}
TENANT_LIST_SAMPLE = """
+----------------------------------+----------+---------+
| id | name | enabled |
+----------------------------------+----------+---------+
| 45632156d201479cb2c0171590435be1 | admin | True |
| 7dafd04613524cd4a34524bfa7533c8c | services | True |
+----------------------------------+----------+---------+
"""[1:]
@ -136,44 +142,79 @@ def test_copy_vips(mock_subprocess):
)
@pytest.mark.parametrize("data, exception", [
PROJECTS = {
"admin": "2aed71d8816f4e5f8d4ad06836521d49",
"services": "09f1c11740ba4bc399387f3995d5160e",
}
@pytest.mark.parametrize(("data", "expected"), [
(
'[{"ID": "2aed71d8816f4e5f8d4ad06836521d49", "Name": "admin"}, '
'{"ID": "09f1c11740ba4bc399387f3995d5160e", "Name": "services"}]',
False
PROJECTS,
),
(
'[{"id": "2aed71d8816f4e5f8d4ad06836521d49", "name": "admin"}, '
'{"id": "09f1c11740ba4bc399387f3995d5160e", "name": "services"}]',
False,
PROJECTS,
),
(
'[{"ID": "2aed71d8816f4e5f8d4ad06836521d49", "NAME": "admin"}, '
'{"ID": "09f1c11740ba4bc399387f3995d5160e", "NAME": "services"}]',
False
PROJECTS,
),
(
'[{"ID": "2aed71d8816f4e5f8d4ad06836521d49", "NAME": "admin"}]',
True
{"admin": "2aed71d8816f4e5f8d4ad06836521d49"},
),
])
@pytest.mark.parametrize("key,value", [
("services", "09f1c11740ba4bc399387f3995d5160e"),
("Services", "09f1c11740ba4bc399387f3995d5160e"),
("SERVICES", "09f1c11740ba4bc399387f3995d5160e"),
])
def test_openstack_project_value(mocker, data, key, value, exception):
def test_openstack_project_value(mocker, data, expected):
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)
projects = env_util.get_openstack_projects(env, node)
assert projects == expected
@pytest.mark.parametrize(("version", "client"), [
("6.0", "keystone"),
("6.1", "keystone"),
("7.0", "openstack"),
("8.0", "openstack"),
])
def test_get_openstack_project_dict(mocker, version, client):
env = mock.Mock()
node = mock.Mock()
node.env.data.get.return_value = version
mocker.patch("octane.util.env.get_one_controller", return_value=node)
mocker.patch("octane.util.env.get_keystone_tenants",
return_value="keystone")
mocker.patch("octane.util.env.get_openstack_projects",
return_value="openstack")
result = env_util.get_openstack_project_dict(env)
assert result == client
@pytest.mark.parametrize(("data", "key", "exception"), [
({'admin': 'ADMINIS'}, 'services', True),
({'services': 'SERVICEID', 'admin': 'ADMINIS'}, 'services', False),
({'services': 'SERVICEID'}, 'SERVICES', False),
])
def test_get_openstack_project_value(mocker, data, key, exception):
env = mock.Mock()
node = mock.Mock()
mocker.patch("octane.util.env.get_openstack_project_dict",
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)
project_id = env_util.get_openstack_project_value(env, node, key)
assert project_id == 'SERVICEID'
@pytest.mark.parametrize("node", [mock.Mock(), None])

View File

@ -10,7 +10,7 @@
# License for the specific language governing permissions and limitations
# under the License.
import fuelclient
from distutils import version
import json
import logging
import os.path
@ -18,6 +18,7 @@ import time
import uuid
import yaml
import fuelclient
from fuelclient.objects import environment as environment_obj
from fuelclient.objects import node as node_obj
from fuelclient.objects import task as task_obj
@ -117,21 +118,26 @@ def delete_fuel_resources(env):
)
def parse_tenant_get(output, field):
for line in output.splitlines()[3:-1]:
parts = line.split()
if parts[1] == field:
return parts[3]
raise Exception(
"Field {0} not found in output:\n{1}".format(field, output))
def get_openstack_project_dict(env, node=None):
if node is None:
node = get_one_controller(env)
def get_keystone_tenants(env, node):
password = get_admin_password(env, node)
tenant_out = ssh.call_output(
[
'sh', '-c',
'. /root/openrc; keystone --os-password={0} tenant-list'
.format(password),
],
node=node,
)
tenants = {}
for line in tenant_out.splitlines()[3:-1]:
parts = line.split()
tenants[parts[3]] = parts[1]
return tenants
def get_openstack_projects(env, node):
password = get_admin_password(env, node)
out = ssh.call_output(
[
'sh', '-c',
'. /root/openrc; openstack --os-password {0} project list -f json'
@ -140,10 +146,22 @@ def get_openstack_project_dict(env, node=None):
node=node,
)
data = [{k.lower(): v for k, v in d.items()}
for d in json.loads(tenant_out)]
for d in json.loads(out)]
return {i["name"]: i["id"] for i in data}
def get_openstack_project_dict(env, node=None):
if node is None:
node = get_one_controller(env)
node_env_version = str(node.env.data.get('fuel_version'))
if node_env_version < version.StrictVersion("7.0"):
mapping = get_keystone_tenants(env, node)
else:
mapping = get_openstack_projects(env, node)
return mapping
def get_openstack_project_value(env, node, key):
data = get_openstack_project_dict(env, node)
try:
@ -153,7 +171,7 @@ def get_openstack_project_value(env, node, key):
"Field {0} not found in openstack project list".format(key))
def get_service_tenant_id(env, node=None):
def get_service_tenant_id(env, node):
return get_openstack_project_value(env, node, "services")