Repository navigation
1.29.0 [yanked; use 1.29.2]
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 theregistry=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=['…']). #600operator(namespace=None)→operator(clusterwide=True). #600pykube-ngis not installed implicitly as a dependency (install explicitly or viakopf[full-auth]). #655
New features:
- Namespace serving:
- 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
- Resources specified partially with/without versions:
- 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
- Fields' presence/absence filters: e.g.
- 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-fieldsin the docs. #612 - Document optional RBAC permissions needed for runtime cluster observation. #630
- Switch documentation, examples, and peering from
kopf.zalando.org/v1tokopf.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: EventfromEVERYTHINGto 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-mockwithasynctest. #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