Merge "Makes cache_service_tenant_id compatible with Juno"
This commit is contained in:
commit
c07af0012e
|
@ -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])
|
||||
|
|
|
@ -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")
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue