Releases: nolar/kopf
1.30.2
1.30.1
Bugfixes:
- Hotfix an "unexpected kwarg" error for indexing when peering is enabled. #712
Contribution workflow:
1.30.0
New features:
- In-memory indexing & caching for faster lookup/listing of resources from all handlers. #661
- Global
memo
with keys available throughout all operator- & resource-level handlers. #667 - Embedded operators accept
memo=
with arbitrary values to be used as a context. #667 - Custom
memo
classes for embedded operators instead of the defaultkopf.Memo
. #667
Improvements:
- Better documentation on the hierarchies toolkit, with detailed examples. #671 #672
- 3rd-party (
pykube-ng
&kubernetes
) objects/models are now supported for hierarchies. #672 - Other tiny improvements for the hierarchies toolkit:
- Relabelling of the target resources with labels of the current owner.
forced=
flag in all functions, incl. names/namespaces.nested=
now accepts a single string too:nested="spec.jobTemplate"
.adopt()
has gotforced
&strict
options (in addition tonested
).- And others: see #671
Bugfixes:
- Stop daemons & timers while the operator is on peering freeze. #675
- Use
0.0.0.0
for liveness probes in docs. #665 by @brennerm
Contributors experience:
- DCO is now mandatory for all contributions. #660
- Log spill is removed for pytest. #670
- Kopf's compatibility with 3rd-party clients is now tested. #669
- Better error highlighting in tests when happened under throttled code. #696
- Newer mypy. #677
Refactorings:
1.30.0rc1
New features:
- In-memory indexing & caching for faster lookup/listing of resources from all handlers. #661
- Global
memo
with keys available throughout all operator- & resource-level handlers. #667 - Embedded operators accept
memo=
with arbitrary values to be used as a context. #667 - Custom
memo
classes for embedded operators instead of the defaultkopf.Memo
. #667
Improvements:
- Better documentation on the hierarchies toolkit, with detailed examples. #671 #672
- 3rd-party (
pykube-ng
&kubernetes
) objects/models are now supported for hierarchies. #672 - Other tiny improvements for the hierarchies toolkit:
- Relabelling of the target resources with labels of the current owner.
forced=
flag in all functions, incl. names/namespaces.nested=
now accepts a single string too:nested="spec.jobTemplate"
.adopt()
has gotforced
&strict
options (in addition tonested
).- And others: see #671
Bugfixes:
- Stop daemons & timers while the operator is on peering freeze. #675
- Use
0.0.0.0
for liveness probes in docs. #665 by @brennerm
Contributors experience:
- DCO is now mandatory for all contributions. #660
- Log spill is removed for pytest. #670
- Kopf's compatibility with 3rd-party clients is now tested. #669
- Better error highlighting in tests when happened under throttled code. #696
- Newer mypy. #677
Refactorings:
1.29.2
Slightly BREAKING in cases assumed to be extremely rare (see #674 for details):
- When 2+ decorators are used for the same function BUT with different ids explicitly overridden via
id=
. - When field filters (
field=
) are used on resume/create/update/delete handlers AND the resource is in the handling cycle at the moment of the upgrade, these handlers will be re-executed;- Upgrades from older Kopf versions (
<1.29
) are not affected. - Other handlers/daemons/timers are not affected.
- Idle resources are not affected.
- Upgrades from older Kopf versions (
Bugfixes:
- Invoke handlers with the same function but different fields separately for every field. #674
1.29.1 [yanked; use 1.29.2]
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 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