Beispiel #1
0
    def test_launch_stack(self):
        template = self.stack_templates.first()
        stack = self.stacks.first()
        self.mock_template_validate.return_value = \
            json.loads(template.validate)
        self.mock_stack_create.reutrn_value = None
        self.mock_network_list_for_tenant.side_effect = \
            [self.networks.list(), self.networks.list()]

        url = reverse('horizon:project:stacks:select_template')
        res = self.client.get(url)
        self.assertTemplateUsed(res, 'project/stacks/select_template.html')

        form_data = {
            'template_source': 'raw',
            'template_data': template.data,
            'referenced_files': {},
            'method': forms.TemplateForm.__name__
        }
        res = self.client.post(url, form_data)
        self.assertTemplateUsed(res, 'project/stacks/create.html')

        url = reverse('horizon:project:stacks:launch')
        form_data = {
            'template_source': 'raw',
            'template_data': template.data,
            'password': '******',
            'parameters': template.validate,
            'stack_name': stack.stack_name,
            "timeout_mins": 60,
            "disable_rollback": True,
            "__param_DBUsername": "******",
            "__param_LinuxDistribution": "F17",
            "__param_InstanceType": "m1.small",
            "__param_KeyName": "test",
            "__param_DBPassword": "******",
            "__param_DBRootPassword": "******",
            "__param_DBName": "wordpress",
            "__param_Network": self.networks.list()[0]['id'],
            'method': forms.CreateStackForm.__name__
        }
        res = self.client.post(url, form_data)
        self.assertRedirectsNoFollow(res, INDEX_URL)
        self.mock_template_validate.assert_called_once_with(
            test.IsHttpRequest(),
            files={},
            template=hc_format.parse(template.data))
        self.mock_stack_create.assert_called_once_with(
            test.IsHttpRequest(),
            stack_name=stack.stack_name,
            timeout_mins=60,
            disable_rollback=True,
            template=None,
            parameters=test.IsA(dict),
            password='******',
            files=None)
        self.mock_network_list_for_tenant.assert_has_calls([
            mock.call(test.IsHttpRequest(), self.tenant.id),
            mock.call(test.IsHttpRequest(), self.tenant.id)
        ])
Beispiel #2
0
    def test_detail_stack_topology(self):
        stack = self.stacks.first()
        template = self.stack_templates.first()
        self.mock_stack_get.return_value = stack
        self.mock_template_get.return_value = \
            json.loads(template.validate)
        self.mock_resources_list.return_value = []

        url = '?'.join([
            reverse(DETAIL_URL, args=[stack.id]),
            '='.join(['tab', 'stack_details__stack_topology'])
        ])
        res = self.client.get(url)
        tab = res.context['tab_group'].get_tab('topology')
        d3_data = tab.data['d3_data']
        self.assertEqual(tab.template_name,
                         'project/stacks/_detail_topology.html')
        # status is CREATE_COMPLETE, so we expect the topology to display it
        self.assertIn('info_box', d3_data)
        self.assertIn('stack-green.svg', d3_data)
        self.assertIn('Create Complete', d3_data)
        self.mock_template_get.assert_called_once_with(test.IsHttpRequest(),
                                                       stack.id)
        self.mock_resources_list.assert_called_once_with(
            test.IsHttpRequest(), stack.stack_name)
