7
7
import org .slf4j .Logger ;
8
8
import org .slf4j .LoggerFactory ;
9
9
10
- import io .fabric8 .kubernetes .api .model .OwnerReference ;
10
+ import io .fabric8 .kubernetes .api .model .ObjectMeta ;
11
11
import io .fabric8 .kubernetes .api .model .Service ;
12
+ import io .fabric8 .kubernetes .api .model .ServiceBuilder ;
12
13
import io .fabric8 .kubernetes .api .model .apps .Deployment ;
13
14
import io .fabric8 .kubernetes .api .model .apps .DeploymentStatus ;
14
15
import io .fabric8 .kubernetes .client .KubernetesClient ;
15
- import io .fabric8 .kubernetes .client .informers .SharedIndexInformer ;
16
16
import io .fabric8 .kubernetes .client .utils .Serialization ;
17
- import io .javaoperatorsdk .operator .api .config .Cloner ;
18
17
import io .javaoperatorsdk .operator .api .reconciler .Context ;
19
18
import io .javaoperatorsdk .operator .api .reconciler .ControllerConfiguration ;
20
- import io .javaoperatorsdk .operator .api .reconciler .EventSourceInitializer ;
21
19
import io .javaoperatorsdk .operator .api .reconciler .Reconciler ;
22
20
import io .javaoperatorsdk .operator .api .reconciler .UpdateControl ;
23
- import io .javaoperatorsdk .operator .processing .event .source .EventSourceRegistry ;
24
- import io .javaoperatorsdk .operator .processing .event .source .InformerEventSource ;
25
- import io .javaoperatorsdk .operator .processing .event .source .Mappers ;
21
+ import io .javaoperatorsdk .operator .api .reconciler .dependent .DependentResourceConfiguration ;
22
+ import io .javaoperatorsdk .operator .api .reconciler .dependent .Updater ;
26
23
27
24
import static io .javaoperatorsdk .operator .api .reconciler .Constants .NO_FINALIZER ;
28
25
29
26
/**
30
27
* Runs a specified number of Tomcat app server Pods. It uses a Deployment to create the Pods. Also
31
28
* creates a Service over which the Pods can be accessed.
32
29
*/
33
- @ ControllerConfiguration (finalizerName = NO_FINALIZER )
34
- public class TomcatReconciler implements Reconciler <Tomcat >, EventSourceInitializer <Tomcat > {
30
+ @ ControllerConfiguration (
31
+ finalizerName = NO_FINALIZER ,
32
+ labelSelector = "app.kubernetes.io/managed-by=tomcat-operator" ,
33
+ dependents = {
34
+ @ DependentResourceConfiguration (resourceType = Deployment .class ,
35
+ updatable = true , builder = DeploymentDependentResource .class ,
36
+ updater = DeploymentDependentResource .class ),
37
+ @ DependentResourceConfiguration (resourceType = Service .class , creatable = false ,
38
+ updatable = true )
39
+ })
40
+ public class TomcatReconciler implements Reconciler <Tomcat >, Updater <Service , Tomcat > {
35
41
36
42
private final Logger log = LoggerFactory .getLogger (getClass ());
37
43
38
44
private final KubernetesClient kubernetesClient ;
39
45
40
- private volatile InformerEventSource <Deployment , Tomcat > informerEventSource ;
41
-
42
46
public TomcatReconciler (KubernetesClient client ) {
43
47
this .kubernetesClient = client ;
44
48
}
45
49
46
50
@ Override
47
- public void prepareEventSources (EventSourceRegistry <Tomcat > eventSourceRegistry , Cloner cloner ) {
48
- SharedIndexInformer <Deployment > deploymentInformer =
49
- kubernetesClient .apps ().deployments ().inAnyNamespace ()
50
- .withLabel ("app.kubernetes.io/managed-by" , "tomcat-operator" )
51
- .runnableInformer (0 );
52
-
53
- this .informerEventSource =
54
- new InformerEventSource <>(deploymentInformer , Mappers .fromOwnerReference (), cloner );
55
- eventSourceRegistry .registerEventSource (this .informerEventSource );
56
- }
57
-
58
- @ Override
59
- public UpdateControl <Tomcat > reconcile (Tomcat tomcat , Context context ) {
60
- createOrUpdateDeployment (tomcat );
61
- createOrUpdateService (tomcat );
62
-
63
- Deployment deployment = informerEventSource .getAssociated (tomcat );
51
+ public UpdateControl <Tomcat > reconcile (Tomcat tomcat , Context <Tomcat > context ) {
52
+ Deployment deployment = context .getSecondaryResource (Deployment .class );
64
53
65
54
if (deployment != null ) {
66
55
Tomcat updatedTomcat =
@@ -85,78 +74,22 @@ private Tomcat updateTomcatStatus(Tomcat tomcat, Deployment deployment) {
85
74
return tomcat ;
86
75
}
87
76
88
- private void createOrUpdateDeployment (Tomcat tomcat ) {
89
- String ns = tomcat .getMetadata ().getNamespace ();
90
- Deployment existingDeployment =
91
- kubernetesClient
92
- .apps ()
93
- .deployments ()
94
- .inNamespace (ns )
95
- .withName (tomcat .getMetadata ().getName ())
96
- .get ();
97
- if (existingDeployment == null ) {
98
- Deployment deployment = loadYaml (Deployment .class , "deployment.yaml" );
99
- deployment .getMetadata ().setName (tomcat .getMetadata ().getName ());
100
- deployment .getMetadata ().setNamespace (ns );
101
- deployment .getMetadata ().getLabels ().put ("app.kubernetes.io/part-of" ,
102
- tomcat .getMetadata ().getName ());
103
- deployment .getMetadata ().getLabels ().put ("app.kubernetes.io/managed-by" , "tomcat-operator" );
104
- // set tomcat version
105
- deployment
106
- .getSpec ()
107
- .getTemplate ()
108
- .getSpec ()
109
- .getContainers ()
110
- .get (0 )
111
- .setImage ("tomcat:" + tomcat .getSpec ().getVersion ());
112
- deployment .getSpec ().setReplicas (tomcat .getSpec ().getReplicas ());
113
-
114
- // make sure label selector matches label (which has to be matched by service selector too)
115
- deployment
116
- .getSpec ()
117
- .getTemplate ()
118
- .getMetadata ()
119
- .getLabels ()
120
- .put ("app" , tomcat .getMetadata ().getName ());
121
- deployment
122
- .getSpec ()
123
- .getSelector ()
124
- .getMatchLabels ()
125
- .put ("app" , tomcat .getMetadata ().getName ());
126
-
127
- OwnerReference ownerReference = deployment .getMetadata ().getOwnerReferences ().get (0 );
128
- ownerReference .setName (tomcat .getMetadata ().getName ());
129
- ownerReference .setUid (tomcat .getMetadata ().getUid ());
130
-
131
- log .info ("Creating or updating Deployment {} in {}" , deployment .getMetadata ().getName (), ns );
132
- kubernetesClient .apps ().deployments ().inNamespace (ns ).create (deployment );
133
- } else {
134
- existingDeployment
135
- .getSpec ()
136
- .getTemplate ()
137
- .getSpec ()
138
- .getContainers ()
139
- .get (0 )
140
- .setImage ("tomcat:" + tomcat .getSpec ().getVersion ());
141
- existingDeployment .getSpec ().setReplicas (tomcat .getSpec ().getReplicas ());
142
- kubernetesClient .apps ().deployments ().inNamespace (ns ).createOrReplace (existingDeployment );
143
- }
144
- }
145
-
146
- private void createOrUpdateService (Tomcat tomcat ) {
147
- Service service = loadYaml (Service .class , "service.yaml" );
148
- service .getMetadata ().setName (tomcat .getMetadata ().getName ());
149
- String ns = tomcat .getMetadata ().getNamespace ();
150
- service .getMetadata ().setNamespace (ns );
151
- service .getMetadata ().getOwnerReferences ().get (0 ).setName (tomcat .getMetadata ().getName ());
152
- service .getMetadata ().getOwnerReferences ().get (0 ).setUid (tomcat .getMetadata ().getUid ());
153
- service .getSpec ().getSelector ().put ("app" , tomcat .getMetadata ().getName ());
154
- log .info ("Creating or updating Service {} in {}" , service .getMetadata ().getName (), ns );
155
- kubernetesClient .services ().inNamespace (ns ).createOrReplace (service );
77
+ @ Override
78
+ public Service update (Service fetched , Tomcat tomcat ) {
79
+ final ObjectMeta tomcatMetadata = tomcat .getMetadata ();
80
+ return new ServiceBuilder (loadYaml (Service .class , "service.yaml" ))
81
+ .editMetadata ()
82
+ .withName (tomcatMetadata .getName ())
83
+ .withNamespace (tomcatMetadata .getNamespace ())
84
+ .endMetadata ()
85
+ .editSpec ()
86
+ .addToSelector ("app" , tomcatMetadata .getName ())
87
+ .endSpec ()
88
+ .build ();
156
89
}
157
90
158
- private <T > T loadYaml (Class <T > clazz , String yaml ) {
159
- try (InputStream is = getClass () .getResourceAsStream (yaml )) {
91
+ static <T > T loadYaml (Class <T > clazz , String yaml ) {
92
+ try (InputStream is = TomcatReconciler . class .getResourceAsStream (yaml )) {
160
93
return Serialization .unmarshal (is , clazz );
161
94
} catch (IOException ex ) {
162
95
throw new IllegalStateException ("Cannot find yaml on classpath: " + yaml );
0 commit comments