@@ -25,6 +25,7 @@ import (
25
25
"helm.sh/helm/v3/pkg/releaseutil"
26
26
"k8s.io/apimachinery/pkg/api/meta"
27
27
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
28
+ "k8s.io/apimachinery/pkg/runtime"
28
29
"k8s.io/apimachinery/pkg/runtime/schema"
29
30
"sigs.k8s.io/controller-runtime/pkg/controller"
30
31
"sigs.k8s.io/controller-runtime/pkg/handler"
@@ -69,32 +70,65 @@ func (d *dependentResourceWatcher) Exec(owner *unstructured.Unstructured, rel re
69
70
}
70
71
71
72
depGVK := obj .GroupVersionKind ()
72
- if _ , ok := d . watches [ depGVK ]; ok || depGVK .Empty () {
73
+ if depGVK .Empty () {
73
74
continue
74
75
}
75
76
76
- useOwnerRef , err := controllerutil .SupportsOwnerReference (d .restMapper , owner , & obj )
77
- if err != nil {
78
- return err
79
- }
77
+ var setWatchOnResource = func (dependent runtime.Object ) error {
78
+ unstructuredObj := dependent .(* unstructured.Unstructured )
79
+ gvkDependent := unstructuredObj .GroupVersionKind ()
80
+
81
+ if gvkDependent .Empty () {
82
+ return nil
83
+ }
84
+
85
+ _ , ok := d .watches [gvkDependent ]
86
+ if ok {
87
+ return nil
88
+ }
80
89
81
- if useOwnerRef && ! manifestutil .HasResourcePolicyKeep (obj .GetAnnotations ()) {
82
- if err := d .controller .Watch (& source.Kind {Type : & obj }, & handler.EnqueueRequestForOwner {
83
- OwnerType : owner ,
84
- IsController : true ,
85
- }, dependentPredicate ); err != nil {
90
+ useOwnerRef , err := controllerutil .SupportsOwnerReference (d .restMapper , owner , unstructuredObj )
91
+ if err != nil {
86
92
return err
87
93
}
94
+
95
+ if useOwnerRef && ! manifestutil .HasResourcePolicyKeep (unstructuredObj .GetAnnotations ()) { // Setup watch using owner references.
96
+ if err := d .controller .Watch (& source.Kind {Type : unstructuredObj }, & handler.EnqueueRequestForOwner {
97
+ OwnerType : owner ,
98
+ IsController : true ,
99
+ }, dependentPredicate ); err != nil {
100
+ return err
101
+ }
102
+ } else { // Setup watch using annotations.
103
+ if err := d .controller .Watch (& source.Kind {Type : unstructuredObj }, & sdkhandler.EnqueueRequestForAnnotation {
104
+ Type : owner .GetObjectKind ().GroupVersionKind ().GroupKind (),
105
+ }, dependentPredicate ); err != nil {
106
+ return err
107
+ }
108
+ }
109
+
110
+ d .watches [depGVK ] = struct {}{}
111
+ log .V (1 ).Info ("Watching dependent resource" , "dependentAPIVersion" , depGVK .GroupVersion (), "dependentKind" , depGVK .Kind )
112
+ return nil
113
+ }
114
+
115
+ // List is not actually a resource and therefore cannot have a
116
+ // watch on it. The watch will be on the kinds listed in the list
117
+ // and will therefore need to be handled individually.
118
+ listGVK := schema.GroupVersionKind {Group : "" , Version : "v1" , Kind : "List" }
119
+ if depGVK == listGVK {
120
+ errListItem := obj .EachListItem (func (o runtime.Object ) error {
121
+ return setWatchOnResource (o )
122
+ })
123
+ if errListItem != nil {
124
+ return errListItem
125
+ }
88
126
} else {
89
- if err := d .controller .Watch (& source.Kind {Type : & obj }, & sdkhandler.EnqueueRequestForAnnotation {
90
- Type : owner .GetObjectKind ().GroupVersionKind ().GroupKind (),
91
- }, dependentPredicate ); err != nil {
127
+ err := setWatchOnResource (& obj )
128
+ if err != nil {
92
129
return err
93
130
}
94
131
}
95
-
96
- d .watches [depGVK ] = struct {}{}
97
- log .V (1 ).Info ("Watching dependent resource" , "dependentAPIVersion" , depGVK .GroupVersion (), "dependentKind" , depGVK .Kind )
98
132
}
99
133
return nil
100
134
}
0 commit comments