Beispiel #3
0
    def test_index_prev_paginated(self):
        stacks = self.stacks.list()[:3]
        filters = {}
        self.mock_stacks_list.side_effect = [[stacks, True, False],
                                             [stacks[:2], True, True],
                                             [stacks[2:], True, True],
                                             [stacks[:2], True, True]]

        url = reverse('horizon:project:stacks:index')
        res = self.client.get(url)
        # get all
        self.assertEqual(len(res.context['stacks_table'].data), len(stacks))
        self.assertTemplateUsed(res, INDEX_TEMPLATE)

        res = self.client.get(url)
        # get first page with 2 items
        self.assertEqual(len(res.context['stacks_table'].data),
                         settings.API_RESULT_PAGE_SIZE)

        url = "%s?%s=%s" % (reverse('horizon:project:stacks:index'),
                            tables.StacksTable._meta.pagination_param,
                            stacks[2].id)
        res = self.client.get(url)
        # get second page (item 3)
        self.assertEqual(len(res.context['stacks_table'].data), 1)

        url = "%s?%s=%s" % (reverse('horizon:project:stacks:index'),
                            tables.StacksTable._meta.prev_pagination_param,
                            stacks[2].id)
        res = self.client.get(url)
        # prev back to get first page with 2 pages
        self.assertEqual(len(res.context['stacks_table'].data),
                         settings.API_RESULT_PAGE_SIZE)
        self.mock_stacks_list.assert_has_calls([
            mock.call(test.IsHttpRequest(),
                      marker=None,
                      paginate=True,
                      sort_dir='desc',
                      filters=filters),
            mock.call(test.IsHttpRequest(),
                      marker=None,
                      paginate=True,
                      sort_dir='desc',
                      filters=filters),
            mock.call(test.IsHttpRequest(),
                      marker=stacks[2].id,
                      paginate=True,
                      sort_dir='desc',
                      filters=filters)
        ])
    def test_resource_view(self):
        stack = self.stacks.first()
        resource = self.heat_resources.first()
        metadata = {}
        self.mock_resource_get.return_value = resource
        self.mock_resource_metadata_get.return_value = metadata

        url = reverse('horizon:project:stacks:resource',
                      args=[stack.id, resource.resource_name])
        res = self.client.get(url)
        self.assertTemplateUsed(res, 'horizon/common/_detail.html')
        self.assertTemplateUsed(res, 'project/stacks/_resource_overview.html')
        self.assertEqual(res.context['resource'].logical_resource_id,
                         resource.logical_resource_id)
        self.mock_resource_get.assert_called_once_with(
            test.IsHttpRequest(), stack.id, resource.resource_name)
        self.mock_resource_get.assert_called_once_with(
            test.IsHttpRequest(), stack.id, resource.resource_name)
Beispiel #5
0
    def test_launch_stack_with_hidden_parameters(self):
        template = {
            'data': ('heat_template_version: 2013-05-23\n'
                     'parameters:\n'
                     '  public_string:\n'
                     '    type: string\n'
                     '  secret_string:\n'
                     '    type: string\n'
                     '    hidden: true\n'),
            'validate': {
                'Description': 'No description',
                'Parameters': {
                    'public_string': {
                        'Label': 'public_string',
                        'Description': '',
                        'Type': 'String',
                        'NoEcho': 'false'
                    },
                    'secret_string': {
                        'Label': 'secret_string',
                        'Description': '',
                        'Type': 'String',
                        'NoEcho': 'true'
                    }
                }
            }
        }
        self.mock_template_validate.return_value = template['validate']

        url = reverse('horizon:project:stacks:select_template')
        res = self.client.get(url)
        self.assertTemplateUsed(res, 'project/stacks/select_template.html')

        form_data = {
            'template_source': 'raw',
            'template_data': template['data'],
            'method': forms.TemplateForm.__name__
        }
        res = self.client.post(url, form_data)
        self.assertTemplateUsed(res, 'project/stacks/create.html')

        # ensure the fields were rendered correctly
        pattern = ('<input class="form-control" '
                   'id="id___param_public_string" '
                   'name="__param_public_string" type="text" required/>')
        secret = ('<input class="form-control" '
                  'id="id___param_secret_string" '
                  'name="__param_secret_string" '
                  'type="password" required>')
        self.assertContains(res, pattern, html=True)
        self.assertContains(res, secret, html=True)
        self.mock_template_validate.assert_called_once_with(
            test.IsHttpRequest(),
            files={},
            template=hc_format.parse(template['data']))
    def test_detail_stack_template(self):
        stack = self.stacks.first()
        template = self.stack_templates.first()
        self.mock_stack_get.return_value = stack
        self.mock_template_get.return_value = \
            json.loads(template.validate)

        url = '?'.join([reverse(DETAIL_URL, args=[stack.id]),
                        '='.join(['tab', 'stack_details__stack_template'])])
        res = self.client.get(url)
        tab = res.context['tab_group'].get_tab('stack_template')
        template_data = tab.data['stack_template']
        self.assertEqual(tab.template_name,
                         'project/stacks/_stack_template.html')
        self.assertIn(json.loads(template.validate)['Description'],
                      template_data)
        self.mock_stack_get.assert_called_once_with(
            test.IsHttpRequest(), stack.id)
        self.mock_template_get.assert_called_once_with(
            test.IsHttpRequest(), stack.id)
