Add set_default_policy_version to the IAM backend (#3347)
				
					
				
			* Adding set_default_policy_version * Adding tests and reformatting * Reformatting tests
This commit is contained in:
		
							parent
							
								
									7cead73aa1
								
							
						
					
					
						commit
						a668349a70
					
				@ -125,9 +125,10 @@ class Policy(CloudFormationModel):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    def update_default_version(self, new_default_version_id):
 | 
					    def update_default_version(self, new_default_version_id):
 | 
				
			||||||
        for version in self.versions:
 | 
					        for version in self.versions:
 | 
				
			||||||
 | 
					            if version.version_id == new_default_version_id:
 | 
				
			||||||
 | 
					                version.is_default = True
 | 
				
			||||||
            if version.version_id == self.default_version_id:
 | 
					            if version.version_id == self.default_version_id:
 | 
				
			||||||
                version.is_default = False
 | 
					                version.is_default = False
 | 
				
			||||||
                break
 | 
					 | 
				
			||||||
        self.default_version_id = new_default_version_id
 | 
					        self.default_version_id = new_default_version_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
@ -1544,6 +1545,29 @@ class IAMBackend(BaseBackend):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        return self._filter_attached_policies(policies, marker, max_items, path_prefix)
 | 
					        return self._filter_attached_policies(policies, marker, max_items, path_prefix)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def set_default_policy_version(self, policy_arn, version_id):
 | 
				
			||||||
 | 
					        import re
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if re.match("v[1-9][0-9]*(\.[A-Za-z0-9-]*)?", version_id) is None:
 | 
				
			||||||
 | 
					            raise ValidationError(
 | 
				
			||||||
 | 
					                "Value '{0}' at 'versionId' failed to satisfy constraint: Member must satisfy regular expression pattern: v[1-9][0-9]*(\.[A-Za-z0-9-]*)?".format(
 | 
				
			||||||
 | 
					                    version_id
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        policy = self.get_policy(policy_arn)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for version in policy.versions:
 | 
				
			||||||
 | 
					            if version.version_id == version_id:
 | 
				
			||||||
 | 
					                policy.update_default_version(version_id)
 | 
				
			||||||
 | 
					                return True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        raise NoSuchEntity(
 | 
				
			||||||
 | 
					            "Policy {0} version {1} does not exist or is not attachable.".format(
 | 
				
			||||||
 | 
					                policy_arn, version_id
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _filter_attached_policies(self, policies, marker, max_items, path_prefix):
 | 
					    def _filter_attached_policies(self, policies, marker, max_items, path_prefix):
 | 
				
			||||||
        if path_prefix:
 | 
					        if path_prefix:
 | 
				
			||||||
            policies = [p for p in policies if p.path.startswith(path_prefix)]
 | 
					            policies = [p for p in policies if p.path.startswith(path_prefix)]
 | 
				
			||||||
 | 
				
			|||||||
@ -175,6 +175,13 @@ class IamResponse(BaseResponse):
 | 
				
			|||||||
            roles=entity_roles, users=entity_users, groups=entity_groups
 | 
					            roles=entity_roles, users=entity_users, groups=entity_groups
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def set_default_policy_version(self):
 | 
				
			||||||
 | 
					        policy_arn = self._get_param("PolicyArn")
 | 
				
			||||||
 | 
					        version_id = self._get_param("VersionId")
 | 
				
			||||||
 | 
					        iam_backend.set_default_policy_version(policy_arn, version_id)
 | 
				
			||||||
 | 
					        template = self.response_template(SET_DEFAULT_POLICY_VERSION_TEMPLATE)
 | 
				
			||||||
 | 
					        return template.render()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def create_role(self):
 | 
					    def create_role(self):
 | 
				
			||||||
        role_name = self._get_param("RoleName")
 | 
					        role_name = self._get_param("RoleName")
 | 
				
			||||||
        path = self._get_param("Path")
 | 
					        path = self._get_param("Path")
 | 
				
			||||||
@ -1010,6 +1017,13 @@ LIST_ENTITIES_FOR_POLICY_TEMPLATE = """<ListEntitiesForPolicyResponse>
 | 
				
			|||||||
</ListEntitiesForPolicyResponse>"""
 | 
					</ListEntitiesForPolicyResponse>"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SET_DEFAULT_POLICY_VERSION_TEMPLATE = """<SetDefaultPolicyVersionResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
 | 
				
			||||||
 | 
					  <ResponseMetadata>
 | 
				
			||||||
 | 
					    <RequestId>35f241af-3ebc-11e4-9d0d-6f969EXAMPLE</RequestId>
 | 
				
			||||||
 | 
					  </ResponseMetadata>
 | 
				
			||||||
 | 
					</SetDefaultPolicyVersionResponse>"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ATTACH_ROLE_POLICY_TEMPLATE = """<AttachRolePolicyResponse>
 | 
					ATTACH_ROLE_POLICY_TEMPLATE = """<AttachRolePolicyResponse>
 | 
				
			||||||
  <ResponseMetadata>
 | 
					  <ResponseMetadata>
 | 
				
			||||||
    <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
 | 
					    <RequestId>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestId>
 | 
				
			||||||
 | 
				
			|||||||
@ -549,6 +549,59 @@ def test_set_default_policy_version():
 | 
				
			|||||||
    versions.get("Versions")[2].get("Document").should.equal(json.loads(MOCK_POLICY_3))
 | 
					    versions.get("Versions")[2].get("Document").should.equal(json.loads(MOCK_POLICY_3))
 | 
				
			||||||
    versions.get("Versions")[2].get("IsDefaultVersion").should.be.ok
 | 
					    versions.get("Versions")[2].get("IsDefaultVersion").should.be.ok
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    conn.set_default_policy_version(
 | 
				
			||||||
 | 
					        PolicyArn="arn:aws:iam::{}:policy/TestSetDefaultPolicyVersion".format(
 | 
				
			||||||
 | 
					            ACCOUNT_ID
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					        VersionId="v1",
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    versions = conn.list_policy_versions(
 | 
				
			||||||
 | 
					        PolicyArn="arn:aws:iam::{}:policy/TestSetDefaultPolicyVersion".format(
 | 
				
			||||||
 | 
					            ACCOUNT_ID
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    versions.get("Versions")[0].get("Document").should.equal(json.loads(MOCK_POLICY))
 | 
				
			||||||
 | 
					    versions.get("Versions")[0].get("IsDefaultVersion").should.be.ok
 | 
				
			||||||
 | 
					    versions.get("Versions")[1].get("Document").should.equal(json.loads(MOCK_POLICY_2))
 | 
				
			||||||
 | 
					    versions.get("Versions")[1].get("IsDefaultVersion").shouldnt.be.ok
 | 
				
			||||||
 | 
					    versions.get("Versions")[2].get("Document").should.equal(json.loads(MOCK_POLICY_3))
 | 
				
			||||||
 | 
					    versions.get("Versions")[2].get("IsDefaultVersion").shouldnt.be.ok
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Set default version for non-existing policy
 | 
				
			||||||
 | 
					    conn.set_default_policy_version.when.called_with(
 | 
				
			||||||
 | 
					        PolicyArn="arn:aws:iam::{}:policy/TestNonExistingPolicy".format(ACCOUNT_ID),
 | 
				
			||||||
 | 
					        VersionId="v1",
 | 
				
			||||||
 | 
					    ).should.throw(
 | 
				
			||||||
 | 
					        ClientError,
 | 
				
			||||||
 | 
					        "Policy arn:aws:iam::{}:policy/TestNonExistingPolicy not found".format(
 | 
				
			||||||
 | 
					            ACCOUNT_ID
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Set default version for incorrect version
 | 
				
			||||||
 | 
					    conn.set_default_policy_version.when.called_with(
 | 
				
			||||||
 | 
					        PolicyArn="arn:aws:iam::{}:policy/TestSetDefaultPolicyVersion".format(
 | 
				
			||||||
 | 
					            ACCOUNT_ID
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					        VersionId="wrong_version_id",
 | 
				
			||||||
 | 
					    ).should.throw(
 | 
				
			||||||
 | 
					        ClientError,
 | 
				
			||||||
 | 
					        "Value 'wrong_version_id' at 'versionId' failed to satisfy constraint: Member must satisfy regular expression pattern: v[1-9][0-9]*(\.[A-Za-z0-9-]*)?",
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Set default version for non-existing version
 | 
				
			||||||
 | 
					    conn.set_default_policy_version.when.called_with(
 | 
				
			||||||
 | 
					        PolicyArn="arn:aws:iam::{}:policy/TestSetDefaultPolicyVersion".format(
 | 
				
			||||||
 | 
					            ACCOUNT_ID
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					        VersionId="v4",
 | 
				
			||||||
 | 
					    ).should.throw(
 | 
				
			||||||
 | 
					        ClientError,
 | 
				
			||||||
 | 
					        "Policy arn:aws:iam::{}:policy/TestSetDefaultPolicyVersion version v4 does not exist or is not attachable.".format(
 | 
				
			||||||
 | 
					            ACCOUNT_ID
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@mock_iam
 | 
					@mock_iam
 | 
				
			||||||
def test_get_policy():
 | 
					def test_get_policy():
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user