DatabaseServiceContainer.java

package org.entando.kubernetes.controller.databaseservice;

import static java.util.Optional.ofNullable;

import io.fabric8.kubernetes.api.model.EnvVar;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import org.entando.kubernetes.controller.spi.common.DbmsDockerVendorStrategy;
import org.entando.kubernetes.controller.spi.common.EntandoOperatorSpiConfig;
import org.entando.kubernetes.controller.spi.common.NameUtils;
import org.entando.kubernetes.controller.spi.container.ConfigurableResourceContainer;
import org.entando.kubernetes.controller.spi.container.DockerImageInfo;
import org.entando.kubernetes.controller.spi.container.HasHealthCommand;
import org.entando.kubernetes.controller.spi.container.PersistentVolumeAwareContainer;
import org.entando.kubernetes.controller.spi.container.ServiceBackingContainer;
import org.entando.kubernetes.model.common.EntandoResourceRequirements;
import org.entando.kubernetes.model.externaldatabase.EntandoDatabaseService;

public class DatabaseServiceContainer implements ConfigurableResourceContainer, ServiceBackingContainer,
        PersistentVolumeAwareContainer, HasHealthCommand {

    public static final int MAX_STARTUP_TIME = 90;
    private final EntandoDatabaseService entandoDatabaseService;
    private final DbmsDockerVendorStrategy dbmsVendorDockerStrategy;
    private final DatabaseVariableInitializer variableInitializer;
    private final Integer portOverride;

    public DatabaseServiceContainer(EntandoDatabaseService entandoDatabaseService, DatabaseVariableInitializer variableInitializer,
            DbmsDockerVendorStrategy dbmsVendor, Integer portOverride) {
        this.variableInitializer = variableInitializer;
        this.dbmsVendorDockerStrategy = dbmsVendor;
        this.portOverride = portOverride;
        this.entandoDatabaseService = entandoDatabaseService;
    }

    @Override
    public Optional<EntandoResourceRequirements> getResourceRequirementsOverride() {
        return entandoDatabaseService.getSpec().getResourceRequirements();
    }

    @Override
    public Optional<String> getAccessMode() {
        return Optional.of("ReadWriteOnce");
    }

    @Override
    public Optional<String> getStorageClass() {
        return this.entandoDatabaseService.getSpec().getStorageClass().or(EntandoOperatorSpiConfig::getDefaultNonClusteredStorageClass);
    }

    @Override
    public Optional<Integer> getMaximumStartupTimeSeconds() {
        return Optional.of(MAX_STARTUP_TIME);
    }

    @Override
    public DockerImageInfo getDockerImageInfo() {
        return new DockerImageInfo(dbmsVendorDockerStrategy);
    }

    @Override
    public String getNameQualifier() {
        return NameUtils.DB_NAME_QUALIFIER;
    }

    @Override
    public int getPrimaryPort() {
        return ofNullable(portOverride).orElse(dbmsVendorDockerStrategy.getPort());
    }

    @Override
    public int getMemoryLimitMebibytes() {
        return dbmsVendorDockerStrategy.getDefaultMemoryLimitMebibytes();
    }

    @Override
    public String getVolumeMountPath() {
        return dbmsVendorDockerStrategy.getVolumeMountPath();
    }

    @Override
    public String getHealthCheckCommand() {
        return dbmsVendorDockerStrategy.getHealthCheck();
    }

    @Override
    public List<EnvVar> getEnvironmentVariables() {
        List<EnvVar> vars = new ArrayList<>();
        variableInitializer.addEnvironmentVariables(vars);
        return vars;
    }
}