Merge "Add cinder_available config option."
diff --git a/tempest/api/compute/servers/test_list_servers_negative.py b/tempest/api/compute/servers/test_list_servers_negative.py
index db9bdc1..c03c43e 100644
--- a/tempest/api/compute/servers/test_list_servers_negative.py
+++ b/tempest/api/compute/servers/test_list_servers_negative.py
@@ -59,8 +59,9 @@
if num_servers > 0:
username = cls.os.username
tenant_name = cls.os.tenant_name
- msg = ("User/tenant %(username)s/%(tenant_name)s already have "
- "existing server instances. Skipping test.") % locals()
+ msg = ("User/tenant %(u)s/%(t)s already have "
+ "existing server instances. Skipping test." %
+ {'u': username, 't': tenant_name})
raise cls.skipException(msg)
resp, body = cls.alt_client.list_servers()
@@ -69,8 +70,9 @@
if num_servers > 0:
username = cls.alt_manager.username
tenant_name = cls.alt_manager.tenant_name
- msg = ("Alt User/tenant %(username)s/%(tenant_name)s already have "
- "existing server instances. Skipping test.") % locals()
+ msg = ("Alt User/tenant %(u)s/%(t)s already have "
+ "existing server instances. Skipping test." %
+ {'u': username, 't': tenant_name})
raise cls.skipException(msg)
# The following servers are created for use
diff --git a/tempest/cli/simple_read_only/test_compute.py b/tempest/cli/simple_read_only/test_compute.py
index 561fd00..af91968 100644
--- a/tempest/cli/simple_read_only/test_compute.py
+++ b/tempest/cli/simple_read_only/test_compute.py
@@ -22,7 +22,7 @@
import tempest.cli
from tempest.common import log as logging
-
+from tempest import config
CONF = cfg.CONF
@@ -69,6 +69,8 @@
def test_admin_credentials(self):
self.nova('credentials')
+ @testtools.skipIf(config.TempestConfig().network.neutron_available,
+ "Neutron does not provide this feature")
def test_admin_dns_domains(self):
self.nova('dns-domains')
diff --git a/tempest/clients.py b/tempest/clients.py
index 5efce98..2154f8b 100644
--- a/tempest/clients.py
+++ b/tempest/clients.py
@@ -274,8 +274,9 @@
if None in (self.username, self.password, self.tenant_name):
msg = ("Missing required credentials. "
- "username: %(username)s, password: %(password)s, "
- "tenant_name: %(tenant_name)s") % locals()
+ "username: %(u)s, password: %(p)s, "
+ "tenant_name: %(t)s" %
+ {'u': username, 'p': password, 't': tenant_name})
raise exceptions.InvalidConfiguration(msg)
self.auth_url = self.config.identity.uri
diff --git a/tempest/common/glance_http.py b/tempest/common/glance_http.py
index cd33a22..4045430 100644
--- a/tempest/common/glance_http.py
+++ b/tempest/common/glance_http.py
@@ -125,11 +125,12 @@
conn.request(method, conn_url, **kwargs)
resp = conn.getresponse()
except socket.gaierror as e:
- message = "Error finding address for %(url)s: %(e)s" % locals()
+ message = ("Error finding address for %(url)s: %(e)s" %
+ {'url': url, 'e': e})
raise exc.EndpointNotFound(message)
except (socket.error, socket.timeout) as e:
- endpoint = self.endpoint
- message = "Error communicating with %(endpoint)s %(e)s" % locals()
+ message = ("Error communicating with %(endpoint)s %(e)s" %
+ {'endpoint': self.endpoint, 'e': e})
raise exc.TimeoutException(message)
body_iter = ResponseBodyIterator(resp)
diff --git a/tempest/common/utils/linux/remote_client.py b/tempest/common/utils/linux/remote_client.py
index fd5d3d0..de2bf43 100644
--- a/tempest/common/utils/linux/remote_client.py
+++ b/tempest/common/utils/linux/remote_client.py
@@ -1,3 +1,17 @@
+# 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 re
import time
diff --git a/tempest/config.py b/tempest/config.py
index 025a2f6..d0dcc41 100644
--- a/tempest/config.py
+++ b/tempest/config.py
@@ -585,7 +585,7 @@
LOG.info("Using tempest config file %s" % path)
if not os.path.exists(path):
- msg = "Config file %(path)s not found" % locals()
+ msg = "Config file %s not found" % path
print(RuntimeError(msg), file=sys.stderr)
else:
config_files.append(path)
diff --git a/tempest/manager.py b/tempest/manager.py
index 4a447f3..187e2c6 100644
--- a/tempest/manager.py
+++ b/tempest/manager.py
@@ -65,6 +65,15 @@
self.config = tempest.config.TempestConfig()
self.client_attr_names = []
+ # we do this everywhere, have it be part of the super class
+ def _validate_credentials(self, username, password, tenant_name):
+ if None in (username, password, tenant_name):
+ msg = ("Missing required credentials. "
+ "username: %(u)s, password: %(p)s, "
+ "tenant_name: %(t)s" %
+ {'u': username, 'p': password, 't': tenant_name})
+ raise exceptions.InvalidConfiguration(msg)
+
class FuzzClientManager(Manager):
@@ -103,11 +112,7 @@
password = password or self.config.identity.password
tenant_name = tenant_name or self.config.identity.tenant_name
- if None in (username, password, tenant_name):
- msg = ("Missing required credentials. "
- "username: %(username)s, password: %(password)s, "
- "tenant_name: %(tenant_name)s") % locals()
- raise exceptions.InvalidConfiguration(msg)
+ self._validate_credentials(username, password, tenant_name)
auth_url = self.config.identity.uri
diff --git a/tempest/scenario/manager.py b/tempest/scenario/manager.py
index fe6fbf5..f968411 100644
--- a/tempest/scenario/manager.py
+++ b/tempest/scenario/manager.py
@@ -32,7 +32,6 @@
from tempest.common import log as logging
from tempest.common import ssh
from tempest.common.utils.data_utils import rand_name
-from tempest import exceptions
import tempest.manager
import tempest.test
@@ -76,11 +75,7 @@
if not tenant_name:
tenant_name = self.config.identity.tenant_name
- if None in (username, password, tenant_name):
- msg = ("Missing required credentials for compute client. "
- "username: %(username)s, password: %(password)s, "
- "tenant_name: %(tenant_name)s") % locals()
- raise exceptions.InvalidConfiguration(msg)
+ self._validate_credentials(username, password, tenant_name)
auth_url = self.config.identity.uri
dscv = self.config.identity.disable_ssl_certificate_validation
@@ -131,11 +126,7 @@
if not tenant_name:
tenant_name = self.config.identity.admin_tenant_name
- if None in (username, password, tenant_name):
- msg = ("Missing required credentials for identity client. "
- "username: %(username)s, password: %(password)s, "
- "tenant_name: %(tenant_name)s") % locals()
- raise exceptions.InvalidConfiguration(msg)
+ self._validate_credentials(username, password, tenant_name)
auth_url = self.config.identity.uri
dscv = self.config.identity.disable_ssl_certificate_validation
@@ -157,11 +148,7 @@
password = self.config.identity.admin_password
tenant_name = self.config.identity.admin_tenant_name
- if None in (username, password, tenant_name):
- msg = ("Missing required credentials for network client. "
- "username: %(username)s, password: %(password)s, "
- "tenant_name: %(tenant_name)s") % locals()
- raise exceptions.InvalidConfiguration(msg)
+ self._validate_credentials(username, password, tenant_name)
auth_url = self.config.identity.uri
dscv = self.config.identity.disable_ssl_certificate_validation
diff --git a/tempest/services/botoclients.py b/tempest/services/botoclients.py
index 628151a..32ec109 100644
--- a/tempest/services/botoclients.py
+++ b/tempest/services/botoclients.py
@@ -132,6 +132,7 @@
ALLOWED_METHODS = set(('create_key_pair', 'get_key_pair',
'delete_key_pair', 'import_key_pair',
'get_all_key_pairs',
+ 'get_all_tags',
'create_image', 'get_image',
'register_image', 'deregister_image',
'get_all_images', 'get_image_attribute',
diff --git a/tempest/services/identity/json/identity_client.py b/tempest/services/identity/json/identity_client.py
index a216b55..90e64e7 100644
--- a/tempest/services/identity/json/identity_client.py
+++ b/tempest/services/identity/json/identity_client.py
@@ -1,3 +1,17 @@
+# 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 httplib2
import json
diff --git a/tempest/services/network/json/network_client.py b/tempest/services/network/json/network_client.py
index c4fe6b1..446a674 100644
--- a/tempest/services/network/json/network_client.py
+++ b/tempest/services/network/json/network_client.py
@@ -1,4 +1,19 @@
+# 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 json
+
from tempest.common.rest_client import RestClient
diff --git a/tempest/thirdparty/boto/test_ec2_instance_run.py b/tempest/thirdparty/boto/test_ec2_instance_run.py
index 89891d2..1201866 100644
--- a/tempest/thirdparty/boto/test_ec2_instance_run.py
+++ b/tempest/thirdparty/boto/test_ec2_instance_run.py
@@ -113,6 +113,53 @@
self.cancelResourceCleanUp(rcuk)
@attr(type='smoke')
+ def test_run_stop_terminate_instance_with_tags(self):
+ # EC2 run, stop and terminate instance with tags
+ image_ami = self.ec2_client.get_image(self.images["ami"]
+ ["image_id"])
+ reservation = image_ami.run(kernel_id=self.images["aki"]["image_id"],
+ ramdisk_id=self.images["ari"]["image_id"],
+ instance_type=self.instance_type)
+ rcuk = self.addResourceCleanUp(self.destroy_reservation, reservation)
+
+ for instance in reservation.instances:
+ LOG.info("state: %s", instance.state)
+ if instance.state != "running":
+ self.assertInstanceStateWait(instance, "running")
+ instance.add_tag('key1', value='value1')
+
+ tags = self.ec2_client.get_all_tags()
+ self.assertEquals(tags[0].name, 'key1')
+ self.assertEquals(tags[0].value, 'value1')
+
+ tags = self.ec2_client.get_all_tags(filters={'key': 'key1'})
+ self.assertEquals(tags[0].name, 'key1')
+ self.assertEquals(tags[0].value, 'value1')
+
+ tags = self.ec2_client.get_all_tags(filters={'value': 'value1'})
+ self.assertEquals(tags[0].name, 'key1')
+ self.assertEquals(tags[0].value, 'value1')
+
+ tags = self.ec2_client.get_all_tags(filters={'key': 'value2'})
+ self.assertEquals(len(tags), 0)
+
+ for instance in reservation.instances:
+ instance.remove_tag('key1', value='value1')
+
+ tags = self.ec2_client.get_all_tags()
+ self.assertEquals(len(tags), 0)
+
+ for instance in reservation.instances:
+ instance.stop()
+ LOG.info("state: %s", instance.state)
+ if instance.state != "stopped":
+ self.assertInstanceStateWait(instance, "stopped")
+
+ for instance in reservation.instances:
+ instance.terminate()
+ self.cancelResourceCleanUp(rcuk)
+
+ @attr(type='smoke')
@testtools.skip("Skipped until the Bug #1098891 is resolved")
def test_run_terminate_instance(self):
# EC2 run, terminate immediately