From 81bd0e9e19c30fb2685c744aedbc40c766885a9a Mon Sep 17 00:00:00 2001 From: Ghanshyam Mann Date: Thu, 17 Nov 2022 21:16:58 -0600 Subject: [PATCH] Add test for compute server external event API Adding test as well as the service client for the compute server external event API - https://docs.openstack.org/api-ref/compute/?expanded=run-events-detail#run-events Change-Id: I1c9a99d036de760a15a5725db87ca4e9d6f2263d --- ...ternal-events-client-c86b269b0091077b.yaml | 5 ++ .../admin/test_server_external_events.py | 37 ++++++++++++ tempest/clients.py | 2 + .../compute/v2_1/server_external_events.py | 55 ++++++++++++++++++ tempest/lib/services/compute/__init__.py | 8 ++- .../compute/server_external_events_client.py | 36 ++++++++++++ .../test_server_external_events_client.py | 56 +++++++++++++++++++ 7 files changed, 196 insertions(+), 3 deletions(-) create mode 100644 releasenotes/notes/add-server-external-events-client-c86b269b0091077b.yaml create mode 100644 tempest/api/compute/admin/test_server_external_events.py create mode 100644 tempest/lib/api_schema/response/compute/v2_1/server_external_events.py create mode 100644 tempest/lib/services/compute/server_external_events_client.py create mode 100644 tempest/tests/lib/services/compute/test_server_external_events_client.py diff --git a/releasenotes/notes/add-server-external-events-client-c86b269b0091077b.yaml b/releasenotes/notes/add-server-external-events-client-c86b269b0091077b.yaml new file mode 100644 index 0000000000..2af8e95c91 --- /dev/null +++ b/releasenotes/notes/add-server-external-events-client-c86b269b0091077b.yaml @@ -0,0 +1,5 @@ +--- +features: + - | + The ``server_external_events`` tempest client for compute + Server External Events API is implemented in this release. diff --git a/tempest/api/compute/admin/test_server_external_events.py b/tempest/api/compute/admin/test_server_external_events.py new file mode 100644 index 0000000000..1c5c295f2f --- /dev/null +++ b/tempest/api/compute/admin/test_server_external_events.py @@ -0,0 +1,37 @@ +# Copyright 2022 NEC Corporation. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from tempest.api.compute import base +from tempest.lib import decorators + + +class ServerExternalEventsTest(base.BaseV2ComputeAdminTest): + """Test server external events test""" + + @decorators.idempotent_id('6bbf4723-61d2-4372-af55-7ba27f1c9ba6') + def test_create_server_external_events(self): + """Test create a server and add some external events""" + server_id = self.create_test_server(wait_until='ACTIVE')['id'] + events = [ + { + "name": "network-changed", + "server_uuid": server_id, + } + ] + client = self.os_admin.server_external_events_client + events_resp = client.create_server_external_events( + events=events)['events'][0] + self.assertEqual(server_id, events_resp['server_uuid']) + self.assertEqual('network-changed', events_resp['name']) + self.assertEqual(200, events_resp['code']) diff --git a/tempest/clients.py b/tempest/clients.py index a65c43b7bf..1aa34d0d54 100644 --- a/tempest/clients.py +++ b/tempest/clients.py @@ -144,6 +144,8 @@ class Manager(clients.ServiceClients): self.tenant_networks_client = self.compute.TenantNetworksClient() self.assisted_volume_snapshots_client = ( self.compute.AssistedVolumeSnapshotsClient()) + self.server_external_events_client = ( + self.compute.ServerExternalEventsClient()) # NOTE: The following client needs special timeout values because # the API is a proxy for the other component. diff --git a/tempest/lib/api_schema/response/compute/v2_1/server_external_events.py b/tempest/lib/api_schema/response/compute/v2_1/server_external_events.py new file mode 100644 index 0000000000..2ab69e2aae --- /dev/null +++ b/tempest/lib/api_schema/response/compute/v2_1/server_external_events.py @@ -0,0 +1,55 @@ +# Copyright 2022 NEC Corporation. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +create = { + 'status_code': [200], + 'response_body': { + 'type': 'object', + 'properties': { + 'events': { + 'type': 'array', 'minItems': 1, + 'items': { + 'type': 'object', + 'properties': { + 'server_uuid': { + 'type': 'string', 'format': 'uuid' + }, + 'name': { + 'type': 'string', + 'enum': [ + 'network-changed', + 'network-vif-plugged', + 'network-vif-unplugged', + 'network-vif-deleted' + ], + }, + 'status': { + 'type': 'string', + 'enum': ['failed', 'completed', 'in-progress'], + }, + 'tag': { + 'type': 'string', 'maxLength': 255, + }, + 'code': {'type': 'integer'}, + }, + 'required': [ + 'server_uuid', 'name', 'code'], + 'additionalProperties': False, + }, + }, + }, + 'required': ['events'], + 'additionalProperties': False, + } +} diff --git a/tempest/lib/services/compute/__init__.py b/tempest/lib/services/compute/__init__.py index 8d07a45675..da800af8d6 100644 --- a/tempest/lib/services/compute/__init__.py +++ b/tempest/lib/services/compute/__init__.py @@ -52,6 +52,8 @@ from tempest.lib.services.compute.security_group_rules_client import \ SecurityGroupRulesClient from tempest.lib.services.compute.security_groups_client import \ SecurityGroupsClient +from tempest.lib.services.compute.server_external_events_client \ + import ServerExternalEventsClient from tempest.lib.services.compute.server_groups_client import \ ServerGroupsClient from tempest.lib.services.compute.servers_client import ServersClient @@ -75,6 +77,6 @@ __all__ = ['AgentsClient', 'AggregatesClient', 'AssistedVolumeSnapshotsClient', 'MigrationsClient', 'NetworksClient', 'QuotaClassesClient', 'QuotasClient', 'SecurityGroupDefaultRulesClient', 'SecurityGroupRulesClient', 'SecurityGroupsClient', - 'ServerGroupsClient', 'ServersClient', 'ServicesClient', - 'SnapshotsClient', 'TenantNetworksClient', 'TenantUsagesClient', - 'VersionsClient', 'VolumesClient'] + 'ServerExternalEventsClient', 'ServerGroupsClient', 'ServersClient', + 'ServicesClient', 'SnapshotsClient', 'TenantNetworksClient', + 'TenantUsagesClient', 'VersionsClient', 'VolumesClient'] diff --git a/tempest/lib/services/compute/server_external_events_client.py b/tempest/lib/services/compute/server_external_events_client.py new file mode 100644 index 0000000000..683dce16fd --- /dev/null +++ b/tempest/lib/services/compute/server_external_events_client.py @@ -0,0 +1,36 @@ +# Copyright 2022 NEC Corporation. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from oslo_serialization import jsonutils as json + +from tempest.lib.api_schema.response.compute.v2_1 import \ + server_external_events as schema +from tempest.lib.common import rest_client +from tempest.lib.services.compute import base_compute_client + + +class ServerExternalEventsClient(base_compute_client.BaseComputeClient): + + def create_server_external_events(self, events): + """Create Server External Events. + + For a full list of available parameters, please refer to the official + API reference: + https://docs.openstack.org/api-ref/compute/#run-events + """ + post_body = json.dumps({'events': events}) + resp, body = self.post("os-server-external-events", post_body) + body = json.loads(body) + self.validate_response(schema.create, resp, body) + return rest_client.ResponseBody(resp, body) diff --git a/tempest/tests/lib/services/compute/test_server_external_events_client.py b/tempest/tests/lib/services/compute/test_server_external_events_client.py new file mode 100644 index 0000000000..63922b3a21 --- /dev/null +++ b/tempest/tests/lib/services/compute/test_server_external_events_client.py @@ -0,0 +1,56 @@ +# Copyright 2022 NEC Corporation. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from tempest.lib.services.compute import server_external_events_client +from tempest.tests.lib import fake_auth_provider +from tempest.tests.lib.services import base + + +class TestServerExternalEventsClient(base.BaseServiceTest): + + events = [ + { + "code": 200, + "name": "network-changed", + "server_uuid": "ff1df7b2-6772-45fd-9326-c0a3b05591c2", + "status": "completed", + "tag": "foo" + } + ] + + events_req = [ + { + "name": "network-changed", + "server_uuid": "ff1df7b2-6772-45fd-9326-c0a3b05591c2", + } + ] + + def setUp(self): + super(TestServerExternalEventsClient, self).setUp() + fake_auth = fake_auth_provider.FakeAuthProvider() + self.client = server_external_events_client.ServerExternalEventsClient( + fake_auth, 'compute', 'regionOne') + + def _test_create_server_external_events(self, bytes_body=False): + expected = {"events": self.events} + self.check_service_client_function( + self.client.create_server_external_events, + 'tempest.lib.common.rest_client.RestClient.post', expected, + bytes_body, events=self.events_req) + + def test_create_server_external_events_str_body(self): + self._test_create_server_external_events(bytes_body=False) + + def test_create_server_external_events_byte_body(self): + self._test_create_server_external_events(bytes_body=True)