From 4599b91fe2a3446dfeec5d7339cfdd40fe5dd4c9 Mon Sep 17 00:00:00 2001 From: Colleen Murphy Date: Fri, 31 Jul 2020 17:13:02 -0700 Subject: [PATCH] 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 --- ...-keystone-ep-clients-eeefd0904fbbe151.yaml | 5 + .../identity/v3/endpoint_filter_client.py | 54 ++++++++ .../services/identity/v3/policies_client.py | 24 ++++ .../v3/test_endpoint_filter_client.py | 116 ++++++++++++++++++ .../identity/v3/test_policies_client.py | 58 +++++++++ 5 files changed, 257 insertions(+) create mode 100644 releasenotes/notes/add-keystone-ep-clients-eeefd0904fbbe151.yaml diff --git a/releasenotes/notes/add-keystone-ep-clients-eeefd0904fbbe151.yaml b/releasenotes/notes/add-keystone-ep-clients-eeefd0904fbbe151.yaml new file mode 100644 index 0000000000..2b407ae574 --- /dev/null +++ b/releasenotes/notes/add-keystone-ep-clients-eeefd0904fbbe151.yaml @@ -0,0 +1,5 @@ +--- +features: + - | + Added missing client methods for keystone's OS-ENDPOINT-POLICY and + OS-EP-FILTER APIs. diff --git a/tempest/lib/services/identity/v3/endpoint_filter_client.py b/tempest/lib/services/identity/v3/endpoint_filter_client.py index ce84869d17..2d5c8c95c4 100644 --- a/tempest/lib/services/identity/v3/endpoint_filter_client.py +++ b/tempest/lib/services/identity/v3/endpoint_filter_client.py @@ -66,3 +66,57 @@ class EndPointsFilterClient(rest_client.RestClient): % (project_id, endpoint_id)) self.expected_success(204, resp.status) 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) diff --git a/tempest/lib/services/identity/v3/policies_client.py b/tempest/lib/services/identity/v3/policies_client.py index 31c0d1830e..41def38f37 100644 --- a/tempest/lib/services/identity/v3/policies_client.py +++ b/tempest/lib/services/identity/v3/policies_client.py @@ -185,3 +185,27 @@ class PoliciesClient(rest_client.RestClient): resp, body = self.delete(url) self.expected_success(204, resp.status) 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) diff --git a/tempest/tests/lib/services/identity/v3/test_endpoint_filter_client.py b/tempest/tests/lib/services/identity/v3/test_endpoint_filter_client.py index 7faf6a02f1..e5f7a660a3 100644 --- a/tempest/tests/lib/services/identity/v3/test_endpoint_filter_client.py +++ b/tempest/tests/lib/services/identity/v3/test_endpoint_filter_client.py @@ -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): super(TestEndPointsFilterClient, self).setUp() fake_auth = fake_auth_provider.FakeAuthProvider() @@ -137,6 +167,52 @@ class TestEndPointsFilterClient(base.BaseServiceTest): project_id=3, 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): self._test_add_endpoint_to_project() @@ -163,3 +239,43 @@ class TestEndPointsFilterClient(base.BaseServiceTest): def test_delete_endpoint_from_project(self): 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) diff --git a/tempest/tests/lib/services/identity/v3/test_policies_client.py b/tempest/tests/lib/services/identity/v3/test_policies_client.py index 0237475609..4fc800a431 100644 --- a/tempest/tests/lib/services/identity/v3/test_policies_client.py +++ b/tempest/tests/lib/services/identity/v3/test_policies_client.py @@ -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 = { "links": { "next": None, @@ -238,3 +266,33 @@ class TestPoliciesClient(base.BaseServiceTest): service_id=self.FAKE_SERVICE_ID, region_id=self.FAKE_REGION_ID, 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)