def resolve_parameter_values(self, stack_name, stack_config, cli_parameters=None): resolved_parameters = {} stack_outputs = self.cfn.get_stacks_outputs() for key, value in stack_config.parameters.items(): if isinstance(value, list): self.logger.debug("List parameter found for {0}".format(key)) for i, item in enumerate(value): if DependencyResolver.is_parameter_reference(item): referenced_stack, output_name = DependencyResolver.parse_stack_reference_value(item) value[i] = str(self.get_output_value(stack_outputs, referenced_stack, output_name)) value_string = self.convert_list_to_string(value) resolved_parameters[key] = value_string elif isinstance(value, str): if DependencyResolver.is_parameter_reference(value): referenced_stack, output_name = DependencyResolver.parse_stack_reference_value(value) resolved_parameters[key] = str(self.get_output_value(stack_outputs, referenced_stack, output_name)) elif self.is_keep_value(value): resolved_parameters[key] = str(self.get_latest_value(key, value, stack_name)) elif self.is_taupage_ami_reference(value): resolved_parameters[key] = str(self.ec2.get_latest_taupage_image_id()) elif self.is_kms(value): resolved_parameters[key] = str(self.kms.decrypt(value.split('|', 2)[2])) elif self.is_file(value): url = value.split('|', 2)[2] resolved_parameters[key] = FileLoader.get_file(url, stack_config.working_dir) else: resolved_parameters[key] = value elif isinstance(value, bool): resolved_parameters[key] = str(value).lower() elif isinstance(value, (int, float)): resolved_parameters[key] = str(value) else: raise NotImplementedError("Cannot handle {0} type for key: {1}".format(type(value), key)) if cli_parameters: return self.update_parameters_with_cli_parameters(resolved_parameters, cli_parameters, stack_name) else: return resolved_parameters
def handle_file_value(value, working_dir): components = value.split('|', 3) if len(components) == 3: url = components[2] return FileLoader.get_file(url, working_dir) elif len(components) == 4: url = components[2] pattern = components[3] file_content = FileLoader.get_yaml_or_json_file(url, working_dir) try: return jmespath.search(pattern, file_content) except JMESPathError as e: raise CfnSphereException(e) else: raise CfnSphereException("Invalid format for |File| macro, it must be |File|<path>[|<pattern>]")
def handle_file_value(value, working_dir): components = value.split('|', 3) if len(components) == 3: url = components[2] return FileLoader.get_file(url, working_dir) elif len(components) == 4: url = components[2] pattern = components[3] file_content = FileLoader.get_yaml_or_json_file(url, working_dir) try: return jmespath.search(pattern, file_content) except JMESPathError as e: raise CfnSphereException(e) else: raise CfnSphereException( "Invalid format for |File| macro, it must be |File|<path>[|<pattern>]" )
def test_get_file_calls_correct_handler_for_fs_path( self, fs_get_file_mock): FileLoader.get_file("foo/foo.yml", "/home/user") fs_get_file_mock.assert_called_with("foo/foo.yml", "/home/user")
def test_get_file_calls_correct_handler_for_S3_prefix( self, s3_get_file_mock): FileLoader.get_file("S3://foo/foo.yml", None) s3_get_file_mock.assert_called_with("S3://foo/foo.yml")
def test_get_file_calls_correct_handler_for_fs_path(self, fs_get_file_mock): FileLoader.get_file("foo/foo.yml", "/home/user") fs_get_file_mock.assert_called_with("foo/foo.yml", "/home/user")
def test_get_file_calls_correct_handler_for_S3_prefix(self, s3_get_file_mock): FileLoader.get_file("S3://foo/foo.yml", None) s3_get_file_mock.assert_called_with("S3://foo/foo.yml")