Skip to content

Commit dfeb5ee

Browse files
authored
Add recreate + orphan behavior for DDAI (#2509)
1 parent c5cf124 commit dfeb5ee

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

internal/controller/datadogagentinternal/controller_reconcile_v2_common.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package datadogagentinternal
88
import (
99
"context"
1010
"fmt"
11+
"maps"
1112
"time"
1213

1314
edsv1alpha1 "github.com/DataDog/extendeddaemonset/api/v1alpha1"
@@ -21,9 +22,11 @@ import (
2122
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
2223
"sigs.k8s.io/controller-runtime/pkg/reconcile"
2324

25+
apicommon "github.com/DataDog/datadog-operator/api/datadoghq/common"
2426
"github.com/DataDog/datadog-operator/api/datadoghq/v1alpha1"
2527
"github.com/DataDog/datadog-operator/pkg/agentprofile"
2628
"github.com/DataDog/datadog-operator/pkg/condition"
29+
"github.com/DataDog/datadog-operator/pkg/constants"
2730
"github.com/DataDog/datadog-operator/pkg/controller/utils/comparison"
2831
"github.com/DataDog/datadog-operator/pkg/controller/utils/datadog"
2932
"github.com/DataDog/datadog-operator/pkg/kubernetes"
@@ -96,6 +99,14 @@ func (r *Reconciler) createOrUpdateDeployment(parentLogger logr.Logger, ddai *v1
9699
}
97100
logger.Info("Deployment owner reference patched")
98101
}
102+
103+
if restartDeployment(deployment, currentDeployment) {
104+
if err = deleteObjectAndOrphanDependents(context.TODO(), logger, r.client, deployment, deployment.GetLabels()[apicommon.AgentDeploymentComponentLabelKey]); err != nil {
105+
return result, err
106+
}
107+
return result, nil
108+
}
109+
99110
// check if same hash
100111
needUpdate := !comparison.IsSameSpecMD5Hash(hash, currentDeployment.GetAnnotations())
101112
if !needUpdate {
@@ -195,6 +206,14 @@ func (r *Reconciler) createOrUpdateDaemonset(parentLogger logr.Logger, ddai *v1a
195206
}
196207
logger.Info("Daemonset owner reference patched")
197208
}
209+
210+
if restartDaemonset(daemonset, currentDaemonset) {
211+
if err = deleteObjectAndOrphanDependents(context.TODO(), logger, r.client, daemonset, constants.DefaultAgentResourceSuffix); err != nil {
212+
return result, err
213+
}
214+
return result, nil
215+
}
216+
198217
now := metav1.Now()
199218

200219
// When overriding node labels in <1.7.0, the hash could be updated
@@ -443,3 +462,31 @@ func IsEqualStatus(current *v1alpha1.DatadogAgentInternalStatus, newStatus *v1al
443462

444463
return condition.IsEqualConditions(current.Conditions, newStatus.Conditions)
445464
}
465+
466+
func restartDaemonset(daemonset, currentDaemonset *appsv1.DaemonSet) bool {
467+
// name change
468+
if daemonset.Name != currentDaemonset.Name {
469+
return true
470+
}
471+
472+
// selectors are immutable
473+
if !maps.Equal(daemonset.Spec.Selector.MatchLabels, currentDaemonset.Spec.Selector.MatchLabels) {
474+
return true
475+
}
476+
477+
return false
478+
}
479+
480+
func restartDeployment(deployment, currentDeployment *appsv1.Deployment) bool {
481+
// name change
482+
if deployment.Name != currentDeployment.Name {
483+
return true
484+
}
485+
486+
// selectors are immutable
487+
if !maps.Equal(deployment.Spec.Selector.MatchLabels, currentDeployment.Spec.Selector.MatchLabels) {
488+
return true
489+
}
490+
491+
return false
492+
}

internal/controller/datadogagentinternal/utils.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,25 @@
66
package datadogagentinternal
77

88
import (
9+
"context"
910
"encoding/json"
1011
"fmt"
1112
"maps"
1213
"strings"
1314

1415
"github.com/go-logr/logr"
1516
"github.com/gobwas/glob"
17+
apierrors "k8s.io/apimachinery/pkg/api/errors"
1618
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
19+
"k8s.io/apimachinery/pkg/labels"
1720
"k8s.io/apimachinery/pkg/runtime"
1821
"k8s.io/apimachinery/pkg/runtime/schema"
22+
"sigs.k8s.io/controller-runtime/pkg/client"
1923
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
2024

25+
apicommon "github.com/DataDog/datadog-operator/api/datadoghq/common"
2126
apiutils "github.com/DataDog/datadog-operator/api/utils"
27+
"github.com/DataDog/datadog-operator/pkg/kubernetes"
2228
)
2329

2430
func mergeAnnotationsLabels(logger logr.Logger, previousVal map[string]string, newVal map[string]string, filter string) map[string]string {
@@ -161,3 +167,21 @@ func getReplicas(currentReplicas, newReplicas *int32) *int32 {
161167

162168
return apiutils.NewInt32Pointer(*newReplicas)
163169
}
170+
171+
// delete ALL workloads for a given DDA/DDAI and orphan pods
172+
func deleteObjectAndOrphanDependents(ctx context.Context, logger logr.Logger, c client.Client, obj client.Object, component string) error {
173+
propagationPolicy := metav1.DeletePropagationOrphan
174+
selector := labels.SelectorFromSet(labels.Set{
175+
kubernetes.AppKubernetesPartOfLabelKey: obj.GetLabels()[kubernetes.AppKubernetesPartOfLabelKey],
176+
apicommon.AgentDeploymentComponentLabelKey: component,
177+
})
178+
logger.Info("deleting all workloads for matching DDAI", "labels", selector.String())
179+
if err := c.DeleteAllOf(ctx, obj, &client.DeleteAllOfOptions{ListOptions: client.ListOptions{LabelSelector: selector, Namespace: obj.GetNamespace()}, DeleteOptions: client.DeleteOptions{PropagationPolicy: &propagationPolicy}}); err != nil {
180+
if apierrors.IsNotFound(err) {
181+
logger.Info("object not found, skipping deletion", "object", obj.GetName(), "namespace", obj.GetNamespace())
182+
return nil
183+
}
184+
return err
185+
}
186+
return nil
187+
}

0 commit comments

Comments
 (0)