From ea7c719f2872c49a6a3e8d10aa97fb1e75c093bf Mon Sep 17 00:00:00 2001 From: Rodion Promyshlennikov Date: Fri, 26 Aug 2016 18:21:29 +0300 Subject: [PATCH] Add basic tests for OSC plugin baremetal node commands Add testcases for commands: openstack baremetal node create, openstack baremetal node delete, openstack baremetal node list, openstack baremetal node show, openstack baremetal node set, openstack baremetal node unset. Change-Id: I32d9e33a868f2224d179f3d16de19f62b85d535e Partial-Bug: #1566329 --- ironicclient/tests/functional/osc/__init__.py | 0 .../tests/functional/osc/v1/__init__.py | 0 ironicclient/tests/functional/osc/v1/base.py | 97 ++++++++++++++ .../osc/v1/test_baremetal_node_basic.py | 119 ++++++++++++++++++ test-requirements.txt | 1 + 5 files changed, 217 insertions(+) create mode 100644 ironicclient/tests/functional/osc/__init__.py create mode 100644 ironicclient/tests/functional/osc/v1/__init__.py create mode 100644 ironicclient/tests/functional/osc/v1/base.py create mode 100644 ironicclient/tests/functional/osc/v1/test_baremetal_node_basic.py diff --git a/ironicclient/tests/functional/osc/__init__.py b/ironicclient/tests/functional/osc/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ironicclient/tests/functional/osc/v1/__init__.py b/ironicclient/tests/functional/osc/v1/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ironicclient/tests/functional/osc/v1/base.py b/ironicclient/tests/functional/osc/v1/base.py new file mode 100644 index 000000000..b6b2793e0 --- /dev/null +++ b/ironicclient/tests/functional/osc/v1/base.py @@ -0,0 +1,97 @@ +# 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 json + +from tempest.lib.common.utils import data_utils +from tempest.lib import exceptions + +from ironicclient.tests.functional import base + + +class TestCase(base.FunctionalTestBase): + + def openstack(self, *args, **kwargs): + return self.clients.openstack(*args, **kwargs) + + def get_opts(self, fields=None, output_format='json'): + """Get options for OSC output fields format. + + :param List fields: List of fields to get + :param String output_format: Select output format + :return: String of formatted options + """ + if not fields: + return ' -f {0}'.format(output_format) + return ' -f {0} {1}'.format(output_format, + ' '.join(['-c ' + it for it in fields])) + + def node_create(self, driver='fake', name=None, params=''): + """Create baremetal node and add cleanup. + + :param String driver: Driver for a new node + :param String name: Name for a new node + :param String params: Additional args and kwargs + :return: JSON object of created node + """ + if not name: + name = data_utils.rand_name('baremetal') + + opts = self.get_opts() + output = self.openstack('baremetal node create {0} ' + '--driver {1} --name {2} {3}' + .format(opts, driver, name, params)) + + self.addCleanup(self.node_delete, name, True) + if not output: + self.fail('Baremetal node has not been created!') + + return json.loads(output) + + def node_list(self, fields=None, params=''): + """List baremetal nodes. + + :param List fields: List of fields to show + :param String params: Additional kwargs + :return: list of JSON node objects + """ + opts = self.get_opts(fields=fields) + output = self.openstack('baremetal node list {0} {1}' + .format(opts, params)) + return json.loads(output) + + def node_show(self, identifier, fields=None, params=''): + """Show specified baremetal node. + + :param String identifier: Name or UUID of the node + :param List fields: List of fields to show + :param List params: Additional kwargs + :return: JSON object of node + """ + opts = self.get_opts(fields) + output = self.openstack('baremetal node show {0} {1} {2}' + .format(opts, identifier, params)) + return json.loads(output) + + def node_delete(self, identifier, ignore_exceptions=False): + """Try to delete baremetal node by name or UUID. + + :param String identifier: Name or UUID of the node + :param Bool ignore_exceptions: Ignore exception (needed for cleanUp) + :return: raw values output + """ + try: + return self.openstack('baremetal node delete {0}' + .format(identifier)) + except exceptions.CommandFailed: + if not ignore_exceptions: + raise diff --git a/ironicclient/tests/functional/osc/v1/test_baremetal_node_basic.py b/ironicclient/tests/functional/osc/v1/test_baremetal_node_basic.py new file mode 100644 index 000000000..a2957b196 --- /dev/null +++ b/ironicclient/tests/functional/osc/v1/test_baremetal_node_basic.py @@ -0,0 +1,119 @@ +# Copyright (c) 2016 Mirantis, Inc. +# +# 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 ddt +from tempest.lib.common.utils import data_utils + +from ironicclient.tests.functional.osc.v1 import base + + +@ddt.ddt +class BaremetalNodeTests(base.TestCase): + """Functional tests for baremetal node commands.""" + + def setUp(self): + super(BaremetalNodeTests, self).setUp() + self.node = self.node_create() + + def test_create_name_uuid(self): + """Check baremetal node create command with name and UUID. + + Test steps: + 1) Create baremetal node in setUp. + 2) Create one more baremetal node explicitly + with specified name and UUID. + 3) Check that node successfully created. + """ + uuid = data_utils.rand_uuid() + name = data_utils.rand_name('baremetal-node') + node_info = self.node_create(name=name, + params='--uuid {0}'.format(uuid)) + self.assertEqual(node_info['uuid'], uuid) + self.assertEqual(node_info['name'], name) + self.assertEqual(node_info['driver'], 'fake') + self.assertEqual(node_info['maintenance'], False) + node_list = self.node_list() + self.assertIn(uuid, [x['UUID'] for x in node_list]) + self.assertIn(name, [x['Name'] for x in node_list]) + + @ddt.data('name', 'uuid') + def test_delete(self, key): + """Check baremetal node delete command with name/UUID argument. + + Test steps: + 1) Create baremetal node in setUp. + 2) Delete baremetal node by name/UUID. + 3) Check that node deleted successfully. + """ + output = self.node_delete(self.node[key]) + self.assertIn('Deleted node {0}'.format(self.node[key]), output) + node_list = self.node_list() + self.assertNotIn(self.node['name'], [x['Name'] for x in node_list]) + self.assertNotIn(self.node['uuid'], [x['UUID'] for x in node_list]) + + def test_list(self): + """Check baremetal node list command. + + Test steps: + 1) Create baremetal node in setUp. + 2) List baremetal nodes. + 3) Check node name in nodes list. + """ + node_list = self.node_list() + self.assertIn(self.node['name'], [x['Name'] for x in node_list]) + self.assertIn(self.node['uuid'], [x['UUID'] for x in node_list]) + + @ddt.data('name', 'uuid') + def test_set(self, key): + """Check baremetal node set command calling it by name/UUID. + + Test steps: + 1) Create baremetal node in setUp. + 2) Set another name for node calling it by name/UUID. + 3) Check that baremetal node name was changed. + """ + new_name = data_utils.rand_name('newnodename') + self.openstack('baremetal node set --name {0} {1}' + .format(new_name, self.node[key])) + show_prop = self.node_show(self.node['uuid'], ['name']) + self.assertEqual(new_name, show_prop['name']) + + @ddt.data('name', 'uuid') + def test_unset(self, key): + """Check baremetal node unset command calling it by node name/UUID. + + Test steps: + 1) Create baremetal node in setUp. + 2) Unset name of baremetal node calling it by node name/UUID. + 3) Check that node has no more name. + """ + self.openstack('baremetal node unset --name {0}' + .format(self.node[key])) + show_prop = self.node_show(self.node['uuid'], ['name']) + self.assertIsNone(show_prop['name']) + + @ddt.data('name', 'uuid') + def test_show(self, key): + """Check baremetal node show command with name and UUID arguments. + + Test steps: + 1) Create baremetal node in setUp. + 2) Show baremetal node calling it with name and UUID arguments. + 3) Check name, uuid and driver in node show output. + """ + node = self.node_show(self.node[key], + ['name', 'uuid', 'driver']) + self.assertEqual(self.node['name'], node['name']) + self.assertEqual(self.node['uuid'], node['uuid']) + self.assertEqual(self.node['driver'], node['driver']) diff --git a/test-requirements.txt b/test-requirements.txt index f098a5c81..c7df1ce96 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -16,3 +16,4 @@ sphinx!=1.3b1,<1.4,>=1.2.1 # BSD testtools>=1.4.0 # MIT tempest>=12.1.0 # Apache-2.0 os-testr>=0.8.0 # Apache-2.0 +ddt>=1.0.1 # MIT