@@ -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