in aws-synthetics-canary/src/main/java/com/amazon/synthetics/canary/UpdateHandler.java [166:326]
private ProgressEvent<ResourceModel, CallbackContext> updateCanary(Canary canary) {
String handlerName = canary.code().handler();
String scheduleExpression = canary.schedule().expression();
String durationInSecs = canary.schedule().durationInSeconds()!= null ? canary.schedule().durationInSeconds().toString() : null;
Integer timeoutInSeconds = canary.runConfig() != null ? canary.runConfig().timeoutInSeconds() : null;
Boolean activeTracing = canary.runConfig() != null && canary.runConfig().activeTracing() != null ? canary.runConfig().activeTracing() : false;
Map<String, String> environmentVariables = null;
Integer memoryInMB = canary.runConfig() != null ? canary.runConfig().memoryInMB() : null;
Integer successRetentionPeriodInDays = canary.successRetentionPeriodInDays();
Integer failureRetentionPeriodInDays = canary.failureRetentionPeriodInDays();
String executionRoleArn = canary.executionRoleArn();
String artifactS3Location = canary.artifactS3Location();
VpcConfigInput vpcConfigInput = null;
VisualReferenceInput visualReferenceInput = null;
ArtifactConfigInput artifactConfigInput = null;
if (!Objects.equals(handlerName, model.getCode().getHandler())) {
log("Updating handler");
handlerName = model.getCode().getHandler();
}
if (!Objects.equals(scheduleExpression, model.getSchedule().getExpression())) {
log("Updating scheduleExpression");
scheduleExpression = model.getSchedule().getExpression();
}
if (!Objects.equals(durationInSecs, model.getSchedule().getDurationInSeconds())) {
log("Updating durationInSecs");
durationInSecs = model.getSchedule().getDurationInSeconds();
}
if (model.getRunConfig() != null) {
if (!Objects.equals(timeoutInSeconds, model.getRunConfig().getTimeoutInSeconds())) {
log("Updating timeoutInSeconds");
timeoutInSeconds = model.getRunConfig().getTimeoutInSeconds();
}
if (model.getRunConfig().getMemoryInMB() != null &&
!Objects.equals(memoryInMB, model.getRunConfig().getMemoryInMB())) {
log("Updating memory");
memoryInMB = model.getRunConfig().getMemoryInMB();
}
if (model.getRunConfig().getActiveTracing() != null && !Objects.equals(activeTracing, model.getRunConfig().getActiveTracing())) {
log("Updating active tracing");
activeTracing = Boolean.TRUE.equals(model.getRunConfig().getActiveTracing());
}
// Since we cannot get environment variables in the get call, as far as the value is present in the request, we replace
if (model.getRunConfig().getEnvironmentVariables() != null) {
log("Replacing environment variables");
environmentVariables = model.getRunConfig().getEnvironmentVariables();
}
}
if (!ModelHelper.isNullOrEmpty(model.getVPCConfig())) {
log("Updating vpcConfig");
vpcConfigInput = VpcConfigInput.builder()
.subnetIds(model.getVPCConfig().getSubnetIds())
.securityGroupIds(model.getVPCConfig().getSecurityGroupIds())
.build();
} else {
vpcConfigInput = VpcConfigInput.builder()
.subnetIds(Collections.emptyList())
.securityGroupIds(Collections.emptyList())
.build();
}
if (!Objects.equals(successRetentionPeriodInDays, model.getSuccessRetentionPeriod())) {
log("Updating successRetentionPeriodInDays");
successRetentionPeriodInDays = model.getSuccessRetentionPeriod();
}
if (!Objects.equals(failureRetentionPeriodInDays, model.getFailureRetentionPeriod())) {
log("Updating failureRetentionPeriodInDays");
failureRetentionPeriodInDays = model.getFailureRetentionPeriod();
}
if (!Objects.equals(executionRoleArn, model.getExecutionRoleArn())) {
log("Updating executionRoleArn");
executionRoleArn = model.getExecutionRoleArn();
}
if (!ModelHelper.visualReferenceNeedsUpdate(canary.visualReference(), model.getVisualReference())) {
log("Updating VisualReference");
visualReferenceInput = ModelHelper.getVisualReferenceInput(model.getVisualReference());
}
if (!Objects.equals(artifactS3Location, model.getArtifactS3Location())) {
log("Updating ArtifactS3Location");
artifactS3Location = model.getArtifactS3Location();
}
final CanaryCodeInput canaryCodeInput = CanaryCodeInput.builder()
.handler(handlerName)
.s3Bucket(model.getCode().getS3Bucket())
.s3Key(model.getCode().getS3Key())
.s3Version(model.getCode().getS3ObjectVersion())
.zipFile(model.getCode().getScript() != null ? ModelHelper.compressRawScript(model) : null)
.build();
final CanaryScheduleInput canaryScheduleInput = CanaryScheduleInput.builder()
.expression(scheduleExpression)
.durationInSeconds(durationInSecs != null ? Long.valueOf(durationInSecs) : null).build();
final CanaryRunConfigInput canaryRunConfigInput = CanaryRunConfigInput.builder()
.timeoutInSeconds(timeoutInSeconds)
.memoryInMB(memoryInMB)
.activeTracing(activeTracing)
.environmentVariables(environmentVariables)
.build();
final UpdateCanaryRequest updateCanaryRequest = UpdateCanaryRequest.builder()
.name(model.getName())
.artifactS3Location(artifactS3Location)
.code(canaryCodeInput)
.executionRoleArn(executionRoleArn)
.runtimeVersion(model.getRuntimeVersion())
.schedule(canaryScheduleInput)
.runConfig(canaryRunConfigInput)
.successRetentionPeriodInDays(successRetentionPeriodInDays)
.failureRetentionPeriodInDays(failureRetentionPeriodInDays)
.vpcConfig(vpcConfigInput)
.artifactConfig(ModelHelper.getArtifactConfigInput(model.getArtifactConfig()))
.visualReference(visualReferenceInput)
.build();
try {
proxy.injectCredentialsAndInvokeV2(updateCanaryRequest, syntheticsClient::updateCanary);
// if tags need to be updated then we need to call TagResourceRequest
if (model.getTags() != null) {
Map<String, Map<String, String>> tagResourceMap = ModelHelper.updateTags(model, canary.tags());
if (!tagResourceMap.get(ADD_TAGS).isEmpty()) {
TagResourceRequest tagResourceRequest = TagResourceRequest.builder()
.resourceArn(ModelHelper.buildCanaryArn(request, model.getName()))
.tags(tagResourceMap.get(ADD_TAGS))
.build();
proxy.injectCredentialsAndInvokeV2(tagResourceRequest, syntheticsClient::tagResource);
}
if (!tagResourceMap.get(REMOVE_TAGS).isEmpty()) {
UntagResourceRequest untagResourceRequest = UntagResourceRequest.builder()
.resourceArn(ModelHelper.buildCanaryArn(request, model.getName()))
.tagKeys(tagResourceMap.get(REMOVE_TAGS).keySet())
.build();
proxy.injectCredentialsAndInvokeV2(untagResourceRequest, syntheticsClient::untagResource);
}
}
}
catch (final ValidationException e) {
throw new CfnInvalidRequestException(e);
} catch (final Exception e) {
throw new CfnGeneralServiceException(e);
}
return ProgressEvent.<ResourceModel, CallbackContext>builder()
.callbackContext(context)
.resourceModel(model)
.status(OperationStatus.IN_PROGRESS)
.callbackDelaySeconds(CALLBACK_DELAY_SECONDS)
.build();
}