Skip to content

Commit 58f9cdb

Browse files
authored
[Feature] Enforce UpgradeByReplace for ArangoDB Upgrade from 3.12.2/3 to 3.12.4+ (#1828)
1 parent 829a935 commit 58f9cdb

File tree

4 files changed

+95
-4
lines changed

4 files changed

+95
-4
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
- (Feature) Delay Action
1919
- (Feature) MigrateMember Action
2020
- (Maintenance) Ensure Enum in the UpgradeMode Enum Schema
21+
- (Feature) Enforce UpgradeByReplace operation by default for ArangoDB from 3.12.2/3 to 3.12.4+
2122

2223
## [1.2.44](https://github.com/arangodb/kube-arangodb/tree/1.2.44) (2025-02-03)
2324
- (Maintenance) Kubernetes 1.31.1 libraries

pkg/deployment/features/upgrade.go

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//
22
// DISCLAIMER
33
//
4-
// Copyright 2016-2024 ArangoDB GmbH, Cologne, Germany
4+
// Copyright 2016-2025 ArangoDB GmbH, Cologne, Germany
55
//
66
// Licensed under the Apache License, Version 2.0 (the "License");
77
// you may not use this file except in compliance with the License.
@@ -20,10 +20,17 @@
2020

2121
package features
2222

23+
import (
24+
"github.com/arangodb/go-driver"
25+
26+
api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1"
27+
)
28+
2329
func init() {
2430
registerFeature(upgradeVersionCheck)
2531
registerFeature(upgradeVersionCheckV2)
2632
registerFeature(upgradeAlternativeOrder)
33+
registerFeature(upgradeIndexOrderIssue)
2734
}
2835

2936
var upgradeVersionCheck Feature = &feature{
@@ -48,6 +55,14 @@ var upgradeAlternativeOrder Feature = &feature{
4855
hidden: true,
4956
}
5057

58+
var upgradeIndexOrderIssue Feature = &feature{
59+
name: "upgrade-index-order-issue",
60+
description: "Changes the default upgrade mode for DBServers while upgrading from 3.12.2/3.12.3 to 3.12.4+",
61+
enterpriseRequired: false,
62+
enabledByDefault: true,
63+
hidden: true,
64+
}
65+
5166
func UpgradeVersionCheck() Feature {
5267
return upgradeVersionCheck
5368
}
@@ -57,3 +72,26 @@ func UpgradeVersionCheckV2() Feature {
5772
}
5873

5974
func UpgradeAlternativeOrder() Feature { return upgradeAlternativeOrder }
75+
76+
func UpgradeIndexOrderIssue() Feature { return upgradeIndexOrderIssue }
77+
78+
func IsUpgradeIndexOrderIssueEnabled(group api.ServerGroup, from, to driver.Version) bool {
79+
if !UpgradeIndexOrderIssue().Enabled() {
80+
return false
81+
}
82+
83+
if group != api.ServerGroupDBServers {
84+
return false
85+
}
86+
87+
if from.CompareTo("3.12.2") < 0 || from.CompareTo("3.12.3") > 0 {
88+
// Outside of versions
89+
return false
90+
}
91+
92+
if to.CompareTo("3.12.4") < 0 {
93+
return false
94+
}
95+
96+
return true
97+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
//
2+
// DISCLAIMER
3+
//
4+
// Copyright 2025 ArangoDB GmbH, Cologne, Germany
5+
//
6+
// Licensed under the Apache License, Version 2.0 (the "License");
7+
// you may not use this file except in compliance with the License.
8+
// You may obtain a copy of the License at
9+
//
10+
// http://www.apache.org/licenses/LICENSE-2.0
11+
//
12+
// Unless required by applicable law or agreed to in writing, software
13+
// distributed under the License is distributed on an "AS IS" BASIS,
14+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
// See the License for the specific language governing permissions and
16+
// limitations under the License.
17+
//
18+
// Copyright holder is ArangoDB GmbH, Cologne, Germany
19+
//
20+
21+
package features
22+
23+
import (
24+
"testing"
25+
26+
"github.com/stretchr/testify/require"
27+
28+
"github.com/arangodb/go-driver"
29+
30+
api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1"
31+
)
32+
33+
func testIsUpgradeIndexOrderIssueEnabled(enabled bool, group api.ServerGroup, from, to driver.Version) bool {
34+
*upgradeIndexOrderIssue.EnabledPointer() = enabled
35+
36+
return IsUpgradeIndexOrderIssueEnabled(group, from, to)
37+
}
38+
39+
func Test_IsUpgradeIndexOrderIssueEnabled(t *testing.T) {
40+
require.True(t, testIsUpgradeIndexOrderIssueEnabled(true, api.ServerGroupDBServers, "3.12.2", "3.12.4"))
41+
require.False(t, testIsUpgradeIndexOrderIssueEnabled(false, api.ServerGroupDBServers, "3.12.2", "3.12.4"))
42+
require.False(t, testIsUpgradeIndexOrderIssueEnabled(true, api.ServerGroupCoordinators, "3.12.2", "3.12.4"))
43+
require.False(t, testIsUpgradeIndexOrderIssueEnabled(true, api.ServerGroupAgents, "3.12.2", "3.12.4"))
44+
require.False(t, testIsUpgradeIndexOrderIssueEnabled(true, api.ServerGroupSingle, "3.12.2", "3.12.4"))
45+
require.True(t, testIsUpgradeIndexOrderIssueEnabled(true, api.ServerGroupDBServers, "3.12.3", "3.12.4"))
46+
require.False(t, testIsUpgradeIndexOrderIssueEnabled(true, api.ServerGroupDBServers, "3.12.4", "3.12.4"))
47+
require.True(t, testIsUpgradeIndexOrderIssueEnabled(true, api.ServerGroupDBServers, "3.12.2", "3.12.55"))
48+
}

pkg/deployment/reconcile/plan_builder_rotate_upgrade.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -316,11 +316,15 @@ func (r *Reconciler) createUpgradePlanInternal(apiObject k8sutil.APIObject, spec
316316
return nil, false
317317
}
318318

319+
um := spec.GetServerGroupSpec(group).UpgradeMode
320+
321+
if features.IsUpgradeIndexOrderIssueEnabled(group, d.upgradeDecision.FromVersion, d.upgradeDecision.ToVersion) && um == nil {
322+
um = util.NewType(api.ServerGroupUpgradeModeReplace)
323+
}
324+
319325
switch group {
320326
case api.ServerGroupDBServers:
321-
gspec := spec.GetServerGroupSpec(group)
322-
323-
if gspec.UpgradeMode.Get() == api.ServerGroupUpgradeModeReplace {
327+
if um.Get() == api.ServerGroupUpgradeModeReplace {
324328
// Members are suppose to be replaced
325329
if !m.Member.Conditions.IsTrue(api.ConditionTypeMarkedToRemove) {
326330
return api.Plan{actions.NewAction(api.ActionTypeMarkToRemoveMember, m.Group, m.Member, "Replace by Upgrade")}, false

0 commit comments

Comments
 (0)