diff --git a/gradle.properties b/gradle.properties index c34d5928bef..31d17dd6d96 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ keikoVersion=3.8.0 korkVersion=7.56.0 kotlinVersion=1.3.72 org.gradle.parallel=true -spinnakerGradleVersion=8.3.0 +spinnakerGradleVersion=8.4.0 # To enable a composite reference to a project, set the # project property `'Composite=true'`. diff --git a/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/conditions/EvaluateConditionTask.java b/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/conditions/EvaluateConditionTask.java index cdf57f25343..d254d46b7d8 100644 --- a/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/conditions/EvaluateConditionTask.java +++ b/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/conditions/EvaluateConditionTask.java @@ -112,7 +112,8 @@ public TaskResult execute(@Nonnull StageExecution stage) { suppliers.stream() .flatMap( supplier -> - supplier.getConditions(ctx.getCluster(), ctx.getRegion(), ctx.getAccount()) + supplier + .getConditions(ctx.getCluster(), ctx.getRegion(), ctx.getAccount()) .stream()) .filter(Objects::nonNull) .collect(Collectors.toSet()); diff --git a/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/providers/alicloud/AliCloudImageFinder.java b/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/providers/alicloud/AliCloudImageFinder.java index 10c774f7d85..e921b059b28 100644 --- a/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/providers/alicloud/AliCloudImageFinder.java +++ b/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/providers/alicloud/AliCloudImageFinder.java @@ -49,7 +49,8 @@ public Collection byTags( Map tags, List warningsCollector) { List allMatchedImages = - oortService.findImage(getCloudProvider(), packageName, null, null, prefixTags(tags)) + oortService + .findImage(getCloudProvider(), packageName, null, null, prefixTags(tags)) .stream() .map(image -> objectMapper.convertValue(image, AliCloudImage.class)) .sorted() diff --git a/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/providers/aws/cloudformation/WaitForCloudFormationCompletionTask.java b/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/providers/aws/cloudformation/WaitForCloudFormationCompletionTask.java index 6b61b68a174..ba6696d9ba8 100644 --- a/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/providers/aws/cloudformation/WaitForCloudFormationCompletionTask.java +++ b/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/providers/aws/cloudformation/WaitForCloudFormationCompletionTask.java @@ -139,7 +139,8 @@ private String getChangeSetInfo(Map stack, Map context, String field) { String changeSetName = (String) context.get("changeSetName"); log.debug("Getting change set status from stack for changeset {}: {}", changeSetName, stack); return Optional.ofNullable((List>) stack.get("changeSets")) - .orElse(Collections.emptyList()).stream() + .orElse(Collections.emptyList()) + .stream() .filter(changeSet -> changeSet.get("name").equals(changeSetName)) .findFirst() .map(changeSet -> (String) changeSet.get(field)) diff --git a/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/providers/gce/GoogleImageFinder.java b/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/providers/gce/GoogleImageFinder.java index d838f619790..5d534f0ebdf 100644 --- a/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/providers/gce/GoogleImageFinder.java +++ b/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/providers/gce/GoogleImageFinder.java @@ -47,7 +47,8 @@ public Collection byTags( Map tags, List warningsCollector) { List allMatchedImages = - oortService.findImage(getCloudProvider(), packageName, null, null, prefixTags(tags)) + oortService + .findImage(getCloudProvider(), packageName, null, null, prefixTags(tags)) .stream() .map(image -> objectMapper.convertValue(image, GoogleImage.class)) .sorted() diff --git a/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/providers/oracle/OracleImageFinder.java b/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/providers/oracle/OracleImageFinder.java index 85c587d3321..459996cdfdd 100644 --- a/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/providers/oracle/OracleImageFinder.java +++ b/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/providers/oracle/OracleImageFinder.java @@ -48,7 +48,8 @@ public Collection byTags( StageData stageData = (StageData) stage.mapTo(StageData.class); List allMatchedImages = - oortService.findImage(getCloudProvider(), packageName, null, null, prefixTags(freeformTags)) + oortService + .findImage(getCloudProvider(), packageName, null, null, prefixTags(freeformTags)) .stream() .map(imageAsMap -> objectMapper.convertValue(imageAsMap, OracleImage.class)) .sorted() diff --git a/orca-core/src/main/java/com/netflix/spinnaker/orca/DynamicStageResolver.kt b/orca-core/src/main/java/com/netflix/spinnaker/orca/DynamicStageResolver.kt index b564108a141..c1f7cf63531 100644 --- a/orca-core/src/main/java/com/netflix/spinnaker/orca/DynamicStageResolver.kt +++ b/orca-core/src/main/java/com/netflix/spinnaker/orca/DynamicStageResolver.kt @@ -95,19 +95,19 @@ class DynamicStageResolver( */ private fun validatePreferences(duplicates: Map>) { duplicates.forEach { duplicate -> - val pref = getPreference(duplicate.key) + val pref = getPreference(duplicate.key) - if (pref == NO_PREFERENCE) { - throw NoPreferenceConfigPresentException(duplicate.key) - } + if (pref == NO_PREFERENCE) { + throw NoPreferenceConfigPresentException(duplicate.key) + } - // Ensure the preference is actually valid: Is there a StageDefinitionBuilder with a matching canonical name? - duplicate.value.map { it.extensionClass.canonicalName }.let { - if (!it.contains(pref)) { - throw InvalidStageDefinitionBuilderPreference(duplicate.key, pref, it) - } + // Ensure the preference is actually valid: Is there a StageDefinitionBuilder with a matching canonical name? + duplicate.value.map { it.extensionClass.canonicalName }.let { + if (!it.contains(pref)) { + throw InvalidStageDefinitionBuilderPreference(duplicate.key, pref, it) } } + } } /** diff --git a/orca-core/src/main/java/com/netflix/spinnaker/orca/listeners/DelegatingApplicationEventMulticaster.kt b/orca-core/src/main/java/com/netflix/spinnaker/orca/listeners/DelegatingApplicationEventMulticaster.kt index cfa4dcebbd1..5525275a03b 100644 --- a/orca-core/src/main/java/com/netflix/spinnaker/orca/listeners/DelegatingApplicationEventMulticaster.kt +++ b/orca-core/src/main/java/com/netflix/spinnaker/orca/listeners/DelegatingApplicationEventMulticaster.kt @@ -56,7 +56,8 @@ class DelegatingApplicationEventMulticaster( return true } if (listener is InspectableApplicationListenerMethodAdapter && - listener.getMethod().getAnnotation(Sync::class.java) != null) { + listener.getMethod().getAnnotation(Sync::class.java) != null + ) { return true } return false diff --git a/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/expressions/functions/DeployedServerGroupsExpressionFunctionProvider.java b/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/expressions/functions/DeployedServerGroupsExpressionFunctionProvider.java index 9377ad2aeea..1958f79e553 100644 --- a/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/expressions/functions/DeployedServerGroupsExpressionFunctionProvider.java +++ b/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/expressions/functions/DeployedServerGroupsExpressionFunctionProvider.java @@ -96,7 +96,8 @@ public static List> deployedServerGroups( task -> Optional.ofNullable(task.results).orElse(emptyList()).stream()) .flatMap( result -> - Optional.ofNullable(result.deployments).orElse(emptyList()) + Optional.ofNullable(result.deployments) + .orElse(emptyList()) .stream()) .collect(Collectors.toList()); deployDetails.put("deployments", deployments); diff --git a/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/model/BuildInfo.kt b/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/model/BuildInfo.kt index 679cb08b679..4cf5182b742 100644 --- a/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/model/BuildInfo.kt +++ b/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/model/BuildInfo.kt @@ -9,6 +9,6 @@ abstract class BuildInfo( open val scm: List? = emptyList(), open val building: Boolean = false ) { - var fullDisplayName: String? = null - get() = field ?: "$name#$number" + var fullDisplayName: String? = null + get() = field ?: "$name#$number" } diff --git a/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/model/JenkinsTrigger.kt b/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/model/JenkinsTrigger.kt index 48b27fe7cba..f09a57226c4 100644 --- a/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/model/JenkinsTrigger.kt +++ b/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/model/JenkinsTrigger.kt @@ -110,15 +110,15 @@ constructor( @param:JsonProperty("building") override var building: Boolean = false, @param:JsonProperty("timestamp") val timestamp: Long? ) : - BuildInfo(name, number, url, result, artifacts, scm, building) { - - @JvmOverloads - constructor( - name: String, - number: Int, - url: String, - result: String, - artifacts: List = emptyList(), - scm: List = emptyList() - ) : this(name, number, url, result, artifacts, scm, false, null) + BuildInfo(name, number, url, result, artifacts, scm, building) { + + @JvmOverloads + constructor( + name: String, + number: Int, + url: String, + result: String, + artifacts: List = emptyList(), + scm: List = emptyList() + ) : this(name, number, url, result, artifacts, scm, false, null) } diff --git a/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/model/support/TriggerDeserializer.kt b/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/model/support/TriggerDeserializer.kt index 25116fe22db..102474aa524 100644 --- a/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/model/support/TriggerDeserializer.kt +++ b/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/model/support/TriggerDeserializer.kt @@ -56,38 +56,40 @@ class TriggerDeserializer : get("repository").textValue(), get("tag").textValue() ) - looksLikeConcourse() -> ConcourseTrigger( - get("type").textValue(), - get("correlationId")?.textValue(), - get("user")?.textValue() ?: "[anonymous]", - get("parameters")?.mapValue(parser) ?: mutableMapOf(), - get("artifacts")?.listValue(parser) ?: mutableListOf(), - get("notifications")?.listValue(parser) ?: mutableListOf(), - get("rebake")?.booleanValue() == true, - get("dryRun")?.booleanValue() == true, - get("strategy")?.booleanValue() == true - ).apply { - buildInfo = get("buildInfo")?.parseValue(parser) - properties = get("properties")?.parseValue(parser) ?: mutableMapOf() - } - looksLikeJenkins() -> JenkinsTrigger( - get("type").textValue(), - get("correlationId")?.textValue(), - get("user")?.textValue() ?: "[anonymous]", - get("parameters")?.mapValue(parser) ?: mutableMapOf(), - get("artifacts")?.listValue(parser) ?: mutableListOf(), - get("notifications")?.listValue(parser) ?: mutableListOf(), - get("rebake")?.booleanValue() == true, - get("dryRun")?.booleanValue() == true, - get("strategy")?.booleanValue() == true, - get("master").textValue(), - get("job").textValue(), - get("buildNumber").intValue(), - get("propertyFile")?.textValue() - ).apply { - buildInfo = get("buildInfo")?.parseValue(parser) - properties = get("properties")?.mapValue(parser) ?: mutableMapOf() - } + looksLikeConcourse() -> + ConcourseTrigger( + get("type").textValue(), + get("correlationId")?.textValue(), + get("user")?.textValue() ?: "[anonymous]", + get("parameters")?.mapValue(parser) ?: mutableMapOf(), + get("artifacts")?.listValue(parser) ?: mutableListOf(), + get("notifications")?.listValue(parser) ?: mutableListOf(), + get("rebake")?.booleanValue() == true, + get("dryRun")?.booleanValue() == true, + get("strategy")?.booleanValue() == true + ).apply { + buildInfo = get("buildInfo")?.parseValue(parser) + properties = get("properties")?.parseValue(parser) ?: mutableMapOf() + } + looksLikeJenkins() -> + JenkinsTrigger( + get("type").textValue(), + get("correlationId")?.textValue(), + get("user")?.textValue() ?: "[anonymous]", + get("parameters")?.mapValue(parser) ?: mutableMapOf(), + get("artifacts")?.listValue(parser) ?: mutableListOf(), + get("notifications")?.listValue(parser) ?: mutableListOf(), + get("rebake")?.booleanValue() == true, + get("dryRun")?.booleanValue() == true, + get("strategy")?.booleanValue() == true, + get("master").textValue(), + get("job").textValue(), + get("buildNumber").intValue(), + get("propertyFile")?.textValue() + ).apply { + buildInfo = get("buildInfo")?.parseValue(parser) + properties = get("properties")?.mapValue(parser) ?: mutableMapOf() + } looksLikePipeline() -> PipelineTrigger( get("type").textValue(), get("correlationId")?.textValue(), diff --git a/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/persistence/DualExecutionRepository.kt b/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/persistence/DualExecutionRepository.kt index 9995ac46a7a..b6362e49295 100644 --- a/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/persistence/DualExecutionRepository.kt +++ b/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/persistence/DualExecutionRepository.kt @@ -215,11 +215,13 @@ class DualExecutionRepository( buildTimeEndBoundary, executionCriteria ) - .plus(previous.retrievePipelinesForPipelineConfigIdsBetweenBuildTimeBoundary( - pipelineConfigIds, - buildTimeStartBoundary, - buildTimeEndBoundary, - executionCriteria) + .plus( + previous.retrievePipelinesForPipelineConfigIdsBetweenBuildTimeBoundary( + pipelineConfigIds, + buildTimeStartBoundary, + buildTimeEndBoundary, + executionCriteria + ) ).distinctBy { it.id } } @@ -235,11 +237,13 @@ class DualExecutionRepository( buildTimeStartBoundary, buildTimeEndBoundary, executionCriteria - ).plus(previous.retrieveAllPipelinesForPipelineConfigIdsBetweenBuildTimeBoundary( - pipelineConfigIds, - buildTimeStartBoundary, - buildTimeEndBoundary, - executionCriteria) + ).plus( + previous.retrieveAllPipelinesForPipelineConfigIdsBetweenBuildTimeBoundary( + pipelineConfigIds, + buildTimeStartBoundary, + buildTimeEndBoundary, + executionCriteria + ) ).distinctBy { it.id } } diff --git a/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/persistence/InMemoryExecutionRepository.kt b/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/persistence/InMemoryExecutionRepository.kt index 7c40568d6c6..4395c9f2bfd 100644 --- a/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/persistence/InMemoryExecutionRepository.kt +++ b/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/persistence/InMemoryExecutionRepository.kt @@ -44,20 +44,20 @@ class InMemoryExecutionRepository : ExecutionRepository { override fun retrieveAllApplicationNames(executionType: ExecutionType?): MutableList { return if (executionType == null) { - pipelines.values + orchestrations.values - } else { - storageFor(executionType).values - } + pipelines.values + orchestrations.values + } else { + storageFor(executionType).values + } .map { it.application } .toMutableList() } override fun retrieveAllApplicationNames(executionType: ExecutionType?, minExecutions: Int): MutableList { return if (executionType == null) { - pipelines.values + orchestrations.values - } else { - storageFor(executionType).values - } + pipelines.values + orchestrations.values + } else { + storageFor(executionType).values + } .groupBy { it.application } .filter { it.value.size >= minExecutions } .keys @@ -88,8 +88,10 @@ class InMemoryExecutionRepository : ExecutionRepository { override fun resume(type: ExecutionType, id: String, user: String?, ignoreCurrentStatus: Boolean) { retrieve(type, id).also { if (!ignoreCurrentStatus && it.status != ExecutionStatus.PAUSED) { - throw UnresumablePipelineException("Unable to resume pipeline that is not PAUSED " + - "(executionId: ${it.id}, currentStatus: ${it.status}") + throw UnresumablePipelineException( + "Unable to resume pipeline that is not PAUSED " + + "(executionId: ${it.id}, currentStatus: ${it.status}" + ) } it.status = ExecutionStatus.RUNNING it.paused?.resumedBy = user @@ -135,8 +137,10 @@ class InMemoryExecutionRepository : ExecutionRepository { override fun pause(type: ExecutionType, id: String, user: String?) { retrieve(type, id).also { if (it.status != ExecutionStatus.RUNNING) { - throw UnpausablePipelineException("Unable to pause pipeline that is not RUNNING " + - "(executionId: ${it.id}, currentStatus: ${it.status})") + throw UnpausablePipelineException( + "Unable to pause pipeline that is not RUNNING " + + "(executionId: ${it.id}, currentStatus: ${it.status})" + ) } it.status = ExecutionStatus.PAUSED it.paused = PipelineExecution.PausedDetails().apply { diff --git a/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/util/ArtifactUtils.java b/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/util/ArtifactUtils.java index 6ca0aa090b9..8790ce2ec8a 100644 --- a/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/util/ArtifactUtils.java +++ b/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/util/ArtifactUtils.java @@ -286,8 +286,13 @@ private List getPriorArtifacts(Map pipeline) { private Optional getExecutionForPipelineId( String pipelineId, ExecutionCriteria criteria) { - return executionRepository.retrievePipelinesForPipelineConfigId(pipelineId, criteria) - .subscribeOn(Schedulers.io()).toList().toBlocking().single().stream() + return executionRepository + .retrievePipelinesForPipelineConfigId(pipelineId, criteria) + .subscribeOn(Schedulers.io()) + .toList() + .toBlocking() + .single() + .stream() .min(startTimeOrId); } diff --git a/orca-integrations-gremlin/src/main/java/com/netflix/spinnaker/orca/config/GremlinConfiguration.kt b/orca-integrations-gremlin/src/main/java/com/netflix/spinnaker/orca/config/GremlinConfiguration.kt index d3596ca10d7..febce12931f 100644 --- a/orca-integrations-gremlin/src/main/java/com/netflix/spinnaker/orca/config/GremlinConfiguration.kt +++ b/orca-integrations-gremlin/src/main/java/com/netflix/spinnaker/orca/config/GremlinConfiguration.kt @@ -39,7 +39,8 @@ class GremlinConfiguration { val mapper = OrcaObjectMapper .newInstance() .setPropertyNamingStrategy( - PropertyNamingStrategy.SNAKE_CASE) + PropertyNamingStrategy.SNAKE_CASE + ) .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) // we want Instant serialized as ISO string return RestAdapter.Builder() .setRequestInterceptor(spinnakerRequestInterceptor) diff --git a/orca-interlink/src/main/java/com/netflix/spinnaker/orca/interlink/MessageFlagger.kt b/orca-interlink/src/main/java/com/netflix/spinnaker/orca/interlink/MessageFlagger.kt index 2e4f9cec7d9..aabf5d52105 100644 --- a/orca-interlink/src/main/java/com/netflix/spinnaker/orca/interlink/MessageFlagger.kt +++ b/orca-interlink/src/main/java/com/netflix/spinnaker/orca/interlink/MessageFlagger.kt @@ -71,13 +71,15 @@ class MessageFlagger(val clock: Clock, val props: FlaggerProperties) { mutex.lock() val matches = queue.filter { it.timestamp.isAfter(timeCutoff) && it.hash == hash } if (matches.count() >= props.threshold) { - throw MessageFlaggedException("Event '$event' with fingerprint '${event.fingerprint}' has been encountered " + - "${matches.count()} times in the last ${props.lookbackSeconds}s") + throw MessageFlaggedException( + "Event '$event' with fingerprint '${event.fingerprint}' has been encountered " + + "${matches.count()} times in the last ${props.lookbackSeconds}s" + ) } queue.add(TimestampedHash(now, hash)) } finally { - mutex.unlock() + mutex.unlock() } } diff --git a/orca-kayenta/src/main/kotlin/com/netflix/spinnaker/orca/kayenta/pipeline/RunCanaryIntervalsStage.kt b/orca-kayenta/src/main/kotlin/com/netflix/spinnaker/orca/kayenta/pipeline/RunCanaryIntervalsStage.kt index 9c6123bccee..7d0f3a3940d 100644 --- a/orca-kayenta/src/main/kotlin/com/netflix/spinnaker/orca/kayenta/pipeline/RunCanaryIntervalsStage.kt +++ b/orca-kayenta/src/main/kotlin/com/netflix/spinnaker/orca/kayenta/pipeline/RunCanaryIntervalsStage.kt @@ -63,8 +63,10 @@ class RunCanaryIntervalsStage(private val clock: Clock) : StageDefinitionBuilder val canaryConfig = parent.mapTo("/canaryConfig") val lifetime: Duration = if (canaryConfig.endTime != null) { - Duration.ofMinutes((canaryConfig.startTime ?: Instant.now(clock)) - .until(canaryConfig.endTime, ChronoUnit.MINUTES)) + Duration.ofMinutes( + (canaryConfig.startTime ?: Instant.now(clock)) + .until(canaryConfig.endTime, ChronoUnit.MINUTES) + ) } else if (canaryConfig.lifetime != null) { canaryConfig.lifetime } else { @@ -227,12 +229,12 @@ data class DeployedServerGroupContext @JsonCreator constructor( companion object { fun from(data: Map): DeployedServerGroupContext { return DeployedServerGroupContext( - data["controlLocation"].orEmpty(), - data["controlScope"].orEmpty(), - data["controlAccountId"], - data["experimentLocation"].orEmpty(), - data["experimentScope"].orEmpty(), - data["experimentAccountId"] + data["controlLocation"].orEmpty(), + data["controlScope"].orEmpty(), + data["controlAccountId"], + data["experimentLocation"].orEmpty(), + data["experimentScope"].orEmpty(), + data["experimentAccountId"] ) } } diff --git a/orca-kayenta/src/main/kotlin/com/netflix/spinnaker/orca/kayenta/pipeline/RunCanaryPipelineStage.kt b/orca-kayenta/src/main/kotlin/com/netflix/spinnaker/orca/kayenta/pipeline/RunCanaryPipelineStage.kt index 828e11230a9..702014277f8 100644 --- a/orca-kayenta/src/main/kotlin/com/netflix/spinnaker/orca/kayenta/pipeline/RunCanaryPipelineStage.kt +++ b/orca-kayenta/src/main/kotlin/com/netflix/spinnaker/orca/kayenta/pipeline/RunCanaryPipelineStage.kt @@ -40,13 +40,13 @@ class RunCanaryPipelineStage( private val log = LoggerFactory.getLogger(javaClass) override fun taskGraph(stage: StageExecution, builder: TaskNode.Builder) { - val context = stage.mapTo() - if (context.canaryConfigId.isNullOrEmpty()) { - if (context.canaryConfigName.isNullOrEmpty()) { - throw IllegalArgumentException("Canary config must be specified as either UUID or name string") - } - builder.withTask("resolveKayentaConfigId") + val context = stage.mapTo() + if (context.canaryConfigId.isNullOrEmpty()) { + if (context.canaryConfigName.isNullOrEmpty()) { + throw IllegalArgumentException("Canary config must be specified as either UUID or name string") } + builder.withTask("resolveKayentaConfigId") + } builder .withTask("runCanary") .withTask("monitorCanary") diff --git a/orca-kayenta/src/main/kotlin/com/netflix/spinnaker/orca/kayenta/tasks/AggregateCanaryResultsTask.kt b/orca-kayenta/src/main/kotlin/com/netflix/spinnaker/orca/kayenta/tasks/AggregateCanaryResultsTask.kt index a6beb79968c..9c20b81e89a 100644 --- a/orca-kayenta/src/main/kotlin/com/netflix/spinnaker/orca/kayenta/tasks/AggregateCanaryResultsTask.kt +++ b/orca-kayenta/src/main/kotlin/com/netflix/spinnaker/orca/kayenta/tasks/AggregateCanaryResultsTask.kt @@ -46,30 +46,40 @@ class AggregateCanaryResultsTask : Task { val finalCanaryScore = runCanaryScores[runCanaryScores.size - 1] return if (canaryConfig.scoreThresholds?.marginal == null && canaryConfig.scoreThresholds?.pass == null) { - TaskResult.builder(SUCCEEDED).context(mapOf( - "canaryScores" to runCanaryScores, - "canaryScoreMessage" to "No score thresholds were specified." - )).build() + TaskResult.builder(SUCCEEDED).context( + mapOf( + "canaryScores" to runCanaryScores, + "canaryScoreMessage" to "No score thresholds were specified." + ) + ).build() } else if (canaryConfig.scoreThresholds.marginal != null && finalCanaryScore <= canaryConfig.scoreThresholds.marginal) { - TaskResult.builder(TERMINAL).context(mapOf( - "canaryScores" to runCanaryScores, - "canaryScoreMessage" to "Final canary score $finalCanaryScore is not above the marginal score threshold." - )).build() + TaskResult.builder(TERMINAL).context( + mapOf( + "canaryScores" to runCanaryScores, + "canaryScoreMessage" to "Final canary score $finalCanaryScore is not above the marginal score threshold." + ) + ).build() } else if (canaryConfig.scoreThresholds.pass == null) { - TaskResult.builder(SUCCEEDED).context(mapOf( - "canaryScores" to runCanaryScores, - "canaryScoreMessage" to "No pass score threshold was specified." - )).build() + TaskResult.builder(SUCCEEDED).context( + mapOf( + "canaryScores" to runCanaryScores, + "canaryScoreMessage" to "No pass score threshold was specified." + ) + ).build() } else if (finalCanaryScore < canaryConfig.scoreThresholds.pass) { - TaskResult.builder(TERMINAL).context(mapOf( - "canaryScores" to runCanaryScores, - "canaryScoreMessage" to "Final canary score $finalCanaryScore is below the pass score threshold." - )).build() + TaskResult.builder(TERMINAL).context( + mapOf( + "canaryScores" to runCanaryScores, + "canaryScoreMessage" to "Final canary score $finalCanaryScore is below the pass score threshold." + ) + ).build() } else { - TaskResult.builder(SUCCEEDED).context(mapOf( - "canaryScores" to runCanaryScores, - "canaryScoreMessage" to "Final canary score $finalCanaryScore met or exceeded the pass score threshold." - )).build() + TaskResult.builder(SUCCEEDED).context( + mapOf( + "canaryScores" to runCanaryScores, + "canaryScoreMessage" to "Final canary score $finalCanaryScore met or exceeded the pass score threshold." + ) + ).build() } } } diff --git a/orca-kayenta/src/main/kotlin/com/netflix/spinnaker/orca/kayenta/tasks/MonitorKayentaCanaryTask.kt b/orca-kayenta/src/main/kotlin/com/netflix/spinnaker/orca/kayenta/tasks/MonitorKayentaCanaryTask.kt index d13d6efcb1b..87753609671 100644 --- a/orca-kayenta/src/main/kotlin/com/netflix/spinnaker/orca/kayenta/tasks/MonitorKayentaCanaryTask.kt +++ b/orca-kayenta/src/main/kotlin/com/netflix/spinnaker/orca/kayenta/tasks/MonitorKayentaCanaryTask.kt @@ -58,24 +58,28 @@ class MonitorKayentaCanaryTask( return if (canaryScore <= context.scoreThresholds.marginal) { val resultStatus = if (stage.context["continuePipeline"] == true) FAILED_CONTINUE else TERMINAL - TaskResult.builder(resultStatus).context(mapOf( - "canaryPipelineStatus" to SUCCEEDED, - "lastUpdated" to canaryResults.endTimeIso?.toEpochMilli(), - "lastUpdatedIso" to canaryResults.endTimeIso, - "durationString" to canaryResults.result.canaryDuration.toString(), - "canaryScore" to canaryScore, - "canaryScoreMessage" to "Canary score is not above the marginal score threshold.", - "warnings" to warnings - )).build() + TaskResult.builder(resultStatus).context( + mapOf( + "canaryPipelineStatus" to SUCCEEDED, + "lastUpdated" to canaryResults.endTimeIso?.toEpochMilli(), + "lastUpdatedIso" to canaryResults.endTimeIso, + "durationString" to canaryResults.result.canaryDuration.toString(), + "canaryScore" to canaryScore, + "canaryScoreMessage" to "Canary score is not above the marginal score threshold.", + "warnings" to warnings + ) + ).build() } else { - TaskResult.builder(SUCCEEDED).context(mapOf( - "canaryPipelineStatus" to SUCCEEDED, - "lastUpdated" to canaryResults.endTimeIso?.toEpochMilli(), - "lastUpdatedIso" to canaryResults.endTimeIso, - "durationString" to canaryResults.result.canaryDuration.toString(), - "canaryScore" to canaryScore, - "warnings" to warnings - )).build() + TaskResult.builder(SUCCEEDED).context( + mapOf( + "canaryPipelineStatus" to SUCCEEDED, + "lastUpdated" to canaryResults.endTimeIso?.toEpochMilli(), + "lastUpdatedIso" to canaryResults.endTimeIso, + "durationString" to canaryResults.result.canaryDuration.toString(), + "canaryScore" to canaryScore, + "warnings" to warnings + ) + ).build() } } diff --git a/orca-kayenta/src/test/kotlin/com/netflix/spinnaker/orca/kayenta/KayentaServiceTest.kt b/orca-kayenta/src/test/kotlin/com/netflix/spinnaker/orca/kayenta/KayentaServiceTest.kt index b805596b438..28603c6bde8 100644 --- a/orca-kayenta/src/test/kotlin/com/netflix/spinnaker/orca/kayenta/KayentaServiceTest.kt +++ b/orca-kayenta/src/test/kotlin/com/netflix/spinnaker/orca/kayenta/KayentaServiceTest.kt @@ -94,20 +94,22 @@ object KayentaServiceTest : Spek({ configurationAccountName = null, storageAccountName = null, canaryExecutionRequest = CanaryExecutionRequest( - scopes = mapOf("canary" to CanaryScopes( - CanaryScope( - scope = "covfefe-control", - location = "us-west-2", - start = startTime, - end = endTime - ), - CanaryScope( - scope = "covfefe-experiment", - location = "us-west-2", - start = startTime, - end = endTime + scopes = mapOf( + "canary" to CanaryScopes( + CanaryScope( + scope = "covfefe-control", + location = "us-west-2", + start = startTime, + end = endTime + ), + CanaryScope( + scope = "covfefe-experiment", + location = "us-west-2", + start = startTime, + end = endTime + ) ) - )), + ), thresholds = Thresholds(pass = 50, marginal = 75) ) ) @@ -136,7 +138,8 @@ object KayentaServiceTest : Spek({ val canaryId = "666fa25b-b0c6-421b-b84f-f93826932994" val storageAccountName = "my-google-account" - val responseJson = """ + val responseJson = + """ { "application": "myapp", "parentPipelineExecutionId": "9cf4ec2e-29fb-4968-ae60-9182b575b30a", @@ -441,7 +444,8 @@ object KayentaServiceTest : Spek({ val canaryId = "02a95d21-290c-49f9-8be1-fb0b7779a73a" val storageAccountName = "my-google-account" - val responseJson = """ + val responseJson = + """ { "application": "myapp", "parentPipelineExecutionId": "88086da2-3e5a-4a9e-ada7-089ab70a9578", diff --git a/orca-kayenta/src/test/kotlin/com/netflix/spinnaker/orca/kayenta/pipeline/KayentaCanaryStageTest.kt b/orca-kayenta/src/test/kotlin/com/netflix/spinnaker/orca/kayenta/pipeline/KayentaCanaryStageTest.kt index bf8e0ec7434..cb2e9a7f62b 100644 --- a/orca-kayenta/src/test/kotlin/com/netflix/spinnaker/orca/kayenta/pipeline/KayentaCanaryStageTest.kt +++ b/orca-kayenta/src/test/kotlin/com/netflix/spinnaker/orca/kayenta/pipeline/KayentaCanaryStageTest.kt @@ -38,11 +38,13 @@ object KayentaCanaryStageTest : Spek({ context["canaryConfig"] = mapOf( "metricsAccountName" to "atlas-acct-1", "canaryConfigId" to "MySampleAtlasCanaryConfig", - "scopes" to listOf(mapOf( - "controlScope" to "some.host.node", - "experimentScope" to "some.other.host.node", - "step" to 60 - )), + "scopes" to listOf( + mapOf( + "controlScope" to "some.host.node", + "experimentScope" to "some.other.host.node", + "step" to 60 + ) + ), "scoreThresholds" to mapOf("marginal" to 75, "pass" to 90), "canaryAnalysisIntervalMins" to 6.hoursInMinutes, "lifetimeHours" to "12" diff --git a/orca-kayenta/src/test/kotlin/com/netflix/spinnaker/orca/kayenta/pipeline/RunCanaryIntervalsStageTest.kt b/orca-kayenta/src/test/kotlin/com/netflix/spinnaker/orca/kayenta/pipeline/RunCanaryIntervalsStageTest.kt index 629c45e879f..e5745006d43 100644 --- a/orca-kayenta/src/test/kotlin/com/netflix/spinnaker/orca/kayenta/pipeline/RunCanaryIntervalsStageTest.kt +++ b/orca-kayenta/src/test/kotlin/com/netflix/spinnaker/orca/kayenta/pipeline/RunCanaryIntervalsStageTest.kt @@ -54,12 +54,14 @@ object RunCanaryIntervalsStageTest : Spek({ name = "Run Kayenta Canary" context["canaryConfig"] = mapOf( "canaryConfigId" to "MySampleStackdriverCanaryConfig", - "scopes" to listOf(mapOf( - "controlScope" to "myapp-v010", - "experimentScope" to "myapp-v021", - "startTimeIso" to clock.instant().toString(), - "endTimeIso" to clock.instant().plus(4, HOURS).toString() - )), + "scopes" to listOf( + mapOf( + "controlScope" to "myapp-v010", + "experimentScope" to "myapp-v021", + "startTimeIso" to clock.instant().toString(), + "endTimeIso" to clock.instant().plus(4, HOURS).toString() + ) + ), "scoreThresholds" to mapOf("marginal" to 75, "pass" to 90), "beginCanaryAnalysisAfterMins" to beginCanaryAnalysisAfterMins ) @@ -101,12 +103,14 @@ object RunCanaryIntervalsStageTest : Spek({ name = "Run Kayenta Canary" context["canaryConfig"] = mapOf( "canaryConfigId" to "MySampleStackdriverCanaryConfig", - "scopes" to listOf(mapOf( - "controlScope" to "myapp-v010", - "experimentScope" to "myapp-v021", - "startTimeIso" to clock.instant().toString(), - "endTimeIso" to clock.instant().plus(4, HOURS).toString() - )), + "scopes" to listOf( + mapOf( + "controlScope" to "myapp-v010", + "experimentScope" to "myapp-v021", + "startTimeIso" to clock.instant().toString(), + "endTimeIso" to clock.instant().plus(4, HOURS).toString() + ) + ), "scoreThresholds" to mapOf("marginal" to 75, "pass" to 90), "beginCanaryAnalysisAfterMins" to warmupMins, "canaryAnalysisIntervalMins" to intervalMins, @@ -163,10 +167,12 @@ object RunCanaryIntervalsStageTest : Spek({ name = "Run Kayenta Canary" context["canaryConfig"] = mapOf( "canaryConfigId" to "MySampleStackdriverCanaryConfig", - "scopes" to listOf(mapOf( - "controlScope" to "myapp-v010", - "experimentScope" to "myapp-v021" - )), + "scopes" to listOf( + mapOf( + "controlScope" to "myapp-v010", + "experimentScope" to "myapp-v021" + ) + ), "scoreThresholds" to mapOf("marginal" to 75, "pass" to 90), "lifetimeHours" to "1", "beginCanaryAnalysisAfterMins" to warmupMins @@ -231,10 +237,12 @@ object RunCanaryIntervalsStageTest : Spek({ name = "Run Kayenta Canary" context["canaryConfig"] = mapOf( "canaryConfigId" to "MySampleStackdriverCanaryConfig", - "scopes" to listOf(mapOf( - "controlScope" to "myapp-v010", - "experimentScope" to "myapp-v021" - )), + "scopes" to listOf( + mapOf( + "controlScope" to "myapp-v010", + "experimentScope" to "myapp-v021" + ) + ), "scoreThresholds" to mapOf("marginal" to 75, "pass" to 90), "beginCanaryAnalysisAfterMins" to warmupMins, "canaryAnalysisIntervalMins" to intervalMins, @@ -316,10 +324,12 @@ object RunCanaryIntervalsStageTest : Spek({ name = "Run Kayenta Canary" context["canaryConfig"] = mapOf( "canaryConfigId" to "MySampleStackdriverCanaryConfig", - "scopes" to listOf(mapOf( - "controlScope" to "myapp-v010", - "experimentScope" to "myapp-v021" - )), + "scopes" to listOf( + mapOf( + "controlScope" to "myapp-v010", + "experimentScope" to "myapp-v021" + ) + ), "scoreThresholds" to mapOf("marginal" to 75, "pass" to 90), "lifetimeHours" to "1", "baselineAnalysisOffsetInMins" to baselineOffsetMins, @@ -357,12 +367,14 @@ object RunCanaryIntervalsStageTest : Spek({ name = "Run Kayenta Canary" context["canaryConfig"] = mapOf( "canaryConfigId" to "MySampleStackdriverCanaryConfig", - "scopes" to listOf(mapOf( - "controlScope" to "myapp-v010", - "experimentScope" to "myapp-v021", - "startTimeIso" to clock.instant().toString(), - "endTimeIso" to clock.instant().plus(4, HOURS).toString() - )), + "scopes" to listOf( + mapOf( + "controlScope" to "myapp-v010", + "experimentScope" to "myapp-v021", + "startTimeIso" to clock.instant().toString(), + "endTimeIso" to clock.instant().plus(4, HOURS).toString() + ) + ), "scoreThresholds" to mapOf("marginal" to 75, "pass" to 90), "lifetimeHours" to "1", "baselineAnalysisOffsetInMins" to baselineOffsetMins, @@ -395,12 +407,14 @@ object RunCanaryIntervalsStageTest : Spek({ context["canaryConfig"] = mapOf( "metricsAccountName" to "atlas-acct-1", "canaryConfigId" to "MySampleAtlasCanaryConfig", - "scopes" to listOf(mapOf( - "controlScope" to "some.host.node", - "experimentScope" to "some.other.host.node", - "step" to 60, - "extendedScopeParams" to attributes - )), + "scopes" to listOf( + mapOf( + "controlScope" to "some.host.node", + "experimentScope" to "some.other.host.node", + "step" to 60, + "extendedScopeParams" to attributes + ) + ), "scoreThresholds" to mapOf("marginal" to 75, "pass" to 90), "canaryAnalysisIntervalMins" to 6.hoursInMinutes, "lifetimeHours" to "12" diff --git a/orca-kayenta/src/test/kotlin/com/netflix/spinnaker/orca/kayenta/tasks/AggregateCanaryResultsTaskTest.kt b/orca-kayenta/src/test/kotlin/com/netflix/spinnaker/orca/kayenta/tasks/AggregateCanaryResultsTaskTest.kt index 2ab8f1d6dd5..502a2879ea3 100644 --- a/orca-kayenta/src/test/kotlin/com/netflix/spinnaker/orca/kayenta/tasks/AggregateCanaryResultsTaskTest.kt +++ b/orca-kayenta/src/test/kotlin/com/netflix/spinnaker/orca/kayenta/tasks/AggregateCanaryResultsTaskTest.kt @@ -83,10 +83,12 @@ object AggregateCanaryResultsTaskSpec : Spek({ name = "kayentaCanary" context["canaryConfig"] = mapOf( "canaryConfigId" to UUID.randomUUID().toString(), - "scopes" to listOf(mapOf( - "controlScope" to "myapp-v010", - "experimentScope" to "myapp-v021" - )), + "scopes" to listOf( + mapOf( + "controlScope" to "myapp-v010", + "experimentScope" to "myapp-v021" + ) + ), "scoreThresholds" to scoreThresholds, "lifetimeDuration" to Duration.parse("PT1H") ) @@ -132,10 +134,12 @@ object AggregateCanaryResultsTaskSpec : Spek({ name = "kayentaCanary" context["canaryConfig"] = mapOf( "canaryConfigId" to UUID.randomUUID().toString(), - "scopes" to listOf(mapOf( - "controlScope" to "myapp-v010", - "experimentScope" to "myapp-v021" - )), + "scopes" to listOf( + mapOf( + "controlScope" to "myapp-v010", + "experimentScope" to "myapp-v021" + ) + ), "scoreThresholds" to scoreThresholds, "lifetimeDuration" to Duration.parse("PT1H") ) @@ -159,10 +163,12 @@ object AggregateCanaryResultsTaskSpec : Spek({ name = "kayentaCanary" context["canaryConfig"] = mapOf( "canaryConfigId" to UUID.randomUUID().toString(), - "scopes" to listOf(mapOf( - "controlScope" to "myapp-v010", - "experimentScope" to "myapp-v021" - )), + "scopes" to listOf( + mapOf( + "controlScope" to "myapp-v010", + "experimentScope" to "myapp-v021" + ) + ), "scoreThresholds" to scoreThresholds, "lifetimeDuration" to Duration.parse("PT1H") ) diff --git a/orca-keel/src/main/kotlin/com/netflix/spinnaker/orca/config/KeelConfiguration.kt b/orca-keel/src/main/kotlin/com/netflix/spinnaker/orca/config/KeelConfiguration.kt index ea33fe8ff11..57754db8274 100644 --- a/orca-keel/src/main/kotlin/com/netflix/spinnaker/orca/config/KeelConfiguration.kt +++ b/orca-keel/src/main/kotlin/com/netflix/spinnaker/orca/config/KeelConfiguration.kt @@ -63,6 +63,6 @@ class KeelConfiguration { @Bean fun keelObjectMapper() = OrcaObjectMapper.newInstance() - .registerModule(KotlinModule()) - .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .registerModule(KotlinModule()) + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) } diff --git a/orca-keel/src/main/kotlin/com/netflix/spinnaker/orca/keel/task/ImportDeliveryConfigTask.kt b/orca-keel/src/main/kotlin/com/netflix/spinnaker/orca/keel/task/ImportDeliveryConfigTask.kt index b8416f3711f..2b8324fa472 100644 --- a/orca-keel/src/main/kotlin/com/netflix/spinnaker/orca/keel/task/ImportDeliveryConfigTask.kt +++ b/orca-keel/src/main/kotlin/com/netflix/spinnaker/orca/keel/task/ImportDeliveryConfigTask.kt @@ -57,7 +57,8 @@ constructor( return try { log.debug("Retrieving keel manifest at $manifestLocation") val deliveryConfig = scmService.getDeliveryConfigManifest( - context.repoType, context.projectKey, context.repositorySlug, context.directory, context.manifest, context.ref) + context.repoType, context.projectKey, context.repositorySlug, context.directory, context.manifest, context.ref + ) log.debug("Publishing manifest ${context.manifest} to keel on behalf of $user") keelService.publishDeliveryConfig(deliveryConfig, user) @@ -118,8 +119,10 @@ constructor( return when { error.kind == RetrofitError.Kind.NETWORK -> { // retry if unable to connect - buildRetry(context, - "Network error talking to downstream service, attempt ${context.attempt} of ${context.maxRetries}: ${error.friendlyMessage}") + buildRetry( + context, + "Network error talking to downstream service, attempt ${context.attempt} of ${context.maxRetries}: ${error.friendlyMessage}" + ) } error.response?.status in 400..499 -> { val response = error.response!! @@ -142,8 +145,10 @@ constructor( } else -> { // retry on other status codes - buildRetry(context, - "Retryable HTTP response ${error.response?.status} received from downstream service: ${error.friendlyMessage}") + buildRetry( + context, + "Retryable HTTP response ${error.response?.status} received from downstream service: ${error.friendlyMessage}" + ) } } } diff --git a/orca-keel/src/test/kotlin/com/netflix/spinnaker/orca/keel/ImportDeliveryConfigTaskTests.kt b/orca-keel/src/test/kotlin/com/netflix/spinnaker/orca/keel/ImportDeliveryConfigTaskTests.kt index bb974776ff5..8e826a06e5f 100644 --- a/orca-keel/src/test/kotlin/com/netflix/spinnaker/orca/keel/ImportDeliveryConfigTaskTests.kt +++ b/orca-keel/src/test/kotlin/com/netflix/spinnaker/orca/keel/ImportDeliveryConfigTaskTests.kt @@ -186,11 +186,13 @@ internal class ImportDeliveryConfigTaskTests : JUnit5Minutests { context("with optional stage context missing") { test("uses defaults to fill in the blanks") { - val result = execute(manifestLocation.toMap().also { - it.remove("directory") - it.remove("manifest") - it.remove("ref") - }) + val result = execute( + manifestLocation.toMap().also { + it.remove("directory") + it.remove("manifest") + it.remove("ref") + } + ) expectThat(result.status).isEqualTo(ExecutionStatus.SUCCEEDED) verify(exactly = 1) { scmService.getDeliveryConfigManifest( @@ -239,11 +241,13 @@ internal class ImportDeliveryConfigTaskTests : JUnit5Minutests { context("with some missing information in stage context") { test("uses trigger information to fill in the blanks") { - val result = execute(manifestLocation.toMap().also { - it.remove("projectKey") - it.remove("repositorySlug") - it.remove("ref") - }) + val result = execute( + manifestLocation.toMap().also { + it.remove("projectKey") + it.remove("repositorySlug") + it.remove("ref") + } + ) expectThat(result.status).isEqualTo(ExecutionStatus.SUCCEEDED) verify(exactly = 1) { scmService.getDeliveryConfigManifest( @@ -295,9 +299,11 @@ internal class ImportDeliveryConfigTaskTests : JUnit5Minutests { manifestLocation.manifest, manifestLocation.ref ) - } throws RetrofitError.httpError("http://igor", + } throws RetrofitError.httpError( + "http://igor", Response("http://igor", 404, "", emptyList(), null), - null, null) + null, null + ) } } @@ -319,9 +325,11 @@ internal class ImportDeliveryConfigTaskTests : JUnit5Minutests { manifestLocation.manifest, manifestLocation.ref ) - } throws RetrofitError.httpError("http://igor", + } throws RetrofitError.httpError( + "http://igor", Response("http://igor", 401, "", emptyList(), null), - null, null) + null, null + ) } } @@ -344,9 +352,14 @@ internal class ImportDeliveryConfigTaskTests : JUnit5Minutests { manifestLocation.manifest, manifestLocation.ref ) - } throws RetrofitError.httpError("http://keel", - Response("http://keel", 403, "", emptyList(), - JacksonConverter(objectMapper).toBody(accessDeniedError) as TypedInput), null, null) + } throws RetrofitError.httpError( + "http://keel", + Response( + "http://keel", 403, "", emptyList(), + JacksonConverter(objectMapper).toBody(accessDeniedError) as TypedInput + ), + null, null + ) } } @@ -369,9 +382,14 @@ internal class ImportDeliveryConfigTaskTests : JUnit5Minutests { manifestLocation.manifest, manifestLocation.ref ) - } throws RetrofitError.httpError("http://keel", - Response("http://keel", 400, "", emptyList(), - JacksonConverter(objectMapper).toBody(parsingError) as TypedInput), null, null) + } throws RetrofitError.httpError( + "http://keel", + Response( + "http://keel", 400, "", emptyList(), + JacksonConverter(objectMapper).toBody(parsingError) as TypedInput + ), + null, null + ) } } @@ -394,9 +412,11 @@ internal class ImportDeliveryConfigTaskTests : JUnit5Minutests { manifestLocation.manifest, manifestLocation.ref ) - } throws RetrofitError.httpError("http://igor", + } throws RetrofitError.httpError( + "http://igor", Response("http://igor", 503, "", emptyList(), null), - null, null) + null, null + ) } } diff --git a/orca-peering/src/main/kotlin/com/netflix/spinnaker/config/PeeringAgentConfiguration.kt b/orca-peering/src/main/kotlin/com/netflix/spinnaker/config/PeeringAgentConfiguration.kt index 04fcb006acb..881a1868309 100644 --- a/orca-peering/src/main/kotlin/com/netflix/spinnaker/config/PeeringAgentConfiguration.kt +++ b/orca-peering/src/main/kotlin/com/netflix/spinnaker/config/PeeringAgentConfiguration.kt @@ -58,7 +58,8 @@ class PeeringAgentConfiguration { val executor = Executors.newCachedThreadPool( ThreadFactoryBuilder() .setNameFormat(PeeringAgent::class.java.simpleName + "-${properties.peerId}-%d") - .build()) + .build() + ) val sourceDB: SqlRawAccess val destinationDB: SqlRawAccess @@ -84,6 +85,7 @@ class PeeringAgentConfiguration { metrics, copier, customPeerer, - clusterLock) + clusterLock + ) } } diff --git a/orca-peering/src/main/kotlin/com/netflix/spinnaker/orca/peering/ExecutionCopier.kt b/orca-peering/src/main/kotlin/com/netflix/spinnaker/orca/peering/ExecutionCopier.kt index 351817ee28e..cbbe5fe6aed 100644 --- a/orca-peering/src/main/kotlin/com/netflix/spinnaker/orca/peering/ExecutionCopier.kt +++ b/orca-peering/src/main/kotlin/com/netflix/spinnaker/orca/peering/ExecutionCopier.kt @@ -84,28 +84,30 @@ open class ExecutionCopier( log.info("Kicking off migration with (chunk size: $chunkSize, threadCount: $effectiveThreadCount)") val futures = MutableList>(effectiveThreadCount) { threadIndex -> - executor.submit(Callable { - var latestUpdatedAt = 0L - var hadErrors = false - - do { - val chunkToProcess = queue.poll() ?: break - - val result = copyExecutionChunk(executionType, chunkToProcess, state) - hadErrors = hadErrors || result.hadErrors - val migrated = migratedCount.addAndGet(result.count) - latestUpdatedAt = max(latestUpdatedAt, result.latestUpdatedAt) - - if (threadIndex == 0) { - // Only dump status logs for one of the threads - it's informational only anyway - val elapsedTime = Duration.between(startTime, Instant.now()).toMillis() - val etaMillis = (((idsToMigrate.size.toDouble() / migrated) * elapsedTime) - elapsedTime).toLong() - log.info("Migrated $migrated of ${idsToMigrate.size}, ETA: ${Duration.ofMillis(etaMillis)}") - } - } while (true) - - return@Callable MigrationChunkResult(latestUpdatedAt, 0, hadErrors) - }) + executor.submit( + Callable { + var latestUpdatedAt = 0L + var hadErrors = false + + do { + val chunkToProcess = queue.poll() ?: break + + val result = copyExecutionChunk(executionType, chunkToProcess, state) + hadErrors = hadErrors || result.hadErrors + val migrated = migratedCount.addAndGet(result.count) + latestUpdatedAt = max(latestUpdatedAt, result.latestUpdatedAt) + + if (threadIndex == 0) { + // Only dump status logs for one of the threads - it's informational only anyway + val elapsedTime = Duration.between(startTime, Instant.now()).toMillis() + val etaMillis = (((idsToMigrate.size.toDouble() / migrated) * elapsedTime) - elapsedTime).toLong() + log.info("Migrated $migrated of ${idsToMigrate.size}, ETA: ${Duration.ofMillis(etaMillis)}") + } + } while (true) + + return@Callable MigrationChunkResult(latestUpdatedAt, 0, hadErrors) + } + ) } var latestUpdatedAt = 0L diff --git a/orca-peering/src/main/kotlin/com/netflix/spinnaker/orca/peering/MySqlRawAccess.kt b/orca-peering/src/main/kotlin/com/netflix/spinnaker/orca/peering/MySqlRawAccess.kt index eda8a74bfb1..0efb3e17fba 100644 --- a/orca-peering/src/main/kotlin/com/netflix/spinnaker/orca/peering/MySqlRawAccess.kt +++ b/orca-peering/src/main/kotlin/com/netflix/spinnaker/orca/peering/MySqlRawAccess.kt @@ -50,9 +50,11 @@ open class MySqlRawAccess( jooq .select(field("id"), field("updated_at")) .from(getExecutionTable(executionType)) - .where(field("status").`in`(*completedStatuses.toTypedArray()) - .and(field("updated_at").gt(updatedAfter)) - .and(partitionConstraint)) + .where( + field("status").`in`(*completedStatuses.toTypedArray()) + .and(field("updated_at").gt(updatedAfter)) + .and(partitionConstraint) + ) .fetchInto(ExecutionDiffKey::class.java) } } @@ -69,8 +71,10 @@ open class MySqlRawAccess( jooq .select(field("id")) .from(getExecutionTable(executionType)) - .where(field("status").`in`(*activeStatuses.toTypedArray()) - .and(partitionConstraint)) + .where( + field("status").`in`(*activeStatuses.toTypedArray()) + .and(partitionConstraint) + ) .fetch(field("id"), String::class.java) } } diff --git a/orca-peering/src/main/kotlin/com/netflix/spinnaker/orca/peering/PeeringAgent.kt b/orca-peering/src/main/kotlin/com/netflix/spinnaker/orca/peering/PeeringAgent.kt index 0227c7dbbc3..a532777dc3d 100644 --- a/orca-peering/src/main/kotlin/com/netflix/spinnaker/orca/peering/PeeringAgent.kt +++ b/orca-peering/src/main/kotlin/com/netflix/spinnaker/orca/peering/PeeringAgent.kt @@ -94,7 +94,8 @@ class PeeringAgent( override fun tick() { if (dynamicConfigService.isEnabled("pollers.peering", true) && - dynamicConfigService.isEnabled("pollers.peering.$peeredId", true)) { + dynamicConfigService.isEnabled("pollers.peering.$peeredId", true) + ) { peeringMetrics.recordOverallLag { peerExecutions(ExecutionType.PIPELINE) peerExecutions(ExecutionType.ORCHESTRATION) diff --git a/orca-pipelinetemplate/src/main/java/com/netflix/spinnaker/orca/pipelinetemplate/PipelineTemplatePreprocessor.kt b/orca-pipelinetemplate/src/main/java/com/netflix/spinnaker/orca/pipelinetemplate/PipelineTemplatePreprocessor.kt index ef9c78ed74d..3c13c74feef 100644 --- a/orca-pipelinetemplate/src/main/java/com/netflix/spinnaker/orca/pipelinetemplate/PipelineTemplatePreprocessor.kt +++ b/orca-pipelinetemplate/src/main/java/com/netflix/spinnaker/orca/pipelinetemplate/PipelineTemplatePreprocessor.kt @@ -60,7 +60,8 @@ class PipelineTemplatePreprocessor // // We also need to ensure that 'type' and 'schema' are set properly upstream when saving v2 template configs. if (pipeline.getOrDefault(V2PipelineTemplate.SCHEMA, null) == V2PipelineTemplate.V2_SCHEMA_VERSION && - pipeline.get("template") != null) { + pipeline.get("template") != null + ) { val templateConfig = HashMap(pipeline) templateConfig.remove("trigger") // template configurations don't have a 'trigger' field. pipeline.put("config", templateConfig) @@ -108,11 +109,15 @@ class PipelineTemplatePreprocessor } private fun recordRequest(context: PipelineTemplateContext, success: Boolean) { - registry.counter(requestsId.withTags(listOf( - BasicTag("status", if (success) "success" else "failure"), - BasicTag("schema", context.getRequest().schema ?: "unknown"), - BasicTag("plan", context.getRequest().plan.toString()) - ))).increment() + registry.counter( + requestsId.withTags( + listOf( + BasicTag("status", if (success) "success" else "failure"), + BasicTag("schema", context.getRequest().schema ?: "unknown"), + BasicTag("plan", context.getRequest().plan.toString()) + ) + ) + ).increment() } } diff --git a/orca-pipelinetemplate/src/main/java/com/netflix/spinnaker/orca/pipelinetemplate/v1schema/handler/V1TemplateLoaderHandler.kt b/orca-pipelinetemplate/src/main/java/com/netflix/spinnaker/orca/pipelinetemplate/v1schema/handler/V1TemplateLoaderHandler.kt index 8a7068ecb3d..a8543cc3119 100644 --- a/orca-pipelinetemplate/src/main/java/com/netflix/spinnaker/orca/pipelinetemplate/v1schema/handler/V1TemplateLoaderHandler.kt +++ b/orca-pipelinetemplate/src/main/java/com/netflix/spinnaker/orca/pipelinetemplate/v1schema/handler/V1TemplateLoaderHandler.kt @@ -55,10 +55,12 @@ class V1TemplateLoaderHandler( if (config.pipeline.template == null) { template = PipelineTemplate().apply { variables = config.pipeline.variables.entries.stream() - .map { PipelineTemplate.Variable().apply { - name = it.key - defaultValue = it.value - } } + .map { + PipelineTemplate.Variable().apply { + name = it.key + defaultValue = it.value + } + } .collect(Collectors.toList()) } } else { @@ -74,10 +76,12 @@ class V1TemplateLoaderHandler( val renderContext = RenderUtil.createDefaultRenderContext(template, config, trigger) renderTemplateVariables(renderContext, template) - context.setSchemaContext(V1PipelineTemplateContext( - config, - template - )) + context.setSchemaContext( + V1PipelineTemplateContext( + config, + template + ) + ) } private fun renderTemplateVariables(renderContext: RenderContext, pipelineTemplate: PipelineTemplate) { diff --git a/orca-pipelinetemplate/src/main/java/com/netflix/spinnaker/orca/pipelinetemplate/v1schema/handler/v2/V2Handlers.kt b/orca-pipelinetemplate/src/main/java/com/netflix/spinnaker/orca/pipelinetemplate/v1schema/handler/v2/V2Handlers.kt index ea3aeb43f1f..b355e9c7039 100644 --- a/orca-pipelinetemplate/src/main/java/com/netflix/spinnaker/orca/pipelinetemplate/v1schema/handler/v2/V2Handlers.kt +++ b/orca-pipelinetemplate/src/main/java/com/netflix/spinnaker/orca/pipelinetemplate/v1schema/handler/v2/V2Handlers.kt @@ -41,12 +41,12 @@ class V2SchemaHandlerGroup override fun getHandlers(): List = listOf( - V2TemplateLoaderHandler(templateLoader, contextParameterProcessor, objectMapper), - V2ConfigurationValidationHandler(), - V2TemplateValidationHandler(), - V2GraphMutatorHandler(), - V2PipelineGenerator(artifactUtils) - ) + V2TemplateLoaderHandler(templateLoader, contextParameterProcessor, objectMapper), + V2ConfigurationValidationHandler(), + V2TemplateValidationHandler(), + V2GraphMutatorHandler(), + V2PipelineGenerator(artifactUtils) + ) } class V2GraphMutatorHandler : Handler { diff --git a/orca-plugins-test/src/test/kotlin/com/netflix/spinnaker/orca/plugins/test/OrcaPluginsFixture.kt b/orca-plugins-test/src/test/kotlin/com/netflix/spinnaker/orca/plugins/test/OrcaPluginsFixture.kt index 9a3c7cf24eb..092c3077d45 100644 --- a/orca-plugins-test/src/test/kotlin/com/netflix/spinnaker/orca/plugins/test/OrcaPluginsFixture.kt +++ b/orca-plugins-test/src/test/kotlin/com/netflix/spinnaker/orca/plugins/test/OrcaPluginsFixture.kt @@ -115,6 +115,7 @@ internal class PluginTestConfiguration { @Primary fun queue(clock: Clock?, publisher: EventPublisher?): Queue { return InMemoryQueue( - clock!!, Duration.ofMinutes(1), emptyList(), false, publisher!!) + clock!!, Duration.ofMinutes(1), emptyList(), false, publisher!! + ) } } diff --git a/orca-plugins-test/src/test/kotlin/com/netflix/spinnaker/orca/plugins/test/OrcaPluginsTest.kt b/orca-plugins-test/src/test/kotlin/com/netflix/spinnaker/orca/plugins/test/OrcaPluginsTest.kt index dc71b2fbd2f..e328f016bd1 100644 --- a/orca-plugins-test/src/test/kotlin/com/netflix/spinnaker/orca/plugins/test/OrcaPluginsTest.kt +++ b/orca-plugins-test/src/test/kotlin/com/netflix/spinnaker/orca/plugins/test/OrcaPluginsTest.kt @@ -55,7 +55,8 @@ class OrcaPluginsTest : PluginsTck() { test("Stage defintion builder for extension is resolved to the correct type") { val stageDefinitionBuilder = stageResolver.getStageDefinitionBuilder( - StageDefinitionBuilderExtension::class.java.simpleName, "extensionStage") + StageDefinitionBuilderExtension::class.java.simpleName, "extensionStage" + ) expect { that(stageDefinitionBuilder.type).isEqualTo(StageDefinitionBuilderExtension().type) @@ -64,7 +65,8 @@ class OrcaPluginsTest : PluginsTck() { test("Simple stage extension is resolved to the correct type") { val stageDefinitionBuilder = stageResolver.getStageDefinitionBuilder( - SimpleStageExtension::class.java.simpleName, "simpleStage") + SimpleStageExtension::class.java.simpleName, "simpleStage" + ) expect { that(stageDefinitionBuilder.type).isEqualTo("simple") diff --git a/orca-queue-redis/src/main/kotlin/com/netflix/spinnaker/config/RedisOrcaQueueConfiguration.kt b/orca-queue-redis/src/main/kotlin/com/netflix/spinnaker/config/RedisOrcaQueueConfiguration.kt index a99edc7d8da..1a9459222b0 100644 --- a/orca-queue-redis/src/main/kotlin/com/netflix/spinnaker/config/RedisOrcaQueueConfiguration.kt +++ b/orca-queue-redis/src/main/kotlin/com/netflix/spinnaker/config/RedisOrcaQueueConfiguration.kt @@ -49,7 +49,8 @@ import redis.clients.jedis.util.Pool @ConditionalOnProperty( value = ["keiko.queue.redis.enabled"], havingValue = "true", - matchIfMissing = true) + matchIfMissing = true +) class RedisOrcaQueueConfiguration : RedisQueueConfiguration() { @Autowired @@ -67,10 +68,12 @@ class RedisOrcaQueueConfiguration : RedisQueueConfiguration() { ) disable(FAIL_ON_UNKNOWN_PROPERTIES) - SpringObjectMapperConfigurer(objectMapperSubtypeProperties.apply { - messagePackages += listOf("com.netflix.spinnaker.orca.q") - attributePackages += listOf("com.netflix.spinnaker.orca.q") - }).registerSubtypes(this) + SpringObjectMapperConfigurer( + objectMapperSubtypeProperties.apply { + messagePackages += listOf("com.netflix.spinnaker.orca.q") + attributePackages += listOf("com.netflix.spinnaker.orca.q") + } + ).registerSubtypes(this) } } diff --git a/orca-queue-redis/src/test/kotlin/com/netflix/spinnaker/orca/q/redis/RedisQueueIntegrationTest.kt b/orca-queue-redis/src/test/kotlin/com/netflix/spinnaker/orca/q/redis/RedisQueueIntegrationTest.kt index fc9a0701642..95dba34b06b 100644 --- a/orca-queue-redis/src/test/kotlin/com/netflix/spinnaker/orca/q/redis/RedisQueueIntegrationTest.kt +++ b/orca-queue-redis/src/test/kotlin/com/netflix/spinnaker/orca/q/redis/RedisQueueIntegrationTest.kt @@ -70,5 +70,6 @@ class RedisTestConfig { "logging.level.com.netflix.spinnaker=FATAL", "execution-repository.redis.enabled=true", "spring.application.name=orcaTest" -]) + ] +) class RedisQueueIntegrationTest : QueueIntegrationTest() diff --git a/orca-queue-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlOrcaQueueConfiguration.kt b/orca-queue-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlOrcaQueueConfiguration.kt index d8c20488aed..b17d0582c64 100644 --- a/orca-queue-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlOrcaQueueConfiguration.kt +++ b/orca-queue-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlOrcaQueueConfiguration.kt @@ -42,7 +42,8 @@ import org.springframework.context.annotation.Configuration @ConditionalOnProperty( value = ["keiko.queue.sql.enabled"], havingValue = "true", - matchIfMissing = false) + matchIfMissing = false +) class SqlOrcaQueueConfiguration : SqlQueueConfiguration() { @Autowired @@ -60,10 +61,12 @@ class SqlOrcaQueueConfiguration : SqlQueueConfiguration() { ) disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) - SpringObjectMapperConfigurer(objectMapperSubtypeProperties.apply { - messagePackages = messagePackages + listOf("com.netflix.spinnaker.orca.q") - attributePackages = attributePackages + listOf("com.netflix.spinnaker.orca.q") - }).registerSubtypes(this) + SpringObjectMapperConfigurer( + objectMapperSubtypeProperties.apply { + messagePackages = messagePackages + listOf("com.netflix.spinnaker.orca.q") + attributePackages = attributePackages + listOf("com.netflix.spinnaker.orca.q") + } + ).registerSubtypes(this) } } diff --git a/orca-queue-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlQueueShovelConfiguration.kt b/orca-queue-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlQueueShovelConfiguration.kt index ebca0644632..f09ca7d6535 100644 --- a/orca-queue-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlQueueShovelConfiguration.kt +++ b/orca-queue-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlQueueShovelConfiguration.kt @@ -86,6 +86,7 @@ class SqlQueueShovelConfiguration { registry = registry, activator = activator, config = config, - executionRepository = executionRepository) + executionRepository = executionRepository + ) } } diff --git a/orca-queue-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlRedisQueueShovelConfiguration.kt b/orca-queue-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlRedisQueueShovelConfiguration.kt index af8855afce8..f7f9e2d31a9 100644 --- a/orca-queue-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlRedisQueueShovelConfiguration.kt +++ b/orca-queue-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlRedisQueueShovelConfiguration.kt @@ -70,7 +70,8 @@ class SqlRedisQueueShovelConfiguration { timeoutMs = timeout poolConfig = redisPoolConfig }, - redisPoolConfig) + redisPoolConfig + ) val previousQueue = RedisQueue( queueName = redisQueueProperties.queueName, @@ -79,7 +80,8 @@ class SqlRedisQueueShovelConfiguration { deadMessageHandlers = emptyList(), publisher = publisher, mapper = mapper, - serializationMigrator = serializationMigrator) + serializationMigrator = serializationMigrator + ) return QueueShovel( queue = queue, @@ -87,7 +89,8 @@ class SqlRedisQueueShovelConfiguration { registry = registry, activator = discoveryActivator, config = dynamicConfigService, - executionRepository = null) + executionRepository = null + ) } @Bean @@ -121,7 +124,8 @@ class SqlRedisQueueShovelConfiguration { registry = registry, activator = discoveryActivator, config = dynamicConfigService, - executionRepository = null) + executionRepository = null + ) } /** @@ -153,7 +157,8 @@ class SqlRedisQueueShovelConfiguration { serializationMigrator = serializationMigrator, deadMessageHandlers = emptyList(), publisher = publisher, - sqlRetryProperties = sqlQueueProperties.retries) + sqlRetryProperties = sqlQueueProperties.retries + ) return QueueShovel( queue = queue, @@ -161,6 +166,7 @@ class SqlRedisQueueShovelConfiguration { registry = registry, activator = discoveryActivator, config = dynamicConfigService, - executionRepository = null) + executionRepository = null + ) } } diff --git a/orca-queue-sql/src/main/kotlin/com/netflix/spinnaker/orca/q/sql/pending/SqlPendingExecutionService.kt b/orca-queue-sql/src/main/kotlin/com/netflix/spinnaker/orca/q/sql/pending/SqlPendingExecutionService.kt index dfdaa4a8120..1870d24306a 100644 --- a/orca-queue-sql/src/main/kotlin/com/netflix/spinnaker/orca/q/sql/pending/SqlPendingExecutionService.kt +++ b/orca-queue-sql/src/main/kotlin/com/netflix/spinnaker/orca/q/sql/pending/SqlPendingExecutionService.kt @@ -77,8 +77,10 @@ class SqlPendingExecutionService( * Other message types can be safely dropped. */ if (message is StartExecution) { - log.warn("Canceling execution ${message.executionId} for pipeline $pipelineConfigId due to pending " + - "depth of $queued executions") + log.warn( + "Canceling execution ${message.executionId} for pipeline $pipelineConfigId due to pending " + + "depth of $queued executions" + ) registry.counter(cancelId).increment() try { @@ -157,8 +159,11 @@ class SqlPendingExecutionService( } } } catch (e: Exception) { - log.error("Failed popping pending execution for pipeline $pipelineConfigId, attempting to requeue " + - "StartWaitingExecutions message", e) + log.error( + "Failed popping pending execution for pipeline $pipelineConfigId, attempting to requeue " + + "StartWaitingExecutions message", + e + ) val purge = (sortField.order == SortOrder.DESC) queue.push(StartWaitingExecutions(pipelineConfigId, purge), Duration.ofSeconds(10)) @@ -202,8 +207,11 @@ class SqlPendingExecutionService( ) private fun withRetry(fn: (Any) -> T): T { - return retrySupport.retry({ - fn(this) - }, retryProperties.maxRetries, retryProperties.backoffMs, false) + return retrySupport.retry( + { + fn(this) + }, + retryProperties.maxRetries, retryProperties.backoffMs, false + ) } } diff --git a/orca-queue-sql/src/test/kotlin/com/netflix/spinnaker/orca/q/sql/SqlQueueIntegrationTest.kt b/orca-queue-sql/src/test/kotlin/com/netflix/spinnaker/orca/q/sql/SqlQueueIntegrationTest.kt index 31e2f3abf6a..81fede8ca18 100644 --- a/orca-queue-sql/src/test/kotlin/com/netflix/spinnaker/orca/q/sql/SqlQueueIntegrationTest.kt +++ b/orca-queue-sql/src/test/kotlin/com/netflix/spinnaker/orca/q/sql/SqlQueueIntegrationTest.kt @@ -82,10 +82,12 @@ class SqlTestConfig { ) disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) - SpringObjectMapperConfigurer(objectMapperSubtypeProperties.apply { - messagePackages = messagePackages + listOf("com.netflix.spinnaker.orca.q") - attributePackages = attributePackages + listOf("com.netflix.spinnaker.orca.q") - }).registerSubtypes(this) + SpringObjectMapperConfigurer( + objectMapperSubtypeProperties.apply { + messagePackages = messagePackages + listOf("com.netflix.spinnaker.orca.q") + attributePackages = attributePackages + listOf("com.netflix.spinnaker.orca.q") + } + ).registerSubtypes(this) } } @@ -138,7 +140,8 @@ class SqlTestConfig { clock: Clock, registry: Registry ) = - SqlPendingExecutionService("test", + SqlPendingExecutionService( + "test", jooq, queue, repository, @@ -182,6 +185,7 @@ class SqlTestConfig { "keiko.queue.sql.enabled=true", "sql.enabled=true", "spring.application.name=orcaTest" - ]) + ] +) class SqlQueueIntegrationTest : QueueIntegrationTest() diff --git a/orca-queue-tck/src/main/kotlin/com/netflix/spinnaker/orca/q/ExecutionLatch.kt b/orca-queue-tck/src/main/kotlin/com/netflix/spinnaker/orca/q/ExecutionLatch.kt index 134046e3ff1..8f39bfb00f1 100644 --- a/orca-queue-tck/src/main/kotlin/com/netflix/spinnaker/orca/q/ExecutionLatch.kt +++ b/orca-queue-tck/src/main/kotlin/com/netflix/spinnaker/orca/q/ExecutionLatch.kt @@ -47,9 +47,11 @@ class ExecutionLatch(private val predicate: Predicate) : } fun ConfigurableApplicationContext.runToCompletion(execution: PipelineExecution, launcher: (PipelineExecution) -> Unit, repository: ExecutionRepository) { - val latch = ExecutionLatch(Predicate { - it.executionId == execution.id - }) + val latch = ExecutionLatch( + Predicate { + it.executionId == execution.id + } + ) addApplicationListener(latch) launcher.invoke(execution) assert(latch.await()) { "Pipeline did not complete" } @@ -71,9 +73,11 @@ fun ConfigurableApplicationContext.runParentToCompletion( launcher: (PipelineExecution) -> Unit, repository: ExecutionRepository ) { - val latch = ExecutionLatch(Predicate { - it.executionId == parent.id - }) + val latch = ExecutionLatch( + Predicate { + it.executionId == parent.id + } + ) addApplicationListener(latch) launcher.invoke(child) @@ -85,9 +89,11 @@ fun ConfigurableApplicationContext.runParentToCompletion( fun ConfigurableApplicationContext.restartAndRunToCompletion(stage: StageExecution, launcher: (PipelineExecution, String) -> Unit, repository: ExecutionRepository) { val execution = stage.execution - val latch = ExecutionLatch(Predicate { - it.executionId == execution.id - }) + val latch = ExecutionLatch( + Predicate { + it.executionId == execution.id + } + ) addApplicationListener(latch) launcher.invoke(execution, stage.id) assert(latch.await()) { "Pipeline did not complete after restarting" } diff --git a/orca-queue-tck/src/main/kotlin/com/netflix/spinnaker/orca/q/QueueIntegrationTest.kt b/orca-queue-tck/src/main/kotlin/com/netflix/spinnaker/orca/q/QueueIntegrationTest.kt index b58026b8361..74ac21fb7f1 100644 --- a/orca-queue-tck/src/main/kotlin/com/netflix/spinnaker/orca/q/QueueIntegrationTest.kt +++ b/orca-queue-tck/src/main/kotlin/com/netflix/spinnaker/orca/q/QueueIntegrationTest.kt @@ -562,12 +562,14 @@ abstract class QueueIntegrationTest { "restrictExecutionDuringTimeWindow" to true, "restrictedExecutionWindow" to mapOf( "days" to (1..7).toList(), - "whitelist" to listOf(mapOf( - "startHour" to now.hour, - "startMin" to 0, - "endHour" to now.plus(1, HOURS).hour, - "endMin" to 0 - )) + "whitelist" to listOf( + mapOf( + "startHour" to now.hour, + "startMin" to 0, + "endHour" to now.plus(1, HOURS).hour, + "endMin" to 0 + ) + ) ) ) } @@ -600,12 +602,14 @@ abstract class QueueIntegrationTest { "restrictExecutionDuringTimeWindow" to true, "restrictedExecutionWindow" to mapOf( "days" to (1..7).toList(), - "whitelist" to listOf(mapOf( - "startHour" to now.hour, - "startMin" to 0, - "endHour" to now.plus(1, HOURS).hour, - "endMin" to 0 - )) + "whitelist" to listOf( + mapOf( + "startHour" to now.hour, + "startMin" to 0, + "endHour" to now.plus(1, HOURS).hour, + "endMin" to 0 + ) + ) ) ) } @@ -627,7 +631,8 @@ abstract class QueueIntegrationTest { "dummy", "dummy", "dummy", - "parallel") + "parallel" + ) assertThat(stages.map { it.status }).allMatch { it == SUCCEEDED } } } @@ -657,11 +662,13 @@ abstract class QueueIntegrationTest { context.runToCompletion(pipeline, runner::start, repository) - verify(dummyTask).execute(check { - // expressions should be resolved in the stage passes to tasks - assertThat(it.context["expr"]).isEqualTo(true) - assertThat((it.context["key"] as Map)["expr"]).isEqualTo(true) - }) + verify(dummyTask).execute( + check { + // expressions should be resolved in the stage passes to tasks + assertThat(it.context["expr"]).isEqualTo(true) + assertThat((it.context["key"] as Map)["expr"]).isEqualTo(true) + } + ) repository.retrieve(PIPELINE, pipeline.id).apply { assertThat(status).isEqualTo(SUCCEEDED) diff --git a/orca-queue-tck/src/main/kotlin/com/netflix/spinnaker/orca/q/Stages.kt b/orca-queue-tck/src/main/kotlin/com/netflix/spinnaker/orca/q/Stages.kt index ff7ed1fd40e..c618a942841 100644 --- a/orca-queue-tck/src/main/kotlin/com/netflix/spinnaker/orca/q/Stages.kt +++ b/orca-queue-tck/src/main/kotlin/com/netflix/spinnaker/orca/q/Stages.kt @@ -163,7 +163,8 @@ val stageWithParallelBranches = object : StageDefinitionBuilder { StageExecutionFactory.newStage(parent.execution, singleTaskStage.type, "run in $region", parent.context + mapOf("region" to region), parent, STAGE_BEFORE) } .forEach { stage -> - graph.add(stage) } + graph.add(stage) + } } override fun taskGraph(stage: StageExecution, builder: Builder) { diff --git a/orca-queue/src/main/kotlin/com/netflix/spinnaker/config/OrcaQueueConfiguration.kt b/orca-queue/src/main/kotlin/com/netflix/spinnaker/config/OrcaQueueConfiguration.kt index d417e72d620..020d87d5d23 100644 --- a/orca-queue/src/main/kotlin/com/netflix/spinnaker/config/OrcaQueueConfiguration.kt +++ b/orca-queue/src/main/kotlin/com/netflix/spinnaker/config/OrcaQueueConfiguration.kt @@ -26,10 +26,12 @@ import org.springframework.context.annotation.Configuration import org.springframework.scheduling.annotation.EnableScheduling @Configuration -@ComponentScan(basePackages = [ - "com.netflix.spinnaker.orca.q", - "com.netflix.spinnaker.orca.q.handler" -]) +@ComponentScan( + basePackages = [ + "com.netflix.spinnaker.orca.q", + "com.netflix.spinnaker.orca.q.handler" + ] +) @EnableScheduling class OrcaQueueConfiguration { @Bean diff --git a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/QueueShovel.kt b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/QueueShovel.kt index 141e5ece3d5..f52494946ec 100644 --- a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/QueueShovel.kt +++ b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/QueueShovel.kt @@ -86,8 +86,10 @@ class QueueShovel( registry.counter(shoveledMessageId).increment() } catch (e: ExecutionNotFoundException) { // no need to log the stack trace on ExecutionNotFoundException, which can be somewhat expected - log.error("Failed shoveling message from previous queue to active (message: $message) " + - "because of exception $e") + log.error( + "Failed shoveling message from previous queue to active (message: $message) " + + "because of exception $e" + ) registry.counter(shovelErrorId).increment() } catch (e: Throwable) { log.error("Failed shoveling message from previous queue to active (message: $message)", e) @@ -111,8 +113,10 @@ class QueueShovel( val execution = executionRepository.retrieve(message.executionType, message.executionId) val isForeign = !executionRepository.handlesPartition(execution.partition) if (isForeign) { - log.info("Taking ownership of foreign execution ${execution.id} with partition '${execution.partition}'. " + - "Setting partition to '${executionRepository.partition}'") + log.info( + "Taking ownership of foreign execution ${execution.id} with partition '${execution.partition}'. " + + "Setting partition to '${executionRepository.partition}'" + ) execution.partition = executionRepository.partition executionRepository.store(execution) } diff --git a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/admin/HydrateQueueCommand.kt b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/admin/HydrateQueueCommand.kt index fcc9c15e677..46cc9ea22f9 100644 --- a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/admin/HydrateQueueCommand.kt +++ b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/admin/HydrateQueueCommand.kt @@ -119,11 +119,13 @@ class HydrateQueueCommand( val leafStages = execution.stages.filter { it.downstreamStages().isEmpty() } if (leafStages.all { it.status.isComplete }) { - actions.add(Action( - description = "All leaf stages are complete but execution is still running", - message = CompleteExecution(execution), - context = ActionContext() - )) + actions.add( + Action( + description = "All leaf stages are complete but execution is still running", + message = CompleteExecution(execution), + context = ActionContext() + ) + ) } return ProcessedExecution( @@ -135,17 +137,21 @@ class HydrateQueueCommand( private fun processStage(stage: StageExecution): List { if (stage.status == NOT_STARTED) { if (stage.allUpstreamStagesComplete()) { - return listOf(Action( - description = "Stage is not started but all upstream stages are complete", - message = StartStage(stage), - context = stage.toActionContext() - )) + return listOf( + Action( + description = "Stage is not started but all upstream stages are complete", + message = StartStage(stage), + context = stage.toActionContext() + ) + ) } else if (stage.isInitial()) { - return listOf(Action( - description = "Stage is not started but is an initial stage", - message = StartStage(stage), - context = stage.toActionContext() - )) + return listOf( + Action( + description = "Stage is not started but is an initial stage", + message = StartStage(stage), + context = stage.toActionContext() + ) + ) } } else if (stage.status == RUNNING) { val actions = mutableListOf() @@ -164,12 +170,15 @@ class HydrateQueueCommand( if (stage.allBeforeStagesSuccessful() && stage.tasks.all { it.status.isComplete } && - stage.allAfterStagesSuccessful()) { - actions.add(Action( - description = "All tasks and known synthetic stages are complete", - message = CompleteStage(stage), - context = stage.toActionContext() - )) + stage.allAfterStagesSuccessful() + ) { + actions.add( + Action( + description = "All tasks and known synthetic stages are complete", + message = CompleteStage(stage), + context = stage.toActionContext() + ) + ) } return actions.toList() diff --git a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/admin/web/QueueAdminController.kt b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/admin/web/QueueAdminController.kt index c19a31688e1..5b90332a90c 100644 --- a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/admin/web/QueueAdminController.kt +++ b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/admin/web/QueueAdminController.kt @@ -42,12 +42,14 @@ class QueueAdminController( @QueryParam("startMs") startMs: Long?, @QueryParam("endMs") endMs: Long? ): HydrateQueueOutput = - hydrateCommand(HydrateQueueInput( - executionId, - if (startMs != null) Instant.ofEpochMilli(startMs) else null, - if (endMs != null) Instant.ofEpochMilli(endMs) else null, - dryRun ?: true - )) + hydrateCommand( + HydrateQueueInput( + executionId, + if (startMs != null) Instant.ofEpochMilli(startMs) else null, + if (endMs != null) Instant.ofEpochMilli(endMs) else null, + dryRun ?: true + ) + ) /** * Posts StartWaitingExecutions message for the given pipeline message into the queue. diff --git a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/audit/ExecutionTrackingMessageHandlerPostProcessor.kt b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/audit/ExecutionTrackingMessageHandlerPostProcessor.kt index db328d358a9..5a1fd600bc1 100644 --- a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/audit/ExecutionTrackingMessageHandlerPostProcessor.kt +++ b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/audit/ExecutionTrackingMessageHandlerPostProcessor.kt @@ -48,17 +48,20 @@ class ExecutionTrackingMessageHandlerPostProcessor : BeanPostProcessor { is TaskLevel -> { MDC.put( Header.EXECUTION_ID.header, - "${message.executionId}:${message.stageId}:${message.taskId}") + "${message.executionId}:${message.stageId}:${message.taskId}" + ) } is StageLevel -> { MDC.put( Header.EXECUTION_ID.header, - "${message.executionId}:${message.stageId}") + "${message.executionId}:${message.stageId}" + ) } is ExecutionLevel -> { MDC.put( Header.EXECUTION_ID.header, - message.executionId) + message.executionId + ) } } diff --git a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/AuthenticationAware.kt b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/AuthenticationAware.kt index 5262f183610..c8971ac155a 100644 --- a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/AuthenticationAware.kt +++ b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/AuthenticationAware.kt @@ -39,15 +39,17 @@ interface AuthenticationAware { } try { - ExecutionContext.set(ExecutionContext( - execution.application, - currentUser.username, - execution.type.name.toLowerCase(), - execution.id, - this.id, - execution.origin, - this.startTime - )) + ExecutionContext.set( + ExecutionContext( + execution.application, + currentUser.username, + execution.type.name.toLowerCase(), + execution.id, + this.id, + execution.origin, + this.startTime + ) + ) AuthenticatedRequest.propagate(block, false, currentUser).call() } finally { ExecutionContext.clear() diff --git a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/CompleteExecutionHandler.kt b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/CompleteExecutionHandler.kt index 5c09d457a82..786c8c6c546 100644 --- a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/CompleteExecutionHandler.kt +++ b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/CompleteExecutionHandler.kt @@ -66,12 +66,14 @@ class CompleteExecutionHandler( publisher.publishEvent( ExecutionComplete(this, message.executionType, message.executionId, status) ) - registry.counter(completedId.withTags( - "status", status.name, - "executionType", execution.type.name, - "application", execution.application, - "origin", execution.origin ?: "unknown" - )).increment() + registry.counter( + completedId.withTags( + "status", status.name, + "executionType", execution.type.name, + "application", execution.application, + "origin", execution.origin ?: "unknown" + ) + ).increment() if (status != SUCCEEDED) { execution.topLevelStages.filter { it.status == RUNNING }.forEach { queue.push(CancelStage(it)) diff --git a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/CompleteStageHandler.kt b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/CompleteStageHandler.kt index c6e2b4fd37b..40b995a0f07 100644 --- a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/CompleteStageHandler.kt +++ b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/CompleteStageHandler.kt @@ -86,8 +86,10 @@ class CompleteStageHandler( if (stage.status in setOf(RUNNING, NOT_STARTED)) { var status = stage.determineStatus() if (stage.shouldFailOnFailedExpressionEvaluation()) { - log.warn("Stage ${stage.id} (${stage.type}) of ${stage.execution.id} " + - "is set to fail because of failed expressions.") + log.warn( + "Stage ${stage.id} (${stage.type}) of ${stage.execution.id} " + + "is set to fail because of failed expressions." + ) status = TERMINAL } diff --git a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/CompleteTaskHandler.kt b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/CompleteTaskHandler.kt index efccc354f40..865d357644b 100644 --- a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/CompleteTaskHandler.kt +++ b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/CompleteTaskHandler.kt @@ -128,7 +128,8 @@ class CompleteTaskHandler( "task.completions.duration" to commonTags + BasicTag("application", stage.execution.application), "task.completions.duration.withType" to commonTags + detailedTags ).forEach { - name, tags -> registry.timer(name, tags).record(elapsedMillis, TimeUnit.MILLISECONDS) + name, tags -> + registry.timer(name, tags).record(elapsedMillis, TimeUnit.MILLISECONDS) } } } diff --git a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/ExpressionAware.kt b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/ExpressionAware.kt index a291de83c83..87448f46845 100644 --- a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/ExpressionAware.kt +++ b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/ExpressionAware.kt @@ -145,12 +145,15 @@ interface ExpressionAware { } if (shouldContinueProcessing) { - return StageContext(stage, contextParameterProcessor.process( - stage.context, - contextParameterProcessor.buildExecutionContext(stage), - true, - summary - )) + return StageContext( + stage, + contextParameterProcessor.process( + stage.context, + contextParameterProcessor.buildExecutionContext(stage), + true, + summary + ) + ) } return StageContext(stage, stage.context) diff --git a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/RescheduleExecutionHandler.kt b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/RescheduleExecutionHandler.kt index 3d7d5150952..2fa44321a71 100644 --- a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/RescheduleExecutionHandler.kt +++ b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/RescheduleExecutionHandler.kt @@ -43,11 +43,14 @@ class RescheduleExecutionHandler( stage.tasks .filter { it.status == ExecutionStatus.RUNNING } .forEach { - queue.reschedule(RunTask(message, - stage.id, - it.id, - taskResolver.getTaskClass(it.implementingClass) - )) + queue.reschedule( + RunTask( + message, + stage.id, + it.id, + taskResolver.getTaskClass(it.implementingClass) + ) + ) } } } diff --git a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/RunTaskHandler.kt b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/RunTaskHandler.kt index 33378debea9..1518e35e8ea 100644 --- a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/RunTaskHandler.kt +++ b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/RunTaskHandler.kt @@ -196,7 +196,7 @@ class RunTaskHandler( "task.invocations.duration.withType" to commonTags + detailedTags ).forEach { name, tags -> - registry.timer(name, tags).record(elapsedMillis, TimeUnit.MILLISECONDS) + registry.timer(name, tags).record(elapsedMillis, TimeUnit.MILLISECONDS) } } @@ -245,7 +245,8 @@ class RunTaskHandler( dynamicConfigService.getConfig( Long::class.java, "tasks.global.backOffPeriod", - dynamicBackOffPeriod) + dynamicBackOffPeriod + ) ) if (this is CloudProviderAware && hasCloudProvider(stage)) { @@ -349,12 +350,14 @@ class RunTaskHandler( ) = counter( createId("queue.task.timeouts") - .withTags(mapOf( - "executionType" to executionType.toString(), - "application" to application, - "stageType" to stageType, - "taskType" to taskType - )) + .withTags( + mapOf( + "executionType" to executionType.toString(), + "application" to application, + "stageType" to stageType, + "taskType" to taskType + ) + ) ) private fun PipelineExecution.pausedDurationRelativeTo(instant: Instant?): Duration { diff --git a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/StartExecutionHandler.kt b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/StartExecutionHandler.kt index ca632e1c29d..9d3d435da8f 100644 --- a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/StartExecutionHandler.kt +++ b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/handler/StartExecutionHandler.kt @@ -72,17 +72,21 @@ class StartExecutionHandler( private fun start(execution: PipelineExecution) { if (execution.isAfterStartTimeExpiry()) { - log.warn("Execution (type ${execution.type}, id {}, application: {}) start was canceled because" + - "start time would be after defined start time expiry (now: ${clock.millis()}, expiry: ${execution.startTimeExpiry})", + log.warn( + "Execution (type ${execution.type}, id {}, application: {}) start was canceled because" + + "start time would be after defined start time expiry (now: ${clock.millis()}, expiry: ${execution.startTimeExpiry})", value("executionId", execution.id), - value("application", execution.application)) - queue.push(CancelExecution( - execution.type, - execution.id, - execution.application, - "spinnaker", - "Could not begin execution before start time expiry" - )) + value("application", execution.application) + ) + queue.push( + CancelExecution( + execution.type, + execution.id, + execution.application, + "spinnaker", + "Could not begin execution before start time expiry" + ) + ) } else { val initialStages = execution.initialStages() if (initialStages.isEmpty()) { @@ -104,10 +108,12 @@ class StartExecutionHandler( queue.push(StartWaitingExecutions(it, purgeQueue = !execution.isKeepWaitingPipelines)) } } else { - log.warn("Execution (type: ${execution.type}, id: {}, status: ${execution.status}, application: {})" + - " cannot be started unless state is NOT_STARTED. Ignoring StartExecution message.", + log.warn( + "Execution (type: ${execution.type}, id: {}, status: ${execution.status}, application: {})" + + " cannot be started unless state is NOT_STARTED. Ignoring StartExecution message.", value("executionId", execution.id), - value("application", execution.application)) + value("application", execution.application) + ) } } diff --git a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/metrics/MetricsTagHelper.kt b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/metrics/MetricsTagHelper.kt index 4056af2b6aa..064c1c1d9e4 100644 --- a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/metrics/MetricsTagHelper.kt +++ b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/metrics/MetricsTagHelper.kt @@ -41,9 +41,13 @@ class MetricsTagHelper : CloudProviderAware { BasicTag("account", helper.getCredentials(stage).valueOrNa()), // sorting regions to reduce the metrics cardinality - BasicTag("region", helper.getRegions(stage).let { - if (it.isEmpty()) { "n_a" } else { it.sorted().joinToString(",") } - })) + BasicTag( + "region", + helper.getRegions(stage).let { + if (it.isEmpty()) { "n_a" } else { it.sorted().joinToString(",") } + } + ) + ) private fun String?.valueOrNa(): String { return if (this == null || isBlank()) { diff --git a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/metrics/ZombieExecutionCheckingAgent.kt b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/metrics/ZombieExecutionCheckingAgent.kt index dd54653d0c1..3b770f0d055 100644 --- a/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/metrics/ZombieExecutionCheckingAgent.kt +++ b/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/metrics/ZombieExecutionCheckingAgent.kt @@ -50,7 +50,8 @@ import rx.schedulers.Schedulers */ @Component @ConditionalOnExpression( - "\${queue.zombie-check.enabled:false}") + "\${queue.zombie-check.enabled:false}" +) @ConditionalOnBean(MonitorableQueue::class) class ZombieExecutionCheckingAgent @Autowired constructor( diff --git a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/admin/HydrateQueueCommandTest.kt b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/admin/HydrateQueueCommandTest.kt index 80534c3d6f8..c6a3906ef0b 100644 --- a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/admin/HydrateQueueCommandTest.kt +++ b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/admin/HydrateQueueCommandTest.kt @@ -118,11 +118,13 @@ object HydrateQueueCommandTest : SubjectSpek({ afterGroup(::resetMocks) on("invoking") { - subject.invoke(HydrateQueueInput( - start = Instant.ofEpochMilli(1500002000), - end = Instant.ofEpochMilli(1500004000), - dryRun = false - )) + subject.invoke( + HydrateQueueInput( + start = Instant.ofEpochMilli(1500002000), + end = Instant.ofEpochMilli(1500004000), + dryRun = false + ) + ) it("does nothing") { verifyZeroInteractions(queue) @@ -180,9 +182,11 @@ object HydrateQueueCommandTest : SubjectSpek({ subject.invoke(HydrateQueueInput(dryRun = false)) it("adds messages to the queue") { - verify(queue, times(1)).push(check { - assertThat(it.stageId).isEqualTo(pipeline.stageByRef("1").id) - }) + verify(queue, times(1)).push( + check { + assertThat(it.stageId).isEqualTo(pipeline.stageByRef("1").id) + } + ) verifyNoMoreInteractions(queue) } } @@ -390,10 +394,12 @@ object HydrateQueueCommandTest : SubjectSpek({ subject.invoke(HydrateQueueInput(dryRun = false)) it("adds messages to the queue") { - verify(queue, times(1)).push(check { - assertThat(it.stageId).isEqualTo(pipeline.stageByRef("1").id) - assertThat(it.taskId).isEqualTo(pipeline.stageByRef("1").taskById("t1").id) - }) + verify(queue, times(1)).push( + check { + assertThat(it.stageId).isEqualTo(pipeline.stageByRef("1").id) + assertThat(it.taskId).isEqualTo(pipeline.stageByRef("1").taskById("t1").id) + } + ) verifyNoMoreInteractions(queue) } } @@ -425,9 +431,11 @@ object HydrateQueueCommandTest : SubjectSpek({ subject.invoke(HydrateQueueInput(dryRun = false)) it("adds messages to the queue") { - verify(queue, times(1)).push(check { - assertThat(it.stageId).isEqualTo(pipeline.stageByRef("1").id) - }) + verify(queue, times(1)).push( + check { + assertThat(it.stageId).isEqualTo(pipeline.stageByRef("1").id) + } + ) verifyNoMoreInteractions(queue) } } diff --git a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/AbortStageHandlerTest.kt b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/AbortStageHandlerTest.kt index 6806edfa3cc..9e804f739a0 100644 --- a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/AbortStageHandlerTest.kt +++ b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/AbortStageHandlerTest.kt @@ -117,10 +117,12 @@ object AbortStageHandlerTest : SubjectSpek({ } it("marks the stage as TERMINAL") { - verify(repository).storeStage(check { - assertThat(it.status).isEqualTo(TERMINAL) - assertThat(it.endTime).isEqualTo(clock.instant().toEpochMilli()) - }) + verify(repository).storeStage( + check { + assertThat(it.status).isEqualTo(TERMINAL) + assertThat(it.endTime).isEqualTo(clock.instant().toEpochMilli()) + } + ) } it("cancels the stage") { @@ -132,9 +134,11 @@ object AbortStageHandlerTest : SubjectSpek({ } it("emits an event") { - verify(publisher).publishEvent(check { - assertThat(it.status).isEqualTo(TERMINAL) - }) + verify(publisher).publishEvent( + check { + assertThat(it.status).isEqualTo(TERMINAL) + } + ) } } @@ -167,10 +171,12 @@ object AbortStageHandlerTest : SubjectSpek({ } it("marks the stage as TERMINAL") { - verify(repository).storeStage(check { - assertThat(it.status).isEqualTo(TERMINAL) - assertThat(it.endTime).isEqualTo(clock.instant().toEpochMilli()) - }) + verify(repository).storeStage( + check { + assertThat(it.status).isEqualTo(TERMINAL) + assertThat(it.endTime).isEqualTo(clock.instant().toEpochMilli()) + } + ) } it("cancels the stage") { @@ -182,9 +188,11 @@ object AbortStageHandlerTest : SubjectSpek({ } it("emits an event") { - verify(publisher).publishEvent(check { - assertThat(it.status).isEqualTo(TERMINAL) - }) + verify(publisher).publishEvent( + check { + assertThat(it.status).isEqualTo(TERMINAL) + } + ) } } } diff --git a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/CancelExecutionHandlerTest.kt b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/CancelExecutionHandlerTest.kt index 510f7cfba6b..8072a137f66 100644 --- a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/CancelExecutionHandlerTest.kt +++ b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/CancelExecutionHandlerTest.kt @@ -87,11 +87,13 @@ object CancelExecutionHandlerTest : SubjectSpek({ } it("publishes an execution complete event") { - verify(publisher).publishEvent(check { - assertThat(it.executionType).isEqualTo(pipeline.type) - assertThat(it.executionId).isEqualTo(pipeline.id) - assertThat(it.status).isEqualTo(CANCELED) - }) + verify(publisher).publishEvent( + check { + assertThat(it.executionType).isEqualTo(pipeline.type) + assertThat(it.executionId).isEqualTo(pipeline.id) + assertThat(it.status).isEqualTo(CANCELED) + } + ) } it("does not send any further messages") { diff --git a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/CompleteExecutionHandlerTest.kt b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/CompleteExecutionHandlerTest.kt index cf178237193..364e1f025af 100644 --- a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/CompleteExecutionHandlerTest.kt +++ b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/CompleteExecutionHandlerTest.kt @@ -95,11 +95,13 @@ object CompleteExecutionHandlerTest : SubjectSpek({ } it("publishes an event") { - verify(publisher).publishEvent(check { - assertThat(it.executionType).isEqualTo(pipeline.type) - assertThat(it.executionId).isEqualTo(pipeline.id) - assertThat(it.status).isEqualTo(stageStatus) - }) + verify(publisher).publishEvent( + check { + assertThat(it.executionType).isEqualTo(pipeline.type) + assertThat(it.executionId).isEqualTo(pipeline.id) + assertThat(it.status).isEqualTo(stageStatus) + } + ) } it("does not queue any other commands") { @@ -210,11 +212,13 @@ object CompleteExecutionHandlerTest : SubjectSpek({ } it("publishes an event") { - verify(publisher).publishEvent(check { - assertThat(it.executionType).isEqualTo(pipeline.type) - assertThat(it.executionId).isEqualTo(pipeline.id) - assertThat(it.status).isEqualTo(stageStatus) - }) + verify(publisher).publishEvent( + check { + assertThat(it.executionType).isEqualTo(pipeline.type) + assertThat(it.executionId).isEqualTo(pipeline.id) + assertThat(it.status).isEqualTo(stageStatus) + } + ) } it("cancels other stages") { @@ -259,11 +263,13 @@ object CompleteExecutionHandlerTest : SubjectSpek({ } it("publishes an event") { - verify(publisher).publishEvent(check { - assertThat(it.executionType).isEqualTo(pipeline.type) - assertThat(it.executionId).isEqualTo(pipeline.id) - assertThat(it.status).isEqualTo(TERMINAL) - }) + verify(publisher).publishEvent( + check { + assertThat(it.executionType).isEqualTo(pipeline.type) + assertThat(it.executionId).isEqualTo(pipeline.id) + assertThat(it.status).isEqualTo(TERMINAL) + } + ) } it("does not queue any other commands") { @@ -305,11 +311,13 @@ object CompleteExecutionHandlerTest : SubjectSpek({ } it("publishes an event") { - verify(publisher).publishEvent(check { - assertThat(it.executionType).isEqualTo(pipeline.type) - assertThat(it.executionId).isEqualTo(pipeline.id) - assertThat(it.status).isEqualTo(SUCCEEDED) - }) + verify(publisher).publishEvent( + check { + assertThat(it.executionType).isEqualTo(pipeline.type) + assertThat(it.executionId).isEqualTo(pipeline.id) + assertThat(it.status).isEqualTo(SUCCEEDED) + } + ) } it("does not queue any other commands") { diff --git a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/CompleteStageHandlerTest.kt b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/CompleteStageHandlerTest.kt index 8053802d996..55b6bed6b8d 100644 --- a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/CompleteStageHandlerTest.kt +++ b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/CompleteStageHandlerTest.kt @@ -261,10 +261,12 @@ object CompleteStageHandlerTest : SubjectSpek({ } it("updates the stage state") { - verify(repository).storeStage(check { - assertThat(it.status).isEqualTo(taskStatus) - assertThat(it.endTime).isEqualTo(clock.millis()) - }) + verify(repository).storeStage( + check { + assertThat(it.status).isEqualTo(taskStatus) + assertThat(it.endTime).isEqualTo(clock.millis()) + } + ) } it("completes the execution") { @@ -276,12 +278,14 @@ object CompleteStageHandlerTest : SubjectSpek({ } it("publishes an event") { - verify(publisher).publishEvent(check { - assertThat(it.executionType).isEqualTo(pipeline.type) - assertThat(it.executionId).isEqualTo(pipeline.id) - assertThat(it.stageId).isEqualTo(message.stageId) - assertThat(it.status).isEqualTo(taskStatus) - }) + verify(publisher).publishEvent( + check { + assertThat(it.executionType).isEqualTo(pipeline.type) + assertThat(it.executionId).isEqualTo(pipeline.id) + assertThat(it.stageId).isEqualTo(message.stageId) + assertThat(it.status).isEqualTo(taskStatus) + } + ) } } @@ -313,19 +317,23 @@ object CompleteStageHandlerTest : SubjectSpek({ } it("updates the stage state") { - verify(repository).storeStage(check { - assertThat(it.status).isEqualTo(taskStatus) - assertThat(it.endTime).isEqualTo(clock.millis()) - }) + verify(repository).storeStage( + check { + assertThat(it.status).isEqualTo(taskStatus) + assertThat(it.endTime).isEqualTo(clock.millis()) + } + ) } it("runs the next stage") { - verify(queue).push(StartStage( - message.executionType, - message.executionId, - message.application, - pipeline.stages.last().id - )) + verify(queue).push( + StartStage( + message.executionType, + message.executionId, + message.application, + pipeline.stages.last().id + ) + ) } it("does not run any tasks") { @@ -556,10 +564,12 @@ object CompleteStageHandlerTest : SubjectSpek({ } it("just marks the stage as SKIPPED") { - verify(repository).storeStage(check { - assertThat(it.id).isEqualTo(message.stageId) - assertThat(it.status).isEqualTo(SKIPPED) - }) + verify(repository).storeStage( + check { + assertThat(it.id).isEqualTo(message.stageId) + assertThat(it.status).isEqualTo(SKIPPED) + } + ) } it("starts anything downstream") { @@ -598,10 +608,12 @@ object CompleteStageHandlerTest : SubjectSpek({ } it("updates the stage state") { - verify(repository).storeStage(check { - assertThat(it.status).isEqualTo(taskStatus) - assertThat(it.endTime).isEqualTo(clock.millis()) - }) + verify(repository).storeStage( + check { + assertThat(it.status).isEqualTo(taskStatus) + assertThat(it.endTime).isEqualTo(clock.millis()) + } + ) } it("does not run any downstream stages") { @@ -609,11 +621,13 @@ object CompleteStageHandlerTest : SubjectSpek({ } it("fails the execution") { - verify(queue).push(CompleteExecution( - message.executionType, - message.executionId, - message.application - )) + verify(queue).push( + CompleteExecution( + message.executionType, + message.executionId, + message.application + ) + ) } it("runs the stage's cancellation routine") { @@ -621,12 +635,14 @@ object CompleteStageHandlerTest : SubjectSpek({ } it("publishes an event") { - verify(publisher).publishEvent(check { - assertThat(it.executionType).isEqualTo(pipeline.type) - assertThat(it.executionId).isEqualTo(pipeline.id) - assertThat(it.stageId).isEqualTo(message.stageId) - assertThat(it.status).isEqualTo(taskStatus) - }) + verify(publisher).publishEvent( + check { + assertThat(it.executionType).isEqualTo(pipeline.type) + assertThat(it.executionId).isEqualTo(pipeline.id) + assertThat(it.stageId).isEqualTo(message.stageId) + assertThat(it.status).isEqualTo(taskStatus) + } + ) } } } @@ -661,10 +677,12 @@ object CompleteStageHandlerTest : SubjectSpek({ } it("updates the stage state") { - verify(repository).storeStage(check { - assertThat(it.status).isEqualTo(TERMINAL) - assertThat(it.endTime).isEqualTo(clock.millis()) - }) + verify(repository).storeStage( + check { + assertThat(it.status).isEqualTo(TERMINAL) + assertThat(it.endTime).isEqualTo(clock.millis()) + } + ) } it("does not run any downstream stages") { @@ -672,11 +690,13 @@ object CompleteStageHandlerTest : SubjectSpek({ } it("fails the execution") { - verify(queue).push(CompleteExecution( - message.executionType, - message.executionId, - message.application - )) + verify(queue).push( + CompleteExecution( + message.executionType, + message.executionId, + message.application + ) + ) } it("runs the stage's cancellation routine") { @@ -684,12 +704,14 @@ object CompleteStageHandlerTest : SubjectSpek({ } it("publishes an event") { - verify(publisher).publishEvent(check { - assertThat(it.executionType).isEqualTo(pipeline.type) - assertThat(it.executionId).isEqualTo(pipeline.id) - assertThat(it.stageId).isEqualTo(message.stageId) - assertThat(it.status).isEqualTo(TERMINAL) - }) + verify(publisher).publishEvent( + check { + assertThat(it.executionType).isEqualTo(pipeline.type) + assertThat(it.executionId).isEqualTo(pipeline.id) + assertThat(it.stageId).isEqualTo(message.stageId) + assertThat(it.status).isEqualTo(TERMINAL) + } + ) } } @@ -773,10 +795,12 @@ object CompleteStageHandlerTest : SubjectSpek({ } it("updates the stage state") { - verify(repository).storeStage(check { - assertThat(it.status).isEqualTo(failureStatus) - assertThat(it.endTime).isEqualTo(clock.millis()) - }) + verify(repository).storeStage( + check { + assertThat(it.status).isEqualTo(failureStatus) + assertThat(it.endTime).isEqualTo(clock.millis()) + } + ) } } } @@ -813,10 +837,12 @@ object CompleteStageHandlerTest : SubjectSpek({ } it("updates the stage state") { - verify(repository).storeStage(check { - assertThat(it.status).isEqualTo(FAILED_CONTINUE) - assertThat(it.endTime).isEqualTo(clock.millis()) - }) + verify(repository).storeStage( + check { + assertThat(it.status).isEqualTo(FAILED_CONTINUE) + assertThat(it.endTime).isEqualTo(clock.millis()) + } + ) } it("does not do anything silly like running the after stage again") { @@ -946,9 +972,11 @@ object CompleteStageHandlerTest : SubjectSpek({ } it("runs the next synthetic stage") { - verify(queue).push(StartStage( - pipeline.stageByRef("1<2") - )) + verify(queue).push( + StartStage( + pipeline.stageByRef("1<2") + ) + ) } } @@ -972,10 +1000,13 @@ object CompleteStageHandlerTest : SubjectSpek({ } it("signals the parent stage to run") { - verify(queue).ensure(ContinueParentStage( - pipeline.stageByRef("1"), - STAGE_BEFORE - ), ZERO) + verify(queue).ensure( + ContinueParentStage( + pipeline.stageByRef("1"), + STAGE_BEFORE + ), + ZERO + ) } } } @@ -1011,12 +1042,14 @@ object CompleteStageHandlerTest : SubjectSpek({ } it("runs the next synthetic stage") { - verify(queue).push(StartStage( - message.executionType, - message.executionId, - message.application, - pipeline.stages.last().id - )) + verify(queue).push( + StartStage( + message.executionType, + message.executionId, + message.application, + pipeline.stages.last().id + ) + ) } } @@ -1041,10 +1074,13 @@ object CompleteStageHandlerTest : SubjectSpek({ it("tells the parent stage to continue") { verify(queue) - .ensure(ContinueParentStage( - pipeline.stageById(message.stageId).parent!!, - STAGE_AFTER - ), ZERO) + .ensure( + ContinueParentStage( + pipeline.stageById(message.stageId).parent!!, + STAGE_AFTER + ), + ZERO + ) } } } diff --git a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/CompleteTaskHandlerTest.kt b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/CompleteTaskHandlerTest.kt index 80360bcf277..b3fb7e9cbe5 100644 --- a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/CompleteTaskHandlerTest.kt +++ b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/CompleteTaskHandlerTest.kt @@ -109,33 +109,39 @@ object CompleteTaskHandlerTest : SubjectSpek({ } it("updates the task state in the stage") { - verify(repository).storeStage(check { - it.tasks.first().apply { - assertThat(status).isEqualTo(successfulStatus) - assertThat(endTime).isEqualTo(clock.millis()) + verify(repository).storeStage( + check { + it.tasks.first().apply { + assertThat(status).isEqualTo(successfulStatus) + assertThat(endTime).isEqualTo(clock.millis()) + } } - }) + ) } it("runs the next task") { verify(queue) - .push(StartTask( - message.executionType, - message.executionId, - message.application, - message.stageId, - "2" - )) + .push( + StartTask( + message.executionType, + message.executionId, + message.application, + message.stageId, + "2" + ) + ) } it("publishes an event") { - verify(publisher).publishEvent(check { - assertThat(it.executionType).isEqualTo(pipeline.type) - assertThat(it.executionId).isEqualTo(pipeline.id) - assertThat(it.stageId).isEqualTo(message.stageId) - assertThat(it.taskId).isEqualTo(message.taskId) - assertThat(it.status).isEqualTo(successfulStatus) - }) + verify(publisher).publishEvent( + check { + assertThat(it.executionType).isEqualTo(pipeline.type) + assertThat(it.executionId).isEqualTo(pipeline.id) + assertThat(it.stageId).isEqualTo(message.stageId) + assertThat(it.taskId).isEqualTo(message.taskId) + assertThat(it.status).isEqualTo(successfulStatus) + } + ) } } @@ -167,22 +173,26 @@ object CompleteTaskHandlerTest : SubjectSpek({ } it("updates the task state in the stage") { - verify(repository).storeStage(check { - it.tasks.last().apply { - assertThat(status).isEqualTo(SUCCEEDED) - assertThat(endTime).isEqualTo(clock.millis()) + verify(repository).storeStage( + check { + it.tasks.last().apply { + assertThat(status).isEqualTo(SUCCEEDED) + assertThat(endTime).isEqualTo(clock.millis()) + } } - }) + ) } it("emits an event to signal the stage is complete") { verify(queue) - .push(CompleteStage( - message.executionType, - message.executionId, - message.application, - message.stageId - )) + .push( + CompleteStage( + message.executionType, + message.executionId, + message.application, + message.stageId + ) + ) } } @@ -223,15 +233,19 @@ object CompleteTaskHandlerTest : SubjectSpek({ } it("repeats the loop") { - verify(queue).push(check { - assertThat(it.taskId).isEqualTo("2") - }) + verify(queue).push( + check { + assertThat(it.taskId).isEqualTo("2") + } + ) } it("resets the status of the loop tasks") { - verify(repository).storeStage(check { - assertThat(it.tasks[1..3].map(TaskExecution::getStatus)).allMatch { it == NOT_STARTED } - }) + verify(repository).storeStage( + check { + assertThat(it.tasks[1..3].map(TaskExecution::getStatus)).allMatch { it == NOT_STARTED } + } + ) } it("does not publish an event") { @@ -271,21 +285,25 @@ object CompleteTaskHandlerTest : SubjectSpek({ } it("updates the task state in the stage") { - verify(repository).storeStage(check { - it.tasks.first().apply { - assertThat(status).isEqualTo(status) - assertThat(endTime).isEqualTo(clock.millis()) + verify(repository).storeStage( + check { + it.tasks.first().apply { + assertThat(status).isEqualTo(status) + assertThat(endTime).isEqualTo(clock.millis()) + } } - }) + ) } it("fails the stage") { - verify(queue).push(CompleteStage( - message.executionType, - message.executionId, - message.application, - message.stageId - )) + verify(queue).push( + CompleteStage( + message.executionType, + message.executionId, + message.application, + message.stageId + ) + ) } it("does not run the next task") { @@ -293,13 +311,15 @@ object CompleteTaskHandlerTest : SubjectSpek({ } it("publishes an event") { - verify(publisher).publishEvent(check { - assertThat(it.executionType).isEqualTo(pipeline.type) - assertThat(it.executionId).isEqualTo(pipeline.id) - assertThat(it.stageId).isEqualTo(message.stageId) - assertThat(it.taskId).isEqualTo(message.taskId) - assertThat(it.status).isEqualTo(status) - }) + verify(publisher).publishEvent( + check { + assertThat(it.executionType).isEqualTo(pipeline.type) + assertThat(it.executionId).isEqualTo(pipeline.id) + assertThat(it.stageId).isEqualTo(message.stageId) + assertThat(it.taskId).isEqualTo(message.taskId) + assertThat(it.status).isEqualTo(status) + } + ) } } } diff --git a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/PauseStageHandlerTest.kt b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/PauseStageHandlerTest.kt index 3066d03aa34..c1ba2db49d2 100644 --- a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/PauseStageHandlerTest.kt +++ b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/PauseStageHandlerTest.kt @@ -78,10 +78,12 @@ object PauseStageHandlerTest : SubjectSpek({ } it("updates the stage state") { - verify(repository).storeStage(check { - assertThat(it.status).isEqualTo(PAUSED) - assertThat(it.endTime).isNull() - }) + verify(repository).storeStage( + check { + assertThat(it.status).isEqualTo(PAUSED) + assertThat(it.endTime).isNull() + } + ) } it("does not take any further action") { diff --git a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/PauseTaskHandlerTest.kt b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/PauseTaskHandlerTest.kt index 87defa3b42a..eb0db60931e 100644 --- a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/PauseTaskHandlerTest.kt +++ b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/PauseTaskHandlerTest.kt @@ -70,12 +70,14 @@ object PauseTaskHandlerTest : SubjectSpek({ } it("updates the task state in the stage") { - verify(repository).storeStage(check { - it.tasks.first().apply { - assertThat(status).isEqualTo(PAUSED) - assertThat(endTime).isNull() + verify(repository).storeStage( + check { + it.tasks.first().apply { + assertThat(status).isEqualTo(PAUSED) + assertThat(endTime).isNull() + } } - }) + ) } it("pauses the stage") { diff --git a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/RestartStageHandlerTest.kt b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/RestartStageHandlerTest.kt index cbdf7ce0905..fa7380cc0cd 100644 --- a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/RestartStageHandlerTest.kt +++ b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/RestartStageHandlerTest.kt @@ -192,29 +192,37 @@ object RestartStageHandlerTest : SubjectSpek({ } it("resets the stage's status") { - verify(repository).storeStage(check { - assertThat(it.id).isEqualTo(message.stageId) - assertThat(it.status).isEqualTo(NOT_STARTED) - assertThat(it.startTime).isNull() - assertThat(it.endTime).isNull() - }) + verify(repository).storeStage( + check { + assertThat(it.id).isEqualTo(message.stageId) + assertThat(it.status).isEqualTo(NOT_STARTED) + assertThat(it.startTime).isNull() + assertThat(it.endTime).isNull() + } + ) } it("removes the stage's tasks") { - verify(repository).storeStage(check { - assertThat(it.tasks).isEmpty() - }) + verify(repository).storeStage( + check { + assertThat(it.tasks).isEmpty() + } + ) } it("adds restart details to the stage context") { - verify(repository).storeStage(check { - assertThat(it.context.keys).doesNotContain("exception") - assertThat(it.context["restartDetails"]).isEqualTo(mapOf( - "restartedBy" to "fzlem@netflix.com", - "restartTime" to clock.millis(), - "previousException" to "o noes" - )) - }) + verify(repository).storeStage( + check { + assertThat(it.context.keys).doesNotContain("exception") + assertThat(it.context["restartDetails"]).isEqualTo( + mapOf( + "restartedBy" to "fzlem@netflix.com", + "restartTime" to clock.millis(), + "previousException" to "o noes" + ) + ) + } + ) } it("removes the stage's synthetic stages") { @@ -257,12 +265,14 @@ object RestartStageHandlerTest : SubjectSpek({ } it("runs the stage") { - verify(queue).push(check { - assertThat(it.executionType).isEqualTo(message.executionType) - assertThat(it.executionId).isEqualTo(message.executionId) - assertThat(it.application).isEqualTo(message.application) - assertThat(it.stageId).isEqualTo(message.stageId) - }) + verify(queue).push( + check { + assertThat(it.executionType).isEqualTo(message.executionType) + assertThat(it.executionId).isEqualTo(message.executionId) + assertThat(it.application).isEqualTo(message.application) + assertThat(it.stageId).isEqualTo(message.stageId) + } + ) } } } @@ -437,14 +447,16 @@ object RestartStageHandlerTest : SubjectSpek({ } it("runs the parent stage") { - verify(queue).push(check { - assertThat(it.stageId).isEqualTo(pipeline.stageByRef("1").id) - assertThat(it.stageId).isNotEqualTo(syntheticStage.id) - assertThat(it.stageId).isNotEqualTo(message.stageId) - assertThat(it.executionType).isEqualTo(message.executionType) - assertThat(it.executionId).isEqualTo(message.executionId) - assertThat(it.application).isEqualTo(message.application) - }) + verify(queue).push( + check { + assertThat(it.stageId).isEqualTo(pipeline.stageByRef("1").id) + assertThat(it.stageId).isNotEqualTo(syntheticStage.id) + assertThat(it.stageId).isNotEqualTo(message.stageId) + assertThat(it.executionType).isEqualTo(message.executionType) + assertThat(it.executionId).isEqualTo(message.executionId) + assertThat(it.application).isEqualTo(message.application) + } + ) } } }) diff --git a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/ResumeStageHandlerTest.kt b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/ResumeStageHandlerTest.kt index 0901f213fb1..c31c9978c65 100644 --- a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/ResumeStageHandlerTest.kt +++ b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/ResumeStageHandlerTest.kt @@ -86,10 +86,12 @@ object ResumeStageHandlerTest : SubjectSpek({ } it("sets the stage status to running") { - verify(repository).storeStage(check { - assertThat(it.id).isEqualTo(message.stageId) - assertThat(it.status).isEqualTo(RUNNING) - }) + verify(repository).storeStage( + check { + assertThat(it.id).isEqualTo(message.stageId) + assertThat(it.status).isEqualTo(RUNNING) + } + ) } it("resumes all paused tasks") { diff --git a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/ResumeTaskHandlerTest.kt b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/ResumeTaskHandlerTest.kt index 3335a05bc17..9d7dd2e31ee 100644 --- a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/ResumeTaskHandlerTest.kt +++ b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/ResumeTaskHandlerTest.kt @@ -79,10 +79,12 @@ object ResumeTaskHandlerTest : SubjectSpek({ } it("sets the stage status to running") { - verify(repository).storeStage(check { - assertThat(it.id).isEqualTo(message.stageId) - assertThat(it.tasks.first().status).isEqualTo(RUNNING) - }) + verify(repository).storeStage( + check { + assertThat(it.id).isEqualTo(message.stageId) + assertThat(it.tasks.first().status).isEqualTo(RUNNING) + } + ) } it("resumes all paused tasks") { diff --git a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/RunTaskHandlerTest.kt b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/RunTaskHandlerTest.kt index e8e89cffbe0..88813d461a5 100644 --- a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/RunTaskHandlerTest.kt +++ b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/RunTaskHandlerTest.kt @@ -169,9 +169,11 @@ object RunTaskHandlerTest : SubjectSpek({ } it("completes the task") { - verify(queue).push(check { - assertThat(it.status).isEqualTo(SUCCEEDED) - }) + verify(queue).push( + check { + assertThat(it.status).isEqualTo(SUCCEEDED) + } + ) } it("does not update the stage or global context") { @@ -198,9 +200,11 @@ object RunTaskHandlerTest : SubjectSpek({ } it("updates the stage context") { - verify(repository).storeStage(check { - assertThat(stageOutputs).isEqualTo(it.context) - }) + verify(repository).storeStage( + check { + assertThat(stageOutputs).isEqualTo(it.context) + } + ) } } @@ -223,9 +227,11 @@ object RunTaskHandlerTest : SubjectSpek({ } it("updates the stage outputs") { - verify(repository).storeStage(check { - assertThat(it.outputs).isEqualTo(outputs) - }) + verify(repository).storeStage( + check { + assertThat(it.outputs).isEqualTo(outputs) + } + ) } } @@ -251,11 +257,13 @@ object RunTaskHandlerTest : SubjectSpek({ } it("does not write stageTimeoutMs to outputs") { - verify(repository).storeStage(check { - assertThat(it.outputs) - .containsKey("foo") - .doesNotContainKey("stageTimeoutMs") - }) + verify(repository).storeStage( + check { + assertThat(it.outputs) + .containsKey("foo") + .doesNotContainKey("stageTimeoutMs") + } + ) } } } @@ -296,9 +304,11 @@ object RunTaskHandlerTest : SubjectSpek({ } it("completes the task") { - verify(queue).push(check { - assertThat(it.status).isEqualTo(SUCCEEDED) - }) + verify(queue).push( + check { + assertThat(it.status).isEqualTo(SUCCEEDED) + } + ) } it("does not update the stage or global context") { @@ -325,9 +335,11 @@ object RunTaskHandlerTest : SubjectSpek({ } it("updates the stage context") { - verify(repository).storeStage(check { - assertThat(stageOutputs).isEqualTo(it.context) - }) + verify(repository).storeStage( + check { + assertThat(stageOutputs).isEqualTo(it.context) + } + ) } } @@ -350,9 +362,11 @@ object RunTaskHandlerTest : SubjectSpek({ } it("updates the stage outputs") { - verify(repository).storeStage(check { - assertThat(it.outputs).isEqualTo(outputs) - }) + verify(repository).storeStage( + check { + assertThat(it.outputs).isEqualTo(outputs) + } + ) } } @@ -378,11 +392,13 @@ object RunTaskHandlerTest : SubjectSpek({ } it("does not write stageTimeoutMs to outputs") { - verify(repository).storeStage(check { - assertThat(it.outputs) - .containsKey("foo") - .doesNotContainKey("stageTimeoutMs") - }) + verify(repository).storeStage( + check { + assertThat(it.outputs) + .containsKey("foo") + .doesNotContainKey("stageTimeoutMs") + } + ) } } } @@ -457,9 +473,11 @@ object RunTaskHandlerTest : SubjectSpek({ } it("marks the task $taskStatus") { - verify(queue).push(check { - assertThat(it.status).isEqualTo(taskStatus) - }) + verify(queue).push( + check { + assertThat(it.status).isEqualTo(taskStatus) + } + ) } } @@ -482,9 +500,11 @@ object RunTaskHandlerTest : SubjectSpek({ } it("marks the task STOPPED") { - verify(queue).push(check { - assertThat(it.status).isEqualTo(STOPPED) - }) + verify(queue).push( + check { + assertThat(it.status).isEqualTo(STOPPED) + } + ) } } @@ -507,9 +527,11 @@ object RunTaskHandlerTest : SubjectSpek({ } it("marks the task FAILED_CONTINUE") { - verify(queue).push(check { - assertThat(it.status).isEqualTo(FAILED_CONTINUE) - }) + verify(queue).push( + check { + assertThat(it.status).isEqualTo(FAILED_CONTINUE) + } + ) } } } @@ -556,15 +578,19 @@ object RunTaskHandlerTest : SubjectSpek({ } it("marks the task as terminal") { - verify(queue).push(check { - assertThat(it.status).isEqualTo(TERMINAL) - }) + verify(queue).push( + check { + assertThat(it.status).isEqualTo(TERMINAL) + } + ) } it("attaches the exception to the stage context") { - verify(repository).storeStage(check { - assertThat(it.context["exception"]).isEqualTo(exceptionDetails) - }) + verify(repository).storeStage( + check { + assertThat(it.context["exception"]).isEqualTo(exceptionDetails) + } + ) } } @@ -590,9 +616,11 @@ object RunTaskHandlerTest : SubjectSpek({ } it("marks the task STOPPED") { - verify(queue).push(check { - assertThat(it.status).isEqualTo(STOPPED) - }) + verify(queue).push( + check { + assertThat(it.status).isEqualTo(STOPPED) + } + ) } } @@ -618,9 +646,11 @@ object RunTaskHandlerTest : SubjectSpek({ } it("marks the task FAILED_CONTINUE") { - verify(queue).push(check { - assertThat(it.status).isEqualTo(FAILED_CONTINUE) - }) + verify(queue).push( + check { + assertThat(it.status).isEqualTo(FAILED_CONTINUE) + } + ) } } } @@ -682,15 +712,17 @@ object RunTaskHandlerTest : SubjectSpek({ } it("emits an event indicating that the task was canceled") { - verify(queue).push(CompleteTask( - message.executionType, - message.executionId, - "foo", - message.stageId, - message.taskId, - CANCELED, - CANCELED - )) + verify(queue).push( + CompleteTask( + message.executionType, + message.executionId, + "foo", + message.stageId, + message.taskId, + CANCELED, + CANCELED + ) + ) } it("does not execute the task") { @@ -728,15 +760,17 @@ object RunTaskHandlerTest : SubjectSpek({ } it("marks the task as canceled") { - verify(queue).push(CompleteTask( - message.executionType, - message.executionId, - "foo", - message.stageId, - message.taskId, - CANCELED, - CANCELED - )) + verify(queue).push( + CompleteTask( + message.executionType, + message.executionId, + "foo", + message.stageId, + message.taskId, + CANCELED, + CANCELED + ) + ) } it("it tries to cancel the task") { @@ -1478,9 +1512,11 @@ object RunTaskHandlerTest : SubjectSpek({ } it("parses the expression") { - verify(task).execute(check { - assertThat(it.context["expr"]).isEqualTo(expected) - }) + verify(task).execute( + check { + assertThat(it.context["expr"]).isEqualTo(expected) + } + ) } } } @@ -1523,9 +1559,11 @@ object RunTaskHandlerTest : SubjectSpek({ } it("evaluates the expression") { - verify(task).execute(check { - assertThat(it.context["expr"]).isEqualTo(expected) - }) + verify(task).execute( + check { + assertThat(it.context["expr"]).isEqualTo(expected) + } + ) } } } @@ -1577,9 +1615,11 @@ object RunTaskHandlerTest : SubjectSpek({ } it("resolves deployed server groups") { - verify(task).execute(check { - assertThat(it.context["command"]).isEqualTo("serverGroupDetails.groovy mgmttest us-west-1 spindemo-test-v008") - }) + verify(task).execute( + check { + assertThat(it.context["command"]).isEqualTo("serverGroupDetails.groovy mgmttest us-west-1 spindemo-test-v008") + } + ) } } @@ -1617,9 +1657,11 @@ object RunTaskHandlerTest : SubjectSpek({ } it("does not overwrite the stage's parameters with the pipeline's") { - verify(task).execute(check { - assertThat(it.context["parameters"]).isEqualTo(mapOf("message" to "o hai")) - }) + verify(task).execute( + check { + assertThat(it.context["parameters"]).isEqualTo(mapOf("message" to "o hai")) + } + ) } } @@ -1659,9 +1701,11 @@ object RunTaskHandlerTest : SubjectSpek({ } it("passes the decoded expression to the task") { - verify(task).execute(check { - assertThat(it.context["expression"]).isEqualTo("bar") - }) + verify(task).execute( + check { + assertThat(it.context["expression"]).isEqualTo("bar") + } + ) } } } diff --git a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/SkipStageHandlerTest.kt b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/SkipStageHandlerTest.kt index bc266f15327..a6ed8796940 100644 --- a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/SkipStageHandlerTest.kt +++ b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/SkipStageHandlerTest.kt @@ -118,10 +118,12 @@ object SkipStageHandlerTest : SubjectSpek({ } it("updates the stage state") { - verify(repository).storeStage(check { - assertThat(it.status).isEqualTo(SKIPPED) - assertThat(it.endTime).isEqualTo(clock.millis()) - }) + verify(repository).storeStage( + check { + assertThat(it.status).isEqualTo(SKIPPED) + assertThat(it.endTime).isEqualTo(clock.millis()) + } + ) } it("completes the execution") { @@ -133,12 +135,14 @@ object SkipStageHandlerTest : SubjectSpek({ } it("publishes an event") { - verify(publisher).publishEvent(check { - assertThat(it.executionType).isEqualTo(pipeline.type) - assertThat(it.executionId).isEqualTo(pipeline.id) - assertThat(it.stageId).isEqualTo(message.stageId) - assertThat(it.status).isEqualTo(SKIPPED) - }) + verify(publisher).publishEvent( + check { + assertThat(it.executionType).isEqualTo(pipeline.type) + assertThat(it.executionId).isEqualTo(pipeline.id) + assertThat(it.stageId).isEqualTo(message.stageId) + assertThat(it.status).isEqualTo(SKIPPED) + } + ) } } @@ -169,19 +173,23 @@ object SkipStageHandlerTest : SubjectSpek({ } it("updates the stage state") { - verify(repository).storeStage(check { - assertThat(it.status).isEqualTo(SKIPPED) - assertThat(it.endTime).isEqualTo(clock.millis()) - }) + verify(repository).storeStage( + check { + assertThat(it.status).isEqualTo(SKIPPED) + assertThat(it.endTime).isEqualTo(clock.millis()) + } + ) } it("runs the next stage") { - verify(queue).push(StartStage( - message.executionType, - message.executionId, - "foo", - pipeline.stages.last().id - )) + verify(queue).push( + StartStage( + message.executionType, + message.executionId, + "foo", + pipeline.stages.last().id + ) + ) } it("does not run any tasks") { diff --git a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/StartExecutionHandlerTest.kt b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/StartExecutionHandlerTest.kt index eb9a72a3ef7..20cbe098dff 100644 --- a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/StartExecutionHandlerTest.kt +++ b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/StartExecutionHandlerTest.kt @@ -101,10 +101,12 @@ object StartExecutionHandlerTest : SubjectSpek({ } it("publishes an event") { - verify(publisher).publishEvent(check { - assertThat(it.executionType).isEqualTo(message.executionType) - assertThat(it.executionId).isEqualTo(message.executionId) - }) + verify(publisher).publishEvent( + check { + assertThat(it.executionType).isEqualTo(message.executionType) + assertThat(it.executionId).isEqualTo(message.executionId) + } + ) } } @@ -129,11 +131,13 @@ object StartExecutionHandlerTest : SubjectSpek({ } it("publishes an event") { - verify(publisher).publishEvent(check { - assertThat(it.executionType).isEqualTo(message.executionType) - assertThat(it.executionId).isEqualTo(message.executionId) - assertThat(it.status).isEqualTo(CANCELED) - }) + verify(publisher).publishEvent( + check { + assertThat(it.executionType).isEqualTo(message.executionType) + assertThat(it.executionId).isEqualTo(message.executionId) + assertThat(it.status).isEqualTo(CANCELED) + } + ) } it("pushes no messages to the queue") { @@ -162,11 +166,13 @@ object StartExecutionHandlerTest : SubjectSpek({ } it("publishes an event") { - verify(publisher).publishEvent(check { - assertThat(it.executionType).isEqualTo(message.executionType) - assertThat(it.executionId).isEqualTo(message.executionId) - assertThat(it.status).isEqualTo(NOT_STARTED) - }) + verify(publisher).publishEvent( + check { + assertThat(it.executionType).isEqualTo(message.executionType) + assertThat(it.executionId).isEqualTo(message.executionId) + assertThat(it.status).isEqualTo(NOT_STARTED) + } + ) } it("pushes no messages to the queue") { @@ -260,11 +266,13 @@ object StartExecutionHandlerTest : SubjectSpek({ } it("publishes an event with TERMINAL status") { - verify(publisher).publishEvent(check { - assertThat(it.executionType).isEqualTo(message.executionType) - assertThat(it.executionId).isEqualTo(message.executionId) - assertThat(it.status).isEqualTo(TERMINAL) - }) + verify(publisher).publishEvent( + check { + assertThat(it.executionType).isEqualTo(message.executionType) + assertThat(it.executionId).isEqualTo(message.executionId) + assertThat(it.status).isEqualTo(TERMINAL) + } + ) } } @@ -288,11 +296,13 @@ object StartExecutionHandlerTest : SubjectSpek({ } it("cancels the execution") { - verify(queue).push(CancelExecution( - pipeline, - "spinnaker", - "Could not begin execution before start time expiry" - )) + verify(queue).push( + CancelExecution( + pipeline, + "spinnaker", + "Could not begin execution before start time expiry" + ) + ) } } diff --git a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/StartStageHandlerTest.kt b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/StartStageHandlerTest.kt index 4da3766521b..e5003d2c86f 100644 --- a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/StartStageHandlerTest.kt +++ b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/StartStageHandlerTest.kt @@ -172,23 +172,27 @@ object StartStageHandlerTest : SubjectSpek({ } it("updates the stage status") { - verify(repository, times(2)).storeStage(check { - assertThat(it.status).isEqualTo(RUNNING) - assertThat(it.startTime).isEqualTo(clock.millis()) - }) + verify(repository, times(2)).storeStage( + check { + assertThat(it.status).isEqualTo(RUNNING) + assertThat(it.startTime).isEqualTo(clock.millis()) + } + ) } it("attaches tasks to the stage") { - verify(repository, times(2)).storeStage(check { - assertThat(it.tasks.size).isEqualTo(1) - it.tasks.first().apply { - assertThat(id).isEqualTo("1") - assertThat(name).isEqualTo("dummy") - assertThat(implementingClass).isEqualTo(DummyTask::class.java.name) - assertThat(isStageStart).isEqualTo(true) - assertThat(isStageEnd).isEqualTo(true) + verify(repository, times(2)).storeStage( + check { + assertThat(it.tasks.size).isEqualTo(1) + it.tasks.first().apply { + assertThat(id).isEqualTo("1") + assertThat(name).isEqualTo("dummy") + assertThat(implementingClass).isEqualTo(DummyTask::class.java.name) + assertThat(isStageStart).isEqualTo(true) + assertThat(isStageEnd).isEqualTo(true) + } } - }) + ) } it("starts the first task") { @@ -196,11 +200,13 @@ object StartStageHandlerTest : SubjectSpek({ } it("publishes an event") { - verify(publisher).publishEvent(check { - assertThat(it.executionType).isEqualTo(pipeline.type) - assertThat(it.executionId).isEqualTo(pipeline.id) - assertThat(it.stageId).isEqualTo(message.stageId) - }) + verify(publisher).publishEvent( + check { + assertThat(it.executionType).isEqualTo(pipeline.type) + assertThat(it.executionId).isEqualTo(pipeline.id) + assertThat(it.stageId).isEqualTo(message.stageId) + } + ) } } @@ -226,10 +232,12 @@ object StartStageHandlerTest : SubjectSpek({ } it("updates the stage status") { - verify(repository, times(2)).storeStage(check { - assertThat(it.status).isEqualTo(RUNNING) - assertThat(it.startTime).isEqualTo(clock.millis()) - }) + verify(repository, times(2)).storeStage( + check { + assertThat(it.status).isEqualTo(RUNNING) + assertThat(it.startTime).isEqualTo(clock.millis()) + } + ) } it("immediately completes the stage") { @@ -238,11 +246,13 @@ object StartStageHandlerTest : SubjectSpek({ } it("publishes an event") { - verify(publisher).publishEvent(check { - assertThat(it.executionType).isEqualTo(pipeline.type) - assertThat(it.executionId).isEqualTo(pipeline.id) - assertThat(it.stageId).isEqualTo(message.stageId) - }) + verify(publisher).publishEvent( + check { + assertThat(it.executionType).isEqualTo(pipeline.type) + assertThat(it.executionId).isEqualTo(pipeline.id) + assertThat(it.stageId).isEqualTo(message.stageId) + } + ) } } @@ -267,10 +277,12 @@ object StartStageHandlerTest : SubjectSpek({ } it("updates the stage status") { - verify(repository, times(2)).storeStage(check { - assertThat(it.status).isEqualTo(RUNNING) - assertThat(it.startTime).isEqualTo(clock.millis()) - }) + verify(repository, times(2)).storeStage( + check { + assertThat(it.status).isEqualTo(RUNNING) + assertThat(it.startTime).isEqualTo(clock.millis()) + } + ) } it("completes the stage") { @@ -279,11 +291,13 @@ object StartStageHandlerTest : SubjectSpek({ } it("publishes an event") { - verify(publisher).publishEvent(check { - assertThat(it.executionType).isEqualTo(pipeline.type) - assertThat(it.executionId).isEqualTo(pipeline.id) - assertThat(it.stageId).isEqualTo(message.stageId) - }) + verify(publisher).publishEvent( + check { + assertThat(it.executionType).isEqualTo(pipeline.type) + assertThat(it.executionId).isEqualTo(pipeline.id) + assertThat(it.stageId).isEqualTo(message.stageId) + } + ) } } } @@ -308,40 +322,44 @@ object StartStageHandlerTest : SubjectSpek({ afterGroup(::resetMocks) it("attaches tasks to the stage") { - verify(repository, times(2)).storeStage(check { - assertThat(it.tasks.size).isEqualTo(3) - it.tasks[0].apply { - assertThat(id).isEqualTo("1") - assertThat(name).isEqualTo("dummy1") - assertThat(implementingClass).isEqualTo(DummyTask::class.java.name) - assertThat(isStageStart).isEqualTo(true) - assertThat(isStageEnd).isEqualTo(false) - } - it.tasks[1].apply { - assertThat(id).isEqualTo("2") - assertThat(name).isEqualTo("dummy2") - assertThat(implementingClass).isEqualTo(DummyTask::class.java.name) - assertThat(isStageStart).isEqualTo(false) - assertThat(isStageEnd).isEqualTo(false) - } - it.tasks[2].apply { - assertThat(id).isEqualTo("3") - assertThat(name).isEqualTo("dummy3") - assertThat(implementingClass).isEqualTo(DummyTask::class.java.name) - assertThat(isStageStart).isEqualTo(false) - assertThat(isStageEnd).isEqualTo(true) + verify(repository, times(2)).storeStage( + check { + assertThat(it.tasks.size).isEqualTo(3) + it.tasks[0].apply { + assertThat(id).isEqualTo("1") + assertThat(name).isEqualTo("dummy1") + assertThat(implementingClass).isEqualTo(DummyTask::class.java.name) + assertThat(isStageStart).isEqualTo(true) + assertThat(isStageEnd).isEqualTo(false) + } + it.tasks[1].apply { + assertThat(id).isEqualTo("2") + assertThat(name).isEqualTo("dummy2") + assertThat(implementingClass).isEqualTo(DummyTask::class.java.name) + assertThat(isStageStart).isEqualTo(false) + assertThat(isStageEnd).isEqualTo(false) + } + it.tasks[2].apply { + assertThat(id).isEqualTo("3") + assertThat(name).isEqualTo("dummy3") + assertThat(implementingClass).isEqualTo(DummyTask::class.java.name) + assertThat(isStageStart).isEqualTo(false) + assertThat(isStageEnd).isEqualTo(true) + } } - }) + ) } it("starts the first task") { - verify(queue).push(StartTask( - message.executionType, - message.executionId, - "foo", - message.stageId, - "1" - )) + verify(queue).push( + StartTask( + message.executionType, + message.executionId, + "foo", + message.stageId, + "1" + ) + ) } } @@ -366,19 +384,23 @@ object StartStageHandlerTest : SubjectSpek({ afterGroup(::resetMocks) it("attaches the synthetic stage to the pipeline") { - verify(repository, times(2)).addStage(check { - assertThat(it.parentStageId).isEqualTo(message.stageId) - assertThat(it.syntheticStageOwner).isEqualTo(STAGE_BEFORE) - }) + verify(repository, times(2)).addStage( + check { + assertThat(it.parentStageId).isEqualTo(message.stageId) + assertThat(it.syntheticStageOwner).isEqualTo(STAGE_BEFORE) + } + ) } it("raises an event to indicate the synthetic stage is starting") { - verify(queue).push(StartStage( - message.executionType, - message.executionId, - "foo", - pipeline.stages.first().id - )) + verify(queue).push( + StartStage( + message.executionType, + message.executionId, + "foo", + pipeline.stages.first().id + ) + ) } } @@ -406,13 +428,15 @@ object StartStageHandlerTest : SubjectSpek({ } it("raises an event to indicate the first task is starting") { - verify(queue).push(StartTask( - message.executionType, - message.executionId, - "foo", - message.stageId, - "1" - )) + verify(queue).push( + StartTask( + message.executionType, + message.executionId, + "foo", + message.stageId, + "1" + ) + ) } } } @@ -570,9 +594,11 @@ object StartStageHandlerTest : SubjectSpek({ } it("starts the 'wait for execution window' stage") { - verify(queue).push(check { - assertThat(it.stageId).isEqualTo(pipeline.stages.find { it.type == RestrictExecutionDuringTimeWindow.TYPE }!!.id) - }) + verify(queue).push( + check { + assertThat(it.stageId).isEqualTo(pipeline.stages.find { it.type == RestrictExecutionDuringTimeWindow.TYPE }!!.id) + } + ) verifyNoMoreInteractions(queue) } } @@ -617,9 +643,11 @@ object StartStageHandlerTest : SubjectSpek({ } it("starts the 'wait for execution window' stage") { - verify(queue).push(check { - assertThat(it.stageId).isEqualTo(pipeline.stages.find { it.type == RestrictExecutionDuringTimeWindow.TYPE }!!.id) - }) + verify(queue).push( + check { + assertThat(it.stageId).isEqualTo(pipeline.stages.find { it.type == RestrictExecutionDuringTimeWindow.TYPE }!!.id) + } + ) verifyNoMoreInteractions(queue) } } @@ -646,24 +674,28 @@ object StartStageHandlerTest : SubjectSpek({ } it("starts the stage") { - verify(repository, times(2)).storeStage(check { - assertThat(it.type).isEqualTo("bar") - assertThat(it.status).isEqualTo(RUNNING) - assertThat(it.startTime).isEqualTo(clock.millis()) - }) + verify(repository, times(2)).storeStage( + check { + assertThat(it.type).isEqualTo("bar") + assertThat(it.status).isEqualTo(RUNNING) + assertThat(it.startTime).isEqualTo(clock.millis()) + } + ) } it("attaches a task to the stage") { - verify(repository, times(2)).storeStage(check { - assertThat(it.tasks.size).isEqualTo(1) - it.tasks.first().apply { - assertThat(id).isEqualTo("1") - assertThat(name).isEqualTo("createWebhook") - assertThat(implementingClass).isEqualTo(DummyTask::class.java.name) - assertThat(isStageStart).isEqualTo(true) - assertThat(isStageEnd).isEqualTo(true) + verify(repository, times(2)).storeStage( + check { + assertThat(it.tasks.size).isEqualTo(1) + it.tasks.first().apply { + assertThat(id).isEqualTo("1") + assertThat(name).isEqualTo("createWebhook") + assertThat(implementingClass).isEqualTo(DummyTask::class.java.name) + assertThat(isStageStart).isEqualTo(true) + assertThat(isStageEnd).isEqualTo(true) + } } - }) + ) } } @@ -689,9 +721,11 @@ object StartStageHandlerTest : SubjectSpek({ } it("cancels the stage") { - verify(queue).push(SkipStage( - pipeline.stageByRef("bar") - )) + verify(queue).push( + SkipStage( + pipeline.stageByRef("bar") + ) + ) } } @@ -731,9 +765,11 @@ object StartStageHandlerTest : SubjectSpek({ } it("attaches the exception to the stage context") { - verify(repository, times(2)).storeStage(check { - assertThat(it.context["exception"]).isEqualTo(exceptionDetails) - }) + verify(repository, times(2)).storeStage( + check { + assertThat(it.context["exception"]).isEqualTo(exceptionDetails) + } + ) } } @@ -761,15 +797,19 @@ object StartStageHandlerTest : SubjectSpek({ } it("attaches the exception to the stage context") { - verify(repository, times(2)).storeStage(check { - assertThat(it.context["exception"]).isEqualTo(exceptionDetails) - }) + verify(repository, times(2)).storeStage( + check { + assertThat(it.context["exception"]).isEqualTo(exceptionDetails) + } + ) } it("attaches flag to the stage context to indicate that before stage planning failed") { - verify(repository, times(2)).storeStage(check { - assertThat(it.context["beforeStagePlanningFailed"]).isEqualTo(true) - }) + verify(repository, times(2)).storeStage( + check { + assertThat(it.context["beforeStagePlanningFailed"]).isEqualTo(true) + } + ) } } @@ -797,15 +837,19 @@ object StartStageHandlerTest : SubjectSpek({ } it("attaches the exception to the stage context") { - verify(repository, times(2)).storeStage(check { - assertThat(it.context["exception"]).isEqualTo(exceptionDetails) - }) + verify(repository, times(2)).storeStage( + check { + assertThat(it.context["exception"]).isEqualTo(exceptionDetails) + } + ) } it("attaches flag to the stage context to indicate that before stage planning failed") { - verify(repository, times(2)).storeStage(check { - assertThat(it.context["beforeStagePlanningFailed"]).isEqualTo(true) - }) + verify(repository, times(2)).storeStage( + check { + assertThat(it.context["beforeStagePlanningFailed"]).isEqualTo(true) + } + ) } } } @@ -882,9 +926,11 @@ object StartStageHandlerTest : SubjectSpek({ } it("runs the parallel stages") { - verify(queue, times(3)).push(check { - assertThat(pipeline.stageById(it.stageId).parentStageId).isEqualTo(message.stageId) - }) + verify(queue, times(3)).push( + check { + assertThat(pipeline.stageById(it.stageId).parentStageId).isEqualTo(message.stageId) + } + ) } } @@ -964,9 +1010,11 @@ object StartStageHandlerTest : SubjectSpek({ } it("runs the parallel stages") { - verify(queue).push(check { - assertThat(it.taskId).isEqualTo("1") - }) + verify(queue).push( + check { + assertThat(it.taskId).isEqualTo("1") + } + ) } } } diff --git a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/StartTaskHandlerTest.kt b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/StartTaskHandlerTest.kt index 27edd037950..75215dd7a53 100644 --- a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/StartTaskHandlerTest.kt +++ b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/handler/StartTaskHandlerTest.kt @@ -85,23 +85,27 @@ object StartTaskHandlerTest : SubjectSpek({ } it("marks the task as running") { - verify(repository).storeStage(check { - it.tasks.first().apply { - assertThat(status).isEqualTo(RUNNING) - assertThat(startTime).isEqualTo(clock.millis()) + verify(repository).storeStage( + check { + it.tasks.first().apply { + assertThat(status).isEqualTo(RUNNING) + assertThat(startTime).isEqualTo(clock.millis()) + } } - }) + ) } it("runs the task") { - verify(queue).push(RunTask( - message.executionType, - message.executionId, - "foo", - message.stageId, - message.taskId, - DummyTask::class.java - )) + verify(queue).push( + RunTask( + message.executionType, + message.executionId, + "foo", + message.stageId, + message.taskId, + DummyTask::class.java + ) + ) } it("publishes an event") { diff --git a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/migration/TaskTypeDeserializerTest.kt b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/migration/TaskTypeDeserializerTest.kt index 89a62816d21..a3784be1dff 100644 --- a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/migration/TaskTypeDeserializerTest.kt +++ b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/migration/TaskTypeDeserializerTest.kt @@ -39,17 +39,20 @@ object TaskTypeDeserializerTest : Spek({ } describe("when 'taskType' is deserialized") { - val canonicalJson = """{ "taskType" : "${DummyTask::class.java.canonicalName}" }""" + val canonicalJson = + """{ "taskType" : "${DummyTask::class.java.canonicalName}" }""" Assertions.assertThat( objectMapper.readValue(canonicalJson, Target::class.java).taskType ).isEqualTo(DummyTask::class.java) - val aliasedJson = """{ "taskType" : "anotherTaskAlias" }""" + val aliasedJson = + """{ "taskType" : "anotherTaskAlias" }""" Assertions.assertThat( objectMapper.readValue(aliasedJson, Target::class.java).taskType ).isEqualTo(DummyTask::class.java) - val notTaskTypeJson = """{ "notTaskType" : "java.lang.String" }""" + val notTaskTypeJson = + """{ "notTaskType" : "java.lang.String" }""" Assertions.assertThat( objectMapper.readValue(notTaskTypeJson, Target::class.java).notTaskType ).isEqualTo(String::class.java) diff --git a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/pending/PendingExecutionAgentTest.kt b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/pending/PendingExecutionAgentTest.kt index 3814fc3d9ef..acbc4d296f2 100644 --- a/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/pending/PendingExecutionAgentTest.kt +++ b/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/pending/PendingExecutionAgentTest.kt @@ -87,9 +87,12 @@ internal object PendingExecutionAgentTest : SubjectSpek({ beforeGroup { whenever(pendingExecutionService.pendingIds()) doReturn listOf(runningPipeline.pipelineConfigId) - whenever(executionRepository.retrievePipelinesForPipelineConfigId( - runningPipeline.pipelineConfigId, - ExecutionRepository.ExecutionCriteria().setPageSize(1).setStatuses(ExecutionStatus.RUNNING))) doReturn Observable.just(runningPipeline) + whenever( + executionRepository.retrievePipelinesForPipelineConfigId( + runningPipeline.pipelineConfigId, + ExecutionRepository.ExecutionCriteria().setPageSize(1).setStatuses(ExecutionStatus.RUNNING) + ) + ) doReturn Observable.just(runningPipeline) } on("agent tick") { @@ -110,12 +113,18 @@ internal object PendingExecutionAgentTest : SubjectSpek({ } beforeGroup { whenever(pendingExecutionService.pendingIds()) doReturn listOf(completedPipeline.pipelineConfigId) - whenever(executionRepository.retrievePipelinesForPipelineConfigId( - completedPipeline.pipelineConfigId, - ExecutionRepository.ExecutionCriteria().setPageSize(1).setStatuses(ExecutionStatus.RUNNING))) doReturn Observable.empty() - whenever(executionRepository.retrievePipelinesForPipelineConfigId( - completedPipeline.pipelineConfigId, - ExecutionRepository.ExecutionCriteria().setPageSize(1).setStatuses(ExecutionStatus.COMPLETED.map { it.toString() }))) doReturn Observable.just(completedPipeline) + whenever( + executionRepository.retrievePipelinesForPipelineConfigId( + completedPipeline.pipelineConfigId, + ExecutionRepository.ExecutionCriteria().setPageSize(1).setStatuses(ExecutionStatus.RUNNING) + ) + ) doReturn Observable.empty() + whenever( + executionRepository.retrievePipelinesForPipelineConfigId( + completedPipeline.pipelineConfigId, + ExecutionRepository.ExecutionCriteria().setPageSize(1).setStatuses(ExecutionStatus.COMPLETED.map { it.toString() }) + ) + ) doReturn Observable.just(completedPipeline) } on("agent tick") { @@ -135,12 +144,18 @@ internal object PendingExecutionAgentTest : SubjectSpek({ } beforeGroup { whenever(pendingExecutionService.pendingIds()) doReturn listOf(completedPipeline.pipelineConfigId) - whenever(executionRepository.retrievePipelinesForPipelineConfigId( - completedPipeline.pipelineConfigId, - ExecutionRepository.ExecutionCriteria().setPageSize(1).setStatuses(ExecutionStatus.RUNNING))) doReturn Observable.empty() - whenever(executionRepository.retrievePipelinesForPipelineConfigId( - completedPipeline.pipelineConfigId, - ExecutionRepository.ExecutionCriteria().setPageSize(1).setStatuses(ExecutionStatus.COMPLETED.map { it.toString() }))) doReturn Observable.just(completedPipeline) + whenever( + executionRepository.retrievePipelinesForPipelineConfigId( + completedPipeline.pipelineConfigId, + ExecutionRepository.ExecutionCriteria().setPageSize(1).setStatuses(ExecutionStatus.RUNNING) + ) + ) doReturn Observable.empty() + whenever( + executionRepository.retrievePipelinesForPipelineConfigId( + completedPipeline.pipelineConfigId, + ExecutionRepository.ExecutionCriteria().setPageSize(1).setStatuses(ExecutionStatus.COMPLETED.map { it.toString() }) + ) + ) doReturn Observable.just(completedPipeline) } on("agent tick") { @@ -155,12 +170,18 @@ internal object PendingExecutionAgentTest : SubjectSpek({ describe("pushes pending message when execution is pending and no prior executions") { beforeGroup { whenever(pendingExecutionService.pendingIds()) doReturn listOf("ID1") - whenever(executionRepository.retrievePipelinesForPipelineConfigId( - "ID1", - ExecutionRepository.ExecutionCriteria().setPageSize(1).setStatuses(ExecutionStatus.RUNNING))) doReturn Observable.empty() - whenever(executionRepository.retrievePipelinesForPipelineConfigId( - "ID1", - ExecutionRepository.ExecutionCriteria().setPageSize(1).setStatuses(ExecutionStatus.COMPLETED.map { it.toString() }))) doReturn Observable.empty() + whenever( + executionRepository.retrievePipelinesForPipelineConfigId( + "ID1", + ExecutionRepository.ExecutionCriteria().setPageSize(1).setStatuses(ExecutionStatus.RUNNING) + ) + ) doReturn Observable.empty() + whenever( + executionRepository.retrievePipelinesForPipelineConfigId( + "ID1", + ExecutionRepository.ExecutionCriteria().setPageSize(1).setStatuses(ExecutionStatus.COMPLETED.map { it.toString() }) + ) + ) doReturn Observable.empty() } on("agent tick") { diff --git a/orca-redis/src/main/java/com/netflix/spinnaker/orca/telemetry/RedisActiveExecutionsMonitor.kt b/orca-redis/src/main/java/com/netflix/spinnaker/orca/telemetry/RedisActiveExecutionsMonitor.kt index a22880dc614..83b2e7be225 100644 --- a/orca-redis/src/main/java/com/netflix/spinnaker/orca/telemetry/RedisActiveExecutionsMonitor.kt +++ b/orca-redis/src/main/java/com/netflix/spinnaker/orca/telemetry/RedisActiveExecutionsMonitor.kt @@ -178,11 +178,16 @@ class RedisActiveExecutionsMonitor( } redisClientDelegate.withCommandsClient { redis -> - redis.hset(redisKey, execution.id, objectMapper.writeValueAsString(ActiveExecution( - id = execution.id, - type = execution.type, - application = execution.application - ))) + redis.hset( + redisKey, execution.id, + objectMapper.writeValueAsString( + ActiveExecution( + id = execution.id, + type = execution.type, + application = execution.application + ) + ) + ) } } diff --git a/orca-sql/src/main/kotlin/com/netflix/spinnaker/orca/sql/cleanup/OldPipelineCleanupPollingNotificationAgent.kt b/orca-sql/src/main/kotlin/com/netflix/spinnaker/orca/sql/cleanup/OldPipelineCleanupPollingNotificationAgent.kt index 90b744e8d67..160dddc1960 100644 --- a/orca-sql/src/main/kotlin/com/netflix/spinnaker/orca/sql/cleanup/OldPipelineCleanupPollingNotificationAgent.kt +++ b/orca-sql/src/main/kotlin/com/netflix/spinnaker/orca/sql/cleanup/OldPipelineCleanupPollingNotificationAgent.kt @@ -49,7 +49,8 @@ class OldPipelineCleanupPollingNotificationAgent( ) : AbstractCleanupPollingAgent( clusterLock, configurationProperties.intervalMs, - registry) { + registry +) { override fun performCleanup() { val exceptionalApps = configurationProperties.exceptionalApplications.toHashSet() @@ -76,16 +77,20 @@ class OldPipelineCleanupPollingNotificationAgent( .select(field("application"), field("config_id"), count(field("id")).`as`("count")) .from(table("pipelines")) .where( - field("application").`in`(*chunk.toTypedArray())) + field("application").`in`(*chunk.toTypedArray()) + ) .and( - field("build_time").le(thresholdMillis)) + field("build_time").le(thresholdMillis) + ) .and( - field("status").`in`(*completedStatuses.toTypedArray())) + field("status").`in`(*completedStatuses.toTypedArray()) + ) if (orcaSqlProperties.partitionName != null) { queryBuilder = queryBuilder .and( - field(name("partition")).eq(orcaSqlProperties.partitionName)) + field(name("partition")).eq(orcaSqlProperties.partitionName) + ) } val pipelineConfigsWithOldExecutions = queryBuilder @@ -137,16 +142,18 @@ class OldPipelineCleanupPollingNotificationAgent( var queryBuilder = jooq .select(field("id")) .from(table("pipelines")) - .where(field("build_time").le(thresholdMillis) - .and(field("status").`in`(*completedStatuses.toTypedArray())) - .and(field("application").eq(application)) - .and(field("config_id").eq(pipelineConfigId)) + .where( + field("build_time").le(thresholdMillis) + .and(field("status").`in`(*completedStatuses.toTypedArray())) + .and(field("application").eq(application)) + .and(field("config_id").eq(pipelineConfigId)) ) if (orcaSqlProperties.partitionName != null) { queryBuilder = queryBuilder .and( - field(name("partition")).eq(orcaSqlProperties.partitionName)) + field(name("partition")).eq(orcaSqlProperties.partitionName) + ) } val executionsToRemove = queryBuilder diff --git a/orca-sql/src/main/kotlin/com/netflix/spinnaker/orca/sql/cleanup/TopApplicationExecutionCleanupPollingNotificationAgent.kt b/orca-sql/src/main/kotlin/com/netflix/spinnaker/orca/sql/cleanup/TopApplicationExecutionCleanupPollingNotificationAgent.kt index 46a93ce4202..098abbdc3a9 100644 --- a/orca-sql/src/main/kotlin/com/netflix/spinnaker/orca/sql/cleanup/TopApplicationExecutionCleanupPollingNotificationAgent.kt +++ b/orca-sql/src/main/kotlin/com/netflix/spinnaker/orca/sql/cleanup/TopApplicationExecutionCleanupPollingNotificationAgent.kt @@ -43,7 +43,8 @@ class TopApplicationExecutionCleanupPollingNotificationAgent( ) : AbstractCleanupPollingAgent( clusterLock, configurationProperties.intervalMs, - registry) { + registry +) { override fun performCleanup() { // We don't have an index on partition/application so a query on a given partition is very expensive. @@ -60,11 +61,13 @@ class TopApplicationExecutionCleanupPollingNotificationAgent( val applicationsWithLotsOfOrchestrations = jooq .select(DSL.field("application")) .from(DSL.table("orchestrations")) - .where(if (orcaSqlProperties.partitionName == null) { - DSL.noCondition() - } else { - DSL.field(name("partition")).eq(orcaSqlProperties.partitionName) - }) + .where( + if (orcaSqlProperties.partitionName == null) { + DSL.noCondition() + } else { + DSL.field(name("partition")).eq(orcaSqlProperties.partitionName) + } + ) .and(DSL.field("application").`in`(*chunk.toTypedArray())) .groupBy(DSL.field("application")) .having(DSL.count(DSL.field("id")).gt(configurationProperties.threshold)) diff --git a/orca-sql/src/main/kotlin/com/netflix/spinnaker/orca/sql/pipeline/persistence/ExecutionMapper.kt b/orca-sql/src/main/kotlin/com/netflix/spinnaker/orca/sql/pipeline/persistence/ExecutionMapper.kt index 47faff14372..84beaf9c298 100644 --- a/orca-sql/src/main/kotlin/com/netflix/spinnaker/orca/sql/pipeline/persistence/ExecutionMapper.kt +++ b/orca-sql/src/main/kotlin/com/netflix/spinnaker/orca/sql/pipeline/persistence/ExecutionMapper.kt @@ -44,7 +44,8 @@ class ExecutionMapper( while (rs.next()) { mapper.readValue(rs.getString("body")) .also { - execution -> results.add(execution) + execution -> + results.add(execution) execution.partition = rs.getString("partition") if (rs.getString("id") != execution.id) { diff --git a/orca-sql/src/main/kotlin/com/netflix/spinnaker/orca/sql/pipeline/persistence/SqlExecutionRepository.kt b/orca-sql/src/main/kotlin/com/netflix/spinnaker/orca/sql/pipeline/persistence/SqlExecutionRepository.kt index 0fbe298ce0a..1fde502708c 100644 --- a/orca-sql/src/main/kotlin/com/netflix/spinnaker/orca/sql/pipeline/persistence/SqlExecutionRepository.kt +++ b/orca-sql/src/main/kotlin/com/netflix/spinnaker/orca/sql/pipeline/persistence/SqlExecutionRepository.kt @@ -206,8 +206,10 @@ class SqlExecutionRepository( doForeignAware(PauseInterlinkEvent(type, id, user)) { execution, dslContext -> if (execution.status != RUNNING) { - throw UnpausablePipelineException("Unable to pause pipeline that is not RUNNING " + - "(executionId: ${execution.id}, currentStatus: ${execution.status})") + throw UnpausablePipelineException( + "Unable to pause pipeline that is not RUNNING " + + "(executionId: ${execution.id}, currentStatus: ${execution.status})" + ) } execution.status = PAUSED execution.paused = PipelineExecution.PausedDetails().apply { @@ -227,8 +229,10 @@ class SqlExecutionRepository( doForeignAware(ResumeInterlinkEvent(type, id, user, ignoreCurrentStatus)) { execution, dslContext -> if (!ignoreCurrentStatus && execution.status != PAUSED) { - throw UnresumablePipelineException("Unable to resume pipeline that is not PAUSED " + - "(executionId: ${execution.id}, currentStatus: ${execution.status}") + throw UnresumablePipelineException( + "Unable to resume pipeline that is not PAUSED " + + "(executionId: ${execution.id}, currentStatus: ${execution.status}" + ) } execution.status = RUNNING execution.paused?.resumedBy = user @@ -357,9 +361,11 @@ class SqlExecutionRepository( ?: throw ExecutionNotFoundException("No $type found for $id") override fun retrieve(type: ExecutionType): Observable = - Observable.from(fetchExecutions { pageSize, cursor -> - selectExecutions(type, pageSize, cursor) - }) + Observable.from( + fetchExecutions { pageSize, cursor -> + selectExecutions(type, pageSize, cursor) + } + ) override fun retrieve(type: ExecutionType, criteria: ExecutionCriteria): Observable { return retrieve(type, criteria, null) @@ -387,7 +393,8 @@ class SqlExecutionRepository( this } } - }) + } + ) return Observable.from(select.fetchExecutions()) } @@ -395,11 +402,13 @@ class SqlExecutionRepository( override fun retrievePipelinesForApplication(application: String): Observable = withPool(poolName) { - Observable.from(fetchExecutions { pageSize, cursor -> - selectExecutions(PIPELINE, pageSize, cursor) { - it.where(field("application").eq(application)) + Observable.from( + fetchExecutions { pageSize, cursor -> + selectExecutions(PIPELINE, pageSize, cursor) { + it.where(field("application").eq(application)) + } } - }) + ) } override fun retrievePipelinesForPipelineConfigId( @@ -493,14 +502,16 @@ class SqlExecutionRepository( override fun retrieveOrchestrationForCorrelationId(correlationId: String): PipelineExecution { withPool(poolName) { val execution = jooq.selectExecution(ORCHESTRATION) - .where(field("id").eq( - field( - jooq.select(field("c.orchestration_id")) - .from(table("correlation_ids").`as`("c")) - .where(field("c.id").eq(correlationId)) - .limit(1) - ) as Any - )) + .where( + field("id").eq( + field( + jooq.select(field("c.orchestration_id")) + .from(table("correlation_ids").`as`("c")) + .where(field("c.id").eq(correlationId)) + .limit(1) + ) as Any + ) + ) .fetchExecution() if (execution != null) { @@ -519,14 +530,16 @@ class SqlExecutionRepository( override fun retrievePipelineForCorrelationId(correlationId: String): PipelineExecution { withPool(poolName) { val execution = jooq.selectExecution(PIPELINE) - .where(field("id").eq( - field( - jooq.select(field("c.pipeline_id")) - .from(table("correlation_ids").`as`("c")) - .where(field("c.id").eq(correlationId)) - .limit(1) - ) as Any - )) + .where( + field("id").eq( + field( + jooq.select(field("c.pipeline_id")) + .from(table("correlation_ids").`as`("c")) + .where(field("c.id").eq(correlationId)) + .limit(1) + ) as Any + ) + ) .fetchExecution() if (execution != null) { @@ -983,11 +996,14 @@ class SqlExecutionRepository( * Run the provided [fn] in a transaction. */ private fun DSLContext.transactional(fn: (DSLContext) -> Unit) { - retrySupport.retry({ - transaction { ctx -> - fn(DSL.using(ctx)) - } - }, retryProperties.maxRetries, retryProperties.backoffMs, false) + retrySupport.retry( + { + transaction { ctx -> + fn(DSL.using(ctx)) + } + }, + retryProperties.maxRetries, retryProperties.backoffMs, false + ) } private fun DSLContext.selectExecutions( diff --git a/orca-sql/src/main/kotlin/com/netflix/spinnaker/orca/sql/pipeline/persistence/jooq.kt b/orca-sql/src/main/kotlin/com/netflix/spinnaker/orca/sql/pipeline/persistence/jooq.kt index 9342e7fdbdb..e0c9f53dc58 100644 --- a/orca-sql/src/main/kotlin/com/netflix/spinnaker/orca/sql/pipeline/persistence/jooq.kt +++ b/orca-sql/src/main/kotlin/com/netflix/spinnaker/orca/sql/pipeline/persistence/jooq.kt @@ -31,11 +31,14 @@ internal fun DSLContext.transactional( retrySupport: RetrySupport, fn: (DSLContext) -> Unit ) { - retrySupport.retry({ - transaction { ctx -> - fn(DSL.using(ctx)) - } - }, 5, 100, false) + retrySupport.retry( + { + transaction { ctx -> + fn(DSL.using(ctx)) + } + }, + 5, 100, false + ) } /** diff --git a/orca-web/src/test/kotlin/com/netflix/spinnaker/orca/controllers/PipelineTemplateControllerSpec.kt b/orca-web/src/test/kotlin/com/netflix/spinnaker/orca/controllers/PipelineTemplateControllerSpec.kt index ab747bfa4b1..795b5e59f0d 100644 --- a/orca-web/src/test/kotlin/com/netflix/spinnaker/orca/controllers/PipelineTemplateControllerSpec.kt +++ b/orca-web/src/test/kotlin/com/netflix/spinnaker/orca/controllers/PipelineTemplateControllerSpec.kt @@ -50,7 +50,7 @@ class PipelineTemplateServiceSpec : JUnit5Minutests { it.contains("Private message - don't read me!") -> fail() else -> pass() } - } + } } } }