Commit 9db39ad5 authored by Anastasios Poimenidis's avatar Anastasios Poimenidis
Browse files

feat: introduce flyway for maintaining database changes

parent e9aab109
Loading
Loading
Loading
Loading
+17 −1
Changes for pom.xml: 17 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -36,7 +36,11 @@
            <artifactId>commons-lang3</artifactId>
<!--            <version>3.14.0</version> &lt;!&ndash; use the latest stable &ndash;&gt;-->
        </dependency>

        <!-- Quarkus Flyway Extension -->
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-flyway</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-hibernate-orm</artifactId>
@@ -187,6 +191,18 @@

            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <!-- 1. Ensure test failures strictly fail the build -->
                    <testFailureIgnore>false</testFailureIgnore>

                    <!-- 2. Stop the entire test execution immediately on the 1st failure -->
                    <skipAfterFailureCount>1</skipAfterFailureCount>

                    <systemPropertyVariables>
                        <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
                        <maven.home>${maven.home}</maven.home>
                    </systemPropertyVariables>
                </configuration>
            </plugin>

            <plugin>
+5 −6
Changes for src/main/java/org/etsi/osl/hypo/api/fabric/repository/DomainIdentityRepository.java: 5 added lines, 6 removed lines.
Original line number Diff line number Diff line
@@ -2,10 +2,10 @@ package org.etsi.osl.hypo.api.fabric.repository;

import io.quarkus.hibernate.orm.panache.PanacheRepository;
import io.quarkus.panache.common.Page;
import io.quarkus.panache.common.Parameters;
import io.quarkus.panache.common.Sort;
import jakarta.enterprise.context.ApplicationScoped;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.etsi.osl.hypo.api.fabric.entity.DomainIdentityData;

@@ -27,16 +27,15 @@ public class DomainIdentityRepository implements PanacheRepository<DomainIdentit

    public List<DomainIdentityData> getDomainIdentityDataPageByNetworkControllerId(
            String networkControllerId, int pageIndex, int pageSize) {
        return find(
                        "networkController.networkControllerId  = :ncId",
                        Sort.descending("id"),
                        Parameters.with("ncId", networkControllerId))
        Map<String, Object> parameters = Map.of("ncId", networkControllerId);
        Sort descending = Sort.descending("id");
        return find("networkController.networkControllerId  = :ncId", descending, parameters)
                .page(Page.of(pageIndex, pageSize))
                .list();
    }

    public List<DomainIdentityData> getAllDomainIdentityListByIds(List<String> ids) {
        Parameters queryParameters = Parameters.with("idsList", ids);
        Map<String, Object> queryParameters = Map.of("idsList", ids);
        return find("where domainIdentityId in :idsList", queryParameters).list();
    }
}
+5 −4
Changes for src/main/resources/application.properties: 5 added lines, 4 removed lines.
Original line number Diff line number Diff line
@@ -113,11 +113,12 @@ quarkus.datasource.db-kind=postgresql
%prod.quarkus.datasource.username=${_PROD_QUARKUS_DATASOURCE_USERNAME:username}
%prod.quarkus.datasource.password=${_PROD_QUARKUS_DATASOURCE_PASSWORD:password}

%prod.quarkus.hibernate-orm.database.generation=update
quarkus.flyway.migrate-at-start=true
quarkus.hibernate-orm.database.generation=none

%dev.quarkus.hibernate-orm.database.generation=drop-and-create
%test.quarkus.hibernate-orm.database.generation=drop-and-create
%unittest.quarkus.hibernate-orm.database.generation=drop-and-create
# Force Flyway to execute both main schema AND test mock data
%test.quarkus.flyway.locations=db/migration,db/migration-test
%unittest.quarkus.flyway.locations=db/migration,db/migration-test

#Open Telemetry for Tracing
%prod.quarkus.otel.enabled=true
+60 −0
Changes for src/main/resources/db/migration/V1.0.0__initialize_database.sql: 60 added lines, 0 removed lines.
Original line number Diff line number Diff line
CREATE SEQUENCE DomainConnectionData_SEQ START WITH 1 INCREMENT BY 50;
CREATE SEQUENCE DomainIdentity_SEQ START WITH 1 INCREMENT BY 50;
CREATE SEQUENCE NetworkController_SEQ START WITH 1 INCREMENT BY 50;

