示例#1
0
 def __init__(self, *, body: bodies.Body, settings: configuration.OperatorSettings) -> None:
     super().__init__(logger, dict(
         settings=settings,
         k8s_skip=False,
         k8s_ref=dict(
             apiVersion=body.get('apiVersion'),
             kind=body.get('kind'),
             name=body.get('metadata', {}).get('name'),
             uid=body.get('metadata', {}).get('uid'),
             namespace=body.get('metadata', {}).get('namespace'),
         ),
     ))
示例#2
0
 def mark_key(self, key: str, *, body: bodies.Body) -> str:
     owners = body.meta.get('ownerReferences', [])
     kind = body.get('kind')
     if kind == 'ReplicaSet' and any(owner['kind'] == 'Deployment'
                                     for owner in owners):
         return f"{key}-ofDRS"  # no need to generalise for a single known case
     else:
         return key
示例#3
0
def block_deletion(
        *,
        body: bodies.Body,
        patch: patches.Patch,
        finalizer: str,
) -> None:
    if not is_deletion_blocked(body=body, finalizer=finalizer):
        finalizers = body.get('metadata', {}).get('finalizers', [])
        patch.setdefault('metadata', {}).setdefault('finalizers', list(finalizers))
        patch['metadata']['finalizers'].append(finalizer)
示例#4
0
def allow_deletion(
        *,
        body: bodies.Body,
        patch: patches.Patch,
        finalizer: str,
) -> None:
    if is_deletion_blocked(body=body, finalizer=finalizer):
        finalizers = body.get('metadata', {}).get('finalizers', [])
        patch.setdefault('metadata', {}).setdefault('finalizers', list(finalizers))
        if finalizer in patch['metadata']['finalizers']:
            patch['metadata']['finalizers'].remove(finalizer)
示例#5
0
    def make_key(self, body: bodies.Body) -> Key:
        """
        Make a key to address an object in internal containers.

        The key is not exposed to the users via indices,
        so its structure and type can be safely changed any time.

        However, the key must be as lightweight as possible:
        no dataclasses or namedtuples, only builtins.

        The name and namespace do not add value on top of the uid's uniqueness.
        They are here for debugging and for those rare objects
        that have no uid but are still exposed via the K8s API
        (highly unlikely to be indexed though).
        """
        meta = body.get('metadata', {})
        return (meta.get('namespace'), meta.get('name'), meta.get('uid'))
示例#6
0
def is_deletion_blocked(
        body: bodies.Body,
        finalizer: str,
) -> bool:
    finalizers = body.get('metadata', {}).get('finalizers', [])
    return finalizer in finalizers
示例#7
0
def is_deletion_ongoing(
        body: bodies.Body,
) -> bool:
    return body.get('metadata', {}).get('deletionTimestamp', None) is not None