summaryrefslogtreecommitdiff
path: root/openstackclient/tests/functional
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient/tests/functional')
-rw-r--r--openstackclient/tests/functional/compute/v2/common.py145
-rw-r--r--openstackclient/tests/functional/compute/v2/test_server.py117
-rw-r--r--openstackclient/tests/functional/compute/v2/test_server_event.py29
-rw-r--r--openstackclient/tests/functional/network/v2/test_ip_availability.py37
-rw-r--r--openstackclient/tests/functional/network/v2/test_router.py17
-rw-r--r--openstackclient/tests/functional/network/v2/test_subnet.py33
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