CREATE TABLE DomainConnectionData (
                                      id BIGINT NOT NULL,
                                      domainConnectionDataId VARCHAR(255) NOT NULL UNIQUE,
                                      networkControllerId BIGINT NOT NULL,
                                      address VARCHAR(40) NOT NULL,
                                      port INTEGER NOT NULL CHECK (port >= 1 AND port <= 65535),
                                      protocol VARCHAR(40) NOT NULL,
                                      domainIdentityId VARCHAR(40) NOT NULL,
                                      domainServiceId VARCHAR(40) NOT NULL UNIQUE,
                                      serviceId VARCHAR(40) NOT NULL,
                                      hostConfigId VARCHAR(40) NOT NULL UNIQUE,
                                      interceptConfigId VARCHAR(40) NOT NULL UNIQUE,
                                      policyBindId VARCHAR(40) NOT NULL UNIQUE,
                                      policyDialId VARCHAR(40) NOT NULL UNIQUE,
                                      PRIMARY KEY (id)
);

CREATE TABLE DomainIdentity (
                                id BIGINT NOT NULL,
                                network_controller_id BIGINT NOT NULL,
                                domainIdentityId VARCHAR(100) NOT NULL UNIQUE,
                                organizationId VARCHAR(100),
                                organizationName VARCHAR(100),
                                status VARCHAR(255) CHECK (status IN ('ONLINE', 'OFFLINE')),
                                PRIMARY KEY (id)
);

CREATE TABLE NetworkController (
                                   id BIGINT NOT NULL,
                                   networkControllerId VARCHAR(255) NOT NULL UNIQUE,
                                   networkName VARCHAR(100) NOT NULL UNIQUE,
                                   networkOwner VARCHAR(50) NOT NULL,
                                   username VARCHAR(50) NOT NULL,
                                   hostConfigTypeId VARCHAR(255) NOT NULL,
                                   interceptConfigTypeId VARCHAR(255) NOT NULL,
                                   networkEndpoint VARCHAR(255) NOT NULL,
                                   networkLocation VARCHAR(255) NOT NULL,
                                   status VARCHAR(255) CHECK (status IN ('ONLINE', 'OFFLINE')),
                                   PRIMARY KEY (id)
);

CREATE INDEX idx_domain_identity_data_domain_identity_id
    ON DomainIdentity (domainIdentityId);

CREATE INDEX idx_domain_identity_data_organization_id
    ON DomainIdentity (organizationId);

ALTER TABLE IF EXISTS DomainConnectionData
    ADD CONSTRAINT FK4ybq6pnv6a7w4utm7vykpy9e3
    FOREIGN KEY (networkControllerId)
    REFERENCES NetworkController;

ALTER TABLE IF EXISTS DomainIdentity
    ADD CONSTRAINT fk_domain_identity_network_controller
    FOREIGN KEY (network_controller_id)
    REFERENCES NetworkController;
 No newline at end of file
+117 −0
Changes for src/test/java/org/etsi/osl/hypo/api/fabric/database/DatabaseIntegrityTest.java: 117 added lines, 0 removed lines.
Original line number Diff line number Diff line
package org.etsi.osl.hypo.api.fabric.database;

import static org.assertj.core.api.Assertions.assertThat;

import io.quarkus.test.junit.QuarkusTest;
import jakarta.inject.Inject;
import jakarta.transaction.Transactional;
import java.util.Optional;
import org.etsi.osl.hypo.api.fabric.entity.DomainConnectionData;
import org.etsi.osl.hypo.api.fabric.entity.DomainIdentityData;
import org.etsi.osl.hypo.api.fabric.entity.NetworkController;
import org.etsi.osl.hypo.api.fabric.entity.Status;
import org.etsi.osl.hypo.api.fabric.repository.DomainConnectionDataRepository;
import org.etsi.osl.hypo.api.fabric.repository.DomainIdentityRepository;
import org.etsi.osl.hypo.api.fabric.repository.NetworkControllerRepository;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;

@QuarkusTest
@Order(1)
class DatabaseIntegrityTest {

    @Inject DomainConnectionDataRepository domainConnectionDataRepository;
    @Inject NetworkControllerRepository networkControllerRepository;
    @Inject DomainIdentityRepository domainIdentityRepository;

