Skip to content

Commit 229a11c

Browse files
committed
ssa: Skip suspended resources from wait result errors
Signed-off-by: Stefan Prodan <stefan.prodan@gmail.com>
1 parent 6081556 commit 229a11c

File tree

4 files changed

+55
-1
lines changed

4 files changed

+55
-1
lines changed

ssa/manager_wait.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,12 @@ func (m *ResourceManager) WaitForSet(set object.ObjMetadataSet, opts WaitOptions
136136
errs = append(errs, builder.String())
137137
case errors.Is(ctx.Err(), context.DeadlineExceeded) && lastStatus[id].Status != status.CurrentStatus:
138138
var builder strings.Builder
139+
if utils.IsSuspended(lastStatus[id].Resource) {
140+
// skip suspended resources that are not in a failed state
141+
// as they are not expected to be reconciled and
142+
// their observed generation will always be behind
143+
continue
144+
}
139145
builder.WriteString(fmt.Sprintf("%s status: '%s'",
140146
utils.FmtObjMetadata(rs.Identifier), lastStatus[id].Status))
141147
if rs.Error != nil {

ssa/manager_wait_test.go

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ func TestWaitForSet(t *testing.T) {
4242
ctx, cancel := context.WithTimeout(context.Background(), timeout)
4343
defer cancel()
4444

45+
waitOps := DefaultWaitOptions()
46+
waitOps.Timeout = timeout
47+
4548
id := generateName("wait")
4649
objects, err := readManifest("testdata/test5.yaml", id)
4750
if err != nil {
@@ -99,7 +102,41 @@ func TestWaitForSet(t *testing.T) {
99102
t.Fatal(err)
100103
}
101104

102-
if err := manager.WaitForSet(changeSet.ToObjMetadataSet(), DefaultWaitOptions()); err != nil {
105+
if err := manager.WaitForSet(changeSet.ToObjMetadataSet(), waitOps); err != nil {
106+
t.Errorf("wait error: %v", err)
107+
}
108+
})
109+
110+
t.Run("skips suspended CRs", func(t *testing.T) {
111+
clusterCR := &unstructured.Unstructured{}
112+
clusterCR.SetGroupVersionKind(schema.GroupVersionKind{
113+
Group: "testing.fluxcd.io",
114+
Kind: "ClusterTest",
115+
Version: "v1",
116+
})
117+
if err := manager.client.Get(ctx, client.ObjectKeyFromObject(cr), clusterCR); err != nil {
118+
t.Fatal(err)
119+
}
120+
121+
clusterCR.SetManagedFields(nil)
122+
err = unstructured.SetNestedField(clusterCR.Object, true, "spec", "suspend")
123+
if err != nil {
124+
t.Fatal(err)
125+
}
126+
127+
opts := &client.SubResourcePatchOptions{
128+
PatchOptions: client.PatchOptions{
129+
FieldManager: manager.owner.Field,
130+
},
131+
}
132+
133+
// Suspend the CR and thus bumping the generation.
134+
if err := manager.client.Patch(ctx, clusterCR, client.Apply, opts); err != nil {
135+
t.Fatal(err)
136+
}
137+
138+
metaSet := object.UnstructuredSetToObjMetadataSet([]*unstructured.Unstructured{clusterCR})
139+
if err := manager.WaitForSet(metaSet, waitOps); err != nil {
103140
t.Errorf("wait error: %v", err)
104141
}
105142
})

ssa/testdata/test5.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ spec:
3131
spec:
3232
description: TestSpec defines the desired state of a test run
3333
properties:
34+
suspend:
35+
type: boolean
3436
type:
3537
description: Type of test
3638
type: string

ssa/utils/is.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,12 @@ func IsKustomization(object *unstructured.Unstructured) bool {
6363
func IsSecret(object *unstructured.Unstructured) bool {
6464
return strings.ToLower(object.GetKind()) == "secret" && object.GetAPIVersion() == "v1"
6565
}
66+
67+
// IsSuspended returns true if the given object has '.spec.suspend' set to true.
68+
func IsSuspended(object *unstructured.Unstructured) bool {
69+
if object == nil {
70+
return false
71+
}
72+
suspended, _, _ := unstructured.NestedBool(object.Object, "spec", "suspend")
73+
return suspended
74+
}

0 commit comments

Comments
 (0)