Makes cache_service_tenant_id compatible with Juno

This change returns compatibility with the keystone client to obtain ID
of the services tenant for old releases, clients are used according to
the next releases of Fuel:

    keystone: < 7.0
    openstack: >= 7.0

Closes-Bug: 1572019
Co-Authored-By: Ilya Kharin <akscram@gmail.com>
Change-Id: I64877ea484cf148b0eb7501bf2676db5388f892f
(cherry picked from commit d4b073bbf4)
This commit is contained in:
Roman Sokolkov 2016-04-19 18:22:10 +03:00 committed by Ilya Kharin
parent 307c67a63b
commit 9571fbd364
2 changed files with 101 additions and 42 deletions

View File

@ -92,11 +92,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()
@ -106,56 +101,102 @@ 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:]
@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
@ -113,21 +114,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'
@ -136,10 +142,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:
@ -149,7 +167,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")