Skip to content

Commit

Permalink
feat(ecs): Grab container image from trigger or context (#2751)
Browse files Browse the repository at this point in the history
  • Loading branch information
clareliguori authored and anotherchrisberry committed Mar 22, 2019
1 parent df91608 commit bc3af89
Showing 1 changed file with 54 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ package com.netflix.spinnaker.orca.clouddriver.tasks.providers.ecs

import com.netflix.spinnaker.orca.clouddriver.tasks.servergroup.ServerGroupCreator
import com.netflix.spinnaker.orca.kato.tasks.DeploymentDetailsAware
import com.netflix.spinnaker.orca.pipeline.model.DockerTrigger
import com.netflix.spinnaker.orca.pipeline.model.Execution.ExecutionType
import com.netflix.spinnaker.orca.pipeline.model.Stage
import groovy.util.logging.Slf4j
import org.springframework.stereotype.Component
Expand All @@ -41,13 +43,62 @@ class EcsServerGroupCreator implements ServerGroupCreator, DeploymentDetailsAwar
operation.credentials = operation.account
}

def bakeStage = getPreviousStageWithImage(stage, operation.region, cloudProvider)
def imageDescription = (Map<String, Object>) operation.imageDescription

if (bakeStage) {
operation.put('dockerImageAddress', bakeStage.context.amiDetails.imageId.value.get(0).toString())
if (imageDescription) {
if (imageDescription.fromContext) {
if (stage.execution.type == ExecutionType.ORCHESTRATION) {
// Use image from specific "find image from tags" stage
def imageStage = getAncestors(stage, stage.execution).find {
it.refId == imageDescription.stageId && it.context.containsKey("amiDetails")
}

if (!imageStage) {
throw new IllegalStateException("No image stage found in context for $imageDescription.imageLabelOrSha.")
}

imageDescription.imageId = imageStage.context.amiDetails.imageId.value.get(0).toString()
}
}

if (imageDescription.fromTrigger) {
if (stage.execution.type == ExecutionType.PIPELINE) {
def trigger = stage.execution.trigger

if (trigger instanceof DockerTrigger && trigger.account == imageDescription.account && trigger.repository == imageDescription.repository) {
imageDescription.tag = trigger.tag
}

imageDescription.imageId = buildImageId(imageDescription.registry, imageDescription.repository, imageDescription.tag)
}

if (!imageDescription.tag) {
throw new IllegalStateException("No tag found for image ${imageDescription.registry}/${imageDescription.repository} in trigger context.")
}
}

if (!imageDescription.imageId) {
imageDescription.imageId = buildImageId(imageDescription.registry, imageDescription.repository, imageDescription.tag)
}

operation.dockerImageAddress = imageDescription.imageId
} else if (!operation.dockerImageAddress) {
// Fall back to previous behavior: use image from any previous "find image from tags" stage by default
def bakeStage = getPreviousStageWithImage(stage, operation.region, cloudProvider)

if (bakeStage) {
operation.dockerImageAddress = bakeStage.context.amiDetails.imageId.value.get(0).toString()
}
}

return [[(ServerGroupCreator.OPERATION): operation]]
}

static String buildImageId(Object registry, Object repo, Object tag) {
if (registry) {
return "$registry/$repo:$tag"
} else {
return "$repo:$tag"
}
}
}

0 comments on commit bc3af89

Please sign in to comment.