Merge "Remove unused imports"
diff --git a/HACKING.rst b/HACKING.rst
index a546f8c..eafa81b 100644
--- a/HACKING.rst
+++ b/HACKING.rst
@@ -153,6 +153,19 @@
kwarg2=dict_of_numbers)
+Test Skips
+----------
+If a test is broken because of a bug it is appropriate to skip the test until
+bug has been fixed. However, the skip message should be formatted so that
+Tempest's skip tracking tool can watch the bug status. The skip message should
+contain the string 'Bug' immediately followed by a space. Then the bug number
+should be included in the message '#' in front of the number.
+
+Example::
+
+ @testtools.skip("Skipped until the Bug #980688 is resolved")
+
+
openstack-common
----------------
diff --git a/cli/__init__.py b/cli/__init__.py
index 6ffe229..5d986c0 100644
--- a/cli/__init__.py
+++ b/cli/__init__.py
@@ -60,10 +60,11 @@
return self.cmd_with_auth(
'nova', action, flags, params, admin, fail_ok)
- def nova_manage(self, action, flags='', params='', fail_ok=False):
+ def nova_manage(self, action, flags='', params='', fail_ok=False,
+ merge_stderr=False):
"""Executes nova-manage command for the given action."""
return self.cmd(
- 'nova-manage', action, flags, params, fail_ok)
+ 'nova-manage', action, flags, params, fail_ok, merge_stderr)
def keystone(self, action, flags='', params='', admin=True, fail_ok=False):
"""Executes keystone command for the given action."""
@@ -81,14 +82,19 @@
flags = creds + ' ' + flags
return self.cmd(cmd, action, flags, params, fail_ok)
- def cmd(self, cmd, action, flags='', params='', fail_ok=False):
+ def cmd(self, cmd, action, flags='', params='', fail_ok=False,
+ merge_stderr=False):
"""Executes specified command for the given action."""
cmd = ' '.join([CONF.cli.cli_dir + cmd,
flags, action, params])
LOG.info("running: '%s'" % cmd)
cmd = shlex.split(cmd)
try:
- result = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
+ if merge_stderr:
+ result = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
+ else:
+ devnull = open('/dev/null', 'w')
+ result = subprocess.check_output(cmd, stderr=devnull)
except subprocess.CalledProcessError, e:
LOG.error("command output:\n%s" % e.output)
raise
diff --git a/cli/simple_read_only/test_compute_manage.py b/cli/simple_read_only/test_compute_manage.py
index f1fb739..bbcc5b1 100644
--- a/cli/simple_read_only/test_compute_manage.py
+++ b/cli/simple_read_only/test_compute_manage.py
@@ -48,9 +48,11 @@
self.nova_manage('', '-h')
def test_version_flag(self):
- self.assertNotEqual("", self.nova_manage('', '--version'))
+ # Bug 1159957: nova-manage --version writes to stderr
+ self.assertNotEqual("", self.nova_manage('', '--version',
+ merge_stderr=True))
self.assertEqual(self.nova_manage('version'),
- self.nova_manage('', '--version'))
+ self.nova_manage('', '--version', merge_stderr=True))
def test_debug_flag(self):
self.assertNotEqual("", self.nova_manage('instance_type list',
@@ -66,8 +68,8 @@
def test_flavor_list(self):
self.assertNotEqual("", self.nova_manage('flavor list'))
- self.assertNotEqual(self.nova_manage('instance_type list'),
- self.nova_manage('flavor list'))
+ self.assertEqual(self.nova_manage('instance_type list'),
+ self.nova_manage('flavor list'))
def test_db_archive_deleted_rows(self):
# make sure command doesn't error out
diff --git a/tempest/tests/compute/servers/test_list_server_filters.py b/tempest/tests/compute/servers/test_list_server_filters.py
index ff599fe..4d2b99f 100644
--- a/tempest/tests/compute/servers/test_list_server_filters.py
+++ b/tempest/tests/compute/servers/test_list_server_filters.py
@@ -126,11 +126,12 @@
self.assertIn(self.s3['id'], map(lambda x: x['id'], servers))
@attr(type='positive')
- def test_list_servers_detailed_filter_by_limit(self):
+ def test_list_servers_filter_by_limit(self):
# Verify only the expected number of servers are returned
params = {'limit': 1}
- resp, servers = self.client.list_servers_with_detail(params)
- self.assertEqual(1, len(servers['servers']))
+ resp, servers = self.client.list_servers(params)
+ #when _interface='xml', one element for servers_links in servers
+ self.assertEqual(1, len([x for x in servers['servers'] if 'id' in x]))
@utils.skip_unless_attr('multiple_images', 'Only one image found')
@attr(type='positive')
diff --git a/tempest/tests/compute/servers/test_server_rescue.py b/tempest/tests/compute/servers/test_server_rescue.py
index 186e399..61ba384 100644
--- a/tempest/tests/compute/servers/test_server_rescue.py
+++ b/tempest/tests/compute/servers/test_server_rescue.py
@@ -107,6 +107,11 @@
def _delete(self, volume_id):
self.volumes_extensions_client.delete_volume(volume_id)
+ def _unrescue(self, server_id):
+ resp, body = self.servers_client.unrescue_server(server_id)
+ self.assertEqual(202, resp.status)
+ self.servers_client.wait_for_server_status(server_id, 'ACTIVE')
+
@attr(type='smoke')
def test_rescue_unrescue_instance(self):
resp, body = self.servers_client.rescue_server(
@@ -118,9 +123,8 @@
self.servers_client.wait_for_server_status(self.server_id, 'ACTIVE')
@attr(type='negative')
- @testtools.skip("Skipped until Bug #1126163 is resolved")
def test_rescued_vm_reboot(self):
- self.assertRaises(exceptions.BadRequest, self.servers_client.reboot,
+ self.assertRaises(exceptions.Duplicate, self.servers_client.reboot,
self.rescue_id, 'HARD')
@attr(type='negative')
@@ -130,37 +134,23 @@
self.rescue_id,
self.image_ref_alt)
- @attr(type='positive')
- @testtools.skip("Skipped due to Bug #1126187")
+ @attr(type='negative')
def test_rescued_vm_attach_volume(self):
client = self.volumes_extensions_client
# Rescue the server
self.servers_client.rescue_server(self.server_id, self.password)
self.servers_client.wait_for_server_status(self.server_id, 'RESCUE')
+ self.addCleanup(self._unrescue, self.server_id)
# Attach the volume to the server
- resp, body = \
- self.servers_client.attach_volume(self.server_id,
- self.volume_to_attach['id'],
- device='/dev/%s' % self.device)
- self.assertEqual(200, resp.status)
- client.wait_for_volume_status(self.volume_to_attach['id'], 'in-use')
+ self.assertRaises(exceptions.Duplicate,
+ self.servers_client.attach_volume,
+ self.server_id,
+ self.volume_to_attach['id'],
+ device='/dev/%s' % self.device)
- # Detach the volume to the server
- resp, body = \
- self.servers_client.detach_volume(self.server_id,
- self.volume_to_attach['id'])
- self.assertEqual(202, resp.status)
- client.wait_for_volume_status(self.volume_to_attach['id'], 'available')
-
- # Unrescue the server
- resp, body = self.servers_client.unrescue_server(self.server_id)
- self.assertEqual(202, resp.status)
- self.servers_client.wait_for_server_status(self.server_id, 'ACTIVE')
-
- @attr(type='positive')
- @testtools.skip("Skipped until Bug #1126187 is resolved")
+ @attr(type='negative')
def test_rescued_vm_detach_volume(self):
# Attach the volume to the server
self.servers_client.attach_volume(self.server_id,
@@ -172,19 +162,13 @@
# Rescue the server
self.servers_client.rescue_server(self.server_id, self.password)
self.servers_client.wait_for_server_status(self.server_id, 'RESCUE')
+ self.addCleanup(self._unrescue, self.server_id)
- # Detach the volume to the server
- resp, body = \
- self.servers_client.detach_volume(self.server_id,
- self.volume_to_detach['id'])
- self.assertEqual(202, resp.status)
- client = self.volumes_extensions_client
- client.wait_for_volume_status(self.volume_to_detach['id'], 'available')
-
- # Unrescue the server
- resp, body = self.servers_client.unrescue_server(self.server_id)
- self.assertEqual(202, resp.status)
- self.servers_client.wait_for_server_status(self.server_id, 'ACTIVE')
+ # Detach the volume from the server expecting failure
+ self.assertRaises(exceptions.Duplicate,
+ self.servers_client.detach_volume,
+ self.server_id,
+ self.volume_to_detach['id'])
@attr(type='positive')
def test_rescued_vm_associate_dissociate_floating_ip(self):
diff --git a/tools/hacking.py b/tools/hacking.py
index 44039be..7e46b74 100755
--- a/tools/hacking.py
+++ b/tools/hacking.py
@@ -322,6 +322,30 @@
return (pos, "T404: test functions must "
"not have doc strings")
+SKIP_DECORATOR = '@testtools.skip('
+
+
+def tempest_skip_bugs(physical_line):
+ """Check skip lines for proper bug entries
+
+ T601: Bug not in skip line
+ T602: Bug in message formatted incorrectly
+ """
+
+ pos = physical_line.find(SKIP_DECORATOR)
+
+ skip_re = re.compile(r'^\s*@testtools.skip.*')
+
+ if pos != -1 and skip_re.match(physical_line):
+ bug = re.compile(r'^.*\bbug\b.*', re.IGNORECASE)
+ if bug.match(physical_line) is None:
+ return (pos, 'T601: skips must have an associated bug')
+
+ bug_re = re.compile(r'.*skip\(.*Bug\s\#\d+', re.IGNORECASE)
+
+ if bug_re.match(physical_line) is None:
+ return (pos, 'T602: Bug number formatted incorrectly')
+
FORMAT_RE = re.compile("%(?:"
"%|" # Ignore plain percents