From 5e5c159d77191f47c398b167751414047da114a0 Mon Sep 17 00:00:00 2001 From: ajanikow <12255597+ajanikow@users.noreply.github.com> Date: Wed, 17 Jan 2024 16:26:28 +0000 Subject: [PATCH 1/2] [Feature] Deprecate AF Mode --- CHANGELOG.md | 4 +- README.md | 46 ++++++++++--------- docs/cli/arangodb_operator.md | 43 ++++++++--------- docs/features/README.md | 3 +- internal/features.yaml | 8 ++++ ...iloverleadership.go => active-failover.go} | 14 ++++++ pkg/deployment/features/features.go | 24 ++++++++-- pkg/deployment/features/local.go | 38 +++++++++++---- pkg/deployment/features/rebalancer.go | 4 +- pkg/deployment/features/version_3_10.go | 4 +- .../reconcile/plan_builder_rotate_upgrade.go | 18 +++++++- .../plan_builder_rotate_upgrade_decision.go | 6 +-- .../plan_builder_rotate_upgrade_test.go | 2 +- pkg/deployment/resources/pod_creator.go | 4 ++ 14 files changed, 151 insertions(+), 67 deletions(-) rename pkg/deployment/features/{failoverleadership.go => active-failover.go} (73%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b14662cf..423fecd13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,7 @@ - (Maintenance) Bump Kubernetes dependency to 1.31.2 - (Documentation) Remove Interactive args for the DebugPackage command - (Maintenance) PropagationMode Enum docs +- (Feature) Deprecate AF Mode ## [1.2.43](https://github.com/arangodb/kube-arangodb/tree/1.2.43) (2024-10-14) - (Feature) ArangoRoute CRD @@ -121,6 +122,7 @@ - (Feature) DebugPackage ArangoProfiles - (Feature) Scheduler CLI - (Feature) Parametrize ForceDelete timeout +<<<<<<< HEAD - (Feature) Scheduler BatchJob Integration Definition - (Feature) Scheduler CronJob Integration Definition - (Feature) Scheduler BatchJob Integration Service @@ -166,7 +168,7 @@ - (Maintenance) Bump Go to 1.21.6 - (Bugfix) Enable LazyLoader for CRD & CRD Schemas - (Feature) (ML) Restore ReadinessProbe for ML Storage sidecar -- (Feature) AutoDelete for ArangoBackup +- (Feature) AutoDelete for ArangoBackup ## [1.2.36](https://github.com/arangodb/kube-arangodb/tree/1.2.36) (2024-01-08) - (Documentation) Improvements and fixes for rendered documentation (GH pages) diff --git a/README.md b/README.md index 12a71956c..0f8d82808 100644 --- a/README.md +++ b/README.md @@ -100,7 +100,7 @@ covers individual newer features separately. | [Force Rebuild Out Synced Shards](docs/features/rebuild_out_synced_shards.md) | 1.2.27 | 1.2.27 | >= 3.8.0 | Community, Enterprise | Production | False | --deployment.feature.force-rebuild-out-synced-shards | It should be used only if user is aware of the risks. | | [Spec Default Restore](docs/features/deployment_spec_defaults.md) | 1.2.25 | 1.2.21 | >= 3.8.0 | Community, Enterprise | Beta | True | --deployment.feature.deployment-spec-defaults-restore | If set to False Operator will not change ArangoDeployment Spec | | Version Check | 1.2.23 | 1.1.4 | >= 3.8.0 | Community, Enterprise | Production | True | --deployment.feature.upgrade-version-check | N/A | -| [Failover Leader service](docs/features/failover_leader_service.md) | 1.2.13 | 1.2.13 | >= 3.8.0 | Community, Enterprise | Production | False | --deployment.feature.failover-leadership | N/A | +| [Failover Leader service](docs/features/failover_leader_service.md) | 1.2.13 | 1.2.13 | < 3.12.0 | Community, Enterprise | Production | False | --deployment.feature.failover-leadership | N/A | | Graceful Restart | 1.2.5 | 1.0.7 | >= 3.8.0 | Community, Enterprise | Production | True | ---deployment.feature.graceful-shutdown | N/A | | Optional Graceful Restart | 1.2.0 | 1.2.5 | >= 3.8.0 | Community, Enterprise | Production | False | --deployment.feature.optional-graceful-shutdown | N/A | | Operator Internal Metrics Exporter | 1.2.0 | 1.2.0 | >= 3.8.0 | Community, Enterprise | Production | True | --deployment.feature.metrics-exporter | N/A | @@ -110,6 +110,7 @@ covers individual newer features separately. | JWT Rotation Support | 1.1.0 | 1.0.3 | >= 3.8.0 | Enterprise | Production | True | --deployment.feature.jwt-rotation | N/A | | Operator Single Mode | 1.0.4 | 1.0.4 | >= 3.8.0 | Community, Enterprise | Production | False | --mode.single | Only 1 instance of Operator allowed in namespace when feature is enabled | | TLS SNI Support | 1.0.3 | 1.0.3 | >= 3.8.0 | Enterprise | Production | True | --deployment.feature.tls-sni | N/A | +| ActiveFailover Support | 1.0.0 | 1.0.0 | < 3.12.0 | Community, Enterprise | Production | True | --deployment.feature.active-failover | N/A | | Disabling of liveness probes | 0.3.11 | 0.3.10 | >= 3.8.0 | Community, Enterprise | Production | True | N/A | N/A | | Pod Disruption Budgets | 0.3.11 | 0.3.10 | >= 3.8.0 | Community, Enterprise | Production | True | N/A | N/A | | Prometheus Metrics Exporter | 0.3.11 | 0.3.10 | >= 3.8.0 | Community, Enterprise | Production | True | N/A | Prometheus required | @@ -157,28 +158,29 @@ Flags: --crd.install Install missing CRD if access is possible (default true) --crd.preserve-unknown-fields stringArray Controls which CRD should have enabled preserve unknown fields in validation schema =. To apply for all, use crd-name 'all'. --crd.validation-schema stringArray Overrides default set of CRDs which should have validation schema enabled =. To apply for all, use crd-name 'all'. - --deployment.feature.agency-poll Enable Agency Poll for Enterprise deployments - Required ArangoDB 3.8.0 or higher (default true) + --deployment.feature.active-failover Support for ActiveFailover mode - Required ArangoDB >= 3.8.0, < 3.12 (default true) + --deployment.feature.agency-poll Enable Agency Poll for Enterprise deployments - Required ArangoDB >= 3.8.0 (default true) --deployment.feature.all Enable ALL Features - --deployment.feature.async-backup-creation Create backups asynchronously to avoid blocking the operator and reaching the timeout - Required ArangoDB 3.8.0 or higher (default true) - --deployment.feature.backup-cleanup Cleanup imported backups if required - Required ArangoDB 3.8.0 or higher - --deployment.feature.deployment-spec-defaults-restore Restore defaults from last accepted state of deployment - Required ArangoDB 3.8.0 or higher (default true) - --deployment.feature.enforced-resign-leadership Enforce ResignLeadership and ensure that Leaders are moved from restarted DBServer - Required ArangoDB 3.8.0 or higher (default true) - --deployment.feature.ephemeral-volumes Enables ephemeral volumes for apps and tmp directory - Required ArangoDB 3.8.0 or higher - --deployment.feature.failover-leadership Support for leadership in fail-over mode - Required ArangoDB 3.8.0 or higher - --deployment.feature.init-containers-copy-resources Copy resources spec to built-in init containers if they are not specified - Required ArangoDB 3.8.0 or higher (default true) - --deployment.feature.init-containers-upscale-resources Copy resources spec to built-in init containers if they are not specified or lower - Required ArangoDB 3.8.0 or higher (default true) - --deployment.feature.local-storage.pass-reclaim-policy [LocalStorage] Pass ReclaimPolicy from StorageClass instead of using hardcoded Retain - Required ArangoDB 3.8.0 or higher - --deployment.feature.local-volume-replacement-check Replace volume for local-storage if volume is unschedulable (ex. node is gone) - Required ArangoDB 3.8.0 or higher - --deployment.feature.random-pod-names Enables generating random pod names - Required ArangoDB 3.8.0 or higher - --deployment.feature.rebalancer-v2 Rebalancer V2 feature - Required ArangoDB 3.10.0 or higher - --deployment.feature.restart-policy-always Allow to restart containers with always restart policy - Required ArangoDB 3.8.0 or higher - --deployment.feature.secured-containers Create server's containers with non root privileges. It enables 'ephemeral-volumes' feature implicitly - Required ArangoDB 3.8.0 or higher - --deployment.feature.sensitive-information-protection Hide sensitive information from metrics and logs - Required ArangoDB 3.8.0 or higher - --deployment.feature.short-pod-names Enable Short Pod Names - Required ArangoDB 3.8.0 or higher - --deployment.feature.timezone-management Enable timezone management for pods - Required ArangoDB 3.8.0 or higher - --deployment.feature.tls-sni TLS SNI Support - Required ArangoDB EE 3.8.0 or higher (default true) - --deployment.feature.upgrade-version-check Enable initContainer with pre version check - Required ArangoDB 3.8.0 or higher (default true) - --deployment.feature.upgrade-version-check-v2 Enable initContainer with pre version check based by Operator - Required ArangoDB 3.8.0 or higher + --deployment.feature.async-backup-creation Create backups asynchronously to avoid blocking the operator and reaching the timeout - Required ArangoDB >= 3.8.0 (default true) + --deployment.feature.backup-cleanup Cleanup imported backups if required - Required ArangoDB >= 3.8.0 + --deployment.feature.deployment-spec-defaults-restore Restore defaults from last accepted state of deployment - Required ArangoDB >= 3.8.0 (default true) + --deployment.feature.enforced-resign-leadership Enforce ResignLeadership and ensure that Leaders are moved from restarted DBServer - Required ArangoDB >= 3.8.0 (default true) + --deployment.feature.ephemeral-volumes Enables ephemeral volumes for apps and tmp directory - Required ArangoDB >= 3.8.0 + --deployment.feature.failover-leadership Support for leadership in fail-over mode - Required ArangoDB >= 3.8.0, < 3.12 + --deployment.feature.init-containers-copy-resources Copy resources spec to built-in init containers if they are not specified - Required ArangoDB >= 3.8.0 (default true) + --deployment.feature.init-containers-upscale-resources Copy resources spec to built-in init containers if they are not specified or lower - Required ArangoDB >= 3.8.0 (default true) + --deployment.feature.local-storage.pass-reclaim-policy [LocalStorage] Pass ReclaimPolicy from StorageClass instead of using hardcoded Retain - Required ArangoDB >= 3.8.0 + --deployment.feature.local-volume-replacement-check Replace volume for local-storage if volume is unschedulable (ex. node is gone) - Required ArangoDB >= 3.8.0 + --deployment.feature.random-pod-names Enables generating random pod names - Required ArangoDB >= 3.8.0 + --deployment.feature.rebalancer-v2 Rebalancer V2 feature - Required ArangoDB >= 3.10.0 + --deployment.feature.restart-policy-always Allow to restart containers with always restart policy - Required ArangoDB >= 3.8.0 + --deployment.feature.secured-containers Create server's containers with non root privileges. It enables 'ephemeral-volumes' feature implicitly - Required ArangoDB >= 3.8.0 + --deployment.feature.sensitive-information-protection Hide sensitive information from metrics and logs - Required ArangoDB >= 3.8.0 + --deployment.feature.short-pod-names Enable Short Pod Names - Required ArangoDB >= 3.8.0 + --deployment.feature.timezone-management Enable timezone management for pods - Required ArangoDB >= 3.8.0 + --deployment.feature.tls-sni TLS SNI Support - Required ArangoDB EE >= 3.8.0 (default true) + --deployment.feature.upgrade-version-check Enable initContainer with pre version check - Required ArangoDB >= 3.8.0 (default true) + --deployment.feature.upgrade-version-check-v2 Enable initContainer with pre version check based by Operator - Required ArangoDB >= 3.8.0 --features-config-map-name string Name of the Feature Map ConfigMap (default "arangodb-operator-feature-config-map") --http1.keep-alive If false, disables HTTP keep-alives and will only use the connection to the server for a single HTTP request (default true) --http1.transport.dial-timeout duration Maximum amount of time a dial will wait for a connect to complete (default 30s) diff --git a/docs/cli/arangodb_operator.md b/docs/cli/arangodb_operator.md index b362f1117..63f39fa00 100644 --- a/docs/cli/arangodb_operator.md +++ b/docs/cli/arangodb_operator.md @@ -42,28 +42,29 @@ Flags: --crd.install Install missing CRD if access is possible (default true) --crd.preserve-unknown-fields stringArray Controls which CRD should have enabled preserve unknown fields in validation schema =. To apply for all, use crd-name 'all'. --crd.validation-schema stringArray Overrides default set of CRDs which should have validation schema enabled =. To apply for all, use crd-name 'all'. - --deployment.feature.agency-poll Enable Agency Poll for Enterprise deployments - Required ArangoDB 3.8.0 or higher (default true) + --deployment.feature.active-failover Support for ActiveFailover mode - Required ArangoDB >= 3.8.0, < 3.12 (default true) + --deployment.feature.agency-poll Enable Agency Poll for Enterprise deployments - Required ArangoDB >= 3.8.0 (default true) --deployment.feature.all Enable ALL Features - --deployment.feature.async-backup-creation Create backups asynchronously to avoid blocking the operator and reaching the timeout - Required ArangoDB 3.8.0 or higher (default true) - --deployment.feature.backup-cleanup Cleanup imported backups if required - Required ArangoDB 3.8.0 or higher - --deployment.feature.deployment-spec-defaults-restore Restore defaults from last accepted state of deployment - Required ArangoDB 3.8.0 or higher (default true) - --deployment.feature.enforced-resign-leadership Enforce ResignLeadership and ensure that Leaders are moved from restarted DBServer - Required ArangoDB 3.8.0 or higher (default true) - --deployment.feature.ephemeral-volumes Enables ephemeral volumes for apps and tmp directory - Required ArangoDB 3.8.0 or higher - --deployment.feature.failover-leadership Support for leadership in fail-over mode - Required ArangoDB 3.8.0 or higher - --deployment.feature.init-containers-copy-resources Copy resources spec to built-in init containers if they are not specified - Required ArangoDB 3.8.0 or higher (default true) - --deployment.feature.init-containers-upscale-resources Copy resources spec to built-in init containers if they are not specified or lower - Required ArangoDB 3.8.0 or higher (default true) - --deployment.feature.local-storage.pass-reclaim-policy [LocalStorage] Pass ReclaimPolicy from StorageClass instead of using hardcoded Retain - Required ArangoDB 3.8.0 or higher - --deployment.feature.local-volume-replacement-check Replace volume for local-storage if volume is unschedulable (ex. node is gone) - Required ArangoDB 3.8.0 or higher - --deployment.feature.random-pod-names Enables generating random pod names - Required ArangoDB 3.8.0 or higher - --deployment.feature.rebalancer-v2 Rebalancer V2 feature - Required ArangoDB 3.10.0 or higher - --deployment.feature.restart-policy-always Allow to restart containers with always restart policy - Required ArangoDB 3.8.0 or higher - --deployment.feature.secured-containers Create server's containers with non root privileges. It enables 'ephemeral-volumes' feature implicitly - Required ArangoDB 3.8.0 or higher - --deployment.feature.sensitive-information-protection Hide sensitive information from metrics and logs - Required ArangoDB 3.8.0 or higher - --deployment.feature.short-pod-names Enable Short Pod Names - Required ArangoDB 3.8.0 or higher - --deployment.feature.timezone-management Enable timezone management for pods - Required ArangoDB 3.8.0 or higher - --deployment.feature.tls-sni TLS SNI Support - Required ArangoDB EE 3.8.0 or higher (default true) - --deployment.feature.upgrade-version-check Enable initContainer with pre version check - Required ArangoDB 3.8.0 or higher (default true) - --deployment.feature.upgrade-version-check-v2 Enable initContainer with pre version check based by Operator - Required ArangoDB 3.8.0 or higher + --deployment.feature.async-backup-creation Create backups asynchronously to avoid blocking the operator and reaching the timeout - Required ArangoDB >= 3.8.0 (default true) + --deployment.feature.backup-cleanup Cleanup imported backups if required - Required ArangoDB >= 3.8.0 + --deployment.feature.deployment-spec-defaults-restore Restore defaults from last accepted state of deployment - Required ArangoDB >= 3.8.0 (default true) + --deployment.feature.enforced-resign-leadership Enforce ResignLeadership and ensure that Leaders are moved from restarted DBServer - Required ArangoDB >= 3.8.0 (default true) + --deployment.feature.ephemeral-volumes Enables ephemeral volumes for apps and tmp directory - Required ArangoDB >= 3.8.0 + --deployment.feature.failover-leadership Support for leadership in fail-over mode - Required ArangoDB >= 3.8.0, < 3.12 + --deployment.feature.init-containers-copy-resources Copy resources spec to built-in init containers if they are not specified - Required ArangoDB >= 3.8.0 (default true) + --deployment.feature.init-containers-upscale-resources Copy resources spec to built-in init containers if they are not specified or lower - Required ArangoDB >= 3.8.0 (default true) + --deployment.feature.local-storage.pass-reclaim-policy [LocalStorage] Pass ReclaimPolicy from StorageClass instead of using hardcoded Retain - Required ArangoDB >= 3.8.0 + --deployment.feature.local-volume-replacement-check Replace volume for local-storage if volume is unschedulable (ex. node is gone) - Required ArangoDB >= 3.8.0 + --deployment.feature.random-pod-names Enables generating random pod names - Required ArangoDB >= 3.8.0 + --deployment.feature.rebalancer-v2 Rebalancer V2 feature - Required ArangoDB >= 3.10.0 + --deployment.feature.restart-policy-always Allow to restart containers with always restart policy - Required ArangoDB >= 3.8.0 + --deployment.feature.secured-containers Create server's containers with non root privileges. It enables 'ephemeral-volumes' feature implicitly - Required ArangoDB >= 3.8.0 + --deployment.feature.sensitive-information-protection Hide sensitive information from metrics and logs - Required ArangoDB >= 3.8.0 + --deployment.feature.short-pod-names Enable Short Pod Names - Required ArangoDB >= 3.8.0 + --deployment.feature.timezone-management Enable timezone management for pods - Required ArangoDB >= 3.8.0 + --deployment.feature.tls-sni TLS SNI Support - Required ArangoDB EE >= 3.8.0 (default true) + --deployment.feature.upgrade-version-check Enable initContainer with pre version check - Required ArangoDB >= 3.8.0 (default true) + --deployment.feature.upgrade-version-check-v2 Enable initContainer with pre version check based by Operator - Required ArangoDB >= 3.8.0 --features-config-map-name string Name of the Feature Map ConfigMap (default "arangodb-operator-feature-config-map") -h, --help help for arangodb_operator --http1.keep-alive If false, disables HTTP keep-alives and will only use the connection to the server for a single HTTP request (default true) diff --git a/docs/features/README.md b/docs/features/README.md index 4d4a54c4f..8fc2c97d4 100644 --- a/docs/features/README.md +++ b/docs/features/README.md @@ -21,7 +21,7 @@ title: List of all features | [Force Rebuild Out Synced Shards](rebuild_out_synced_shards.md) | 1.2.27 | 1.2.27 | >= 3.8.0 | Community, Enterprise | Production | False | --deployment.feature.force-rebuild-out-synced-shards | It should be used only if user is aware of the risks. | | [Spec Default Restore](deployment_spec_defaults.md) | 1.2.25 | 1.2.21 | >= 3.8.0 | Community, Enterprise | Beta | True | --deployment.feature.deployment-spec-defaults-restore | If set to False Operator will not change ArangoDeployment Spec | | Version Check | 1.2.23 | 1.1.4 | >= 3.8.0 | Community, Enterprise | Production | True | --deployment.feature.upgrade-version-check | N/A | -| [Failover Leader service](failover_leader_service.md) | 1.2.13 | 1.2.13 | >= 3.8.0 | Community, Enterprise | Production | False | --deployment.feature.failover-leadership | N/A | +| [Failover Leader service](failover_leader_service.md) | 1.2.13 | 1.2.13 | < 3.12.0 | Community, Enterprise | Production | False | --deployment.feature.failover-leadership | N/A | | Graceful Restart | 1.2.5 | 1.0.7 | >= 3.8.0 | Community, Enterprise | Production | True | ---deployment.feature.graceful-shutdown | N/A | | Optional Graceful Restart | 1.2.0 | 1.2.5 | >= 3.8.0 | Community, Enterprise | Production | False | --deployment.feature.optional-graceful-shutdown | N/A | | Operator Internal Metrics Exporter | 1.2.0 | 1.2.0 | >= 3.8.0 | Community, Enterprise | Production | True | --deployment.feature.metrics-exporter | N/A | @@ -31,6 +31,7 @@ title: List of all features | JWT Rotation Support | 1.1.0 | 1.0.3 | >= 3.8.0 | Enterprise | Production | True | --deployment.feature.jwt-rotation | N/A | | Operator Single Mode | 1.0.4 | 1.0.4 | >= 3.8.0 | Community, Enterprise | Production | False | --mode.single | Only 1 instance of Operator allowed in namespace when feature is enabled | | TLS SNI Support | 1.0.3 | 1.0.3 | >= 3.8.0 | Enterprise | Production | True | --deployment.feature.tls-sni | N/A | +| ActiveFailover Support | 1.0.0 | 1.0.0 | < 3.12.0 | Community, Enterprise | Production | True | --deployment.feature.active-failover | N/A | | Disabling of liveness probes | 0.3.11 | 0.3.10 | >= 3.8.0 | Community, Enterprise | Production | True | N/A | N/A | | Pod Disruption Budgets | 0.3.11 | 0.3.10 | >= 3.8.0 | Community, Enterprise | Production | True | N/A | N/A | | Prometheus Metrics Exporter | 0.3.11 | 0.3.10 | >= 3.8.0 | Community, Enterprise | Production | True | N/A | Prometheus required | diff --git a/internal/features.yaml b/internal/features.yaml index fddd3f509..2f13c1a59 100644 --- a/internal/features.yaml +++ b/internal/features.yaml @@ -140,9 +140,17 @@ features: doc: docs/features/failover_leader_service.md flag: --deployment.feature.failover-leadership enabled: false + arangoDBVersion: "< 3.12.0" releases: - operatorVersion: 1.2.13 state: Production + - name: ActiveFailover Support + flag: --deployment.feature.active-failover + enabled: true + arangoDBVersion: "< 3.12.0" + releases: + - operatorVersion: 1.0.0 + state: Production - name: Spec Default Restore doc: docs/features/deployment_spec_defaults.md flag: --deployment.feature.deployment-spec-defaults-restore diff --git a/pkg/deployment/features/failoverleadership.go b/pkg/deployment/features/active-failover.go similarity index 73% rename from pkg/deployment/features/failoverleadership.go rename to pkg/deployment/features/active-failover.go index 58690819b..2f187df60 100644 --- a/pkg/deployment/features/failoverleadership.go +++ b/pkg/deployment/features/active-failover.go @@ -22,11 +22,21 @@ package features func init() { registerFeature(failoverLeadership) + registerFeature(activeFailover) +} + +var activeFailover = &feature{ + name: "active-failover", + description: "Support for ActiveFailover mode", + version: newFeatureVersion("", "3.12"), + enterpriseRequired: false, + enabledByDefault: true, } var failoverLeadership = &feature{ name: "failover-leadership", description: "Support for leadership in fail-over mode", + version: newFeatureVersion("", "3.12"), enterpriseRequired: false, enabledByDefault: false, } @@ -34,3 +44,7 @@ var failoverLeadership = &feature{ func FailoverLeadership() Feature { return failoverLeadership } + +func ActiveFailover() Feature { + return activeFailover +} diff --git a/pkg/deployment/features/features.go b/pkg/deployment/features/features.go index 1b14f4127..6f5a1e649 100644 --- a/pkg/deployment/features/features.go +++ b/pkg/deployment/features/features.go @@ -1,7 +1,7 @@ // // DISCLAIMER // -// Copyright 2016-2023 ArangoDB GmbH, Cologne, Germany +// Copyright 2016-2024 ArangoDB GmbH, Cologne, Germany // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -32,6 +32,8 @@ import ( const ( Enabled = "true" Disabled = "false" + + NoVersionLimit driver.Version = "" ) type Features []Feature @@ -58,7 +60,7 @@ type Feature interface { Name() string Description() string Dependencies() []Feature - Version() driver.Version + Version() (driver.Version, driver.Version) EnterpriseRequired() bool OperatorEnterpriseRequired() bool EnabledByDefault() bool @@ -73,7 +75,7 @@ type Feature interface { type feature struct { name, description string - version driver.Version + version featureVersion enterpriseRequired, operatorEnterpriseRequired, enabledByDefault, enabled bool deprecated string constValue *bool @@ -81,6 +83,18 @@ type feature struct { dependencies []Feature } +func newFeatureVersion(min, max driver.Version) featureVersion { + return featureVersion{ + min: min, + max: max, + } +} + +type featureVersion struct { + min driver.Version + max driver.Version +} + func (f feature) Dependencies() []Feature { if len(f.dependencies) == 0 { return nil @@ -152,8 +166,8 @@ func (f *feature) EnabledPointer() *bool { return &f.enabled } -func (f feature) Version() driver.Version { - return f.version +func (f feature) Version() (driver.Version, driver.Version) { + return f.version.min, f.version.max } func (f feature) EnterpriseRequired() bool { diff --git a/pkg/deployment/features/local.go b/pkg/deployment/features/local.go index 730203be8..e403b451d 100644 --- a/pkg/deployment/features/local.go +++ b/pkg/deployment/features/local.go @@ -90,16 +90,21 @@ func Init(cmd *cobra.Command) error { for _, feature := range features { z := "" - version := feature.Version() + minVersion, maxVersion := feature.Version() - if version == "" { - version = MinSupportedArangoDBVersion + if minVersion == "" { + minVersion = MinSupportedArangoDBVersion + } + + versionDesc := fmt.Sprintf(">= %s", minVersion) + if maxVersion != NoVersionLimit { + versionDesc = fmt.Sprintf(">= %s, < %s", minVersion, maxVersion) } if feature.EnterpriseRequired() { - z = fmt.Sprintf("%s - Required ArangoDB EE %s or higher", feature.Description(), version) + z = fmt.Sprintf("%s - Required ArangoDB EE %s", feature.Description(), versionDesc) } else { - z = fmt.Sprintf("%s - Required ArangoDB %s or higher", feature.Description(), version) + z = fmt.Sprintf("%s - Required ArangoDB %s", feature.Description(), versionDesc) } featureArgName = GetFeatureArgName(feature.Name()) @@ -143,8 +148,12 @@ func cmdRun(_ *cobra.Command, _ []string) { } else { println("Enabled: false") } - if v := feature.Version(); v != "" { - println(fmt.Sprintf("ArangoDB Version Required: >= %s", v)) + if min, max := feature.Version(); min != NoVersionLimit && max != NoVersionLimit { + println(fmt.Sprintf("ArangoDB Version Required: >= %s, <= %s", min, max)) + } else if min != NoVersionLimit { + println(fmt.Sprintf("ArangoDB Version Required: >= %s", min)) + } else if max != NoVersionLimit { + println(fmt.Sprintf("ArangoDB Version Required: <= %s", max)) } if feature.EnterpriseRequired() { @@ -186,7 +195,20 @@ func Supported(f Feature, v driver.Version, enterprise bool) bool { } } - return v.CompareTo(f.Version()) >= 0 + min, max := f.Version() + if min != NoVersionLimit { + if v.CompareTo(min) < 0 { + return false + } + } + + if max != NoVersionLimit { + if v.CompareTo(max) >= 0 { + return false + } + } + + return true } // GetFeatureMap returns all features' arguments names. diff --git a/pkg/deployment/features/rebalancer.go b/pkg/deployment/features/rebalancer.go index 29e95c231..18c71e925 100644 --- a/pkg/deployment/features/rebalancer.go +++ b/pkg/deployment/features/rebalancer.go @@ -1,7 +1,7 @@ // // DISCLAIMER // -// Copyright 2016-2023 ArangoDB GmbH, Cologne, Germany +// Copyright 2016-2024 ArangoDB GmbH, Cologne, Germany // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -27,7 +27,7 @@ func init() { var rebalancerV2 = &feature{ name: "rebalancer-v2", description: "Rebalancer V2 feature", - version: "3.10.0", + version: newFeatureVersion("3.10.0", NoVersionLimit), enterpriseRequired: false, enabledByDefault: false, } diff --git a/pkg/deployment/features/version_3_10.go b/pkg/deployment/features/version_3_10.go index 72b4e188a..527742fe5 100644 --- a/pkg/deployment/features/version_3_10.go +++ b/pkg/deployment/features/version_3_10.go @@ -1,7 +1,7 @@ // // DISCLAIMER // -// Copyright 2016-2023 ArangoDB GmbH, Cologne, Germany +// Copyright 2016-2024 ArangoDB GmbH, Cologne, Germany // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -27,7 +27,7 @@ func init() { var version310 = &feature{ name: "version.3-10", description: "Enable support for 3.10 features", - version: "3.10.0", + version: newFeatureVersion("3.10.0", NoVersionLimit), enterpriseRequired: false, enabledByDefault: true, hidden: true, diff --git a/pkg/deployment/reconcile/plan_builder_rotate_upgrade.go b/pkg/deployment/reconcile/plan_builder_rotate_upgrade.go index 8843bee35..c31bfab73 100644 --- a/pkg/deployment/reconcile/plan_builder_rotate_upgrade.go +++ b/pkg/deployment/reconcile/plan_builder_rotate_upgrade.go @@ -325,7 +325,7 @@ func (r *Reconciler) createUpgradePlanInternal(apiObject k8sutil.APIObject, spec // podNeedsUpgrading decides if an upgrade of the pod is needed (to comply with // the given spec) and if that is allowed. -func (r *Reconciler) podNeedsUpgrading(status api.MemberStatus, spec api.DeploymentSpec, images api.ImageInfoList) upgradeDecision { +func (r *Reconciler) podNeedsUpgrading(mode api.DeploymentMode, status api.MemberStatus, spec api.DeploymentSpec, images api.ImageInfoList) upgradeDecision { currentImage, found := currentImageInfo(spec, images) if !found { // Hold rotation tasks - we do not know image @@ -342,6 +342,7 @@ func (r *Reconciler) podNeedsUpgrading(status api.MemberStatus, spec api.Deploym // No change return upgradeDecision{UpgradeNeeded: false} } + // Image changed, check if change is allowed specVersion := currentImage.ArangoDBVersion memberVersion := memberImage.ArangoDBVersion @@ -364,6 +365,21 @@ func (r *Reconciler) podNeedsUpgrading(status api.MemberStatus, spec api.Deploym UpgradeAllowed: false, } } + + // Check if ActiveFailover is supported on new version + if mode == api.DeploymentModeActiveFailover && !features.ActiveFailover().ImageSupported(¤tImage) { + // Upgrade to 3.12 in Active Failover mode is not supported! + // No change + return upgradeDecision{ + FromVersion: memberVersion, + FromLicense: memberLicense, + ToVersion: specVersion, + ToLicense: specLicense, + UpgradeNeeded: true, + UpgradeAllowed: false, + } + } + if specVersion.Major() != memberVersion.Major() || specVersion.Minor() != memberVersion.Minor() { // Is allowed, with `--database.auto-upgrade` r.planLogger.Str("spec-version", string(specVersion)).Str("pod-version", string(memberVersion)). diff --git a/pkg/deployment/reconcile/plan_builder_rotate_upgrade_decision.go b/pkg/deployment/reconcile/plan_builder_rotate_upgrade_decision.go index eace2f0df..db1648c31 100644 --- a/pkg/deployment/reconcile/plan_builder_rotate_upgrade_decision.go +++ b/pkg/deployment/reconcile/plan_builder_rotate_upgrade_decision.go @@ -67,18 +67,18 @@ func (r *Reconciler) createRotateOrUpgradeDecision(spec api.DeploymentSpec, stat upgradeOrder := util.BoolSwitch(features.UpgradeAlternativeOrder().Enabled(), alternativeUpgradeOrder, api.AllServerGroups) for _, m := range status.Members.AsListInGroups(upgradeOrder...) { - d[m.Member.ID] = r.createRotateOrUpgradeDecisionMember(spec, status, context, m) + d[m.Member.ID] = r.createRotateOrUpgradeDecisionMember(spec.Mode.Get(), spec, status, context, m) } return d } -func (r *Reconciler) createRotateOrUpgradeDecisionMember(spec api.DeploymentSpec, status api.DeploymentStatus, context PlanBuilderContext, element api.DeploymentStatusMemberElement) (d updateUpgradeDecision) { +func (r *Reconciler) createRotateOrUpgradeDecisionMember(mode api.DeploymentMode, spec api.DeploymentSpec, status api.DeploymentStatus, context PlanBuilderContext, element api.DeploymentStatusMemberElement) (d updateUpgradeDecision) { if element.Member.Phase == api.MemberPhaseCreated && element.Member.Pod.GetName() != "" { // Only upgrade when phase is created // Got pod, compare it with what it should be - decision := r.podNeedsUpgrading(element.Member, spec, status.Images) + decision := r.podNeedsUpgrading(mode, element.Member, spec, status.Images) if decision.UpgradeNeeded || decision.Hold { d.upgrade = true diff --git a/pkg/deployment/reconcile/plan_builder_rotate_upgrade_test.go b/pkg/deployment/reconcile/plan_builder_rotate_upgrade_test.go index 6c1915bb6..2abbcd4c7 100644 --- a/pkg/deployment/reconcile/plan_builder_rotate_upgrade_test.go +++ b/pkg/deployment/reconcile/plan_builder_rotate_upgrade_test.go @@ -123,7 +123,7 @@ func Test_RotateUpgrade_Condition(t *testing.T) { for n, c := range testCases { t.Run(n, func(t *testing.T) { - c.verify(t, r.podNeedsUpgrading(c.status, c.spec, c.images)) + c.verify(t, r.podNeedsUpgrading(c.spec.Mode.Get(), c.status, c.spec, c.images)) }) } } diff --git a/pkg/deployment/resources/pod_creator.go b/pkg/deployment/resources/pod_creator.go index 2609f916b..ed3691fae 100644 --- a/pkg/deployment/resources/pod_creator.go +++ b/pkg/deployment/resources/pod_creator.go @@ -330,6 +330,10 @@ func (r *Resources) RenderPodForMember(ctx context.Context, acs sutil.ACS, spec } groupSpec := spec.GetServerGroupSpec(group) + if spec.Mode.Get() == api.DeploymentModeActiveFailover && !features.ActiveFailover().ImageSupported(&imageInfo) { + return nil, errors.Errorf("ActiveFailover starting from ArangoDB 3.12 is not supported") + } + memberName := m.ArangoMemberName(r.context.GetAPIObject().GetName(), group) member, ok := acs.CurrentClusterCache().ArangoMember().V1().GetSimple(memberName) From 31b3f57b89f86d16453c13ea0d6e813ea13e54ab Mon Sep 17 00:00:00 2001 From: ajanikow <12255597+ajanikow@users.noreply.github.com> Date: Tue, 7 Jan 2025 08:13:48 +0000 Subject: [PATCH 2/2] Fix Licenses --- pkg/deployment/features/active-failover.go | 2 +- pkg/deployment/features/features.go | 2 +- pkg/deployment/features/local.go | 2 +- pkg/deployment/features/rebalancer.go | 2 +- pkg/deployment/features/version_3_10.go | 2 +- pkg/deployment/reconcile/plan_builder_rotate_upgrade.go | 2 +- .../reconcile/plan_builder_rotate_upgrade_decision.go | 2 +- pkg/deployment/reconcile/plan_builder_rotate_upgrade_test.go | 2 +- pkg/deployment/resources/pod_creator.go | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pkg/deployment/features/active-failover.go b/pkg/deployment/features/active-failover.go index 2f187df60..e283ea6ca 100644 --- a/pkg/deployment/features/active-failover.go +++ b/pkg/deployment/features/active-failover.go @@ -1,7 +1,7 @@ // // DISCLAIMER // -// Copyright 2016-2024 ArangoDB GmbH, Cologne, Germany +// Copyright 2016-2025 ArangoDB GmbH, Cologne, Germany // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/pkg/deployment/features/features.go b/pkg/deployment/features/features.go index 6f5a1e649..c597233e6 100644 --- a/pkg/deployment/features/features.go +++ b/pkg/deployment/features/features.go @@ -1,7 +1,7 @@ // // DISCLAIMER // -// Copyright 2016-2024 ArangoDB GmbH, Cologne, Germany +// Copyright 2016-2025 ArangoDB GmbH, Cologne, Germany // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/pkg/deployment/features/local.go b/pkg/deployment/features/local.go index e403b451d..ee744cc94 100644 --- a/pkg/deployment/features/local.go +++ b/pkg/deployment/features/local.go @@ -1,7 +1,7 @@ // // DISCLAIMER // -// Copyright 2016-2024 ArangoDB GmbH, Cologne, Germany +// Copyright 2016-2025 ArangoDB GmbH, Cologne, Germany // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/pkg/deployment/features/rebalancer.go b/pkg/deployment/features/rebalancer.go index 18c71e925..be35ac847 100644 --- a/pkg/deployment/features/rebalancer.go +++ b/pkg/deployment/features/rebalancer.go @@ -1,7 +1,7 @@ // // DISCLAIMER // -// Copyright 2016-2024 ArangoDB GmbH, Cologne, Germany +// Copyright 2016-2025 ArangoDB GmbH, Cologne, Germany // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/pkg/deployment/features/version_3_10.go b/pkg/deployment/features/version_3_10.go index 527742fe5..6e7ecbec7 100644 --- a/pkg/deployment/features/version_3_10.go +++ b/pkg/deployment/features/version_3_10.go @@ -1,7 +1,7 @@ // // DISCLAIMER // -// Copyright 2016-2024 ArangoDB GmbH, Cologne, Germany +// Copyright 2016-2025 ArangoDB GmbH, Cologne, Germany // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/pkg/deployment/reconcile/plan_builder_rotate_upgrade.go b/pkg/deployment/reconcile/plan_builder_rotate_upgrade.go index c31bfab73..2c402900b 100644 --- a/pkg/deployment/reconcile/plan_builder_rotate_upgrade.go +++ b/pkg/deployment/reconcile/plan_builder_rotate_upgrade.go @@ -1,7 +1,7 @@ // // DISCLAIMER // -// Copyright 2016-2024 ArangoDB GmbH, Cologne, Germany +// Copyright 2016-2025 ArangoDB GmbH, Cologne, Germany // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/pkg/deployment/reconcile/plan_builder_rotate_upgrade_decision.go b/pkg/deployment/reconcile/plan_builder_rotate_upgrade_decision.go index db1648c31..91919e29b 100644 --- a/pkg/deployment/reconcile/plan_builder_rotate_upgrade_decision.go +++ b/pkg/deployment/reconcile/plan_builder_rotate_upgrade_decision.go @@ -1,7 +1,7 @@ // // DISCLAIMER // -// Copyright 2016-2024 ArangoDB GmbH, Cologne, Germany +// Copyright 2016-2025 ArangoDB GmbH, Cologne, Germany // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/pkg/deployment/reconcile/plan_builder_rotate_upgrade_test.go b/pkg/deployment/reconcile/plan_builder_rotate_upgrade_test.go index 2abbcd4c7..7d2ee7459 100644 --- a/pkg/deployment/reconcile/plan_builder_rotate_upgrade_test.go +++ b/pkg/deployment/reconcile/plan_builder_rotate_upgrade_test.go @@ -1,7 +1,7 @@ // // DISCLAIMER // -// Copyright 2016-2024 ArangoDB GmbH, Cologne, Germany +// Copyright 2016-2025 ArangoDB GmbH, Cologne, Germany // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/pkg/deployment/resources/pod_creator.go b/pkg/deployment/resources/pod_creator.go index ed3691fae..a80fd48c3 100644 --- a/pkg/deployment/resources/pod_creator.go +++ b/pkg/deployment/resources/pod_creator.go @@ -1,7 +1,7 @@ // // DISCLAIMER // -// Copyright 2016-2024 ArangoDB GmbH, Cologne, Germany +// Copyright 2016-2025 ArangoDB GmbH, Cologne, Germany // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License.