summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ironic_tempest_plugin/services/baremetal/v1/json/baremetal_client.py26
-rw-r--r--ironic_tempest_plugin/tests/api/admin/base.py6
-rw-r--r--ironic_tempest_plugin/tests/api/admin/test_nodes.py125
3 files changed, 148 insertions, 9 deletions
diff --git a/ironic_tempest_plugin/services/baremetal/v1/json/baremetal_client.py b/ironic_tempest_plugin/services/baremetal/v1/json/baremetal_client.py
index 663ca9c20..40aa1d072 100644
--- a/ironic_tempest_plugin/services/baremetal/v1/json/baremetal_client.py
+++ b/ironic_tempest_plugin/services/baremetal/v1/json/baremetal_client.py
@@ -26,6 +26,11 @@ class BaremetalClient(base.BaremetalClient):
return self._list_request('nodes', **kwargs)
@base.handle_errors
+ def list_nodes_detail(self, **kwargs):
+ """Detailed list of all existing nodes."""
+ return self._list_request('/nodes/detail', **kwargs)
+
+ @base.handle_errors
def list_chassis(self):
"""List all existing chassis."""
return self._list_request('chassis')
@@ -151,12 +156,18 @@ class BaremetalClient(base.BaremetalClient):
:return: A tuple with the server response and the created node.
"""
- node = {'chassis_uuid': chassis_id,
- 'properties': {'cpu_arch': kwargs.get('cpu_arch', 'x86_64'),
- 'cpus': kwargs.get('cpus', 8),
- 'local_gb': kwargs.get('local_gb', 1024),
- 'memory_mb': kwargs.get('memory_mb', 4096)},
- 'driver': kwargs.get('driver', 'fake')}
+ node = {}
+ if kwargs.get('resource_class'):
+ node['resource_class'] = kwargs['resource_class']
+
+ node.update(
+ {'chassis_uuid': chassis_id,
+ 'properties': {'cpu_arch': kwargs.get('cpu_arch', 'x86_64'),
+ 'cpus': kwargs.get('cpus', 8),
+ 'local_gb': kwargs.get('local_gb', 1024),
+ 'memory_mb': kwargs.get('memory_mb', 4096)},
+ 'driver': kwargs.get('driver', 'fake')}
+ )
return self._create_request('nodes', node)
@@ -278,7 +289,8 @@ class BaremetalClient(base.BaremetalClient):
'properties/local_gb',
'properties/memory_mb',
'driver',
- 'instance_uuid')
+ 'instance_uuid',
+ 'resource_class')
if not patch:
patch = self._make_patch(node_attributes, **kwargs)
diff --git a/ironic_tempest_plugin/tests/api/admin/base.py b/ironic_tempest_plugin/tests/api/admin/base.py
index 81b712c7e..9577f83fa 100644
--- a/ironic_tempest_plugin/tests/api/admin/base.py
+++ b/ironic_tempest_plugin/tests/api/admin/base.py
@@ -163,7 +163,7 @@ class BaseBaremetalTest(api_version_utils.BaseMicroversionTest,
@classmethod
@creates('node')
def create_node(cls, chassis_id, cpu_arch='x86', cpus=8, local_gb=10,
- memory_mb=4096):
+ memory_mb=4096, resource_class=None):
"""Wrapper utility for creating test baremetal nodes.
:param chassis_id: The unique identifier of the chassis.
@@ -171,13 +171,15 @@ class BaseBaremetalTest(api_version_utils.BaseMicroversionTest,
:param cpus: Number of CPUs. Default: 8.
:param local_gb: Disk size. Default: 10.
:param memory_mb: Available RAM. Default: 4096.
+ :param resource_class: Node resource class.
:return: A tuple with the server response and the created node.
"""
resp, body = cls.client.create_node(chassis_id, cpu_arch=cpu_arch,
cpus=cpus, local_gb=local_gb,
memory_mb=memory_mb,
- driver=cls.driver)
+ driver=cls.driver,
+ resource_class=resource_class)
return resp, body
diff --git a/ironic_tempest_plugin/tests/api/admin/test_nodes.py b/ironic_tempest_plugin/tests/api/admin/test_nodes.py
index dd7bf915e..7f4482378 100644
--- a/ironic_tempest_plugin/tests/api/admin/test_nodes.py
+++ b/ironic_tempest_plugin/tests/api/admin/test_nodes.py
@@ -16,6 +16,7 @@ from tempest import config
from tempest.lib.common.utils import data_utils
from tempest.lib import decorators
from tempest.lib import exceptions as lib_exc
+from tempest import test
from ironic_tempest_plugin.common import waiters
from ironic_tempest_plugin.tests.api.admin import api_microversion_fixture
@@ -166,6 +167,130 @@ class TestNodes(base.BaseBaremetalTest):
self.assertIn(self.node['uuid'], [n['uuid'] for n in body['nodes']])
+class TestNodesResourceClass(base.BaseBaremetalTest):
+
+ min_microversion = '1.21'
+
+ def setUp(self):
+ super(TestNodesResourceClass, self).setUp()
+ self.useFixture(
+ api_microversion_fixture.APIMicroversionFixture(
+ TestNodesResourceClass.min_microversion)
+ )
+ _, self.chassis = self.create_chassis()
+ self.resource_class = data_utils.rand_name(name='Resource_Class')
+ _, self.node = self.create_node(
+ self.chassis['uuid'], resource_class=self.resource_class)
+
+ @decorators.idempotent_id('2a00340c-8152-4a61-9fc5-0b3cdefec258')
+ def test_create_node_resource_class_long(self):
+ """Create new node with specified longest name of resource class."""
+ res_class_long_name = data_utils.arbitrary_string(80)
+ _, body = self.create_node(
+ self.chassis['uuid'],
+ resource_class=res_class_long_name)
+ self.assertEqual(res_class_long_name, body['resource_class'])
+
+ @decorators.idempotent_id('142db00d-ac0f-415b-8da8-9095fbb561f7')
+ def test_update_node_resource_class(self):
+ """Update existing node with specified resource class."""
+ new_res_class_name = data_utils.rand_name(name='Resource_Class')
+ _, body = self.client.update_node(
+ self.node['uuid'], resource_class=new_res_class_name)
+ _, body = self.client.show_node(self.node['uuid'])
+ self.assertEqual(new_res_class_name, body['resource_class'])
+
+ @decorators.idempotent_id('73e6f7b5-3e51-49ea-af5b-146cd49f40ee')
+ def test_show_node_resource_class(self):
+ """Show resource class field of specified node."""
+ _, body = self.client.show_node(self.node['uuid'])
+ self.assertEqual(self.resource_class, body['resource_class'])
+
+ @decorators.idempotent_id('f2bf4465-280c-4fdc-bbf7-fcf5188befa4')
+ def test_list_nodes_resource_class(self):
+ """List nodes of specified resource class only."""
+ res_class = 'ResClass-{0}'.format(data_utils.rand_uuid())
+ for node in range(3):
+ _, body = self.create_node(
+ self.chassis['uuid'], resource_class=res_class)
+
+ _, body = self.client.list_nodes(resource_class=res_class)
+ self.assertEqual(3, len([i['uuid'] for i in body['nodes']]))
+
+ @decorators.idempotent_id('40733bad-bb79-445e-a094-530a44042995')
+ def test_list_nodes_detail_resource_class(self):
+ """Get detailed nodes list of specified resource class only."""
+ res_class = 'ResClass-{0}'.format(data_utils.rand_uuid())
+ for node in range(3):
+ _, body = self.create_node(
+ self.chassis['uuid'], resource_class=res_class)
+
+ _, body = self.client.list_nodes_detail(resource_class=res_class)
+ self.assertEqual(3, len([i['uuid'] for i in body['nodes']]))
+
+ for node in body['nodes']:
+ self.assertEqual(res_class, node['resource_class'])
+
+ @test.attr(type='negative')
+ @decorators.idempotent_id('e75136d4-0690-48a5-aef3-75040aee73ad')
+ def test_create_node_resource_class_too_long(self):
+ """Try to create a node with too long resource class name."""
+ resource_class = data_utils.arbitrary_string(81)
+ self.assertRaises(lib_exc.BadRequest, self.create_node,
+ self.chassis['uuid'], resource_class=resource_class)
+
+ @test.attr(type='negative')
+ @decorators.idempotent_id('f0aeece4-8671-44ea-a482-b4047fc4cf74')
+ def test_update_node_resource_class_too_long(self):
+ """Try to update a node with too long resource class name."""
+ resource_class = data_utils.arbitrary_string(81)
+ self.assertRaises(lib_exc.BadRequest, self.client.update_node,
+ self.node['uuid'], resource_class=resource_class)
+
+
+class TestNodesResourceClassOldApi(base.BaseBaremetalTest):
+
+ old_microversion = '1.20'
+
+ def setUp(self):
+ super(TestNodesResourceClassOldApi, self).setUp()
+ self.useFixture(
+ api_microversion_fixture.APIMicroversionFixture(
+ TestNodesResourceClassOldApi.old_microversion)
+ )
+ _, self.chassis = self.create_chassis()
+ _, self.node = self.create_node(self.chassis['uuid'])
+
+ @test.attr(type='negative')
+ @decorators.idempotent_id('2c364408-4746-4b3c-9821-20d47b57bdec')
+ def test_create_node_resource_class_old_api(self):
+ """Try to create a node with resource class using older api version."""
+ resource_class = data_utils.arbitrary_string()
+ self.assertRaises(lib_exc.UnexpectedResponseCode, self.create_node,
+ self.chassis['uuid'], resource_class=resource_class)
+
+ @test.attr(type='negative')
+ @decorators.idempotent_id('666f3c1a-4922-4a3d-b6d9-dea7c74d30bc')
+ def test_update_node_resource_class_old_api(self):
+ """Try to update a node with resource class using older api version."""
+ resource_class = data_utils.arbitrary_string()
+ self.assertRaises(lib_exc.UnexpectedResponseCode,
+ self.client.update_node,
+ self.node['uuid'], resource_class=resource_class)
+
+ @test.attr(type='negative')
+ @decorators.idempotent_id('95903480-f16d-4774-8775-6c7f87b27c59')
+ def test_list_nodes_by_resource_class_old_api(self):
+ """Try to list nodes with resource class using older api version."""
+ resource_class = data_utils.arbitrary_string()
+ self.assertRaises(
+ lib_exc.UnexpectedResponseCode,
+ self.client.list_nodes, resource_class=resource_class)
+ self.assertRaises(
+ lib_exc.UnexpectedResponseCode,
+ self.client.list_nodes_detail, resource_class=resource_class)
+
+
class TestNodesVif(base.BaseBaremetalTest):
min_microversion = '1.28'