diff --git a/tempest_lib/api_schema/response/compute/v2_1/tenant_usages.py b/tempest_lib/api_schema/response/compute/v2_1/tenant_usages.py new file mode 100644 index 0000000..d51ef12 --- /dev/null +++ b/tempest_lib/api_schema/response/compute/v2_1/tenant_usages.py @@ -0,0 +1,92 @@ +# 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 + +_server_usages = { + 'type': 'array', + 'items': { + 'type': 'object', + 'properties': { + 'ended_at': { + 'oneOf': [ + {'type': 'string'}, + {'type': 'null'} + ] + }, + 'flavor': {'type': 'string'}, + 'hours': {'type': 'number'}, + 'instance_id': {'type': 'string'}, + 'local_gb': {'type': 'integer'}, + 'memory_mb': {'type': 'integer'}, + 'name': {'type': 'string'}, + 'started_at': {'type': 'string'}, + 'state': {'type': 'string'}, + 'tenant_id': {'type': 'string'}, + 'uptime': {'type': 'integer'}, + 'vcpus': {'type': 'integer'}, + }, + 'required': ['ended_at', 'flavor', 'hours', 'instance_id', 'local_gb', + 'memory_mb', 'name', 'started_at', 'state', 'tenant_id', + 'uptime', 'vcpus'] + } +} + +_tenant_usage_list = { + 'type': 'object', + 'properties': { + 'server_usages': _server_usages, + 'start': {'type': 'string'}, + 'stop': {'type': 'string'}, + 'tenant_id': {'type': 'string'}, + 'total_hours': {'type': 'number'}, + 'total_local_gb_usage': {'type': 'number'}, + 'total_memory_mb_usage': {'type': 'number'}, + 'total_vcpus_usage': {'type': 'number'}, + }, + 'required': ['start', 'stop', 'tenant_id', + 'total_hours', 'total_local_gb_usage', + 'total_memory_mb_usage', 'total_vcpus_usage'] +} + +# 'required' of get_tenant is different from list_tenant's. +_tenant_usage_get = copy.deepcopy(_tenant_usage_list) +_tenant_usage_get['required'] = ['server_usages', 'start', 'stop', 'tenant_id', + 'total_hours', 'total_local_gb_usage', + 'total_memory_mb_usage', 'total_vcpus_usage'] + +list_tenant_usage = { + 'status_code': [200], + 'response_body': { + 'type': 'object', + 'properties': { + 'tenant_usages': { + 'type': 'array', + 'items': _tenant_usage_list + } + }, + 'required': ['tenant_usages'] + } +} + +get_tenant_usage = { + 'status_code': [200], + 'response_body': { + 'type': 'object', + 'properties': { + 'tenant_usage': _tenant_usage_get + }, + 'required': ['tenant_usage'] + } +} diff --git a/tempest_lib/services/compute/tenant_usages_client.py b/tempest_lib/services/compute/tenant_usages_client.py new file mode 100644 index 0000000..70df4d0 --- /dev/null +++ b/tempest_lib/services/compute/tenant_usages_client.py @@ -0,0 +1,43 @@ +# 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 six.moves.urllib import parse as urllib + +from tempest_lib.api_schema.response.compute.v2_1 import tenant_usages +from tempest_lib.common import rest_client + + +class TenantUsagesClient(rest_client.RestClient): + + def list_tenant_usages(self, **params): + url = 'os-simple-tenant-usage' + if params: + url += '?%s' % urllib.urlencode(params) + + resp, body = self.get(url) + body = json.loads(body) + self.validate_response(tenant_usages.list_tenant_usage, resp, body) + return rest_client.ResponseBody(resp, body) + + def show_tenant_usage(self, tenant_id, **params): + url = 'os-simple-tenant-usage/%s' % tenant_id + if params: + url += '?%s' % urllib.urlencode(params) + + resp, body = self.get(url) + body = json.loads(body) + self.validate_response(tenant_usages.get_tenant_usage, resp, body) + return rest_client.ResponseBody(resp, body) diff --git a/tempest_lib/tests/services/compute/test_tenant_usages_client.py b/tempest_lib/tests/services/compute/test_tenant_usages_client.py new file mode 100644 index 0000000..9ccb392 --- /dev/null +++ b/tempest_lib/tests/services/compute/test_tenant_usages_client.py @@ -0,0 +1,79 @@ +# 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 tenant_usages_client +from tempest_lib.tests import fake_auth_provider +from tempest_lib.tests.services.compute import base + + +class TestTenantUsagesClient(base.BaseComputeServiceTest): + + FAKE_SERVER_USAGES = [{ + "ended_at": None, + "flavor": "m1.tiny", + "hours": 1.0, + "instance_id": "1f1deceb-17b5-4c04-84c7-e0d4499c8fe0", + "local_gb": 1, + "memory_mb": 512, + "name": "new-server-test", + "started_at": "2012-10-08T20:10:44.541277", + "state": "active", + "tenant_id": "openstack", + "uptime": 3600, + "vcpus": 1 + }] + + FAKE_TENANT_USAGES = [{ + "server_usages": FAKE_SERVER_USAGES, + "start": "2012-10-08T21:10:44.587336", + "stop": "2012-10-08T22:10:44.587336", + "tenant_id": "openstack", + "total_hours": 1, + "total_local_gb_usage": 1, + "total_memory_mb_usage": 512, + "total_vcpus_usage": 1 + }] + + def setUp(self): + super(TestTenantUsagesClient, self).setUp() + fake_auth = fake_auth_provider.FakeAuthProvider() + self.client = tenant_usages_client.TenantUsagesClient( + fake_auth, 'compute', 'regionOne') + + def _test_list_tenant_usages(self, bytes_body=False): + self.check_service_client_function( + self.client.list_tenant_usages, + 'tempest_lib.common.rest_client.RestClient.get', + {"tenant_usages": self.FAKE_TENANT_USAGES}, + to_utf=bytes_body) + + def test_list_tenant_usages_with_str_body(self): + self._test_list_tenant_usages() + + def test_list_tenant_usages_with_bytes_body(self): + self._test_list_tenant_usages(bytes_body=True) + + def _test_show_tenant_usage(self, bytes_body=False): + self.check_service_client_function( + self.client.show_tenant_usage, + 'tempest_lib.common.rest_client.RestClient.get', + {"tenant_usage": self.FAKE_TENANT_USAGES[0]}, + to_utf=bytes_body, + tenant_id='openstack') + + def test_show_tenant_usage_with_str_body(self): + self._test_show_tenant_usage() + + def test_show_tenant_usage_with_bytes_body(self): + self._test_show_tenant_usage(bytes_body=True)