Skip to content

Commit 5490654

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Refactor ServerTests and ServerEventTests functional test classes"
2 parents 6d33798 + 498d416 commit 5490654

3 files changed

Lines changed: 156 additions & 135 deletions

File tree

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
2+
# not use this file except in compliance with the License. You may obtain
3+
# a copy of the License at
4+
#
5+
# http://www.apache.org/licenses/LICENSE-2.0
6+
#
7+
# Unless required by applicable law or agreed to in writing, software
8+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10+
# License for the specific language governing permissions and limitations
11+
# under the License.
12+
#
13+
14+
import json
15+
import time
16+
import uuid
17+
18+
from tempest.lib import exceptions
19+
20+
from openstackclient.tests.functional import base
21+
22+
23+
class ComputeTestCase(base.TestCase):
24+
"""Common functional test bits for Compute commands"""
25+
26+
flavor_name = None
27+
image_name = None
28+
network_arg = None
29+
30+
def setUp(self):
31+
"""Select common resources"""
32+
super(ComputeTestCase, self).setUp()
33+
self.flavor_name = self.get_flavor()
34+
self.image_name = self.get_image()
35+
self.network_arg = self.get_network()
36+
37+
@classmethod
38+
def get_flavor(cls):
39+
# NOTE(rtheis): Get cirros256 or m1.tiny flavors since functional
40+
# tests may create other flavors.
41+
flavors = json.loads(cls.openstack(
42+
"flavor list -f json "
43+
))
44+
server_flavor = None
45+
for flavor in flavors:
46+
if flavor['Name'] in ['m1.tiny', 'cirros256']:
47+
server_flavor = flavor['Name']
48+
break
49+
return server_flavor
50+
51+
@classmethod
52+
def get_image(cls):
53+
# NOTE(rtheis): Get first Cirros image since functional tests may
54+
# create other images. Image may be named '-uec' or
55+
# '-disk'.
56+
images = json.loads(cls.openstack(
57+
"image list -f json "
58+
))
59+
server_image = None
60+
for image in images:
61+
if (image['Name'].startswith('cirros-') and
62+
(image['Name'].endswith('-uec') or
63+
image['Name'].endswith('-disk'))):
64+
server_image = image['Name']
65+
break
66+
return server_image
67+
68+
@classmethod
69+
def get_network(cls):
70+
try:
71+
# NOTE(rtheis): Get private network since functional tests may
72+
# create other networks.
73+
cmd_output = json.loads(cls.openstack(
74+
'network show private -f json'
75+
))
76+
except exceptions.CommandFailed:
77+
return ''
78+
return '--nic net-id=' + cmd_output['id']
79+
80+
def server_create(self, name=None, cleanup=True):
81+
"""Create server, with cleanup"""
82+
if not self.flavor_name:
83+
self.flavor_name = self.get_flavor()
84+
if not self.image_name:
85+
self.image_name = self.get_image()
86+
if not self.network_arg:
87+
self.network_arg = self.get_network()
88+
name = name or uuid.uuid4().hex
89+
cmd_output = json.loads(self.openstack(
90+
'server create -f json ' +
91+
'--flavor ' + self.flavor_name + ' ' +
92+
'--image ' + self.image_name + ' ' +
93+
self.network_arg + ' ' +
94+
'--wait ' +
95+
name
96+
))
97+
self.assertIsNotNone(cmd_output["id"])
98+
self.assertEqual(
99+
name,
100+
cmd_output["name"],
101+
)
102+
if cleanup:
103+
self.addCleanup(self.server_delete, name)
104+
return cmd_output
105+
106+
def server_delete(self, name):
107+
"""Delete server by name"""
108+
raw_output = self.openstack('server delete ' + name)
109+
self.assertOutput('', raw_output)
110+
111+
def wait_for_status(
112+
self,
113+
name,
114+
expected_status='ACTIVE',
115+
wait=900,
116+
interval=10,
117+
):
118+
"""Wait until server reaches expected status"""
119+
# TODO(thowe): Add a server wait command to osc
120+
failures = ['ERROR']
121+
total_sleep = 0
122+
while total_sleep < wait:
123+
cmd_output = json.loads(self.openstack(
124+
'server show -f json ' +
125+
name
126+
))
127+
status = cmd_output['status']
128+
print('Waiting for {}, current status: {}'.format(
129+
expected_status,
130+
status,
131+
))
132+
if status == expected_status:
133+
break
134+
self.assertNotIn(status, failures)
135+
time.sleep(interval)
136+
total_sleep += interval
137+
138+
cmd_output = json.loads(self.openstack(
139+
'server show -f json ' +
140+
name
141+
))
142+
status = cmd_output['status']
143+
self.assertEqual(status, expected_status)
144+
# give it a little bit more time
145+
time.sleep(5)

openstackclient/tests/functional/compute/v2/test_server.py

Lines changed: 3 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -11,91 +11,16 @@
1111
# under the License.
1212

1313
import json
14-
import time
1514
import uuid
1615

1716
from tempest.lib import exceptions
1817

19-
from openstackclient.tests.functional import base
18+
from openstackclient.tests.functional.compute.v2 import common
2019
from openstackclient.tests.functional.volume.v2 import test_volume
2120

2221

