From: Joseph Sawaya Date: Fri, 9 Jul 2021 20:36:36 +0000 (-0400) Subject: mgr/rook: create KubernetesCustomResource class to fetch CRs X-Git-Tag: v17.1.0~1144^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=48b24ceb2d885950707149546f7d9dcc4226fd4a;p=ceph.git mgr/rook: create KubernetesCustomResource class to fetch CRs This commit creates the KubernetesCustomResource class that inherits from KubernetesResource to be able to fetch CRs using the CustomObjectsApi in a cleaner way. It replaces previous try-except pattern. Signed-off-by: Joseph Sawaya --- diff --git a/src/pybind/mgr/rook/rook_cluster.py b/src/pybind/mgr/rook/rook_cluster.py index c83d782adc9d..a7661d952037 100644 --- a/src/pybind/mgr/rook/rook_cluster.py +++ b/src/pybind/mgr/rook/rook_cluster.py @@ -113,17 +113,10 @@ class KubernetesResource(Generic[T]): def _fetch(self) -> str: """ Execute the requested api method as a one-off fetch""" response = self.api_func(**self.kwargs) - # try-except pattern because customObjectApi objects aren't subscriptable - try: - metadata = response['metadata'] - self._items = {item['metadata']['name']: item for item in response['items']} - log.info('Full fetch of {}. result: {}'.format(self.api_func, len(self._items))) - return metadata['resourceVersion'] - except TypeError: - metadata = response.metadata - self._items = {item.metadata.name: item for item in response.items} - log.info('Full fetch of {}. result: {}'.format(self.api_func, len(self._items))) - return metadata.resource_version + metadata = response.metadata + self._items = {item.metadata.name: item for item in response.items} + log.info('Full fetch of {}. result: {}'.format(self.api_func, len(self._items))) + return metadata.resource_version @property def items(self) -> Iterable[T]: @@ -145,6 +138,14 @@ class KubernetesResource(Generic[T]): return self._items.values() + def get_item_name(self, item: Any) -> Any: + try: + return item.metadata.name + except AttributeError: + raise AttributeError( + "{} doesn't contain a metadata.name. Unable to track changes".format( + self.api_func)) + @threaded def _watch(self, res_ver: Optional[str]) -> None: """ worker thread that runs the kubernetes watch """ @@ -159,14 +160,7 @@ class KubernetesResource(Generic[T]): **self.kwargs): self.health = '' item = event['object'] - try: - name = item['metadata']['name'] - except AttributeError: - raise AttributeError( - "{} doesn't contain a metadata.name. Unable to track changes".format( - self.api_func)) - except TypeError: - name = item.metadata.name + name = self.get_item_name(item) log.info('{} event: {}'.format(event['type'], name)) @@ -194,6 +188,21 @@ class KubernetesResource(Generic[T]): self.exception = e raise +class KubernetesCustomResource(KubernetesResource): + def _fetch(self) -> str: + response = self.api_func(**self.kwargs) + metadata = response['metadata'] + self._items = {item['metadata']['name']: item for item in response['items']} + log.info('Full fetch of {}. result: {}'.format(self.api_func, len(self._items))) + return metadata['resourceVersion'] + + def get_item_name(self, item: Any) -> Any: + try: + return item['metadata']['name'] + except AttributeError: + raise AttributeError( + "{} doesn't contain a metadata.name. Unable to track changes".format( + self.api_func)) class RookCluster(object): # import of client.CoreV1Api must be optional at import time.