Ejemplo n.º 1
0
    def test_run_bad_update(self, mock_get_heat_client, mock__update_stack,
                            mock__get_removal_params_from_heat):

        mock__update_stack.return_value = actions.Result(error='Update error')
        mock__get_removal_params_from_heat.return_value = {}
        heatclient = mock.MagicMock()
        heatclient.resources.list.return_value = [
            mock.MagicMock(links=[{
                'rel':
                'stack',
                'href':
                'http://192.0.2.1:8004/v1/'
                'a959ac7d6a4a475daf2428df315c41ef/'
                'stacks/overcloud/123'
            }],
                           logical_resource_id='logical_id',
                           physical_resource_id='resource_id',
                           resource_type='OS::Heat::ResourceGroup',
                           resource_name='Compute'),
            mock.MagicMock(
                links=[{
                    'rel':
                    'stack',
                    'href':
                    'http://192.0.2.1:8004/v1/'
                    'a959ac7d6a4a475daf2428df315c41ef/'
                    'stacks/overcloud/124'
                }],
                logical_resource_id='node0',
                physical_resource_id='123',
                resource_type='OS::TripleO::Compute',
                parent_resource='Compute',
                resource_name='node0',
            )
        ]
        heatclient.stacks.get.return_value = mock_stack()
        heatclient.stacks.validate.return_value = {}
        mock_get_heat_client.return_value = heatclient

        mock_ctx = mock.MagicMock()

        # Test
        action = scale.ScaleDownAction(constants.STACK_TIMEOUT_DEFAULT,
                                       ['resource_id'], 'stack')
        result = action.run(mock_ctx)

        self.assertEqual(actions.Result(error='Update error'), result)
Ejemplo n.º 2
0
def scale_down(log,
               clients,
               stack,
               nodes,
               timeout=None,
               verbosity=0,
               connection_timeout=None):
    """Unprovision and deletes overcloud nodes from a heat stack.

    :param log: Logging object
    :type log: Object

    :param clients: Application client object.
    :type clients: Object

    :param stack: Heat Stack object
    :type stack: Object

    :param nodes: List of nodes to delete. If the node UUID is used the
                  UUID will be used to lookup the node name before being
                  passed through to the cleanup playbook.
    :type nodes: List

    :param timeout: Timeout to use when deleting nodes. If timeout is None
                    it will be set to 240 minutes.
    :type timeout: Integer

    :param verbosity: Verbosity level
    :type verbosity: Integer

    :param connection_timeout: Ansible connection timeout in seconds.
    :type connection_timeout: Integer
    """

    if not timeout:
        timeout = 240

    limit_list = list()
    for node in nodes:
        try:
            _node = clients.compute.servers.get(node)
            limit_list.append(_node.name)
        except Exception:
            limit_list.append(node)

    deployment.config_download(log=log,
                               clients=clients,
                               stack=stack,
                               timeout=connection_timeout,
                               ansible_playbook_name='scale_playbook.yaml',
                               limit_list=limit_list,
                               verbosity=verbosity,
                               deployment_timeout=timeout)

    print('Running scale down')
    context = clients.tripleoclient.create_mistral_context()
    scale_down_action = scale.ScaleDownAction(nodes=nodes,
                                              timeout=timeout,
                                              container=stack.stack_name)
    scale_down_action.run(context=context)
    utils.wait_for_stack_ready(orchestration_client=clients.orchestration,
                               stack_name=stack.stack_name,
                               action='UPDATE')
Ejemplo n.º 3
0
    def test_run(self, mock_ctx, mock_get_object_client,
                 mock_get_workflow_client, mock_get_template_contents,
                 mock_env_files, mock_get_heat_client, mock_cache):

        mock_env_files.return_value = ({}, {})
        heatclient = mock.MagicMock()
        heatclient.resources.list.return_value = [
            mock.MagicMock(links=[{
                'rel':
                'stack',
                'href':
                'http://192.0.2.1:8004/v1/'
                'a959ac7d6a4a475daf2428df315c41ef/'
                'stacks/overcloud/123'
            }],
                           logical_resource_id='logical_id',
                           physical_resource_id='resource_id',
                           resource_type='OS::Heat::ResourceGroup',
                           resource_name='Compute'),
            mock.MagicMock(
                links=[{
                    'rel':
                    'stack',
                    'href':
                    'http://192.0.2.1:8004/v1/'
                    'a959ac7d6a4a475daf2428df315c41ef/'
                    'stacks/overcloud/124'
                }],
                logical_resource_id='node0',
                physical_resource_id='123',
                resource_type='OS::TripleO::Compute',
                parent_resource='Compute',
                resource_name='node0',
            )
        ]
        heatclient.stacks.get.return_value = mock_stack()
        mock_get_heat_client.return_value = heatclient

        mock_ctx.return_value = mock.MagicMock()
        swift = mock.MagicMock(url="http://test.com")
        swift.get_object.side_effect = swiftexceptions.ClientException(
            'atest2')
        mock_get_object_client.return_value = swift

        env = {
            'resource_registry': {
                'resources': {
                    '*': {
                        '*': {
                            'UpdateDeployment': {
                                'hooks': []
                            }
                        }
                    }
                }
            }
        }

        mock_mistral = mock.MagicMock()
        mock_env = mock.MagicMock()
        mock_env.variables = {
            'temp_environment': 'temp_environment',
            'template': 'template',
            'environments': [{
                u'path': u'environments/test.yaml'
            }],
        }
        mock_mistral.environments.get.return_value = mock_env
        mock_get_workflow_client.return_value = mock_mistral

        mock_get_template_contents.return_value = ({}, {
            'heat_template_version':
            '2016-04-30'
        })

        # Test
        action = scale.ScaleDownAction(constants.STACK_TIMEOUT_DEFAULT,
                                       ['resource_id'], 'stack')
        action.run()

        heatclient.stacks.update.assert_called_once_with(
            'stack',
            stack_name='stack',
            template={'heat_template_version': '2016-04-30'},
            environment=env,
            existing=True,
            files={},
            timeout_mins=240)

        mock_cache.assert_called_once_with("stack", "tripleo.parameters.get")
