def remove_owner_reference( objs: K8sObjects, owner: Optional[bodies.Body] = None, ) -> None: """ Remove an owner reference to the resource(s), if it is there. Note: the owned objects are usually not the one being processed, so the whole body can be modified, no patches are needed. """ real_owner = _guess_owner(owner) owner_ref = bodies.build_owner_reference(real_owner) for obj in cast(Iterator[K8sObject], dicts.walk(objs)): # Pykube is yielded as a usual dict, no need to specially treat it. if isinstance(obj, collections.abc.MutableMapping): refs = obj.setdefault('metadata', {}).setdefault('ownerReferences', []) if any(ref.get('uid') == owner_ref['uid'] for ref in refs): refs[:] = [ ref for ref in refs if ref.get('uid') != owner_ref['uid'] ] elif isinstance(obj, thirdparty.KubernetesModel): if obj.metadata is None: obj.metadata = thirdparty.V1ObjectMeta() if obj.metadata.owner_references is None: obj.metadata.owner_references = [] refs = obj.metadata.owner_references if any(ref.uid == owner_ref['uid'] for ref in refs): refs[:] = [ref for ref in refs if ref.uid != owner_ref['uid']] else: raise TypeError(f"K8s object class is not supported: {type(obj)}")
def remove_owner_reference( objs: K8sObjects, owner: Optional[bodies.Body] = None, ) -> None: """ Remove an owner reference to the resource(s), if it is there. Note: the owned objects are usually not the one being processed, so the whole body can be modified, no patches are needed. """ real_owner = _guess_owner(owner) owner_ref = bodies.build_owner_reference(real_owner) for obj in cast(Iterator[K8sObject], dicts.walk(objs)): refs = obj.setdefault('metadata', {}).setdefault('ownerReferences', []) matching = [ref for ref in refs if ref.get('uid') == owner_ref['uid']] for ref in matching: refs.remove(ref)
def append_owner_reference( objs: K8sObjects, owner: Optional[bodies.Body] = None, ) -> None: """ Append an owner reference to the resource(s), if it is not yet there. Note: the owned objects are usually not the one being processed, so the whole body can be modified, no patches are needed. """ real_owner = _guess_owner(owner) owner_ref = bodies.build_owner_reference(real_owner) for obj in cast(Iterator[K8sObject], dicts.walk(objs)): # Pykube is yielded as a usual dict, no need to specially treat it. if isinstance(obj, collections.abc.MutableMapping): refs = obj.setdefault('metadata', {}).setdefault('ownerReferences', []) if not any(ref.get('uid') == owner_ref['uid'] for ref in refs): refs.append(owner_ref) elif isinstance(obj, thirdparty.KubernetesModel): if obj.metadata is None: obj.metadata = thirdparty.V1ObjectMeta() if obj.metadata.owner_references is None: obj.metadata.owner_references = [] refs = obj.metadata.owner_references if not any(ref.uid == owner_ref['uid'] for ref in refs): refs.append( thirdparty.V1OwnerReference( api_version=owner_ref['apiVersion'], kind=owner_ref['kind'], name=owner_ref['name'], uid=owner_ref['uid'], controller=owner_ref['controller'], block_owner_deletion=owner_ref['blockOwnerDeletion'], )) else: raise TypeError(f"K8s object class is not supported: {type(obj)}")