@@ -113,14 +113,53 @@ for this feature.
113
113
114
114
## DependentResource-level configuration
115
115
116
- ` DependentResource ` implementations can implement the ` DependentResourceConfigurator ` interface
117
- to pass information to the implementation. For example, the SDK
118
- provides specific support for the ` KubernetesDependentResource ` , which can be configured via the
119
- ` @KubernetesDependent ` annotation. This annotation is, in turn, converted into a
120
- ` KubernetesDependentResourceConfig ` instance, which is then passed to the ` configureWith ` method
121
- implementation.
116
+ It is possible to define custom annotations to configure custom ` DependentResource ` implementations. In order to provide
117
+ such a configuration mechanism for your own ` DependentResource ` implementations, they must be annotated with the
118
+ ` @Configured ` annotation. This annotation defines 3 fields that tie everything together:
119
+
120
+ - ` by ` , which specifies which annotation class will be used to configure your dependents,
121
+ - ` with ` , which specifies the class holding the configuration object for your dependents and
122
+ - ` converter ` , which specifies the ` ConfigurationConverter ` implementation in charge of converting the annotation
123
+ specified by the ` by ` field into objects of the class specified by the ` with ` field.
124
+
125
+ ` ConfigurationConverter ` instances implement a single ` configFrom ` method, which will receive, as expected, the
126
+ annotation instance annotating the dependent resource instance to be configured, but it can also extract information
127
+ from the ` DependentResourceSpec ` instance associated with the ` DependentResource ` class so that metadata from it can be
128
+ used in the configuration, as well as the parent ` ControllerConfiguration ` , if needed. The role of
129
+ ` ConfigurationConverter ` implementations is to extract the annotation information, augment it with metadata from the
130
+ ` DependentResourceSpec ` and the configuration from the parent controller on which the dependent is defined, to finally
131
+ create the configuration object that the ` DependentResource ` instances will use.
132
+
133
+ However, one last element is required to finish the configuration process: the target ` DependentResource ` class must
134
+ implement the ` ConfiguredDependentResource ` interface, parameterized with the annotation class defined by the
135
+ ` @Configured ` annotation ` by ` field. This interface is called by the framework to inject the configuration at the
136
+ appropriate time and retrieve the configuration, if it's available.
137
+
138
+ For example, ` KubernetesDependentResource ` , a core implementation that the framework provides, can be configured via the
139
+ ` @KubernetesDependent ` annotation. This set up is configured as follows:
122
140
123
- TODO
141
+ ``` java
142
+
143
+ @Configured (
144
+ by = KubernetesDependent . class,
145
+ with = KubernetesDependentResourceConfig . class,
146
+ converter = KubernetesDependentConverter . class)
147
+ public abstract class KubernetesDependentResource <R extends HasMetadata , P extends HasMetadata >
148
+ extends AbstractEventSourceHolderDependentResource<R , P , InformerEventSource<R , P > >
149
+ implements ConfiguredDependentResource<KubernetesDependentResourceConfig<R > > {
150
+ // code omitted
151
+ }
152
+ ```
153
+
154
+ The ` @Configured ` annotation specifies that ` KubernetesDependentResource ` instances can be configured by using the
155
+ ` @KubernetesDependent ` annotation, which gets converted into a ` KubernetesDependentResourceConfig ` object by a
156
+ ` KubernetesDependentConverter ` . That configuration object is then injected by the framework in the
157
+ ` KubernetesDependentResource ` instance, after it's been created, because the class implements the
158
+ ` ConfiguredDependentResource ` interface, properly parameterized.
159
+
160
+ For more information on how to use this feature, we recommend looking at how this mechanism is implemented for
161
+ ` KubernetesDependentResource ` in the core framework, ` SchemaDependentResource ` in the samples or ` CustomAnnotationDep `
162
+ in the ` BaseConfigurationServiceTest ` test class.
124
163
125
164
## EventSource-level configuration
126
165
0 commit comments