| # Copyright (c) 2014 Mirantis Inc. | 
 | # | 
 | #    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_lib.common.utils import data_utils | 
 |  | 
 | from tempest.api.data_processing import base as dp_base | 
 | from tempest import exceptions | 
 | from tempest import test | 
 |  | 
 |  | 
 | class ClusterTemplateTest(dp_base.BaseDataProcessingTest): | 
 |     """Link to the API documentation is http://docs.openstack.org/developer/ | 
 |     sahara/restapi/rest_api_v1.0.html#cluster-templates | 
 |     """ | 
 |     @classmethod | 
 |     def skip_checks(cls): | 
 |         super(ClusterTemplateTest, cls).skip_checks() | 
 |         if cls.default_plugin is None: | 
 |             raise cls.skipException("No Sahara plugins configured") | 
 |  | 
 |     @classmethod | 
 |     def resource_setup(cls): | 
 |         super(ClusterTemplateTest, cls).resource_setup() | 
 |  | 
 |         # pre-define a node group templates | 
 |         node_group_template_w = cls.get_node_group_template('worker1') | 
 |         if node_group_template_w is None: | 
 |             raise exceptions.InvalidConfiguration( | 
 |                 message="No known Sahara plugin was found") | 
 |  | 
 |         node_group_template_w['name'] = data_utils.rand_name( | 
 |             'sahara-ng-template') | 
 |         resp_body = cls.create_node_group_template(**node_group_template_w) | 
 |         node_group_template_id = resp_body['id'] | 
 |         configured_node_group_templates = {'worker1': node_group_template_id} | 
 |  | 
 |         cls.full_cluster_template = cls.get_cluster_template( | 
 |             configured_node_group_templates) | 
 |  | 
 |         # create cls.cluster_template variable to use for comparison to cluster | 
 |         # template response body. The 'node_groups' field in the response body | 
 |         # has some extra info that post body does not have. The 'node_groups' | 
 |         # field in the response body is something like this | 
 |         # | 
 |         #   'node_groups': [ | 
 |         #       { | 
 |         #           'count': 3, | 
 |         #           'name': 'worker-node', | 
 |         #           'volume_mount_prefix': '/volumes/disk', | 
 |         #           'created_at': '2014-05-21 14:31:37', | 
 |         #           'updated_at': None, | 
 |         #           'floating_ip_pool': None, | 
 |         #           ... | 
 |         #       }, | 
 |         #       ... | 
 |         #   ] | 
 |         cls.cluster_template = cls.full_cluster_template.copy() | 
 |         del cls.cluster_template['node_groups'] | 
 |  | 
 |     def _create_cluster_template(self, template_name=None): | 
 |         """Creates Cluster Template with optional name specified. | 
 |  | 
 |         It creates template, ensures template name and response body. | 
 |         Returns id and name of created template. | 
 |         """ | 
 |         if not template_name: | 
 |             # generate random name if it's not specified | 
 |             template_name = data_utils.rand_name('sahara-cluster-template') | 
 |  | 
 |         # create cluster template | 
 |         resp_body = self.create_cluster_template(template_name, | 
 |                                                  **self.full_cluster_template) | 
 |  | 
 |         # ensure that template created successfully | 
 |         self.assertEqual(template_name, resp_body['name']) | 
 |         self.assertDictContainsSubset(self.cluster_template, resp_body) | 
 |  | 
 |         return resp_body['id'], template_name | 
 |  | 
 |     @test.attr(type='smoke') | 
 |     @test.idempotent_id('3525f1f1-3f9c-407d-891a-a996237e728b') | 
 |     def test_cluster_template_create(self): | 
 |         self._create_cluster_template() | 
 |  | 
 |     @test.attr(type='smoke') | 
 |     @test.idempotent_id('7a161882-e430-4840-a1c6-1d928201fab2') | 
 |     def test_cluster_template_list(self): | 
 |         template_info = self._create_cluster_template() | 
 |  | 
 |         # check for cluster template in list | 
 |         templates = self.client.list_cluster_templates() | 
 |         templates_info = [(template['id'], template['name']) | 
 |                           for template in templates] | 
 |         self.assertIn(template_info, templates_info) | 
 |  | 
 |     @test.attr(type='smoke') | 
 |     @test.idempotent_id('2b75fe22-f731-4b0f-84f1-89ab25f86637') | 
 |     def test_cluster_template_get(self): | 
 |         template_id, template_name = self._create_cluster_template() | 
 |  | 
 |         # check cluster template fetch by id | 
 |         template = self.client.get_cluster_template(template_id) | 
 |         self.assertEqual(template_name, template['name']) | 
 |         self.assertDictContainsSubset(self.cluster_template, template) | 
 |  | 
 |     @test.attr(type='smoke') | 
 |     @test.idempotent_id('ff1fd989-171c-4dd7-91fd-9fbc71b09675') | 
 |     def test_cluster_template_delete(self): | 
 |         template_id, _ = self._create_cluster_template() | 
 |  | 
 |         # delete the cluster template by id | 
 |         self.client.delete_cluster_template(template_id) | 
 |         # TODO(ylobankov): check that cluster template is really deleted |