in aws-applicationinsights-application/src/main/java/software/amazon/applicationinsights/application/HandlerHelper.java [487:527]
public static List<String> getCustomComponentNamesToDelete(
ResourceModel model,
AmazonWebServicesClientProxy proxy,
ApplicationInsightsClient applicationInsightsClient,
Logger logger) {
List<String> appComponentNames = getAppCustomComponentNames(model.getResourceGroupName(), proxy, applicationInsightsClient);
logger.log("app component names: " + appComponentNames.toString());
Map<String, CustomComponent> modelComponentMap =
Optional.ofNullable(model.getCustomComponents()).orElse(Collections.emptyList())
.stream()
.collect(Collectors.toMap(CustomComponent::getComponentName, Function.identity()));
List<String> modelComponentNames = new ArrayList<>(modelComponentMap.keySet());
logger.log("model component names: " + modelComponentNames.toString());
List<String> componentNamesToDelete = new ArrayList<>(appComponentNames);
componentNamesToDelete.removeAll(modelComponentNames);
List<String> commonComponentNames = new ArrayList<>(appComponentNames);
commonComponentNames.retainAll(modelComponentNames);
logger.log("common component names: " + commonComponentNames.toString());
for (String commonComponentName : commonComponentNames) {
DescribeComponentResponse describeComponentResponse =
describeAppicationComponent(commonComponentName, model.getResourceGroupName(), proxy, applicationInsightsClient);
List<String> resourceList = describeComponentResponse.resourceList();
List<String> modelResourceList = modelComponentMap.get(commonComponentName).getResourceList();
logger.log("common component name: " + commonComponentName);
logger.log("app resource list: " + resourceList.toString());
logger.log("model resource list: " + modelResourceList.toString());
// if custom comopnent resource lists mistach, it needs to be deleted & recreated to avoid deadlock
// e.g. before change: component A contains instance 1, component B contains instance 2;
// after change: component A contains instance 2, component B contains instance 1
if (resourceList.size() != modelResourceList.size() || !resourceList.containsAll(modelResourceList)) {
componentNamesToDelete.add(commonComponentName);
}
}
return componentNamesToDelete;
}