@@ -53,12 +53,13 @@ public class ModelMapper {
53
53
// Model's api-version midfix to kubernetes api-version
54
54
private static List <String > preBuiltApiVersions = new ArrayList <>();
55
55
56
- // TODO(yue9944882): make the map bi-directional
57
56
private static Map <GroupVersionKind , Class <?>> classesByGVK = new ConcurrentHashMap <>();
58
-
59
- // TODO(yue9944882): make the map bi-directional
60
57
private static Map <GroupVersionResource , Class <?>> classesByGVR = new ConcurrentHashMap <>();
61
58
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
+
62
63
private static Set <Discovery .APIResource > lastAPIDiscovery = new HashSet <>();
63
64
64
65
private static volatile long nextDiscoveryRefreshTimeMillis =
@@ -114,8 +115,34 @@ public static void addModelMap(String group, String version, String kind, Class<
114
115
*/
115
116
public static void addModelMap (
116
117
String group , String version , String kind , String resourceNamePlural , Class <?> clazz ) {
118
+ // TODO(yue9944882): consistency between bi-directional maps
117
119
classesByGVK .put (new GroupVersionKind (group , version , kind ), clazz );
120
+ gvkByClasses .put (clazz , new GroupVersionKind (group , version , kind ));
121
+
118
122
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 );
119
146
}
120
147
121
148
/**
@@ -163,11 +190,7 @@ public static Class<?> getApiTypeClass(String group, String version, String kind
163
190
* @return the group version kind by class
164
191
*/
165
192
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 );
171
194
}
172
195
173
196
/**
@@ -177,13 +200,18 @@ public static GroupVersionKind getGroupVersionKindByClass(Class<?> clazz) {
177
200
* @return the group version kind by class
178
201
*/
179
202
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 );
185
204
}
186
205
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
+ */
187
215
public static Set <Discovery .APIResource > refresh (Discovery discovery ) throws ApiException {
188
216
return refresh (discovery , DEFAULT_DISCOVERY_REFRESH_INTERVAL );
189
217
}
@@ -220,6 +248,7 @@ public static Set<Discovery.APIResource> refresh(Discovery discovery, Duration r
220
248
version ,
221
249
apiResource .getKind (),
222
250
apiResource .getResourcePlural (),
251
+ apiResource .getNamespaced (),
223
252
clazz );
224
253
}
225
254
}
@@ -253,6 +282,16 @@ public static GroupVersionKind preBuiltGetGroupVersionKindByClass(Class<?> clazz
253
282
.get ();
254
283
}
255
284
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
+
256
295
private static void initApiGroupMap () {
257
296
preBuiltApiGroups .put ("Admissionregistration" , "admissionregistration.k8s.io" );
258
297
preBuiltApiGroups .put ("Apiextensions" , "apiextensions.k8s.io" );
0 commit comments