Skip to content

Commit 36a2a73

Browse files
authored
[Feature] CreationFailed ArangoMember Phase (#1237)
1 parent c9d3827 commit 36a2a73

File tree

8 files changed

+52
-14
lines changed

8 files changed

+52
-14
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
## [master](https://github.com/arangodb/kube-arangodb/tree/master) (N/A)
44
- (Feature) Add Generics & Drop policy/v1beta1 support
55
- (Feature) Add Kubernetes Client logger
6+
- (Feature) CreationFailed ArangoMember Phase
67

78
## [1.2.24](https://github.com/arangodb/kube-arangodb/tree/1.2.24) (2023-01-25)
89
- (Bugfix) Fix deployment creation on ARM64

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -519,10 +519,10 @@ vendor:
519519
@go mod vendor -e
520520

521521
set-deployment-api-version-v2alpha1: export API_VERSION=2alpha1
522-
set-deployment-api-version-v2alpha1: set-api-version/deployment set-typed-api-version/deployment set-api-version/replication
522+
set-deployment-api-version-v2alpha1: set-api-version/deployment set-api-version/replication
523523

524524
set-deployment-api-version-v1: export API_VERSION=1
525-
set-deployment-api-version-v1: set-api-version/deployment set-typed-api-version/deployment set-api-version/replication
525+
set-deployment-api-version-v1: set-api-version/deployment set-api-version/replication
526526

527527
set-typed-api-version/%:
528528
@grep -rHn "github.com/arangodb/kube-arangodb/pkg/generated/clientset/versioned/typed/$*/v[A-Za-z0-9]\+" \

pkg/apis/deployment/v1/member_phase.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//
22
// DISCLAIMER
33
//
4-
// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany
4+
// Copyright 2016-2023 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.
@@ -30,6 +30,8 @@ const (
3030
MemberPhasePending MemberPhase = "Pending"
3131
// MemberPhaseCreated indicates that all resources needed for the member have been created
3232
MemberPhaseCreated MemberPhase = "Created"
33+
// MemberPhaseCreationFailed indicates that creation of member resources was not possible, fallback to MemberPhaseCreated state
34+
MemberPhaseCreationFailed MemberPhase = "CreationFailed"
3335
// MemberPhaseFailed indicates that the member is gone beyond hope of recovery. It must be replaced with a new member.
3436
MemberPhaseFailed MemberPhase = "Failed"
3537
// MemberPhaseCleanOut indicates that a dbserver is in the process of being cleaned out
@@ -50,7 +52,7 @@ const (
5052

5153
// IsPending returns true when given phase == "" OR "Pending"
5254
func (p MemberPhase) IsPending() bool {
53-
return p == MemberPhaseNone || p == MemberPhasePending
55+
return p == MemberPhaseNone || p == MemberPhasePending || p == MemberPhaseCreationFailed
5456
}
5557

5658
// IsFailed returns true when given phase == "Failed"
@@ -76,7 +78,7 @@ func (p MemberPhase) String() string {
7678
// GetPhase parses string into phase
7779
func GetPhase(phase string) (MemberPhase, bool) {
7880
switch p := MemberPhase(phase); p {
79-
case MemberPhaseNone, MemberPhasePending, MemberPhaseCreated, MemberPhaseFailed, MemberPhaseCleanOut, MemberPhaseDrain, MemberPhaseResign, MemberPhaseShuttingDown, MemberPhaseRotating, MemberPhaseRotateStart, MemberPhaseUpgrading:
81+
case MemberPhaseNone, MemberPhasePending, MemberPhaseCreated, MemberPhaseCreationFailed, MemberPhaseFailed, MemberPhaseCleanOut, MemberPhaseDrain, MemberPhaseResign, MemberPhaseShuttingDown, MemberPhaseRotating, MemberPhaseRotateStart, MemberPhaseUpgrading:
8082
return p, true
8183
default:
8284
return "", false

pkg/apis/deployment/v2alpha1/member_phase.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//
22
// DISCLAIMER
33
//
4-
// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany
4+
// Copyright 2016-2023 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.
@@ -30,6 +30,8 @@ const (
3030
MemberPhasePending MemberPhase = "Pending"
3131
// MemberPhaseCreated indicates that all resources needed for the member have been created
3232
MemberPhaseCreated MemberPhase = "Created"
33+
// MemberPhaseCreationFailed indicates that creation of member resources was not possible, fallback to MemberPhaseCreated state
34+
MemberPhaseCreationFailed MemberPhase = "CreationFailed"
3335
// MemberPhaseFailed indicates that the member is gone beyond hope of recovery. It must be replaced with a new member.
3436
MemberPhaseFailed MemberPhase = "Failed"
3537
// MemberPhaseCleanOut indicates that a dbserver is in the process of being cleaned out
@@ -50,7 +52,7 @@ const (
5052

5153
// IsPending returns true when given phase == "" OR "Pending"
5254
func (p MemberPhase) IsPending() bool {
53-
return p == MemberPhaseNone || p == MemberPhasePending
55+
return p == MemberPhaseNone || p == MemberPhasePending || p == MemberPhaseCreationFailed
5456
}
5557

5658
// IsFailed returns true when given phase == "Failed"
@@ -76,7 +78,7 @@ func (p MemberPhase) String() string {
7678
// GetPhase parses string into phase
7779
func GetPhase(phase string) (MemberPhase, bool) {
7880
switch p := MemberPhase(phase); p {
79-
case MemberPhaseNone, MemberPhasePending, MemberPhaseCreated, MemberPhaseFailed, MemberPhaseCleanOut, MemberPhaseDrain, MemberPhaseResign, MemberPhaseShuttingDown, MemberPhaseRotating, MemberPhaseRotateStart, MemberPhaseUpgrading:
81+
case MemberPhaseNone, MemberPhasePending, MemberPhaseCreated, MemberPhaseCreationFailed, MemberPhaseFailed, MemberPhaseCleanOut, MemberPhaseDrain, MemberPhaseResign, MemberPhaseShuttingDown, MemberPhaseRotating, MemberPhaseRotateStart, MemberPhaseUpgrading:
8082
return p, true
8183
default:
8284
return "", false

pkg/deployment/reconcile/plan_builder_high.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//
22
// DISCLAIMER
33
//
4-
// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany
4+
// Copyright 2016-2023 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.
@@ -105,6 +105,15 @@ func (r *Reconciler) updateMemberPhasePlan(ctx context.Context, apiObject k8suti
105105
)
106106
plan = append(plan, p...)
107107
}
108+
109+
if e.Member.Phase == api.MemberPhaseCreationFailed {
110+
var p api.Plan
111+
p = append(p,
112+
actions.NewAction(api.ActionTypeMemberPhaseUpdate, e.Group, e.Member,
113+
"Move to None phase due to Creation Error").AddParam(actionTypeMemberPhaseUpdatePhaseKey, api.MemberPhaseNone.String()),
114+
)
115+
plan = append(plan, p...)
116+
}
108117
}
109118

110119
return plan

pkg/deployment/resilience/member_failure.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//
22
// DISCLAIMER
33
//
4-
// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany
4+
// Copyright 2016-2023 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.
@@ -50,7 +50,7 @@ func (r *Resilience) CheckMemberFailure(ctx context.Context) error {
5050

5151
// Check if there are Members with Phase Upgrading or Rotation but no plan
5252
switch m.Phase {
53-
case api.MemberPhaseNone, api.MemberPhasePending:
53+
case api.MemberPhaseNone, api.MemberPhasePending, api.MemberPhaseCreationFailed:
5454
continue
5555
case api.MemberPhaseUpgrading, api.MemberPhaseRotating, api.MemberPhaseCleanOut, api.MemberPhaseRotateStart, api.MemberPhaseShuttingDown:
5656
if len(status.Plan) == 0 {

pkg/deployment/resources/pod_creator.go

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//
22
// DISCLAIMER
33
//
4-
// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany
4+
// Copyright 2016-2023 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.
@@ -40,6 +40,7 @@ import (
4040
"github.com/arangodb/kube-arangodb/pkg/deployment/features"
4141
"github.com/arangodb/kube-arangodb/pkg/deployment/member"
4242
"github.com/arangodb/kube-arangodb/pkg/deployment/pod"
43+
"github.com/arangodb/kube-arangodb/pkg/deployment/reconciler"
4344
"github.com/arangodb/kube-arangodb/pkg/util"
4445
"github.com/arangodb/kube-arangodb/pkg/util/constants"
4546
"github.com/arangodb/kube-arangodb/pkg/util/errors"
@@ -438,8 +439,12 @@ func (r *Resources) createPodForMember(ctx context.Context, cachedStatus inspect
438439

439440
ctxChild, cancel := globals.GetGlobalTimeouts().Kubernetes().WithTimeout(ctx)
440441
defer cancel()
442+
441443
podName, uid, err := CreateArangoPod(ctxChild, cachedStatus.PodsModInterface().V1(), apiObject, spec, group, CreatePodFromTemplate(template.PodSpec))
442444
if err != nil {
445+
if uerr := r.context.WithMemberStatusUpdateErr(ctx, m.ID, group, updateMemberPhase(api.MemberPhaseCreationFailed)); uerr != nil {
446+
return errors.WithStack(uerr)
447+
}
443448
return errors.WithStack(err)
444449
}
445450

@@ -486,6 +491,9 @@ func (r *Resources) createPodForMember(ctx context.Context, cachedStatus inspect
486491
defer cancel()
487492
podName, uid, err := CreateArangoPod(ctxChild, cachedStatus.PodsModInterface().V1(), apiObject, spec, group, CreatePodFromTemplate(template.PodSpec))
488493
if err != nil {
494+
if uerr := r.context.WithMemberStatusUpdateErr(ctx, m.ID, group, updateMemberPhase(api.MemberPhaseCreationFailed)); uerr != nil {
495+
return errors.WithStack(uerr)
496+
}
489497
return errors.WithStack(err)
490498
}
491499

@@ -691,3 +699,19 @@ func CreatePodSuffix(spec api.DeploymentSpec) string {
691699
hash := sha1.Sum(raw)
692700
return fmt.Sprintf("%0x", hash)[:6]
693701
}
702+
703+
func updateMemberPhase(phase api.MemberPhase) reconciler.DeploymentMemberStatusUpdateErrFunc {
704+
return func(s *api.MemberStatus) (bool, error) {
705+
if s == nil {
706+
return false, nil
707+
}
708+
709+
if s.Phase == phase {
710+
return false, nil
711+
}
712+
713+
s.Phase = phase
714+
715+
return true, nil
716+
}
717+
}

pkg/deployment/resources/pod_inspector.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//
22
// DISCLAIMER
33
//
4-
// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany
4+
// Copyright 2016-2023 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.
@@ -471,7 +471,7 @@ func (r *Resources) InspectPods(ctx context.Context, cachedStatus inspectorInter
471471
if _, exists := cachedStatus.Pod().V1().GetSimple(podName); !exists {
472472
log.Str("pod-name", podName).Debug("Does not exist")
473473
switch m.Phase {
474-
case api.MemberPhaseNone, api.MemberPhasePending:
474+
case api.MemberPhaseNone, api.MemberPhasePending, api.MemberPhaseCreationFailed:
475475
// Do nothing
476476
log.Str("pod-name", podName).Debug("PodPhase is None, waiting for the pod to be recreated")
477477
case api.MemberPhaseShuttingDown, api.MemberPhaseUpgrading, api.MemberPhaseFailed, api.MemberPhaseRotateStart, api.MemberPhaseRotating:

0 commit comments

Comments
 (0)