23-
class ServerTests(base.TestCase):
24-
"""Functional tests for openstack server commands."""
25-
26-
@classmethod
27-
def get_flavor(cls):
28-
# NOTE(rtheis): Get cirros256 or m1.tiny flavors since functional
29-
# tests may create other flavors.
30-
flavors = json.loads(cls.openstack(
31-
"flavor list -f json "
32-
))
33-
server_flavor = None
34-
for flavor in flavors:
35-
if flavor['Name'] in ['m1.tiny', 'cirros256']:
36-
server_flavor = flavor['Name']
37-
break
38-
return server_flavor
39-
40-
@classmethod
41-
def get_image(cls):
42-
# NOTE(rtheis): Get first Cirros image since functional tests may
43-
# create other images. Image may be named '-uec' or
44-
# '-disk'.
45-
images = json.loads(cls.openstack(
46-
"image list -f json "
47-
))
48-
server_image = None
49-
for image in images:
50-
if (image['Name'].startswith('cirros-') and
51-
(image['Name'].endswith('-uec') or
52-
image['Name'].endswith('-disk'))):
53-
server_image = image['Name']
54-
break
55-
return server_image
56-
57-
@classmethod
58-
def get_network(cls):
59-
try:
60-
# NOTE(rtheis): Get private network since functional tests may
61-
# create other networks.
62-
cmd_output = json.loads(cls.openstack(
63-
'network show private -f json'
64-
))
65-
except exceptions.CommandFailed:
66-
return ''
67-
return '--nic net-id=' + cmd_output['id']
68-
69-
def server_create(self, name=None):
70-
"""Create server, with cleanup"""
71-
name = name or uuid.uuid4().hex
72-
cmd_output = json.loads(self.openstack(
73-
'server create -f json ' +
74-
'--flavor ' + self.flavor_name + ' ' +
75-
'--image ' + self.image_name + ' ' +
76-
self.network_arg + ' ' +
77-
'--wait ' +
78-
name
79-
))
80-
if not cmd_output:
81-
self.fail('Server has not been created!')
82-
self.addCleanup(self.server_delete, name)
83-
self.assertEqual(
84-
name,
85-
cmd_output["name"],
86-
)
87-
return cmd_output
88-
89-
def server_delete(self, name):
90-
"""Delete server by name"""
91-
self.openstack('server delete ' + name)
92-
93-
def setUp(self):
94-
"""Select common resources"""
95-
super(ServerTests, self).setUp()
96-
self.flavor_name = self.get_flavor()
97-
self.image_name = self.get_image()
98-
self.network_arg = self.get_network()
22+
class ServerTests(common.ComputeTestCase):
23+
"""Functional tests for openstack server commands"""
9924

10025
def test_server_list(self):
10126
"""Test server list, set"""
@@ -480,39 +405,3 @@ def test_server_create_with_empty_network_option_latest(self):
480405
e.stderr)
481406
else:
482407
self.fail('CommandFailed should be raised.')
483-
484-
def wait_for_status(
485-
self,
486-
name,
487-
expected_status='ACTIVE',
488-
wait=900,
489-
interval=10,
490-
):
491-
"""Wait until server reaches expected status."""
492-
# TODO(thowe): Add a server wait command to osc
493-
failures = ['ERROR']
494-
total_sleep = 0
495-
while total_sleep < wait:
496-
cmd_output = json.loads(self.openstack(
497-
'server show -f json ' +
498-
name
499-
))
500-
status = cmd_output['status']
501-
print('Waiting for {}, current status: {}'.format(
502-
expected_status,
503-
status,
504-
))
505-
if status == expected_status:
506-
break
507-
self.assertNotIn(status, failures)
508-
time.sleep(interval)
509-
total_sleep += interval
510-
511-
cmd_output = json.loads(self.openstack(
512-
'server show -f json ' +
513-
name
514-
))
515-
status = cmd_output['status']
516-
self.assertEqual(status, expected_status)
517-
# give it a little bit more time
518-
time.sleep(5)

openstackclient/tests/functional/compute/v2/test_server_event.py

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,34 +14,21 @@
1414
#
1515

1616
import json
17-
import uuid
1817

19-
from openstackclient.tests.functional import base
20-
from openstackclient.tests.functional.compute.v2 import test_server
18+
from openstackclient.tests.functional.compute.v2 import common
2119

2220

23-
class ServerEventTests(base.TestCase):
24-
"""Functional tests for server event."""
21+
class ServerEventTests(common.ComputeTestCase):
22+
"""Functional tests for server event"""
2523

2624
def setUp(self):
2725
super(ServerEventTests, self).setUp()
28-
_flavor = test_server.ServerTests.get_flavor()
29-
_image = test_server.ServerTests.get_image()
30-
_network = test_server.ServerTests.get_network()
31-
self.server_name = uuid.uuid4().hex
32-
cmd_output = json.loads(self.openstack(
33-
'server create -f json ' +
34-
'--flavor ' + _flavor + ' ' +
35-
'--image ' + _image + ' ' +
36-
_network + ' ' +
37-
'--wait ' +
38-
self.server_name
39-
))
40-
if not cmd_output:
41-
self.fail('Server has not been created!')
42-
self.addCleanup(self.openstack, 'server delete ' + self.server_name)
43-
self.assertEqual(self.server_name, cmd_output['name'])
26+
27+
# NOTE(dtroyer): As long as these tests are read-only we can get away
28+
# with using the same server instance for all of them.
29+
cmd_output = self.server_create()
4430
self.server_id = cmd_output.get('id')
31+
self.server_name = cmd_output['name']
4532

4633
def test_server_event_list_and_show(self):
4734
"""Test list, show server event"""

0 commit comments

Comments
 (0)