in app/services/BucketNotificationConfigurations.scala [129:178]
private def writeUpdatesIfRequired(bucketName:String,
configResponse:GetBucketNotificationConfigurationResponse,
maybeLambdaArn:Option[String],
requiredUpdates:Seq[LambdaFunctionConfiguration])(implicit s3Client:S3Client): Try[(Boolean, Boolean)] = {
var updateRequired = false
val initialConfiguration = NotificationConfiguration.builder()
.lambdaFunctionConfigurations(configResponse.lambdaFunctionConfigurations())
.eventBridgeConfiguration(configResponse.eventBridgeConfiguration())
.queueConfigurations(configResponse.queueConfigurations())
.topicConfigurations(configResponse.topicConfigurations())
//step one - do we need to add a new monitoring configuration? If so put it into the list
val addedConfiguration = if (isAdditionRequired(initialConfiguration)) {
logger.debug(s"$bucketName: No archivehunter lambda found, adding one...")
maybeLambdaArn match {
case Some(lambdaArn) =>
val existingConfigs = configResponse.lambdaFunctionConfigurations().asScala
val updatedConfigs = existingConfigs :+ createNewNotification(lambdaArn)
updateRequired = true //the SDK builder is a _java_ object which returns a mutable "self" rather than an immutable copy reference.
initialConfiguration.lambdaFunctionConfigurations(updatedConfigs.asJava)
case None =>
throw new RuntimeException("Cannot add a lambda monitor because externalData.bucketMonitorLambdaARN is not set in the application config file")
}
} else {
initialConfiguration
}
//step two - do we need to update any of the existing configurations? If so put them into the list
val updatedConfiguration = if(requiredUpdates.nonEmpty) {
updateRequired = true
addedConfiguration.lambdaFunctionConfigurations(requiredUpdates.asJava)
} else {
addedConfiguration
}
//step three - if the config we built has no changes then do nothing, otherwise write out the updated configuration to S3
if(!updateRequired) {
logger.info(s"$bucketName: No updates were required")
Success((false, false))
} else {
Try {
s3Client.putBucketNotificationConfiguration(PutBucketNotificationConfigurationRequest.builder()
.bucket(bucketName)
.notificationConfiguration(updatedConfiguration.build())
.skipDestinationValidation(true)
.build())
}.map(_ => (true, true))
}
}