Skip to content

Commit 397712d

Browse files
authored
[Feature] Do not remove Agency members (#535)
1 parent d8c9f5a commit 397712d

File tree

4 files changed

+54
-12
lines changed

4 files changed

+54
-12
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Change Log
22

33
## [master](https://github.com/arangodb/kube-arangodb/tree/master) (N/A)
4+
- Prevent Agency Members recreation
45
- Added Customizable Volumes and VolumeMounts for ArangoDB server container
56
- Added MemoryOverride flag for ArangoDB >= 3.6.3
67
- Improved Rotation discovery process

pkg/deployment/reconcile/action_recreate_member.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ func (a *actionRecreateMember) Start(ctx context.Context) (bool, error) {
6363
_, err := a.actionCtx.GetPvc(m.PersistentVolumeClaimName)
6464
if err != nil {
6565
if kubeErrors.IsNotFound(err) {
66-
return false, fmt.Errorf("PVC is missing %s. DBServer wont be recreated without old PV", m.PersistentVolumeClaimName)
66+
return false, fmt.Errorf("PVC is missing %s. Members won't be recreated without old PV", m.PersistentVolumeClaimName)
6767
}
6868

6969
return false, maskAny(err)

pkg/deployment/reconcile/plan_builder.go

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -155,15 +155,20 @@ func createPlan(log zerolog.Logger, apiObject k8sutil.APIObject,
155155
// Everything is fine, proceed
156156
}
157157

158-
memberLog.Msg("Creating member replacement plan because member has failed")
159-
newID := ""
160-
if group == api.ServerGroupAgents {
161-
newID = m.ID // Agents cannot (yet) be replaced with new IDs
158+
switch group {
159+
case api.ServerGroupAgents:
160+
// For agents just recreate member do not rotate ID, do not remove PVC or service
161+
memberLog.Msg("Restoring old member. For agency members recreation of PVC is not supported - to prevent DataLoss")
162+
plan = append(plan,
163+
api.NewAction(api.ActionTypeRecreateMember, group, m.ID))
164+
default:
165+
memberLog.Msg("Creating member replacement plan because member has failed")
166+
plan = append(plan,
167+
api.NewAction(api.ActionTypeRemoveMember, group, m.ID),
168+
api.NewAction(api.ActionTypeAddMember, group, ""),
169+
)
170+
162171
}
163-
plan = append(plan,
164-
api.NewAction(api.ActionTypeRemoveMember, group, m.ID),
165-
api.NewAction(api.ActionTypeAddMember, group, newID),
166-
)
167172
}
168173
return nil
169174
})

pkg/deployment/reconcile/plan_builder_test.go

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -681,7 +681,7 @@ func TestCreatePlan(t *testing.T) {
681681
ExpectedLog: "Creating rotation plan",
682682
},
683683
{
684-
Name: "Member in failed state",
684+
Name: "Agent in failed state",
685685
context: &testContext{
686686
ArangoDeployment: deploymentTemplate.DeepCopy(),
687687
},
@@ -690,10 +690,46 @@ func TestCreatePlan(t *testing.T) {
690690
Count: util.NewInt(2),
691691
}
692692
ad.Status.Members.Agents[0].Phase = api.MemberPhaseFailed
693+
ad.Status.Members.Agents[0].ID = "id"
693694
},
694695
ExpectedPlan: []api.Action{
695-
api.NewAction(api.ActionTypeRemoveMember, api.ServerGroupAgents, ""),
696-
api.NewAction(api.ActionTypeAddMember, api.ServerGroupAgents, ""),
696+
api.NewAction(api.ActionTypeRecreateMember, api.ServerGroupAgents, "id"),
697+
},
698+
ExpectedLog: "Restoring old member. For agency members recreation of PVC is not supported - to prevent DataLoss",
699+
},
700+
{
701+
Name: "Coordinator in failed state",
702+
context: &testContext{
703+
ArangoDeployment: deploymentTemplate.DeepCopy(),
704+
},
705+
Helper: func(ad *api.ArangoDeployment) {
706+
ad.Spec.Coordinators = api.ServerGroupSpec{
707+
Count: util.NewInt(2),
708+
}
709+
ad.Status.Members.Coordinators[0].Phase = api.MemberPhaseFailed
710+
ad.Status.Members.Coordinators[0].ID = "id"
711+
},
712+
ExpectedPlan: []api.Action{
713+
api.NewAction(api.ActionTypeRemoveMember, api.ServerGroupCoordinators, "id"),
714+
api.NewAction(api.ActionTypeAddMember, api.ServerGroupCoordinators, ""),
715+
},
716+
ExpectedLog: "Creating member replacement plan because member has failed",
717+
},
718+
{
719+
Name: "DBServer in failed state",
720+
context: &testContext{
721+
ArangoDeployment: deploymentTemplate.DeepCopy(),
722+
},
723+
Helper: func(ad *api.ArangoDeployment) {
724+
ad.Spec.DBServers = api.ServerGroupSpec{
725+
Count: util.NewInt(2),
726+
}
727+
ad.Status.Members.DBServers[0].Phase = api.MemberPhaseFailed
728+
ad.Status.Members.DBServers[0].ID = "id"
729+
},
730+
ExpectedPlan: []api.Action{
731+
api.NewAction(api.ActionTypeRemoveMember, api.ServerGroupDBServers, "id"),
732+
api.NewAction(api.ActionTypeAddMember, api.ServerGroupDBServers, ""),
697733
},
698734
ExpectedLog: "Creating member replacement plan because member has failed",
699735
},

0 commit comments

Comments
 (0)