Beispiel #7
0
    def test_preview_stack(self):
        template = self.stack_templates.first()
        stack = self.stacks.first()

        self.mock_template_validate.return_value = \
            json.loads(template.validate)
        self.mock_stack_preview.return_value = stack

        url = reverse('horizon:project:stacks:preview_template')
        res = self.client.get(url)
        self.assertTemplateUsed(res, 'project/stacks/preview_template.html')

        form_data = {
            'template_source': 'raw',
            'template_data': template.data,
            'method': forms.PreviewTemplateForm.__name__
        }
        res = self.client.post(url, form_data)
        self.assertTemplateUsed(res, 'project/stacks/preview.html')

        url = reverse('horizon:project:stacks:preview')
        form_data = {
            'template_source': 'raw',
            'template_data': template.data,
            'parameters': template.validate,
            'stack_name': stack.stack_name,
            "timeout_mins": 60,
            "disable_rollback": True,
            "__param_DBUsername": "******",
            "__param_LinuxDistribution": "F17",
            "__param_InstanceType": "m1.small",
            "__param_KeyName": "test",
            "__param_DBPassword": "******",
            "__param_DBRootPassword": "******",
            "__param_DBName": "wordpress",
            'method': forms.PreviewStackForm.__name__
        }
        res = self.client.post(url, form_data)
        self.assertTemplateUsed(res, 'project/stacks/preview_details.html')
        self.assertEqual(res.context['stack_preview']['stack_name'],
                         stack.stack_name)
        self.mock_template_validate.assert_called_once_with(
            test.IsHttpRequest(),
            files={},
            template=hc_format.parse(template.data))
    def test_detail_stack_overview(self):
        stack = self.stacks.first()
        template = self.stack_templates.first()
        self.mock_stack_get.return_value = stack
        self.mock_resources_list.return_value = []
        self.mock_template_get.return_value = \
            json.loads(template.validate)

        url = '?'.join([reverse(DETAIL_URL, args=[stack.id]),
                        '='.join(['tab', 'stack_details__stack_overview'])])
        res = self.client.get(url)
        tab = res.context['tab_group'].get_tab('overview')
        overview_data = tab.data['stack']
        self.assertEqual(tab.template_name,
                         'project/stacks/_detail_overview.html')
        self.assertEqual(stack.stack_name, overview_data.stack_name)
        self.mock_template_get.assert_called_once_with(
            test.IsHttpRequest(), stack.id)
Beispiel #9
0
    def test_edit_stack_template(self):
        template = self.stack_templates.first()
        stack = self.stacks.first()

        self.mock_stack_get.return_value = stack
        self.mock_template_validate.return_value = \
            json.loads(template.validate)
        self.mock_stack_get.reutrn_value = stack
        self.mock_template_get.return_value = \
            json.loads(template.validate)

        fields = {
            'stack_name': stack.stack_name,
            'disable_rollback': True,
            'timeout_mins': 61,
            'password': '******',
            'template': None,
            'parameters': test.IsA(dict),
            'files': None
        }
        self.mock_stack_update.return_value = None
        self.mock_network_list_for_tenant.return_value = \
            self.networks.list()

        url = reverse('horizon:project:stacks:change_template',
                      args=[stack.id])
        res = self.client.get(url)
        self.assertTemplateUsed(res, 'project/stacks/change_template.html')

        form_data = {
            'template_source': 'raw',
            'template_data': template.data,
            'method': forms.ChangeTemplateForm.__name__
        }
        res = self.client.post(url, form_data)

        url = reverse('horizon:project:stacks:edit_stack', args=[
            stack.id,
        ])
        form_data = {
            'template_source': 'raw',
            'template_data': template.data,
            'password': '******',
            'parameters': template.validate,
            'stack_name': stack.stack_name,
            'stack_id': stack.id,
            "timeout_mins": 61,
            "disable_rollback": True,
            "__param_DBUsername": "******",
            "__param_LinuxDistribution": "F17",
            "__param_InstanceType": "m1.small",
            "__param_KeyName": "test",
            "__param_DBPassword": "******",
            "__param_DBRootPassword": "******",
            "__param_DBName": "wordpress",
            "__param_Network": self.networks.list()[0]['id'],
            'method': forms.EditStackForm.__name__
        }
        res = self.client.post(url, form_data)
        self.assertRedirectsNoFollow(res, INDEX_URL)
        self.mock_template_validate.assert_called_once_with(
            test.IsHttpRequest(),
            files={},
            template=hc_format.parse(template.data))
        self.mock_template_get.assert_called_once_with(test.IsHttpRequest(),
                                                       stack.id)
        self.mock_stack_update.assert_called_once_with(test.IsHttpRequest(),
                                                       stack_id=stack.id,
                                                       **fields)
        self.mock_network_list_for_tenant.assert_called_once_with(
            test.IsHttpRequest(), self.tenant.id)
