diff --git a/keel-api/src/main/kotlin/com/netflix/spinnaker/keel/api/artifacts/VirtualMachineOptions.kt b/keel-api/src/main/kotlin/com/netflix/spinnaker/keel/api/artifacts/VirtualMachineOptions.kt index 75e48ffbe0..733c0c7c3b 100644 --- a/keel-api/src/main/kotlin/com/netflix/spinnaker/keel/api/artifacts/VirtualMachineOptions.kt +++ b/keel-api/src/main/kotlin/com/netflix/spinnaker/keel/api/artifacts/VirtualMachineOptions.kt @@ -7,5 +7,6 @@ data class VirtualMachineOptions( val baseLabel: BaseLabel = RELEASE, val baseOs: String, val regions: Set, - val storeType: StoreType = EBS + val storeType: StoreType = EBS, + val ignoreBaseUpdates: Boolean = false ) diff --git a/keel-bakery-plugin/src/main/kotlin/com/netflix/spinnaker/keel/bakery/artifact/ImageHandler.kt b/keel-bakery-plugin/src/main/kotlin/com/netflix/spinnaker/keel/bakery/artifact/ImageHandler.kt index 80509ebe1d..13320f1367 100644 --- a/keel-bakery-plugin/src/main/kotlin/com/netflix/spinnaker/keel/bakery/artifact/ImageHandler.kt +++ b/keel-bakery-plugin/src/main/kotlin/com/netflix/spinnaker/keel/bakery/artifact/ImageHandler.kt @@ -72,7 +72,7 @@ class ImageHandler( log.info("No AMI found for {}", desiredAppVersion) launchBake(artifact, desiredAppVersion) } - imagesWithOlderBaseImages.isNotEmpty() -> { + imagesWithOlderBaseImages.isNotEmpty() && !artifact.vmOptions.ignoreBaseUpdates -> { log.info("AMIs for {} are outdated, rebaking…", desiredAppVersion) launchBake( artifact, diff --git a/keel-bakery-plugin/src/test/kotlin/com/netflix/spinnaker/keel/bakery/artifact/ImageHandlerTests.kt b/keel-bakery-plugin/src/test/kotlin/com/netflix/spinnaker/keel/bakery/artifact/ImageHandlerTests.kt index a4d6bef0e2..3b5f9cd019 100644 --- a/keel-bakery-plugin/src/test/kotlin/com/netflix/spinnaker/keel/bakery/artifact/ImageHandlerTests.kt +++ b/keel-bakery-plugin/src/test/kotlin/com/netflix/spinnaker/keel/bakery/artifact/ImageHandlerTests.kt @@ -62,6 +62,17 @@ internal class ImageHandlerTests : JUnit5Minutests { storeType = EBS ) ) + val artifactIgnoreBaseUpdates = DebianArtifact( + name = "keel", + deliveryConfigName = "delivery-config", + vmOptions = VirtualMachineOptions( + baseLabel = RELEASE, + baseOs = "xenial", + regions = setOf("us-west-2", "us-east-1"), + storeType = EBS, + ignoreBaseUpdates = true, + ) + ) val deliveryConfig = deliveryConfig( configName = artifact.deliveryConfigName!!, artifact = artifact @@ -518,6 +529,40 @@ internal class ImageHandlerTests : JUnit5Minutests { } } } + + context("newer base exists, but artifact ignores new bases") { + before { + val newerBaseAmiVersion = "nflx-base-5.380.0-h1234.8808866" + every { + baseImageCache.getBaseAmiName( + artifactIgnoreBaseUpdates.vmOptions.baseOs, + artifactIgnoreBaseUpdates.vmOptions.baseLabel, + ) + } returns newerBaseAmiVersion + + every { repository.artifactVersions(artifactIgnoreBaseUpdates, any()) } returns listOf( + artifactVersion + ) + + every { + imageService.getLatestNamedImage(any(), any(), any(), any()) + } returns image + + every { repository.getArtifactVersion(artifactIgnoreBaseUpdates, appVersion, null) } returns PublishedArtifact( + name = artifact.name, + reference = artifact.reference, + version = appVersion, + type = DEBIAN, + metadata = emptyMap() + ) + + runHandler(artifactIgnoreBaseUpdates) + } + + test("a bake is not launched") { + expectThat(bakeTask).isNotCaptured() + } + } } } }