def test_from_dict(self): from troposphere_mate.apigateway import RestApi tpl = Template() rest_api = RestApi( "RestApi", template=tpl, Metadata={"description": "a rest api"}, Name="MyApi", ) output_rest_api_id = Output("RestApiId", Value=Ref(rest_api), DependsOn=rest_api) tpl.add_output(output_rest_api_id) dct = tpl.to_dict() # print(tpl.to_json()) tpl = Template.from_dict(dct) tpl.remove_resource_by_label(label="na") assert tpl.to_dict() == dct assert isinstance(tpl.resources["RestApi"], RestApi) assert isinstance(tpl.outputs["RestApiId"], Output) assert getattr( tpl.outputs[output_rest_api_id.title], mtdt.TemplateLevelField.OUTPUTS_DEPENDS_ON, ) == [ rest_api.title, ] assert tpl.to_dict() == dct
def test_remove_parameter_and_output(self): tpl = Template() p1 = Parameter("P1", Type="string") o1 = Output("O1", Value=Ref("P1")) # before state tpl.add_parameter(p1) tpl.add_output(o1) assert len(tpl.parameters) == 1 assert len(tpl.outputs) == 1 # test remove by object tpl.remove_parameter(p1) tpl.remove_output(o1) assert len(tpl.parameters) == 0 assert len(tpl.outputs) == 0 # before state tpl.add_parameter(p1) tpl.add_output(o1) assert len(tpl.parameters) == 1 assert len(tpl.outputs) == 1 # test remove by str tpl.remove_parameter(p1.title) tpl.remove_output(o1.title) assert len(tpl.parameters) == 0 assert len(tpl.outputs) == 0
def test_mutable_aws_object(): """ 确定 ``mate.AWSObject`` 变化时, 对应的 ``mate.AWSObject.aws_object`` 也应该 跟着变化. """ from troposphere_mate import iam tpl = Template() my_policy = iam.ManagedPolicy( title="MyPolicy", template=tpl, PolicyDocument={}, ) my_role = iam.Role( title="MyRole", template=tpl, RoleName="my-role", AssumeRolePolicyDocument={}, ) assert tpl.to_dict( )["Resources"]["MyRole"]["Properties"]["RoleName"] == "my-role" assert "ManagedPolicyArns" not in tpl.to_dict( )["Resources"]["MyRole"]["Properties"] my_role.RoleName = "my-role-two" my_role.ManagedPolicyArns = [Ref(my_policy)] assert tpl.to_dict( )["Resources"]["MyRole"]["Properties"]["RoleName"] == "my-role-two" assert tpl.to_dict( )["Resources"]["MyRole"]["Properties"]["ManagedPolicyArns"] == [{ "Ref": "MyPolicy" }] outputs = [ Output( "MyRolePath", Value=GetAtt(my_role, "Path"), DependsOn=my_role, ) ] for output in outputs: tpl.add_output(output) assert tpl.to_dict()["Outputs"]["MyRolePath"]["Value"] == { "Fn::GetAtt": ["MyRole", "Path"] } dct = tpl.to_dict() tpl2 = Template() tpl2.add_resource(my_policy) tpl2.add_resource(my_role) for output in outputs: tpl2.add_output(output) dct2 = tpl2.to_dict() assert dct == dct2
def test_add_parameter_resource_output(self): from troposphere_mate import apigateway tpl = Template() param_project_name = Parameter("ProjectName", Type="String") rest_api = apigateway.RestApi( "RestApi", template=tpl, Name=Ref(param_project_name), EndpointConfiguration=apigateway.EndpointConfiguration( Types=["REGIONAL"])) output_rest_api_id = Output("RestApiId", Value=Ref(rest_api)) # test ignore_duplicate argument tpl.add_parameter(param_project_name) with raises(ValueError): tpl.add_parameter(param_project_name) tpl.add_parameter(param_project_name, ignore_duplicate=True) with raises(ValueError): tpl.add_resource(rest_api) tpl.add_resource(rest_api, ignore_duplicate=True) tpl.add_output(output_rest_api_id) with raises(ValueError): tpl.add_output(output_rest_api_id) tpl.add_output(output_rest_api_id, ignore_duplicate=True)
class Canned(object): def __init__(self): self.tpl = Template() self.param_env_name = Parameter("EnvName", Type="String") self.rest_api_x = apigateway.RestApi( "RestApiX", template=self.tpl, Name="MyRestApiX", ) self.rest_api_y = apigateway.RestApi( "RestApiY", template=self.tpl, Name="MyRestApiY", DependsOn=self.rest_api_x, ) self.rest_api_z = apigateway.RestApi("RestApiZ", template=self.tpl, Name="MyRestApiZ", DependsOn=self.rest_api_y) self.output_rest_api_x_id = Output( "RestApiXId", Value=Ref(self.rest_api_x), DependsOn=self.rest_api_x, ) self.tpl.add_output(self.output_rest_api_x_id) self.output_rest_api_y_id = Output( "RestApiYId", Value=Ref(self.rest_api_y), DependsOn=self.rest_api_y, ) self.tpl.add_output(self.output_rest_api_y_id) self.output_rest_api_z_id = Output( "RestApiZId", Value=Ref(self.rest_api_z), DependsOn=self.rest_api_z, ) self.tpl.add_output(self.output_rest_api_z_id)
iam_instance_profile = iam.InstanceProfile( "IamInstanceProfileWebServer", template=template, InstanceProfileName=helper_fn_sub("{}-web-server", param_env_name), # cross reference output Roles=[ GetAtt( iam_role_stack, f"Outputs.{tier_1_iam_role.output_iam_ec2_instance_role_name.title}" ), ], DependsOn=iam_role_stack, ) # allow cross reference from other stack output_iam_ec2_instance_profile_name = Output( "IamInstanceProfileName", Value=iam_instance_profile.iam_instance_profile_name, Export=Export( helper_fn_sub("{}-iam-ec2-instance-profile-name", param_env_name)), ) template.add_output(output_iam_ec2_instance_profile_name) output_iam_ec2_instance_profile_arn = Output( "IamInstanceProfileArn", Value=iam_instance_profile.iam_instance_profile_arn, Export=Export( helper_fn_sub("{}-iam-ec2-instance-profile-arn", param_env_name)), ) template.add_output(output_iam_ec2_instance_profile_arn)
iam_ec2_instance_policy = iam.ManagedPolicy( "IamPolicy", template=template, ManagedPolicyName=helper_fn_sub("{}-web-server", param_env_name), PolicyDocument={ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*", "s3:Describe*", ], "Resource": "*" } ] }, ) # allow cross reference from other stack output_iam_ec2_instance_policy_name = Output( "IamInstancePolicyArn", Value=iam_ec2_instance_policy.iam_managed_policy_arn, Export=Export(helper_fn_sub("{}-iam-ec2-instance-policy-arn", param_env_name)), DependsOn=iam_ec2_instance_policy, ) template.add_output(output_iam_ec2_instance_policy_name)