def test_select_and_split(): parameters = {"AccountSubnetIDs": "id1,id2,id3"} mappings = {} conditions = {} function = {"Fn::Select": ["2", {"Fn::Split": [",", {"Ref": "AccountSubnetIDs"}]}]} assert resolve(function, parameters, mappings, conditions) == "id3"
def test_find_in_map_and_ref(): parameters = {"AWS::Region": "us-east-1"} mappings = {"RegionMap": {"us-east-1": {"HVM64": "ami-0ff8a91507f77f867"}}} conditions = {} function = {"Fn::FindInMap": ["RegionMap", {"Ref": "AWS::Region"}, "HVM64"]} assert resolve(function, parameters, mappings, conditions) == "ami-0ff8a91507f77f867"
def test_find_in_map(function, expected_output): parameters = {} mappings = {"RegionMap": {"us-east-1": {"HVM64": "ami-0ff8a91507f77f867"}}} conditions = {} assert resolve(function, parameters, mappings, conditions) == expected_output
def test_sub_and_ref(): parameters = {"RootDomainName": "skyscanner.net"} mappings = {} conditions = {} function = {"Fn::Sub": ["www.${Domain}", {"Domain": {"Ref": "RootDomainName"}}]} assert resolve(function, parameters, mappings, conditions) == "www.skyscanner.net"
def test_select_and_ref(): parameters = {"DbSubnetIpBlocks": ["10.0.48.0/24", "10.0.112.0/24", "10.0.176.0/24"]} mappings = {} conditions = {} function = {"Fn::Select": ["0", {"Ref": "DbSubnetIpBlocks"}]} assert resolve(function, parameters, mappings, conditions) == "10.0.48.0/24"
def test_join(function, expected_output): parameters = {} mappings = {} conditions = {} assert resolve(function, parameters, mappings, conditions) == expected_output
def test_condition(function, expected_output): parameters = {} mappings = {} conditions = {"SomeOtherCondition": True} assert resolve(function, parameters, mappings, conditions) == expected_output
def test_import_value(function, expected_output): parameters = {"abc": "ABC"} mappings = {} conditions = {} assert resolve(function, parameters, mappings, conditions) == expected_output
def test_if(function, expected_output): parameters = {} mappings = {} conditions = {"A": True, "B": False} assert resolve(function, parameters, mappings, conditions) == expected_output
def test_join_and_ref(): parameters = {"Partition": "patata", "AWS::AccountId": "1234567890"} mappings = {} conditions = {} function = { "Fn::Join": ["", ["arn:", {"Ref": "Partition"}, ":s3:::elasticbeanstalk-*-", {"Ref": "AWS::AccountId"}]] } assert resolve(function, parameters, mappings, conditions) == "arn:patata:s3:::elasticbeanstalk-*-1234567890"
def resolve(self, extra_params=None) -> "CFModel": """ Resolve all intrinsic functions on the template. Arguments: extra_params: Values of parameters passed to the Cloudformation. Returns: A new CFModel. """ extra_params = {} if extra_params is None else extra_params # default parameters params = {} for key, parameter in self.Parameters.items(): passed_value = extra_params.pop(key, None) ref_value = parameter.get_ref_value(passed_value) if ref_value is not None: params[key] = ref_value extended_parameters = { **self.PSEUDO_PARAMETERS, **params, **extra_params } dict_value = self.dict() conditions = dict_value.pop("Conditions", {}) resolved_conditions = { key: _extended_bool( resolve(value, extended_parameters, self.Mappings, {})) for key, value in conditions.items() } resources = dict_value.pop("Resources") resolved_resources = { key: resolve(value, extended_parameters, self.Mappings, resolved_conditions) for key, value in resources.items() if value.get("Condition") is None or ( value.get("Condition") is not None and resolved_conditions.get(value["Condition"], True)) } return CFModel(**dict_value, Conditions=resolved_conditions, Resources=resolved_resources)
def test_statement_condition_with_resolver_works_fine(): statement_condition_raw = { "StringLike": { "patata": { "Fn::Sub": "${ClusterId}*" } } } resolved_statement_condition_raw = resolve(statement_condition_raw, {"ClusterId": "test_cluster"}, {}, {}) resolved_statement_condition = StatementCondition.parse_obj( resolved_statement_condition_raw) assert resolved_statement_condition.eval({"patata": "test_cluster" }) is True