diff options
Diffstat (limited to 'openstackclient/tests/functional')
6 files changed, 205 insertions, 173 deletions
diff --git a/openstackclient/tests/functional/compute/v2/common.py b/openstackclient/tests/functional/compute/v2/common.py new file mode 100644 index 00000000..99d87bb4 --- /dev/null +++ b/openstackclient/tests/functional/compute/v2/common.py @@ -0,0 +1,145 @@ +# 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 +import time +import uuid + +from tempest.lib import exceptions + +from openstackclient.tests.functional import base + + +class ComputeTestCase(base.TestCase): + """Common functional test bits for Compute commands""" + + flavor_name = None + image_name = None + network_arg = None + + def setUp(self): + """Select common resources""" + super(ComputeTestCase, self).setUp() + self.flavor_name = self.get_flavor() + self.image_name = self.get_image() + self.network_arg = self.get_network() + + @classmethod + def get_flavor(cls): + # NOTE(rtheis): Get cirros256 or m1.tiny flavors since functional + # tests may create other flavors. + flavors = json.loads(cls.openstack( + "flavor list -f json " + )) + server_flavor = None + for flavor in flavors: + if flavor['Name'] in ['m1.tiny', 'cirros256']: + server_flavor = flavor['Name'] + break + return server_flavor + + @classmethod + def get_image(cls): + # NOTE(rtheis): Get first Cirros image since functional tests may + # create other images. Image may be named '-uec' or + # '-disk'. + images = json.loads(cls.openstack( + "image list -f json " + )) + server_image = None + for image in images: + if (image['Name'].startswith('cirros-') and + (image['Name'].endswith('-uec') or + image['Name'].endswith('-disk'))): + server_image = image['Name'] + break + return server_image + + @classmethod + def get_network(cls): + try: + # NOTE(rtheis): Get private network since functional tests may + # create other networks. + cmd_output = json.loads(cls.openstack( + 'network show private -f json' + )) + except exceptions.CommandFailed: + return '' + return '--nic net-id=' + cmd_output['id'] + + def server_create(self, name=None, cleanup=True): + """Create server, with cleanup""" + if not self.flavor_name: + self.flavor_name = self.get_flavor() + if not self.image_name: + self.image_name = self.get_image() + if not self.network_arg: + self.network_arg = self.get_network() + name = name or uuid.uuid4().hex + cmd_output = json.loads(self.openstack( + 'server create -f json ' + + '--flavor ' + self.flavor_name + ' ' + + '--image ' + self.image_name + ' ' + + self.network_arg + ' ' + + '--wait ' + + name + )) + self.assertIsNotNone(cmd_output["id"]) + self.assertEqual( + name, + cmd_output["name"], + ) + if cleanup: + self.addCleanup(self.server_delete, name) + return cmd_output + + def server_delete(self, name): + """Delete server by name""" + raw_output = self.openstack('server delete ' + name) + self.assertOutput('', raw_output) + + def wait_for_status( + self, + name, + expected_status='ACTIVE', + wait=900, + interval=10, + ): + """Wait until server reaches expected status""" + # TODO(thowe): Add a server wait command to osc + failures = ['ERROR'] + total_sleep = 0 + while total_sleep < wait: + cmd_output = json.loads(self.openstack( + 'server show -f json ' + + name + )) + status = cmd_output['status'] + print('Waiting for {}, current status: {}'.format( + expected_status, + status, + )) + if status == expected_status: + break + self.assertNotIn(status, failures) + time.sleep(interval) + total_sleep += interval + + cmd_output = json.loads(self.openstack( + 'server show -f json ' + + name + )) + status = cmd_output['status'] + self.assertEqual(status, expected_status) + # give it a little bit more time + time.sleep(5) diff --git a/openstackclient/tests/functional/compute/v2/test_server.py b/openstackclient/tests/functional/compute/v2/test_server.py index 4d8019b2..f152de80 100644 --- a/openstackclient/tests/functional/compute/v2/test_server.py +++ b/openstackclient/tests/functional/compute/v2/test_server.py @@ -11,91 +11,16 @@ # under the License. import json -import time import uuid from tempest.lib import exceptions -from openstackclient.tests.functional import base +from openstackclient.tests.functional.compute.v2 import common from openstackclient.tests.functional.volume.v2 import test_volume -class ServerTests(base.TestCase): - """Functional tests for openstack server commands.""" - - @classmethod - def get_flavor(cls): - # NOTE(rtheis): Get cirros256 or m1.tiny flavors since functional - # tests may create other flavors. - flavors = json.loads(cls.openstack( - "flavor list -f json " - )) - server_flavor = None - for flavor in flavors: - if flavor['Name'] in ['m1.tiny', 'cirros256']: - server_flavor = flavor['Name'] - break - return server_flavor - - @classmethod - def get_image(cls): - # NOTE(rtheis): Get first Cirros image since functional tests may - # create other images. Image may be named '-uec' or - # '-disk'. - images = json.loads(cls.openstack( - "image list -f json " - )) - server_image = None - for image in images: - if (image['Name'].startswith('cirros-') and - (image['Name'].endswith('-uec') or - image['Name'].endswith('-disk'))): - server_image = image['Name'] - break - return server_image - - @classmethod - def get_network(cls): - try: - # NOTE(rtheis): Get private network since functional tests may - # create other networks. - cmd_output = json.loads(cls.openstack( - 'network show private -f json' - )) - except exceptions.CommandFailed: - return '' - return '--nic net-id=' + cmd_output['id'] - - def server_create(self, name=None): - """Create server, with cleanup""" - name = name or uuid.uuid4().hex - cmd_output = json.loads(self.openstack( - 'server create -f json ' + - '--flavor ' + self.flavor_name + ' ' + - '--image ' + self.image_name + ' ' + - self.network_arg + ' ' + - '--wait ' + - name - )) - if not cmd_output: - self.fail('Server has not been created!') - self.addCleanup(self.server_delete, name) - self.assertEqual( - name, - cmd_output["name"], - ) - return cmd_output - - def server_delete(self, name): - """Delete server by name""" - self.openstack('server delete ' + name) - - def setUp(self): - """Select common resources""" - super(ServerTests, self).setUp() - self.flavor_name = self.get_flavor() - self.image_name = self.get_image() - self.network_arg = self.get_network() +class ServerTests(common.ComputeTestCase): + """Functional tests for openstack server commands""" def test_server_list(self): """Test server list, set""" @@ -480,39 +405,3 @@ class ServerTests(base.TestCase): e.stderr) else: self.fail('CommandFailed should be raised.') - - def wait_for_status( - self, - name, - expected_status='ACTIVE', - wait=900, - interval=10, - ): - """Wait until server reaches expected status.""" - # TODO(thowe): Add a server wait command to osc - failures = ['ERROR'] - total_sleep = 0 - while total_sleep < wait: - cmd_output = json.loads(self.openstack( - 'server show -f json ' + - name - )) - status = cmd_output['status'] - print('Waiting for {}, current status: {}'.format( - expected_status, - status, - )) - if status == expected_status: - break - self.assertNotIn(status, failures) - time.sleep(interval) - total_sleep += interval - - cmd_output = json.loads(self.openstack( - 'server show -f json ' + - name - )) - status = cmd_output['status'] - self.assertEqual(status, expected_status) - # give it a little bit more time - time.sleep(5) diff --git a/openstackclient/tests/functional/compute/v2/test_server_event.py b/openstackclient/tests/functional/compute/v2/test_server_event.py index 6be5822f..953ade43 100644 --- a/openstackclient/tests/functional/compute/v2/test_server_event.py +++ b/openstackclient/tests/functional/compute/v2/test_server_event.py @@ -14,34 +14,21 @@ # import json -import uuid -from openstackclient.tests.functional import base -from openstackclient.tests.functional.compute.v2 import test_server +from openstackclient.tests.functional.compute.v2 import common -class ServerEventTests(base.TestCase): - """Functional tests for server event.""" +class ServerEventTests(common.ComputeTestCase): + """Functional tests for server event""" def setUp(self): super(ServerEventTests, self).setUp() - _flavor = test_server.ServerTests.get_flavor() - _image = test_server.ServerTests.get_image() - _network = test_server.ServerTests.get_network() - self.server_name = uuid.uuid4().hex - cmd_output = json.loads(self.openstack( - 'server create -f json ' + - '--flavor ' + _flavor + ' ' + - '--image ' + _image + ' ' + - _network + ' ' + - '--wait ' + - self.server_name - )) - if not cmd_output: - self.fail('Server has not been created!') - self.addCleanup(self.openstack, 'server delete ' + self.server_name) - self.assertEqual(self.server_name, cmd_output['name']) + + # NOTE(dtroyer): As long as these tests are read-only we can get away + # with using the same server instance for all of them. + cmd_output = self.server_create() self.server_id = cmd_output.get('id') + self.server_name = cmd_output['name'] def test_server_event_list_and_show(self): """Test list, show server event""" diff --git a/openstackclient/tests/functional/network/v2/test_ip_availability.py b/openstackclient/tests/functional/network/v2/test_ip_availability.py index b5c908f4..7440f250 100644 --- a/openstackclient/tests/functional/network/v2/test_ip_availability.py +++ b/openstackclient/tests/functional/network/v2/test_ip_availability.py @@ -10,6 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. +import json import uuid from openstackclient.tests.functional import base @@ -17,22 +18,19 @@ from openstackclient.tests.functional import base class IPAvailabilityTests(base.TestCase): """Functional tests for IP availability. """ - NAME = uuid.uuid4().hex - NETWORK_NAME = uuid.uuid4().hex - FIELDS = ['network_name'] @classmethod def setUpClass(cls): # Create a network for the subnet. + cls.NAME = uuid.uuid4().hex + cls.NETWORK_NAME = uuid.uuid4().hex cls.openstack('network create ' + cls.NETWORK_NAME) - opts = cls.get_opts(['name']) - raw_output = cls.openstack( - 'subnet create --network ' + cls.NETWORK_NAME + + cmd_output = json.loads(cls.openstack( + 'subnet create -f json --network ' + cls.NETWORK_NAME + ' --subnet-range 10.10.10.0/24 ' + - cls.NAME + opts - ) - expected = cls.NAME + '\n' - cls.assertOutput(expected, raw_output) + cls.NAME + )) + cls.assertOutput(cls.NAME, cmd_output['name']) @classmethod def tearDownClass(cls): @@ -42,12 +40,17 @@ class IPAvailabilityTests(base.TestCase): cls.assertOutput('', raw_network) def test_ip_availability_list(self): - opts = ' -f csv -c "Network Name"' - raw_output = self.openstack('ip availability list' + opts) - self.assertIn(self.NETWORK_NAME, raw_output) + """Test ip availability list""" + cmd_output = json.loads(self.openstack( + 'ip availability list -f json')) + names = [x['Network Name'] for x in cmd_output] + self.assertIn(self.NETWORK_NAME, names) def test_ip_availability_show(self): - opts = self.get_opts(self.FIELDS) - raw_output = self.openstack( - 'ip availability show ' + self.NETWORK_NAME + opts) - self.assertEqual(self.NETWORK_NAME + "\n", raw_output) + """Test ip availability show""" + cmd_output = json.loads(self.openstack( + 'ip availability show -f json ' + self.NETWORK_NAME)) + self.assertEqual( + self.NETWORK_NAME, + cmd_output['network_name'], + ) diff --git a/openstackclient/tests/functional/network/v2/test_router.py b/openstackclient/tests/functional/network/v2/test_router.py index 443f68b2..aa708e0a 100644 --- a/openstackclient/tests/functional/network/v2/test_router.py +++ b/openstackclient/tests/functional/network/v2/test_router.py @@ -20,7 +20,7 @@ class RouterTests(base.TestCase): """Functional tests for router. """ def test_router_create_and_delete(self): - """Test create options, delete""" + """Test create options, delete multiple""" name1 = uuid.uuid4().hex name2 = uuid.uuid4().hex cmd_output = json.loads(self.openstack( @@ -75,6 +75,8 @@ class RouterTests(base.TestCase): '--disable ' + name1 )) + + self.addCleanup(self.openstack, 'router delete ' + name1) self.assertEqual( name1, cmd_output["name"], @@ -92,6 +94,8 @@ class RouterTests(base.TestCase): '--project ' + demo_project_id + ' ' + name2 )) + + self.addCleanup(self.openstack, 'router delete ' + name2) self.assertEqual( name2, cmd_output["name"], @@ -141,12 +145,8 @@ class RouterTests(base.TestCase): self.assertIn(name1, names) self.assertIn(name2, names) - del_output = self.openstack( - 'router delete ' + name1 + ' ' + name2) - self.assertOutput('', del_output) - def test_router_set_show_unset(self): - """Tests create router, set, unset, show, delete""" + """Tests create router, set, unset, show""" name = uuid.uuid4().hex new_name = name + "_" @@ -155,6 +155,7 @@ class RouterTests(base.TestCase): '--description aaaa ' + name )) + self.addCleanup(self.openstack, 'router delete ' + new_name) self.assertEqual( name, cmd_output["name"], @@ -221,7 +222,3 @@ class RouterTests(base.TestCase): new_name )) self.assertIsNone(cmd_output["external_gateway_info"]) - - del_output = self.openstack( - 'router delete ' + new_name) - self.assertOutput('', del_output) diff --git a/openstackclient/tests/functional/network/v2/test_subnet.py b/openstackclient/tests/functional/network/v2/test_subnet.py index 995a4979..61cffcde 100644 --- a/openstackclient/tests/functional/network/v2/test_subnet.py +++ b/openstackclient/tests/functional/network/v2/test_subnet.py @@ -37,7 +37,7 @@ class SubnetTests(base.TestCase): cls.assertOutput('', raw_output) def test_subnet_create_and_delete(self): - """Test create, delete""" + """Test create, delete multiple""" name1 = uuid.uuid4().hex cmd = ('subnet create -f json --network ' + self.NETWORK_NAME + @@ -51,9 +51,22 @@ class SubnetTests(base.TestCase): self.NETWORK_ID, cmd_output["network_id"], ) + name2 = uuid.uuid4().hex + cmd = ('subnet create -f json --network ' + + self.NETWORK_NAME + + ' --subnet-range') + cmd_output = self._subnet_create(cmd, name2) + self.assertEqual( + name2, + cmd_output["name"], + ) + self.assertEqual( + self.NETWORK_ID, + cmd_output["network_id"], + ) del_output = self.openstack( - 'subnet delete ' + name1) + 'subnet delete ' + name1 + ' ' + name2) self.assertOutput('', del_output) def test_subnet_list(self): @@ -64,6 +77,8 @@ class SubnetTests(base.TestCase): '--network ' + self.NETWORK_NAME + ' --dhcp --subnet-range') cmd_output = self._subnet_create(cmd, name1) + + self.addCleanup(self.openstack, 'subnet delete ' + name1) self.assertEqual( name1, cmd_output["name"], @@ -86,6 +101,8 @@ class SubnetTests(base.TestCase): ' --ip-version 6 --no-dhcp ' + '--subnet-range') cmd_output = self._subnet_create(cmd, name2, is_type_ipv4=False) + + self.addCleanup(self.openstack, 'subnet delete ' + name2) self.assertEqual( name2, cmd_output["name"], @@ -148,12 +165,8 @@ class SubnetTests(base.TestCase): self.assertNotIn(name1, names) self.assertIn(name2, names) - del_output = self.openstack( - 'subnet delete ' + name1 + ' ' + name2) - self.assertOutput('', del_output) - def test_subnet_set_show_unset(self): - """Test create subnet, set, unset, show, delete""" + """Test create subnet, set, unset, show""" name = uuid.uuid4().hex new_name = name + "_" @@ -161,6 +174,8 @@ class SubnetTests(base.TestCase): '--network ' + self.NETWORK_NAME + ' --description aaaa --subnet-range') cmd_output = self._subnet_create(cmd, name) + + self.addCleanup(self.openstack, 'subnet delete ' + new_name) self.assertEqual( name, cmd_output["name"], @@ -224,10 +239,6 @@ class SubnetTests(base.TestCase): cmd_output["service_types"], ) - del_output = self.openstack( - 'subnet delete ' + new_name) - self.assertOutput('', del_output) - def _subnet_create(self, cmd, name, is_type_ipv4=True): # Try random subnet range for subnet creating # Because we can not determine ahead of time what subnets are already |
