Current Series Release Notes¶
17.0.0-23¶
Prelude¶
The OpenStack 2026.2 (Watcher 17.0.0) release advances Watcher’s
modernization efforts, delivering a major milestone in the eventlet removal
initiative, broader adoption of openstacksdk, more accurate cluster
modelling, and stronger security defaults. This release focuses on making
Watcher deployments more maintainable, more correct in their optimization
decisions, and safer by default.
This release marks a turning point in the eventlet removal initiative:
all Watcher services (API, Decision Engine, and Applier) now run in
native threading mode by default. Eventlet, previously the default
concurrency library, is now deprecated and will be removed in a future
release.
The migration from legacy per-service clients to openstacksdk continues across the codebase. Building on the novaclient migration from the previous release, the Cinder, Keystone, and Placement integrations now use openstacksdk, removing the python-cinderclient and python-keystoneclient dependencies and aligning all integrations on OpenStack’s standard client library.
Optimization decisions are now more accurate and better aligned with Nova’s
placement constraints. The vm_workload_consolidation strategy enforces
allocation-based capacity checks in addition to utilization-based checks,
producing more conservative and correct migration plans. Local disk
accounting has been improved for boot-from-volume instances and flavors
with ephemeral or swap devices, preventing valid destination hosts from
being wrongly rejected. Compute scope availability_zones filtering now
correctly limits audits to the specified zones.
Reliability of the cluster data model has been significantly hardened. A reentrant deadlock affecting the compute, storage, and baremetal models was fixed and a race condition that could silently lose model updates during periodic synchronization has been resolved. A lazily-populated per-node allocation cache further improves performance by avoiding redundant iterations when computing node resource usage.
New feature capabilities include support for default_parameters on
audit templates (API microversion 1.7), allowing operators to pre-configure
strategy parameter values directly on a template so that audits inherit
them automatically. The action catalog also grows with two new actions:
delete, which permanently removes a server instance and its associated
resources, and shelve, which frees a host’s vCPU and RAM while
preserving the instance data.
Finally, this release strengthens security defaults. Policy enforcement was added to the webhook trigger endpoint, requiring appropriate privileges to trigger event-driven audits, and service debug logging was hardened so the messaging transport URL is no longer written to logs, avoiding accidental exposure of embedded credentials.
Upgrade Notes¶
The
error_messagefield in API error responses has changed format. Previously,ParsableErrorMiddlewaredouble-encoded WSME fault bodies, soerror_messagewas a JSON-encoded string that clients had to parse a second time. It is now a JSON object withfaultcode,faultstring, anddebuginfokeys. Clients that calledjson.loads()on theerror_messagevalue should access it directly as a dict (e.g.response['error_message']['faultstring']). For more details, please see Bug #2169114 <https://bugs.launchpad.net/watcher/+bug/2169114>_.
Watcher now requires Python 3.11 or newer. The last release of Watcher to support Python 3.10 was 2026.1. Ensure Python 3.11 or newer is available before upgrading.
The deprecated
watcher/api/app.wsgiscript has been removed, along with thewatcher-api-wsgiscript generated by thepbrwsgi_scriptsextension, which is itself deprecated and scheduled for removal frompbr. The Watcher API is now published exclusively as thewatcher.wsgi.apiPython module.Deployment tooling should reference the
watcher.wsgi.api:applicationmodule path if the chosen WSGI server supports it, as gunicorn and uWSGI do:[uwsgi] module = watcher.wsgi.api:application
Servers that require a file on disk instead, such as Apache
mod_wsgi, can be pointed at the installedwatcher/wsgi/api.pymodule, which exposes the sameapplicationobject:WSGIScriptAlias / /usr/local/lib/python3/dist-packages/watcher/wsgi/api.py
Eventlet has been removed from Watcher. All services now run exclusively in native threading mode. The
OS_WATCHER_DISABLE_EVENTLET_PATCHINGenvironment variable no longer has any effect and can be dropped from service environments. Deployments that were still opting back into the deprecated eventlet mode must validate their configuration under the threading model.
The MAAS (Metal as a Service) integration has been removed from Watcher. It was marked as experimental due to the lack of testing, maintenance and documentation, and deprecated in the 2026.1 release. The
[maas_client]configuration section and itsurl,api_keyandtimeoutoptions no longer exist and are ignored if still present inwatcher.conf. Thechange_node_power_stateaction now manages bare metal nodes through Ironic only. Deployments that relied on MAAS to power compute nodes on and off must enroll those nodes in Ironic. The optionalpython-libmaasdependency is no longer used by Watcher.
The standalone
watcher-apiserver has been removed, along with its console script and manual page. It was built onoslo_service.wsgi.Server, which is eventlet based and cannot run under the threading service backend. The Watcher API must now be deployed as a WSGI application behind a WSGI server such as uwsgi or Apachemod_wsgi, using thewatcher.wsgi.api:applicationmodule path. Deployments that already serve the API over uwsgi or mod_wsgi are unaffected.
The
[api] host,[api] port,[api] workersand[api] enable_ssl_apiconfiguration options have been removed. They were only consumed by the standalonewatcher-apiserver, which has been removed as well. The listen address, listen port, worker count and TLS termination are now configured in the WSGI server that serves the API. Any of these options left inwatcher.confare ignored and should be dropped.
Bug Fixes¶
Fixed building of the storage data model failing when the cinder API reports a pool capacity attribute (such as
provisioned_capacity_gb) asNone. Some backends reportNonefor these values when the driver does not support it as they are optional in Cinder API.See: https://bugs.launchpad.net/watcher/+bug/2170714 for more details.
Fixes a bug in the Cinder cluster data model collector where building the storage data model would fail when a volume had no host assigned yet, for example while it was still in the
creatingstate. Such volumes are now skipped and will be picked up in a later collection cycle or via notifications once their creation completes. For more details, please see Bug #2167852.
Fixed an
AttributeErrorraised in the decision engine when processing Cinder notifications for pools whose storage driver does not report all optional pool fields. Some drivers (like the nfs driver) do not report fields such as total_volumes, free_capacity_gb, provisioned_capacity_gb or allocated_capacity_gb that the lvm driver does, so assuming those fields are always present in the notification payload was wrong. These fields are now only updated when present.See: https://bugs.launchpad.net/watcher/+bug/2125060 for more details.
The
host_maintenance,zone_migrationandnode_resource_consolidationstrategies now honor audit scope instance exclusions. Previously, instances excluded through the audit scope were still migrated or considered as migration candidates by these strategies, which prevented operators from protecting critical instances during optimization and maintenance operations. See Bug 2154805: https://bugs.launchpad.net/watcher/+bug/2154805, Bug 2154806: https://bugs.launchpad.net/watcher/+bug/2154806 and Bug 2154807: https://bugs.launchpad.net/watcher/+bug/2154807 for more info.
The Grafana datasource helper is no longer instantiated when the
grafanadatasource is not listed in thedatasourcesoption of the[watcher_datasources]group. Previously it was built every time a strategy resolved its datasource backend, which loggedGrafanaHelper authentication token not configuredat CRITICAL level on every audit for deployments that do not use Grafana.See: https://bugs.launchpad.net/watcher/+bug/2152623 for more details.
17.0.0¶
New Features¶
Added two new actions:
deleteandshelve.The
deleteaction permanently removes a server instance and all its associated resources via the Nova API. It is automatically skipped when the target instance does not exist. Deletion cannot be reverted.The
shelveaction shelves a server instance via the Nova API, freeing compute resources (vCPU and RAM) on the host while preserving the instance data. It is automatically skipped when the target instance does not exist or is already inSHELVEDorSHELVED_OFFLOADEDstate. The action accepts both states as valid postconditions, since Nova may offload the instance immediately depending on the backend storage.