Add missing keystone clients

For completeness, add tempest clients for keystone's OS-ENDPOINT-POLICY
and OS-EP-FILTER APIs. These are rarely-used APIs, so not adding API
tests at this time.

Change-Id: Ia592d8d3b629af68a963f5050b29de5478bface1
Needed-by: https://review.opendev.org/686305
This commit is contained in:
Colleen Murphy 2020-07-31 17:13:02 -07:00 committed by Ghanshyam Mann
parent 00041e686f
commit 4599b91fe2
5 changed files with 257 additions and 0 deletions

View File

@ -0,0 +1,5 @@
---
features:
- |
Added missing client methods for keystone's OS-ENDPOINT-POLICY and
OS-EP-FILTER APIs.

View File

@ -66,3 +66,57 @@ class EndPointsFilterClient(rest_client.RestClient):
% (project_id, endpoint_id)) % (project_id, endpoint_id))
self.expected_success(204, resp.status) self.expected_success(204, resp.status)
return rest_client.ResponseBody(resp, body) return rest_client.ResponseBody(resp, body)
def list_endpoint_groups_for_project(self, project_id):
"""List Endpoint Groups Associated with Project."""
resp, body = self.get(
self.ep_filter + '/projects/%s/endpoint_groups'
% project_id)
self.expected_success(200, resp.status)
body = json.loads(body)
return rest_client.ResponseBody(resp, body)
def list_projects_for_endpoint_group(self, endpoint_group_id):
"""List Projects Associated with Endpoint Group."""
resp, body = self.get(
self.ep_filter + '/endpoint_groups/%s/projects'
% endpoint_group_id)
self.expected_success(200, resp.status)
body = json.loads(body)
return rest_client.ResponseBody(resp, body)
def list_endpoints_for_endpoint_group(self, endpoint_group_id):
"""List Endpoints Associated with Endpoint Group."""
resp, body = self.get(
self.ep_filter + '/endpoint_groups/%s/endpoints'
% endpoint_group_id)
self.expected_success(200, resp.status)
body = json.loads(body)
return rest_client.ResponseBody(resp, body)
def add_endpoint_group_to_project(self, endpoint_group_id, project_id):
"""Create Endpoint Group to Project Association."""
body = None
resp, body = self.put(
self.ep_filter + '/endpoint_groups/%s/projects/%s'
% (endpoint_group_id, project_id), body)
self.expected_success(204, resp.status)
return rest_client.ResponseBody(resp, body)
def show_endpoint_group_for_project(self, endpoint_group_id, project_id):
"""Get Endpoint Group to Project Association."""
resp, body = self.get(
self.ep_filter + '/endpoint_groups/%s/projects/%s'
% (endpoint_group_id, project_id))
self.expected_success(200, resp.status)
body = json.loads(body)
return rest_client.ResponseBody(resp, body)
def delete_endpoint_group_from_project(
self, endpoint_group_id, project_id):
"""Delete Endpoint Group to Project Association."""
resp, body = self.delete(
self.ep_filter + '/endpoint_groups/%s/projects/%s'
% (endpoint_group_id, project_id))
self.expected_success(204, resp.status)
return rest_client.ResponseBody(resp, body)

View File

@ -185,3 +185,27 @@ class PoliciesClient(rest_client.RestClient):
resp, body = self.delete(url) resp, body = self.delete(url)
self.expected_success(204, resp.status) self.expected_success(204, resp.status)
return rest_client.ResponseBody(resp, body) return rest_client.ResponseBody(resp, body)
def list_endpoints_for_policy(self, policy_id):
"""List policy and service endpoint associations.
API reference:
https://docs.openstack.org/api-ref/identity/v3-ext/#list-policy-and-service-endpoint-associations
"""
url = "policies/{0}/OS-ENDPOINT-POLICY/endpoints".format(policy_id)
resp, body = self.get(url)
self.expected_success(200, resp.status)
body = json.loads(body)
return rest_client.ResponseBody(resp, body)
def show_policy_for_endpoint(self, endpoint_id):
"""Show the effective policy associated with an endpoint
API reference:
https://docs.openstack.org/api-ref/identity/v3-ext/#show-the-effective-policy-associated-with-an-endpoint
"""
url = "endpoints/{0}/OS-ENDPOINT-POLICY/policy".format(endpoint_id)
resp, body = self.get(url)
self.expected_success(200, resp.status)
body = json.loads(body)
return rest_client.ResponseBody(resp, body)

