Exemplo n.º 1
0
Arquivo: on.py Projeto: zer0n1/kopf
 def decorator(  # lgtm[py/similar-function]
     fn: callbacks.ResourceWatchingFn, ) -> callbacks.ResourceWatchingFn:
     _warn_deprecated_signatures(fn)
     _warn_deprecated_filters(labels, annotations)
     _warn_conflicting_values(field, value)
     real_registry = registry if registry is not None else registries.get_default_registry(
     )
     real_field = dicts.parse_field(
         field) or None  # to not store tuple() as a no-field case.
     real_id = registries.generate_id(fn=fn, id=id)
     selector = references.Selector(group, version, plural)
     handler = handlers.ResourceWatchingHandler(
         fn=fn,
         id=real_id,
         errors=None,
         timeout=None,
         retries=None,
         backoff=None,
         cooldown=None,
         selector=selector,
         labels=labels,
         annotations=annotations,
         when=when,
         field=real_field,
         value=value,
     )
     real_registry.resource_watching_handlers.append(handler)
     return fn
Exemplo n.º 2
0
Arquivo: on.py Projeto: zer0n1/kopf
 def decorator(  # lgtm[py/similar-function]
     fn: callbacks.ResourceTimerFn, ) -> callbacks.ResourceTimerFn:
     _warn_deprecated_signatures(fn)
     _warn_deprecated_filters(labels, annotations)
     _warn_conflicting_values(field, value)
     real_registry = registry if registry is not None else registries.get_default_registry(
     )
     real_field = dicts.parse_field(
         field) or None  # to not store tuple() as a no-field case.
     real_id = registries.generate_id(fn=fn, id=id)
     selector = references.Selector(group, version, plural)
     handler = handlers.ResourceTimerHandler(
         fn=fn,
         id=real_id,
         errors=errors,
         timeout=timeout,
         retries=retries,
         backoff=backoff,
         cooldown=cooldown,
         selector=selector,
         labels=labels,
         annotations=annotations,
         when=when,
         field=real_field,
         value=value,
         initial_delay=initial_delay,
         requires_finalizer=True,
         sharp=sharp,
         idle=idle,
         interval=interval,
     )
     real_registry.resource_spawning_handlers.append(handler)
     return fn
Exemplo n.º 3
0
 def decorator(  # lgtm[py/similar-function]
         fn: callbacks.ResourceDaemonFn,
 ) -> callbacks.ResourceDaemonFn:
     _warn_conflicting_values(field, value)
     _verify_filters(labels, annotations)
     real_registry = registry if registry is not None else registries.get_default_registry()
     real_field = dicts.parse_field(field) or None  # to not store tuple() as a no-field case.
     real_id = registries.generate_id(fn=fn, id=id, suffix=".".join(real_field or []))
     selector = references.Selector(
         __group_or_groupversion_or_name, __version_or_name, __name,
         group=group, version=version,
         kind=kind, plural=plural, singular=singular, shortcut=shortcut, category=category,
     )
     handler = handlers.ResourceDaemonHandler(
         fn=fn, id=real_id, param=param,
         errors=errors, timeout=timeout, retries=retries, backoff=backoff,
         selector=selector, labels=labels, annotations=annotations, when=when,
         field=real_field, value=value,
         initial_delay=initial_delay, requires_finalizer=True,
         cancellation_backoff=cancellation_backoff,
         cancellation_timeout=cancellation_timeout,
         cancellation_polling=cancellation_polling,
     )
     real_registry._resource_spawning.append(handler)
     return fn
