in aws-ssmincidents-replicationset/src/main/java/software/amazon/ssmincidents/replicationset/Translator.java [63:112]
static UpdateReplicationSetRequest translateToUpdateRequest(
ReplicationSet currentReplicationSet,
ResourceModel desiredModelState,
String clientToken) {
Set<String> currentRegions = currentReplicationSet.regionMap().keySet();
Set<String> desiredRegions = desiredModelState.getRegions().stream()
.map(ReplicationRegion::getRegionName)
.collect(Collectors.toSet());
if (currentRegions.equals(desiredRegions)) {
// nothing to update
return null;
}
Set<String> regionsToAdd = Sets.difference(desiredRegions, currentRegions);
Set<String> regionsToDelete = Sets.difference(currentRegions, desiredRegions);
boolean differsByOneRegion = regionsToAdd.size() + regionsToDelete.size() == 1;
if (!differsByOneRegion) {
throw new CfnInvalidRequestException("Replication set regions differ by more then one region. " +
"Current replication set regions: " + currentRegions.toString() + ". " +
"Specified replication set regions: " + desiredRegions.toString());
}
if (regionsToAdd.size() > 0) {
String regionToAdd = regionsToAdd.iterator().next();
String optionalKmsKeyId = desiredModelState.getRegions()
.stream().filter(x -> x.getRegionName().equals(regionToAdd))
.findFirst()
.map(ReplicationRegion::getRegionConfiguration)
.map(RegionConfiguration::getSseKmsKeyId)
.orElse(null);
return UpdateReplicationSetRequest.builder()
.arn(desiredModelState.getArn())
.clientToken(clientToken)
.actions(UpdateReplicationSetAction.builder()
.addRegionAction(AddRegionAction.builder()
.regionName(regionToAdd)
.sseKmsKeyId(optionalKmsKeyId)
.build())
.build())
.build();
}
String regionToDelete = regionsToDelete.iterator().next();
return UpdateReplicationSetRequest.builder()
.arn(desiredModelState.getArn())
.clientToken(clientToken)
.actions(UpdateReplicationSetAction.builder()
.deleteRegionAction(DeleteRegionAction.builder()
.regionName(regionToDelete)
.build())
.build())
.build();
}