From bcc7d8f33fa18231dd36941ee30b0b772d6b0649 Mon Sep 17 00:00:00 2001 From: ajanikow <12255597+ajanikow@users.noreply.github.com> Date: Tue, 24 Nov 2020 14:53:20 +0000 Subject: [PATCH 1/2] Allow plan cleanup --- pkg/apis/deployment/annotations.go | 1 + pkg/deployment/deployment.go | 23 +++++++++++++++++++++++ pkg/deployment/deployment_inspector.go | 17 ++++++++++++++++- 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/pkg/apis/deployment/annotations.go b/pkg/apis/deployment/annotations.go index 07f7df9c6..7d9696189 100644 --- a/pkg/apis/deployment/annotations.go +++ b/pkg/apis/deployment/annotations.go @@ -27,4 +27,5 @@ const ( ArangoDeploymentPodMaintenanceAnnotation = ArangoDeploymentAnnotationPrefix + "/maintenance" ArangoDeploymentPodRotateAnnotation = ArangoDeploymentAnnotationPrefix + "/rotate" ArangoDeploymentPodReplaceAnnotation = ArangoDeploymentAnnotationPrefix + "/replace" + ArangoDeploymentPlanCleanAnnotation = "plan." + ArangoDeploymentAnnotationPrefix + "/clean" ) diff --git a/pkg/deployment/deployment.go b/pkg/deployment/deployment.go index 75985b7fc..1aa57725d 100644 --- a/pkg/deployment/deployment.go +++ b/pkg/deployment/deployment.go @@ -29,6 +29,9 @@ import ( "sync/atomic" "time" + "github.com/arangodb/kube-arangodb/pkg/deployment/patch" + "k8s.io/apimachinery/pkg/types" + "github.com/arangodb/kube-arangodb/pkg/operator/scope" monitoringClient "github.com/coreos/prometheus-operator/pkg/client/versioned/typed/monitoring/v1" @@ -511,3 +514,23 @@ func (d *Deployment) SetNumberOfServers(ctx context.Context, noCoordinators, noD func (d *Deployment) getArangoDeployment() *api.ArangoDeployment { return d.apiObject } + +func (d *Deployment) ApplyPatch(p ...patch.Item) error { + parser := patch.Patch(p) + + data, err := parser.Marshal() + if err != nil { + return err + } + + c := d.deps.DatabaseCRCli.DatabaseV1().ArangoDeployments(d.apiObject.GetNamespace()) + + depl, err := c.Patch(d.apiObject.GetName(), types.JSONPatchType, data) + if err != nil { + return err + } + + d.apiObject = depl + + return nil +} diff --git a/pkg/deployment/deployment_inspector.go b/pkg/deployment/deployment_inspector.go index a798e0f99..690d7bfd7 100644 --- a/pkg/deployment/deployment_inspector.go +++ b/pkg/deployment/deployment_inspector.go @@ -26,6 +26,8 @@ import ( "context" "time" + "github.com/arangodb/kube-arangodb/pkg/deployment/patch" + operatorErrors "github.com/arangodb/kube-arangodb/pkg/util/errors" "github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector" @@ -99,6 +101,8 @@ func (d *Deployment) inspectDeployment(lastInterval util.Interval) util.Interval return nextInterval } + d.apiObject = updated + if inspectNextInterval, err := d.inspectDeploymentWithError(ctx, nextInterval, cachedStatus); err != nil { if !operatorErrors.IsReconcile(err) { nextInterval = inspectNextInterval @@ -210,7 +214,18 @@ func (d *Deployment) inspectDeploymentWithError(ctx context.Context, lastInterva } // Create scale/update plan - if err, updated := d.reconciler.CreatePlan(ctx, cachedStatus); err != nil { + if _, ok := d.apiObject.Annotations[deployment.ArangoDeploymentPlanCleanAnnotation]; ok { + if err := d.ApplyPatch(patch.ItemRemove(patch.NewPath("metadata", "annotations", deployment.ArangoDeploymentPlanCleanAnnotation))); err != nil { + return minInspectionInterval, errors.Errorf("Unable to create remove annotation patch", err) + } + + if err := d.WithStatusUpdate(func(s *api.DeploymentStatus) bool { + s.Plan = nil + return true + }, true); err != nil { + return minInspectionInterval, errors.Errorf("Unable clean plan", err) + } + } else if err, updated := d.reconciler.CreatePlan(ctx, cachedStatus); err != nil { return minInspectionInterval, errors.Wrapf(err, "Plan creation failed") } else if updated { return minInspectionInterval, nil From ad3b855e13e87474c43de75ca3b5f57f8c0b9ba6 Mon Sep 17 00:00:00 2001 From: ajanikow <12255597+ajanikow@users.noreply.github.com> Date: Fri, 27 Nov 2020 12:08:02 +0000 Subject: [PATCH 2/2] Fix UT --- CHANGELOG.md | 1 + pkg/deployment/deployment_inspector.go | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 96e9d79dd..e5e5fb636 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - Migrate CRD to apiextensions.k8s.io/v1 - Add customizable log levels per service - Move Upgrade as InitContainer and fix Direct Image discovery mode +- Allow to remove currently executed plan by annotation ## [1.1.2](https://github.com/arangodb/kube-arangodb/tree/1.1.2) (2020-11-11) - Fix Bootstrap phase and move it under Plan diff --git a/pkg/deployment/deployment_inspector.go b/pkg/deployment/deployment_inspector.go index 690d7bfd7..baeac6d83 100644 --- a/pkg/deployment/deployment_inspector.go +++ b/pkg/deployment/deployment_inspector.go @@ -216,14 +216,14 @@ func (d *Deployment) inspectDeploymentWithError(ctx context.Context, lastInterva // Create scale/update plan if _, ok := d.apiObject.Annotations[deployment.ArangoDeploymentPlanCleanAnnotation]; ok { if err := d.ApplyPatch(patch.ItemRemove(patch.NewPath("metadata", "annotations", deployment.ArangoDeploymentPlanCleanAnnotation))); err != nil { - return minInspectionInterval, errors.Errorf("Unable to create remove annotation patch", err) + return minInspectionInterval, errors.Wrapf(err, "Unable to create remove annotation patch") } if err := d.WithStatusUpdate(func(s *api.DeploymentStatus) bool { s.Plan = nil return true }, true); err != nil { - return minInspectionInterval, errors.Errorf("Unable clean plan", err) + return minInspectionInterval, errors.Wrapf(err, "Unable clean plan") } } else if err, updated := d.reconciler.CreatePlan(ctx, cachedStatus); err != nil { return minInspectionInterval, errors.Wrapf(err, "Plan creation failed")