Merge "unskipping bug related to test_stamp_pattern.py"
diff --git a/HACKING.rst b/HACKING.rst
index 2fa949d..9878b67 100644
--- a/HACKING.rst
+++ b/HACKING.rst
@@ -123,8 +123,8 @@
earlier a problem is detected the easier it is to debug, especially
where there is complicated setup required.
-Parallel Test Exectution
-------------------------
+Parallel Test Execution
+-----------------------
Tempest by default runs its tests in parallel this creates the possibility for
interesting interactions between tests which can cause unexpected failures.
Tenant isolation provides protection from most of the potential race conditions
@@ -133,7 +133,7 @@
- Resources outside of a tenant scope still have the potential to conflict. This
is a larger concern for the admin tests since most resources and actions that
- require admin privleges are outside of tenants.
+ require admin privileges are outside of tenants.
- Races between methods in the same class are not a problem because
parallelization in tempest is at the test class level, but if there is a json
diff --git a/doc/source/conf.py b/doc/source/conf.py
index 178bf62..cf838c0 100644
--- a/doc/source/conf.py
+++ b/doc/source/conf.py
@@ -11,7 +11,8 @@
# All configuration values have a default; values that are commented out
# serve to show the default.
-import sys, os
+import sys
+import os
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
@@ -25,7 +26,14 @@
# Add any Sphinx extension module names here, as strings. They can be extensions
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
-extensions = ['sphinx.ext.autodoc', 'sphinx.ext.todo', 'sphinx.ext.viewcode']
+extensions = ['sphinx.ext.autodoc',
+ 'sphinx.ext.intersphinx',
+ 'sphinx.ext.todo',
+ 'sphinx.ext.viewcode',
+ 'oslo.sphinx'
+ ]
+
+todo_include_todos = True
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
@@ -41,16 +49,18 @@
# General information about the project.
project = u'Tempest'
-copyright = u'2013, Sean Dague'
+copyright = u'2013, OpenStack QA Team'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
-version = 'havana'
+import pbr.version
+version_info = pbr.version.VersionInfo('tempest')
+version = version_info.version_string()
# The full version, including alpha/beta/rc tags.
-release = 'havana'
+release = version_info.release_string()
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
@@ -74,17 +84,17 @@
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
-#add_module_names = True
+add_module_names = False
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
-#show_authors = False
+show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
-#modindex_common_prefix = []
+modindex_common_prefix = ['tempest.']
# -- Options for HTML output ---------------------------------------------------
@@ -124,7 +134,8 @@
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
-#html_last_updated_fmt = '%b %d, %Y'
+git_cmd = "git log --pretty=format:'%ad, commit %h' --date=local -n1"
+html_last_updated_fmt = os.popen(git_cmd).read()
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
@@ -184,7 +195,7 @@
# (source start file, target name, title, author, documentclass [howto/manual]).
latex_documents = [
('index', 'Tempest.tex', u'Tempest Documentation',
- u'Sean Dague', 'manual'),
+ u'OpenStack QA Team', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
@@ -214,7 +225,7 @@
# (source start file, name, description, authors, manual section).
man_pages = [
('index', 'tempest', u'Tempest Documentation',
- [u'Sean Dague'], 1)
+ [u'OpenStack QA Team'], 1)
]
# If true, show URL addresses after external links.
@@ -228,7 +239,7 @@
# dir menu entry, description, category)
texinfo_documents = [
('index', 'Tempest', u'Tempest Documentation',
- u'Sean Dague', 'Tempest', 'One line description of project.',
+ u'OpenStack QA Team', 'Tempest', 'One line description of project.',
'Miscellaneous'),
]
@@ -247,8 +258,8 @@
# Bibliographic Dublin Core info.
epub_title = u'Tempest'
epub_author = u'Sean Dague'
-epub_publisher = u'Sean Dague'
-epub_copyright = u'2013, Sean Dague'
+epub_publisher = u'OpenStack QA Team'
+epub_copyright = u'2013, OpenStack QA Team'
# The language of the text. It defaults to the language option
# or en if the language is not set.
diff --git a/etc/tempest.conf.sample b/etc/tempest.conf.sample
index 78e6aac..115a2b5 100644
--- a/etc/tempest.conf.sample
+++ b/etc/tempest.conf.sample
@@ -222,7 +222,7 @@
tenant_network_cidr = 10.100.0.0/16
# The mask bits used to partition the tenant block.
-tenant_network_mask_bits = 28
+tenant_network_mask_bits = 24
# If tenant networks are reachable, connectivity checks will be
# performed directly against addresses on those networks.
@@ -293,6 +293,8 @@
container_sync_interval = 5
# Set to True if the Account Quota middleware is enabled
accounts_quotas_available = True
+# Set to True if the Container Quota middleware is enabled
+container_quotas_available = True
# Set operator role for tests that require creating a container
operator_role = Member
diff --git a/requirements.txt b/requirements.txt
index b15fb92..3b9ec44 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -17,7 +17,7 @@
testresources>=0.2.4
keyring>=1.6.1
testrepository>=0.0.17
-oslo.config>=1.1.0
+oslo.config>=1.2.0
eventlet>=0.13.0
six<1.4.0
iso8601>=0.1.4
diff --git a/run_tests.sh b/run_tests.sh
index 710fbaa..acd9497 100755
--- a/run_tests.sh
+++ b/run_tests.sh
@@ -58,7 +58,7 @@
-c|--nova-coverage) let nova_coverage=1;;
-C|--config) config_file=$2; shift;;
-p|--pep8) let just_pep8=1;;
- -s|--smoke) testrargs="$testrargs smoke";;
+ -s|--smoke) testrargs+="smoke"; noseargs+="--attr=type=smoke";;
-t|--serial) serial=1;;
-l|--logging) logging=1;;
-L|--logging-config) logging_config=$2; shift;;
diff --git a/tempest/api/__init__.py b/tempest/api/__init__.py
index 6a0b9cd..0b3d2db 100644
--- a/tempest/api/__init__.py
+++ b/tempest/api/__init__.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/compute/__init__.py b/tempest/api/compute/__init__.py
index fd26081..2c21740 100644
--- a/tempest/api/compute/__init__.py
+++ b/tempest/api/compute/__init__.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/compute/admin/test_aggregates.py b/tempest/api/compute/admin/test_aggregates.py
index a5dceca..14ab236 100644
--- a/tempest/api/compute/admin/test_aggregates.py
+++ b/tempest/api/compute/admin/test_aggregates.py
@@ -15,25 +15,13 @@
# License for the specific language governing permissions and limitations
# under the License.
-import fixtures
-
from tempest.api.compute import base
+from tempest.common import tempest_fixtures as fixtures
from tempest.common.utils.data_utils import rand_name
from tempest import exceptions
-from tempest.openstack.common import lockutils
from tempest.test import attr
-class LockFixture(fixtures.Fixture):
- def __init__(self, name):
- self.mgr = lockutils.lock(name, 'tempest-', True)
-
- def setUp(self):
- super(LockFixture, self).setUp()
- self.addCleanup(self.mgr.__exit__, None, None, None)
- self.mgr.__enter__()
-
-
class AggregatesAdminTestJSON(base.BaseComputeAdminTest):
"""
@@ -109,6 +97,38 @@
self.assertEqual(aggregate['availability_zone'],
body['availability_zone'])
+ @attr(type='gate')
+ def test_aggregate_create_update_with_az(self):
+ # Update an aggregate and ensure properties are updated correctly
+ self.useFixture(fixtures.LockFixture('availability_zone'))
+ aggregate_name = rand_name(self.aggregate_name_prefix)
+ az_name = rand_name(self.az_name_prefix)
+ resp, aggregate = self.client.create_aggregate(aggregate_name, az_name)
+ self.addCleanup(self.client.delete_aggregate, aggregate['id'])
+
+ self.assertEqual(200, resp.status)
+ self.assertEqual(aggregate_name, aggregate['name'])
+ self.assertEqual(az_name, aggregate['availability_zone'])
+ self.assertIsNotNone(aggregate['id'])
+
+ aggregate_id = aggregate['id']
+ new_aggregate_name = aggregate_name + '_new'
+ new_az_name = az_name + '_new'
+
+ resp, resp_aggregate = self.client.update_aggregate(aggregate_id,
+ new_aggregate_name,
+ new_az_name)
+ self.assertEqual(200, resp.status)
+ self.assertEqual(new_aggregate_name, resp_aggregate['name'])
+ self.assertEqual(new_az_name, resp_aggregate['availability_zone'])
+
+ resp, aggregates = self.client.list_aggregates()
+ self.assertEqual(200, resp.status)
+ self.assertIn((aggregate_id, new_aggregate_name, new_az_name),
+ map(lambda x:
+ (x['id'], x['name'], x['availability_zone']),
+ aggregates))
+
@attr(type=['negative', 'gate'])
def test_aggregate_create_as_user(self):
# Regular user is not allowed to create an aggregate.
@@ -160,7 +180,7 @@
@attr(type='gate')
def test_aggregate_add_remove_host(self):
# Add an host to the given aggregate and remove.
- self.useFixture(LockFixture('availability_zone'))
+ self.useFixture(fixtures.LockFixture('availability_zone'))
aggregate_name = rand_name(self.aggregate_name_prefix)
resp, aggregate = self.client.create_aggregate(aggregate_name)
self.addCleanup(self.client.delete_aggregate, aggregate['id'])
@@ -182,7 +202,7 @@
@attr(type='gate')
def test_aggregate_add_host_list(self):
# Add an host to the given aggregate and list.
- self.useFixture(LockFixture('availability_zone'))
+ self.useFixture(fixtures.LockFixture('availability_zone'))
aggregate_name = rand_name(self.aggregate_name_prefix)
resp, aggregate = self.client.create_aggregate(aggregate_name)
self.addCleanup(self.client.delete_aggregate, aggregate['id'])
@@ -200,7 +220,7 @@
@attr(type='gate')
def test_aggregate_add_host_get_details(self):
# Add an host to the given aggregate and get details.
- self.useFixture(LockFixture('availability_zone'))
+ self.useFixture(fixtures.LockFixture('availability_zone'))
aggregate_name = rand_name(self.aggregate_name_prefix)
resp, aggregate = self.client.create_aggregate(aggregate_name)
self.addCleanup(self.client.delete_aggregate, aggregate['id'])
@@ -215,7 +235,7 @@
@attr(type='gate')
def test_aggregate_add_host_create_server_with_az(self):
# Add an host to the given aggregate and create a server.
- self.useFixture(LockFixture('availability_zone'))
+ self.useFixture(fixtures.LockFixture('availability_zone'))
aggregate_name = rand_name(self.aggregate_name_prefix)
az_name = rand_name(self.az_name_prefix)
resp, aggregate = self.client.create_aggregate(aggregate_name, az_name)
@@ -262,7 +282,7 @@
@attr(type=['negative', 'gate'])
def test_aggregate_remove_host_as_user(self):
# Regular user is not allowed to remove a host from an aggregate.
- self.useFixture(LockFixture('availability_zone'))
+ self.useFixture(fixtures.LockFixture('availability_zone'))
aggregate_name = rand_name(self.aggregate_name_prefix)
resp, aggregate = self.client.create_aggregate(aggregate_name)
self.addCleanup(self.client.delete_aggregate, aggregate['id'])
diff --git a/tempest/api/compute/admin/test_flavors.py b/tempest/api/compute/admin/test_flavors.py
index b693227..3ef75ba 100644
--- a/tempest/api/compute/admin/test_flavors.py
+++ b/tempest/api/compute/admin/test_flavors.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/compute/admin/test_flavors_extra_specs.py b/tempest/api/compute/admin/test_flavors_extra_specs.py
index e1e75cb..ce326a3 100644
--- a/tempest/api/compute/admin/test_flavors_extra_specs.py
+++ b/tempest/api/compute/admin/test_flavors_extra_specs.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/compute/admin/test_hosts.py b/tempest/api/compute/admin/test_hosts.py
index 19d7973..bf09428 100644
--- a/tempest/api/compute/admin/test_hosts.py
+++ b/tempest/api/compute/admin/test_hosts.py
@@ -15,6 +15,7 @@
# under the License.
from tempest.api.compute import base
+from tempest.common import tempest_fixtures as fixtures
from tempest.common.utils.data_utils import rand_name
from tempest import exceptions
from tempest.test import attr
@@ -42,6 +43,7 @@
@attr(type='gate')
def test_list_hosts_with_zone(self):
+ self.useFixture(fixtures.LockFixture('availability_zone'))
resp, hosts = self.client.list_hosts()
host = hosts[0]
zone_name = host['zone']
diff --git a/tempest/api/compute/admin/test_quotas.py b/tempest/api/compute/admin/test_quotas.py
index 156274d..f55f152 100644
--- a/tempest/api/compute/admin/test_quotas.py
+++ b/tempest/api/compute/admin/test_quotas.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -19,7 +19,6 @@
from tempest.common.utils.data_utils import rand_name
from tempest import exceptions
from tempest.test import attr
-import testtools
class QuotasAdminTestJSON(base.BaseComputeAdminTest):
@@ -73,12 +72,12 @@
sorted(quota_set.keys()))
self.assertEqual(quota_set['id'], self.demo_tenant_id)
- @testtools.skip("Skipped until the Bug #1160749 is resolved")
@attr(type='gate')
def test_update_all_quota_resources_for_tenant(self):
# Admin can update all the resource quota limits for a tenant
- new_quota_set = {'force': True,
- 'injected_file_content_bytes': 20480,
+ resp, default_quota_set = self.client.get_default_quota_set(
+ self.demo_tenant_id)
+ new_quota_set = {'injected_file_content_bytes': 20480,
'metadata_items': 256, 'injected_files': 10,
'ram': 10240, 'floating_ips': 20, 'fixed_ips': 10,
'key_pairs': 200, 'injected_file_path_bytes': 512,
@@ -87,9 +86,12 @@
# Update limits for all quota resources
resp, quota_set = self.adm_client.update_quota_set(
self.demo_tenant_id,
+ force=True,
**new_quota_set)
+
+ default_quota_set.pop('id')
self.addCleanup(self.adm_client.update_quota_set,
- self.demo_tenant_id, **self.default_quota_set)
+ self.demo_tenant_id, **default_quota_set)
self.assertEqual(200, resp.status)
self.assertEqual(new_quota_set, quota_set)
@@ -114,7 +116,6 @@
# TODO(afazekas): Add dedicated tenant to the skiped quota tests
# it can be moved into the setUpClass as well
- @testtools.skip("Skipped until the Bug #1160749 is resolved")
@attr(type='gate')
def test_create_server_when_cpu_quota_is_full(self):
# Disallow server creation when tenant's vcpu quota is full
@@ -130,7 +131,6 @@
cores=default_vcpu_quota)
self.assertRaises(exceptions.OverLimit, self.create_server)
- @testtools.skip("Skipped until the Bug #1160749 is resolved")
@attr(type='gate')
def test_create_server_when_memory_quota_is_full(self):
# Disallow server creation when tenant's memory quota is full
@@ -146,9 +146,13 @@
ram=default_mem_quota)
self.assertRaises(exceptions.OverLimit, self.create_server)
-# TODO(afazekas): Add test that tried to update the quota_set as a regular user
+ @attr(type='gate')
+ def test_update_quota_normal_user(self):
+ self.assertRaises(exceptions.Unauthorized,
+ self.client.update_quota_set,
+ self.demo_tenant_id,
+ ram=0)
- @testtools.skip("Skipped until the Bug #1160749 is resolved")
@attr(type=['negative', 'gate'])
def test_create_server_when_instances_quota_is_full(self):
# Once instances quota limit is reached, disallow server creation
@@ -163,7 +167,6 @@
instances=default_instances_quota)
self.assertRaises(exceptions.OverLimit, self.create_server)
- @testtools.skip("Skipped until the Bug #1160749 is resolved")
@attr(type=['negative', 'gate'])
def test_security_groups_exceed_limit(self):
# Negative test: Creation Security Groups over limit should FAIL
@@ -174,6 +177,7 @@
resp, quota_set =\
self.adm_client.update_quota_set(self.demo_tenant_id,
+ force=True,
security_groups=sg_quota)
self.addCleanup(self.adm_client.update_quota_set,
@@ -185,7 +189,6 @@
self.sg_client.create_security_group,
"sg-overlimit", "sg-desc")
- @testtools.skip("Skipped until the Bug #1160749 is resolved")
@attr(type=['negative', 'gate'])
def test_security_groups_rules_exceed_limit(self):
# Negative test: Creation of Security Group Rules should FAIL
@@ -198,6 +201,7 @@
resp, quota_set =\
self.adm_client.update_quota_set(
self.demo_tenant_id,
+ force=True,
security_group_rules=sg_rules_quota)
self.addCleanup(self.adm_client.update_quota_set,
diff --git a/tempest/api/compute/admin/test_servers.py b/tempest/api/compute/admin/test_servers.py
index cb47066..0abf779 100644
--- a/tempest/api/compute/admin/test_servers.py
+++ b/tempest/api/compute/admin/test_servers.py
@@ -15,7 +15,9 @@
# under the License.
from tempest.api.compute import base
+from tempest.common.utils.data_utils import rand_int_id
from tempest.common.utils.data_utils import rand_name
+from tempest import exceptions
from tempest.test import attr
@@ -31,6 +33,12 @@
def setUpClass(cls):
super(ServersAdminTestJSON, cls).setUpClass()
cls.client = cls.os_adm.servers_client
+ cls.flavors_client = cls.os_adm.flavors_client
+
+ cls.admin_client = cls._get_identity_admin_client()
+ tenant = cls.admin_client.get_tenant_by_name(
+ cls.client.tenant_name)
+ cls.tenant_id = tenant['id']
cls.s1_name = rand_name('server')
resp, server = cls.create_server(name=cls.s1_name,
@@ -39,6 +47,16 @@
resp, server = cls.create_server(name=cls.s2_name,
wait_until='ACTIVE')
+ def _get_unused_flavor_id(self):
+ flavor_id = rand_int_id(start=1000)
+ while True:
+ try:
+ resp, body = self.flavors_client.get_flavor_details(flavor_id)
+ except exceptions.NotFound:
+ break
+ flavor_id = rand_int_id(start=1000)
+ return flavor_id
+
@attr(type='gate')
def test_list_servers_by_admin(self):
# Listing servers by admin user returns empty list by default
@@ -59,6 +77,42 @@
self.assertIn(self.s1_name, servers_name)
self.assertIn(self.s2_name, servers_name)
+ @attr(type=['negative', 'gate'])
+ def test_resize_server_using_overlimit_ram(self):
+ flavor_name = rand_name("flavor-")
+ flavor_id = self._get_unused_flavor_id()
+ resp, quota_set = self.quotas_client.get_default_quota_set(
+ self.tenant_id)
+ ram = int(quota_set['ram']) + 1
+ vcpus = 8
+ disk = 10
+ resp, flavor_ref = self.flavors_client.create_flavor(flavor_name,
+ ram, vcpus, disk,
+ flavor_id)
+ self.addCleanup(self.flavors_client.delete_flavor, flavor_id)
+ self.assertRaises(exceptions.OverLimit,
+ self.client.resize,
+ self.servers[0]['id'],
+ flavor_ref['id'])
+
+ @attr(type=['negative', 'gate'])
+ def test_resize_server_using_overlimit_vcpus(self):
+ flavor_name = rand_name("flavor-")
+ flavor_id = self._get_unused_flavor_id()
+ ram = 512
+ resp, quota_set = self.quotas_client.get_default_quota_set(
+ self.tenant_id)
+ vcpus = int(quota_set['cores']) + 1
+ disk = 10
+ resp, flavor_ref = self.flavors_client.create_flavor(flavor_name,
+ ram, vcpus, disk,
+ flavor_id)
+ self.addCleanup(self.flavors_client.delete_flavor, flavor_id)
+ self.assertRaises(exceptions.OverLimit,
+ self.client.resize,
+ self.servers[0]['id'],
+ flavor_ref['id'])
+
class ServersAdminTestXML(ServersAdminTestJSON):
_interface = 'xml'
diff --git a/tempest/api/compute/base.py b/tempest/api/compute/base.py
index 09d9bc0..0b527d9 100644
--- a/tempest/api/compute/base.py
+++ b/tempest/api/compute/base.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -22,6 +22,7 @@
from tempest.common import isolated_creds
from tempest.common.utils.data_utils import parse_image_id
from tempest.common.utils.data_utils import rand_name
+from tempest import exceptions
from tempest.openstack.common import log as logging
import tempest.test
@@ -103,6 +104,9 @@
for image_id in cls.images:
try:
cls.images_client.delete_image(image_id)
+ except exceptions.NotFound:
+ # The image may have already been deleted which is OK.
+ pass
except Exception as exc:
LOG.info('Exception raised deleting image %s', image_id)
LOG.exception(exc)
diff --git a/tempest/api/compute/flavors/test_flavors.py b/tempest/api/compute/flavors/test_flavors.py
index c3ba671..cea13a0 100644
--- a/tempest/api/compute/flavors/test_flavors.py
+++ b/tempest/api/compute/flavors/test_flavors.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/compute/floating_ips/test_floating_ips_actions.py b/tempest/api/compute/floating_ips/test_floating_ips_actions.py
index 930ebcb..b747b46 100644
--- a/tempest/api/compute/floating_ips/test_floating_ips_actions.py
+++ b/tempest/api/compute/floating_ips/test_floating_ips_actions.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/compute/floating_ips/test_list_floating_ips.py b/tempest/api/compute/floating_ips/test_list_floating_ips.py
index f5baa3c..3c76069 100644
--- a/tempest/api/compute/floating_ips/test_list_floating_ips.py
+++ b/tempest/api/compute/floating_ips/test_list_floating_ips.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -93,6 +93,14 @@
self.assertRaises(exceptions.NotFound,
self.client.get_floating_ip_details, non_exist_id)
+ @attr(type='gate')
+ def test_list_floating_ip_pools(self):
+ # Positive test:Should return the list of floating IP Pools
+ resp, floating_ip_pools = self.client.list_floating_ip_pools()
+ self.assertEqual(200, resp.status)
+ self.assertNotEqual(0, len(floating_ip_pools),
+ "Expected floating IP Pools. Got zero.")
+
class FloatingIPDetailsTestXML(FloatingIPDetailsTestJSON):
_interface = 'xml'
diff --git a/tempest/api/compute/images/test_image_metadata.py b/tempest/api/compute/images/test_image_metadata.py
index a769744..8f19514 100644
--- a/tempest/api/compute/images/test_image_metadata.py
+++ b/tempest/api/compute/images/test_image_metadata.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -42,7 +42,6 @@
resp, _ = cls.client.create_image(cls.server_id, name, {})
cls.image_id = resp['location'].rsplit('/', 1)[1]
- cls.client.wait_for_image_resp_code(cls.image_id, 200)
cls.client.wait_for_image_status(cls.image_id, 'ACTIVE')
@classmethod
@@ -89,7 +88,7 @@
# The value for a specific metadata key should be returned
resp, meta = self.client.get_image_metadata_item(self.image_id,
'key2')
- self.assertTrue('value2', meta['key2'])
+ self.assertEqual('value2', meta['key2'])
@attr(type='gate')
def test_set_image_metadata_item(self):
diff --git a/tempest/api/compute/images/test_images.py b/tempest/api/compute/images/test_images.py
index 97fbd8b..57f26f8 100644
--- a/tempest/api/compute/images/test_images.py
+++ b/tempest/api/compute/images/test_images.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
#
# 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
@@ -59,7 +59,6 @@
def __create_image__(self, server_id, name, meta=None):
resp, body = self.client.create_image(server_id, name, meta)
image_id = parse_image_id(resp['location'])
- self.client.wait_for_image_resp_code(image_id, 200)
self.client.wait_for_image_status(image_id, 'ACTIVE')
self.image_ids.append(image_id)
return resp, body
diff --git a/tempest/api/compute/images/test_images_oneserver.py b/tempest/api/compute/images/test_images_oneserver.py
index 06e9ab2..7df9010 100644
--- a/tempest/api/compute/images/test_images_oneserver.py
+++ b/tempest/api/compute/images/test_images_oneserver.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -104,7 +104,6 @@
resp, body = self.client.create_image(self.server['id'], name, meta)
self.assertEqual(202, resp.status)
image_id = parse_image_id(resp['location'])
- self.client.wait_for_image_resp_code(image_id, 200)
self.client.wait_for_image_status(image_id, 'ACTIVE')
# Verify the image was created correctly
diff --git a/tempest/api/compute/images/test_list_image_filters.py b/tempest/api/compute/images/test_list_image_filters.py
index e700278..8a8d5bd 100644
--- a/tempest/api/compute/images/test_list_image_filters.py
+++ b/tempest/api/compute/images/test_list_image_filters.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -47,7 +47,6 @@
# Create images to be used in the filter tests
resp, body = cls.create_image_from_server(cls.server1['id'])
cls.image1_id = parse_image_id(resp['location'])
- cls.client.wait_for_image_resp_code(cls.image1_id, 200)
cls.client.wait_for_image_status(cls.image1_id, 'ACTIVE')
resp, cls.image1 = cls.client.get_image(cls.image1_id)
@@ -56,13 +55,11 @@
# server will sometimes cause failures
resp, body = cls.create_image_from_server(cls.server2['id'])
cls.image3_id = parse_image_id(resp['location'])
- cls.client.wait_for_image_resp_code(cls.image3_id, 200)
cls.client.wait_for_image_status(cls.image3_id, 'ACTIVE')
resp, cls.image3 = cls.client.get_image(cls.image3_id)
resp, body = cls.create_image_from_server(cls.server1['id'])
cls.image2_id = parse_image_id(resp['location'])
- cls.client.wait_for_image_resp_code(cls.image2_id, 200)
cls.client.wait_for_image_status(cls.image2_id, 'ACTIVE')
resp, cls.image2 = cls.client.get_image(cls.image2_id)
diff --git a/tempest/api/compute/images/test_list_images.py b/tempest/api/compute/images/test_list_images.py
index c7e23b1..0647f86 100644
--- a/tempest/api/compute/images/test_list_images.py
+++ b/tempest/api/compute/images/test_list_images.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/compute/keypairs/test_keypairs.py b/tempest/api/compute/keypairs/test_keypairs.py
index 78c547a..807315a 100644
--- a/tempest/api/compute/keypairs/test_keypairs.py
+++ b/tempest/api/compute/keypairs/test_keypairs.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/compute/limits/test_absolute_limits.py b/tempest/api/compute/limits/test_absolute_limits.py
index 972e4a8..d2430df 100644
--- a/tempest/api/compute/limits/test_absolute_limits.py
+++ b/tempest/api/compute/limits/test_absolute_limits.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/compute/security_groups/test_security_group_rules.py b/tempest/api/compute/security_groups/test_security_group_rules.py
index 6071e54..61db61d 100644
--- a/tempest/api/compute/security_groups/test_security_group_rules.py
+++ b/tempest/api/compute/security_groups/test_security_group_rules.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/compute/security_groups/test_security_groups.py b/tempest/api/compute/security_groups/test_security_groups.py
index 3e459a2..5cca3b2 100644
--- a/tempest/api/compute/security_groups/test_security_groups.py
+++ b/tempest/api/compute/security_groups/test_security_groups.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/compute/servers/test_create_server.py b/tempest/api/compute/servers/test_create_server.py
index e5fee4d..31ca387 100644
--- a/tempest/api/compute/servers/test_create_server.py
+++ b/tempest/api/compute/servers/test_create_server.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/compute/servers/test_disk_config.py b/tempest/api/compute/servers/test_disk_config.py
index efb01af..9abb86a 100644
--- a/tempest/api/compute/servers/test_disk_config.py
+++ b/tempest/api/compute/servers/test_disk_config.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/compute/servers/test_list_server_filters.py b/tempest/api/compute/servers/test_list_server_filters.py
index 8d31598..a56bdf3 100644
--- a/tempest/api/compute/servers/test_list_server_filters.py
+++ b/tempest/api/compute/servers/test_list_server_filters.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/compute/servers/test_list_servers_negative.py b/tempest/api/compute/servers/test_list_servers_negative.py
index 14ea174..1050054 100644
--- a/tempest/api/compute/servers/test_list_servers_negative.py
+++ b/tempest/api/compute/servers/test_list_servers_negative.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/compute/servers/test_multiple_create.py b/tempest/api/compute/servers/test_multiple_create.py
index edfafec..7e4a70b 100644
--- a/tempest/api/compute/servers/test_multiple_create.py
+++ b/tempest/api/compute/servers/test_multiple_create.py
@@ -87,7 +87,7 @@
min_count=1,
max_count=2,
return_reservation_id=True)
- self.assertTrue(resp['status'], 202)
+ self.assertEqual(resp['status'], '202')
self.assertIn('reservation_id', body)
diff --git a/tempest/api/compute/servers/test_server_actions.py b/tempest/api/compute/servers/test_server_actions.py
index 5ea771b..0d5a8fa 100644
--- a/tempest/api/compute/servers/test_server_actions.py
+++ b/tempest/api/compute/servers/test_server_actions.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -196,6 +196,18 @@
raise exceptions.TimeoutException(message)
@attr(type=['negative', 'gate'])
+ def test_resize_server_using_nonexist_flavor(self):
+ flavor_id = -1
+ self.assertRaises(exceptions.BadRequest,
+ self.client.resize, self.server_id, flavor_id)
+
+ @attr(type=['negative', 'gate'])
+ def test_resize_server_using_null_flavor(self):
+ flavor_id = ""
+ self.assertRaises(exceptions.BadRequest,
+ self.client.resize, self.server_id, flavor_id)
+
+ @attr(type=['negative', 'gate'])
def test_reboot_nonexistent_server_soft(self):
# Negative Test: The server reboot on non existent server should return
# an error
@@ -288,6 +300,26 @@
self.assertEqual(202, resp.status)
self.servers_client.wait_for_server_status(self.server_id, 'ACTIVE')
+ @attr(type='gate')
+ def test_lock_unlock_server(self):
+ # Lock the server,try server stop(exceptions throw),unlock it and retry
+ resp, server = self.servers_client.lock_server(self.server_id)
+ self.assertEqual(202, resp.status)
+ resp, server = self.servers_client.get_server(self.server_id)
+ self.assertEqual(200, resp.status)
+ self.assertEqual(server['status'], 'ACTIVE')
+ # Locked server is not allowed to be stopped by non-admin user
+ self.assertRaises(exceptions.BadRequest,
+ self.servers_client.stop, self.server_id)
+ resp, server = self.servers_client.unlock_server(self.server_id)
+ self.assertEqual(202, resp.status)
+ resp, server = self.servers_client.stop(self.server_id)
+ self.assertEqual(202, resp.status)
+ self.servers_client.wait_for_server_status(self.server_id, 'SHUTOFF')
+ resp, server = self.servers_client.start(self.server_id)
+ self.assertEqual(202, resp.status)
+ self.servers_client.wait_for_server_status(self.server_id, 'ACTIVE')
+
class ServerActionsTestXML(ServerActionsTestJSON):
_interface = 'xml'
diff --git a/tempest/api/compute/servers/test_server_addresses.py b/tempest/api/compute/servers/test_server_addresses.py
index 3cd0a91..b1b9253 100644
--- a/tempest/api/compute/servers/test_server_addresses.py
+++ b/tempest/api/compute/servers/test_server_addresses.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/compute/servers/test_server_metadata.py b/tempest/api/compute/servers/test_server_metadata.py
index 9997b97..5ea3cbf 100644
--- a/tempest/api/compute/servers/test_server_metadata.py
+++ b/tempest/api/compute/servers/test_server_metadata.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -118,7 +118,7 @@
# The value for a specific metadata key should be returned
resp, meta = self.client.get_server_metadata_item(self.server_id,
'key2')
- self.assertTrue('value2', meta['key2'])
+ self.assertEqual('value2', meta['key2'])
@attr(type='gate')
def test_set_server_metadata_item(self):
diff --git a/tempest/api/compute/servers/test_server_personality.py b/tempest/api/compute/servers/test_server_personality.py
index a3ec423..2019732 100644
--- a/tempest/api/compute/servers/test_server_personality.py
+++ b/tempest/api/compute/servers/test_server_personality.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/compute/servers/test_servers.py b/tempest/api/compute/servers/test_servers.py
index 1dff806..625964c 100644
--- a/tempest/api/compute/servers/test_servers.py
+++ b/tempest/api/compute/servers/test_servers.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/compute/servers/test_servers_negative.py b/tempest/api/compute/servers/test_servers_negative.py
index 226c40e..e864343 100644
--- a/tempest/api/compute/servers/test_servers_negative.py
+++ b/tempest/api/compute/servers/test_servers_negative.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/compute/test_authorization.py b/tempest/api/compute/test_authorization.py
index efdadb0..0a8595f 100644
--- a/tempest/api/compute/test_authorization.py
+++ b/tempest/api/compute/test_authorization.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -65,7 +65,6 @@
name = rand_name('image')
resp, body = cls.client.create_image(server['id'], name)
image_id = parse_image_id(resp['location'])
- cls.images_client.wait_for_image_resp_code(image_id, 200)
cls.images_client.wait_for_image_status(image_id, 'ACTIVE')
resp, cls.image = cls.images_client.get_image(image_id)
diff --git a/tempest/api/compute/test_extensions.py b/tempest/api/compute/test_extensions.py
index 4359c49..c1b7aa5 100644
--- a/tempest/api/compute/test_extensions.py
+++ b/tempest/api/compute/test_extensions.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/compute/test_live_block_migration.py b/tempest/api/compute/test_live_block_migration.py
index 7c60859..65daee0 100644
--- a/tempest/api/compute/test_live_block_migration.py
+++ b/tempest/api/compute/test_live_block_migration.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/compute/test_quotas.py b/tempest/api/compute/test_quotas.py
index 8014fca..6453cf4 100644
--- a/tempest/api/compute/test_quotas.py
+++ b/tempest/api/compute/test_quotas.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/compute/volumes/test_volumes_get.py b/tempest/api/compute/volumes/test_volumes_get.py
index 4f0f17e..fba8347 100644
--- a/tempest/api/compute/volumes/test_volumes_get.py
+++ b/tempest/api/compute/volumes/test_volumes_get.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/compute/volumes/test_volumes_list.py b/tempest/api/compute/volumes/test_volumes_list.py
index 0e475cf..956abdf 100644
--- a/tempest/api/compute/volumes/test_volumes_list.py
+++ b/tempest/api/compute/volumes/test_volumes_list.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/compute/volumes/test_volumes_negative.py b/tempest/api/compute/volumes/test_volumes_negative.py
index c91e95b..9ca1380 100644
--- a/tempest/api/compute/volumes/test_volumes_negative.py
+++ b/tempest/api/compute/volumes/test_volumes_negative.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/identity/__init__.py b/tempest/api/identity/__init__.py
index 0ed47f5..c9d43e9 100644
--- a/tempest/api/identity/__init__.py
+++ b/tempest/api/identity/__init__.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/identity/admin/test_roles.py b/tempest/api/identity/admin/test_roles.py
index c234efd..690d14f 100644
--- a/tempest/api/identity/admin/test_roles.py
+++ b/tempest/api/identity/admin/test_roles.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/identity/admin/test_services.py b/tempest/api/identity/admin/test_services.py
index 508c177..df6c317 100644
--- a/tempest/api/identity/admin/test_services.py
+++ b/tempest/api/identity/admin/test_services.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/identity/admin/test_tenants.py b/tempest/api/identity/admin/test_tenants.py
index a61a115..486b739 100644
--- a/tempest/api/identity/admin/test_tenants.py
+++ b/tempest/api/identity/admin/test_tenants.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/identity/admin/test_users.py b/tempest/api/identity/admin/test_users.py
index dc17e90..689ab29 100644
--- a/tempest/api/identity/admin/test_users.py
+++ b/tempest/api/identity/admin/test_users.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/identity/admin/v3/test_tokens.py b/tempest/api/identity/admin/v3/test_tokens.py
index 2a20493..22d74d3 100644
--- a/tempest/api/identity/admin/v3/test_tokens.py
+++ b/tempest/api/identity/admin/v3/test_tokens.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -19,11 +19,13 @@
from tempest.common.utils.data_utils import rand_name
from tempest import exceptions
from tempest.test import attr
+import testtools
class UsersTestJSON(base.BaseIdentityAdminTest):
_interface = 'json'
+ @testtools.skip("Skipped until the Bug #1221889 is resolved")
@attr(type='smoke')
def test_tokens(self):
# Valid user's token is authenticated
diff --git a/tempest/api/identity/base.py b/tempest/api/identity/base.py
index 2a168de..09fdd22 100644
--- a/tempest/api/identity/base.py
+++ b/tempest/api/identity/base.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/image/v1/test_image_members.py b/tempest/api/image/v1/test_image_members.py
index fcbde50..e9c395e 100644
--- a/tempest/api/image/v1/test_image_members.py
+++ b/tempest/api/image/v1/test_image_members.py
@@ -18,6 +18,8 @@
from tempest.api.image import base
from tempest import clients
+from tempest.common.utils.data_utils import rand_name
+from tempest import exceptions
from tempest.test import attr
@@ -83,3 +85,25 @@
self.assertEqual(200, resp.status)
members = body['members']
self.assertEqual(0, len(members))
+
+ @attr(type=['negative', 'gate'])
+ def test_add_member_with_non_existing_image(self):
+ # Add member with non existing image.
+ non_exist_image = rand_name('image_')
+ self.assertRaises(exceptions.NotFound, self.client.add_member,
+ self.tenants[0], non_exist_image)
+
+ @attr(type=['negative', 'gate'])
+ def test_delete_member_with_non_existing_image(self):
+ # Delete member with non existing image.
+ non_exist_image = rand_name('image_')
+ self.assertRaises(exceptions.NotFound, self.client.delete_member,
+ self.tenants[0], non_exist_image)
+
+ @attr(type=['negative', 'gate'])
+ def test_delete_member_with_non_existing_tenant(self):
+ # Delete member with non existing tenant.
+ image_id = self._create_image()
+ non_exist_tenant = rand_name('tenant_')
+ self.assertRaises(exceptions.NotFound, self.client.delete_member,
+ non_exist_tenant, image_id)
diff --git a/tempest/api/image/v1/test_images.py b/tempest/api/image/v1/test_images.py
index 327df0f..90ffeae 100644
--- a/tempest/api/image/v1/test_images.py
+++ b/tempest/api/image/v1/test_images.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/image/v2/test_images.py b/tempest/api/image/v2/test_images.py
index ad7be39..eb3535f 100644
--- a/tempest/api/image/v2/test_images.py
+++ b/tempest/api/image/v2/test_images.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2013 OpenStack, LLC
+# Copyright 2013 OpenStack Foundation
# All Rights Reserved.
# Copyright 2013 IBM Corp.
#
diff --git a/tempest/api/network/base.py b/tempest/api/network/base.py
index 4a4bf60..cfac257 100644
--- a/tempest/api/network/base.py
+++ b/tempest/api/network/base.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/network/test_extensions.py b/tempest/api/network/test_extensions.py
new file mode 100644
index 0000000..1b27d1b
--- /dev/null
+++ b/tempest/api/network/test_extensions.py
@@ -0,0 +1,79 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2013 OpenStack, Foundation
+# All Rights Reserved.
+#
+# 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.
+
+
+from tempest.api.network import base
+from tempest.test import attr
+
+
+class ExtensionsTestJSON(base.BaseNetworkTest):
+ _interface = 'json'
+
+ """
+ Tests the following operations in the Neutron API using the REST client for
+ Neutron:
+
+ List all available extensions
+
+ v2.0 of the Neutron API is assumed. It is also assumed that the following
+ options are defined in the [network] section of etc/tempest.conf:
+
+ """
+
+ @classmethod
+ def setUpClass(cls):
+ super(ExtensionsTestJSON, cls).setUpClass()
+
+ @attr(type='smoke')
+ def test_list_show_extensions(self):
+ # List available extensions for the tenant
+ expected_alias = ['security-group', 'l3_agent_scheduler',
+ 'ext-gw-mode', 'binding', 'quotas',
+ 'agent', 'dhcp_agent_scheduler', 'provider',
+ 'router', 'extraroute', 'external-net',
+ 'allowed-address-pairs', 'extra_dhcp_opt']
+ actual_alias = list()
+ resp, extensions = self.client.list_extensions()
+ self.assertEqual('200', resp['status'])
+ list_extensions = extensions['extensions']
+ # Show and verify the details of the available extensions
+ for ext in list_extensions:
+ ext_name = ext['name']
+ ext_alias = ext['alias']
+ actual_alias.append(ext['alias'])
+ resp, ext_details = self.client.show_extension_details(ext_alias)
+ self.assertEqual('200', resp['status'])
+ ext_details = ext_details['extension']
+
+ self.assertIsNotNone(ext_details)
+ self.assertIn('updated', ext_details.keys())
+ self.assertIn('name', ext_details.keys())
+ self.assertIn('description', ext_details.keys())
+ self.assertIn('namespace', ext_details.keys())
+ self.assertIn('links', ext_details.keys())
+ self.assertIn('alias', ext_details.keys())
+ self.assertEqual(ext_details['name'], ext_name)
+ self.assertEqual(ext_details['alias'], ext_alias)
+ self.assertEqual(ext_details, ext)
+ # Verify if expected extensions are present in the actual list
+ # of extensions returned
+ for e in expected_alias:
+ self.assertIn(e, actual_alias)
+
+
+class ExtensionsTestXML(ExtensionsTestJSON):
+ _interface = 'xml'
diff --git a/tempest/api/network/test_load_balancer.py b/tempest/api/network/test_load_balancer.py
index 62017dc..e3bf4e8 100644
--- a/tempest/api/network/test_load_balancer.py
+++ b/tempest/api/network/test_load_balancer.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2013 OpenStack, LLC
+# Copyright 2013 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/network/test_networks.py b/tempest/api/network/test_networks.py
index a2b4ab3..f2df1ee 100644
--- a/tempest/api/network/test_networks.py
+++ b/tempest/api/network/test_networks.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/network/test_quotas.py b/tempest/api/network/test_quotas.py
index b49cbe8..51395ea 100644
--- a/tempest/api/network/test_quotas.py
+++ b/tempest/api/network/test_quotas.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2013 OpenStack, LLC
+# Copyright 2013 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/object_storage/base.py b/tempest/api/object_storage/base.py
index 1d16b2f..c6639c2 100644
--- a/tempest/api/object_storage/base.py
+++ b/tempest/api/object_storage/base.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/object_storage/test_account_services.py b/tempest/api/object_storage/test_account_services.py
index d4201ee..1a3f775 100644
--- a/tempest/api/object_storage/test_account_services.py
+++ b/tempest/api/object_storage/test_account_services.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/object_storage/test_container_acl.py b/tempest/api/object_storage/test_container_acl.py
index 1a31b91..de5307a 100644
--- a/tempest/api/object_storage/test_container_acl.py
+++ b/tempest/api/object_storage/test_container_acl.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/object_storage/test_container_quotas.py b/tempest/api/object_storage/test_container_quotas.py
new file mode 100644
index 0000000..31fe711
--- /dev/null
+++ b/tempest/api/object_storage/test_container_quotas.py
@@ -0,0 +1,122 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2013 Cloudwatt
+# All Rights Reserved.
+#
+# 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 testtools
+
+from tempest.api.object_storage import base
+from tempest.common.utils.data_utils import arbitrary_string
+from tempest.common.utils.data_utils import rand_name
+from tempest import config
+from tempest import exceptions
+from tempest.test import attr
+from tempest.test import HTTP_SUCCESS
+
+QUOTA_BYTES = 10
+QUOTA_COUNT = 3
+SKIP_MSG = "Container quotas middleware not available."
+
+
+class ContainerQuotasTest(base.BaseObjectTest):
+ """Attemps to test the perfect behavior of quotas in a container."""
+ container_quotas_available = \
+ config.TempestConfig().object_storage.container_quotas_available
+
+ def setUp(self):
+ """Creates and sets a container with quotas.
+
+ Quotas are set by adding meta values to the container,
+ and are validated when set:
+ - X-Container-Meta-Quota-Bytes:
+ Maximum size of the container, in bytes.
+ - X-Container-Meta-Quota-Count:
+ Maximum object count of the container.
+ """
+ super(ContainerQuotasTest, self).setUp()
+ self.container_name = rand_name(name="TestContainer")
+ self.container_client.create_container(self.container_name)
+ metadata = {"quota-bytes": str(QUOTA_BYTES),
+ "quota-count": str(QUOTA_COUNT), }
+ self.container_client.update_container_metadata(
+ self.container_name, metadata)
+
+ def tearDown(self):
+ """Cleans the container of any object after each test."""
+ self.delete_containers([self.container_name])
+ super(ContainerQuotasTest, self).tearDown()
+
+ @testtools.skipIf(not container_quotas_available, SKIP_MSG)
+ @attr(type="smoke")
+ def test_upload_valid_object(self):
+ """Attempts to uploads an object smaller than the bytes quota."""
+ object_name = rand_name(name="TestObject")
+ data = arbitrary_string(QUOTA_BYTES)
+
+ nbefore = self._get_bytes_used()
+
+ resp, _ = self.object_client.create_object(
+ self.container_name, object_name, data)
+ self.assertIn(int(resp['status']), HTTP_SUCCESS)
+
+ nafter = self._get_bytes_used()
+ self.assertEqual(nbefore + len(data), nafter)
+
+ @testtools.skipIf(not container_quotas_available, SKIP_MSG)
+ @attr(type="smoke")
+ def test_upload_large_object(self):
+ """Attempts to upload an object lagger than the bytes quota."""
+ object_name = rand_name(name="TestObject")
+ data = arbitrary_string(QUOTA_BYTES + 1)
+
+ nbefore = self._get_bytes_used()
+
+ self.assertRaises(exceptions.OverLimit,
+ self.object_client.create_object,
+ self.container_name, object_name, data)
+
+ nafter = self._get_bytes_used()
+ self.assertEqual(nbefore, nafter)
+
+ @testtools.skipIf(not container_quotas_available, SKIP_MSG)
+ @attr(type="smoke")
+ def test_upload_too_many_objects(self):
+ """Attempts to upload many objects that exceeds the count limit."""
+ for _ in range(QUOTA_COUNT):
+ name = rand_name(name="TestObject")
+ self.object_client.create_object(self.container_name, name, "")
+
+ nbefore = self._get_object_count()
+ self.assertEqual(nbefore, QUOTA_COUNT)
+
+ self.assertRaises(exceptions.OverLimit,
+ self.object_client.create_object,
+ self.container_name, "OverQuotaObject", "")
+
+ nafter = self._get_object_count()
+ self.assertEqual(nbefore, nafter)
+
+ def _get_container_metadata(self):
+ resp, _ = self.container_client.list_container_metadata(
+ self.container_name)
+ return resp
+
+ def _get_object_count(self):
+ resp = self._get_container_metadata()
+ return int(resp["x-container-object-count"])
+
+ def _get_bytes_used(self):
+ resp = self._get_container_metadata()
+ return int(resp["x-container-bytes-used"])
diff --git a/tempest/api/object_storage/test_container_services.py b/tempest/api/object_storage/test_container_services.py
index eaaed39..4b49d73 100644
--- a/tempest/api/object_storage/test_container_services.py
+++ b/tempest/api/object_storage/test_container_services.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/object_storage/test_container_sync.py b/tempest/api/object_storage/test_container_sync.py
index 66a74e4..a43b2b5 100644
--- a/tempest/api/object_storage/test_container_sync.py
+++ b/tempest/api/object_storage/test_container_sync.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/object_storage/test_object_expiry.py b/tempest/api/object_storage/test_object_expiry.py
index 889436d..db38401 100644
--- a/tempest/api/object_storage/test_object_expiry.py
+++ b/tempest/api/object_storage/test_object_expiry.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/object_storage/test_object_services.py b/tempest/api/object_storage/test_object_services.py
index dd724c7..407c3ec 100644
--- a/tempest/api/object_storage/test_object_services.py
+++ b/tempest/api/object_storage/test_object_services.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -16,7 +16,6 @@
# under the License.
import hashlib
-import time
from tempest.api.object_storage import base
from tempest.common.utils.data_utils import arbitrary_string
@@ -225,44 +224,6 @@
self.assertEqual(resp[actual_meta_key], meta_value)
@attr(type='gate')
- def test_get_object_using_temp_url(self):
- # access object using temporary URL within expiration time
-
- try:
- # update account metadata
- # flag to check if account metadata got updated
- flag = False
- key = 'Meta'
- metadata = {'Temp-URL-Key': key}
- resp, _ = self.account_client.create_account_metadata(
- metadata=metadata)
- self.assertIn(int(resp['status']), HTTP_SUCCESS)
- flag = True
- resp, _ = self.account_client.list_account_metadata()
- self.assertIn('x-account-meta-temp-url-key', resp)
- self.assertEqual(resp['x-account-meta-temp-url-key'], key)
-
- # create object
- object_name = rand_name(name='ObjectTemp')
- data = arbitrary_string(size=len(object_name),
- base_text=object_name)
- self.object_client.create_object(self.container_name,
- object_name, data)
- expires = int(time.time() + 10)
-
- # trying to get object using temp url with in expiry time
- _, body = self.object_client.get_object_using_temp_url(
- self.container_name, object_name,
- expires, key)
- self.assertEqual(body, data)
- finally:
- if flag:
- resp, _ = self.account_client.delete_account_metadata(
- metadata=metadata)
- resp, _ = self.account_client.list_account_metadata()
- self.assertNotIn('x-account-meta-temp-url-key', resp)
-
- @attr(type='gate')
def test_object_upload_in_segments(self):
# create object
object_name = rand_name(name='LObject')
diff --git a/tempest/api/object_storage/test_object_temp_url.py b/tempest/api/object_storage/test_object_temp_url.py
new file mode 100644
index 0000000..0fd5499
--- /dev/null
+++ b/tempest/api/object_storage/test_object_temp_url.py
@@ -0,0 +1,157 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+# Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
+#
+# Author: Joe H. Rahme <joe.hakim.rahme@enovance.com>
+#
+# 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 hashlib
+import hmac
+import time
+import urlparse
+
+from tempest.api.object_storage import base
+from tempest.common.utils.data_utils import arbitrary_string
+from tempest.common.utils.data_utils import rand_name
+from tempest import exceptions
+from tempest.test import attr
+from tempest.test import HTTP_SUCCESS
+
+
+class ObjectTempUrlTest(base.BaseObjectTest):
+
+ @classmethod
+ def setUpClass(cls):
+ super(ObjectTempUrlTest, cls).setUpClass()
+ cls.container_name = rand_name(name='TestContainer')
+ cls.container_client.create_container(cls.container_name)
+ cls.containers = [cls.container_name]
+
+ # update account metadata
+ cls.key = 'Meta'
+ cls.metadata = {'Temp-URL-Key': cls.key}
+ cls.account_client.create_account_metadata(metadata=cls.metadata)
+ cls.account_client_metadata, _ = \
+ cls.account_client.list_account_metadata()
+
+ @classmethod
+ def tearDownClass(cls):
+ resp, _ = cls.account_client.delete_account_metadata(
+ metadata=cls.metadata)
+ resp, _ = cls.account_client.list_account_metadata()
+
+ cls.delete_containers(cls.containers)
+ # delete the user setup created
+ cls.data.teardown_all()
+ super(ObjectTempUrlTest, cls).tearDownClass()
+
+ def setUp(self):
+ super(ObjectTempUrlTest, self).setUp()
+ # make sure the metadata has been set
+ self.assertIn('x-account-meta-temp-url-key',
+ self.account_client_metadata)
+
+ self.assertEqual(
+ self.account_client_metadata['x-account-meta-temp-url-key'],
+ self.key)
+
+ # create object
+ self.object_name = rand_name(name='ObjectTemp')
+ self.data = arbitrary_string(size=len(self.object_name),
+ base_text=self.object_name)
+ self.object_client.create_object(self.container_name,
+ self.object_name, self.data)
+
+ def get_temp_url(self, container, object_name, method, expires,
+ key):
+ """Create the temporary URL."""
+
+ path = "%s/%s/%s" % (
+ urlparse.urlparse(self.object_client.base_url).path,
+ container, object_name)
+
+ hmac_body = '%s\n%s\n%s' % (method, expires, path)
+ sig = hmac.new(key, hmac_body, hashlib.sha1).hexdigest()
+
+ url = "%s/%s?temp_url_sig=%s&temp_url_expires=%s" % (container,
+ object_name,
+ sig, expires)
+
+ return url
+
+ @attr(type='gate')
+ def test_get_object_using_temp_url(self):
+ EXPIRATION_TIME = 10000 # high to ensure the test finishes.
+ expires = int(time.time() + EXPIRATION_TIME)
+
+ # get a temp URL for the created object
+ url = self.get_temp_url(self.container_name,
+ self.object_name, "GET",
+ expires, self.key)
+
+ # trying to get object using temp url within expiry time
+ _, body = self.object_client.get_object_using_temp_url(url)
+
+ self.assertEqual(body, self.data)
+
+ # Testing a HEAD on this Temp URL
+ resp, body = self.object_client.head(url)
+ self.assertIn(int(resp['status']), HTTP_SUCCESS)
+
+ @attr(type='gate')
+ def test_put_object_using_temp_url(self):
+ # make sure the metadata has been set
+ new_data = arbitrary_string(size=len(self.object_name),
+ base_text=rand_name(name="random"))
+
+ EXPIRATION_TIME = 10000 # high to ensure the test finishes.
+ expires = int(time.time() + EXPIRATION_TIME)
+
+ url = self.get_temp_url(self.container_name,
+ self.object_name, "PUT",
+ expires, self.key)
+
+ # trying to put random data in the object using temp url
+ resp, body = self.object_client.put_object_using_temp_url(
+ url, new_data)
+
+ self.assertIn(int(resp['status']), HTTP_SUCCESS)
+
+ # Testing a HEAD on this Temp URL
+ resp, body = self.object_client.head(url)
+ self.assertIn(int(resp['status']), HTTP_SUCCESS)
+
+ # Validate that the content of the object has been modified
+ url = self.get_temp_url(self.container_name,
+ self.object_name, "GET",
+ expires, self.key)
+
+ _, body = self.object_client.get_object_using_temp_url(url)
+ self.assertEqual(body, new_data)
+
+ @attr(type=['gate', 'negative'])
+ def test_get_object_after_expiration_time(self):
+ EXPIRATION_TIME = 1
+ expires = int(time.time() + EXPIRATION_TIME)
+
+ # get a temp URL for the created object
+ url = self.get_temp_url(self.container_name,
+ self.object_name, "GET",
+ expires, self.key)
+
+ # temp URL is valid for 1 seconds, let's wait 3
+ time.sleep(EXPIRATION_TIME + 2)
+
+ self.assertRaises(exceptions.Unauthorized,
+ self.object_client.get_object_using_temp_url,
+ url)
diff --git a/tempest/api/object_storage/test_object_version.py b/tempest/api/object_storage/test_object_version.py
index 2b93c32..2b75b77 100644
--- a/tempest/api/object_storage/test_object_version.py
+++ b/tempest/api/object_storage/test_object_version.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/orchestration/stacks/test_limits.py b/tempest/api/orchestration/stacks/test_limits.py
new file mode 100644
index 0000000..aa59581
--- /dev/null
+++ b/tempest/api/orchestration/stacks/test_limits.py
@@ -0,0 +1,45 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# 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 logging
+
+from tempest.api.orchestration import base
+from tempest.common.utils.data_utils import rand_name
+from tempest import exceptions
+from tempest.test import attr
+
+
+LOG = logging.getLogger(__name__)
+
+
+class TestServerStackLimits(base.BaseOrchestrationTest):
+ _interface = 'json'
+
+ @classmethod
+ def setUpClass(cls):
+ super(TestServerStackLimits, cls).setUpClass()
+ cls.client = cls.orchestration_client
+ cls.stack_name = rand_name('heat')
+
+ @attr(type='gate')
+ def test_exceed_max_template_size_fails(self):
+ fill = 'A' * self.orchestration_cfg.max_template_size
+ template = '''
+HeatTemplateFormatVersion: '2012-12-12'
+Description: '%s'
+Outputs:
+ Foo: bar''' % fill
+ ex = self.assertRaises(exceptions.BadRequest, self.create_stack,
+ self.stack_name, template)
+ self.assertIn('Template exceeds maximum allowed size', str(ex))
diff --git a/tempest/api/utils.py b/tempest/api/utils.py
index 69ab7fb..be6bdba 100644
--- a/tempest/api/utils.py
+++ b/tempest/api/utils.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/volume/admin/test_volume_types.py b/tempest/api/volume/admin/test_volume_types.py
index b15f8dd..c455566 100644
--- a/tempest/api/volume/admin/test_volume_types.py
+++ b/tempest/api/volume/admin/test_volume_types.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -52,7 +52,7 @@
# List Volume types.
resp, body = self.client.list_volume_types()
self.assertEqual(200, resp.status)
- self.assertTrue(type(body), list)
+ self.assertIsInstance(body, list)
@attr(type='smoke')
def test_create_get_delete_volume_with_volume_type_and_extra_specs(self):
diff --git a/tempest/api/volume/admin/test_volume_types_extra_specs.py b/tempest/api/volume/admin/test_volume_types_extra_specs.py
index 7d94f58..d6dd7db 100644
--- a/tempest/api/volume/admin/test_volume_types_extra_specs.py
+++ b/tempest/api/volume/admin/test_volume_types_extra_specs.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -46,7 +46,7 @@
resp, body = self.client.list_volume_types_extra_specs(
self.volume_type['id'])
self.assertEqual(200, resp.status)
- self.assertTrue(type(body), dict)
+ self.assertIsInstance(body, dict)
self.assertTrue('spec1' in body, "Incorrect volume type extra"
" spec returned")
diff --git a/tempest/api/volume/admin/test_volume_types_extra_specs_negative.py b/tempest/api/volume/admin/test_volume_types_extra_specs_negative.py
index 0507a99..e76c0ac 100644
--- a/tempest/api/volume/admin/test_volume_types_extra_specs_negative.py
+++ b/tempest/api/volume/admin/test_volume_types_extra_specs_negative.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/volume/admin/test_volume_types_negative.py b/tempest/api/volume/admin/test_volume_types_negative.py
index f94f0ea..44725df 100644
--- a/tempest/api/volume/admin/test_volume_types_negative.py
+++ b/tempest/api/volume/admin/test_volume_types_negative.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/volume/base.py b/tempest/api/volume/base.py
index 7781647..98694c5 100644
--- a/tempest/api/volume/base.py
+++ b/tempest/api/volume/base.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/volume/test_volumes_actions.py b/tempest/api/volume/test_volumes_actions.py
index ad80505..19e3fc6 100644
--- a/tempest/api/volume/test_volumes_actions.py
+++ b/tempest/api/volume/test_volumes_actions.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/volume/test_volumes_get.py b/tempest/api/volume/test_volumes_get.py
index 70fe1a3..f2915f7 100644
--- a/tempest/api/volume/test_volumes_get.py
+++ b/tempest/api/volume/test_volumes_get.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -34,6 +34,15 @@
self.assertEqual(202, resp.status)
self.client.wait_for_resource_deletion(volume_id)
+ def _is_true(self, val):
+ # NOTE(jdg): Temporary conversion method to get cinder patch
+ # merged. Then we'll make this strict again and
+ #specifically check "true" or "false"
+ if val in ['true', 'True', True]:
+ return True
+ else:
+ return False
+
def _volume_create_get_update_delete(self, **kwargs):
# Create a volume, Get it's details and Delete the volume
volume = {}
@@ -69,10 +78,14 @@
fetched_volume['metadata'],
'The fetched Volume is different '
'from the created Volume')
+
+ # NOTE(jdg): Revert back to strict true/false checking
+ # after fix for bug #1227837 merges
+ boot_flag = self._is_true(fetched_volume['bootable'])
if 'imageRef' in kwargs:
- self.assertEqual(fetched_volume['bootable'], True)
+ self.assertEqual(boot_flag, True)
if 'imageRef' not in kwargs:
- self.assertEqual(fetched_volume['bootable'], False)
+ self.assertEqual(boot_flag, False)
# Update Volume
new_v_name = rand_name('new-Volume')
@@ -92,10 +105,14 @@
self.assertEqual(new_v_name, updated_volume['display_name'])
self.assertEqual(new_desc, updated_volume['display_description'])
self.assertEqual(metadata, updated_volume['metadata'])
+
+ # NOTE(jdg): Revert back to strict true/false checking
+ # after fix for bug #1227837 merges
+ boot_flag = self._is_true(updated_volume['bootable'])
if 'imageRef' in kwargs:
- self.assertEqual(updated_volume['bootable'], True)
+ self.assertEqual(boot_flag, True)
if 'imageRef' not in kwargs:
- self.assertEqual(updated_volume['bootable'], False)
+ self.assertEqual(boot_flag, False)
@attr(type='gate')
def test_volume_get_metadata_none(self):
diff --git a/tempest/api/volume/test_volumes_list.py b/tempest/api/volume/test_volumes_list.py
index d9c9e48..32eecfb 100644
--- a/tempest/api/volume/test_volumes_list.py
+++ b/tempest/api/volume/test_volumes_list.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/api/volume/test_volumes_negative.py b/tempest/api/volume/test_volumes_negative.py
index 014ab32..a48cea2 100644
--- a/tempest/api/volume/test_volumes_negative.py
+++ b/tempest/api/volume/test_volumes_negative.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -15,6 +15,8 @@
# License for the specific language governing permissions and limitations
# under the License.
+import uuid
+
from tempest.api.volume import base
from tempest.common.utils.data_utils import rand_name
from tempest import exceptions
@@ -29,37 +31,24 @@
super(VolumesNegativeTest, cls).setUpClass()
cls.client = cls.volumes_client
+ # Create a test shared instance and volume for attach/detach tests
+ vol_name = rand_name('Volume-')
+
+ cls.volume = cls.create_volume(size=1, display_name=vol_name)
+ cls.client.wait_for_volume_status(cls.volume['id'], 'available')
+ cls.mountpoint = "/dev/vdc"
+
@attr(type='gate')
def test_volume_get_nonexistant_volume_id(self):
- # Should not be able to get a non-existent volume
- # Creating a non-existent volume id
- volume_id_list = []
- resp, volumes = self.client.list_volumes()
- for i in range(len(volumes)):
- volume_id_list.append(volumes[i]['id'])
- while True:
- non_exist_id = rand_name('999')
- if non_exist_id not in volume_id_list:
- break
- # Trying to Get a non-existent volume
+ # Should not be able to get a non-existant volume
self.assertRaises(exceptions.NotFound, self.client.get_volume,
- non_exist_id)
+ str(uuid.uuid4()))
@attr(type='gate')
def test_volume_delete_nonexistant_volume_id(self):
- # Should not be able to delete a non-existent Volume
- # Creating non-existent volume id
- volume_id_list = []
- resp, volumes = self.client.list_volumes()
- for i in range(len(volumes)):
- volume_id_list.append(volumes[i]['id'])
- while True:
- non_exist_id = '12345678-abcd-4321-abcd-123456789098'
- if non_exist_id not in volume_id_list:
- break
- # Try to delete a non-existent volume
+ # Should not be able to delete a non-existant Volume
self.assertRaises(exceptions.NotFound, self.client.delete_volume,
- non_exist_id)
+ str(uuid.uuid4()))
@attr(type='gate')
def test_create_volume_with_invalid_size(self):
@@ -109,6 +98,26 @@
# Should not be able to delete volume when empty ID is passed
self.assertRaises(exceptions.NotFound, self.client.delete_volume, '')
+ @attr(type=['negative', 'gate'])
+ def test_attach_volumes_with_nonexistent_volume_id(self):
+ srv_name = rand_name('Instance-')
+ resp, server = self.servers_client.create_server(srv_name,
+ self.image_ref,
+ self.flavor_ref)
+ self.addCleanup(self.servers_client.delete_server, server['id'])
+ self.servers_client.wait_for_server_status(server['id'], 'ACTIVE')
+ self.assertRaises(exceptions.NotFound,
+ self.client.attach_volume,
+ str(uuid.uuid4()),
+ server['id'],
+ self.mountpoint)
+
+ @attr(type=['negative', 'gate'])
+ def test_detach_volumes_with_invalid_volume_id(self):
+ self.assertRaises(exceptions.NotFound,
+ self.client.detach_volume,
+ 'xxx')
+
class VolumesNegativeTestXML(VolumesNegativeTest):
_interface = 'xml'
diff --git a/tempest/clients.py b/tempest/clients.py
index 49b9283..63ce1ba 100644
--- a/tempest/clients.py
+++ b/tempest/clients.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/common/glance_http.py b/tempest/common/glance_http.py
index 831874d..e72cd9e 100644
--- a/tempest/common/glance_http.py
+++ b/tempest/common/glance_http.py
@@ -1,4 +1,4 @@
-# Copyright 2012 OpenStack LLC.
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/common/http.py b/tempest/common/http.py
index 49dca18..b70502c 100644
--- a/tempest/common/http.py
+++ b/tempest/common/http.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2013 OpenStack, LLC
+# Copyright 2013 OpenStack Foundation
# Copyright 2013 Citrix Systems, Inc.
# All Rights Reserved.
#
diff --git a/tempest/common/isolated_creds.py b/tempest/common/isolated_creds.py
index d6b4466..8c82ec0 100644
--- a/tempest/common/isolated_creds.py
+++ b/tempest/common/isolated_creds.py
@@ -14,7 +14,10 @@
# License for the specific language governing permissions and limitations
# under the License.
-import keystoneclient.v2_0.client
+import netaddr
+
+import keystoneclient.v2_0.client as keystoneclient
+import neutronclient.v2_0.client as neutronclient
from tempest import clients
from tempest.common.utils.data_utils import rand_name
@@ -30,97 +33,118 @@
def __init__(self, name, tempest_client=True, interface='json',
password='pass'):
self.isolated_creds = {}
+ self.isolated_net_resources = {}
+ self.ports = []
self.name = name
self.config = config.TempestConfig()
self.tempest_client = tempest_client
self.interface = interface
self.password = password
- self.admin_client = self._get_identity_admin_client()
+ self.identity_admin_client, self.network_admin_client = (
+ self._get_admin_clients())
- def _get_keystone_client(self):
+ def _get_official_admin_clients(self):
username = self.config.identity.admin_username
password = self.config.identity.admin_password
tenant_name = self.config.identity.admin_tenant_name
auth_url = self.config.identity.uri
dscv = self.config.identity.disable_ssl_certificate_validation
- return keystoneclient.v2_0.client.Client(username=username,
- password=password,
- tenant_name=tenant_name,
- auth_url=auth_url,
- insecure=dscv)
+ identity_client = keystoneclient.Client(username=username,
+ password=password,
+ tenant_name=tenant_name,
+ auth_url=auth_url,
+ insecure=dscv)
+ network_client = neutronclient.Client(username=username,
+ password=password,
+ tenant_name=tenant_name,
+ auth_url=auth_url,
+ insecure=dscv)
+ return identity_client, network_client
- def _get_identity_admin_client(self):
+ def _get_admin_clients(self):
"""
- Returns an instance of the Identity Admin API client
+ Returns a tuple with instances of the following admin clients (in this
+ order):
+ identity
+ network
"""
if self.tempest_client:
os = clients.AdminManager(interface=self.interface)
- admin_client = os.identity_client
+ admin_clients = (os.identity_client,
+ os.network_client,)
else:
- admin_client = self._get_keystone_client()
- return admin_client
+ admin_clients = self._get_official_admin_clients()
+ return admin_clients
def _create_tenant(self, name, description):
if self.tempest_client:
- resp, tenant = self.admin_client.create_tenant(
+ resp, tenant = self.identity_admin_client.create_tenant(
name=name, description=description)
else:
- tenant = self.admin_client.tenants.create(name,
- description=description)
+ tenant = self.identity_admin_client.tenants.create(
+ name,
+ description=description)
return tenant
def _get_tenant_by_name(self, name):
if self.tempest_client:
- resp, tenant = self.admin_client.get_tenant_by_name(name)
+ resp, tenant = self.identity_admin_client.get_tenant_by_name(name)
else:
- tenants = self.admin_client.tenants.list()
+ tenants = self.identity_admin_client.tenants.list()
for ten in tenants:
if ten['name'] == name:
tenant = ten
- raise exceptions.NotFound('No such tenant')
+ break
+ else:
+ raise exceptions.NotFound('No such tenant')
return tenant
def _create_user(self, username, password, tenant, email):
if self.tempest_client:
- resp, user = self.admin_client.create_user(username, password,
- tenant['id'], email)
+ resp, user = self.identity_admin_client.create_user(username,
+ password,
+ tenant['id'],
+ email)
else:
- user = self.admin_client.users.create(username, password, email,
- tenant_id=tenant.id)
+ user = self.identity_admin_client.users.create(username, password,
+ email,
+ tenant_id=tenant.id)
return user
def _get_user(self, tenant, username):
if self.tempest_client:
- resp, user = self.admin_client.get_user_by_username(tenant['id'],
- username)
+ resp, user = self.identity_admin_client.get_user_by_username(
+ tenant['id'],
+ username)
else:
- user = self.admin_client.users.get(username)
+ user = self.identity_admin_client.users.get(username)
return user
def _list_roles(self):
if self.tempest_client:
- resp, roles = self.admin_client.list_roles()
+ resp, roles = self.identity_admin_client.list_roles()
else:
- roles = self.admin_client.roles.list()
+ roles = self.identity_admin_client.roles.list()
return roles
def _assign_user_role(self, tenant, user, role):
if self.tempest_client:
- self.admin_client.assign_user_role(tenant, user, role)
+ self.identity_admin_client.assign_user_role(tenant, user, role)
else:
- self.admin_client.roles.add_user_role(user, role, tenant=tenant)
+ self.identity_admin_client.roles.add_user_role(user,
+ role, tenant=tenant)
def _delete_user(self, user):
if self.tempest_client:
- self.admin_client.delete_user(user)
+ self.identity_admin_client.delete_user(user)
else:
- self.admin_client.users.delete(user)
+ self.identity_admin_client.users.delete(user)
def _delete_tenant(self, tenant):
if self.tempest_client:
- self.admin_client.delete_tenant(tenant)
+ self.identity_admin_client.delete_tenant(tenant)
else:
- self.admin_client.tenants.delete(tenant)
+ self.identity_admin_client.tenants.delete(tenant)
def _create_creds(self, suffix=None, admin=False):
rand_name_root = rand_name(self.name)
@@ -128,7 +152,6 @@
rand_name_root += suffix
tenant_name = rand_name_root + "-tenant"
tenant_desc = tenant_name + "-desc"
- rand_name_root = rand_name(self.name)
tenant = self._create_tenant(name=tenant_name,
description=tenant_desc)
if suffix:
@@ -164,6 +187,92 @@
tenant_name = tenant.name
return username, tenant_name
+ def _get_tenant_id(self, tenant):
+ if self.tempest_client:
+ return tenant.get('id')
+ else:
+ return tenant.id
+
+ def _create_network_resources(self, tenant_id):
+ network = None
+ subnet = None
+ router = None
+ rand_name_root = rand_name(self.name)
+ network_name = rand_name_root + "-network"
+ network = self._create_network(network_name, tenant_id)
+ try:
+ subnet_name = rand_name_root + "-subnet"
+ subnet = self._create_subnet(subnet_name, tenant_id, network['id'])
+ router_name = rand_name_root + "-router"
+ router = self._create_router(router_name, tenant_id)
+ self._add_router_interface(router['id'], subnet['id'])
+ except Exception:
+ if router:
+ self._clear_isolated_router(router['id'], router['name'])
+ if subnet:
+ self._clear_isolated_subnet(subnet['id'], subnet['name'])
+ if network:
+ self._clear_isolated_network(network['id'], network['name'])
+ raise
+ return network, subnet, router
+
+ def _create_network(self, name, tenant_id):
+ if self.tempest_client:
+ resp, resp_body = self.network_admin_client.create_network(
+ name, tenant_id=tenant_id)
+ else:
+ body = {'network': {'tenant_id': tenant_id, 'name': name}}
+ resp_body = self.network_admin_client.create_network(body)
+ return resp_body['network']
+
+ def _create_subnet(self, subnet_name, tenant_id, network_id):
+ if not self.tempest_client:
+ body = {'subnet': {'name': subnet_name, 'tenant_id': tenant_id,
+ 'network_id': network_id, 'ip_version': 4}}
+ base_cidr = netaddr.IPNetwork(self.config.network.tenant_network_cidr)
+ mask_bits = self.config.network.tenant_network_mask_bits
+ for subnet_cidr in base_cidr.subnet(mask_bits):
+ try:
+ if self.tempest_client:
+ resp, resp_body = self.network_admin_client.create_subnet(
+ network_id, str(subnet_cidr), name=subnet_name,
+ tenant_id=tenant_id)
+ else:
+ body['subnet']['cidr'] = str(subnet_cidr)
+ resp_body = self.network_admin_client.create_subnet(body)
+ break
+ except exceptions.BadRequest as e:
+ if 'overlaps with another subnet' not in str(e):
+ raise
+ else:
+ e = exceptions.BuildErrorException()
+ e.message = 'Available CIDR for subnet creation could not be found'
+ raise e
+ return resp_body['subnet']
+
+ def _create_router(self, router_name, tenant_id):
+ external_net_id = dict(
+ network_id=self.config.network.public_network_id)
+ if self.tempest_client:
+ resp, resp_body = self.network_admin_client.create_router(
+ router_name,
+ external_gateway_info=external_net_id,
+ tenant_id=tenant_id)
+ else:
+ body = {'router': {'name': router_name, 'tenant_id': tenant_id,
+ 'external_gateway_info': external_net_id,
+ 'admin_state_up': True}}
+ resp_body = self.network_admin_client.create_router(body)
+ return resp_body['router']
+
+ def _add_router_interface(self, router_id, subnet_id):
+ if self.tempest_client:
+ self.network_admin_client.add_router_interface_with_subnet_id(
+ router_id, subnet_id)
+ else:
+ body = {'subnet_id': subnet_id}
+ self.network_admin_client.add_interface_router(router_id, body)
+
def get_primary_tenant(self):
return self.isolated_creds.get('primary')[1]
@@ -182,6 +291,33 @@
def get_admin_user(self):
return self.isolated_creds.get('admin')[0]
+ def get_primary_network(self):
+ return self.isolated_net_resources.get('primary')[0]
+
+ def get_primary_subnet(self):
+ return self.isolated_net_resources.get('primary')[1]
+
+ def get_primary_router(self):
+ return self.isolated_net_resources.get('primary')[2]
+
+ def get_admin_network(self):
+ return self.isolated_net_resources.get('admin')[0]
+
+ def get_admin_subnet(self):
+ return self.isolated_net_resources.get('admin')[1]
+
+ def get_admin_router(self):
+ return self.isolated_net_resources.get('admin')[2]
+
+ def get_alt_network(self):
+ return self.isolated_net_resources.get('alt')[0]
+
+ def get_alt_subnet(self):
+ return self.isolated_net_resources.get('alt')[1]
+
+ def get_alt_router(self):
+ return self.isolated_net_resources.get('alt')[2]
+
def get_primary_creds(self):
if self.isolated_creds.get('primary'):
user, tenant = self.isolated_creds['primary']
@@ -190,8 +326,15 @@
user, tenant = self._create_creds()
username, tenant_name = self._get_cred_names(user, tenant)
self.isolated_creds['primary'] = (user, tenant)
- LOG.info("Aquired isolated creds:\n user: %s, tenant: %s"
+ LOG.info("Acquired isolated creds:\n user: %s, tenant: %s"
% (username, tenant_name))
+ if self.config.service_available.neutron:
+ network, subnet, router = self._create_network_resources(
+ self._get_tenant_id(tenant))
+ self.isolated_net_resources['primary'] = (
+ network, subnet, router,)
+ LOG.info("Created isolated network resources for : \n"
+ + " user: %s, tenant: %s" % (username, tenant_name))
return username, tenant_name, self.password
def get_admin_creds(self):
@@ -202,9 +345,16 @@
user, tenant = self._create_creds(admin=True)
username, tenant_name = self._get_cred_names(user, tenant)
self.isolated_creds['admin'] = (user, tenant)
- LOG.info("Aquired admin isolated creds:\n user: %s, tenant: %s"
+ LOG.info("Acquired admin isolated creds:\n user: %s, tenant: %s"
% (username, tenant_name))
- return username, tenant_name, self.password
+ if self.config.service_available.neutron:
+ network, subnet, router = self._create_network_resources(
+ self._get_tenant_id(tenant))
+ self.isolated_net_resources['admin'] = (
+ network, subnet, router,)
+ LOG.info("Created isolated network resources for : \n"
+ + " user: %s, tenant: %s" % (username, tenant_name))
+ return username, tenant_name, self.password
def get_alt_creds(self):
if self.isolated_creds.get('alt'):
@@ -214,13 +364,93 @@
user, tenant = self._create_creds()
username, tenant_name = self._get_cred_names(user, tenant)
self.isolated_creds['alt'] = (user, tenant)
- LOG.info("Aquired alt isolated creds:\n user: %s, tenant: %s"
+ LOG.info("Acquired alt isolated creds:\n user: %s, tenant: %s"
% (username, tenant_name))
+ if self.config.service_available.neutron:
+ network, subnet, router = self._create_network_resources(
+ self._get_tenant_id(tenant))
+ self.isolated_net_resources['alt'] = (
+ network, subnet, router,)
+ LOG.info("Created isolated network resources for : \n"
+ + " user: %s, tenant: %s" % (username, tenant_name))
return username, tenant_name, self.password
+ def _clear_isolated_router(self, router_id, router_name):
+ net_client = self.network_admin_client
+ try:
+ net_client.delete_router(router_id)
+ except exceptions.NotFound:
+ LOG.warn('router with name: %s not found for delete' %
+ router_name)
+ pass
+
+ def _clear_isolated_subnet(self, subnet_id, subnet_name):
+ net_client = self.network_admin_client
+ try:
+ net_client.delete_subnet(subnet_id)
+ except exceptions.NotFound:
+ LOG.warn('subnet with name: %s not found for delete' %
+ subnet_name)
+ pass
+
+ def _clear_isolated_network(self, network_id, network_name):
+ net_client = self.network_admin_client
+ try:
+ net_client.delete_network(network_id)
+ except exceptions.NotFound:
+ LOG.warn('network with name: %s not found for delete' %
+ network_name)
+ pass
+
+ def _cleanup_ports(self, network_id):
+ # TODO(mlavalle) This method will be removed once patch
+ # https://review.openstack.org/#/c/46563/ merges in Neutron
+ if not self.ports:
+ if self.tempest_client:
+ resp, resp_body = self.network_admin_client.list_ports()
+ else:
+ resp_body = self.network_admin_client.list_ports()
+ self.ports = resp_body['ports']
+ ports_to_delete = [
+ port for port in self.ports if port['network_id'] == network_id]
+ for port in ports_to_delete:
+ try:
+ LOG.info('Cleaning up port id %s, name %s' %
+ (port['id'], port['name']))
+ self.network_admin_client.delete_port(port['id'])
+ except exceptions.NotFound:
+ LOG.warn('Port id: %s, name %s not found for clean-up' %
+ (port['id'], port['name']))
+
+ def _clear_isolated_net_resources(self):
+ net_client = self.network_admin_client
+ for cred in self.isolated_net_resources:
+ network, subnet, router = self.isolated_net_resources.get(cred)
+ try:
+ if self.tempest_client:
+ net_client.remove_router_interface_with_subnet_id(
+ router['id'], subnet['id'])
+ else:
+ body = {'subnet_id': subnet['id']}
+ net_client.remove_interface_router(router['id'], body)
+ except exceptions.NotFound:
+ LOG.warn('router with name: %s not found for delete' %
+ router['name'])
+ pass
+ self._clear_isolated_router(router['id'], router['name'])
+ # TODO(mlavalle) This method call will be removed once patch
+ # https://review.openstack.org/#/c/46563/ merges in Neutron
+ self._cleanup_ports(network['id'])
+ self._clear_isolated_subnet(subnet['id'], subnet['name'])
+ self._clear_isolated_network(network['id'], network['name'])
+ LOG.info("Cleared isolated network resources: \n"
+ + " network: %s, subnet: %s, router: %s"
+ % (network['name'], subnet['name'], router['name']))
+
def clear_isolated_creds(self):
if not self.isolated_creds:
return
+ self._clear_isolated_net_resources()
for cred in self.isolated_creds:
user, tenant = self.isolated_creds.get(cred)
try:
diff --git a/tempest/common/rest_client.py b/tempest/common/rest_client.py
index 81393a9..4b5127a 100644
--- a/tempest/common/rest_client.py
+++ b/tempest/common/rest_client.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# Copyright 2013 IBM Corp.
# All Rights Reserved.
#
@@ -32,6 +32,9 @@
MAX_RECURSION_DEPTH = 2
TOKEN_CHARS_RE = re.compile('^[-A-Za-z0-9+/=]*$')
+# All the successful HTTP status codes from RFC 2616
+HTTP_SUCCESS = (200, 201, 202, 203, 204, 205, 206)
+
class RestClient(object):
TYPE = "json"
@@ -77,6 +80,21 @@
self.http_obj = http.ClosingHttp(
disable_ssl_certificate_validation=dscv)
+ def __str__(self):
+ STRING_LIMIT = 80
+ str_format = ("config:%s, user:%s, password:%s, "
+ "auth_url:%s, tenant_name:%s, auth_version:%s, "
+ "service:%s, base_url:%s, region:%s, "
+ "endpoint_url:%s, build_interval:%s, build_timeout:%s"
+ "\ntoken:%s..., \nheaders:%s...")
+ return str_format % (self.config, self.user, self.password,
+ self.auth_url, self.tenant_name,
+ self.auth_version, self.service,
+ self.base_url, self.region, self.endpoint_url,
+ self.build_interval, self.build_timeout,
+ str(self.token)[0:STRING_LIMIT],
+ str(self.headers)[0:STRING_LIMIT])
+
def _set_auth(self):
"""
Sets the token and base_url used in requests based on the strategy type
@@ -266,6 +284,20 @@
raise exceptions.AuthenticationFailure(user=user,
password=password)
+ def expected_success(self, expected_code, read_code):
+ assert_msg = ("This function only allowed to use for HTTP status"
+ "codes which explicitly defined in the RFC 2616. {0}"
+ " is not a defined Success Code!").format(expected_code)
+ assert expected_code in HTTP_SUCCESS, assert_msg
+
+ # NOTE(afazekas): the http status code above 400 is processed by
+ # the _error_checker method
+ if read_code < 400 and read_code != expected_code:
+ pattern = """Unexpected http success status code {0},
+ The expected status code is {1}"""
+ details = pattern.format(read_code, expected_code)
+ raise exceptions.InvalidHttpSuccessCode(details)
+
def post(self, url, body, headers):
return self.request('POST', url, headers, body)
@@ -431,8 +463,8 @@
# NOTE(mtreinish): This is for compatibility with Glance and swift
# APIs. These are the return content types that Glance api v1
# (and occasionally swift) are using.
- TXT_ENC = ['text/plain; charset=UTF-8', 'text/html; charset=UTF-8',
- 'text/plain; charset=utf-8']
+ TXT_ENC = ['text/plain', 'text/plain; charset=UTF-8',
+ 'text/html; charset=UTF-8', 'text/plain; charset=utf-8']
XML_ENC = ['application/xml', 'application/xml; charset=UTF-8']
if ctype in JSON_ENC or ctype in XML_ENC:
diff --git a/tempest/common/ssh.py b/tempest/common/ssh.py
index 2052705..3eaa203 100644
--- a/tempest/common/ssh.py
+++ b/tempest/common/ssh.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/common/tempest_fixtures.py b/tempest/common/tempest_fixtures.py
new file mode 100644
index 0000000..081b271
--- /dev/null
+++ b/tempest/common/tempest_fixtures.py
@@ -0,0 +1,30 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2013 IBM Corp.
+# All Rights Reserved.
+#
+# 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 fixtures
+
+from tempest.openstack.common import lockutils
+
+
+class LockFixture(fixtures.Fixture):
+ def __init__(self, name):
+ self.mgr = lockutils.lock(name, 'tempest-', True)
+
+ def setUp(self):
+ super(LockFixture, self).setUp()
+ self.addCleanup(self.mgr.__exit__, None, None, None)
+ self.mgr.__enter__()
diff --git a/tempest/common/utils/data_utils.py b/tempest/common/utils/data_utils.py
index e75b54f..bbba235 100644
--- a/tempest/common/utils/data_utils.py
+++ b/tempest/common/utils/data_utils.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/common/utils/file_utils.py b/tempest/common/utils/file_utils.py
index 99047ab..b111e84 100644
--- a/tempest/common/utils/file_utils.py
+++ b/tempest/common/utils/file_utils.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/common/utils/misc.py b/tempest/common/utils/misc.py
index 8d945cf..1099ff5 100644
--- a/tempest/common/utils/misc.py
+++ b/tempest/common/utils/misc.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/config.py b/tempest/config.py
index 8058753..eadbe9a 100644
--- a/tempest/config.py
+++ b/tempest/config.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -182,8 +182,8 @@
"succeed."),
cfg.IntOpt('ready_wait',
default=0,
- help="Additinal wait time for clean state, when there is"
- " no OS-EXT-STS extension availiable"),
+ help="Additional wait time for clean state, when there is "
+ "no OS-EXT-STS extension available"),
cfg.IntOpt('ssh_channel_timeout',
default=60,
help="Timeout in seconds to wait for output from ssh "
@@ -273,7 +273,7 @@
cfg.StrOpt('http_image',
default='http://download.cirros-cloud.net/0.3.1/'
'cirros-0.3.1-x86_64-uec.tar.gz',
- help='http accessable image')
+ help='http accessible image')
]
@@ -393,6 +393,10 @@
cfg.BoolOpt('accounts_quotas_available',
default=True,
help="Set to True if the Account Quota middleware is enabled"),
+ cfg.BoolOpt('container_quotas_available',
+ default=True,
+ help="Set to True if the container quota middleware "
+ "is enabled"),
cfg.StrOpt('operator_role',
default='Member',
help="Role to add to users created for swift tests to "
@@ -442,6 +446,9 @@
cfg.StrOpt('keypair_name',
default=None,
help="Name of existing keypair to launch servers with."),
+ cfg.IntOpt('max_template_size',
+ default=10240,
+ help="Value must match heat configuration of the same name."),
]
@@ -695,6 +702,7 @@
register_stress_opts(cfg.CONF)
register_scenario_opts(cfg.CONF)
register_service_available_opts(cfg.CONF)
+ register_debug_opts(cfg.CONF)
self.compute = cfg.CONF.compute
self.identity = cfg.CONF.identity
self.images = cfg.CONF.image
@@ -708,6 +716,7 @@
self.stress = cfg.CONF.stress
self.scenario = cfg.CONF.scenario
self.service_available = cfg.CONF.service_available
+ self.debug = cfg.CONF.debug
if not self.compute_admin.username:
self.compute_admin.username = self.identity.admin_username
self.compute_admin.password = self.identity.admin_password
diff --git a/tempest/exceptions.py b/tempest/exceptions.py
index 924ebc9..158a216 100644
--- a/tempest/exceptions.py
+++ b/tempest/exceptions.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -57,6 +57,10 @@
pass
+class InvalidHttpSuccessCode(RestClientException):
+ message = "The success code is different than the expected one"
+
+
class NotFound(RestClientException):
message = "Object not found"
diff --git a/tempest/manager.py b/tempest/manager.py
index 54a0dec..e3aeb31 100644
--- a/tempest/manager.py
+++ b/tempest/manager.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/scenario/README.rst b/tempest/scenario/README.rst
index eea889a..ce12a3b 100644
--- a/tempest/scenario/README.rst
+++ b/tempest/scenario/README.rst
@@ -24,13 +24,12 @@
Scope of these tests
--------------------
-Scenario tests should always test at least 2 services in
-interaction. They should use the official python client libraries for
+Scenario tests should use the official python client libraries for
OpenStack, as they provide a more realistic approach in how people
will interact with the services.
-TODO: once we have service tags, tests should be tagged with which
-services they exercise.
+Tests should be tagged with which services they exercise, as
+determined by which client libraries are used directly by the test.
Example of a good test
diff --git a/tempest/scenario/manager.py b/tempest/scenario/manager.py
index 9137b93..c01de83 100644
--- a/tempest/scenario/manager.py
+++ b/tempest/scenario/manager.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# Copyright 2013 IBM Corp.
# All Rights Reserved.
#
@@ -374,8 +374,10 @@
**ruleset)
self.set_resource(sg_rule.id, sg_rule)
- def create_server(self, client, name=None, image=None, flavor=None,
+ def create_server(self, client=None, name=None, image=None, flavor=None,
create_kwargs={}):
+ if client is None:
+ client = self.compute_client
if name is None:
name = rand_name('scenario-server-')
if image is None:
@@ -476,12 +478,17 @@
@classmethod
def setUpClass(cls):
super(NetworkScenarioTest, cls).setUpClass()
- cls.tenant_id = cls.manager._get_identity_client(
- cls.config.identity.username,
- cls.config.identity.password,
- cls.config.identity.tenant_name).tenant_id
+ if cls.config.compute.allow_tenant_isolation:
+ cls.tenant_id = cls.isolated_creds.get_primary_tenant().id
+ else:
+ cls.tenant_id = cls.manager._get_identity_client(
+ cls.config.identity.username,
+ cls.config.identity.password,
+ cls.config.identity.tenant_name).tenant_id
- def _create_security_group(self, client, namestart='secgroup-smoke-'):
+ def _create_security_group(self, client=None, namestart='secgroup-smoke-'):
+ if client is None:
+ client = self.compute_client
# Create security group
sg_name = rand_name(namestart)
sg_desc = sg_name + " description"
diff --git a/tempest/scenario/test_minimum_basic.py b/tempest/scenario/test_minimum_basic.py
index ce4d1bd..752ff6f 100644
--- a/tempest/scenario/test_minimum_basic.py
+++ b/tempest/scenario/test_minimum_basic.py
@@ -87,8 +87,7 @@
def nova_boot(self):
create_kwargs = {'key_name': self.keypair.name}
- self.server = self.create_server(self.compute_client,
- image=self.image,
+ self.server = self.create_server(image=self.image,
create_kwargs=create_kwargs)
def nova_list(self):
diff --git a/tempest/scenario/test_network_basic_ops.py b/tempest/scenario/test_network_basic_ops.py
index daa7d13..6cd9fe8 100644
--- a/tempest/scenario/test_network_basic_ops.py
+++ b/tempest/scenario/test_network_basic_ops.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# Copyright 2013 Hewlett-Packard Development Company, L.P.
# All Rights Reserved.
#
@@ -110,10 +110,6 @@
def setUpClass(cls):
super(TestNetworkBasicOps, cls).setUpClass()
cls.check_preconditions()
- cls.tenant_id = cls.manager._get_identity_client(
- cls.config.identity.username,
- cls.config.identity.password,
- cls.config.identity.tenant_name).tenant_id
# TODO(mnewby) Consider looking up entities as needed instead
# of storing them as collections on the class.
cls.keypairs = {}
@@ -168,8 +164,7 @@
name=rand_name('keypair-smoke-'))
def _create_security_groups(self):
- self.security_groups[self.tenant_id] = self._create_security_group(
- self.compute_client)
+ self.security_groups[self.tenant_id] = self._create_security_group()
def _create_networks(self):
network = self._create_network(self.tenant_id)
@@ -214,8 +209,7 @@
'key_name': keypair_name,
'security_groups': security_groups,
}
- server = self.create_server(self.compute_client, name=name,
- create_kwargs=create_kwargs)
+ server = self.create_server(name=name, create_kwargs=create_kwargs)
return server
def _create_servers(self):
diff --git a/tempest/scenario/test_server_advanced_ops.py b/tempest/scenario/test_server_advanced_ops.py
index 9c50489..853b1ba 100644
--- a/tempest/scenario/test_server_advanced_ops.py
+++ b/tempest/scenario/test_server_advanced_ops.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -48,7 +48,7 @@
@services('compute')
def test_resize_server_confirm(self):
# We create an instance for use in this test
- instance = self.create_server(self.compute_client)
+ instance = self.create_server()
instance_id = instance.id
resize_flavor = self.config.compute.flavor_ref_alt
LOG.debug("Resizing instance %s from flavor %s to flavor %s",
@@ -66,7 +66,7 @@
@services('compute')
def test_server_sequence_suspend_resume(self):
# We create an instance for use in this test
- instance = self.create_server(self.compute_client)
+ instance = self.create_server()
instance_id = instance.id
LOG.debug("Suspending instance %s. Current status: %s",
instance_id, instance.status)
diff --git a/tempest/scenario/test_server_basic_ops.py b/tempest/scenario/test_server_basic_ops.py
index 04204eb..c32d49d 100644
--- a/tempest/scenario/test_server_basic_ops.py
+++ b/tempest/scenario/test_server_basic_ops.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -56,8 +56,7 @@
create_kwargs = {
'key_name': self.keypair.id
}
- instance = self.create_server(self.compute_client,
- create_kwargs=create_kwargs)
+ instance = self.create_server(create_kwargs=create_kwargs)
self.set_resource('instance', instance)
def pause_server(self):
diff --git a/tempest/scenario/test_snapshot_pattern.py b/tempest/scenario/test_snapshot_pattern.py
index 8c2cc76..ba347e0 100644
--- a/tempest/scenario/test_snapshot_pattern.py
+++ b/tempest/scenario/test_snapshot_pattern.py
@@ -34,8 +34,7 @@
create_kwargs = {
'key_name': self.keypair.name
}
- return self.create_server(self.compute_client, image=image_id,
- create_kwargs=create_kwargs)
+ return self.create_server(image=image_id, create_kwargs=create_kwargs)
def _add_keypair(self):
self.keypair = self.create_keypair()
diff --git a/tempest/scenario/test_stamp_pattern.py b/tempest/scenario/test_stamp_pattern.py
index 6766239..d8c9b8e 100644
--- a/tempest/scenario/test_stamp_pattern.py
+++ b/tempest/scenario/test_stamp_pattern.py
@@ -57,8 +57,7 @@
create_kwargs = {
'key_name': self.keypair.name
}
- return self.create_server(self.compute_client, image=image_id,
- create_kwargs=create_kwargs)
+ return self.create_server(image=image_id, create_kwargs=create_kwargs)
def _add_keypair(self):
self.keypair = self.create_keypair()
diff --git a/tempest/scenario/test_volume_boot_pattern.py b/tempest/scenario/test_volume_boot_pattern.py
index 3572166..d12cd56 100644
--- a/tempest/scenario/test_volume_boot_pattern.py
+++ b/tempest/scenario/test_volume_boot_pattern.py
@@ -49,8 +49,7 @@
'block_device_mapping': bd_map,
'key_name': keypair.name
}
- return self.create_server(self.compute_client,
- create_kwargs=create_kwargs)
+ return self.create_server(create_kwargs=create_kwargs)
def _create_snapshot_from_volume(self, vol_id):
volume_snapshots = self.volume_client.volume_snapshots
diff --git a/tempest/services/__init__.py b/tempest/services/__init__.py
index b2fdc5f..e210926 100644
--- a/tempest/services/__init__.py
+++ b/tempest/services/__init__.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/services/botoclients.py b/tempest/services/botoclients.py
index a689c89..0b4b3b9 100644
--- a/tempest/services/botoclients.py
+++ b/tempest/services/botoclients.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/services/compute/json/aggregates_client.py b/tempest/services/compute/json/aggregates_client.py
index 7ae1eee..75ce9ff 100644
--- a/tempest/services/compute/json/aggregates_client.py
+++ b/tempest/services/compute/json/aggregates_client.py
@@ -52,6 +52,19 @@
body = json.loads(body)
return resp, body['aggregate']
+ def update_aggregate(self, aggregate_id, name, availability_zone=None):
+ """Update a aggregate."""
+ put_body = {
+ 'name': name,
+ 'availability_zone': availability_zone
+ }
+ put_body = json.dumps({'aggregate': put_body})
+ resp, body = self.put('os-aggregates/%s' % str(aggregate_id),
+ put_body, self.headers)
+
+ body = json.loads(body)
+ return resp, body['aggregate']
+
def delete_aggregate(self, aggregate_id):
"""Deletes the given aggregate."""
return self.delete("os-aggregates/%s" % str(aggregate_id))
diff --git a/tempest/services/compute/json/extensions_client.py b/tempest/services/compute/json/extensions_client.py
index 583c3b4..ce46a9b 100644
--- a/tempest/services/compute/json/extensions_client.py
+++ b/tempest/services/compute/json/extensions_client.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/services/compute/json/flavors_client.py b/tempest/services/compute/json/flavors_client.py
index 5f58c43..c3b568d 100644
--- a/tempest/services/compute/json/flavors_client.py
+++ b/tempest/services/compute/json/flavors_client.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/services/compute/json/floating_ips_client.py b/tempest/services/compute/json/floating_ips_client.py
index 27733ac..8349263 100644
--- a/tempest/services/compute/json/floating_ips_client.py
+++ b/tempest/services/compute/json/floating_ips_client.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -94,3 +94,13 @@
except exceptions.NotFound:
return True
return False
+
+ def list_floating_ip_pools(self, params=None):
+ """Returns a list of all floating IP Pools."""
+ url = 'os-floating-ip-pools'
+ if params:
+ url += '?%s' % urllib.urlencode(params)
+
+ resp, body = self.get(url)
+ body = json.loads(body)
+ return resp, body['floating_ip_pools']
diff --git a/tempest/services/compute/json/images_client.py b/tempest/services/compute/json/images_client.py
index b13d0f1..5f17894 100644
--- a/tempest/services/compute/json/images_client.py
+++ b/tempest/services/compute/json/images_client.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -72,6 +72,7 @@
def get_image(self, image_id):
"""Returns the details of a single image."""
resp, body = self.get("images/%s" % str(image_id))
+ self.expected_success(200, resp)
body = json.loads(body)
return resp, body['image']
@@ -79,21 +80,6 @@
"""Deletes the provided image."""
return self.delete("images/%s" % str(image_id))
- def wait_for_image_resp_code(self, image_id, code):
- """
- Waits until the HTTP response code for the request matches the
- expected value
- """
- resp, body = self.get("images/%s" % str(image_id))
- start = int(time.time())
-
- while resp.status != code:
- time.sleep(self.build_interval)
- resp, body = self.get("images/%s" % str(image_id))
-
- if int(time.time()) - start >= self.build_timeout:
- raise exceptions.TimeoutException
-
def wait_for_image_status(self, image_id, status):
"""Waits for an image to reach a given status."""
resp, image = self.get_image(image_id)
diff --git a/tempest/services/compute/json/keypairs_client.py b/tempest/services/compute/json/keypairs_client.py
index a464816..5e1900c 100644
--- a/tempest/services/compute/json/keypairs_client.py
+++ b/tempest/services/compute/json/keypairs_client.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/services/compute/json/limits_client.py b/tempest/services/compute/json/limits_client.py
index 945477a..3e53e3e 100644
--- a/tempest/services/compute/json/limits_client.py
+++ b/tempest/services/compute/json/limits_client.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/services/compute/json/security_groups_client.py b/tempest/services/compute/json/security_groups_client.py
index 1dc11c4..1f01437 100644
--- a/tempest/services/compute/json/security_groups_client.py
+++ b/tempest/services/compute/json/security_groups_client.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/services/compute/json/servers_client.py b/tempest/services/compute/json/servers_client.py
index 1f2daec..990c986 100644
--- a/tempest/services/compute/json/servers_client.py
+++ b/tempest/services/compute/json/servers_client.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# Copyright 2013 Hewlett-Packard Development Company, L.P.
# All Rights Reserved.
#
diff --git a/tempest/services/compute/json/volumes_extensions_client.py b/tempest/services/compute/json/volumes_extensions_client.py
index d12b97b..d9906fd 100644
--- a/tempest/services/compute/json/volumes_extensions_client.py
+++ b/tempest/services/compute/json/volumes_extensions_client.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/services/compute/xml/aggregates_client.py b/tempest/services/compute/xml/aggregates_client.py
index 0ef8e22..8ef0af6 100644
--- a/tempest/services/compute/xml/aggregates_client.py
+++ b/tempest/services/compute/xml/aggregates_client.py
@@ -72,6 +72,17 @@
aggregate = self._format_aggregate(etree.fromstring(body))
return resp, aggregate
+ def update_aggregate(self, aggregate_id, name, availability_zone=None):
+ """Update a aggregate."""
+ put_body = Element("aggregate",
+ name=name,
+ availability_zone=availability_zone)
+ resp, body = self.put('os-aggregates/%s' % str(aggregate_id),
+ str(Document(put_body)),
+ self.headers)
+ aggregate = self._format_aggregate(etree.fromstring(body))
+ return resp, aggregate
+
def delete_aggregate(self, aggregate_id):
"""Deletes the given aggregate."""
return self.delete("os-aggregates/%s" % str(aggregate_id),
diff --git a/tempest/services/compute/xml/extensions_client.py b/tempest/services/compute/xml/extensions_client.py
index 3deaa55..1395b5a 100644
--- a/tempest/services/compute/xml/extensions_client.py
+++ b/tempest/services/compute/xml/extensions_client.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/services/compute/xml/flavors_client.py b/tempest/services/compute/xml/flavors_client.py
index 6fbb9e3..c5886ee 100644
--- a/tempest/services/compute/xml/flavors_client.py
+++ b/tempest/services/compute/xml/flavors_client.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/services/compute/xml/floating_ips_client.py b/tempest/services/compute/xml/floating_ips_client.py
index 278cc88..2fffaa2 100644
--- a/tempest/services/compute/xml/floating_ips_client.py
+++ b/tempest/services/compute/xml/floating_ips_client.py
@@ -107,3 +107,13 @@
except exceptions.NotFound:
return True
return False
+
+ def list_floating_ip_pools(self, params=None):
+ """Returns a list of all floating IP Pools."""
+ url = 'os-floating-ip-pools'
+ if params:
+ url += '?%s' % urllib.urlencode(params)
+
+ resp, body = self.get(url, self.headers)
+ body = self._parse_array(etree.fromstring(body))
+ return resp, body
diff --git a/tempest/services/compute/xml/images_client.py b/tempest/services/compute/xml/images_client.py
index cc13aa1..b17ae78 100644
--- a/tempest/services/compute/xml/images_client.py
+++ b/tempest/services/compute/xml/images_client.py
@@ -130,6 +130,7 @@
def get_image(self, image_id):
"""Returns the details of a single image."""
resp, body = self.get("images/%s" % str(image_id), self.headers)
+ self.expected_success(200, resp)
body = self._parse_image(etree.fromstring(body))
return resp, body
@@ -137,21 +138,6 @@
"""Deletes the provided image."""
return self.delete("images/%s" % str(image_id), self.headers)
- def wait_for_image_resp_code(self, image_id, code):
- """
- Waits until the HTTP response code for the request matches the
- expected value
- """
- resp, body = self.get("images/%s" % str(image_id), self.headers)
- start = int(time.time())
-
- while resp.status != code:
- time.sleep(self.build_interval)
- resp, body = self.get("images/%s" % str(image_id), self.headers)
-
- if int(time.time()) - start >= self.build_timeout:
- raise exceptions.TimeoutException
-
def wait_for_image_status(self, image_id, status):
"""Waits for an image to reach a given status."""
resp, image = self.get_image(image_id)
diff --git a/tempest/services/compute/xml/servers_client.py b/tempest/services/compute/xml/servers_client.py
index bf72bdc..9b688aa 100644
--- a/tempest/services/compute/xml/servers_client.py
+++ b/tempest/services/compute/xml/servers_client.py
@@ -193,6 +193,14 @@
server = self._parse_server(etree.fromstring(body))
return resp, server
+ def lock_server(self, server_id, **kwargs):
+ """Locks the given server."""
+ return self.action(server_id, 'lock', None, **kwargs)
+
+ def unlock_server(self, server_id, **kwargs):
+ """Unlocks the given server."""
+ return self.action(server_id, 'unlock', None, **kwargs)
+
def suspend_server(self, server_id, **kwargs):
"""Suspends the provided server."""
return self.action(server_id, 'suspend', None, **kwargs)
diff --git a/tempest/services/network/json/network_client.py b/tempest/services/network/json/network_client.py
index 369dd81..4b87b91 100644
--- a/tempest/services/network/json/network_client.py
+++ b/tempest/services/network/json/network_client.py
@@ -45,12 +45,9 @@
body = json.loads(body)
return resp, body
- def create_network(self, name):
- post_body = {
- 'network': {
- 'name': name,
- }
- }
+ def create_network(self, name, **kwargs):
+ post_body = {'network': kwargs}
+ post_body['network']['name'] = name
body = json.dumps(post_body)
uri = '%s/networks' % (self.uri_prefix)
resp, body = self.post(uri, headers=self.headers, body=body)
@@ -79,12 +76,11 @@
resp, body = self.delete(uri, self.headers)
return resp, body
- def create_subnet(self, net_uuid, cidr):
- post_body = dict(
- subnet=dict(
- ip_version=4,
- network_id=net_uuid,
- cidr=cidr),)
+ def create_subnet(self, net_uuid, cidr, ip_version=4, **kwargs):
+ post_body = {'subnet': kwargs}
+ post_body['subnet']['ip_version'] = ip_version
+ post_body['subnet']['network_id'] = net_uuid
+ post_body['subnet']['cidr'] = cidr
body = json.dumps(post_body)
uri = '%s/subnets' % (self.uri_prefix)
resp, body = self.post(uri, headers=self.headers, body=body)
@@ -206,16 +202,10 @@
body = json.loads(body)
return resp, body
- def create_router(self, name, **kwargs):
- post_body = {
- 'router': {
- 'name': name,
- }
- }
- post_body['router']['admin_state_up'] = kwargs.get(
- 'admin_state_up', True)
- post_body['router']['external_gateway_info'] = kwargs.get(
- 'external_gateway_info', None)
+ def create_router(self, name, admin_state_up=True, **kwargs):
+ post_body = {'router': kwargs}
+ post_body['router']['name'] = name
+ post_body['router']['admin_state_up'] = admin_state_up
body = json.dumps(post_body)
uri = '%s/routers' % (self.uri_prefix)
resp, body = self.post(uri, headers=self.headers, body=body)
@@ -598,3 +588,15 @@
health_monitor_id)
resp, body = self.delete(uri, headers=self.headers)
return resp, body
+
+ def list_extensions(self):
+ uri = '%s/extensions' % (self.uri_prefix)
+ resp, body = self.get(uri, self.headers)
+ body = json.loads(body)
+ return resp, body
+
+ def show_extension_details(self, ext_alias):
+ uri = '%s/extensions/%s' % (self.uri_prefix, ext_alias)
+ resp, body = self.get(uri, headers=self.headers)
+ body = json.loads(body)
+ return resp, body
diff --git a/tempest/services/network/xml/network_client.py b/tempest/services/network/xml/network_client.py
index a9b5512..1523ed0 100755
--- a/tempest/services/network/xml/network_client.py
+++ b/tempest/services/network/xml/network_client.py
@@ -428,6 +428,19 @@
health_monitor_id)
return self.delete(uri, self.headers)
+ def list_extensions(self):
+ url = '%s/extensions' % (self.uri_prefix)
+ resp, body = self.get(url, self.headers)
+ extensions = self._parse_array(etree.fromstring(body))
+ extensions = {"extensions": extensions}
+ return resp, extensions
+
+ def show_extension_details(self, ext_alias):
+ uri = '%s/extensions/%s' % (self.uri_prefix, str(ext_alias))
+ resp, body = self.get(uri, self.headers)
+ body = _root_tag_fetcher_and_xml_to_json_parse(body)
+ return resp, body
+
def _root_tag_fetcher_and_xml_to_json_parse(xml_returned_body):
body = ET.fromstring(xml_returned_body)
diff --git a/tempest/services/object_storage/account_client.py b/tempest/services/object_storage/account_client.py
index eb9910f..94b55c3 100644
--- a/tempest/services/object_storage/account_client.py
+++ b/tempest/services/object_storage/account_client.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/services/object_storage/container_client.py b/tempest/services/object_storage/container_client.py
index 75f7a33..166c945 100644
--- a/tempest/services/object_storage/container_client.py
+++ b/tempest/services/object_storage/container_client.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/services/object_storage/object_client.py b/tempest/services/object_storage/object_client.py
index c605a45..2fee042 100644
--- a/tempest/services/object_storage/object_client.py
+++ b/tempest/services/object_storage/object_client.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -15,10 +15,6 @@
# License for the specific language governing permissions and limitations
# under the License.
-import hashlib
-import hmac
-import urlparse
-
from tempest.common import http
from tempest.common.rest_client import RestClient
from tempest import exceptions
@@ -125,29 +121,20 @@
resp, body = self.copy(url, headers=headers)
return resp, body
- def get_object_using_temp_url(self, container, object_name, expires, key):
- """Retrieve object's data using temporary URL."""
-
- self._set_auth()
- method = 'GET'
- path = "%s/%s/%s" % (urlparse.urlparse(self.base_url).path, container,
- object_name)
- hmac_body = '%s\n%s\n%s' % (method, expires, path)
- sig = hmac.new(key, hmac_body, hashlib.sha1).hexdigest()
-
- url = "%s/%s?temp_url_sig=%s&temp_url_expires=%s" % (container,
- object_name,
- sig, expires)
-
- resp, body = self.get(url)
- return resp, body
-
def create_object_segments(self, container, object_name, segment, data):
"""Creates object segments."""
url = "{0}/{1}/{2}".format(container, object_name, segment)
resp, body = self.put(url, data, self.headers)
return resp, body
+ def get_object_using_temp_url(self, url):
+ """Retrieve object's data using temp URL."""
+ return self.get(url)
+
+ def put_object_using_temp_url(self, url, data):
+ """Put data in an object using temp URL."""
+ return self.put(url, data, None)
+
class ObjectClientCustomizedHeader(RestClient):
diff --git a/tempest/services/volume/json/admin/volume_types_client.py b/tempest/services/volume/json/admin/volume_types_client.py
index 0cadcb5..44ad785 100644
--- a/tempest/services/volume/json/admin/volume_types_client.py
+++ b/tempest/services/volume/json/admin/volume_types_client.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/services/volume/json/volumes_client.py b/tempest/services/volume/json/volumes_client.py
index 32b6270..62a6e24 100644
--- a/tempest/services/volume/json/volumes_client.py
+++ b/tempest/services/volume/json/volumes_client.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/services/volume/xml/volumes_client.py b/tempest/services/volume/xml/volumes_client.py
index 7915637..b59ec03 100644
--- a/tempest/services/volume/xml/volumes_client.py
+++ b/tempest/services/volume/xml/volumes_client.py
@@ -65,9 +65,14 @@
Check if the volume is bootable, also change the value
of 'bootable' from string to boolean.
"""
- if volume['bootable'] == 'True':
+
+ # NOTE(jdg): Version 1 of Cinder API uses lc strings
+ # We should consider being explicit in this check to
+ # avoid introducing bugs like: LP #1227837
+
+ if volume['bootable'].lower() == 'true':
volume['bootable'] = True
- elif volume['bootable'] == 'False':
+ elif volume['bootable'].lower() == 'false':
volume['bootable'] = False
else:
raise ValueError(
diff --git a/tempest/stress/README.rst b/tempest/stress/README.rst
index 7c180f6..ae86f6e 100644
--- a/tempest/stress/README.rst
+++ b/tempest/stress/README.rst
@@ -31,7 +31,7 @@
To test installation, do the following (from the tempest/stress directory):
- ./run_stress.py etc/server-create-destroy-test.json -d 30
+ ./run_stress.py -t etc/server-create-destroy-test.json -d 30
This sample test tries to create a few VMs and kill a few VMs.
diff --git a/tempest/stress/driver.py b/tempest/stress/driver.py
index e518d28..8209f17 100644
--- a/tempest/stress/driver.py
+++ b/tempest/stress/driver.py
@@ -13,6 +13,7 @@
# limitations under the License.
import multiprocessing
+import os
import signal
import time
@@ -34,11 +35,14 @@
username = admin_manager.config.stress.target_ssh_user
key_filename = admin_manager.config.stress.target_private_key_path
if not (username and key_filename):
+ LOG.error('username and key_filename should not be empty')
return None
ssh_client = ssh.Client(host, username, key_filename=key_filename)
try:
return ssh_client.exec_command(command)
except exceptions.SSHExecCommandFailed:
+ LOG.error('do_ssh raise exception. command:%s, host:%s.'
+ % (command, host))
return None
@@ -87,12 +91,22 @@
"""
Goes through the process list and terminates all child processes.
"""
+ log_check_interval = int(admin_manager.config.stress.log_check_interval)
for process in processes:
if process['process'].is_alive():
try:
process['process'].terminate()
except Exception:
pass
+ time.sleep(log_check_interval)
+ for process in processes:
+ if process['process'].is_alive():
+ try:
+ pid = process['process'].pid
+ LOG.warn("Process %d hangs. Send SIGKILL." % pid)
+ os.kill(pid, signal.SIGKILL)
+ except Exception:
+ pass
process['process'].join()
diff --git a/tempest/stress/stressaction.py b/tempest/stress/stressaction.py
index 45a628d..61e46fa 100644
--- a/tempest/stress/stressaction.py
+++ b/tempest/stress/stressaction.py
@@ -30,7 +30,10 @@
self.stop_on_error = stop_on_error
def _shutdown_handler(self, signal, frame):
- self.tearDown()
+ try:
+ self.tearDown()
+ except Exception:
+ self.logger.exception("Error while tearDown")
sys.exit(0)
@property
diff --git a/tempest/test.py b/tempest/test.py
index 24c4489..6acb1c9 100644
--- a/tempest/test.py
+++ b/tempest/test.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/thirdparty/boto/test.py b/tempest/thirdparty/boto/test.py
index e0c9f06..5295e44 100644
--- a/tempest/thirdparty/boto/test.py
+++ b/tempest/thirdparty/boto/test.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/thirdparty/boto/test_ec2_instance_run.py b/tempest/thirdparty/boto/test_ec2_instance_run.py
index 7fab364..bce544a 100644
--- a/tempest/thirdparty/boto/test_ec2_instance_run.py
+++ b/tempest/thirdparty/boto/test_ec2_instance_run.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -188,13 +188,13 @@
self.assertEqual(tags[0].value, 'value1')
tags = self.ec2_client.get_all_tags(filters={'key': 'value2'})
- self.assertEqual(len(tags), 0)
+ self.assertEqual(len(tags), 0, str(tags))
for instance in reservation.instances:
instance.remove_tag('key1', value='value1')
tags = self.ec2_client.get_all_tags()
- self.assertEqual(len(tags), 0)
+ self.assertEqual(len(tags), 0, str(tags))
for instance in reservation.instances:
instance.stop()
diff --git a/tempest/thirdparty/boto/test_ec2_keys.py b/tempest/thirdparty/boto/test_ec2_keys.py
index 1b4d7ec..85a99c0 100644
--- a/tempest/thirdparty/boto/test_ec2_keys.py
+++ b/tempest/thirdparty/boto/test_ec2_keys.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/thirdparty/boto/test_ec2_network.py b/tempest/thirdparty/boto/test_ec2_network.py
index 6226dbb..ae8c3c2 100644
--- a/tempest/thirdparty/boto/test_ec2_network.py
+++ b/tempest/thirdparty/boto/test_ec2_network.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/thirdparty/boto/test_ec2_security_groups.py b/tempest/thirdparty/boto/test_ec2_security_groups.py
index 81ddcf6..3b10cfa 100644
--- a/tempest/thirdparty/boto/test_ec2_security_groups.py
+++ b/tempest/thirdparty/boto/test_ec2_security_groups.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/thirdparty/boto/test_ec2_volumes.py b/tempest/thirdparty/boto/test_ec2_volumes.py
index dbb3104..faff3ca 100644
--- a/tempest/thirdparty/boto/test_ec2_volumes.py
+++ b/tempest/thirdparty/boto/test_ec2_volumes.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/thirdparty/boto/test_s3_buckets.py b/tempest/thirdparty/boto/test_s3_buckets.py
index b28f751..e43cbaa 100644
--- a/tempest/thirdparty/boto/test_s3_buckets.py
+++ b/tempest/thirdparty/boto/test_s3_buckets.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/thirdparty/boto/test_s3_ec2_images.py b/tempest/thirdparty/boto/test_s3_ec2_images.py
index 26c2701..aaf2569 100644
--- a/tempest/thirdparty/boto/test_s3_ec2_images.py
+++ b/tempest/thirdparty/boto/test_s3_ec2_images.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/thirdparty/boto/test_s3_objects.py b/tempest/thirdparty/boto/test_s3_objects.py
index daacb12..188d1db 100644
--- a/tempest/thirdparty/boto/test_s3_objects.py
+++ b/tempest/thirdparty/boto/test_s3_objects.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/thirdparty/boto/utils/s3.py b/tempest/thirdparty/boto/utils/s3.py
index f8fa61b..56e1191 100644
--- a/tempest/thirdparty/boto/utils/s3.py
+++ b/tempest/thirdparty/boto/utils/s3.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tempest/thirdparty/boto/utils/wait.py b/tempest/thirdparty/boto/utils/wait.py
index a44e283..1cd847b 100644
--- a/tempest/thirdparty/boto/utils/wait.py
+++ b/tempest/thirdparty/boto/utils/wait.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/test-requirements.txt b/test-requirements.txt
index 1ede25e..8aa6ed9 100644
--- a/test-requirements.txt
+++ b/test-requirements.txt
@@ -3,3 +3,4 @@
docutils==0.9.1
sphinx>=1.1.2
python-subunit
+oslo.sphinx
diff --git a/tools/install_venv.py b/tools/install_venv.py
index f37e0cd..84d0fd9 100644
--- a/tools/install_venv.py
+++ b/tools/install_venv.py
@@ -4,7 +4,7 @@
# Administrator of the National Aeronautics and Space Administration.
# All Rights Reserved.
# flake8: noqa
-# Copyright 2010 OpenStack, LLC
+# Copyright 2010 OpenStack Foundation
# Copyright 2013 IBM Corp.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tools/install_venv_common.py b/tools/install_venv_common.py
index 0999e2c..92d66ae 100644
--- a/tools/install_venv_common.py
+++ b/tools/install_venv_common.py
@@ -119,8 +119,7 @@
self.pip_install('setuptools')
self.pip_install('pbr')
- self.pip_install('-r', self.requirements)
- self.pip_install('-r', self.test_requirements)
+ self.pip_install('-r', self.requirements, '-r', self.test_requirements)
def post_process(self):
self.get_distro().post_process()
diff --git a/tools/skip_tracker.py b/tools/skip_tracker.py
index c244808..c38ccdb 100755
--- a/tools/skip_tracker.py
+++ b/tools/skip_tracker.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-# Copyright 2012 OpenStack, LLC
+# Copyright 2012 OpenStack Foundation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/tox.ini b/tox.ini
index 0b57eb2..abc9e42 100644
--- a/tox.ini
+++ b/tox.ini
@@ -30,6 +30,7 @@
[testenv:heat-slow]
sitepackages = True
setenv = VIRTUAL_ENV={envdir}
+ OS_TEST_TIMEOUT=1200
# The regex below is used to select heat api/scenario tests tagged as slow.
commands =
sh tools/pretty_tox_serial.sh '(?=.*\[.*\bslow\b.*\])(^tempest\.(api|scenario)\.orchestration) {posargs}'
@@ -85,7 +86,7 @@
sitepackages = True
setenv = VIRTUAL_ENV={envdir}
commands =
- python -m tempest/stress/run_stress -a -d 3600
+ python -m tempest/stress/run_stress -a -d 3600 -S
[testenv:venv]
commands = {posargs}