From 0214849e8cbb5557365138b0d3d400108a8255cf Mon Sep 17 00:00:00 2001 From: Ken'ichi Ohmichi Date: Thu, 17 Sep 2015 02:38:03 +0900 Subject: [PATCH] Migrated availability_zone_client.py from tempest This migrates the above files from tempest. This includes tempest commits: * availability_zone_client.py: I593d09fcae8b7973d5f4232408c91f046022fe99 * test_availability_zone_client.py: I3ad6761651cec5e66012d08e6b63322f53286a5c * api_schema/../availability_zone.py: Ica929c402a3d042ae751302384e68853eb28b405 to see the commit history for these files refer to the above sha1s in the tempest repository Partially implements blueprint migrate-service-clients-to-tempest-lib Change-Id: I573ca2cf2076bd6c3e0cb9e457f1da2a64c211da --- .../compute/v2_1/availability_zone.py | 78 +++++++++++++++++++ .../compute/availability_zone_client.py | 35 +++++++++ .../compute/test_availability_zone_client.py | 51 ++++++++++++ 3 files changed, 164 insertions(+) create mode 100644 tempest_lib/api_schema/response/compute/v2_1/availability_zone.py create mode 100644 tempest_lib/services/compute/availability_zone_client.py create mode 100644 tempest_lib/tests/services/compute/test_availability_zone_client.py diff --git a/tempest_lib/api_schema/response/compute/v2_1/availability_zone.py b/tempest_lib/api_schema/response/compute/v2_1/availability_zone.py new file mode 100644 index 0000000..d9aebce --- /dev/null +++ b/tempest_lib/api_schema/response/compute/v2_1/availability_zone.py @@ -0,0 +1,78 @@ +# Copyright 2014 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. + +import copy + + +base = { + 'status_code': [200], + 'response_body': { + 'type': 'object', + 'properties': { + 'availabilityZoneInfo': { + 'type': 'array', + 'items': { + 'type': 'object', + 'properties': { + 'zoneName': {'type': 'string'}, + 'zoneState': { + 'type': 'object', + 'properties': { + 'available': {'type': 'boolean'} + }, + 'additionalProperties': False, + 'required': ['available'] + }, + # NOTE: Here is the difference between detail and + # non-detail. + 'hosts': {'type': 'null'} + }, + 'additionalProperties': False, + 'required': ['zoneName', 'zoneState', 'hosts'] + } + } + }, + 'additionalProperties': False, + 'required': ['availabilityZoneInfo'] + } +} + +detail = { + 'type': 'object', + 'patternProperties': { + # NOTE: Here is for a hostname + '^[a-zA-Z0-9-_.]+$': { + 'type': 'object', + 'patternProperties': { + # NOTE: Here is for a service name + '^.*$': { + 'type': 'object', + 'properties': { + 'available': {'type': 'boolean'}, + 'active': {'type': 'boolean'}, + 'updated_at': {'type': ['string', 'null']} + }, + 'additionalProperties': False, + 'required': ['available', 'active', 'updated_at'] + } + } + } + } +} + +list_availability_zone_list = copy.deepcopy(base) + +list_availability_zone_list_detail = copy.deepcopy(base) +list_availability_zone_list_detail['response_body']['properties'][ + 'availabilityZoneInfo']['items']['properties']['hosts'] = detail diff --git a/tempest_lib/services/compute/availability_zone_client.py b/tempest_lib/services/compute/availability_zone_client.py new file mode 100644 index 0000000..f03b8ba --- /dev/null +++ b/tempest_lib/services/compute/availability_zone_client.py @@ -0,0 +1,35 @@ +# Copyright 2013 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 availability_zone \ + as schema +from tempest_lib.common import rest_client + + +class AvailabilityZoneClient(rest_client.RestClient): + + def list_availability_zones(self, detail=False): + url = 'os-availability-zone' + schema_list = schema.list_availability_zone_list + if detail: + url += '/detail' + schema_list = schema.list_availability_zone_list_detail + + resp, body = self.get(url) + body = json.loads(body) + self.validate_response(schema_list, resp, body) + return rest_client.ResponseBody(resp, body) diff --git a/tempest_lib/tests/services/compute/test_availability_zone_client.py b/tempest_lib/tests/services/compute/test_availability_zone_client.py new file mode 100644 index 0000000..0a97bbf --- /dev/null +++ b/tempest_lib/tests/services/compute/test_availability_zone_client.py @@ -0,0 +1,51 @@ +# Copyright 2015 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 availability_zone_client +from tempest_lib.tests import fake_auth_provider +from tempest_lib.tests.services.compute import base + + +class TestAvailabilityZoneClient(base.BaseComputeServiceTest): + + FAKE_AVAILABIRITY_ZONE_INFO = { + "availabilityZoneInfo": + [ + { + "zoneState": { + "available": True + }, + "hosts": None, + "zoneName": u'\xf4' + } + ] + } + + def setUp(self): + super(TestAvailabilityZoneClient, self).setUp() + fake_auth = fake_auth_provider.FakeAuthProvider() + self.client = availability_zone_client.AvailabilityZoneClient( + fake_auth, 'compute', 'regionOne') + + def test_list_availability_zones_with_str_body(self): + self.check_service_client_function( + self.client.list_availability_zones, + 'tempest_lib.common.rest_client.RestClient.get', + self.FAKE_AVAILABIRITY_ZONE_INFO) + + def test_list_availability_zones_with_bytes_body(self): + self.check_service_client_function( + self.client.list_availability_zones, + 'tempest_lib.common.rest_client.RestClient.get', + self.FAKE_AVAILABIRITY_ZONE_INFO, to_utf=True)