1
1
package io .javaoperatorsdk .operator .glue .dependent ;
2
2
3
+ import java .util .Objects ;
4
+ import java .util .Optional ;
5
+ import java .util .Set ;
6
+
7
+ import org .slf4j .Logger ;
8
+ import org .slf4j .LoggerFactory ;
9
+
3
10
import io .fabric8 .kubernetes .api .model .GenericKubernetesResource ;
4
11
import io .fabric8 .kubernetes .client .utils .Serialization ;
5
12
import io .javaoperatorsdk .operator .api .reconciler .Context ;
@@ -20,33 +27,41 @@ public class GenericDependentResource
20
27
Updater <GenericKubernetesResource , Glue >,
21
28
Creator <GenericKubernetesResource , Glue > {
22
29
30
+ private static final Logger log = LoggerFactory .getLogger (GenericDependentResource .class );
31
+
23
32
protected final GenericKubernetesResource desired ;
24
33
protected final String desiredTemplate ;
25
- protected final String name ;
34
+ // resource name might be templated
35
+ protected final String resourceName ;
36
+ protected final String namespace ;
26
37
protected final boolean clusterScoped ;
27
38
protected final Matcher matcher ;
28
39
29
40
protected final GenericTemplateHandler genericTemplateHandler ;
30
41
31
42
public GenericDependentResource (GenericTemplateHandler genericTemplateHandler ,
32
- GenericKubernetesResource desired , String name ,
43
+ GenericKubernetesResource desired , String name , String resourceName , String namespace ,
33
44
boolean clusterScoped , Matcher matcher ) {
34
- super (new GroupVersionKind (desired .getApiVersion (), desired .getKind ()));
45
+ super (new GroupVersionKind (desired .getApiVersion (), desired .getKind ()), name );
35
46
this .desired = desired ;
47
+ this .namespace = namespace ;
36
48
this .matcher = matcher ;
37
49
this .desiredTemplate = null ;
38
- this .name = name ;
50
+ this .resourceName = resourceName ;
39
51
this .clusterScoped = clusterScoped ;
40
52
this .genericTemplateHandler = genericTemplateHandler ;
41
53
}
42
54
43
55
public GenericDependentResource (GenericTemplateHandler genericTemplateHandler ,
44
- String desiredTemplate , String name , boolean clusterScoped , Matcher matcher ) {
56
+ String desiredTemplate , String name , String resourceName , String namespace ,
57
+ boolean clusterScoped ,
58
+ Matcher matcher ) {
45
59
super (new GroupVersionKind (Utils .getApiVersionFromTemplate (desiredTemplate ),
46
- Utils .getKindFromTemplate (desiredTemplate )));
60
+ Utils .getKindFromTemplate (desiredTemplate )), name );
47
61
this .genericTemplateHandler = genericTemplateHandler ;
48
- this .name = name ;
62
+ this .resourceName = resourceName ;
49
63
this .desiredTemplate = desiredTemplate ;
64
+ this .namespace = namespace ;
50
65
this .matcher = matcher ;
51
66
this .desired = null ;
52
67
this .clusterScoped = clusterScoped ;
@@ -84,4 +99,38 @@ public Result<GenericKubernetesResource> match(GenericKubernetesResource actualR
84
99
return Result .nonComputed (false );
85
100
}
86
101
}
102
+
103
+ @ Override
104
+ protected Optional <GenericKubernetesResource > selectTargetSecondaryResource (
105
+ Set <GenericKubernetesResource > secondaryResources ,
106
+ Glue primary ,
107
+ Context <Glue > context ) {
108
+
109
+ var allSecondaryResources = context .getSecondaryResources (GenericKubernetesResource .class );
110
+ if (log .isDebugEnabled ()) {
111
+ log .debug ("All secondary resources for DR: {}, resources: {}" , name ,
112
+ allSecondaryResources .stream ()
113
+ .map (r -> "{ Name: %s; Namespace: %s }" .formatted (r .getMetadata ().getName (),
114
+ r .getMetadata ().getNamespace ()))
115
+ .toList ());
116
+ }
117
+ var res = allSecondaryResources
118
+ .stream ()
119
+ .filter (r -> r .getKind ().equals (getGroupVersionKind ().getKind ()) &&
120
+ r .getApiVersion ().equals (getGroupVersionKind ().apiVersion ()) &&
121
+ r .getMetadata ().getName ().equals (resourceName ) &&
122
+ (namespace == null || Objects .equals (namespace , r .getMetadata ().getNamespace ())))
123
+ .toList ();
124
+
125
+ if (res .size () > 1 ) {
126
+ throw new IllegalStateException ("Multiple resources found for gvk: " + getGroupVersionKind ()
127
+ + " name:" + name
128
+ + " namespace:" + namespace );
129
+ } else if (res .size () == 1 ) {
130
+ return Optional .of (res .get (0 ));
131
+ } else {
132
+ return Optional .empty ();
133
+ }
134
+ }
135
+
87
136
}
0 commit comments