IAM:detach_*_policy(): Fix divergent error handling with aws (#5559)
This commit is contained in:
parent
6a07abbb30
commit
2c0adaa932
@ -1727,9 +1727,11 @@ class IAMBackend(BaseBackend):
|
|||||||
arns = dict((p.arn, p) for p in self.managed_policies.values())
|
arns = dict((p.arn, p) for p in self.managed_policies.values())
|
||||||
try:
|
try:
|
||||||
policy = arns[policy_arn]
|
policy = arns[policy_arn]
|
||||||
policy.detach_from(self.get_role(role_name))
|
if policy.arn not in self.get_role(role_name).managed_policies.keys():
|
||||||
|
raise KeyError
|
||||||
except KeyError:
|
except KeyError:
|
||||||
raise IAMNotFoundException("Policy {0} was not found.".format(policy_arn))
|
raise IAMNotFoundException("Policy {0} was not found.".format(policy_arn))
|
||||||
|
policy.detach_from(self.get_role(role_name))
|
||||||
|
|
||||||
def attach_group_policy(self, policy_arn, group_name):
|
def attach_group_policy(self, policy_arn, group_name):
|
||||||
arns = dict((p.arn, p) for p in self.managed_policies.values())
|
arns = dict((p.arn, p) for p in self.managed_policies.values())
|
||||||
@ -1745,6 +1747,8 @@ class IAMBackend(BaseBackend):
|
|||||||
arns = dict((p.arn, p) for p in self.managed_policies.values())
|
arns = dict((p.arn, p) for p in self.managed_policies.values())
|
||||||
try:
|
try:
|
||||||
policy = arns[policy_arn]
|
policy = arns[policy_arn]
|
||||||
|
if policy.arn not in self.get_group(group_name).managed_policies.keys():
|
||||||
|
raise KeyError
|
||||||
except KeyError:
|
except KeyError:
|
||||||
raise IAMNotFoundException("Policy {0} was not found.".format(policy_arn))
|
raise IAMNotFoundException("Policy {0} was not found.".format(policy_arn))
|
||||||
policy.detach_from(self.get_group(group_name))
|
policy.detach_from(self.get_group(group_name))
|
||||||
@ -1761,6 +1765,8 @@ class IAMBackend(BaseBackend):
|
|||||||
arns = dict((p.arn, p) for p in self.managed_policies.values())
|
arns = dict((p.arn, p) for p in self.managed_policies.values())
|
||||||
try:
|
try:
|
||||||
policy = arns[policy_arn]
|
policy = arns[policy_arn]
|
||||||
|
if policy.arn not in self.get_user(user_name).managed_policies.keys():
|
||||||
|
raise KeyError
|
||||||
except KeyError:
|
except KeyError:
|
||||||
raise IAMNotFoundException("Policy {0} was not found.".format(policy_arn))
|
raise IAMNotFoundException("Policy {0} was not found.".format(policy_arn))
|
||||||
policy.detach_from(self.get_user(user_name))
|
policy.detach_from(self.get_user(user_name))
|
||||||
|
@ -2084,6 +2084,81 @@ def test_attach_detach_user_policy():
|
|||||||
resp["AttachedPolicies"].should.have.length_of(0)
|
resp["AttachedPolicies"].should.have.length_of(0)
|
||||||
|
|
||||||
|
|
||||||
|
@mock_iam()
|
||||||
|
def test_only_detach_user_policy():
|
||||||
|
iam = boto3.resource("iam", region_name="us-east-1")
|
||||||
|
client = boto3.client("iam", region_name="us-east-1")
|
||||||
|
|
||||||
|
user = iam.create_user(UserName="test-user")
|
||||||
|
|
||||||
|
policy_name = "FreePolicy"
|
||||||
|
policy = iam.create_policy(
|
||||||
|
PolicyName=policy_name,
|
||||||
|
PolicyDocument=MOCK_POLICY,
|
||||||
|
Path="/mypolicy/",
|
||||||
|
Description="free floating policy",
|
||||||
|
)
|
||||||
|
|
||||||
|
resp = client.list_attached_user_policies(UserName=user.name)
|
||||||
|
resp["AttachedPolicies"].should.have.length_of(0)
|
||||||
|
|
||||||
|
with pytest.raises(ClientError) as exc:
|
||||||
|
client.detach_user_policy(UserName=user.name, PolicyArn=policy.arn)
|
||||||
|
err = exc.value.response["Error"]
|
||||||
|
err["Code"].should.equal("NoSuchEntity")
|
||||||
|
err["Message"].should.equal(f"Policy {policy.arn} was not found.")
|
||||||
|
|
||||||
|
|
||||||
|
@mock_iam()
|
||||||
|
def test_only_detach_group_policy():
|
||||||
|
iam = boto3.resource("iam", region_name="us-east-1")
|
||||||
|
client = boto3.client("iam", region_name="us-east-1")
|
||||||
|
|
||||||
|
group = iam.create_group(GroupName="test-group")
|
||||||
|
|
||||||
|
policy_name = "FreePolicy"
|
||||||
|
policy = iam.create_policy(
|
||||||
|
PolicyName=policy_name,
|
||||||
|
PolicyDocument=MOCK_POLICY,
|
||||||
|
Path="/mypolicy/",
|
||||||
|
Description="free floating policy",
|
||||||
|
)
|
||||||
|
|
||||||
|
resp = client.list_attached_group_policies(GroupName=group.name)
|
||||||
|
resp["AttachedPolicies"].should.have.length_of(0)
|
||||||
|
|
||||||
|
with pytest.raises(ClientError) as exc:
|
||||||
|
client.detach_group_policy(GroupName=group.name, PolicyArn=policy.arn)
|
||||||
|
err = exc.value.response["Error"]
|
||||||
|
err["Code"].should.equal("NoSuchEntity")
|
||||||
|
err["Message"].should.equal(f"Policy {policy.arn} was not found.")
|
||||||
|
|
||||||
|
|
||||||
|
@mock_iam()
|
||||||
|
def test_only_detach_role_policy():
|
||||||
|
iam = boto3.resource("iam", region_name="us-east-1")
|
||||||
|
client = boto3.client("iam", region_name="us-east-1")
|
||||||
|
|
||||||
|
role = iam.create_role(RoleName="test-role", AssumeRolePolicyDocument="{}")
|
||||||
|
|
||||||
|
policy_name = "FreePolicy"
|
||||||
|
policy = iam.create_policy(
|
||||||
|
PolicyName=policy_name,
|
||||||
|
PolicyDocument=MOCK_POLICY,
|
||||||
|
Path="/mypolicy/",
|
||||||
|
Description="free floating policy",
|
||||||
|
)
|
||||||
|
|
||||||
|
resp = client.list_attached_role_policies(RoleName=role.name)
|
||||||
|
resp["AttachedPolicies"].should.have.length_of(0)
|
||||||
|
|
||||||
|
with pytest.raises(ClientError) as exc:
|
||||||
|
client.detach_role_policy(RoleName=role.name, PolicyArn=policy.arn)
|
||||||
|
err = exc.value.response["Error"]
|
||||||
|
err["Code"].should.equal("NoSuchEntity")
|
||||||
|
err["Message"].should.equal(f"Policy {policy.arn} was not found.")
|
||||||
|
|
||||||
|
|
||||||
@mock_iam
|
@mock_iam
|
||||||
def test_update_access_key():
|
def test_update_access_key():
|
||||||
iam = boto3.resource("iam", region_name="us-east-1")
|
iam = boto3.resource("iam", region_name="us-east-1")
|
||||||
@ -3215,7 +3290,7 @@ def test_get_account_summary():
|
|||||||
"ServerCertificatesQuota": 20,
|
"ServerCertificatesQuota": 20,
|
||||||
"MFADevices": 0,
|
"MFADevices": 0,
|
||||||
"UserPolicySizeQuota": 2048,
|
"UserPolicySizeQuota": 2048,
|
||||||
"PolicyVersionsInUse": 0,
|
"PolicyVersionsInUse": 1,
|
||||||
"ServerCertificates": 0,
|
"ServerCertificates": 0,
|
||||||
"Roles": 0,
|
"Roles": 0,
|
||||||
"RolesQuota": 1000,
|
"RolesQuota": 1000,
|
||||||
@ -3287,7 +3362,7 @@ def test_get_account_summary():
|
|||||||
"ServerCertificatesQuota": 20,
|
"ServerCertificatesQuota": 20,
|
||||||
"MFADevices": 1,
|
"MFADevices": 1,
|
||||||
"UserPolicySizeQuota": 2048,
|
"UserPolicySizeQuota": 2048,
|
||||||
"PolicyVersionsInUse": 3,
|
"PolicyVersionsInUse": 4,
|
||||||
"ServerCertificates": 1,
|
"ServerCertificates": 1,
|
||||||
"Roles": 1,
|
"Roles": 1,
|
||||||
"RolesQuota": 1000,
|
"RolesQuota": 1000,
|
||||||
|
Loading…
Reference in New Issue
Block a user