    @Test
    @DisplayName("Verify Domain Connection Data operations")
    @Transactional
    void verifyDomainConnectionData() {
        // 1. Verify DomainConnectionData was seeded
        Optional<DomainConnectionData> domainConnectionDataOptional =
                domainConnectionDataRepository.findById("dcd-test-uuid-001");

        assertThat(domainConnectionDataOptional).isPresent();

        DomainConnectionData domainConnectionData = domainConnectionDataOptional.get();

        // 2. Fetch entity and test JPA Mapping & FK relationship to NetworkController
        assertThat(domainConnectionData).describedAs("Record with ID 1 should exist").isNotNull();
        assertThat(domainConnectionData.getDomainConnectionDataId()).isEqualTo("dcd-test-uuid-001");
        // Verify all DomainConnectionData fields against SQL seed
        assertThat(domainConnectionData.getDomainConnectionDataId()).isEqualTo("dcd-test-uuid-001");
        assertThat(domainConnectionData.getAddress()).isEqualTo("192.168.1.100");
        assertThat(domainConnectionData.getPort()).isEqualTo(8080);
        assertThat(domainConnectionData.getProtocol()).isEqualTo("HTTPS");
        assertThat(domainConnectionData.getDomainIdentityId()).isEqualTo("identity-test-01");
        assertThat(domainConnectionData.getDomainServiceId()).isEqualTo("service-test-01");
        assertThat(domainConnectionData.getServiceId()).isEqualTo("srv-test-01");
        assertThat(domainConnectionData.getHostConfigId()).isEqualTo("host-cfg-test-01");
        assertThat(domainConnectionData.getInterceptConfigId()).isEqualTo("intercept-cfg-test-01");
        assertThat(domainConnectionData.getPolicyBindId()).isEqualTo("bind-test-01");
        assertThat(domainConnectionData.getPolicyDialId()).isEqualTo("dial-test-01");

        // 3. Verify Foreign Key relationship mapping
        assertThat(domainConnectionData.getNetworkController())
                .describedAs("Parent NetworkController FK relationship must resolve")
                .isNotNull();
        assertThat(domainConnectionData.getNetworkController().getNetworkName())
                .isEqualTo("Athens-Test-Core");
    }

    @Test
    @DisplayName("Verify Domain Connection Data operations")
    @Transactional
    void verifyNetworkController() {
        // 1. Verify DomainConnectionData was seeded
        Optional<NetworkController> networkControllerOptional =
                networkControllerRepository.findById("nc-test-uuid-001");

        assertThat(networkControllerOptional).isPresent();

        NetworkController networkController = networkControllerOptional.get();
        // 2. Verify networkController fields against SQL seed
        assertThat(networkController)
                .describedAs("Parent NetworkController FK relationship must resolve")
                .isNotNull();

        assertThat(networkController.getNetworkControllerId()).isEqualTo("nc-test-uuid-001");
        assertThat(networkController.getNetworkName()).isEqualTo("Athens-Test-Core");
        assertThat(networkController.getNetworkOwner()).isEqualTo("OpenSlice-Owner");
        assertThat(networkController.getUsername()).isEqualTo("admin");
        assertThat(networkController.getHostConfigTypeId()).isEqualTo("cfg-type-01");
        assertThat(networkController.getInterceptConfigTypeId()).isEqualTo("intercept-type-01");
        assertThat(networkController.getNetworkEndpoint()).isEqualTo("https://athens.endpoint:8080");
        assertThat(networkController.getNetworkLocation()).isEqualTo("Athens-GR");
        assertThat(networkController.getStatus()).isEqualTo(Status.ONLINE);
    }

    @Test
    @DisplayName("Verify Domain Connection Identity operations")
    @Transactional
    void verifyDomainIdentity() {
        // 1. Verify DomainConnectionData was seeded
        Optional<DomainIdentityData> optionalDomainIdentityData =
                domainIdentityRepository.getByDomainIdentityId("domain-id-test-01");

        assertThat(optionalDomainIdentityData).isPresent();

        DomainIdentityData domainIdentityData = optionalDomainIdentityData.get();

        // 2. Fetch entity and test JPA Mapping & FK relationship to NetworkController
        assertThat(domainIdentityData).isNotNull();
        assertThat(domainIdentityData.getDomainIdentityId()).isEqualTo("domain-id-test-01");
        assertThat(domainIdentityData.getOrganizationId()).isEqualTo("org-test-uuid-999");
        assertThat(domainIdentityData.getOrganizationName()).isEqualTo("Athens-Research-Org");
        assertThat(domainIdentityData.getStatus()).isEqualTo(Status.ONLINE);

        // 3. Verify Foreign Key relationship mapping
        assertThat(domainIdentityData.getNetworkController())
                .describedAs("Parent NetworkController FK relationship must resolve")
                .isNotNull();
        assertThat(domainIdentityData.getNetworkController().getNetworkName())
                .isEqualTo("Athens-Test-Core");
    }
}
Loading