View File

@ -83,6 +83,36 @@ class TestEndPointsFilterClient(base.BaseServiceTest):
} }
} }
FAKE_LIST_ENDPOINT_GROUPS_FOR_PROJECT = {
"endpoint_groups": [
{
"endpoint_group": {
"description": "endpoint group description #2",
"filters": {
"interface": "admin"
},
"id": "3de68c",
"name": "endpoint group name #2"
}
}
],
"links": {
"self": "https://url/identity/v3/OS-EP-FILTER/endpoint_groups",
}
}
FAKE_PROJECT_INFO = {
"project": {
"domain_id": "1789d1",
"id": "263fd9",
"links": {
"self": "http://example.com/identity/v3/projects/263fd9"
},
"name": "project name #1",
"description": "project description #1"
}
}
def setUp(self): def setUp(self):
super(TestEndPointsFilterClient, self).setUp() super(TestEndPointsFilterClient, self).setUp()
fake_auth = fake_auth_provider.FakeAuthProvider() fake_auth = fake_auth_provider.FakeAuthProvider()
@ -137,6 +167,52 @@ class TestEndPointsFilterClient(base.BaseServiceTest):
project_id=3, project_id=3,
endpoint_id=4) endpoint_id=4)
def _test_list_endpoint_groups_for_project(self, bytes_body=False):
self.check_service_client_function(
self.client.list_endpoint_groups_for_project,
'tempest.lib.common.rest_client.RestClient.get',
self.FAKE_LIST_ENDPOINT_GROUPS_FOR_PROJECT,
bytes_body,
status=200,
project_id=3)
def _test_list_projects_for_endpoint_group(self, bytes_body=False):
self.check_service_client_function(
self.client.list_projects_for_endpoint_group,
'tempest.lib.common.rest_client.RestClient.get',
self.FAKE_LIST_PROJECTS_FOR_ENDPOINTS,
bytes_body,
status=200,
endpoint_group_id=5)
def _test_list_endpoints_for_endpoint_group(self, bytes_body=False):
self.check_service_client_function(
self.client.list_endpoints_for_endpoint_group,
'tempest.lib.common.rest_client.RestClient.get',
self.FAKE_LIST_ENDPOINTS_FOR_PROJECTS,
bytes_body,
status=200,
endpoint_group_id=5)
def _test_add_endpoint_group_to_project(self, bytes_body=False):
self.check_service_client_function(
self.client.add_endpoint_group_to_project,
'tempest.lib.common.rest_client.RestClient.put',
{},
bytes_body,
status=204,
endpoint_group_id=5,
project_id=6)
def _test_show_endpoint_group_for_project(self, bytes_body=False):
self.check_service_client_function(
self.client.show_endpoint_group_for_project,
'tempest.lib.common.rest_client.RestClient.get',
self.FAKE_PROJECT_INFO,
bytes_body,
endpoint_group_id=5,
project_id=6)
def test_add_endpoint_to_project_with_str_body(self): def test_add_endpoint_to_project_with_str_body(self):
self._test_add_endpoint_to_project() self._test_add_endpoint_to_project()
@ -163,3 +239,43 @@ class TestEndPointsFilterClient(base.BaseServiceTest):
def test_delete_endpoint_from_project(self): def test_delete_endpoint_from_project(self):
self._test_delete_endpoint_from_project() self._test_delete_endpoint_from_project()
def test_list_endpoint_groups_for_project_with_str_body(self):
self._test_list_endpoint_groups_for_project()
def test_list_endpoint_groups_for_project_with_bytes_body(self):
self._test_list_endpoint_groups_for_project(bytes_body=True)
def test_list_projects_for_endpoint_group_with_str_body(self):
self._test_list_projects_for_endpoint_group()
def test_list_projects_for_endpoint_group_with_bytes_body(self):
self._test_list_projects_for_endpoint_group(bytes_body=True)
def test_list_endpoints_for_endpoint_group_with_str_body(self):
self._test_list_endpoints_for_endpoint_group()
def test_list_endpoints_for_endpoint_group_with_bytes_body(self):
self._test_list_endpoints_for_endpoint_group(bytes_body=True)
def test_add_endpoint_group_to_project_with_str_body(self):
self._test_add_endpoint_group_to_project()
def test_add_endpoint_group_to_project_with_bytes_body(self):
self._test_add_endpoint_group_to_project(bytes_body=True)
def test_show_endpoint_group_for_project_with_str_body(self):
self._test_show_endpoint_group_for_project()
def test_show_endpoint_group_for_project_with_bytes_body(self):
self._test_show_endpoint_group_for_project(bytes_body=True)
def test_delete_endpoint_group_from_project(self):
self.check_service_client_function(
self.client.delete_endpoint_group_from_project,
'tempest.lib.common.rest_client.RestClient.delete',
{},
False,
status=204,
endpoint_group_id=5,
project_id=5)

