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
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
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)
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
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
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
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