From 41d5f305e5ab486cbfc712690c144382d46021a1 Mon Sep 17 00:00:00 2001 From: kirangodishala Date: Mon, 10 Jun 2024 19:14:14 +0530 Subject: [PATCH] fix(tests): Add new integration test for postgres migration - PostgresMigrationContainerTest --- .../spinnaker/orca/BaseContainerTest.java | 2 +- .../orca/PostgresMigrationContainerTest.java | 154 ++++++++++++++++++ 2 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 orca-integration/src/test/java/com/netflix/spinnaker/orca/PostgresMigrationContainerTest.java diff --git a/orca-integration/src/test/java/com/netflix/spinnaker/orca/BaseContainerTest.java b/orca-integration/src/test/java/com/netflix/spinnaker/orca/BaseContainerTest.java index 0f8664c961..a0643f65e2 100644 --- a/orca-integration/src/test/java/com/netflix/spinnaker/orca/BaseContainerTest.java +++ b/orca-integration/src/test/java/com/netflix/spinnaker/orca/BaseContainerTest.java @@ -41,7 +41,7 @@ class BaseContainerTest { protected final Network network = Network.newNetwork(); - private static final int ORCA_PORT = 8083; + protected static final int ORCA_PORT = 8083; protected GenericContainer orcaContainer; diff --git a/orca-integration/src/test/java/com/netflix/spinnaker/orca/PostgresMigrationContainerTest.java b/orca-integration/src/test/java/com/netflix/spinnaker/orca/PostgresMigrationContainerTest.java new file mode 100644 index 0000000000..536eafe62b --- /dev/null +++ b/orca-integration/src/test/java/com/netflix/spinnaker/orca/PostgresMigrationContainerTest.java @@ -0,0 +1,154 @@ +/* + * Copyright 2024 OpsMx, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.netflix.spinnaker.orca; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.time.Duration; +import java.util.Map; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.containers.output.Slf4jLogConsumer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.utility.DockerImageName; + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@Testcontainers +public class PostgresMigrationContainerTest extends BaseContainerTest { + + private static final Logger logger = + LoggerFactory.getLogger(PostgresMigrationContainerTest.class); + + private static final String POSTGRES_NETWORK_ALIAS = "postgresHost"; + + private static final int POSTGRES_PORT = 5432; + + private PostgreSQLContainer postgres; + + private GenericContainer orcaInitialContainer; + + // this is the latest image that is still running on liquibase 3.10.3 which create the conditions + // similar to real scenario so that test identifies when validChecksums are not added in the later + // version of orca where higher liquibase versions are used + private static final DockerImageName previousDockerImageName = + DockerImageName.parse( + "us-docker.pkg.dev/spinnaker-community/docker/orca:8.36.3-dev-release-1.32.x-3f8965d03-202406101625-unvalidated"); + + private String jdbcUrl = ""; + + @BeforeEach + void setup() throws Exception { + postgres = + new PostgreSQLContainer<>("postgres:15") + .withDatabaseName("orca") + .withUsername("postgres") + .withPassword("postgres") + .withNetwork(network) + .withNetworkAliases(POSTGRES_NETWORK_ALIAS) + .withInitScript("postgres_init.sql"); + postgres.start(); + jdbcUrl = String.format("jdbc:postgresql://%s:%d/orca", POSTGRES_NETWORK_ALIAS, POSTGRES_PORT); + + // Start the first orca(from previous release) container so that all the db changelog + // sets are executed + orcaInitialContainer = + new GenericContainer(previousDockerImageName) + .withNetwork(network) + .withExposedPorts(ORCA_PORT) + .waitingFor(Wait.forHealthcheck().withStartupTimeout(Duration.ofSeconds(120))) + .dependsOn(postgres) + .withEnv("SPRING_APPLICATION_JSON", getSpringApplicationJson()); + orcaInitialContainer.start(); + Slf4jLogConsumer logConsumer = new Slf4jLogConsumer(logger); + orcaInitialContainer.followOutput(logConsumer); + orcaInitialContainer.stop(); + + orcaContainer + .dependsOn(postgres) + .withEnv("SPRING_APPLICATION_JSON", getSpringApplicationJson()) + .start(); + + orcaContainer.followOutput(logConsumer); + } + + private String getSpringApplicationJson() throws JsonProcessingException { + logger.info("--------- jdbcUrl: '{}'", jdbcUrl); + Map connectionPool = + Map.of( + "dialect", + "POSTGRES", + "jdbcUrl", + jdbcUrl, + "user", + "orca_service", + "password", + "0rcaPassw0rd"); + Map migration = + Map.of("jdbcUrl", jdbcUrl, "user", "orca_migrate", "password", "0rcaPassw0rd"); + Map sql = Map.of("enabled", true); + Map redis = Map.of("enabled", false); + Map pendingExecutionService = Map.of("sql", sql, "redis", redis); + Map executionRepository = Map.of("sql", sql, "redis", redis); + Map keiko = Map.of("sql", sql, "redis", redis); + + Map properties = + Map.of( + "sql.enabled", + "true", + "services.fiat.baseUrl", + "http://nowhere", + "sql.connectionPool", + connectionPool, + "redis.enabled", + "false", + "sql.migration", + migration, + "executionRepository", + executionRepository, + "keiko.queue", + keiko, + "queue.pendingExecutionService", + pendingExecutionService, + "monitor.activeExecutions.redis", + "false"); + ObjectMapper mapper = new ObjectMapper(); + return mapper.writeValueAsString(properties); + } + + @AfterAll + void cleanupOnce() { + if (orcaContainer != null) { + orcaContainer.stop(); + } + + if (postgres != null) { + postgres.stop(); + } + } + + @Test + void testHealthCheckWithPostgres() throws Exception { + super.testHealthCheck(); + } +}