diff --git a/src/main/helm/templates/deployment.yaml b/src/main/helm/templates/deployment.yaml index cd8609b..92742b4 100644 --- a/src/main/helm/templates/deployment.yaml +++ b/src/main/helm/templates/deployment.yaml @@ -43,6 +43,8 @@ spec: - name: SPRING_PROFILES_ACTIVE value: "logformat-json" {{- end }} + - name: LMOS_OPERATOR_CANARY_RELEASE_ENABLED + value: "{{ .Values.canaryReleaseEnabled }} ports: - name: http containerPort: {{ .Values.service.port }} diff --git a/src/main/helm/templates/virtualservice.yaml b/src/main/helm/templates/virtualservice.yaml index 5b0a40f..eb6dc68 100644 --- a/src/main/helm/templates/virtualservice.yaml +++ b/src/main/helm/templates/virtualservice.yaml @@ -1,3 +1,4 @@ +{{- if .Values.canaryReleaseEnabled }} apiVersion: networking.istio.io/v1 kind: VirtualService metadata: @@ -33,3 +34,4 @@ spec: x-namespace: {{ $namespace | quote }} x-subset: "canary" {{- end }} +{{- end }} \ No newline at end of file diff --git a/src/main/helm/values.yaml b/src/main/helm/values.yaml index 00d29ce..61a2d68 100644 --- a/src/main/helm/values.yaml +++ b/src/main/helm/values.yaml @@ -135,3 +135,5 @@ customResources: # The namespaces from where clients are calling the lmos operator clientNamespaces: - default + +canaryReleaseEnabled: true \ No newline at end of file diff --git a/src/main/kotlin/org/eclipse/lmos/operator/reconciler/generator/RoutingChannelGenerator.kt b/src/main/kotlin/org/eclipse/lmos/operator/reconciler/generator/RoutingChannelGenerator.kt index a2c6d76..b6fc07b 100644 --- a/src/main/kotlin/org/eclipse/lmos/operator/reconciler/generator/RoutingChannelGenerator.kt +++ b/src/main/kotlin/org/eclipse/lmos/operator/reconciler/generator/RoutingChannelGenerator.kt @@ -15,6 +15,7 @@ import org.eclipse.lmos.operator.resources.ChannelRoutingCapability import org.eclipse.lmos.operator.resources.ChannelRoutingResource import org.eclipse.lmos.operator.resources.ChannelRoutingSpec import org.eclipse.lmos.operator.resources.Labels +import org.eclipse.lmos.operator.util.SubsetProvider import org.slf4j.Logger import org.slf4j.LoggerFactory @@ -49,7 +50,7 @@ fun createChannelRoutingResource(channelResource: ChannelResource): ChannelRouti val metadata = channelResource.metadata val channelResourceName = metadata.name val labels = metadata.labels - LOG.debug("Channel labels:{}", labels) + LOG.info("Channel:{}, Channel labels:{}", channelResource.metadata.name, labels) val channel = labels[Labels.CHANNEL] val tenant = labels[Labels.TENANT] val version = labels[Labels.VERSION] @@ -63,7 +64,7 @@ fun createChannelRoutingResource(channelResource: ChannelResource): ChannelRouti Labels.CHANNEL to channel, Labels.TENANT to tenant, Labels.VERSION to version, - Labels.SUBSET to subset, + Labels.SUBSET to SubsetProvider.getSubset(subset), ) channelRoutingResource.metadata = channelRoutingResourceMetadata channelRoutingResource.spec = ChannelRoutingSpec() diff --git a/src/main/kotlin/org/eclipse/lmos/operator/server/routing/CustomResourcesController.kt b/src/main/kotlin/org/eclipse/lmos/operator/server/routing/CustomResourcesController.kt index ed7b01d..60c8e97 100644 --- a/src/main/kotlin/org/eclipse/lmos/operator/server/routing/CustomResourcesController.kt +++ b/src/main/kotlin/org/eclipse/lmos/operator/server/routing/CustomResourcesController.kt @@ -26,14 +26,14 @@ private const val KUBERNETES_DEFAULT_NAMESPACE = "default" class CustomResourcesController(private val customResourcesService: CustomResourcesService) { @GetMapping("/channels") fun getChannels( - @RequestHeader(name = X_SUBSET_HEADER) subsetHeader: String, + @RequestHeader(name = X_SUBSET_HEADER, required = false) subsetHeader: String, @RequestHeader(name = X_NAMESPACE_HEADER, required = false) namespaceHeader: String = KUBERNETES_DEFAULT_NAMESPACE, @PathVariable tenant: String, ) = customResourcesService.getChannels(tenant, subsetHeader, namespaceHeader) @GetMapping("/channels/{channel}", produces = [MediaType.APPLICATION_JSON_VALUE]) fun getChannel( - @RequestHeader(name = X_SUBSET_HEADER) subsetHeader: String, + @RequestHeader(name = X_SUBSET_HEADER, required = false) subsetHeader: String, @RequestHeader(name = X_NAMESPACE_HEADER, required = false) namespaceHeader: String = KUBERNETES_DEFAULT_NAMESPACE, @PathVariable tenant: String, @PathVariable channel: String, @@ -44,7 +44,7 @@ class CustomResourcesController(private val customResourcesService: CustomResour @GetMapping("/channels/{channel}/routing", produces = [MediaType.APPLICATION_JSON_VALUE]) fun getRouting( - @RequestHeader(name = X_SUBSET_HEADER) subsetHeader: String, + @RequestHeader(name = X_SUBSET_HEADER, required = false) subsetHeader: String, @RequestHeader(name = X_NAMESPACE_HEADER, required = false) namespaceHeader: String = KUBERNETES_DEFAULT_NAMESPACE, @PathVariable tenant: String, @PathVariable channel: String, diff --git a/src/main/kotlin/org/eclipse/lmos/operator/server/routing/impl/DefaultCustomResourcesService.kt b/src/main/kotlin/org/eclipse/lmos/operator/server/routing/impl/DefaultCustomResourcesService.kt index 5cb386f..87e5db2 100644 --- a/src/main/kotlin/org/eclipse/lmos/operator/server/routing/impl/DefaultCustomResourcesService.kt +++ b/src/main/kotlin/org/eclipse/lmos/operator/server/routing/impl/DefaultCustomResourcesService.kt @@ -10,6 +10,7 @@ import io.fabric8.kubernetes.client.KubernetesClient import org.eclipse.lmos.operator.resources.ChannelResource import org.eclipse.lmos.operator.resources.ChannelRoutingResource import org.eclipse.lmos.operator.server.routing.CustomResourcesService +import org.eclipse.lmos.operator.util.SubsetProvider import org.springframework.stereotype.Component import java.util.function.Consumer @@ -25,8 +26,8 @@ class DefaultCustomResourcesService(private val client: KubernetesClient) : Cust mapOf( "tenant" to tenant, "channel" to channel, - "subset" to subset, ) + labelSelectors.plus("subset" to SubsetProvider.getSubset(subset)) val channelRoutingResources = client @@ -52,8 +53,8 @@ class DefaultCustomResourcesService(private val client: KubernetesClient) : Cust val labelSelectors = mapOf( "tenant" to tenant, - "subset" to subset, ) + labelSelectors.plus("subset" to SubsetProvider.getSubset(subset)) val channelResources = client.resources( @@ -77,8 +78,8 @@ class DefaultCustomResourcesService(private val client: KubernetesClient) : Cust mapOf( "tenant" to tenant, "channel" to channel, - "subset" to subset, ) + labelSelectors.plus("subset" to SubsetProvider.getSubset(subset)) val channelResources = client.resources( diff --git a/src/main/kotlin/org/eclipse/lmos/operator/util/SubsetProvider.kt b/src/main/kotlin/org/eclipse/lmos/operator/util/SubsetProvider.kt new file mode 100644 index 0000000..b2acbae --- /dev/null +++ b/src/main/kotlin/org/eclipse/lmos/operator/util/SubsetProvider.kt @@ -0,0 +1,17 @@ +package org.eclipse.lmos.operator.util + +object SubsetProvider { + + private val canaryReleaseEnabled: Boolean by lazy { + val envValue = System.getenv("LMOS_OPERATOR_CANARY_RELEASE_ENABLED") + envValue?.toBoolean() ?: true + } + + fun getSubset(subsetValue: String?): String { + return if (canaryReleaseEnabled) { + subsetValue ?: throw IllegalArgumentException("Subset value is required when canary release is enabled") + } else { + subsetValue ?: "stable" + } + } +} \ No newline at end of file diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 9792877..d6c07e9 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -55,4 +55,4 @@ management: prometheus: metrics: export: - enabled: true + enabled: true \ No newline at end of file