diff --git a/moto/awslambda/models.py b/moto/awslambda/models.py index f2e414680..d9d82d717 100644 --- a/moto/awslambda/models.py +++ b/moto/awslambda/models.py @@ -364,12 +364,16 @@ class Layer(object): self.layer_versions.pop(str(layer_version), None) def to_dict(self): + if not self.layer_versions: + return {} + + last_key = sorted(self.layer_versions.keys(), key=lambda version: int(version))[ + -1 + ] return { "LayerName": self.name, "LayerArn": self.layer_arn, - "LatestMatchingVersion": self.layer_versions[ - str(self._latest_version) - ].get_layer_version(), + "LatestMatchingVersion": self.layer_versions[last_key].get_layer_version(), } @@ -1242,7 +1246,9 @@ class LayerStorage(object): self._layers[layer_version.name].attach_version(layer_version) 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): self._layers[layer_name].delete_version(layer_version) diff --git a/tests/test_awslambda/test_lambda_layers.py b/tests/test_awslambda/test_lambda_layers.py index 8e0be4001..0de7635ca 100644 --- a/tests/test_awslambda/test_lambda_layers.py +++ b/tests/test_awslambda/test_lambda_layers.py @@ -230,3 +230,69 @@ def test_delete_layer_version(): result = conn.list_layer_versions(LayerName=layer_name)["LayerVersions"] 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 + )