diff --git a/CHANGELOG.md b/CHANGELOG.md index 27f3e4434..bd88ba101 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # Change Log ## [master](https://github.com/arangodb/kube-arangodb/tree/master) (N/A) +- Prevent Single member recreation +- Add OwnerReference to ClusterIP member service - Add InternalPort to ServerGroupSpec to allow user to expose tcp connection over localhost for sidecars ## [1.1.7](https://github.com/arangodb/kube-arangodb/tree/1.1.7) (2021-04-14) diff --git a/pkg/apis/deployment/v1/server_group.go b/pkg/apis/deployment/v1/server_group.go index 153ef1a31..ce478bbc9 100644 --- a/pkg/apis/deployment/v1/server_group.go +++ b/pkg/apis/deployment/v1/server_group.go @@ -35,6 +35,16 @@ func (g *ServerGroup) UnmarshalJSON(bytes []byte) error { return nil } + { + // Try with int + var s int + + if err := json.Unmarshal(bytes, &s); err == nil { + *g = ServerGroupFromRole(ServerGroup(s).AsRole()) + return nil + } + } + var s string if err := json.Unmarshal(bytes, &s); err != nil { diff --git a/pkg/deployment/reconcile/action_upgrade_member.go b/pkg/deployment/reconcile/action_upgrade_member.go index d9117f4c4..d70807255 100644 --- a/pkg/deployment/reconcile/action_upgrade_member.go +++ b/pkg/deployment/reconcile/action_upgrade_member.go @@ -93,7 +93,7 @@ func (a *actionUpgradeMember) CheckProgress(ctx context.Context) (bool, bool, er return false, abort, err } - return false, true, nil + return false, false, nil } isUpgrading := m.Phase == api.MemberPhaseUpgrading diff --git a/pkg/deployment/reconcile/plan_builder.go b/pkg/deployment/reconcile/plan_builder.go index 5a3dcb0c0..785f12f30 100644 --- a/pkg/deployment/reconcile/plan_builder.go +++ b/pkg/deployment/reconcile/plan_builder.go @@ -164,11 +164,17 @@ func createPlan(ctx context.Context, log zerolog.Logger, apiObject k8sutil.APIOb memberLog.Msg("Restoring old member. For agency members recreation of PVC is not supported - to prevent DataLoss") plan = append(plan, api.NewAction(api.ActionTypeRecreateMember, group, m.ID)) + case api.ServerGroupSingle: + // Do not remove data for singles + memberLog.Msg("Restoring old member. Rotation for single servers is not safe") + plan = append(plan, + api.NewAction(api.ActionTypeRecreateMember, group, m.ID)) default: memberLog.Msg("Creating member replacement plan because member has failed") plan = append(plan, api.NewAction(api.ActionTypeRemoveMember, group, m.ID), api.NewAction(api.ActionTypeAddMember, group, ""), + api.NewAction(api.ActionTypeWaitForMemberUp, group, api.MemberIDPreviousAction), ) } diff --git a/pkg/deployment/reconcile/plan_builder_test.go b/pkg/deployment/reconcile/plan_builder_test.go index 79742872b..1bfe9acdb 100644 --- a/pkg/deployment/reconcile/plan_builder_test.go +++ b/pkg/deployment/reconcile/plan_builder_test.go @@ -778,6 +778,7 @@ func TestCreatePlan(t *testing.T) { ExpectedPlan: []api.Action{ api.NewAction(api.ActionTypeRemoveMember, api.ServerGroupCoordinators, "id"), api.NewAction(api.ActionTypeAddMember, api.ServerGroupCoordinators, ""), + api.NewAction(api.ActionTypeWaitForMemberUp, api.ServerGroupCoordinators, api.MemberIDPreviousAction), }, ExpectedLog: "Creating member replacement plan because member has failed", }, @@ -796,6 +797,7 @@ func TestCreatePlan(t *testing.T) { ExpectedPlan: []api.Action{ api.NewAction(api.ActionTypeRemoveMember, api.ServerGroupDBServers, "id"), api.NewAction(api.ActionTypeAddMember, api.ServerGroupDBServers, ""), + api.NewAction(api.ActionTypeWaitForMemberUp, api.ServerGroupDBServers, api.MemberIDPreviousAction), }, ExpectedLog: "Creating member replacement plan because member has failed", }, diff --git a/pkg/deployment/resources/services.go b/pkg/deployment/resources/services.go index 4c93aa447..c5e33d83f 100644 --- a/pkg/deployment/resources/services.go +++ b/pkg/deployment/resources/services.go @@ -80,6 +80,9 @@ func (r *Resources) EnsureServices(cachedStatus inspectorInterface.Inspector) er ObjectMeta: metav1.ObjectMeta{ Name: member.GetName(), Namespace: member.GetNamespace(), + OwnerReferences: []metav1.OwnerReference{ + member.AsOwner(), + }, }, Spec: core.ServiceSpec{ Type: core.ServiceTypeClusterIP,