blob: 08fddb5f86cdbc4e74d1a1f2adccf100459e267d [file] [log] [blame]
Steve Bakerd2525a92013-05-06 15:29:03 +12001# Licensed under the Apache License, Version 2.0 (the "License"); you may
2# not use this file except in compliance with the License. You may obtain
3# a copy of the License at
4#
5# http://www.apache.org/licenses/LICENSE-2.0
6#
7# Unless required by applicable law or agreed to in writing, software
8# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10# License for the specific language governing permissions and limitations
11# under the License.
12
Sean Daguee0a65d12014-03-25 15:59:16 -040013import os.path
Matthew Treinish96e9e882014-06-09 18:37:19 -040014
Matthew Treinish01472ff2015-02-20 17:26:52 -050015from tempest_lib.common.utils import data_utils
Masayuki Igawabfa07602015-01-20 18:47:17 +090016from tempest_lib import exceptions as lib_exc
Ghanshyam961ea1a2014-06-09 10:56:00 +090017import yaml
Sean Daguee0a65d12014-03-25 15:59:16 -040018
Steve Bakerd2525a92013-05-06 15:29:03 +120019from tempest import clients
Matthew Treinishcb09bbb2014-01-29 18:20:25 +000020from tempest import config
Matthew Treinishf4a9b0f2013-07-26 16:58:26 -040021from tempest.openstack.common import log as logging
Steve Bakerd2525a92013-05-06 15:29:03 +120022import tempest.test
23
Matthew Treinishcb09bbb2014-01-29 18:20:25 +000024CONF = config.CONF
Steve Bakerd2525a92013-05-06 15:29:03 +120025
26LOG = logging.getLogger(__name__)
27
28
29class BaseOrchestrationTest(tempest.test.BaseTestCase):
30 """Base test case class for all Orchestration API tests."""
31
32 @classmethod
Rohan Kanade80b938a2015-02-07 10:58:56 +053033 def skip_checks(cls):
34 super(BaseOrchestrationTest, cls).skip_checks()
Matthew Treinishcb09bbb2014-01-29 18:20:25 +000035 if not CONF.service_available.heat:
Steve Bakerd2525a92013-05-06 15:29:03 +120036 raise cls.skipException("Heat support is required")
37
Rohan Kanade80b938a2015-02-07 10:58:56 +053038 @classmethod
39 def setup_credentials(cls):
40 super(BaseOrchestrationTest, cls).setup_credentials()
41 cls.os = clients.Manager()
42
43 @classmethod
44 def setup_clients(cls):
45 super(BaseOrchestrationTest, cls).setup_clients()
Sean Daguee0a65d12014-03-25 15:59:16 -040046 cls.orchestration_client = cls.os.orchestration_client
47 cls.client = cls.orchestration_client
48 cls.servers_client = cls.os.servers_client
49 cls.keypairs_client = cls.os.keypairs_client
50 cls.network_client = cls.os.network_client
Steven Hardyb1f91982014-04-04 15:35:55 +010051 cls.volumes_client = cls.os.volumes_client
huangtianhua01cba0a2014-04-30 16:18:03 +080052 cls.images_v2_client = cls.os.image_client_v2
Rohan Kanade80b938a2015-02-07 10:58:56 +053053
54 @classmethod
55 def resource_setup(cls):
56 super(BaseOrchestrationTest, cls).resource_setup()
57 cls.build_timeout = CONF.orchestration.build_timeout
58 cls.build_interval = CONF.orchestration.build_interval
Steve Bakerd2525a92013-05-06 15:29:03 +120059 cls.stacks = []
Steve Bakerb1f67b52013-06-24 14:42:30 +120060 cls.keypairs = []
huangtianhua01cba0a2014-04-30 16:18:03 +080061 cls.images = []
Steve Bakerd2525a92013-05-06 15:29:03 +120062
63 @classmethod
Steve Baker80252da2013-09-25 13:29:10 +120064 def _get_default_network(cls):
David Kranz34e88122014-12-11 15:24:05 -050065 networks = cls.network_client.list_networks()
Steve Baker80252da2013-09-25 13:29:10 +120066 for net in networks['networks']:
Matthew Treinishcb09bbb2014-01-29 18:20:25 +000067 if net['name'] == CONF.compute.fixed_network_name:
Steve Baker80252da2013-09-25 13:29:10 +120068 return net
69
70 @classmethod
Steve Bakerd2525a92013-05-06 15:29:03 +120071 def _get_identity_admin_client(cls):
Steven Hardy48ec7052014-03-28 14:06:27 +000072 """Returns an instance of the Identity Admin API client."""
Andrea Frittolic0978352015-02-06 15:57:40 +000073 manager = clients.AdminManager()
Sean Daguee0a65d12014-03-25 15:59:16 -040074 admin_client = manager.identity_client
Steve Bakerd2525a92013-05-06 15:29:03 +120075 return admin_client
76
77 @classmethod
Ghanshyam2a180b82014-06-16 13:54:22 +090078 def create_stack(cls, stack_name, template_data, parameters=None,
Steven Hardy1b25fe02014-05-07 16:21:28 +010079 environment=None, files=None):
Ghanshyam2a180b82014-06-16 13:54:22 +090080 if parameters is None:
81 parameters = {}
David Kranz8ad924b2015-01-16 16:50:18 -050082 body = cls.client.create_stack(
Steve Bakerd2525a92013-05-06 15:29:03 +120083 stack_name,
84 template=template_data,
Steven Hardy00de7582014-05-07 15:18:52 +010085 parameters=parameters,
Steven Hardy1b25fe02014-05-07 16:21:28 +010086 environment=environment,
87 files=files)
David Kranz8ad924b2015-01-16 16:50:18 -050088 stack_id = body.response['location'].split('/')[-1]
Steve Bakerd2525a92013-05-06 15:29:03 +120089 stack_identifier = '%s/%s' % (stack_name, stack_id)
Steve Bakerb7942772013-06-27 10:23:28 +120090 cls.stacks.append(stack_identifier)
Steve Bakerd2525a92013-05-06 15:29:03 +120091 return stack_identifier
92
93 @classmethod
Steven Hardy5be93e82014-04-02 21:24:05 +010094 def _clear_stacks(cls):
Steve Bakerd2525a92013-05-06 15:29:03 +120095 for stack_identifier in cls.stacks:
96 try:
Sean Daguead824912014-03-25 14:56:35 -040097 cls.client.delete_stack(stack_identifier)
Masayuki Igawabfa07602015-01-20 18:47:17 +090098 except lib_exc.NotFound:
Steve Bakerd2525a92013-05-06 15:29:03 +120099 pass
100
101 for stack_identifier in cls.stacks:
Zhi Kun Liu03aec1d2014-08-12 16:57:05 +0800102 try:
103 cls.client.wait_for_stack_status(
104 stack_identifier, 'DELETE_COMPLETE')
Masayuki Igawabfa07602015-01-20 18:47:17 +0900105 except lib_exc.NotFound:
Zhi Kun Liu03aec1d2014-08-12 16:57:05 +0800106 pass
Steve Bakerd2525a92013-05-06 15:29:03 +1200107
Steve Bakerb7942772013-06-27 10:23:28 +1200108 @classmethod
Bartosz Górskiab33b7e2013-06-27 00:39:47 -0700109 def _create_keypair(cls, name_start='keypair-heat-'):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900110 kp_name = data_utils.rand_name(name_start)
David Kranz173f0e02015-02-06 13:47:57 -0500111 body = cls.keypairs_client.create_keypair(kp_name)
Steve Bakerb7942772013-06-27 10:23:28 +1200112 cls.keypairs.append(kp_name)
Steve Bakerd2525a92013-05-06 15:29:03 +1200113 return body
114
115 @classmethod
Steven Hardy5be93e82014-04-02 21:24:05 +0100116 def _clear_keypairs(cls):
Steve Bakerb1f67b52013-06-24 14:42:30 +1200117 for kp_name in cls.keypairs:
118 try:
119 cls.keypairs_client.delete_keypair(kp_name)
120 except Exception:
121 pass
122
123 @classmethod
huangtianhua01cba0a2014-04-30 16:18:03 +0800124 def _create_image(cls, name_start='image-heat-', container_format='bare',
125 disk_format='iso'):
126 image_name = data_utils.rand_name(name_start)
David Kranz34f18782015-01-06 13:43:55 -0500127 body = cls.images_v2_client.create_image(image_name,
128 container_format,
129 disk_format)
huangtianhua01cba0a2014-04-30 16:18:03 +0800130 image_id = body['id']
131 cls.images.append(image_id)
132 return body
133
134 @classmethod
135 def _clear_images(cls):
136 for image_id in cls.images:
137 try:
138 cls.images_v2_client.delete_image(image_id)
Masayuki Igawabfa07602015-01-20 18:47:17 +0900139 except lib_exc.NotFound:
huangtianhua01cba0a2014-04-30 16:18:03 +0800140 pass
141
142 @classmethod
Ghanshyam961ea1a2014-06-09 10:56:00 +0900143 def read_template(cls, name, ext='yaml'):
Qiu Hua Qiaof6368772014-04-01 01:12:39 -0500144 loc = ["stacks", "templates", "%s.%s" % (name, ext)]
145 fullpath = os.path.join(os.path.dirname(__file__), *loc)
Sean Daguee0a65d12014-03-25 15:59:16 -0400146
147 with open(fullpath, "r") as f:
148 content = f.read()
149 return content
150
151 @classmethod
Ghanshyam961ea1a2014-06-09 10:56:00 +0900152 def load_template(cls, name, ext='yaml'):
153 loc = ["stacks", "templates", "%s.%s" % (name, ext)]
154 fullpath = os.path.join(os.path.dirname(__file__), *loc)
155
156 with open(fullpath, "r") as f:
157 return yaml.safe_load(f)
158
159 @classmethod
Andrea Frittoli556f7962014-09-15 13:14:54 +0100160 def resource_cleanup(cls):
Steven Hardy5be93e82014-04-02 21:24:05 +0100161 cls._clear_stacks()
162 cls._clear_keypairs()
huangtianhua01cba0a2014-04-30 16:18:03 +0800163 cls._clear_images()
Andrea Frittoli556f7962014-09-15 13:14:54 +0100164 super(BaseOrchestrationTest, cls).resource_cleanup()
Steve Bakerd2525a92013-05-06 15:29:03 +1200165
Steve Baker38d8f092013-06-12 12:47:16 +1200166 @staticmethod
167 def stack_output(stack, output_key):
Steven Hardy48ec7052014-03-28 14:06:27 +0000168 """Return a stack output value for a given key."""
Steve Baker38d8f092013-06-12 12:47:16 +1200169 return next((o['output_value'] for o in stack['outputs']
170 if o['output_key'] == output_key), None)
Steven Hardye2a74442014-03-25 12:10:52 +0000171
172 def assert_fields_in_dict(self, obj, *fields):
173 for field in fields:
174 self.assertIn(field, obj)
175
176 def list_resources(self, stack_identifier):
177 """Get a dict mapping of resource names to types."""
David Kranz8ad924b2015-01-16 16:50:18 -0500178 resources = self.client.list_resources(stack_identifier)
Steven Hardye2a74442014-03-25 12:10:52 +0000179 self.assertIsInstance(resources, list)
180 for res in resources:
181 self.assert_fields_in_dict(res, 'logical_resource_id',
182 'resource_type', 'resource_status',
183 'updated_time')
184
185 return dict((r['resource_name'], r['resource_type'])
186 for r in resources)
Steven Hardy8b54fc52014-03-28 16:15:51 +0000187
188 def get_stack_output(self, stack_identifier, output_key):
David Kranz8ad924b2015-01-16 16:50:18 -0500189 body = self.client.get_stack(stack_identifier)
Steven Hardy8b54fc52014-03-28 16:15:51 +0000190 return self.stack_output(body, output_key)