From bcbf335a29cdf3bd26022be84a91827711deb42d Mon Sep 17 00:00:00 2001 From: Johnathan Kupferer Date: Mon, 8 Sep 2025 17:55:07 -0400 Subject: [PATCH 1/4] Prune diffBase from status --- operator/resourceclaim.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/operator/resourceclaim.py b/operator/resourceclaim.py index c547249..5303725 100644 --- a/operator/resourceclaim.py +++ b/operator/resourceclaim.py @@ -23,12 +23,12 @@ def prune_k8s_resource(resource: Mapping) -> Mapping: ret = { key: value for key, value in resource.items() - if key != "metadata" + if key not in {"metadata", "status"} } ret["metadata"] = { key: value for key, value in resource['metadata'].items() - if key not in {'annotations', 'managedFields'} + if key not in {'annotations', 'managedFields', 'resourceVersion'} } if 'annotations' in resource['metadata']: filtered_annotations = { @@ -38,6 +38,12 @@ def prune_k8s_resource(resource: Mapping) -> Mapping: } if filtered_annotations: ret["metadata"]["annotations"] = filtered_annotations + if 'status' in resource: + ret["status"] = { + key: value + for key, value in resource['status'].items() + if not key in {'diffBase'} + } return ret class ResourceClaim(KopfObject): From 6340bd8890d758ae034fb2d8d8329459655bc3db Mon Sep 17 00:00:00 2001 From: Johnathan Kupferer Date: Mon, 8 Sep 2025 17:55:45 -0400 Subject: [PATCH 2/4] Fix issue with resource state in status reverting --- operator/resourceclaim.py | 21 +++++++++++++++------ operator/resourcewatch.py | 5 +++++ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/operator/resourceclaim.py b/operator/resourceclaim.py index 5303725..be2de87 100644 --- a/operator/resourceclaim.py +++ b/operator/resourceclaim.py @@ -82,7 +82,11 @@ async def get(cls, name: str, namespace: str, use_cache: bool=True) -> ResourceC if use_cache and (namespace, name) in cls.instances: return cls.instances[(namespace, name)] definition = await Poolboy.custom_objects_api.get_namespaced_custom_object( - Poolboy.operator_domain, Poolboy.operator_version, namespace, 'resourceclaims', name + group=cls.api_group, + name=name, + namespace=namespace, + plural=cls.plural, + version=cls.api_version, ) if use_cache: return cls.__register_definition(definition) @@ -549,13 +553,18 @@ async def update_status_from_handle(self, "provider": resource_handle.resources[resource_index]['provider'], **status_resource, } + if 'name' in current_entry: + resource_entry['name'] = current_entry['name'] if 'validationError' in current_entry: resource_entry['validationError'] = current_entry['validationError'] - if resource_states: - if resource_index < len(resource_states) and resource_states[resource_index] is not None: - resource_entry['state'] = prune_k8s_resource( - resource_states[resource_index] - ) + if ( + resource_states and + resource_index < len(resource_states) and + resource_states[resource_index] is not None + ): + resource_entry['state'] = prune_k8s_resource( + resource_states[resource_index] + ) elif 'state' in current_entry: resource_entry['state'] = current_entry['state'] diff --git a/operator/resourcewatch.py b/operator/resourcewatch.py index 20c16e2..13be779 100644 --- a/operator/resourcewatch.py +++ b/operator/resourcewatch.py @@ -568,6 +568,11 @@ async def __watch_event(self, event_type, event_obj): if not resource_handle_name: return + if event_type == 'DELETED': + self.cache.pop(resource_name, None) + else: + self.cache[resource_name] = ResourceWatch.CacheEntry(event_obj) + try: resource_handle = await resourcehandle.ResourceHandle.get( name=resource_handle_name, From bb72e7a26f5fe4ce4e583643bf2bcd315c0b16f7 Mon Sep 17 00:00:00 2001 From: Johnathan Kupferer Date: Mon, 8 Sep 2025 23:04:22 -0400 Subject: [PATCH 3/4] Prune generation and not resourceVersion --- operator/resourceclaim.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/operator/resourceclaim.py b/operator/resourceclaim.py index be2de87..fb7f332 100644 --- a/operator/resourceclaim.py +++ b/operator/resourceclaim.py @@ -28,7 +28,7 @@ def prune_k8s_resource(resource: Mapping) -> Mapping: ret["metadata"] = { key: value for key, value in resource['metadata'].items() - if key not in {'annotations', 'managedFields', 'resourceVersion'} + if key not in {'annotations', 'generation', 'managedFields'} } if 'annotations' in resource['metadata']: filtered_annotations = { From 8d008de6428a2f9c93f9700f6a139f6297efa725 Mon Sep 17 00:00:00 2001 From: Johnathan Kupferer Date: Mon, 8 Sep 2025 23:05:52 -0400 Subject: [PATCH 4/4] Fix linked provider resource match --- operator/resourcehandle.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/operator/resourcehandle.py b/operator/resourcehandle.py index 6d8b740..a44845b 100644 --- a/operator/resourcehandle.py +++ b/operator/resourcehandle.py @@ -1158,7 +1158,10 @@ async def manage(self, logger: kopf.ObjectLogger) -> None: linked_resource_provider = None linked_resource_state = None for pn, pv in enumerate(resource_providers): - if pv.name == linked_provider.name: + if ( + pv.name == linked_provider.name and + self.resources[pn].get('name', pv.name) == linked_provider.resource_name + ): linked_resource_provider = pv linked_resource_state = resource_states[pn] break