#    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 heat_integrationtests.functional import functional_base

# Simple stack
test_template = {
    'heat_template_version': '2013-05-23',
    'resources': {
        'test1': {
            'type': 'OS::Heat::TestResource',
            'properties': {
                'value': 'Test1'
            }
        }
    }
}

# Nested stack
rsg_template = {
    'heat_template_version': '2013-05-23',
    'resources': {
        'random_group': {
            'type': 'OS::Heat::ResourceGroup',
            'properties': {
                'count': 2,
                'resource_def': {
                    'type': 'OS::Heat::RandomString',
                    'properties': {
                        'length': 30,
                        'salt': 'initial'
                    }
                }
            }
        }
    }
}


class AdminActionsTest(functional_base.FunctionalTestsBase):

    def setUp(self):
        super(AdminActionsTest, self).setUp()
        if not self.conf.admin_username or not self.conf.admin_password:
            self.skipTest('No admin creds found, skipping')

    def create_stack_setup_admin_client(self, template=test_template):
        # Create the stack with the default user
        self.stack_identifier = self.stack_create(template=template)

        # Setup admin clients
        self.setup_clients_for_admin()

    def test_admin_simple_stack_actions(self):
        self.create_stack_setup_admin_client()

        updated_template = test_template.copy()
        props = updated_template['resources']['test1']['properties']
        props['value'] = 'new_value'

        # Update, suspend and resume stack
        self.update_stack(self.stack_identifier,
                          template=updated_template)
        self.stack_suspend(self.stack_identifier)
        self.stack_resume(self.stack_identifier)

        # List stack resources
        initial_resources = {'test1': 'OS::Heat::TestResource'}
        self.assertEqual(initial_resources,
                         self.list_resources(self.stack_identifier))
        # Delete stack
        self._stack_delete(self.stack_identifier)

    def test_admin_complex_stack_actions(self):
        self.create_stack_setup_admin_client(template=rsg_template)

        updated_template = rsg_template.copy()
        props = updated_template['resources']['random_group']['properties']
        props['count'] = 3

        # Update, suspend and resume stack
        self.update_stack(self.stack_identifier,
                          template=updated_template)
        self.stack_suspend(self.stack_identifier)
        self.stack_resume(self.stack_identifier)

        # List stack resources
        resources = {'random_group': 'OS::Heat::ResourceGroup'}
        self.assertEqual(resources,
                         self.list_resources(self.stack_identifier))
        # Delete stack
        self._stack_delete(self.stack_identifier)