diff --git a/pkg/apis/deployment/v1alpha/deployment_status.go b/pkg/apis/deployment/v1alpha/deployment_status.go index ad175eab4..632a41658 100644 --- a/pkg/apis/deployment/v1alpha/deployment_status.go +++ b/pkg/apis/deployment/v1alpha/deployment_status.go @@ -22,6 +22,8 @@ package v1alpha +import "github.com/arangodb/kube-arangodb/pkg/util" + // DeploymentStatus contains the status part of a Cluster resource. type DeploymentStatus struct { // Phase holds the current lifetime phase of the deployment @@ -56,6 +58,9 @@ type DeploymentStatus struct { // SecretHashes keeps a sha256 hash of secret values, so we can // detect changes in secret values. SecretHashes *SecretHashes `json:"secret-hashes,omitempty"` + + // ForceStatusReload if set to true forces a reload of the status from the custom resource. + ForceStatusReload *bool `json:"force-status-reload,omitempty"` } // Equal checks for equality @@ -72,3 +77,8 @@ func (ds *DeploymentStatus) Equal(other DeploymentStatus) bool { ds.AcceptedSpec.Equal(other.AcceptedSpec) && ds.SecretHashes.Equal(other.SecretHashes) } + +// IsForceReload returns true if ForceStatusReload is set to true +func (ds *DeploymentStatus) IsForceReload() bool { + return util.BoolOrDefault(ds.ForceStatusReload, false) +} diff --git a/pkg/apis/deployment/v1alpha/zz_generated.deepcopy.go b/pkg/apis/deployment/v1alpha/zz_generated.deepcopy.go index 7b7ef7234..6e1f42609 100644 --- a/pkg/apis/deployment/v1alpha/zz_generated.deepcopy.go +++ b/pkg/apis/deployment/v1alpha/zz_generated.deepcopy.go @@ -308,6 +308,11 @@ func (in *DeploymentStatus) DeepCopyInto(out *DeploymentStatus) { *out = new(SecretHashes) **out = **in } + if in.ForceStatusReload != nil { + in, out := &in.ForceStatusReload, &out.ForceStatusReload + *out = new(bool) + **out = **in + } return } diff --git a/pkg/deployment/deployment.go b/pkg/deployment/deployment.go index 20329edba..a01866ed1 100644 --- a/pkg/deployment/deployment.go +++ b/pkg/deployment/deployment.go @@ -289,7 +289,7 @@ func (d *Deployment) handleArangoDeploymentUpdatedEvent() error { newAPIObject := current.DeepCopy() newAPIObject.Spec.SetDefaultsFrom(specBefore) newAPIObject.Spec.SetDefaults(d.apiObject.GetName()) - newAPIObject.Status = status + resetFields := specBefore.ResetImmutableFields(&newAPIObject.Spec) if len(resetFields) > 0 { log.Debug().Strs("fields", resetFields).Msg("Found modified immutable fields") @@ -318,6 +318,11 @@ func (d *Deployment) handleArangoDeploymentUpdatedEvent() error { // Save updated accepted spec { status, lastVersion := d.GetStatus() + if newAPIObject.Status.IsForceReload() { + log.Warn().Msg("Forced status reload!") + status = newAPIObject.Status + status.ForceStatusReload = nil + } status.AcceptedSpec = newAPIObject.Spec.DeepCopy() if err := d.UpdateStatus(status, lastVersion); err != nil { return maskAny(fmt.Errorf("failed to update ArangoDeployment status: %v", err)) diff --git a/pkg/deployment/reconcile/action_remove_member.go b/pkg/deployment/reconcile/action_remove_member.go index 8824d373c..613bc4fbe 100644 --- a/pkg/deployment/reconcile/action_remove_member.go +++ b/pkg/deployment/reconcile/action_remove_member.go @@ -70,6 +70,8 @@ func (a *actionRemoveMember) Start(ctx context.Context) (bool, error) { if err := arangod.RemoveServerFromCluster(ctx, client.Connection(), driver.ServerID(m.ID)); err != nil { if !driver.IsNotFound(err) && !driver.IsPreconditionFailed(err) { return false, maskAny(errors.Wrapf(err, "Failed to remove server from cluster: %#v", err)) + } else { + a.log.Warn().Msgf("ignoring error: %s", err.Error()) } } }