diff --git a/operator/src/main/kotlin/eu/glasskube/kubernetes/client/Ext.kt b/operator/src/main/kotlin/eu/glasskube/kubernetes/client/Ext.kt index 36e2450a..e6165ba9 100644 --- a/operator/src/main/kotlin/eu/glasskube/kubernetes/client/Ext.kt +++ b/operator/src/main/kotlin/eu/glasskube/kubernetes/client/Ext.kt @@ -38,3 +38,5 @@ fun > T.patchOrUpdateResourceAndStatus(desiredStatus desiredStatus -> UpdateControl.updateResource(this) else -> UpdateControl.updateResourceAndPatchStatus(apply { status = desiredStatus }) } + +fun Resource<*>.exists() = get() != null diff --git a/operator/src/main/kotlin/eu/glasskube/operator/api/reconciler/HasRegistrationCondition.kt b/operator/src/main/kotlin/eu/glasskube/operator/api/reconciler/HasRegistrationCondition.kt deleted file mode 100644 index 52abb2aa..00000000 --- a/operator/src/main/kotlin/eu/glasskube/operator/api/reconciler/HasRegistrationCondition.kt +++ /dev/null @@ -1,15 +0,0 @@ -package eu.glasskube.operator.api.reconciler - -interface HasRegistrationCondition { - /** - * Whether this controller should be registered by the operator. - */ - val isRegistrationEnabled: Boolean - - /** - * Optional string that is printed in logs in case the controller was not registered. - * - * This should be used to provide a hint to users what they can do in order to enable this controller. - */ - val registrationConditionHint: String? get() = null -} diff --git a/operator/src/main/kotlin/eu/glasskube/operator/apps/matomo/MatomoReconciler.kt b/operator/src/main/kotlin/eu/glasskube/operator/apps/matomo/MatomoReconciler.kt index 6ef7a2bd..a9550f51 100644 --- a/operator/src/main/kotlin/eu/glasskube/operator/apps/matomo/MatomoReconciler.kt +++ b/operator/src/main/kotlin/eu/glasskube/operator/apps/matomo/MatomoReconciler.kt @@ -1,8 +1,6 @@ package eu.glasskube.operator.apps.matomo import eu.glasskube.kubernetes.client.patchOrUpdateStatus -import eu.glasskube.kubernetes.client.resources -import eu.glasskube.operator.api.reconciler.HasRegistrationCondition import eu.glasskube.operator.api.reconciler.getSecondaryResource import eu.glasskube.operator.api.reconciler.informerEventSource import eu.glasskube.operator.apps.matomo.Matomo.Companion.APP_NAME @@ -24,7 +22,6 @@ import eu.glasskube.operator.webhook.WebhookService import eu.glasskube.utils.logger import io.fabric8.kubernetes.api.model.PersistentVolumeClaim import io.fabric8.kubernetes.api.model.Secret -import io.fabric8.kubernetes.api.model.apiextensions.v1.CustomResourceDefinition import io.fabric8.kubernetes.api.model.apps.Deployment import io.fabric8.kubernetes.client.KubernetesClient import io.javaoperatorsdk.operator.api.reconciler.Context @@ -57,7 +54,8 @@ import kotlin.jvm.optionals.getOrNull Dependent( type = MatomoMariaDB::class, name = "MatomoMariaDB", - readyPostcondition = MatomoMariaDB.ReadyPostCondition::class + readyPostcondition = MatomoMariaDB.ReadyPostCondition::class, + activationCondition = MatomoMariaDB.ActivationCondition::class ), Dependent(type = MatomoCronJob::class, name = "MatomoCronJob", dependsOn = ["MatomoDeployment"]), Dependent( @@ -79,15 +77,7 @@ import kotlin.jvm.optionals.getOrNull ] ) class MatomoReconciler(private val kubernetesClient: KubernetesClient, webhookService: WebhookService) : - BaseReconciler(webhookService), EventSourceInitializer, HasRegistrationCondition { - - override val isRegistrationEnabled - get() = kubernetesClient.resources() - .withName("mariadbs.mariadb.mmontes.io") - .isReady - - override val registrationConditionHint = - "CRDs provided by the MariaDB Operator must be present on the cluster." + BaseReconciler(webhookService), EventSourceInitializer { override fun processReconciliation(resource: Matomo, context: Context) = with(context) { getSecondaryResources(PersistentVolumeClaim::class.java) diff --git a/operator/src/main/kotlin/eu/glasskube/operator/apps/matomo/dependent/MatomoMariaDB.kt b/operator/src/main/kotlin/eu/glasskube/operator/apps/matomo/dependent/MatomoMariaDB.kt index e0c52d3c..9abfea9f 100644 --- a/operator/src/main/kotlin/eu/glasskube/operator/apps/matomo/dependent/MatomoMariaDB.kt +++ b/operator/src/main/kotlin/eu/glasskube/operator/apps/matomo/dependent/MatomoMariaDB.kt @@ -16,6 +16,7 @@ import eu.glasskube.operator.apps.matomo.mariaDbLabels import eu.glasskube.operator.apps.matomo.resourceLabels import eu.glasskube.operator.config.ConfigKey import eu.glasskube.operator.config.ConfigService +import eu.glasskube.operator.generic.condition.CustomResourceDefinitionExistsCondition import eu.glasskube.operator.generic.condition.MariaDBReadyCondition import eu.glasskube.operator.infra.mariadb.Exporter import eu.glasskube.operator.infra.mariadb.MariaDB @@ -39,6 +40,7 @@ import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDep class MatomoMariaDB(private val configService: ConfigService) : CRUDKubernetesDependentResource(MariaDB::class.java) { + class ActivationCondition : CustomResourceDefinitionExistsCondition(MariaDB.CANONICAL_NAME) class ReadyPostCondition : MariaDBReadyCondition() private val defaultStorageSize = "10Gi" diff --git a/operator/src/main/kotlin/eu/glasskube/operator/boot/OperatorConfig.kt b/operator/src/main/kotlin/eu/glasskube/operator/boot/OperatorConfig.kt index d5aded77..eb17727b 100644 --- a/operator/src/main/kotlin/eu/glasskube/operator/boot/OperatorConfig.kt +++ b/operator/src/main/kotlin/eu/glasskube/operator/boot/OperatorConfig.kt @@ -6,7 +6,6 @@ import com.fasterxml.jackson.module.kotlin.KotlinFeature import com.fasterxml.jackson.module.kotlin.jsonMapper import com.fasterxml.jackson.module.kotlin.kotlinModule import eu.glasskube.operator.Environment -import eu.glasskube.operator.api.reconciler.HasRegistrationCondition import eu.glasskube.utils.logger import io.fabric8.kubernetes.api.model.HasMetadata import io.fabric8.kubernetes.client.KubernetesClient @@ -43,17 +42,7 @@ class OperatorConfig { fun operator(configurationService: ConfigurationService, reconcilers: List>) = Operator(configurationService).apply { reconcilers.forEach { - if (it !is HasRegistrationCondition || it.isRegistrationEnabled) { - registerForNamespaceOrCluster(it) - } else { - log.warn( - listOfNotNull( - "Reconciler was not registered because it's registration condition is not met: ${it.javaClass.name}.", - it.registrationConditionHint, - "Resources managed by this controller will not be reconciled!" - ).joinToString(" ") - ) - } + registerForNamespaceOrCluster(it) } start() } diff --git a/operator/src/main/kotlin/eu/glasskube/operator/generic/condition/CustomResourceDefinitionExistsCondition.kt b/operator/src/main/kotlin/eu/glasskube/operator/generic/condition/CustomResourceDefinitionExistsCondition.kt new file mode 100644 index 00000000..482dffcc --- /dev/null +++ b/operator/src/main/kotlin/eu/glasskube/operator/generic/condition/CustomResourceDefinitionExistsCondition.kt @@ -0,0 +1,14 @@ +package eu.glasskube.operator.generic.condition + +import eu.glasskube.kubernetes.client.exists +import eu.glasskube.kubernetes.client.resources +import io.fabric8.kubernetes.api.model.HasMetadata +import io.fabric8.kubernetes.api.model.apiextensions.v1.CustomResourceDefinition +import io.javaoperatorsdk.operator.api.reconciler.Context +import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource +import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition + +abstract class CustomResourceDefinitionExistsCondition(private val name: String) : Condition { + override fun isMet(dependentResource: DependentResource, primary: P, context: Context

) = + context.client.resources().withName(name).exists() +} diff --git a/operator/src/main/kotlin/eu/glasskube/operator/infra/mariadb/MariaDB.kt b/operator/src/main/kotlin/eu/glasskube/operator/infra/mariadb/MariaDB.kt index 7695a3c2..0865b103 100644 --- a/operator/src/main/kotlin/eu/glasskube/operator/infra/mariadb/MariaDB.kt +++ b/operator/src/main/kotlin/eu/glasskube/operator/infra/mariadb/MariaDB.kt @@ -60,6 +60,10 @@ class MariaDB : CustomResource(), Namespaced { override fun setSpec(spec: MariaDBSpec?) { super.setSpec(spec) } + + companion object { + const val CANONICAL_NAME = "mariadbs.mariadb.mmontes.io" + } } inline fun mariaDB(block: (@MariaDBDslMarker MariaDB).() -> Unit) =