Skip to content

Commit c3dccbb

Browse files
authored
[Bugfix] Do not block reconciliation in case of Resource failure (#1193)
1 parent b0bd486 commit c3dccbb

File tree

8 files changed

+80
-80
lines changed

8 files changed

+80
-80
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
- (Improvement) Do not check checksums for DeploymentReplicationStatus.IncomingSynchronization field values
2929
- (Improvement) Add ServerGroup details into ServerGroupSpec
3030
- (Improvement) Add Resource kerror Type
31+
- (Bugfix) Do not block reconciliation in case of Resource failure
3132

3233
## [1.2.20](https://github.com/arangodb/kube-arangodb/tree/1.2.20) (2022-10-25)
3334
- (Feature) Add action progress

pkg/deployment/deployment.go

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -326,13 +326,6 @@ func (d *Deployment) run() {
326326
}
327327

328328
if d.GetPhase() == api.DeploymentPhaseNone {
329-
// Create service monitor
330-
if d.haveServiceMonitorCRD {
331-
if err := d.resources.EnsureServiceMonitor(context.TODO()); err != nil {
332-
d.CreateEvent(k8sutil.NewErrorEvent("Failed to create service monitor", err, d.GetAPIObject()))
333-
}
334-
}
335-
336329
// Create initial topology
337330
if err := d.createInitialTopology(context.TODO()); err != nil {
338331
d.CreateEvent(k8sutil.NewErrorEvent("Failed to create initial topology", err, d.GetAPIObject()))

pkg/deployment/deployment_inspector.go

Lines changed: 4 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ import (
3434
"github.com/arangodb/kube-arangodb/pkg/util/errors"
3535
"github.com/arangodb/kube-arangodb/pkg/util/globals"
3636
"github.com/arangodb/kube-arangodb/pkg/util/k8sutil"
37-
inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector"
3837
"github.com/arangodb/kube-arangodb/pkg/util/k8sutil/kerrors"
3938
)
4039

@@ -251,21 +250,8 @@ func (d *Deployment) inspectDeploymentWithError(ctx context.Context, lastInterva
251250
} else {
252251
nextInterval = nextInterval.ReduceTo(x)
253252
}
254-
255-
if err := d.resources.EnsureLeader(ctx, d.GetCachedStatus()); err != nil {
256-
return minInspectionInterval, errors.Wrapf(err, "Creating leaders failed")
257-
}
258-
259-
if err := d.resources.EnsureArangoMembers(ctx, d.GetCachedStatus()); err != nil {
260-
return minInspectionInterval, errors.Wrapf(err, "ArangoMember creation failed")
261-
}
262-
263-
if err := d.resources.EnsureServices(ctx, d.GetCachedStatus()); err != nil {
264-
return minInspectionInterval, errors.Wrapf(err, "Service creation failed")
265-
}
266-
267-
if err := d.resources.EnsureSecrets(ctx, d.GetCachedStatus()); err != nil {
268-
return minInspectionInterval, errors.Wrapf(err, "Secret creation failed")
253+
if err := d.resources.EnsureCoreResources(ctx, d.GetCachedStatus()); err != nil {
254+
d.log.Err(err).Error("Unable to ensure core resources")
269255
}
270256

271257
// Inspect secret hashes
@@ -308,10 +294,8 @@ func (d *Deployment) inspectDeploymentWithError(ctx context.Context, lastInterva
308294
return minInspectionInterval, errors.Wrapf(err, "Reconciler immediate actions failed")
309295
}
310296

311-
if interval, err := d.ensureResources(ctx, nextInterval, d.GetCachedStatus()); err != nil {
312-
return minInspectionInterval, errors.Wrapf(err, "Reconciler resource recreation failed")
313-
} else {
314-
nextInterval = interval
297+
if err := d.resources.EnsureResources(ctx, d.haveServiceMonitorCRD, d.GetCachedStatus()); err != nil {
298+
d.log.Err(err).Error("Unable to ensure resources")
315299
}
316300

317301
d.metrics.Agency.Fetches++
@@ -521,38 +505,6 @@ func (d *Deployment) refreshMaintenanceTTL(ctx context.Context) {
521505
}
522506
}
523507

524-
// ensureResources creates all required resources for the deployment
525-
func (d *Deployment) ensureResources(ctx context.Context, lastInterval util.Interval, cachedStatus inspectorInterface.Inspector) (util.Interval, error) {
526-
// Ensure all resources are created
527-
if d.haveServiceMonitorCRD {
528-
if err := d.resources.EnsureServiceMonitor(ctx); err != nil {
529-
return minInspectionInterval, errors.Wrapf(err, "Service monitor creation failed")
530-
}
531-
}
532-
533-
if err := d.resources.EnsurePVCs(ctx, cachedStatus); err != nil {
534-
return minInspectionInterval, errors.Wrapf(err, "PVC creation failed")
535-
}
536-
537-
if err := d.resources.EnsurePods(ctx, cachedStatus); err != nil {
538-
return minInspectionInterval, errors.Wrapf(err, "Pod creation failed")
539-
}
540-
541-
if err := d.resources.EnsurePDBs(ctx); err != nil {
542-
return minInspectionInterval, errors.Wrapf(err, "PDB creation failed")
543-
}
544-
545-
if err := d.resources.EnsureAnnotations(ctx, cachedStatus); err != nil {
546-
return minInspectionInterval, errors.Wrapf(err, "Annotation update failed")
547-
}
548-
549-
if err := d.resources.EnsureLabels(ctx, cachedStatus); err != nil {
550-
return minInspectionInterval, errors.Wrapf(err, "Labels update failed")
551-
}
552-
553-
return lastInterval, nil
554-
}
555-
556508
// triggerInspection ensures that an inspection is run soon.
557509
func (d *Deployment) triggerInspection() {
558510
d.inspectTrigger.Trigger()

pkg/deployment/resources/resources.go

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,13 @@
2020

2121
package resources
2222

23-
import "github.com/arangodb/kube-arangodb/pkg/logging"
23+
import (
24+
"context"
25+
26+
"github.com/arangodb/kube-arangodb/pkg/logging"
27+
errors "github.com/arangodb/kube-arangodb/pkg/util/errors"
28+
inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector"
29+
)
2430

2531
// Resources is a service that creates low level resources for members
2632
// and inspects low level resources, put the inspection result in members.
@@ -45,3 +51,19 @@ func NewResources(namespace, name string, context Context) *Resources {
4551

4652
return r
4753
}
54+
55+
func (r *Resources) EnsureCoreResources(ctx context.Context, cachedStatus inspectorInterface.Inspector) error {
56+
return errors.Errors(errors.Section(r.EnsureLeader(ctx, cachedStatus), "EnsureLeader"),
57+
errors.Section(r.EnsureArangoMembers(ctx, cachedStatus), "EnsureArangoMembers"),
58+
errors.Section(r.EnsureServices(ctx, cachedStatus), "EnsureServices"),
59+
errors.Section(r.EnsureSecrets(ctx, cachedStatus), "EnsureSecrets"))
60+
}
61+
62+
func (r *Resources) EnsureResources(ctx context.Context, serviceMonitorEnabled bool, cachedStatus inspectorInterface.Inspector) error {
63+
return errors.Errors(errors.Section(r.EnsureServiceMonitor(ctx, serviceMonitorEnabled), "EnsureServiceMonitor"),
64+
errors.Section(r.EnsurePVCs(ctx, cachedStatus), "EnsurePVCs"),
65+
errors.Section(r.EnsurePods(ctx, cachedStatus), "EnsurePods"),
66+
errors.Section(r.EnsurePDBs(ctx), "EnsurePDBs"),
67+
errors.Section(r.EnsureAnnotations(ctx, cachedStatus), "EnsureAnnotations"),
68+
errors.Section(r.EnsureLabels(ctx, cachedStatus), "EnsureLabels"))
69+
}

pkg/deployment/resources/secrets.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -88,13 +88,13 @@ func (r *Resources) EnsureSecrets(ctx context.Context, cachedStatus inspectorInt
8888
if spec.IsAuthenticated() {
8989
counterMetric.Inc()
9090
if err := reconcileRequired.WithError(r.ensureTokenSecret(ctx, cachedStatus, secrets, spec.Authentication.GetJWTSecretName())); err != nil {
91-
return errors.WithStack(err)
91+
return errors.Section(err, "JWT Secret")
9292
}
9393
}
9494
if spec.IsSecure() {
9595
counterMetric.Inc()
9696
if err := reconcileRequired.WithError(r.ensureTLSCACertificateSecret(ctx, cachedStatus, secrets, spec.TLS)); err != nil {
97-
return errors.WithStack(err)
97+
return errors.Section(err, "TLS CA")
9898
}
9999
}
100100

@@ -106,26 +106,26 @@ func (r *Resources) EnsureSecrets(ctx context.Context, cachedStatus inspectorInt
106106
if imageFound {
107107
if pod.VersionHasJWTSecretKeyfolder(image.ArangoDBVersion, image.Enterprise) {
108108
if err := r.ensureTokenSecretFolder(ctx, cachedStatus, secrets, spec.Authentication.GetJWTSecretName(), pod.JWTSecretFolder(deploymentName)); err != nil {
109-
return errors.WithStack(err)
109+
return errors.Section(err, "JWT Folder")
110110
}
111111
}
112112
}
113113

114114
if spec.Metrics.IsEnabled() {
115115
if imageFound && pod.VersionHasJWTSecretKeyfolder(image.ArangoDBVersion, image.Enterprise) {
116116
if err := reconcileRequired.WithError(r.ensureExporterTokenSecret(ctx, cachedStatus, secrets, spec.Metrics.GetJWTTokenSecretName(), pod.JWTSecretFolder(deploymentName))); err != nil {
117-
return errors.WithStack(err)
117+
return errors.Section(err, "Metrics JWT")
118118
}
119119
} else {
120120
if err := reconcileRequired.WithError(r.ensureExporterTokenSecret(ctx, cachedStatus, secrets, spec.Metrics.GetJWTTokenSecretName(), spec.Authentication.GetJWTSecretName())); err != nil {
121-
return errors.WithStack(err)
121+
return errors.Section(err, "Metrics JWT")
122122
}
123123
}
124124
}
125125
}
126126
if spec.IsSecure() {
127127
if err := reconcileRequired.WithError(r.ensureSecretWithEmptyKey(ctx, cachedStatus, secrets, GetCASecretName(r.context.GetAPIObject()), "empty")); err != nil {
128-
return errors.WithStack(err)
128+
return errors.Section(err, "TLS TrustStore")
129129
}
130130

131131
if err := reconcileRequired.ParallelAll(len(members), func(id int) error {
@@ -160,32 +160,32 @@ func (r *Resources) EnsureSecrets(ctx context.Context, cachedStatus inspectorInt
160160
}
161161
return nil
162162
}); err != nil {
163-
return errors.WithStack(err)
163+
return errors.Section(err, "TLS TrustStore")
164164
}
165165
}
166166
if spec.RocksDB.IsEncrypted() {
167167
if i := status.CurrentImage; i != nil && features.EncryptionRotation().Supported(i.ArangoDBVersion, i.Enterprise) {
168168
if err := reconcileRequired.WithError(r.ensureEncryptionKeyfolderSecret(ctx, cachedStatus, secrets, spec.RocksDB.Encryption.GetKeySecretName(), pod.GetEncryptionFolderSecretName(deploymentName))); err != nil {
169-
return errors.WithStack(err)
169+
return errors.Section(err, "Encryption")
170170
}
171171
}
172172
}
173173
if spec.Sync.IsEnabled() {
174174
counterMetric.Inc()
175175
if err := reconcileRequired.WithError(r.ensureTokenSecret(ctx, cachedStatus, secrets, spec.Sync.Authentication.GetJWTSecretName())); err != nil {
176-
return errors.WithStack(err)
176+
return errors.Section(err, "Sync Auth")
177177
}
178178
counterMetric.Inc()
179179
if err := reconcileRequired.WithError(r.ensureTokenSecret(ctx, cachedStatus, secrets, spec.Sync.Monitoring.GetTokenSecretName())); err != nil {
180-
return errors.WithStack(err)
180+
return errors.Section(err, "Sync Monitoring Auth")
181181
}
182182
counterMetric.Inc()
183183
if err := reconcileRequired.WithError(r.ensureTLSCACertificateSecret(ctx, cachedStatus, secrets, spec.Sync.TLS)); err != nil {
184-
return errors.WithStack(err)
184+
return errors.Section(err, "Sync TLS CA")
185185
}
186186
counterMetric.Inc()
187187
if err := reconcileRequired.WithError(r.ensureClientAuthCACertificateSecret(ctx, cachedStatus, secrets, spec.Sync.Authentication)); err != nil {
188-
return errors.WithStack(err)
188+
return errors.Section(err, "Sync TLS Client CA")
189189
}
190190
}
191191
return reconcileRequired.Reconcile(ctx)
@@ -321,7 +321,7 @@ func (r *Resources) createSecretWithMod(ctx context.Context, secrets secretv1.Mo
321321

322322
err := globals.GetGlobalTimeouts().Kubernetes().RunWithTimeout(ctx, func(ctxChild context.Context) error {
323323
_, err := secrets.Create(ctxChild, secret, meta.CreateOptions{})
324-
return err
324+
return kerrors.NewResourceError(err, secret)
325325
})
326326
if err != nil {
327327
// Failed to create secret
@@ -412,7 +412,7 @@ func AppendKeyfileToKeyfolder(ctx context.Context, cachedStatus inspectorInterfa
412412
k8sutil.AddOwnerRefToObject(secret, ownerRef)
413413
if _, err := secrets.Create(ctx, secret, meta.CreateOptions{}); err != nil {
414414
// Failed to create secret
415-
return errors.WithStack(err)
415+
return kerrors.NewResourceError(err, secret)
416416
}
417417

418418
return errors.Reconcile()

pkg/deployment/resources/servicemonitor.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,11 @@ func (r *Resources) serviceMonitorSpec() (coreosv1.ServiceMonitorSpec, error) {
122122
}
123123

124124
// EnsureServiceMonitor creates or updates a ServiceMonitor.
125-
func (r *Resources) EnsureServiceMonitor(ctx context.Context) error {
125+
func (r *Resources) EnsureServiceMonitor(ctx context.Context, enabled bool) error {
126+
if !enabled {
127+
return nil
128+
}
129+
126130
// Some preparations:
127131
log := r.log.Str("section", "service-monitor")
128132
apiObject := r.context.GetAPIObject()

pkg/util/errors/section.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
//
2+
// DISCLAIMER
3+
//
4+
// Copyright 2016-2022 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 errors
22+
23+
import "github.com/pkg/errors"
24+
25+
func Section(cause error, format string, args ...interface{}) error {
26+
return errors.Wrapf(cause, format, args...)
27+
}

pkg/util/k8sutil/secrets.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
"github.com/arangodb/kube-arangodb/pkg/util/errors"
3232
"github.com/arangodb/kube-arangodb/pkg/util/globals"
3333
secretv1 "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/secret/v1"
34+
"github.com/arangodb/kube-arangodb/pkg/util/k8sutil/kerrors"
3435
)
3536

3637
// ValidateEncryptionKeySecret checks that a secret with given name in given namespace
@@ -71,7 +72,7 @@ func CreateEncryptionKeySecret(secrets secretv1.ModInterface, secretName string,
7172
}
7273
if _, err := secrets.Create(context.Background(), secret, meta.CreateOptions{}); err != nil {
7374
// Failed to create secret
74-
return errors.WithStack(err)
75+
return kerrors.NewResourceError(err, secret)
7576
}
7677
return nil
7778
}
@@ -165,7 +166,7 @@ func CreateCASecret(ctx context.Context, secrets secretv1.ModInterface, secretNa
165166
AddOwnerRefToObject(secret, ownerRef)
166167
if _, err := secrets.Create(ctx, secret, meta.CreateOptions{}); err != nil {
167168
// Failed to create secret
168-
return errors.WithStack(err)
169+
return kerrors.NewResourceError(err, secret)
169170
}
170171
return nil
171172
}
@@ -207,7 +208,7 @@ func CreateTLSKeyfileSecret(ctx context.Context, secrets secretv1.ModInterface,
207208
AddOwnerRefToObject(secret, ownerRef)
208209
if _, err := secrets.Create(ctx, secret, meta.CreateOptions{}); err != nil {
209210
// Failed to create secret
210-
return errors.WithStack(err)
211+
return kerrors.NewResourceError(err, secret)
211212
}
212213
return nil
213214
}
@@ -267,7 +268,7 @@ func CreateTokenSecret(ctx context.Context, secrets secretv1.ModInterface, secre
267268
AddOwnerRefToObject(secret, ownerRef)
268269
if _, err := secrets.Create(ctx, secret, meta.CreateOptions{}); err != nil {
269270
// Failed to create secret
270-
return errors.WithStack(err)
271+
return kerrors.NewResourceError(err, secret)
271272
}
272273
return nil
273274
}
@@ -327,7 +328,7 @@ func CreateBasicAuthSecret(ctx context.Context, secrets secretv1.ModInterface, s
327328
AddOwnerRefToObject(secret, ownerRef)
328329
err := globals.GetGlobalTimeouts().Kubernetes().RunWithTimeout(ctx, func(ctxChild context.Context) error {
329330
_, err := secrets.Create(ctxChild, secret, meta.CreateOptions{})
330-
return err
331+
return kerrors.NewResourceError(err, secret)
331332
})
332333
if err != nil {
333334
// Failed to create secret

0 commit comments

Comments
 (0)