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:
parent
307c67a63b
commit
9571fbd364
|
@ -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])
|
||||
|
|
|
@ -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")
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue