From 22dc91aa175d238992f96a45fe7eaf922dc853e0 Mon Sep 17 00:00:00 2001 From: carlosthe19916 <2582866+carlosthe19916@users.noreply.github.com> Date: Sun, 15 Sep 2024 21:22:17 +0200 Subject: [PATCH] feat: conditional database --- .../java/org/trustify/operator/Constants.java | 1 + .../operator/cdrs/v2alpha1/TrustifySpec.java | 28 ++++-- .../v2alpha1/db/DBActivationCondition.java | 16 ++++ .../cdrs/v2alpha1/db/DBDeployment.java | 77 +++++++++++----- .../db/DBDeploymentActivationCondition.java | 18 ++++ .../db/DBDeploymentDiscriminator.java | 2 +- .../v2alpha1/db/DBPersistentVolumeClaim.java | 2 +- ...sistentVolumeClaimActivationCondition.java | 18 ++++ .../db/DBSecretActivationCondition.java | 26 ++++++ .../operator/cdrs/v2alpha1/db/DBService.java | 11 +-- .../db/DBServiceActivationCondition.java | 18 ++++ .../v2alpha1/db/DBServiceDiscriminator.java | 2 +- .../server/ServerDeploymentDiscriminator.java | 3 +- .../server/ServerServiceDiscriminator.java | 3 +- .../controllers/TrustifyDistConfigurator.java | 41 +++++---- .../controllers/TrustifyReconciler.java | 87 ++++++++++++------- 16 files changed, 265 insertions(+), 88 deletions(-) create mode 100644 src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBActivationCondition.java create mode 100644 src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBDeploymentActivationCondition.java create mode 100644 src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBPersistentVolumeClaimActivationCondition.java create mode 100644 src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBSecretActivationCondition.java create mode 100644 src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBServiceActivationCondition.java diff --git a/src/main/java/org/trustify/operator/Constants.java b/src/main/java/org/trustify/operator/Constants.java index 0acad71..90cef2b 100644 --- a/src/main/java/org/trustify/operator/Constants.java +++ b/src/main/java/org/trustify/operator/Constants.java @@ -43,6 +43,7 @@ public class Constants { public static final String DB_SECRET_USERNAME = "username"; public static final String DB_SECRET_PASSWORD = "password"; public static final String DB_NAME = "trustify"; + public static final Integer DB_PORT= 5432; public static final String POSTGRESQL_PVC_SIZE = "10G"; diff --git a/src/main/java/org/trustify/operator/cdrs/v2alpha1/TrustifySpec.java b/src/main/java/org/trustify/operator/cdrs/v2alpha1/TrustifySpec.java index 779103d..4b2673a 100644 --- a/src/main/java/org/trustify/operator/cdrs/v2alpha1/TrustifySpec.java +++ b/src/main/java/org/trustify/operator/cdrs/v2alpha1/TrustifySpec.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyDescription; import io.fabric8.kubernetes.api.model.LocalObjectReference; +import io.fabric8.kubernetes.api.model.SecretKeySelector; import java.util.List; @@ -50,12 +51,29 @@ public TrustifySpec() { } public record DatabaseSpec( - @JsonPropertyDescription("Size of the PVC to create.") - String size, + @JsonPropertyDescription("Use external database.") + boolean externalDatabase, - @JsonProperty("resourceLimits") - @JsonPropertyDescription("In this section you can configure resource limits settings.") - ResourcesLimitSpec resourceLimitSpec + @JsonPropertyDescription("Size of the PVC to create. Valid only if externalDatabase=false") + String pvcSize, + + @JsonPropertyDescription("In this section you can configure resource limits settings. Valid only if externalDatabase=false") + ResourcesLimitSpec resourceLimits, + + @JsonPropertyDescription("The reference to a secret holding the username of the database user.") + SecretKeySelector usernameSecret, + + @JsonPropertyDescription("The reference to a secret holding the password of the database user.") + SecretKeySelector passwordSecret, + + @JsonPropertyDescription("The host of the database.") + String host, + + @JsonPropertyDescription("The port of the database.") + String port, + + @JsonPropertyDescription("The database name.") + String name ) { } diff --git a/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBActivationCondition.java b/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBActivationCondition.java new file mode 100644 index 0000000..18fe165 --- /dev/null +++ b/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBActivationCondition.java @@ -0,0 +1,16 @@ +package org.trustify.operator.cdrs.v2alpha1.db; + +import org.trustify.operator.cdrs.v2alpha1.Trustify; +import org.trustify.operator.cdrs.v2alpha1.TrustifySpec; + +import java.util.Optional; + +public abstract class DBActivationCondition { + + protected boolean isMet(Trustify cr) { + return !Optional.ofNullable(cr.getSpec().databaseSpec()) + .map(TrustifySpec.DatabaseSpec::externalDatabase) + .orElse(false); + } + +} diff --git a/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBDeployment.java b/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBDeployment.java index f4f2d9e..9742a83 100644 --- a/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBDeployment.java +++ b/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBDeployment.java @@ -28,7 +28,7 @@ public class DBDeployment extends CRUDKubernetesDependentResource implements Matcher, Condition { - public static final String LABEL_SELECTOR="app.kubernetes.io/managed-by=trustify-operator,component=db"; + public static final String LABEL_SELECTOR = "app.kubernetes.io/managed-by=trustify-operator,component=db"; @Inject Config config; @@ -98,7 +98,7 @@ private DeploymentSpec getDeploymentSpec(Trustify cr, Context context) String image = Optional.ofNullable(cr.getSpec().dbImage()).orElse(config.dbImage()); String imagePullPolicy = Optional.ofNullable(cr.getSpec().imagePullPolicy()).orElse(config.imagePullPolicy()); - TrustifySpec.ResourcesLimitSpec resourcesLimitSpec = CRDUtils.getValueFromSubSpec(cr.getSpec().databaseSpec(), TrustifySpec.DatabaseSpec::resourceLimitSpec) + TrustifySpec.ResourcesLimitSpec resourcesLimitSpec = CRDUtils.getValueFromSubSpec(cr.getSpec().databaseSpec(), TrustifySpec.DatabaseSpec::resourceLimits) .orElse(null); return new DeploymentSpecBuilder() @@ -130,7 +130,7 @@ private DeploymentSpec getDeploymentSpec(Trustify cr, Context context) .withPorts(new ContainerPortBuilder() .withName("tcp") .withProtocol(Constants.SERVICE_PROTOCOL) - .withContainerPort(5432) + .withContainerPort(getDatabasePort(cr)) .build() ) .withLivenessProbe(new ProbeBuilder() @@ -194,28 +194,21 @@ private List getEnvVars(Trustify cr) { return Arrays.asList( new EnvVarBuilder() .withName("POSTGRESQL_USER") - .withNewValueFrom() - .withNewSecretKeyRef() - .withName(DBSecret.getSecretName(cr)) - .withKey(Constants.DB_SECRET_USERNAME) - .withOptional(false) - .endSecretKeyRef() - .endValueFrom() + .withValueFrom(new EnvVarSourceBuilder() + .withSecretKeyRef(getUsernameSecretKeySelector(cr)) + .build() + ) .build(), new EnvVarBuilder() .withName("POSTGRESQL_PASSWORD") - .withNewValueFrom() - .withNewSecretKeyRef() - .withName(DBSecret.getSecretName(cr)) - .withKey(Constants.DB_SECRET_PASSWORD) - .withOptional(false) - .endSecretKeyRef() - .endValueFrom() + .withValueFrom(new EnvVarSourceBuilder() + .withSecretKeyRef(getPasswordSecretKeySelector(cr)) + .build() + ) .build(), - - new EnvVarBuilder() + new EnvVarBuilder() .withName("POSTGRESQL_DATABASE") - .withValue(Constants.DB_NAME) + .withValue(getDatabaseName(cr)) .build() ); } @@ -223,4 +216,48 @@ private List getEnvVars(Trustify cr) { public static String getDeploymentName(Trustify cr) { return cr.getMetadata().getName() + Constants.DB_DEPLOYMENT_SUFFIX; } + + public static SecretKeySelector getUsernameSecretKeySelector(Trustify cr) { + return Optional.ofNullable(cr.getSpec().databaseSpec()) + .map(TrustifySpec.DatabaseSpec::usernameSecret) + .map(secret -> new SecretKeySelectorBuilder() + .withName(secret.getName()) + .withKey(secret.getKey()) + .withOptional(false) + .build() + ) + .orElseGet(() -> new SecretKeySelectorBuilder() + .withName(DBSecret.getSecretName(cr)) + .withKey(Constants.DB_SECRET_USERNAME) + .withOptional(false) + .build() + ); + } + + public static SecretKeySelector getPasswordSecretKeySelector(Trustify cr) { + return Optional.ofNullable(cr.getSpec().databaseSpec()) + .map(TrustifySpec.DatabaseSpec::passwordSecret) + .map(secret -> new SecretKeySelectorBuilder() + .withName(secret.getName()) + .withKey(secret.getKey()) + .withOptional(false) + .build() + ) + .orElseGet(() -> new SecretKeySelectorBuilder() + .withName(DBSecret.getSecretName(cr)) + .withKey(Constants.DB_SECRET_PASSWORD) + .withOptional(false) + .build() + ); + } + + public static String getDatabaseName(Trustify cr) { + return Optional.ofNullable(cr.getSpec().databaseSpec()) + .map(TrustifySpec.DatabaseSpec::name) + .orElse(Constants.DB_NAME); + } + + public static Integer getDatabasePort(Trustify cr) { + return Constants.DB_PORT; + } } diff --git a/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBDeploymentActivationCondition.java b/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBDeploymentActivationCondition.java new file mode 100644 index 0000000..3cd5c8f --- /dev/null +++ b/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBDeploymentActivationCondition.java @@ -0,0 +1,18 @@ +package org.trustify.operator.cdrs.v2alpha1.db; + +import io.fabric8.kubernetes.api.model.apps.Deployment; +import io.javaoperatorsdk.operator.api.reconciler.Context; +import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource; +import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition; +import jakarta.enterprise.context.ApplicationScoped; +import org.trustify.operator.cdrs.v2alpha1.Trustify; + +@ApplicationScoped +public class DBDeploymentActivationCondition extends DBActivationCondition implements Condition { + + @Override + public boolean isMet(DependentResource resource, Trustify cr, Context context) { + return super.isMet(cr); + } + +} diff --git a/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBDeploymentDiscriminator.java b/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBDeploymentDiscriminator.java index ac7435f..9268fb3 100644 --- a/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBDeploymentDiscriminator.java +++ b/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBDeploymentDiscriminator.java @@ -14,7 +14,7 @@ public class DBDeploymentDiscriminator implements ResourceDiscriminator distinguish(Class resource, Trustify cr, Context context) { String deploymentName = DBDeployment.getDeploymentName(cr); ResourceID resourceID = new ResourceID(deploymentName, cr.getMetadata().getNamespace()); - var informerEventSource = (InformerEventSource) context.eventSourceRetriever().getResourceEventSourceFor(Deployment.class); + var informerEventSource = (InformerEventSource) context.eventSourceRetriever().getResourceEventSourceFor(Deployment.class, "db-deployment"); return informerEventSource.get(resourceID); } } diff --git a/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBPersistentVolumeClaim.java b/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBPersistentVolumeClaim.java index e60b2be..f1bcaa1 100644 --- a/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBPersistentVolumeClaim.java +++ b/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBPersistentVolumeClaim.java @@ -35,7 +35,7 @@ private PersistentVolumeClaim newPersistentVolumeClaim(Trustify cr, Context) context.managedDependentResourceContext() .getMandatory(Constants.CONTEXT_LABELS_KEY, Map.class); - String pvcStorageSize = CRDUtils.getValueFromSubSpec(cr.getSpec().databaseSpec(), TrustifySpec.DatabaseSpec::size) + String pvcStorageSize = CRDUtils.getValueFromSubSpec(cr.getSpec().databaseSpec(), TrustifySpec.DatabaseSpec::pvcSize) .orElse(Constants.POSTGRESQL_PVC_SIZE); return new PersistentVolumeClaimBuilder() diff --git a/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBPersistentVolumeClaimActivationCondition.java b/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBPersistentVolumeClaimActivationCondition.java new file mode 100644 index 0000000..6364413 --- /dev/null +++ b/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBPersistentVolumeClaimActivationCondition.java @@ -0,0 +1,18 @@ +package org.trustify.operator.cdrs.v2alpha1.db; + +import io.fabric8.kubernetes.api.model.PersistentVolumeClaim; +import io.javaoperatorsdk.operator.api.reconciler.Context; +import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource; +import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition; +import jakarta.enterprise.context.ApplicationScoped; +import org.trustify.operator.cdrs.v2alpha1.Trustify; + +@ApplicationScoped +public class DBPersistentVolumeClaimActivationCondition extends DBActivationCondition implements Condition { + + @Override + public boolean isMet(DependentResource resource, Trustify cr, Context context) { + return super.isMet(cr); + } + +} diff --git a/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBSecretActivationCondition.java b/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBSecretActivationCondition.java new file mode 100644 index 0000000..04bc8db --- /dev/null +++ b/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBSecretActivationCondition.java @@ -0,0 +1,26 @@ +package org.trustify.operator.cdrs.v2alpha1.db; + +import io.fabric8.kubernetes.api.model.Secret; +import io.javaoperatorsdk.operator.api.reconciler.Context; +import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource; +import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition; +import jakarta.enterprise.context.ApplicationScoped; +import org.trustify.operator.cdrs.v2alpha1.Trustify; + +import java.util.Optional; + +@ApplicationScoped +public class DBSecretActivationCondition extends DBActivationCondition implements Condition { + + @Override + public boolean isMet(DependentResource resource, Trustify cr, Context context) { + boolean databaseRequired = super.isMet(cr); + + boolean manualSecretIsNotSet = Optional.ofNullable(cr.getSpec().databaseSpec()) + .map(databaseSpec -> databaseSpec.usernameSecret() == null || databaseSpec.passwordSecret() == null) + .orElse(true); + + return databaseRequired && manualSecretIsNotSet; + } + +} diff --git a/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBService.java b/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBService.java index 90f6442..6d116af 100644 --- a/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBService.java +++ b/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBService.java @@ -49,7 +49,7 @@ private Service newService(Trustify cr, Context context) { private ServiceSpec getServiceSpec(Trustify cr) { return new ServiceSpecBuilder() .addNewPort() - .withPort(5432) + .withPort(DBDeployment.getDatabasePort(cr)) .withProtocol(Constants.SERVICE_PROTOCOL) .endPort() .withSelector(Constants.DB_SELECTOR_LABELS) @@ -61,13 +61,4 @@ public static String getServiceName(Trustify cr) { return cr.getMetadata().getName() + Constants.DB_SERVICE_SUFFIX; } - public static String getJdbcUrl(Trustify cr) { - return String.format( - "jdbc:postgresql://%s:%s/%s", - cr.getMetadata().getName() + Constants.DB_SERVICE_SUFFIX, - 5432, - Constants.DB_NAME - ); - } - } diff --git a/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBServiceActivationCondition.java b/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBServiceActivationCondition.java new file mode 100644 index 0000000..5d72ef8 --- /dev/null +++ b/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBServiceActivationCondition.java @@ -0,0 +1,18 @@ +package org.trustify.operator.cdrs.v2alpha1.db; + +import io.fabric8.kubernetes.api.model.Service; +import io.javaoperatorsdk.operator.api.reconciler.Context; +import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource; +import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition; +import jakarta.enterprise.context.ApplicationScoped; +import org.trustify.operator.cdrs.v2alpha1.Trustify; + +@ApplicationScoped +public class DBServiceActivationCondition extends DBActivationCondition implements Condition { + + @Override + public boolean isMet(DependentResource resource, Trustify cr, Context context) { + return super.isMet(cr); + } + +} diff --git a/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBServiceDiscriminator.java b/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBServiceDiscriminator.java index 8d8fb67..8eeff53 100644 --- a/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBServiceDiscriminator.java +++ b/src/main/java/org/trustify/operator/cdrs/v2alpha1/db/DBServiceDiscriminator.java @@ -14,7 +14,7 @@ public class DBServiceDiscriminator implements ResourceDiscriminator distinguish(Class resource, Trustify cr, Context context) { String serviceName = DBService.getServiceName(cr); ResourceID resourceID = new ResourceID(serviceName, cr.getMetadata().getNamespace()); - var informerEventSource = (InformerEventSource) context.eventSourceRetriever().getResourceEventSourceFor(Service.class); + var informerEventSource = (InformerEventSource) context.eventSourceRetriever().getResourceEventSourceFor(Service.class, "db-service"); return informerEventSource.get(resourceID); } } diff --git a/src/main/java/org/trustify/operator/cdrs/v2alpha1/server/ServerDeploymentDiscriminator.java b/src/main/java/org/trustify/operator/cdrs/v2alpha1/server/ServerDeploymentDiscriminator.java index 7c84012..6f5fce6 100644 --- a/src/main/java/org/trustify/operator/cdrs/v2alpha1/server/ServerDeploymentDiscriminator.java +++ b/src/main/java/org/trustify/operator/cdrs/v2alpha1/server/ServerDeploymentDiscriminator.java @@ -6,6 +6,7 @@ import io.javaoperatorsdk.operator.processing.event.ResourceID; import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource; import org.trustify.operator.cdrs.v2alpha1.Trustify; +import org.trustify.operator.controllers.TrustifyReconciler; import java.util.Optional; @@ -14,7 +15,7 @@ public class ServerDeploymentDiscriminator implements ResourceDiscriminator distinguish(Class resource, Trustify cr, Context context) { String deploymentName = ServerDeployment.getDeploymentName(cr); ResourceID resourceID = new ResourceID(deploymentName, cr.getMetadata().getNamespace()); - var informerEventSource = (InformerEventSource) context.eventSourceRetriever().getResourceEventSourceFor(Deployment.class); + var informerEventSource = (InformerEventSource) context.eventSourceRetriever().getResourceEventSourceFor(Deployment.class, TrustifyReconciler.SERVER_DEPLOYMENT_EVENT_SOURCE); return informerEventSource.get(resourceID); } } \ No newline at end of file diff --git a/src/main/java/org/trustify/operator/cdrs/v2alpha1/server/ServerServiceDiscriminator.java b/src/main/java/org/trustify/operator/cdrs/v2alpha1/server/ServerServiceDiscriminator.java index 97e66c0..29ea024 100644 --- a/src/main/java/org/trustify/operator/cdrs/v2alpha1/server/ServerServiceDiscriminator.java +++ b/src/main/java/org/trustify/operator/cdrs/v2alpha1/server/ServerServiceDiscriminator.java @@ -6,6 +6,7 @@ import io.javaoperatorsdk.operator.processing.event.ResourceID; import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource; import org.trustify.operator.cdrs.v2alpha1.Trustify; +import org.trustify.operator.controllers.TrustifyReconciler; import java.util.Optional; @@ -14,7 +15,7 @@ public class ServerServiceDiscriminator implements ResourceDiscriminator distinguish(Class resource, Trustify cr, Context context) { String serviceName = ServerService.getServiceName(cr); ResourceID resourceID = new ResourceID(serviceName, cr.getMetadata().getNamespace()); - var informerEventSource = (InformerEventSource) context.eventSourceRetriever().getResourceEventSourceFor(Service.class); + var informerEventSource = (InformerEventSource) context.eventSourceRetriever().getResourceEventSourceFor(Service.class, TrustifyReconciler.SERVER_SERVICE_EVENT_SOURCE); return informerEventSource.get(resourceID); } } \ No newline at end of file diff --git a/src/main/java/org/trustify/operator/controllers/TrustifyDistConfigurator.java b/src/main/java/org/trustify/operator/controllers/TrustifyDistConfigurator.java index ccdab3f..2e86267 100644 --- a/src/main/java/org/trustify/operator/controllers/TrustifyDistConfigurator.java +++ b/src/main/java/org/trustify/operator/controllers/TrustifyDistConfigurator.java @@ -5,15 +5,12 @@ import org.trustify.operator.Constants; import org.trustify.operator.cdrs.v2alpha1.Trustify; import org.trustify.operator.cdrs.v2alpha1.TrustifySpec; +import org.trustify.operator.cdrs.v2alpha1.db.DBDeployment; +import org.trustify.operator.cdrs.v2alpha1.db.DBService; import org.trustify.operator.cdrs.v2alpha1.server.ServerService; import org.trustify.operator.cdrs.v2alpha1.server.ServerStoragePersistentVolumeClaim; -import org.trustify.operator.cdrs.v2alpha1.db.DBSecret; -import org.trustify.operator.cdrs.v2alpha1.db.DBService; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -97,15 +94,29 @@ private void configureTLS(OptionMapper optionMapper) { } private void configureDatabase() { - String dbSecretName = DBSecret.getSecretName(cr); - - List envVars = optionMapper(cr.getSpec()) - .mapOption("TRUSTD_DB_USER", spec -> new SecretKeySelector(Constants.DB_SECRET_USERNAME, dbSecretName, false)) - .mapOption("TRUSTD_DB_PASSWORD", spec -> new SecretKeySelector(Constants.DB_SECRET_PASSWORD, dbSecretName, false)) - .mapOption("TRUSTD_DB_HOST", spec -> DBService.getServiceName(cr)) - .mapOption("TRUSTD_DB_PORT", spec -> 5432) - .mapOption("TRUSTD_DB_NAME", spec -> Constants.DB_NAME) - .getEnvVars(); + List envVars = Optional.ofNullable(cr.getSpec().databaseSpec()) + .flatMap(databaseSpec -> { + if (databaseSpec.externalDatabase()) { + List envs = optionMapper(cr.getSpec()) + .mapOption("TRUSTD_DB_USER", spec -> databaseSpec.usernameSecret()) + .mapOption("TRUSTD_DB_PASSWORD", spec -> databaseSpec.passwordSecret()) + .mapOption("TRUSTD_DB_NAME", spec -> databaseSpec.name()) + .mapOption("TRUSTD_DB_HOST", spec -> databaseSpec.host()) + .mapOption("TRUSTD_DB_PORT", spec -> databaseSpec.port()) + .getEnvVars(); + return Optional.of(envs); + } else { + return Optional.empty(); + } + }) + .orElseGet(() -> optionMapper(cr.getSpec()) + .mapOption("TRUSTD_DB_USER", spec -> DBDeployment.getUsernameSecretKeySelector(cr)) + .mapOption("TRUSTD_DB_PASSWORD", spec -> DBDeployment.getPasswordSecretKeySelector(cr)) + .mapOption("TRUSTD_DB_NAME", spec -> DBDeployment.getDatabaseName(cr)) + .mapOption("TRUSTD_DB_HOST", spec -> DBService.getServiceName(cr)) + .mapOption("TRUSTD_DB_PORT", spec -> DBDeployment.getDatabasePort(cr)) + .getEnvVars() + ); allEnvVars.addAll(envVars); } diff --git a/src/main/java/org/trustify/operator/controllers/TrustifyReconciler.java b/src/main/java/org/trustify/operator/controllers/TrustifyReconciler.java index e509142..bcbd157 100644 --- a/src/main/java/org/trustify/operator/controllers/TrustifyReconciler.java +++ b/src/main/java/org/trustify/operator/controllers/TrustifyReconciler.java @@ -1,9 +1,7 @@ package org.trustify.operator.controllers; -import io.fabric8.kubernetes.api.model.PersistentVolumeClaim; import io.fabric8.kubernetes.api.model.Service; import io.fabric8.kubernetes.api.model.apps.Deployment; -import io.fabric8.kubernetes.api.model.networking.v1.Ingress; import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration; import io.javaoperatorsdk.operator.api.reconciler.*; import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent; @@ -12,13 +10,10 @@ import org.jboss.logging.Logger; import org.trustify.operator.cdrs.v2alpha1.Trustify; import org.trustify.operator.cdrs.v2alpha1.TrustifyStatusCondition; +import org.trustify.operator.cdrs.v2alpha1.db.*; import org.trustify.operator.cdrs.v2alpha1.server.ServerDeployment; import org.trustify.operator.cdrs.v2alpha1.server.ServerIngress; import org.trustify.operator.cdrs.v2alpha1.server.ServerService; -import org.trustify.operator.cdrs.v2alpha1.db.DBDeployment; -import org.trustify.operator.cdrs.v2alpha1.db.DBPersistentVolumeClaim; -import org.trustify.operator.cdrs.v2alpha1.db.DBSecret; -import org.trustify.operator.cdrs.v2alpha1.db.DBService; import java.time.Duration; import java.util.Map; @@ -29,26 +24,58 @@ namespaces = WATCH_CURRENT_NAMESPACE, name = "trustify", dependents = { - @Dependent(name = "db-pvc", type = DBPersistentVolumeClaim.class, useEventSourceWithName = TrustifyReconciler.PVC_EVENT_SOURCE), - @Dependent(name = "db-secret", type = DBSecret.class), - @Dependent(name = "db-deployment", type = DBDeployment.class, dependsOn = {"db-pvc", "db-secret"}, readyPostcondition = DBDeployment.class, useEventSourceWithName = TrustifyReconciler.DEPLOYMENT_EVENT_SOURCE), - @Dependent(name = "db-service", type = DBService.class, dependsOn = {"db-deployment"}, useEventSourceWithName = TrustifyReconciler.SERVICE_EVENT_SOURCE), - - @Dependent(name = "server-deployment", type = ServerDeployment.class, dependsOn = {"db-service"}, readyPostcondition = ServerDeployment.class, useEventSourceWithName = TrustifyReconciler.DEPLOYMENT_EVENT_SOURCE), - @Dependent(name = "server-service", type = ServerService.class, dependsOn = {"db-service"}, useEventSourceWithName = TrustifyReconciler.SERVICE_EVENT_SOURCE), - - @Dependent(name = "ingress", type = ServerIngress.class, dependsOn = {"db-service"}, readyPostcondition = ServerIngress.class, useEventSourceWithName = TrustifyReconciler.INGRESS_EVENT_SOURCE) + @Dependent( + name = "db-pvc", + type = DBPersistentVolumeClaim.class, + activationCondition = DBPersistentVolumeClaimActivationCondition.class + ), + @Dependent( + name = "db-secret", + type = DBSecret.class, + activationCondition = DBSecretActivationCondition.class + ), + @Dependent( + name = "db-deployment", + type = DBDeployment.class, + dependsOn = {"db-pvc", "db-secret"}, + readyPostcondition = DBDeployment.class, + activationCondition = DBDeploymentActivationCondition.class + ), + @Dependent( + name = "db-service", + type = DBService.class, + dependsOn = {"db-deployment"}, + activationCondition = DBServiceActivationCondition.class + ), + + @Dependent( + name = "server-deployment", + type = ServerDeployment.class, +// dependsOn = {"db-service"}, + readyPostcondition = ServerDeployment.class, + useEventSourceWithName = "server-deployment" + ), + @Dependent( + name = "server-service", + type = ServerService.class, + dependsOn = {"server-deployment"}, + useEventSourceWithName = "server-service" + ), + + @Dependent( + name = "ingress", + type = ServerIngress.class, + dependsOn = {"server-service"}, + readyPostcondition = ServerIngress.class + ) } ) -public class TrustifyReconciler implements Reconciler, ContextInitializer, - EventSourceInitializer { +public class TrustifyReconciler implements Reconciler, ContextInitializer, EventSourceInitializer { private static final Logger logger = Logger.getLogger(TrustifyReconciler.class); - public static final String PVC_EVENT_SOURCE = "PVCEventSource"; - public static final String DEPLOYMENT_EVENT_SOURCE = "DeploymentEventSource"; - public static final String SERVICE_EVENT_SOURCE = "ServiceEventSource"; - public static final String INGRESS_EVENT_SOURCE = "IngressEventSource"; + public static final String SERVER_DEPLOYMENT_EVENT_SOURCE = "server-deployment"; + public static final String SERVER_SERVICE_EVENT_SOURCE = "server-service"; @Override public void initContext(Trustify cr, Context context) { @@ -94,21 +121,15 @@ public UpdateControl reconcile(Trustify cr, Context context) { @Override public Map prepareEventSources(EventSourceContext context) { - var pcvInformerConfiguration = InformerConfiguration.from(PersistentVolumeClaim.class, context).build(); - var deploymentInformerConfiguration = InformerConfiguration.from(Deployment.class, context).build(); - var serviceInformerConfiguration = InformerConfiguration.from(Service.class, context).build(); - var ingressInformerConfiguration = InformerConfiguration.from(Ingress.class, context).build(); + var serverDeploymentInformerConfiguration = InformerConfiguration.from(Deployment.class, context).build(); + var serverServiceInformerConfiguration = InformerConfiguration.from(Service.class, context).build(); - var pcvInformerEventSource = new InformerEventSource<>(pcvInformerConfiguration, context); - var deploymentInformerEventSource = new InformerEventSource<>(deploymentInformerConfiguration, context); - var serviceInformerEventSource = new InformerEventSource<>(serviceInformerConfiguration, context); - var ingressInformerEventSource = new InformerEventSource<>(ingressInformerConfiguration, context); + var serverDeploymentInformerEventSource = new InformerEventSource<>(serverDeploymentInformerConfiguration, context); + var serverServiceInformerEventSource = new InformerEventSource<>(serverServiceInformerConfiguration, context); return Map.of( - PVC_EVENT_SOURCE, pcvInformerEventSource, - DEPLOYMENT_EVENT_SOURCE, deploymentInformerEventSource, - SERVICE_EVENT_SOURCE, serviceInformerEventSource, - INGRESS_EVENT_SOURCE, ingressInformerEventSource + SERVER_DEPLOYMENT_EVENT_SOURCE, serverDeploymentInformerEventSource, + SERVER_SERVICE_EVENT_SOURCE, serverServiceInformerEventSource ); } }