Beispiel #10
0
    def test_launch_stack_parameter_types(self):
        template = {
            'data': ('heat_template_version: 2013-05-23\n'
                     'parameters:\n'
                     '  param1:\n'
                     '    type: string\n'
                     '  param2:\n'
                     '    type: number\n'
                     '  param3:\n'
                     '    type: json\n'
                     '  param4:\n'
                     '    type: comma_delimited_list\n'
                     '  param5:\n'
                     '    type: boolean\n'),
            'validate': {
                "Description": "No description",
                "Parameters": {
                    "param1": {
                        "Type": "String",
                        "NoEcho": "false",
                        "Description": "",
                        "Label": "param1"
                    },
                    "param2": {
                        "Type": "Number",
                        "NoEcho": "false",
                        "Description": "",
                        "Label": "param2"
                    },
                    "param3": {
                        "Type": "Json",
                        "NoEcho": "false",
                        "Description": "",
                        "Label": "param3"
                    },
                    "param4": {
                        "Type": "CommaDelimitedList",
                        "NoEcho": "false",
                        "Description": "",
                        "Label": "param4"
                    },
                    "param5": {
                        "Type": "Boolean",
                        "NoEcho": "false",
                        "Description": "",
                        "Label": "param5"
                    }
                }
            }
        }
        stack = self.stacks.first()

        self.mock_template_validate.return_value = \
            template['validate']
        self.mock_stack_create.return_value = None

        url = reverse('horizon:project:stacks:select_template')
        res = self.client.get(url)
        self.assertTemplateUsed(res, 'project/stacks/select_template.html')

        form_data = {
            'template_source': 'raw',
            'template_data': template['data'],
            'method': forms.TemplateForm.__name__
        }
        res = self.client.post(url, form_data)
        self.assertTemplateUsed(res, 'project/stacks/create.html')

        # ensure the fields were rendered correctly
        input_str = ('<input class="form-control" '
                     'id="id___param_param{0}" '
                     'name="__param_param{0}" type="{1}" required/>')
        self.assertContains(res, input_str.format(3, 'text'), html=True)
        self.assertContains(res, input_str.format(4, 'text'), html=True)

        input_str_param2 = ('<input type="number" name="__param_param2" '
                            'autocomplete="off" '
                            'required class="form-control" '
                            'id="id___param_param2" />')
        self.assertContains(res, input_str_param2, html=True)

        # post some sample data and make sure it validates
        url = reverse('horizon:project:stacks:launch')
        form_data = {
            'template_source': 'raw',
            'template_data': template['data'],
            'password': '******',
            'parameters': json.dumps(template['validate']),
            'stack_name': stack.stack_name,
            "timeout_mins": 60,
            "disable_rollback": True,
            "__param_param1": "some string",
            "__param_param2": 42,
            "__param_param3": '{"key": "value"}',
            "__param_param4": "a,b,c",
            "__param_param5": True,
            'method': forms.CreateStackForm.__name__
        }
        res = self.client.post(url, form_data)
        self.assertRedirectsNoFollow(res, INDEX_URL)
        self.mock_template_validate.assert_called_once_with(
            test.IsHttpRequest(),
            files={},
            template=hc_format.parse(template['data']))
        self.mock_stack_create.assert_called_once_with(
            test.IsHttpRequest(),
            stack_name=stack.stack_name,
            timeout_mins=60,
            disable_rollback=True,
            template=hc_format.parse(template['data']),
            parameters={
                'param1': 'some string',
                'param2': 42,
                'param3': '{"key": "value"}',
                'param4': 'a,b,c',
                'param5': True
            },
            password='******',
            files={})
    def test_option(self):
        volumes = self.cinder_volumes.list()
        volume_snapshots = self.cinder_volume_snapshots.list()
        volume_types = self.cinder_volume_types.list()
        volume_backups = self.cinder_volume_backups.list()
        images = self.imagesV2.list()
        networks = self.networks.list()
        subnets = self.subnets.list()
        floating_ips = self.floating_ips.list()
        ports = self.ports.list()
        security_groups = self.security_groups.list()
        routers = self.routers.list()
        qos_policies = self.qos_policies.list()
        availability_zones = self.availability_zones.list()
        flavors = self.flavors.list()
        instances = self.servers.list()
        keypairs = self.keypairs.list()
        template_versions = self.template_versions.list()

        self.mock_volume_list.return_value = volumes
        self.mock_volume_snapshot_list.return_value = volume_snapshots
        self.mock_volume_type_list.return_vlue = volume_types
        self.mock_volume_backup_list.return_value = volume_backups
        self.mock_image_list_detailed.return_value = images
        self.mock_network_list.return_value = networks
        self.mock_subnet_list.return_value = subnets
        self.mock_tenant_floating_ip_list.return_value = floating_ips
        self.mock_port_list.return_value = ports
        self.mock_security_group_list.return_value = security_groups
        self.mock_router_list.return_value = routers
        self.mock_policy_list.return_value = qos_policies
        self.mock_availability_zone_list.return_value = availability_zones
        self.mock_flavor_list.return_value = flavors
        self.mock_server_list.return_value = instances
        self.mock_keypair_list.return_value = keypairs
        self.mock_template_version_list.return_value = template_versions

        resp = self.client.get(reverse(
            'horizon:project:template_generator:apis'))
        data = resp.content
        if isinstance(data, bytes):
            data = data.decode('utf-8')
        json_data = json.loads(data)
        self.assertEqual(len(json_data.keys()), 20)

        self.mock_volume_list.assert_called_once_with(
            test.IsHttpRequest())
        self.mock_volume_snapshot_list.assert_called_once_with(
            test.IsHttpRequest())
        self.mock_volume_type_list.assert_called_once_with(
            test.IsHttpRequest())
        self.mock_volume_backup_list.assert_called_once_with(
            test.IsHttpRequest())
        self.mock_image_list_detailed.assert_called_once_with(
            test.IsHttpRequest())
        self.mock_network_list.assert_called_once_with(
            test.IsHttpRequest())
        self.mock_subnet_list.assert_called_once_with(
            test.IsHttpRequest())
        self.mock_tenant_floating_ip_list.assert_called_once_with(
            test.IsHttpRequest(), True)
        self.mock_port_list.assert_called_once_with(
            test.IsHttpRequest())
        self.mock_security_group_list.assert_called_once_with(
            test.IsHttpRequest())
        self.mock_router_list.assert_called_once_with(
            test.IsHttpRequest())
        self.mock_policy_list.assert_called_once_with(
            test.IsHttpRequest())
        self.mock_availability_zone_list.assert_called_once_with(
            test.IsHttpRequest())
        self.mock_flavor_list.assert_called_once_with(
            test.IsHttpRequest())
        self.mock_server_list.assert_called_once_with(
            test.IsHttpRequest())
        self.mock_keypair_list.assert_called_once_with(
            test.IsHttpRequest())
        self.mock_template_version_list.assert_called_once_with(
            test.IsHttpRequest())