Ejemplo n.º 4
0
    def test_run(self, mock_get_object_client, mock_get_template_contents,
                 mock_env_files, mock_get_heat_client, mock_cache):

        mock_env_files.return_value = ({}, {})
        heatclient = mock.MagicMock()
        heatclient.resources.list.return_value = [
            mock.MagicMock(links=[{
                'rel':
                'stack',
                'href':
                'http://192.0.2.1:8004/v1/'
                'a959ac7d6a4a475daf2428df315c41ef/'
                'stacks/overcloud/123'
            }],
                           logical_resource_id='logical_id',
                           physical_resource_id='resource_id',
                           resource_type='OS::Heat::ResourceGroup',
                           resource_name='Compute'),
            mock.MagicMock(
                links=[{
                    'rel':
                    'stack',
                    'href':
                    'http://192.0.2.1:8004/v1/'
                    'a959ac7d6a4a475daf2428df315c41ef/'
                    'stacks/overcloud/124'
                }],
                logical_resource_id='node0',
                physical_resource_id='123',
                resource_type='OS::TripleO::Compute',
                parent_resource='Compute',
                resource_name='node0',
            )
        ]
        heatclient.stacks.get.return_value = mock_stack()
        heatclient.stacks.validate.return_value = {}
        mock_get_heat_client.return_value = heatclient

        mock_ctx = mock.MagicMock()
        swift = mock.MagicMock(url="http://test.com")
        mock_env = yaml.safe_dump(
            {
                'name': 'overcloud',
                'temp_environment': 'temp_environment',
                'template': 'template',
                'environments': [{
                    u'path': u'environments/test.yaml'
                }]
            },
            default_flow_style=False)
        mock_roles = yaml.safe_dump([{"name": "foo"}])
        mock_network = yaml.safe_dump([{'enabled': False}])
        mock_exclude = yaml.safe_dump({"name": "foo"})
        swift.get_object.side_effect = (
            ({}, mock_env), ({}, mock_env), ({}, mock_roles),
            ({}, mock_network), ({}, mock_exclude), ({}, mock_env),
            ({}, mock_env), ({}, mock_env), ({}, mock_roles),
            ({}, mock_network), ({}, mock_exclude), ({}, mock_env), ({},
                                                                     mock_env),
            swiftexceptions.ClientException('atest2'))

        def return_container_files(*args):
            return ('headers', [{'name': 'foo.role.j2.yaml'}])

        swift.get_container = mock.MagicMock(
            side_effect=return_container_files)
        mock_get_object_client.return_value = swift

        env = {
            'resource_registry': {
                'resources': {
                    '*': {
                        '*': {
                            'UpdateDeployment': {
                                'hooks': []
                            }
                        }
                    }
                }
            }
        }

        mock_get_template_contents.return_value = ({}, {
            'heat_template_version':
            '2016-04-30'
        })

        # Test
        action = scale.ScaleDownAction(constants.STACK_TIMEOUT_DEFAULT,
                                       ['resource_id'], 'stack')
        result = action.run(mock_ctx)

        heatclient.stacks.validate.assert_called_once_with(
            environment=env,
            files={},
            show_nested=True,
            template={'heat_template_version': '2016-04-30'})

        clear_list = list(['ComputeCount', 'ComputeRemovalPolicies'])
        _, kwargs = heatclient.stacks.update.call_args
        self.assertEqual(set(kwargs['clear_parameters']), set(clear_list))
        self.assertEqual(kwargs['environment'], env)
        self.assertEqual(kwargs['existing'], True)
        self.assertEqual(kwargs['files'], {})

        mock_cache.assert_called_with(mock_ctx, "stack",
                                      "tripleo.parameters.get")

        self.assertEqual(None, result)