From 51470266e01e8ec4e17de92e99d32449d6dec697 Mon Sep 17 00:00:00 2001 From: Adam Jordens Date: Thu, 23 May 2019 21:11:41 -0700 Subject: [PATCH] feat(sql): `StorageServiceMigrator` support for deleting orphaned records If a record was deleted out of band from the 'source' storage service, that delete should be reflected in the 'target'. --- .../migrations/StorageServiceMigrator.kt | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/front50-sql/src/main/kotlin/com/netflix/spinnaker/front50/migrations/StorageServiceMigrator.kt b/front50-sql/src/main/kotlin/com/netflix/spinnaker/front50/migrations/StorageServiceMigrator.kt index ee1b45b2c..c3285a9fd 100644 --- a/front50-sql/src/main/kotlin/com/netflix/spinnaker/front50/migrations/StorageServiceMigrator.kt +++ b/front50-sql/src/main/kotlin/com/netflix/spinnaker/front50/migrations/StorageServiceMigrator.kt @@ -48,6 +48,33 @@ class StorageServiceMigrator( val sourceObjectKeys = source.listObjectKeys(objectType) val targetObjectKeys = target.listObjectKeys(objectType) + val deletableObjectKeys = targetObjectKeys.filter { e -> + !sourceObjectKeys.containsKey(e.key) + } + + if (!deletableObjectKeys.isEmpty()) { + /* + * Handle a situation where deletes can still happen directly against the source/previous storage service. + * + * In these cases, the delete should also be reflected in the primary/target storage service. + */ + log.info( + "Found orphaned objects in {} (keys: {})", + source.javaClass.simpleName, + deletableObjectKeys.keys.joinToString(", ") + ) + + deletableObjectKeys.keys.forEach { + target.deleteObject(objectType, it) + } + + log.info( + "Deleted orphaned objects from {} (keys: {})", + target.javaClass.simpleName, + deletableObjectKeys.keys.joinToString(", ") + ) + } + val migratableObjectKeys = sourceObjectKeys.filter { e -> /* * A migratable object is one that: