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 DeprecationWarning
s 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-ng
is 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-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
tokopf.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
fromEVERYTHING
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
withasynctest
. #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