github nolar/kopf 1.29.0
1.29.0 [yanked; use 1.29.2]

latest releases: 1.37.2, 1.37.1, 1.37.0...
3 years ago

BREAKING CHANGES! The major version increase (0.x → 1.x) means that there are changes in the public interface with no backwards compatibility. Pay attention when upgrading — most of them have quick replacements.

Most of these legacies are extremely old and it is highly unlikely that they were used in any existing operators. The DeprecationWarnings were issued for all these features (except namespaces). See #511.

Dropped features with replacements:

Removed feature Replacement feature
cooldown= option of decorators backoff= option
event kwarg in @kopf.on.event reason kwarg
cause kwarg in handlers use all kwargs directly
kopf.login() sync function @kopf.on.login handlers and async activities
kopf.config module settings kwarg of @kopf.on.startup() handlers
kopf.config.get_pykube_cfg() for patching @kopf.on.login() handlers
kopf.HandlerFatalError kopf.PermanentError
kopf.HandlerRetryError kopf.TemporaryError
kopf.create_tasks() (sync) kopf.spawn_tasks() (async)
kopf.events.event/info/warn/exception() the same directly in the kopf module
None for labels=/annotations= filters kopf.PRESENT (None now raises exceptions)
Positional field in @on.field('group', 'v1', 'plural', 'field') kwarg field='field' instead
Unversioned keys in storages generate v1/v2 keys explicitly
Storages with unprefixed annotations prefix is now mandatory; defaults to kopf.zalando.org/…
@kopf.on.this(…) for sub-handlers @kopf.subhandler(…) (for readability)

Dropped features without replacements:

  • Public fields & methods of OperatorRegistry — use it only as an object for the registry= kwarg. #625 #611
  • All internal sub-registries: Resource[Watching|Spawning|Changing]Registry, ActivityRegistry. #625 #611
  • All legacy registries: SimpleRegistry, GlobalRegistry, etc. #625

Deprecated features:

  • operator(namespace='…')operator(namespaces=['…']). #600
  • operator(namespace=None)operator(clusterwide=True). #600
  • pykube-ng is not installed implicitly as a dependency (install explicitly or via kopf[full-auth]). #655

New features:

  • Namespace serving:
    • Multiple namespaces: e.g. -n default -n myapp. #500
    • Namespace globs: e.g. --namespace myapp-*,!*-pr-*. #500
    • Namespace pre-compiled regexps (only in embedded mode). #500
  • Resource serving:
    • Resources specified partially with/without versions: @kopf.on.event('kopf.dev', 'kex'). #500
    • Resources specified by secondary names (short, singular, kind): @kopf.on.event(kind='Pod'). #500
    • Resources specified by minimally sufficient auto-guess names: @kopf.on.event('pods'). #500
    • Handling of whole categories of resources: @kopf.on.event(category='all'). #500
    • Handling of all resources (do not try on real clusters): @kopf.on.event(kopf.EVERYTHING). #500
  • Field filters:
    • Fields' presence/absence filters: e.g. @kopf.on.event(…, field='spec.field', value=kopf.PRESENT). #573
    • Fields' value filters: e.g. @kopf.on.event(…, field='spec.field', value='value'); callbacks are supported. #573
    • Fields' diff filters (only for update): @kopf.on.update(…, field='spec.field', old=1, new=2); callbacks are supported. #573
    • Fields' filters are now applicable to all handlers: creation/update/deletion/resuming, daemons, timers, events. #573
  • Peering behaviour is now configurable via settings. #572

Improvements of existing features:

  • Better identifiers of peers in IPv6 networks: for easier identification. #569
  • Better log messages in change-detecting processing: #605
  • Faster (near-instant) unfreezing when peers are gone/expire. #581

Documentation improvements:

  • More notes on x-kubernetes-preserve-unknown-fields in the docs. #612
  • Document optional RBAC permissions needed for runtime cluster observation. #630
  • Switch documentation, examples, and peering from kopf.zalando.org/v1 to kopf.dev/v1 (but not annotations and finalizers). #643 #644

Bugfixes:

  • Resources with no uids are now supported too. #596
  • CLI for freezing/resuming was failing due to missing authentication. #568
  • Ignore irrelevant handlers in superseding causes (e.g. deletion-during-creation). #606
  • Fixed configuration of the official Kubernetes library, if used for auth piggybacking. #567
  • Guaranteed finalisation of watchers & workers. #628
  • Give the simulated script-module a name — to make it visible for other libraries (e.g. Pydantic). #634
  • Exclude kind: Event from EVERYTHING to avoid "resource explosion". #636
  • Evade collisions of annotations of ReplicaSets and Deployments. #652

Contributor experience:

  • Switched to GitHub Actions for CI. #582 #586
  • Async timeouts used in the tests, some asyncio tests are time-limited. #608
  • Tests are now limited by time (5-10 minutes instead of 6 hours). #651
  • Coveralls.io uploads are fixed. #651

Internal refactorings:

  • The operator's core ("reactor") is fully reworked for dynamic detection of resources and namespaces. #600 #629 #650
  • API errors are wrapped into our own classes, to prevent abstraction leakage of an HTTP client. #575
  • Stricter typing on resources & namespaces. #623 #624
  • Squashed per-resource registries into combined ones. #622
  • Re-adjust tests to a newer pytest-mock with asynctest. #645
  • Make the tests shorter and cleaner. #639
  • Validate the resource scope against requested namespace. #638
  • Some other refactorings for code clarity: #577 #576 #578 #597 #598 #609 #610 #626 #627 #637

Don't miss a new kopf release

NewReleases is sending notifications on new releases.