in infrastructure-configuration/src/main/java/software/amazon/imagebuilder/infrastructureconfiguration/UpdateHandler.java [22:111]
public ProgressEvent<ResourceModel, CallbackContext> handleRequest(
final AmazonWebServicesClientProxy proxy,
final ResourceHandlerRequest<ResourceModel> request,
final CallbackContext callbackContext,
final Logger logger) {
this.clientProxy = proxy;
this.logger = logger;
final ResourceModel currentModel = request.getDesiredResourceState();
final ResourceModel previousModel = request.getPreviousResourceState();
final String arn = previousModel.getArn();
UpdateInfrastructureConfigurationResponse response;
try {
response = proxy.injectCredentialsAndInvokeV2(RequestUtil.generateUpdateInfrastructureConfigurationRequest(arn, currentModel),
ClientBuilder.getImageBuilderClient()::updateInfrastructureConfiguration);
Map<String, String> previousTagMap = previousModel.getTags() == null ? new HashMap<>() : previousModel.getTags();
Map<String, String> currentTagMap = currentModel.getTags() == null ? new HashMap<>() : currentModel.getTags();
// No tag/untag operation when no tag in both previous and current model.
if (previousTagMap.isEmpty() && currentTagMap.isEmpty()) {
//No operation
}
else if (previousTagMap.isEmpty()) {
// Tag all resource if no tag in previous tag map
proxy.injectCredentialsAndInvokeV2(RequestUtil.generateTagInfrastructureConfigurationRequest(
arn, currentTagMap),
ClientBuilder.getImageBuilderClient()::tagResource);
} else if (currentTagMap.isEmpty()) {
// Untag all resource if no tag in current tag map
List<String> keyList = new LinkedList<>();
for (Map.Entry<String, String> previousTagMapEntry : previousTagMap.entrySet()) {
keyList.add(previousTagMapEntry.getKey());
}
proxy.injectCredentialsAndInvokeV2(RequestUtil.generateUntagInfrastructureConfigurationRequest(arn, keyList),
ClientBuilder.getImageBuilderClient()::untagResource);
} else {
// Untag all resource tags which are not in the updatedTagMap provided by customer.
List<String> untagKeyList = new LinkedList<>();
for (Map.Entry<String,String> previousTagMapEntry : previousTagMap.entrySet()) {
if (! currentTagMap.containsKey(previousTagMapEntry.getKey())) {
untagKeyList.add(previousTagMapEntry.getKey());
}
}
if (!untagKeyList.isEmpty()) {
proxy.injectCredentialsAndInvokeV2(RequestUtil.generateUntagInfrastructureConfigurationRequest(arn, untagKeyList),
ClientBuilder.getImageBuilderClient()::untagResource);
}
// Tag resource with new tags with new keys.
Map<String, String> tagKeyMap = new HashMap<>();
for (Map.Entry<String,String> currentTagMapEntry : currentTagMap.entrySet()) {
if (! previousTagMap.containsKey(currentTagMapEntry.getKey())) {
tagKeyMap.put(currentTagMapEntry.getKey(), currentTagMapEntry.getValue());
}
}
if (!tagKeyMap.isEmpty()) {
proxy.injectCredentialsAndInvokeV2(RequestUtil.generateTagInfrastructureConfigurationRequest(arn, tagKeyMap),
ClientBuilder.getImageBuilderClient()::tagResource);
}
// Update Tag when tag keys exist but tag values updated.
Map<String, String> updateKeyMap = new HashMap<>();
for (Map.Entry<String,String> currentTagMapEntry : currentTagMap.entrySet()) {
String currentTagEntryKey = currentTagMapEntry.getKey();
String currentTagEntryValue = currentTagMapEntry.getValue();
if (previousTagMap.containsKey(currentTagEntryKey) && ! previousTagMap.get(currentTagEntryKey).equals(currentTagEntryValue)) {
updateKeyMap.put(currentTagMapEntry.getKey(), currentTagMapEntry.getValue());
}
}
if (!updateKeyMap.isEmpty()) {
proxy.injectCredentialsAndInvokeV2(RequestUtil.generateTagInfrastructureConfigurationRequest(arn, updateKeyMap),
ClientBuilder.getImageBuilderClient()::tagResource);
}
}
currentModel.setArn(arn);
} catch (ResourceNotFoundException e) {
throw new CfnNotFoundException(ResourceModel.TYPE_NAME, arn);
}
return ProgressEvent.<ResourceModel, CallbackContext>builder()
.resourceModel(currentModel)
.status(OperationStatus.SUCCESS)
.build();
}