Exemplo n.º 4
0
Arquivo: on.py Projeto: zer0n1/kopf
 def decorator(  # lgtm[py/similar-function]
     fn: callbacks.ResourceChangingFn, ) -> callbacks.ResourceChangingFn:
     _warn_deprecated_signatures(fn)
     _warn_deprecated_filters(labels, annotations)
     _warn_conflicting_values(field, value)
     real_registry = registry if registry is not None else registries.get_default_registry(
     )
     real_field = dicts.parse_field(
         field) or None  # to not store tuple() as a no-field case.
     real_id = registries.generate_id(fn=fn, id=id)
     selector = references.Selector(group, version, plural)
     handler = handlers.ResourceChangingHandler(
         fn=fn,
         id=real_id,
         errors=errors,
         timeout=timeout,
         retries=retries,
         backoff=backoff,
         cooldown=cooldown,
         selector=selector,
         labels=labels,
         annotations=annotations,
         when=when,
         field=real_field,
         value=value,
         old=None,
         new=None,
         field_needs_change=False,
         initial=None,
         deleted=None,
         requires_finalizer=bool(not optional),
         reason=handlers.Reason.DELETE,
     )
     real_registry.resource_changing_handlers.append(handler)
     return fn
Exemplo n.º 5
0
 def register_resource_watching_handler(
     self,
     group: str,
     version: str,
     plural: str,
     fn: callbacks.ResourceWatchingFn,
     id: Optional[str] = None,
     labels: Optional[filters.MetaFilter] = None,
     annotations: Optional[filters.MetaFilter] = None,
     when: Optional[callbacks.WhenFilterFn] = None,
 ) -> callbacks.ResourceWatchingFn:
     """
     Register an additional handler function for low-level events.
     """
     warnings.warn(
         "registry.register_resource_watching_handler() is deprecated; "
         "use @kopf.on... decorators with registry= kwarg.",
         DeprecationWarning)
     return self.resource_watching_handlers.register(
         fn=fn,
         id=id,
         labels=labels,
         annotations=annotations,
         when=when,
         resource=references.Selector(group, version, plural),
     )
Exemplo n.º 6
0
 def register_resource_changing_handler(
     self,
     group: str,
     version: str,
     plural: str,
     fn: callbacks.ResourceChangingFn,
     id: Optional[str] = None,
     reason: Optional[handlers.Reason] = None,
     event: Optional[str] = None,  # deprecated, use `reason`
     field: Optional[dicts.FieldSpec] = None,
     errors: Optional[handlers.ErrorsMode] = None,
     timeout: Optional[float] = None,
     retries: Optional[int] = None,
     backoff: Optional[float] = None,
     cooldown: Optional[float] = None,  # deprecated, use `backoff`
     initial: Optional[bool] = None,
     deleted: Optional[bool] = None,
     requires_finalizer: bool = False,
     labels: Optional[filters.MetaFilter] = None,
     annotations: Optional[filters.MetaFilter] = None,
     when: Optional[callbacks.WhenFilterFn] = None,
 ) -> callbacks.ResourceChangingFn:
     """
     Register an additional handler function for the specific resource and specific reason.
     """
     warnings.warn(
         "registry.register_resource_changing_handler() is deprecated; "
         "use @kopf.on... decorators with registry= kwarg.",
         DeprecationWarning)
     return self.resource_changing_handlers.register(
         reason=reason,
         event=event,
         field=field,
         fn=fn,
         id=id,
         errors=errors,
         timeout=timeout,
         retries=retries,
         backoff=backoff,
         cooldown=cooldown,
         initial=initial,
         deleted=deleted,
         requires_finalizer=requires_finalizer,
         labels=labels,
         annotations=annotations,
         when=when,
         resource=references.Selector(group, version, plural),
     )
