diff --git a/src/main/java/software/amazon/cloudformation/LambdaWrapper.java b/src/main/java/software/amazon/cloudformation/LambdaWrapper.java index 1d6b4a23..e810cb53 100644 --- a/src/main/java/software/amazon/cloudformation/LambdaWrapper.java +++ b/src/main/java/software/amazon/cloudformation/LambdaWrapper.java @@ -259,6 +259,10 @@ public void handleRequest(final InputStream inputStream, final OutputStream outp // transform the request object to pass to caller ResourceHandlerRequest resourceHandlerRequest = transform(request); + if (resourceHandlerRequest != null) { + resourceHandlerRequest.setPreviousResourceTags(getPreviousResourceTags(request)); + } + this.metricsPublisherProxy.publishInvocationMetric(Instant.now(), request.getAction()); // for CUD actions, validate incoming model - any error is a terminal failure on @@ -521,6 +525,31 @@ protected Map getDesiredResourceTags(final HandlerRequest getPreviousResourceTags(final HandlerRequest request) { + Map previousResourceTags = new HashMap<>(); + + if (request != null && request.getRequestData() != null) { + replaceInMap(previousResourceTags, request.getRequestData().getPreviousStackTags()); + if (request.getRequestData().getPreviousResourceProperties() != null) { + replaceInMap(previousResourceTags, + provideResourceDefinedTags(request.getRequestData().getPreviousResourceProperties())); + } + } + + return previousResourceTags; + } + private void replaceInMap(final Map targetMap, final Map sourceMap) { if (targetMap == null) { return; diff --git a/src/main/java/software/amazon/cloudformation/proxy/RequestData.java b/src/main/java/software/amazon/cloudformation/proxy/RequestData.java index d6b1cbc1..10f9bbdc 100644 --- a/src/main/java/software/amazon/cloudformation/proxy/RequestData.java +++ b/src/main/java/software/amazon/cloudformation/proxy/RequestData.java @@ -29,4 +29,5 @@ public class RequestData { private ResourceT previousResourceProperties; private Map systemTags; private Map stackTags; + private Map previousStackTags; } diff --git a/src/main/java/software/amazon/cloudformation/proxy/ResourceHandlerRequest.java b/src/main/java/software/amazon/cloudformation/proxy/ResourceHandlerRequest.java index 5cceff69..6c5b5abe 100644 --- a/src/main/java/software/amazon/cloudformation/proxy/ResourceHandlerRequest.java +++ b/src/main/java/software/amazon/cloudformation/proxy/ResourceHandlerRequest.java @@ -36,6 +36,7 @@ public class ResourceHandlerRequest { private T desiredResourceState; private T previousResourceState; private Map desiredResourceTags; + private Map previousResourceTags; private Map systemTags; private String awsAccountId; private String awsPartition; diff --git a/src/test/java/software/amazon/cloudformation/LambdaWrapperTest.java b/src/test/java/software/amazon/cloudformation/LambdaWrapperTest.java old mode 100644 new mode 100755 index 344691f3..53d53605 --- a/src/test/java/software/amazon/cloudformation/LambdaWrapperTest.java +++ b/src/test/java/software/amazon/cloudformation/LambdaWrapperTest.java @@ -956,4 +956,47 @@ public void getDesiredResourceTags_resourceTagOverridesStackTag() { assertThat(tags.size()).isEqualTo(1); assertThat(tags.get("Tag1")).isEqualTo("Value2"); } + + @Test + public void getPreviousResourceTags_oneStackTagAndOneResourceTag() { + final Map stackTags = new HashMap<>(); + stackTags.put("Tag1", "Value1"); + + final Map resourceTags = new HashMap<>(); + resourceTags.put("Tag2", "Value2"); + final TestModel model = TestModel.builder().tags(resourceTags).build(); + + final HandlerRequest request = new HandlerRequest<>(); + final RequestData requestData = new RequestData<>(); + requestData.setPreviousResourceProperties(model); + requestData.setPreviousStackTags(stackTags); + request.setRequestData(requestData); + + final Map tags = wrapper.getPreviousResourceTags(request); + assertThat(tags).isNotNull(); + assertThat(tags.size()).isEqualTo(2); + assertThat(tags.get("Tag1")).isEqualTo("Value1"); + assertThat(tags.get("Tag2")).isEqualTo("Value2"); + } + + @Test + public void getPreviousResourceTags_resourceTagOverridesStackTag() { + final Map stackTags = new HashMap<>(); + stackTags.put("Tag1", "Value1"); + + final Map resourceTags = new HashMap<>(); + resourceTags.put("Tag1", "Value2"); + final TestModel model = TestModel.builder().tags(resourceTags).build(); + + final HandlerRequest request = new HandlerRequest<>(); + final RequestData requestData = new RequestData<>(); + requestData.setPreviousResourceProperties(model); + requestData.setPreviousStackTags(stackTags); + request.setRequestData(requestData); + + final Map tags = wrapper.getPreviousResourceTags(request); + assertThat(tags).isNotNull(); + assertThat(tags.size()).isEqualTo(1); + assertThat(tags.get("Tag1")).isEqualTo("Value2"); + } }