diff --git a/tempest_lib/api_schema/response/compute/v2_1/baremetal_nodes.py b/tempest_lib/api_schema/response/compute/v2_1/baremetal_nodes.py new file mode 100644 index 0000000..d1ee877 --- /dev/null +++ b/tempest_lib/api_schema/response/compute/v2_1/baremetal_nodes.py @@ -0,0 +1,63 @@ +# 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. + +import copy + +node = { + 'type': 'object', + 'properties': { + 'id': {'type': 'string'}, + 'interfaces': {'type': 'array'}, + 'host': {'type': 'string'}, + 'task_state': {'type': ['string', 'null']}, + 'cpus': {'type': ['integer', 'string']}, + 'memory_mb': {'type': ['integer', 'string']}, + 'disk_gb': {'type': ['integer', 'string']}, + }, + 'additionalProperties': False, + 'required': ['id', 'interfaces', 'host', 'task_state', 'cpus', 'memory_mb', + 'disk_gb'] +} + +list_baremetal_nodes = { + 'status_code': [200], + 'response_body': { + 'type': 'object', + 'properties': { + 'nodes': { + 'type': 'array', + 'items': node + } + }, + 'additionalProperties': False, + 'required': ['nodes'] + } +} + +baremetal_node = { + 'status_code': [200], + 'response_body': { + 'type': 'object', + 'properties': { + 'node': node + }, + 'additionalProperties': False, + 'required': ['node'] + } +} +get_baremetal_node = copy.deepcopy(baremetal_node) +get_baremetal_node['response_body']['properties']['node'][ + 'properties'].update({'instance_uuid': {'type': ['string', 'null']}}) +get_baremetal_node['response_body']['properties']['node'][ + 'required'].append('instance_uuid') diff --git a/tempest_lib/services/compute/baremetal_nodes_client.py b/tempest_lib/services/compute/baremetal_nodes_client.py new file mode 100644 index 0000000..4434698 --- /dev/null +++ b/tempest_lib/services/compute/baremetal_nodes_client.py @@ -0,0 +1,42 @@ +# 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 oslo_serialization import jsonutils as json +from six.moves.urllib import parse as urllib + +from tempest_lib.api_schema.response.compute.v2_1 import baremetal_nodes \ + as schema +from tempest_lib.common import rest_client + + +class BaremetalNodesClient(rest_client.RestClient): + """Tests Baremetal API""" + + def list_baremetal_nodes(self, **params): + """List all baremetal nodes.""" + url = 'os-baremetal-nodes' + if params: + url += '?%s' % urllib.urlencode(params) + resp, body = self.get(url) + body = json.loads(body) + self.validate_response(schema.list_baremetal_nodes, resp, body) + return rest_client.ResponseBody(resp, body) + + def show_baremetal_node(self, baremetal_node_id): + """Returns the details of a single baremetal node.""" + url = 'os-baremetal-nodes/%s' % baremetal_node_id + resp, body = self.get(url) + body = json.loads(body) + self.validate_response(schema.get_baremetal_node, resp, body) + return rest_client.ResponseBody(resp, body) diff --git a/tempest_lib/tests/services/compute/test_baremetal_nodes_client.py b/tempest_lib/tests/services/compute/test_baremetal_nodes_client.py new file mode 100644 index 0000000..0844fef --- /dev/null +++ b/tempest_lib/tests/services/compute/test_baremetal_nodes_client.py @@ -0,0 +1,74 @@ +# 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. + +import copy + +from tempest_lib.services.compute import baremetal_nodes_client +from tempest_lib.tests import fake_auth_provider +from tempest_lib.tests.services.compute import base + + +class TestBareMetalNodesClient(base.BaseComputeServiceTest): + + FAKE_NODE_INFO = {'cpus': '8', + 'disk_gb': '64', + 'host': '10.0.2.15', + 'id': 'Identifier', + 'instance_uuid': "null", + 'interfaces': [ + { + "address": "20::01", + "datapath_id": "null", + "id": 1, + "port_no": None + } + ], + 'memory_mb': '8192', + 'task_state': None} + + def setUp(self): + super(TestBareMetalNodesClient, self).setUp() + fake_auth = fake_auth_provider.FakeAuthProvider() + self.baremetal_nodes_client = (baremetal_nodes_client. + BaremetalNodesClient + (fake_auth, 'compute', + 'regionOne')) + + def _test_bareMetal_nodes(self, operation='list', bytes_body=False): + if operation != 'list': + expected = {"node": self.FAKE_NODE_INFO} + function = self.baremetal_nodes_client.show_baremetal_node + else: + node_info = copy.deepcopy(self.FAKE_NODE_INFO) + del node_info['instance_uuid'] + expected = {"nodes": [node_info]} + function = self.baremetal_nodes_client.list_baremetal_nodes + + self.check_service_client_function( + function, + 'tempest_lib.common.rest_client.RestClient.get', + expected, bytes_body, 200, + baremetal_node_id='Identifier') + + def test_list_bareMetal_nodes_with_str_body(self): + self._test_bareMetal_nodes() + + def test_list_bareMetal_nodes_with_bytes_body(self): + self._test_bareMetal_nodes(bytes_body=True) + + def test_show_bareMetal_node_with_str_body(self): + self._test_bareMetal_nodes('show') + + def test_show_bareMetal_node_with_bytes_body(self): + self._test_bareMetal_nodes('show', True)