diff --git a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/data/task/SagaId.java b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/data/task/SagaId.java index d080c1badae..344c7cb6edc 100644 --- a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/data/task/SagaId.java +++ b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/data/task/SagaId.java @@ -15,11 +15,19 @@ */ package com.netflix.spinnaker.clouddriver.data.task; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; import javax.annotation.Nonnull; +import lombok.Builder; import lombok.Value; @Value +@Builder(builderClassName = "SagaIdBuilder") +@JsonDeserialize(builder = SagaId.SagaIdBuilder.class) public class SagaId { @Nonnull String name; @Nonnull String id; + + @JsonPOJOBuilder(withPrefix = "") + public static class SagaIdBuilder {} } diff --git a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/orchestration/sagas/SagaAtomicOperationBridge.java b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/orchestration/sagas/SagaAtomicOperationBridge.java index 64a0a9a3cce..f552262f4e3 100644 --- a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/orchestration/sagas/SagaAtomicOperationBridge.java +++ b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/orchestration/sagas/SagaAtomicOperationBridge.java @@ -44,7 +44,7 @@ public T apply(@Nonnull ApplyCommandWrapper applyCommand) { final String sagaName = applyCommand.sagaName; final String sagaId = Optional.ofNullable(task.getRequestId()).orElse(task.getId()); - task.addSagaId(new SagaId(sagaName, sagaId)); + task.addSagaId(SagaId.builder().id(sagaId).name(sagaName).build()); applyCommand.sagaFlow.injectFirst(SnapshotAtomicOperationInput.class); diff --git a/clouddriver-sql/src/main/kotlin/com/netflix/spinnaker/clouddriver/sql/SqlTask.kt b/clouddriver-sql/src/main/kotlin/com/netflix/spinnaker/clouddriver/sql/SqlTask.kt index 7ea188e9219..4f601b89fcf 100644 --- a/clouddriver-sql/src/main/kotlin/com/netflix/spinnaker/clouddriver/sql/SqlTask.kt +++ b/clouddriver-sql/src/main/kotlin/com/netflix/spinnaker/clouddriver/sql/SqlTask.kt @@ -101,6 +101,7 @@ class SqlTask( override fun addSagaId(sagaId: SagaId) { this.dirty.set(true) sagaIds.add(sagaId) + repository.updateSagaIds(this) } override fun getSagaIds(): MutableList { diff --git a/clouddriver-sql/src/main/kotlin/com/netflix/spinnaker/clouddriver/sql/SqlTaskRepository.kt b/clouddriver-sql/src/main/kotlin/com/netflix/spinnaker/clouddriver/sql/SqlTaskRepository.kt index ba96ede4b98..57f88643ca5 100644 --- a/clouddriver-sql/src/main/kotlin/com/netflix/spinnaker/clouddriver/sql/SqlTaskRepository.kt +++ b/clouddriver-sql/src/main/kotlin/com/netflix/spinnaker/clouddriver/sql/SqlTaskRepository.kt @@ -84,6 +84,17 @@ class SqlTaskRepository( return task } + fun updateSagaIds(task: Task) { + return withPool(POOL_NAME) { + jooq.transactional(sqlRetryProperties.transactions) { ctx -> + ctx.update(tasksTable) + .set(field("saga_ids"), mapper.writeValueAsString(task.sagaIds)) + .where(field("id").eq(task.id)) + .execute() + } + } + } + override fun get(id: String): Task? { return retrieveInternal(id) }