in imageCopier/src/main/scala/com/gu/imageCopier/LambdaEntrypoint.scala [52:94]
def housekeeping(input: SNSEvent, context: Context): Unit = {
println("Running AMIgo housekeeper")
val messages = SNSMessage.fromLambdaEvent(input)
println(s"Got messages: $messages")
val deleteAttempt = Attempt.traverseWithFailures(messages) { message =>
for {
deleteEvent <- DeleteEvent.fromJsonString(message.content)
localAmis = deleteEvent.amis.filter(
_.account == configuration.ownAccountNumber
)
actualAmisAndSnapshots <- AmiActions.getImagesAndEbsSnapshots(localAmis)
deletedAmis <- Attempt.traverseWithFailures(actualAmisAndSnapshots) {
case (ami, _) => AmiActions.deregisterAmi(ami)
}
actualSnapshots = actualAmisAndSnapshots.flatMap {
case (_, snapshots) => snapshots
}
deletedSnapshots <- Attempt.traverseWithFailures(actualSnapshots) {
snapshot => AmiActions.deleteSnapshot(snapshot)
}
} yield (deletedAmis, deletedSnapshots)
}
val amis = Await.result(deleteAttempt.asFuture, Duration.Inf)
val allFailures = Failure.collect(List(amis)) { successfulAmis =>
Failure.collect(successfulAmis) { case (deletedAmis, deletedSnapshots) =>
Failure.collect(deletedAmis)(_ => Nil) ::: Failure.collect(
deletedSnapshots
)(_ => Nil)
}
}
if (allFailures.nonEmpty) {
println(s"Failures")
allFailures.foreach { failure =>
println(
s"${failure.msg} ${failure.cause.map(_.getStackTrace.mkString(" "))}"
)
}
}
println(s"Completed: $amis")
}