Skip to content

Commit fd8ef57

Browse files
committed
adding model mapper caches
1 parent bb2accf commit fd8ef57

File tree

2 files changed

+55
-13
lines changed

2 files changed

+55
-13
lines changed

e2e/src/test/groovy/io/kubernetes/client/e2e/util/ModelMapperTest.groovy

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,15 @@ class ModelMapperTest extends Specification {
3333
expect:
3434
new GroupVersionKind("", "v1", "Pod") == ModelMapper.getGroupVersionKindByClass(V1Pod.class)
3535
new GroupVersionResource("", "v1", "pods") == ModelMapper.getGroupVersionResourceByClass(V1Pod.class)
36+
ModelMapper.isNamespaced(V1Pod.class)
3637

3738
new GroupVersionKind("apps", "v1", "Deployment") == ModelMapper.getGroupVersionKindByClass(V1Deployment.class)
3839
new GroupVersionResource("apps", "v1", "deployments") == ModelMapper.getGroupVersionResourceByClass(V1Deployment.class)
40+
ModelMapper.isNamespaced(V1Deployment.class)
3941

4042
new GroupVersionKind("apiextensions.k8s.io", "v1beta1", "CustomResourceDefinition") == ModelMapper.getGroupVersionKindByClass(V1beta1CustomResourceDefinition.class)
4143
new GroupVersionResource("apiextensions.k8s.io", "v1beta1", "customresourcedefinitions") == ModelMapper.getGroupVersionResourceByClass(V1beta1CustomResourceDefinition.class)
44+
!ModelMapper.isNamespaced(V1beta1CustomResourceDefinition.class)
4245

4346
}
4447
}

util/src/main/java/io/kubernetes/client/util/ModelMapper.java

Lines changed: 52 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,13 @@ public class ModelMapper {
5353
// Model's api-version midfix to kubernetes api-version
5454
private static List<String> preBuiltApiVersions = new ArrayList<>();
5555

56-
// TODO(yue9944882): make the map bi-directional
5756
private static Map<GroupVersionKind, Class<?>> classesByGVK = new ConcurrentHashMap<>();
58-
59-
// TODO(yue9944882): make the map bi-directional
6057
private static Map<GroupVersionResource, Class<?>> classesByGVR = new ConcurrentHashMap<>();
6158

59+
private static Map<Class<?>, GroupVersionKind> gvkByClasses = new ConcurrentHashMap<>();
60+
private static Map<Class<?>, GroupVersionResource> gvrByClasses = new ConcurrentHashMap<>();
61+
private static Map<Class<?>, Boolean> isNamespacedByClasses = new ConcurrentHashMap<>();
62+
6263
private static Set<Discovery.APIResource> lastAPIDiscovery = new HashSet<>();
6364

6465
private static volatile long nextDiscoveryRefreshTimeMillis =
@@ -114,8 +115,34 @@ public static void addModelMap(String group, String version, String kind, Class<
114115
*/
115116
public static void addModelMap(
116117
String group, String version, String kind, String resourceNamePlural, Class<?> clazz) {
118+
// TODO(yue9944882): consistency between bi-directional maps
117119
classesByGVK.put(new GroupVersionKind(group, version, kind), clazz);
120+
gvkByClasses.put(clazz, new GroupVersionKind(group, version, kind));
121+
118122
classesByGVR.put(new GroupVersionResource(group, version, resourceNamePlural), clazz);
123+
gvrByClasses.put(clazz, new GroupVersionResource(group, version, resourceNamePlural));
124+
}
125+
126+
/**
127+
* Registering concrete model classes by its group, version, kind and isNamespaced (e.g. "apps",
128+
* "v1", "Deployment", true).
129+
*
130+
* @param group the group
131+
* @param version the version
132+
* @param kind the kind
133+
* @param resourceNamePlural the resource name plural
134+
* @param isNamespacedResource the is namespaced resource
135+
* @param clazz the clazz
136+
*/
137+
public static void addModelMap(
138+
String group,
139+
String version,
140+
String kind,
141+
String resourceNamePlural,
142+
Boolean isNamespacedResource,
143+
Class<?> clazz) {
144+
addModelMap(group, version, kind, resourceNamePlural, clazz);
145+
isNamespacedByClasses.put(clazz, isNamespacedResource);
119146
}
120147

121148
/**
@@ -163,11 +190,7 @@ public static Class<?> getApiTypeClass(String group, String version, String kind
163190
* @return the group version kind by class
164191
*/
165192
public static GroupVersionKind getGroupVersionKindByClass(Class<?> clazz) {
166-
return classesByGVK.entrySet().stream()
167-
.filter(e -> clazz.equals(e.getValue()))
168-
.map(e -> e.getKey())
169-
.findFirst()
170-
.orElse(preBuiltGetGroupVersionKindByClass(clazz));
193+
return gvkByClasses.get(clazz);
171194
}
172195

173196
/**
@@ -177,13 +200,18 @@ public static GroupVersionKind getGroupVersionKindByClass(Class<?> clazz) {
177200
* @return the group version kind by class
178201
*/
179202
public static GroupVersionResource getGroupVersionResourceByClass(Class<?> clazz) {
180-
return classesByGVR.entrySet().stream()
181-
.filter(e -> clazz.equals(e.getValue()))
182-
.map(e -> e.getKey())
183-
.findFirst()
184-
.get();
203+
return gvrByClasses.get(clazz);
185204
}
186205

206+
/**
207+
* Refreshes the model mapping by syncing up w/the api discovery info from the kubernetes
208+
* apiserver. These mapping will be cached for {@link
209+
* ModelMapper#DEFAULT_DISCOVERY_REFRESH_INTERVAL}.
210+
*
211+
* @param discovery the discovery
212+
* @return the set
213+
* @throws ApiException the api exception
214+
*/
187215
public static Set<Discovery.APIResource> refresh(Discovery discovery) throws ApiException {
188216
return refresh(discovery, DEFAULT_DISCOVERY_REFRESH_INTERVAL);
189217
}
@@ -220,6 +248,7 @@ public static Set<Discovery.APIResource> refresh(Discovery discovery, Duration r
220248
version,
221249
apiResource.getKind(),
222250
apiResource.getResourcePlural(),
251+
apiResource.getNamespaced(),
223252
clazz);
224253
}
225254
}
@@ -253,6 +282,16 @@ public static GroupVersionKind preBuiltGetGroupVersionKindByClass(Class<?> clazz
253282
.get();
254283
}
255284

285+
/**
286+
* Checks whether the class is connected with a namespaced kubernetes resource.
287+
*
288+
* @param clazz the clazz
289+
* @return the boolean
290+
*/
291+
public static Boolean isNamespaced(Class<?> clazz) {
292+
return isNamespacedByClasses.get(clazz);
293+
}
294+
256295
private static void initApiGroupMap() {
257296
preBuiltApiGroups.put("Admissionregistration", "admissionregistration.k8s.io");
258297
preBuiltApiGroups.put("Apiextensions", "apiextensions.k8s.io");

0 commit comments

Comments
 (0)