Skip to content

Commit c89c0c1

Browse files
authored
Merge pull request #1191 from yue9944882/shared-informer-generic-constructor
Refactor: Add informer constructor for generic api
2 parents 5e5958e + 10af450 commit c89c0c1

File tree

2 files changed

+58
-32
lines changed

2 files changed

+58
-32
lines changed

spring/src/main/java/io/kubernetes/client/spring/extended/controller/KubernetesInformerFactoryProcessor.java

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,15 @@
1212
*/
1313
package io.kubernetes.client.spring.extended.controller;
1414

15-
import io.kubernetes.client.common.KubernetesListObject;
16-
import io.kubernetes.client.informer.ListerWatcher;
1715
import io.kubernetes.client.informer.SharedIndexInformer;
1816
import io.kubernetes.client.informer.SharedInformer;
1917
import io.kubernetes.client.informer.SharedInformerFactory;
2018
import io.kubernetes.client.informer.cache.Lister;
2119
import io.kubernetes.client.openapi.ApiClient;
22-
import io.kubernetes.client.openapi.ApiException;
2320
import io.kubernetes.client.spring.extended.controller.annotation.KubernetesInformer;
2421
import io.kubernetes.client.spring.extended.controller.annotation.KubernetesInformers;
25-
import io.kubernetes.client.util.CallGeneratorParams;
2622
import io.kubernetes.client.util.ClientBuilder;
27-
import io.kubernetes.client.util.Watchable;
2823
import io.kubernetes.client.util.generic.GenericKubernetesApi;
29-
import io.kubernetes.client.util.generic.KubernetesApiResponse;
30-
import io.kubernetes.client.util.generic.options.ListOptions;
3124
import java.io.IOException;
3225
import java.time.Duration;
3326
import java.util.Map;
@@ -120,29 +113,7 @@ public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
120113
apiClient);
121114
SharedIndexInformer sharedIndexInformer =
122115
sharedInformerFactory.sharedIndexInformerFor(
123-
new ListerWatcher() {
124-
public KubernetesListObject list(CallGeneratorParams params) throws ApiException {
125-
KubernetesApiResponse<KubernetesListObject> resp =
126-
api.list(
127-
new ListOptions() {
128-
{
129-
setResourceVersion(params.resourceVersion);
130-
setTimeoutSeconds(params.timeoutSeconds);
131-
}
132-
});
133-
if (!resp.isSuccess()) {
134-
throw new ApiException(resp.getHttpStatusCode(), resp.getStatus().getMessage());
135-
}
136-
return resp.getObject();
137-
}
138-
139-
public Watchable watch(CallGeneratorParams params) throws ApiException {
140-
return api.watch();
141-
}
142-
},
143-
kubernetesInformer.apiTypeClass(),
144-
kubernetesInformer.resyncPeriodMillis());
145-
116+
api, kubernetesInformer.apiTypeClass(), kubernetesInformer.resyncPeriodMillis());
146117
ResolvableType informerType =
147118
ResolvableType.forClassWithGenerics(
148119
SharedInformer.class, kubernetesInformer.apiTypeClass());

util/src/main/java/io/kubernetes/client/informer/SharedInformerFactory.java

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222
import io.kubernetes.client.util.CallGenerator;
2323
import io.kubernetes.client.util.CallGeneratorParams;
2424
import io.kubernetes.client.util.Watch;
25+
import io.kubernetes.client.util.Watchable;
26+
import io.kubernetes.client.util.generic.GenericKubernetesApi;
27+
import io.kubernetes.client.util.generic.KubernetesApiResponse;
28+
import io.kubernetes.client.util.generic.options.ListOptions;
2529
import java.lang.reflect.Type;
2630
import java.util.HashMap;
2731
import java.util.Map;
@@ -135,12 +139,32 @@ SharedIndexInformer<ApiType> sharedIndexInformerFor(
135139
Class<ApiType> apiTypeClass,
136140
long resyncPeriodInMillis) {
137141
SharedIndexInformer<ApiType> informer =
138-
new DefaultSharedIndexInformer<ApiType, ApiListType>(
139-
apiTypeClass, listerWatcher, resyncPeriodInMillis);
142+
new DefaultSharedIndexInformer<>(apiTypeClass, listerWatcher, resyncPeriodInMillis);
140143
this.informers.putIfAbsent(TypeToken.get(apiTypeClass).getType(), informer);
141144
return informer;
142145
}
143146

147+
/**
148+
* Constructs and returns a shared index informer by specifying a generic api instance. But the
149+
* informer cache will not be overwritten on multiple call w/ the the same apiTypeClass i.e. only
150+
* the first registered informer will be kept.
151+
*
152+
* @param <ApiType> the type parameter
153+
* @param <ApiListType> the type parameter
154+
* @param genericKubernetesApi the generic kubernetes api
155+
* @param apiTypeClass the api type class
156+
* @param resyncPeriodInMillis the resync period in millis
157+
* @return the shared index informer
158+
*/
159+
public synchronized <ApiType extends KubernetesObject, ApiListType extends KubernetesListObject>
160+
SharedIndexInformer<ApiType> sharedIndexInformerFor(
161+
GenericKubernetesApi<ApiType, ApiListType> genericKubernetesApi,
162+
Class<ApiType> apiTypeClass,
163+
long resyncPeriodInMillis) {
164+
ListerWatcher<ApiType, ApiListType> listerWatcher = listerWatcherFor(genericKubernetesApi);
165+
return sharedIndexInformerFor(listerWatcher, apiTypeClass, resyncPeriodInMillis);
166+
}
167+
144168
private <ApiType extends KubernetesObject, ApiListType extends KubernetesListObject>
145169
ListerWatcher<ApiType, ApiListType> listerWatcherFor(
146170
CallGenerator callGenerator,
@@ -170,6 +194,37 @@ public Watch<ApiType> watch(CallGeneratorParams params) throws ApiException {
170194
};
171195
}
172196

197+
private <ApiType extends KubernetesObject, ApiListType extends KubernetesListObject>
198+
ListerWatcher<ApiType, ApiListType> listerWatcherFor(
199+
GenericKubernetesApi<ApiType, ApiListType> genericKubernetesApi) {
200+
if (apiClient.getHttpClient().readTimeoutMillis() > 0) {
201+
// set read timeout zero to ensure client doesn't time out
202+
OkHttpClient httpClient =
203+
apiClient.getHttpClient().newBuilder().readTimeout(0, TimeUnit.MILLISECONDS).build();
204+
apiClient.setHttpClient(httpClient);
205+
}
206+
return new ListerWatcher<ApiType, ApiListType>() {
207+
public ApiListType list(CallGeneratorParams params) throws ApiException {
208+
KubernetesApiResponse<ApiListType> resp =
209+
genericKubernetesApi.list(
210+
new ListOptions() {
211+
{
212+
setResourceVersion(params.resourceVersion);
213+
setTimeoutSeconds(params.timeoutSeconds);
214+
}
215+
});
216+
if (!resp.isSuccess()) {
217+
throw new ApiException(resp.getHttpStatusCode(), resp.getStatus().getMessage());
218+
}
219+
return resp.getObject();
220+
}
221+
222+
public Watchable<ApiType> watch(CallGeneratorParams params) throws ApiException {
223+
return genericKubernetesApi.watch();
224+
}
225+
};
226+
}
227+
173228
/**
174229
* Gets existing shared index informer, return null if the requesting informer is never
175230
* constructed.

0 commit comments

Comments
 (0)