Exemplo n.º 7
0
 def decorator(  # lgtm[py/similar-function]
     fn: callbacks.ResourceChangingFn, ) -> callbacks.ResourceChangingFn:
     _warn_conflicting_values(field, value)
     _verify_filters(labels, annotations)
     real_registry = registry if registry is not None else registries.get_default_registry(
     )
     real_field = dicts.parse_field(
         field) or None  # to not store tuple() as a no-field case.
     real_id = registries.generate_id(fn=fn,
                                      id=id,
                                      suffix=".".join(real_field or []))
     selector = references.Selector(
         __group_or_groupversion_or_name,
         __version_or_name,
         __name,
         group=group,
         version=version,
         kind=kind,
         plural=plural,
         singular=singular,
         shortcut=shortcut,
         category=category,
     )
     handler = handlers.ResourceChangingHandler(
         fn=fn,
         id=real_id,
         param=param,
         errors=errors,
         timeout=timeout,
         retries=retries,
         backoff=backoff,
         selector=selector,
         labels=labels,
         annotations=annotations,
         when=when,
         field=real_field,
         value=value,
         old=None,
         new=None,
         field_needs_change=False,
         initial=None,
         deleted=None,
         requires_finalizer=bool(not optional),
         reason=handlers.Reason.DELETE,
     )
     real_registry._resource_changing.append(handler)
     return fn
Exemplo n.º 8
0
 def decorator(  # lgtm[py/similar-function]
         fn: callbacks.ResourceWatchingFn,
 ) -> callbacks.ResourceWatchingFn:
     _warn_conflicting_values(field, value)
     _verify_filters(labels, annotations)
     real_registry = registry if registry is not None else registries.get_default_registry()
     real_field = dicts.parse_field(field) or None  # to not store tuple() as a no-field case.
     real_id = registries.generate_id(fn=fn, id=id)
     selector = references.Selector(
         __group_or_groupversion_or_name, __version_or_name, __name,
         group=group, version=version,
         kind=kind, plural=plural, singular=singular, shortcut=shortcut, category=category,
     )
     handler = handlers.ResourceWatchingHandler(
         fn=fn, id=real_id,
         errors=None, timeout=None, retries=None, backoff=None,
         selector=selector, labels=labels, annotations=annotations, when=when,
         field=real_field, value=value,
     )
     real_registry._resource_watching.append(handler)
     return fn
Exemplo n.º 9
0
 def decorator(  # lgtm[py/similar-function]
         fn: callbacks.ResourceWebhookFn,
 ) -> callbacks.ResourceWebhookFn:
     _warn_conflicting_values(field, value)
     _verify_filters(labels, annotations)
     real_registry = registry if registry is not None else registries.get_default_registry()
     real_field = dicts.parse_field(field) or None  # to not store tuple() as a no-field case.
     real_id = registries.generate_id(fn=fn, id=id, suffix=".".join(real_field or []))
     selector = references.Selector(
         __group_or_groupversion_or_name, __version_or_name, __name,
         group=group, version=version,
         kind=kind, plural=plural, singular=singular, shortcut=shortcut, category=category,
     )
     handler = handlers.ResourceWebhookHandler(
         fn=fn, id=real_id, param=param,
         errors=None, timeout=None, retries=None, backoff=None,  # TODO: add some meaning later
         selector=selector, labels=labels, annotations=annotations, when=when,
         field=real_field, value=value,
         reason=handlers.WebhookType.MUTATING, operation=operation,
         persistent=persistent, side_effects=side_effects, ignore_failures=ignore_failures,
     )
     real_registry._resource_webhooks.append(handler)
     return fn
Exemplo n.º 10
0
def find_resource(
    *,
    request: reviews.Request,
    insights: references.Insights,
) -> references.Resource:
    """
    Identify the requested resource by its meta-information (as discovered).
    """
    # NB: Absent keys in the request are not acceptable, they must be provided.
    request_payload: reviews.RequestPayload = request['request']
    request_resource: reviews.RequestResource = request_payload['resource']
    group = request_resource['group']
    version = request_resource['version']
    plural = request_resource['resource']
    selector = references.Selector(group=group, version=version, plural=plural)
    resources = selector.select(insights.resources)
    if not resources:
        raise UnknownResourceError(
            f"The specified resource has no handlers: {request_resource}")
    elif len(resources) > 1:
        raise AmbiguousResourceError(
            f"The specified resource is ambiguous: {request_resource}")
    else:
        return list(resources)[0]