IOT: fix increment policy version ids (#5296)
This commit is contained in:
parent
feedf1802d
commit
c51ff9bb5f
@ -216,6 +216,7 @@ class FakePolicy(BaseModel):
|
|||||||
self.arn = f"arn:aws:iot:{region_name}:{get_account_id()}:policy/{name}"
|
self.arn = f"arn:aws:iot:{region_name}:{get_account_id()}:policy/{name}"
|
||||||
self.default_version_id = default_version_id
|
self.default_version_id = default_version_id
|
||||||
self.versions = [FakePolicyVersion(self.name, document, True, region_name)]
|
self.versions = [FakePolicyVersion(self.name, document, True, region_name)]
|
||||||
|
self._max_version_id = self.versions[0]._version_id
|
||||||
|
|
||||||
def to_get_dict(self):
|
def to_get_dict(self):
|
||||||
return {
|
return {
|
||||||
@ -238,16 +239,20 @@ class FakePolicy(BaseModel):
|
|||||||
|
|
||||||
|
|
||||||
class FakePolicyVersion(object):
|
class FakePolicyVersion(object):
|
||||||
def __init__(self, policy_name, document, is_default, region_name):
|
def __init__(self, policy_name, document, is_default, region_name, version_id=1):
|
||||||
self.name = policy_name
|
self.name = policy_name
|
||||||
self.arn = f"arn:aws:iot:{region_name}:{get_account_id()}:policy/{policy_name}"
|
self.arn = f"arn:aws:iot:{region_name}:{get_account_id()}:policy/{policy_name}"
|
||||||
self.document = document or {}
|
self.document = document or {}
|
||||||
self.is_default = is_default
|
self.is_default = is_default
|
||||||
self.version_id = "1"
|
self._version_id = version_id
|
||||||
|
|
||||||
self.create_datetime = time.mktime(datetime(2015, 1, 1).timetuple())
|
self.create_datetime = time.mktime(datetime(2015, 1, 1).timetuple())
|
||||||
self.last_modified_datetime = time.mktime(datetime(2015, 1, 2).timetuple())
|
self.last_modified_datetime = time.mktime(datetime(2015, 1, 2).timetuple())
|
||||||
|
|
||||||
|
@property
|
||||||
|
def version_id(self):
|
||||||
|
return str(self._version_id)
|
||||||
|
|
||||||
def to_get_dict(self):
|
def to_get_dict(self):
|
||||||
return {
|
return {
|
||||||
"policyName": self.name,
|
"policyName": self.name,
|
||||||
@ -1047,11 +1052,16 @@ class IoTBackend(BaseBackend):
|
|||||||
raise ResourceNotFoundException()
|
raise ResourceNotFoundException()
|
||||||
if len(policy.versions) >= 5:
|
if len(policy.versions) >= 5:
|
||||||
raise VersionsLimitExceededException(policy_name)
|
raise VersionsLimitExceededException(policy_name)
|
||||||
|
|
||||||
|
policy._max_version_id += 1
|
||||||
version = FakePolicyVersion(
|
version = FakePolicyVersion(
|
||||||
policy_name, policy_document, set_as_default, self.region_name
|
policy_name,
|
||||||
|
policy_document,
|
||||||
|
set_as_default,
|
||||||
|
self.region_name,
|
||||||
|
version_id=policy._max_version_id,
|
||||||
)
|
)
|
||||||
policy.versions.append(version)
|
policy.versions.append(version)
|
||||||
version.version_id = "{0}".format(len(policy.versions))
|
|
||||||
if set_as_default:
|
if set_as_default:
|
||||||
self.set_default_policy_version(policy_name, version.version_id)
|
self.set_default_policy_version(policy_name, version.version_id)
|
||||||
return version
|
return version
|
||||||
|
@ -241,6 +241,45 @@ def test_policy_versions(iot_client):
|
|||||||
err["Message"].should.equal("Cannot delete the default version of a policy")
|
err["Message"].should.equal("Cannot delete the default version of a policy")
|
||||||
|
|
||||||
|
|
||||||
|
def test_policy_versions_increment_beyond_5(iot_client, policy):
|
||||||
|
"""
|
||||||
|
Version ids increment by one each time.
|
||||||
|
|
||||||
|
Previously there was a bug where the version id was not incremented beyond 5.
|
||||||
|
This prevents a regression.
|
||||||
|
"""
|
||||||
|
policy_name = policy["policyName"]
|
||||||
|
|
||||||
|
for v in range(2, 11):
|
||||||
|
new_version = iot_client.create_policy_version(
|
||||||
|
policyName=policy_name,
|
||||||
|
policyDocument=json.dumps({"version": f"version_{v}"}),
|
||||||
|
setAsDefault=True,
|
||||||
|
)
|
||||||
|
new_version.should.have.key("policyVersionId").which.should.equal(str(v))
|
||||||
|
iot_client.delete_policy_version(
|
||||||
|
policyName=policy_name, policyVersionId=str(v - 1)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_policy_versions_increment_even_after_version_delete(iot_client, policy):
|
||||||
|
"""Version ids increment even if the max version was deleted."""
|
||||||
|
|
||||||
|
policy_name = policy["policyName"]
|
||||||
|
|
||||||
|
new_version = iot_client.create_policy_version(
|
||||||
|
policyName=policy_name,
|
||||||
|
policyDocument=json.dumps({"version": "version_2"}),
|
||||||
|
)
|
||||||
|
new_version.should.have.key("policyVersionId").which.should.equal("2")
|
||||||
|
iot_client.delete_policy_version(policyName=policy_name, policyVersionId="2")
|
||||||
|
third_version = iot_client.create_policy_version(
|
||||||
|
policyName=policy_name,
|
||||||
|
policyDocument=json.dumps({"version": "version_3"}),
|
||||||
|
)
|
||||||
|
third_version.should.have.key("policyVersionId").which.should.equal("3")
|
||||||
|
|
||||||
|
|
||||||
def test_delete_policy_validation(iot_client):
|
def test_delete_policy_validation(iot_client):
|
||||||
doc = """{
|
doc = """{
|
||||||
"Version": "2012-10-17",
|
"Version": "2012-10-17",
|
||||||
|
Loading…
Reference in New Issue
Block a user