View File

@ -44,6 +44,34 @@ class TestPoliciesClient(base.BaseServiceTest):
} }
} }
FAKE_ENDPOINT_INFO = {
"endpoints": [
{
"id": "1",
"interface": "public",
"links": {
"self": "http://example.com/identity/v3/endpoints/1"
},
"region": "north",
"service_id": "9242e05f0c23467bbd1cf1f7a6e5e596",
"url": "http://example.com/identity/"
},
{
"id": "1",
"interface": "internal",
"links": {
"self": "http://example.com/identity/v3/endpoints/1"
},
"region": "south",
"service_id": "9242e05f0c23467bbd1cf1f7a6e5e596",
"url": "http://example.com/identity/"
}
],
"links": {
"self": "http://exmp.com/identity/v3/OS-ENDPOINT-POLICY/policies/1"
}
}
FAKE_LIST_POLICIES = { FAKE_LIST_POLICIES = {
"links": { "links": {
"next": None, "next": None,
@ -238,3 +266,33 @@ class TestPoliciesClient(base.BaseServiceTest):
service_id=self.FAKE_SERVICE_ID, service_id=self.FAKE_SERVICE_ID,
region_id=self.FAKE_REGION_ID, region_id=self.FAKE_REGION_ID,
status=204) status=204)
def _test_list_endpoints_for_policy(self, bytes_body=False):
self.check_service_client_function(
self.client.list_endpoints_for_policy,
'tempest.lib.common.rest_client.RestClient.get',
self.FAKE_ENDPOINT_INFO,
bytes_body,
policy_id=self.FAKE_POLICY_ID,
status=200)
def test_list_endpoints_for_policy_with_str_body(self):
self._test_list_endpoints_for_policy()
def test_list_endpoints_for_policy_with_bytes_body(self):
self._test_list_endpoints_for_policy(bytes_body=True)
def _test_list_policy_for_endpoint(self, bytes_body=False):
self.check_service_client_function(
self.client.show_policy_for_endpoint,
'tempest.lib.common.rest_client.RestClient.get',
self.FAKE_POLICY_INFO,
bytes_body,
endpoint_id=self.FAKE_ENDPOINT_ID,
status=200)
def test_list_policy_for_endpoint_with_str_body(self):
self._test_list_policy_for_endpoint()
def test_list_policy_for_endpoint_with_bytes_body(self):
self._test_list_policy_for_endpoint(bytes_body=True)