Error listing Lambda layers after layer deletion (#5376)

This commit is contained in:
Amine Haj Ali 2022-08-12 17:32:41 +01:00 committed by GitHub
parent f743567789
commit c40c6895ce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 76 additions and 4 deletions

View File

@ -364,12 +364,16 @@ class Layer(object):
self.layer_versions.pop(str(layer_version), None) self.layer_versions.pop(str(layer_version), None)
def to_dict(self): def to_dict(self):
if not self.layer_versions:
return {}
last_key = sorted(self.layer_versions.keys(), key=lambda version: int(version))[
-1
]
return { return {
"LayerName": self.name, "LayerName": self.name,
"LayerArn": self.layer_arn, "LayerArn": self.layer_arn,
"LatestMatchingVersion": self.layer_versions[ "LatestMatchingVersion": self.layer_versions[last_key].get_layer_version(),
str(self._latest_version)
].get_layer_version(),
} }
@ -1242,7 +1246,9 @@ class LayerStorage(object):
self._layers[layer_version.name].attach_version(layer_version) self._layers[layer_version.name].attach_version(layer_version)
def list_layers(self): def list_layers(self):
return [layer.to_dict() for layer in self._layers.values()] return [
layer.to_dict() for layer in self._layers.values() if layer.layer_versions
]
def delete_layer_version(self, layer_name, layer_version): def delete_layer_version(self, layer_name, layer_version):
self._layers[layer_name].delete_version(layer_version) self._layers[layer_name].delete_version(layer_version)

View File

@ -230,3 +230,69 @@ def test_delete_layer_version():
result = conn.list_layer_versions(LayerName=layer_name)["LayerVersions"] result = conn.list_layer_versions(LayerName=layer_name)["LayerVersions"]
result.should.equal([]) result.should.equal([])
@mock_lambda
@mock_s3
def test_get_layer_with_no_layer_versions():
def get_layer_by_layer_name_from_list_of_layer_dicts(layer_name, layer_list):
for layer in layer_list:
if layer["LayerName"] == layer_name:
return layer
return None
conn = boto3.client("lambda", _lambda_region)
layer_name = str(uuid4())[0:6]
# Publish a new Layer and assert Layer exists and only version 1 is there
conn.publish_layer_version(
LayerName=layer_name,
Content={"ZipFile": get_test_zip_file1()},
)
assert (
get_layer_by_layer_name_from_list_of_layer_dicts(
layer_name, conn.list_layers()["Layers"]
)["LatestMatchingVersion"]["Version"]
== 1
)
# Add a new version of that Layer then delete that version
conn.publish_layer_version(
LayerName=layer_name,
Content={"ZipFile": get_test_zip_file1()},
)
assert (
get_layer_by_layer_name_from_list_of_layer_dicts(
layer_name, conn.list_layers()["Layers"]
)["LatestMatchingVersion"]["Version"]
== 2
)
conn.delete_layer_version(LayerName=layer_name, VersionNumber=2)
assert (
get_layer_by_layer_name_from_list_of_layer_dicts(
layer_name, conn.list_layers()["Layers"]
)["LatestMatchingVersion"]["Version"]
== 1
)
# Delete the last layer_version and check that the Layer is still in the LayerStorage
conn.delete_layer_version(LayerName=layer_name, VersionNumber=1)
assert (
get_layer_by_layer_name_from_list_of_layer_dicts(
layer_name, conn.list_layers()["Layers"]
)
is None
)
# Assert _latest_version didn't decrement
conn.publish_layer_version(
LayerName=layer_name,
Content={"ZipFile": get_test_zip_file1()},
)
assert (
get_layer_by_layer_name_from_list_of_layer_dicts(
layer_name, conn.list_layers()["Layers"]
)["LatestMatchingVersion"]["Version"]
== 3
)