Ejemplo n.º 1
0
    def add_parameters(self, parameter_definitions, force=False):
        '''Adds resource and parameter definitions to a resource group's resource-template.json file.

        Args:

            parameter_definitions: dictionary containing parameter definitions.

            force (named): indicates if resource and parameter definitions replace existing definitions. Default is False.

        Returns:

            True if any definitions were added.
        '''

        changed = False

        parameters = util.dict_get_or_add(self.template, 'Parameters', {})
        for parameter_name, parameter_definition in parameter_definitions.iteritems():
            if parameter_name in parameters and not force:
                self.__context.view.parameter_exists(self.template_path, parameter_name)
            else:
                self.__context.view.adding_parameter(self.template_path, parameter_name)
                parameters[parameter_name] = parameter_definition
                changed = True

        return changed
Ejemplo n.º 2
0
    def add_output(self, logical_id, description, value, force=False):
        '''Adds an output to a resource group's resource-template.json file.

        Args:

            logical_id: the name of the output

            description: a description of the output

            value: the output value. May be of the form { "Ref": "..." } or
            { "Gn::GetAtt": [ "...", "..." ] } or any other construct allowed
            by Cloud Formation.

            force (named): Determine if existing definitions are replaced. Default
            is False.

        Returns:

            True if a change was made.
        '''
        changed = False

        outputs = util.dict_get_or_add(self.template, 'Outputs', {})
        if logical_id not in outputs or force:
            self.__context.view.adding_output(self.template_path, logical_id)
            outputs[logical_id] = {
                'Description': description,
                'Value': value
            }
            changed = True
        else:
            self.__context.view.output_exists(self.template_path, logical_id)

        return changed
Ejemplo n.º 3
0
def create_function_folder(context, args):
    group = context.resource_groups.get(args.resource_group)
    function_path = os.path.join(group.directory_path, 'lambda-code', args.function)

    if not args.force:
        function_template_definition = util.dict_get_or_add(group.template, 'Resources', {}).get(args.function, {})
        if not function_template_definition:
            raise HandledError("Function {} does not exist in Resource group {}. Not adding lambda-code folder".format(args.function, args.resource_group))
        if not function_template_definition['Type'] == 'AWS::Lambda::Function':
            raise HandledError("{} is not a Lambda Function resource in Resource group {}. Not adding lambda-code folder".format(args.function, args.resource_group))

    if not os.path.exists(function_path):
        # if function folder does not already exist add it
        context.config.copy_default_lambda_code_content(function_path)
Ejemplo n.º 4
0
    def remove_output(self, logical_id):
        '''Removes an output to a resource group's resource-template.json file.

        Args:

            logical_id: the name of the output

        Returns:

            True if a change was made.
        '''
        changed = False

        outputs = util.dict_get_or_add(self.template, 'Outputs', {})
        if logical_id in outputs:
            self.__context.view.removing_output(self.template_path, logical_id)
            del outputs[logical_id]
            changed = True
        else:
            self.__context.view.output_not_found(self.template_path, logical_id)

        return changed
Ejemplo n.º 5
0
    def remove_resources(self, resource_names):
        '''Removes resource definitions from a resource group's resource-template.json file.

        Args:

            resource_names: list containing resource names.

        Returns:

            True if any definitions were removed.
        '''

        changed = False

        resources = util.dict_get_or_add(self.template, 'Resources', {})
        for resource_name in resource_names:
            if resource_name not in resources:
                self.__context.view.resource_not_found(self.template_path, resource_name)
            else:
                self.__context.view.removing_resource(self.template_path, resource_name)
                del resources[resource_name]
                changed = True

        for resource_definition in resources.values():
            depends_on = resource_definition.get('DependsOn')
            if depends_on:
                if isinstance(depends_on, type([])):
                    for resource_name in resource_names:
                        while resource_name in depends_on:
                            depends_on.remove(resource_name)
                            changed = True
                else:
                    if depends_on in resource_names:
                        resource_definition['DependsOn'] = []
                        changed = True


        return changed
Ejemplo n.º 6
0
    def remove_parameters(self, parameter_names):
        '''Removes resource and parameter definitions from a resource group's resource-template.json file.

        Args:

            parameter_names: list containing parameter names.

        Returns:

            True if any definitions were removed.
        '''

        changed = False

        parameters = util.dict_get_or_add(self.template, 'Parameters', {})
        for parameter_name in parameter_names:
            if parameter_name not in parameters:
                self.__context.view.parameter_not_found(self.template_path, parameter_name)
            else:
                self.__context.view.removing_parameter(self.template_path, parameter_name)
                del parameters[parameter_name]
                changed = True

        return changed
Ejemplo n.º 7
0
    def add_resources(self, resource_definitions, force=False, dependencies=None):
        '''Adds resource definitions to a resource group's resource-template.json file.

        Args:

            resource_definitions: dictionary containing resource definitions.

            force (named): indicates if resource and parameter definitions replace existing definitions. Default is False.

            dependencies (named): a dictionary that provides updates to the DepondsOn property of existing resources:

              {
                  '<dependent-resource-name>': [ '<dependency-resource-name>', ... ],
                  ...
              }

            resutls in:

                "<dependent-resource-name>": {
                   "DependsOn": [ "<dependency-resource-name>" ]
                   ...
                }

        Returns:

            True if any definitions were added.
        '''

        changed = False

        if dependencies is None:
            dependencies = {}

        resources = util.dict_get_or_add(self.template, 'Resources', {})
        for resource_name, resource_definition in resource_definitions.iteritems():
            if resource_name in resources and not force:
                self.__context.view.resource_exists(self.template_path, resource_name)
            else:
                self.__context.view.adding_resource(self.template_path, resource_name)
                resources[resource_name] = resource_definition
                if self.__has_access_control_metadata(resource_definition):
                    dependency_list = dependencies.setdefault('AccessControl', [])
                    dependency_list.append(resource_name)
                changed = True

        if dependencies:

            for dependent_name, dependency_list in dependencies.iteritems():

                if dependent_name == 'AccessControl':
                    dependent_definition = resources.setdefault('AccessControl', security.DEFAULT_ACCESS_CONTROL_RESOURCE_DEFINITION)
                else:
                    dependent_definition = resources.get(dependent_name)
                    if dependent_definition is None:
                        raise ValueError('The dependent resource {} does not exist.'.format(dependent_name))

            dependencies = dependent_definition.setdefault('DependsOn', [])
            if not isinstance(dependencies, type([])):
                dependencies = [ dependencies ]
                dependent_definition['DependsOn'] = dependencies

            if not isinstance(dependency_list, type([])):
                dependency_list = [ dependency_list ]

            dependencies.extend(set(dependency_list))

        return changed