Compare commits

..

28 Commits

Author SHA1 Message Date
Zuul
024815af71 Merge "use cinder migrate for swap volume" into stable/2025.1 2025-08-19 13:39:36 +00:00
Sean Mooney
ffec800f59 use cinder migrate for swap volume
This change removes watchers in tree functionality
for swapping instance volumes and defines swap as an alias
of cinder volume migrate.

The watcher native implementation was missing error handling
which could lead to irretrievable data loss.

The removed code also forged project user credentials to
perform admin request as if it was done by a member of a project.
this was unsafe an posses a security risk due to how it was
implemented. This code has been removed without replacement.

While some effort has been made to allow existing
audits that were defined to work, any reduction of functionality
as a result of this security hardening is intentional.

Closes-Bug: #2112187
Change-Id: Ic3b6bfd164e272d70fe86d7b182478dd962f8ac0
Signed-off-by: Sean Mooney <work@seanmooney.info>
(cherry picked from commit 3742e0a79c)
2025-08-18 16:36:38 +00:00
Douglas Viroel
defd3953d8 Configure watcher tempest's microversion in devstack
Adds a tempest configuration for min and max microversions supported
by watcher. This help us to define the correct range of microversion
to be tested on each stable branch.
New microversion proposals should also increase the default
max_microversion, in order to work with watcher-tempest-plugin
microversion testing.

Change-Id: I0b695ba4530eb89ed17b3935b87e938cadec84cc
(cherry picked from commit adfe3858aa)
Signed-off-by: Douglas Viroel <viroel@gmail.com>
2025-08-04 12:18:53 +00:00
Zuul
de75a2a5b2 Merge "Return HTTP code 400 when creating an audit with wrong parameters" into stable/2025.1 2025-07-21 19:28:47 +00:00
Zuul
7c15812d68 Merge "Add a unit test to check the error when creating an audit with wrong parameters" into stable/2025.1 2025-07-21 19:28:45 +00:00
Zuul
c47f6fb66c Merge "Fix audit creation with no name and no goal or audit_template" into stable/2025.1 2025-07-21 19:28:43 +00:00
Zuul
a4ece6f084 Merge "Added unit test to validate audit creation with no goal and no name" into stable/2025.1 2025-07-21 19:25:04 +00:00
Zuul
758acdfb99 Merge "Set actionplan state to FAILED if any action has failed" into stable/2025.1 2025-07-08 19:46:06 +00:00
Zuul
b65cfc283a Merge "Add unit test to check action plan state when a nested action fails" into stable/2025.1 2025-07-08 19:46:05 +00:00
Zuul
f5a21ba43e Merge "Aggregate by label when querying instance cpu usage in prometheus" into stable/2025.1 2025-07-08 12:41:34 +00:00
Alfredo Moralejo
ba417b38bf Fix audit creation with no name and no goal or audit_template
Currently, in that case it was failing because watcher tried to create a
name based on a goal automatically and the goal is not defined.

This patch is moving the check for goal specification in the audit
creation call earlier, and if there is not goal defined, it returns an
invalid call error.

This patch is also modifying the existing error for this case to check
the expected behavior.

Closes-Bug: #2110947

Change-Id: I6f3d73b035e8081e86ce82c205498432f0e0fc33
(cherry picked from commit bf6a28bd1e)
Signed-off-by: Alfredo Moralejo <amoralej@redhat.com>
2025-07-02 08:16:12 +02:00
Alfredo Moralejo
38622442f2 Set actionplan state to FAILED if any action has failed
Currently, an actionplan state is set to SUCCEEDED once the execution
has finished, but that does not imply that all the actions finished
successfully.

This patch is checking the actual state of all the actions in the plan
after the execution has finished. If any action has status FAILED, it
will set the state of the action plan as FAILED and will apply the
appropiate notification parameters. This is the expected behavior according
to Watcher documentation.

The patch is also fixing the unit test for this to set the expected
action plan state to FAILED and notification parameters.

Closes-Bug: #2106407
Change-Id: I7bfc6759b51cd97c26ec13b3918bd8d3b7ac9d4e
(cherry picked from commit 88d81c104e)
Signed-off-by: Alfredo Moralejo <amoralej@redhat.com>
2025-07-02 08:12:45 +02:00
Alfredo Moralejo
c7fde92411 Add unit test to check action plan state when a nested action fails
This patch is adding a new unit test to check the behavior of the action
plan when one of the actions in it fails during execution.

Note this is to show a bug, and the expected state will be changed in
the fixing patch.

Related-Bug: #2106407
Change-Id: I2f3fe8f4da772a96db098066d253e5dee330101a
(cherry picked from commit b36ba8399e)
Signed-off-by: Alfredo Moralejo <amoralej@redhat.com>
2025-07-02 08:12:13 +02:00
Alfredo Moralejo
e5b5ff5d56 Return HTTP code 400 when creating an audit with wrong parameters
Currently, when trying to create an audit which misses a mandatory
parameter watcher returns error 500 instead of 400 which is the
documented error in the API [1] and the appropiate error code for
malformed requests.

This patch catch parameters validation errors according to the json
schema for each strategy and returns error 400. It also fixes the
unit test to validate the expected behavior.

[1] https://docs.openstack.org/api-ref/resource-optimization/#audits

Closes-Bug: #2110538
Change-Id: I23232b3b54421839bb01d54386d4e7b244f4e2a0
(cherry picked from commit 4629402f38)
Signed-off-by: Alfredo Moralejo <amoralej@redhat.com>
2025-07-02 08:07:26 +02:00
Zuul
3a923dbf16 Merge "Use KiB as unit for host_ram_usage when using prometheus datasource" into stable/2025.1 2025-06-27 16:59:14 +00:00
Alfredo Moralejo
fb85b27ae3 Use KiB as unit for host_ram_usage when using prometheus datasource
The prometheus datasource was reporting host_ram_usage in MiB as
described in the docstring for the base datasource interface
definition [1].

However, the gnocchi datasource is reporting it in KiB following
ceilometer metric `hardware.memory.used` [2] and the strategies
using that metric expect it to be in KiB so the best approach is
to change the unit in the prometheus datasource and update the
docstring to avoid missunderstandings in future. So, this patch
is fixing the prometheus datasource to return host_ram_usage
in KiB instead of MiB.

Additionally, it is adding more unit tests for the check_threshold
method so that it covers the memory based strategy execution, validates
the calculated standard deviation and adds the cases where it is below
the threshold.

[1] 15981117ee/watcher/decision_engine/datasources/base.py (L177-L183)
[2] https://docs.openstack.org/ceilometer/train/admin/telemetry-measurements.html#snmp-based-meters

Closes-Bug: #2113776
Change-Id: Idc060d1e709c0265c64ada16062c3a206c6b04fa
(cherry picked from commit 6ea362da0b)
2025-06-20 16:35:40 +00:00
Alfredo Moralejo
53872f9af2 Aggregate by label when querying instance cpu usage in prometheus
Currently, when the prometheus datasource query ceilometer_cpu metric
for instance cpu usage, it aggregates by instance and filter by the
label containing the instance uuid. While this works fine in real
scenarios, where a single metric is provided in a single instance, in
some cases as the CI jobs where metrics are directly injected, leads to
incorrect metric calculation.

We applied a similar fix for the host metrics in [1] but we did not
implement it for instance cpu.

I am also converting the query formatting to the dict format to improve
understability.

[1] https://review.opendev.org/c/openstack/watcher/+/946049

Closes-Bug: #2113936
Change-Id: I3038dec20612162c411fc77446e86a47e0354423
(cherry picked from commit 3860de0b1e)
2025-06-19 14:54:56 +00:00
Chandan Kumar (raukadah)
c0ebb8ddb3 Drop code from Host maintenance strategy migrating instance to disabled hosts
Currently host maintenance strategy also migrate instances from maintenance
node to watcher_disabled compute nodes.

watcher_disabled compute nodes might be disabled for some other purpose
by different strategy. If host maintenace use those compute nodes for
migration, It might affect customer workloads.

Host maintenance strategy should never touch disabled hosts unless the user
specify a disable host as backup node.

This cr drops the logic for using disabled compute node for maintenance.
Host maintaince is already using nova schedular for migrating the
instance, will use the same. If there is no available node, strategy
will fail.

Closes-Bug: #2109945

Change-Id: If9795fd06f684eb67d553405cebd8a30887c3997
Signed-off-by: Chandan Kumar (raukadah) <chkumar@redhat.com>
(cherry picked from commit 9dea55bd64)
2025-06-09 19:40:41 +05:30
Alfredo Moralejo
1d7f163651 Added unit test to validate audit creation with no goal and no name
This patch is adding a new unit test to validate the behavior
of the API when trying to create an audit without a goal (whether using
a goal or audit template parameters) and no name is provided.

Related-Bug: https://bugs.launchpad.net/watcher/+bug/2110947
Change-Id: I04df10a8a0eea4509856f2f4b9d11bae24cd563a
(cherry picked from commit 0651fff910)
2025-06-04 13:06:14 +00:00
Alfredo Moralejo
c6ceaacf27 Add a unit test to check the error when creating an audit with wrong parameters
Currently, it is returning http error code 500 instead of 400, which
would be the appropiate code.

A follow-up patch will be sent with the vix and switching the error code
and message.

Related-Bug: #2110538
Change-Id: I35ccbb9cf29fc08e78c4d5f626a6518062efbed3
(cherry picked from commit 891119470c)
2025-06-04 12:52:40 +00:00
Chandan Kumar (raukadah)
f4bfb10525 [host_maintenance] Pass des hostname in add_action solution
Currently we are passing src_node and des_node uuid when we try to run
migrate action.

In the watcher-applier log, migration fails with following exception
```
Nova client exception occurred while live migrating instance <uuid>Exception: Compute host <uuid> could not be found
```
Based on 57f55190ff/watcher/applier/actions/migration.py (L122)
and
57f55190ff/watcher/common/nova_helper.py (L322),
live_migrate_instance expects destination hostname not uuid.

This cr replaces dest_node uuid to hostname.

Closes-Bug: #2109309

Change-Id: I3911ff24ea612f69dddae5eab15fabb4891f938d
Signed-off-by: Chandan Kumar (raukadah) <chkumar@redhat.com>
(cherry picked from commit 278cb7e98c)
2025-05-05 02:53:03 +00:00
Sean Mooney
8a99d4c5c1 Add support for pyproject.toml and wsgi module paths
pip 23.1 removed the "setup.py install" fallback for projects that do
not have pyproject.toml and now uses a pyproject.toml which is vendored
in pip [1][2]. pip 24.2 has now deprecated a similar fallback to
"setup.py develop" and plans to fully remove this in pip 25.0 [3][4][5].
pbr supports editable installs since 6.0.0

pip 25.1 has now been released and the removal is complete.
by adding our own minimal pyproject.toml to ensure we are using the
correct build system.

This change also requires that we adapt how we generate our wsgi
entry point. when pyproject.toml is used the wsgi console script is
not generated in an editbale install such as is used in devstck

To adress this we need to refactor our usage of our wsgi applciation
to use a module path instead. This change does not remove
the declaration of our wsgi_scrtip entry point but it shoudl
be considered deprecated and it will be removed in the future.

To unblock the gate the devstack plugin is modifed to to deploy
using the wsgi module instead of the console script.

Finally supprot for the mod_wsgi wsgi mode is removed.
that was deprecated in devstack a few cycle ago and
support was removed in I8823e98809ed6b66c27dbcf21a00eea68ef403e8

[1] https://pip.pypa.io/en/stable/news/#v23-1
[2] https://github.com/pypa/pip/issues/8368
[3] https://pip.pypa.io/en/stable/news/#v24-2
[4] https://github.com/pypa/pip/issues/11457
[5] https://ichard26.github.io/blog/2024/08/whats-new-in-pip-24.2/
Closes-Bug: #2109608

Change-Id: Iad77939ab0403c5720c549f96edfc77d2b7d90ee
2025-05-01 00:19:23 +00:00
Alfredo Moralejo
ce9f0b4c1e Skip real-data tests in non-real-data jobs
I am excluding strategies execution with annotation `real_load` in
non-real-load jobs.

This is partial backport of [1].

[1] https://review.opendev.org/c/openstack/watcher/+/945627

Change-Id: I77d4c23ebc21693bba8ca0247b8954c6dc8eaba9
2025-04-24 17:02:21 +02:00
Alfredo Moralejo
e385ece629 Aggregate by fqdn label instead instance in host cpu metrics
While in a regular case a specific metric for a specific host will be
provider by a single instance (exporter) so aggregating by label and by
intances should be the same, it is more correct to aggregate by the same
label that the one we use to filter the metrics.

This is follow up of https://review.opendev.org/c/openstack/watcher/+/944795

Related-Bug: #2103451

Change-Id: Ia61f051547ddc51e0d1ccd5a56485ab49ce84c2e
(cherry picked from commit c7158b08d1)
2025-04-09 09:00:17 +02:00
Alfredo Moralejo
c6505ad06f Query by fqdn_label instead of instance for host metrics
Currently we are using `instance` label to query about host metrics to
prometheus. This label is assigned to the url of each endpoint being
scrapped.

While this work fine in one-exporter-per-compute cases as the driver is
mapping the fqdn_label value to the `instance` label value, it fails
when there are more that one target with the same value for the fqdn
label. This is a valid case, to be able to query by fqdn and do not
care about what exporter in the host is providing the metric.

This patch is changing the queries we use for hosts to be based on the
fqdn_label instead of the instance one. To implement it, we are also
simplifying the way we check the metric exist for the host by converting
prometheus_fqdn_instance_map into a prometheus_fqdn_labels set
which stores the list of fqdn found in  prometheus.

Closes-Bug: #2103451
Change-Id: I3bcc317441b73da5c876e53edd4622370c6d575e
(cherry picked from commit a65e7e9b59)
2025-04-09 08:59:52 +02:00
Chandan Kumar (raukadah)
64f70b948d Drop sg_core prometheus related vars
The depends-on pr removes the installation of promotheus[1] and node
exporter[2] from sg_core. We no longer need to define those vars in
the devstack config.

Links:
[1]. https://github.com/openstack-k8s-operators/sg-core/pull/21
[2]. https://github.com/openstack-k8s-operators/sg-core/pull/23

Note: We do not need to enable sg_core service on compute node,
so removing it's plugin call.

Change-Id: Ie8645813a360605635de4dff9e8d1ba0d7a0cdc3
Signed-off-by: Chandan Kumar (raukadah) <raukadah@gmail.com>
(cherry picked from commit 0702cb3869)
2025-04-09 08:58:28 +02:00
OpenStack Release Bot
68c9ce65d2 Update TOX_CONSTRAINTS_FILE for stable/2025.1
Update the URL to the upper-constraints file to point to the redirect
rule on releases.openstack.org so that anyone working on this branch
will switch to the correct upper-constraints list automatically when
the requirements repository branches.

Until the requirements repository has as stable/2025.1 branch, tests will
continue to use the upper-constraints list on master.

Change-Id: I29d11e287122d21e62bd6266a193db480dcc4a23
2025-03-13 13:51:53 +00:00
OpenStack Release Bot
5fa0926528 Update .gitreview for stable/2025.1
Change-Id: Ic5083f5a799b269aee36b2c83408f0ba7cbded0d
2025-03-13 13:51:51 +00:00
255 changed files with 2109 additions and 8860 deletions

View File

@@ -2,3 +2,4 @@
host=review.opendev.org
port=29418
project=openstack/watcher.git
defaultbranch=stable/2025.1

View File

@@ -35,17 +35,17 @@ repos:
additional_dependencies: []
exclude: '^(doc|releasenotes|tools)/.*$'
- repo: https://github.com/PyCQA/bandit
rev: 1.8.3
rev: 1.7.6
hooks:
- id: bandit
args: ['-x', 'tests', '-s', 'B101,B311,B320']
- repo: https://github.com/hhatto/autopep8
rev: v2.3.2
rev: v2.3.1
hooks:
- id: autopep8
files: '^.*\.py$'
- repo: https://github.com/codespell-project/codespell
rev: v2.4.1
rev: v2.3.0
hooks:
- id: codespell
args: ['--ignore-words=doc/dictionary.txt']
@@ -54,7 +54,7 @@ repos:
hooks:
- id: sphinx-lint
args: [--enable=default-role]
files: ^doc/|^releasenotes/|^api-guide/
files: ^doc/|releasenotes|api-guide
types: [rst]
- repo: https://github.com/PyCQA/doc8
rev: v1.1.2

View File

@@ -1,3 +1,27 @@
- project:
queue: watcher
templates:
- check-requirements
- openstack-cover-jobs
- openstack-python3-jobs
- publish-openstack-docs-pti
- release-notes-jobs-python3
check:
jobs:
- watcher-tempest-functional
- watcher-tempest-functional-jammy
- watcher-grenade
- watcher-tempest-strategies
- watcher-tempest-actuator
- watcherclient-tempest-functional
- watcher-tempest-functional-ipv6-only
- watcher-prometheus-integration
gate:
jobs:
- watcher-tempest-functional
- watcher-tempest-functional-jammy
- watcher-tempest-functional-ipv6-only
- job:
name: watcher-tempest-actuator
parent: watcher-tempest-multinode
@@ -9,10 +33,7 @@
parent: watcher-tempest-multinode
vars:
tempest_concurrency: 1
# All tests inside watcher_tempest_plugin.tests.scenario with tag "strategy"
# or test_execute_strategies file
# excluding tests with tag "real_load"
tempest_test_regex: (^watcher_tempest_plugin.tests.scenario)(.*\[.*\bstrategy\b.*\].*)|(^watcher_tempest_plugin.tests.scenario.test_execute_strategies)
tempest_test_regex: watcher_tempest_plugin.tests.scenario.test_execute_strategies
tempest_exclude_regex: .*\[.*\breal_load\b.*\].*
- job:
@@ -32,11 +53,6 @@
period: 120
watcher_cluster_data_model_collectors.storage:
period: 120
$CINDER_CONF:
# enable notifications in compute node, by default they are only
# configured in the controller
oslo_messaging_notifications:
driver: messagingv2
devstack_services:
watcher-api: false
watcher-decision-engine: true
@@ -52,13 +68,6 @@
rabbit: false
mysql: false
vars:
devstack_localrc:
GNOCCHI_ARCHIVE_POLICY_TEMPEST: "ceilometer-low-rate"
CEILOMETER_PIPELINE_INTERVAL: 15
devstack_services:
ceilometer-acompute: false
ceilometer-acentral: true
ceilometer-anotification: true
devstack_local_conf:
post-config:
$WATCHER_CONF:
@@ -68,11 +77,6 @@
period: 120
watcher_cluster_data_model_collectors.storage:
period: 120
$CINDER_CONF:
# enable notifications in compute node, by default they are only
# configured in the controller
oslo_messaging_notifications:
driver: messagingv2
test-config:
$TEMPEST_CONFIG:
compute:
@@ -83,8 +87,6 @@
block_migration_for_live_migration: true
placement:
min_microversion: 1.29
telemetry:
ceilometer_polling_interval: 15
devstack_plugins:
ceilometer: https://opendev.org/openstack/ceilometer
@@ -118,6 +120,17 @@
zuul_copy_output:
/etc/hosts: logs
# TODO(gmann): As per the 2025.1 testing runtime, we need to run at least
# one job on jammy. This job can be removed in the next cycle(2025.2)
- job:
name: watcher-tempest-functional-jammy
description: This is integrated job testing on Ubuntu jammy(22.04)
parent: watcher-tempest-functional
nodeset: openstack-single-node-jammy
vars:
<<: *base_vars
python_version: '3.9'
- job:
name: watcher-tempest-functional-ipv6-only
parent: devstack-tempest-ipv6
@@ -146,6 +159,15 @@
- ^tools/.*$
- ^tox.ini$
- job:
# This job is used in python-watcherclient repo
name: watcherclient-tempest-functional
parent: watcher-tempest-functional
timeout: 4200
vars:
tempest_concurrency: 1
tempest_test_regex: watcher_tempest_plugin.tests.client_functional
- job:
name: watcher-sg-core-tempest-base
parent: devstack-tempest
@@ -175,7 +197,6 @@
watcher: https://opendev.org/openstack/watcher
devstack-plugin-prometheus: https://opendev.org/openstack/devstack-plugin-prometheus
devstack_services:
ceilometer-acompute: true
watcher-api: true
watcher-decision-engine: true
watcher-applier: true
@@ -194,6 +215,11 @@
CEILOMETER_PIPELINE_INTERVAL: 15
CEILOMETER_ALARM_THRESHOLD: 6000000000
PROMETHEUS_CONFIG_FILE: "/home/zuul/prometheus.yml"
# Disable sg_core prometheus config copy
PROMETHEUS_ENABLE: false
# PROMETHEUS_CONFIG_FILE var conflicts with sg_core var
# to avoid issue, set PROMETHEUS_CONF_DIR
PROMETHEUS_CONF_DIR: "/home/zuul"
devstack_local_conf:
post-config:
$WATCHER_CONF:
@@ -208,10 +234,6 @@
period: 120
watcher_cluster_data_model_collectors.storage:
period: 120
compute_model:
enable_extended_attributes: true
nova_client:
api_version: "2.96"
test-config:
$TEMPEST_CONFIG:
compute:
@@ -231,14 +253,9 @@
ceilometer_polling_interval: 15
optimize:
datasource: prometheus
extended_attributes_nova_microversion: "2.96"
data_model_collectors_period: 120
tempest_plugins:
- watcher-tempest-plugin
# All tests inside watcher_tempest_plugin.tests.scenario with tag "strategy"
# and test_execute_strategies, test_data_model files
# excluding tests with tag "real_load"
tempest_test_regex: (watcher_tempest_plugin.tests.scenario)(.*\[.*\bstrategy\b.*\].*)|(watcher_tempest_plugin.tests.scenario.(test_execute_strategies|test_data_model))
tempest_test_regex: watcher_tempest_plugin.tests.scenario.test_execute_strategies
tempest_exclude_regex: .*\[.*\breal_load\b.*\].*
tempest_concurrency: 1
tox_envlist: all
@@ -257,6 +274,9 @@
devstack_localrc:
CEILOMETER_BACKEND: "none"
CEILOMETER_BACKENDS: "none"
# avoid collecting real host cpu metric since tests
# will inject fake metrics when needed
NODE_EXPORTER_COLLECTOR_EXCLUDE: "cpu"
devstack_local_conf:
post-config:
$WATCHER_CONF:
@@ -270,133 +290,3 @@
- job:
name: watcher-prometheus-integration
parent: watcher-sg-core-tempest-base
vars:
devstack_services:
ceilometer-acompute: false
node_exporter: false
group-vars:
subnode:
devstack_services:
ceilometer-acompute: false
node_exporter: false
- job:
name: watcher-aetos-integration
parent: watcher-sg-core-tempest-base
description: |
This job tests Watcher with Aetos reverse-proxy for Prometheus
using Keystone authentication instead of direct Prometheus access.
required-projects:
- openstack/python-observabilityclient
- openstack/aetos
vars: &aetos_vars
devstack_services:
ceilometer-acompute: false
node_exporter: false
devstack_plugins:
ceilometer: https://opendev.org/openstack/ceilometer
sg-core: https://github.com/openstack-k8s-operators/sg-core
watcher: https://opendev.org/openstack/watcher
devstack-plugin-prometheus: https://opendev.org/openstack/devstack-plugin-prometheus
aetos: https://opendev.org/openstack/aetos
devstack_local_conf:
post-config:
$WATCHER_CONF:
watcher_datasources:
datasources: aetos
aetos_client:
interface: public
region_name: RegionOne
fqdn_label: fqdn
instance_uuid_label: resource
test-config:
$TEMPEST_CONFIG:
optimize:
datasource: prometheus
group-vars:
subnode:
devstack_services:
ceilometer-acompute: false
node_exporter: false
- job:
name: watcher-prometheus-integration-realdata
parent: watcher-sg-core-tempest-base
vars: &realdata_vars
devstack_services:
ceilometer-acompute: true
node_exporter: true
devstack_localrc:
NODE_EXPORTER_COLLECTOR_EXCLUDE: ""
devstack_local_conf:
test-config:
$TEMPEST_CONFIG:
optimize:
datasource: ""
real_workload_period: 300
# All tests inside watcher_tempest_plugin.tests.scenario with tag "real_load"
tempest_test_regex: (^watcher_tempest_plugin.tests.scenario)(.*\[.*\breal_load\b.*\].*)
tempest_exclude_regex: ""
group-vars: &realdata_group_vars
subnode:
devstack_services:
ceilometer-acompute: true
node_exporter: true
devstack_localrc:
NODE_EXPORTER_COLLECTOR_EXCLUDE: ""
- job:
name: watcher-prometheus-integration-threading
parent: watcher-prometheus-integration
vars:
devstack_localrc:
'SYSTEMD_ENV_VARS["watcher-decision-engine"]': OS_WATCHER_DISABLE_EVENTLET_PATCHING=true
- job:
name: openstack-tox-py312-threading
parent: openstack-tox-py312
description: |
Run tox with the py3-threading environment.
vars:
tox_envlist: py3-threading
- job:
name: watcher-aetos-integration-realdata
parent: watcher-aetos-integration
vars: *realdata_vars
group-vars: *realdata_group_vars
- project:
queue: watcher
templates:
- check-requirements
- openstack-cover-jobs
- openstack-python3-jobs
- publish-openstack-docs-pti
- release-notes-jobs-python3
check:
jobs:
- openstack-tox-py312-threading
- watcher-tempest-functional
- watcher-grenade
- watcher-tempest-strategies
- watcher-tempest-actuator
- python-watcherclient-functional:
files:
- ^watcher/api/*
- watcher-tempest-functional-ipv6-only
- watcher-prometheus-integration
- watcher-prometheus-integration-threading
- watcher-aetos-integration
gate:
jobs:
- watcher-tempest-functional
- watcher-tempest-functional-ipv6-only
experimental:
jobs:
- watcher-prometheus-integration-realdata
- watcher-aetos-integration-realdata
periodic-weekly:
jobs:
- watcher-prometheus-integration-realdata
- watcher-aetos-integration-realdata

View File

@@ -189,16 +189,6 @@ action_state:
in: body
required: true
type: string
action_status_message:
description: |
Message with additional information about the Action state.
This field can be set when transitioning an action to SKIPPED state,
or updated for actions that are already in SKIPPED state to provide
more detailed explanations, fix typos, or expand on initial reasons.
in: body
required: false
type: string
min_version: 1.5
action_type:
description: |
Action type based on specific API action. Actions in Watcher are
@@ -240,13 +230,6 @@ actionplan_state:
in: body
required: false
type: string
actionplan_status_message:
description: |
Message with additional information about the Action Plan state.
in: body
required: false
type: string
min_version: 1.5
# Audit
audit_autotrigger:
@@ -337,13 +320,6 @@ audit_state:
in: body
required: true
type: string
audit_status_message:
description: |
Message with additional information about the Audit state.
in: body
required: false
type: string
min_version: 1.5
audit_strategy:
description: |
The UUID or name of the Strategy.
@@ -444,24 +420,12 @@ links:
type: array
# Data Model Node
node_disabled_reason:
description: |
The Disabled Reason of the node.
in: body
required: true
type: string
node_disk:
description: |
The Disk of the node(in GiB).
in: body
required: true
type: integer
node_disk_gb_reserved:
description: |
The Disk Reserved of the node (in GiB).
in: body
required: true
type: integer
node_disk_ratio:
description: |
The Disk Ratio of the node.
@@ -480,12 +444,6 @@ node_memory:
in: body
required: true
type: integer
node_memory_mb_reserved:
description: |
The Memory Reserved of the node(in MiB).
in: body
required: true
type: integer
node_memory_ratio:
description: |
The Memory Ratio of the node.
@@ -498,12 +456,6 @@ node_state:
in: body
required: true
type: string
node_status:
description: |
The Status of the node.
in: body
required: true
type: string
node_uuid:
description: |
The Unique UUID of the node.
@@ -516,18 +468,13 @@ node_vcpu_ratio:
in: body
required: true
type: float
node_vcpu_reserved:
description: |
The Vcpu Reserved of the node.
in: body
required: true
type: integer
node_vcpus:
description: |
The Vcpu of the node.
in: body
required: true
type: integer
# Scoring Engine
scoring_engine_description:
description: |
@@ -555,50 +502,18 @@ server_disk:
in: body
required: true
type: integer
server_flavor_extra_specs:
description: |
The flavor extra specs of the server.
in: body
required: true
type: JSON
min_version: 1.6
server_locked:
description: |
Whether the server is locked.
in: body
required: true
type: boolean
server_memory:
description: |
The Memory of server.
in: body
required: true
type: integer
server_metadata:
description: |
The metadata associated with the server.
in: body
required: true
type: JSON
server_name:
description: |
The Name of the server.
in: body
required: true
type: string
server_pinned_az:
description: |
The pinned availability zone of the server.
in: body
required: true
type: string
min_version: 1.6
server_project_id:
description: |
The project ID of the server.
in: body
required: true
type: string
server_state:
description: |
The State of the server.
@@ -617,12 +532,6 @@ server_vcpus:
in: body
required: true
type: integer
server_watcher_exclude:
description: |
Whether the server is excluded from the scope.
in: body
required: true
type: boolean
# Service
service_host:
description: |

View File

@@ -1,12 +0,0 @@
[
{
"op": "replace",
"value": "SKIPPED",
"path": "/state"
},
{
"op": "replace",
"value": "Skipping due to maintenance window",
"path": "/status_message"
}
]

View File

@@ -1,7 +0,0 @@
[
{
"op": "replace",
"value": "SKIPPED",
"path": "/state"
}
]

View File

@@ -1,29 +0,0 @@
{
"state": "SKIPPED",
"description": "Migrate instance to another compute node",
"parents": [
"b4529294-1de6-4302-b57a-9b5d5dc363c6"
],
"links": [
{
"rel": "self",
"href": "http://controller:9322/v1/actions/54acc7a0-91b0-46ea-a5f7-4ae2b9df0b0a"
},
{
"rel": "bookmark",
"href": "http://controller:9322/actions/54acc7a0-91b0-46ea-a5f7-4ae2b9df0b0a"
}
],
"action_plan_uuid": "4cbc4ede-0d25-481b-b86e-998dbbd4f8bf",
"uuid": "54acc7a0-91b0-46ea-a5f7-4ae2b9df0b0a",
"deleted_at": null,
"updated_at": "2018-04-10T12:15:44.026973+00:00",
"input_parameters": {
"migration_type": "live",
"destination_node": "compute-2",
"resource_id": "a1b2c3d4-e5f6-7890-1234-567890abcdef"
},
"action_type": "migrate",
"created_at": "2018-04-10T11:59:12.725147+00:00",
"status_message": "Action skipped by user. Reason:Skipping due to maintenance window"
}

View File

@@ -1,7 +0,0 @@
[
{
"op": "replace",
"value": "Action skipped due to scheduled maintenance window",
"path": "/status_message"
}
]

View File

@@ -1,29 +0,0 @@
{
"state": "SKIPPED",
"description": "Migrate instance to another compute node",
"parents": [
"b4529294-1de6-4302-b57a-9b5d5dc363c6"
],
"links": [
{
"rel": "self",
"href": "http://controller:9322/v1/actions/54acc7a0-91b0-46ea-a5f7-4ae2b9df0b0a"
},
{
"rel": "bookmark",
"href": "http://controller:9322/actions/54acc7a0-91b0-46ea-a5f7-4ae2b9df0b0a"
}
],
"action_plan_uuid": "4cbc4ede-0d25-481b-b86e-998dbbd4f8bf",
"uuid": "54acc7a0-91b0-46ea-a5f7-4ae2b9df0b0a",
"deleted_at": null,
"updated_at": "2018-04-10T12:20:15.123456+00:00",
"input_parameters": {
"migration_type": "live",
"destination_node": "compute-2",
"resource_id": "a1b2c3d4-e5f6-7890-1234-567890abcdef"
},
"action_type": "migrate",
"created_at": "2018-04-10T11:59:12.725147+00:00",
"status_message": "Action skipped by user. Reason: Action skipped due to scheduled maintenance window"
}

View File

@@ -21,8 +21,7 @@
"uuid": "4cbc4ede-0d25-481b-b86e-998dbbd4f8bf",
"audit_uuid": "7d100b05-0a86-491f-98a7-f93da19b272a",
"created_at": "2018-04-10T11:59:52.640067+00:00",
"hostname": "controller",
"status_message": null
"hostname": "controller"
}
]
}

View File

@@ -17,6 +17,5 @@
"strategy_name": "dummy_with_resize",
"uuid": "4cbc4ede-0d25-481b-b86e-998dbbd4f8bf",
"audit_uuid": "7d100b05-0a86-491f-98a7-f93da19b272a",
"hostname": "controller",
"status_message": null
}
"hostname": "controller"
}

View File

@@ -24,8 +24,7 @@
"duration": 3.2
},
"action_type": "sleep",
"created_at": "2018-03-26T11:56:08.235226+00:00",
"status_message": null
"created_at": "2018-03-26T11:56:08.235226+00:00"
}
]
}
}

View File

@@ -22,6 +22,5 @@
"message": "Welcome"
},
"action_type": "nop",
"created_at": "2018-04-10T11:59:12.725147+00:00",
"status_message": null
}
"created_at": "2018-04-10T11:59:12.725147+00:00"
}

View File

@@ -51,6 +51,5 @@
"updated_at": null,
"hostname": null,
"start_time": null,
"end_time": null,
"status_message": null
"end_time": null
}

View File

@@ -53,8 +53,7 @@
"updated_at": "2018-04-06T09:44:01.604146+00:00",
"hostname": "controller",
"start_time": null,
"end_time": null,
"status_message": null
"end_time": null
}
]
}

View File

@@ -51,6 +51,5 @@
"updated_at": "2018-04-06T11:54:01.266447+00:00",
"hostname": "controller",
"start_time": null,
"end_time": null,
"status_message": null
"end_time": null
}

View File

@@ -1,62 +1,38 @@
{
"context": [
{
"server_watcher_exclude": false,
"server_uuid": "1bf91464-9b41-428d-a11e-af691e5563bb",
"server_name": "chenke-test1",
"server_state": "active",
"server_vcpus": "1",
"server_memory": "512",
"server_disk": "1",
"server_vcpus": "1",
"server_metadata": {},
"server_project_id": "baea342fc74b4a1785b4a40c69a8d958",
"server_locked":false,
"server_uuid": "1bf91464-9b41-428d-a11e-af691e5563bb",
"server_pinned_az": "nova",
"server_flavor_extra_specs": {
"hw_rng:allowed": true
},
"server_state": "active",
"node_uuid": "253e5dd0-9384-41ab-af13-4f2c2ce26112",
"node_hostname": "localhost.localdomain",
"node_status": "enabled",
"node_disabled_reason": null,
"node_state": "up",
"node_memory": "16383",
"node_memory_mb_reserved": "512",
"node_disk": "37",
"node_disk_gb_reserved": "0",
"node_vcpus": "4",
"node_vcpu_reserved": "0",
"node_memory_ratio": "1.5",
"node_vcpu_ratio": "16.0",
"node_memory": "16383",
"node_memory_ratio": "1.5",
"node_disk": "37",
"node_disk_ratio": "1.0",
"node_uuid": "253e5dd0-9384-41ab-af13-4f2c2ce26112"
"node_state": "up"
},
{
"server_watcher_exclude": false,
"server_uuid": "e2cb5f6f-fa1d-4ba2-be1e-0bf02fa86ba4",
"server_name": "chenke-test2",
"server_state": "active",
"server_vcpus": "1",
"server_memory": "512",
"server_disk": "1",
"server_vcpus": "1",
"server_metadata": {},
"server_project_id": "baea342fc74b4a1785b4a40c69a8d958",
"server_locked": false,
"server_uuid": "e2cb5f6f-fa1d-4ba2-be1e-0bf02fa86ba4",
"server_pinned_az": "nova",
"server_flavor_extra_specs": {},
"server_state": "active",
"node_uuid": "253e5dd0-9384-41ab-af13-4f2c2ce26112",
"node_hostname": "localhost.localdomain",
"node_status": "enabled",
"node_disabled_reason": null,
"node_state": "up",
"node_memory": "16383",
"node_memory_mb_reserved": "512",
"node_disk": "37",
"node_disk_gb_reserved": "0",
"node_vcpus": "4",
"node_vcpu_reserved": "0",
"node_memory_ratio": "1.5",
"node_vcpu_ratio": "16.0",
"node_memory": "16383",
"node_memory_ratio": "1.5",
"node_disk": "37",
"node_disk_ratio": "1.0",
"node_uuid": "253e5dd0-9384-41ab-af13-4f2c2ce26112"
"node_state": "up"
}
]
}

View File

@@ -139,7 +139,6 @@ Response
- global_efficacy: actionplan_global_efficacy
- links: links
- hostname: actionplan_hostname
- status_message: actionplan_status_message
**Example JSON representation of an Action Plan:**
@@ -178,7 +177,6 @@ Response
- global_efficacy: actionplan_global_efficacy
- links: links
- hostname: actionplan_hostname
- status_message: actionplan_status_message
**Example JSON representation of an Audit:**
@@ -235,7 +233,6 @@ version 1:
- global_efficacy: actionplan_global_efficacy
- links: links
- hostname: actionplan_hostname
- status_message: actionplan_status_message
**Example JSON representation of an Action Plan:**

View File

@@ -23,9 +23,6 @@ following:
- **PENDING** : the ``Action`` has not been executed yet by the
``Watcher Applier``.
- **SKIPPED** : the ``Action`` will not be executed because a predefined
skipping condition is found by ``Watcher Applier`` or is explicitly
skipped by the ``Administrator``.
- **ONGOING** : the ``Action`` is currently being processed by the
``Watcher Applier``.
- **SUCCEEDED** : the ``Action`` has been executed successfully
@@ -114,7 +111,6 @@ Response
- description: action_description
- input_parameters: action_input_parameters
- links: links
- status_message: action_status_message
**Example JSON representation of an Action:**
@@ -152,111 +148,8 @@ Response
- description: action_description
- input_parameters: action_input_parameters
- links: links
- status_message: action_status_message
**Example JSON representation of an Action:**
.. literalinclude:: samples/actions-show-response.json
:language: javascript
Skip Action
===========
.. rest_method:: PATCH /v1/actions/{action_ident}
Skips an Action resource by changing its state to SKIPPED.
.. note::
Only Actions in PENDING state can be skipped. The Action must belong to
an Action Plan in RECOMMENDED or PENDING state. This operation requires
API microversion 1.5 or later.
Normal response codes: 200
Error codes: 400,404,403,409
Request
-------
.. rest_parameters:: parameters.yaml
- action_ident: action_ident
**Example Action skip request:**
.. literalinclude:: samples/action-skip-request.json
:language: javascript
**Example Action skip request with custom status message:**
.. literalinclude:: samples/action-skip-request-with-message.json
:language: javascript
Response
--------
.. rest_parameters:: parameters.yaml
- uuid: uuid
- action_type: action_type
- state: action_state
- action_plan_uuid: action_action_plan_uuid
- parents: action_parents
- description: action_description
- input_parameters: action_input_parameters
- links: links
- status_message: action_status_message
**Example JSON representation of a skipped Action:**
.. literalinclude:: samples/action-skip-response.json
:language: javascript
Update Action Status Message
============================
.. rest_method:: PATCH /v1/actions/{action_ident}
Updates the status_message of an Action that is already in SKIPPED state.
.. note::
The status_message field can only be updated for Actions that are currently
in SKIPPED state. This allows administrators to fix typos, provide more
detailed explanations, or expand on reasons that were initially omitted.
This operation requires API microversion 1.5 or later.
Normal response codes: 200
Error codes: 400,404,403,409
Request
-------
.. rest_parameters:: parameters.yaml
- action_ident: action_ident
**Example status_message update request for a SKIPPED action:**
.. literalinclude:: samples/action-update-status-message-request.json
:language: javascript
Response
--------
.. rest_parameters:: parameters.yaml
- uuid: uuid
- action_type: action_type
- state: action_state
- action_plan_uuid: action_action_plan_uuid
- parents: action_parents
- description: action_description
- input_parameters: action_input_parameters
- links: links
- status_message: action_status_message
**Example JSON representation of an Action with updated status_message:**
.. literalinclude:: samples/action-update-status-message-response.json
:language: javascript

View File

@@ -85,7 +85,6 @@ version 1:
- start_time: audit_starttime_resp
- end_time: audit_endtime_resp
- force: audit_force
- status_message: audit_status_message
**Example JSON representation of an Audit:**
@@ -185,7 +184,6 @@ Response
- start_time: audit_starttime_resp
- end_time: audit_endtime_resp
- force: audit_force
- status_message: audit_status_message
**Example JSON representation of an Audit:**
@@ -233,7 +231,6 @@ Response
- start_time: audit_starttime_resp
- end_time: audit_endtime_resp
- force: audit_force
- status_message: audit_status_message
**Example JSON representation of an Audit:**
@@ -289,7 +286,6 @@ version 1:
- start_time: audit_starttime_resp
- end_time: audit_endtime_resp
- force: audit_force
- status_message: audit_status_message
**Example JSON representation of an Audit:**
@@ -345,7 +341,6 @@ Response
- start_time: audit_starttime_resp
- end_time: audit_endtime_resp
- force: audit_force
- status_message: audit_status_message
**Example JSON representation of an Audit:**

View File

@@ -35,32 +35,21 @@ Response
.. rest_parameters:: parameters.yaml
- server_watcher_exclude: server_watcher_exclude
- server_uuid: server_uuid
- server_name: server_name
- server_state: server_state
- server_vcpus: server_vcpus
- server_memory: server_memory
- server_disk: server_disk
- server_vcpus: server_vcpus
- server_metadata: server_metadata
- server_project_id: server_project_id
- server_locked: server_locked
- server_uuid: server_uuid
- server_pinned_az: server_pinned_az
- server_flavor_extra_specs: server_flavor_extra_specs
- node_hostname: node_hostname
- node_status: node_status
- node_disabled_reason: node_disabled_reason
- node_state: node_state
- node_memory: node_memory
- node_memory_mb_reserved: node_memory_mb_reserved
- node_disk: node_disk
- node_disk_gb_reserved: node_disk_gb_reserved
- node_vcpus: node_vcpus
- node_vcpu_reserved: node_vcpu_reserved
- node_memory_ratio: node_memory_ratio
- node_vcpu_ratio: node_vcpu_ratio
- node_disk_ratio: node_disk_ratio
- server_state: server_state
- node_uuid: node_uuid
- node_hostname: node_hostname
- node_vcpus: node_vcpus
- node_vcpu_ratio: node_vcpu_ratio
- node_memory: node_memory
- node_memory_ratio: node_memory_ratio
- node_disk: node_disk
- node_disk_ratio: node_disk_ratio
- node_state: node_state
**Example JSON representation of a Data Model:**

View File

@@ -1,23 +0,0 @@
# This is a cross-platform list tracking distribution packages needed for install and tests;
# see https://docs.openstack.org/infra/bindep/ for additional information.
mysql [platform:rpm !platform:redhat test]
mysql-client [platform:dpkg !platform:debian test]
mysql-devel [platform:rpm !platform:redhat test]
mysql-server [!platform:redhat !platform:debian test]
mariadb-devel [platform:rpm platform:redhat test]
mariadb-server [platform:rpm platform:redhat platform:debian test]
python3-all [platform:dpkg test]
python3-all-dev [platform:dpkg test]
python3 [platform:rpm test]
python3-devel [platform:rpm test]
sqlite-devel [platform:rpm test]
# gettext and graphviz are needed by doc builds only.
gettext [doc]
graphviz [doc]
# fonts-freefont-otf is needed for pdf docs builds with the 'xelatex' engine
fonts-freefont-otf [pdf-docs]
texlive [pdf-docs]
texlive-latex-recommended [pdf-docs]
texlive-xetex [pdf-docs]
latexmk [pdf-docs]

View File

@@ -0,0 +1,42 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
# This is an example Apache2 configuration file for using the
# Watcher API through mod_wsgi. This version assumes you are
# running devstack to configure the software.
Listen %WATCHER_SERVICE_PORT%
<VirtualHost *:%WATCHER_SERVICE_PORT%>
WSGIDaemonProcess watcher-api user=%USER% processes=%APIWORKERS% threads=1 display-name=%{GROUP}
WSGIScriptAlias / %WATCHER_WSGI_DIR%/app.wsgi
WSGIApplicationGroup %{GLOBAL}
WSGIProcessGroup watcher-api
WSGIPassAuthorization On
ErrorLogFormat "%M"
ErrorLog /var/log/%APACHE_NAME%/watcher-api.log
CustomLog /var/log/%APACHE_NAME%/watcher-api-access.log combined
<Directory %WATCHER_WSGI_DIR%>
WSGIProcessGroup watcher-api
WSGIApplicationGroup %{GLOBAL}
<IfVersion >= 2.4>
Require all granted
</IfVersion>
<IfVersion < 2.4>
Order allow,deny
Allow from all
</IfVersion>
</Directory>
</VirtualHost>

View File

@@ -57,7 +57,12 @@ fi
WATCHER_UWSGI=watcher.wsgi.api:application
WATCHER_UWSGI_CONF=$WATCHER_CONF_DIR/watcher-uwsgi.ini
WATCHER_WSGI_DIR=${WATCHER_WSGI_DIR:-/var/www/watcher}
if is_suse; then
WATCHER_WSGI_DIR=${WATCHER_WSGI_DIR:-/srv/www/htdocs/watcher}
else
WATCHER_WSGI_DIR=${WATCHER_WSGI_DIR:-/var/www/watcher}
fi
# Public facing bits
WATCHER_SERVICE_HOST=${WATCHER_SERVICE_HOST:-$SERVICE_HOST}
WATCHER_SERVICE_PORT=${WATCHER_SERVICE_PORT:-9322}
@@ -163,7 +168,7 @@ function create_watcher_conf {
configure_keystone_authtoken_middleware $WATCHER_CONF watcher
configure_keystone_authtoken_middleware $WATCHER_CONF watcher "watcher_clients_auth"
if is_fedora; then
if is_fedora || is_suse; then
# watcher defaults to /usr/local/bin, but fedora and suse pip like to
# install things in /usr/bin
iniset $WATCHER_CONF DEFAULT bindir "/usr/bin"
@@ -268,7 +273,7 @@ function configure_tempest_for_watcher {
# Please make sure to update this when the microversion is updated, otherwise
# new tests may be skipped.
TEMPEST_WATCHER_MIN_MICROVERSION=${TEMPEST_WATCHER_MIN_MICROVERSION:-"1.0"}
TEMPEST_WATCHER_MAX_MICROVERSION=${TEMPEST_WATCHER_MAX_MICROVERSION:-"1.6"}
TEMPEST_WATCHER_MAX_MICROVERSION=${TEMPEST_WATCHER_MAX_MICROVERSION:-"1.4"}
# Set microversion options in tempest.conf
iniset $TEMPEST_CONFIG optimize min_microversion $TEMPEST_WATCHER_MIN_MICROVERSION

View File

@@ -26,7 +26,7 @@ GLANCE_HOSTPORT=${SERVICE_HOST}:9292
DATABASE_TYPE=mysql
# Enable services (including neutron)
ENABLED_SERVICES=n-cpu,n-api-meta,c-vol,q-agt,placement-client,node-exporter
ENABLED_SERVICES=n-cpu,n-api-meta,c-vol,q-agt,placement-client
NOVA_VNC_ENABLED=True
NOVNCPROXY_URL="http://$SERVICE_HOST:6080/vnc_auto.html"
@@ -42,10 +42,6 @@ disable_service ceilometer-acentral,ceilometer-collector,ceilometer-api
LOGFILE=$DEST/logs/stack.sh.log
LOGDAYS=2
CEILOMETER_BACKEND="none"
CEILOMETER_BACKENDS="none"
enable_plugin devstack-plugin-prometheus https://opendev.org/openstack/devstack-plugin-prometheus
[[post-config|$NOVA_CONF]]
[DEFAULT]
compute_monitors=cpu.virt_driver

View File

@@ -18,10 +18,6 @@ NETWORK_GATEWAY=10.254.1.1 # Change this for your network
MULTI_HOST=1
CEILOMETER_ALARM_THRESHOLD="6000000000"
CEILOMETER_BACKENDS="sg-core"
CEILOMETER_PIPELINE_INTERVAL="15"
#Set this to FALSE if do not want to run watcher-api behind mod-wsgi
#WATCHER_USE_MOD_WSGI=TRUE
@@ -44,10 +40,8 @@ disable_service ceilometer-acompute
# Enable the ceilometer api explicitly(bug:1667678)
enable_service ceilometer-api
enable_service prometheus
enable_plugin aodh https://opendev.org/openstack/aodh
enable_plugin devstack-plugin-prometheus https://opendev.org/openstack/devstack-plugin-prometheus
enable_plugin sg-core https://github.com/openstack-k8s-operators/sg-core main
# Enable the Gnocchi plugin
enable_plugin gnocchi https://github.com/gnocchixyz/gnocchi
LOGFILE=$DEST/logs/stack.sh.log
LOGDAYS=2
@@ -61,42 +55,3 @@ compute_monitors=cpu.virt_driver
# can change this to just versioned when ceilometer handles versioned
# notifications from nova: https://bugs.launchpad.net/ceilometer/+bug/1665449
notification_format=both
[[post-config|$WATCHER_CONF]]
[prometheus_client]
host = 127.0.0.1
port = 9090
[watcher_cluster_data_model_collectors.baremetal]
period = 120
[watcher_cluster_data_model_collectors.compute]
period = 120
[watcher_cluster_data_model_collectors.storage]
period = 120
[watcher_datasources]
datasources = prometheus
[[test-config|$TEMPEST_CONFIG]]
[optimize]
datasource = prometheus
[service_available]
sg_core = True
[telemetry]
ceilometer_polling_interval = 15
disable_ssl_certificate_validation = True
[telemetry_services]
metric_backends = prometheus
[compute]
min_compute_nodes = 2
min_microversion = 2.56
[compute-feature-enabled]
block_migration_for_live_migration = True
live_migration = True

View File

@@ -1,53 +0,0 @@
# Sample ``local.conf`` for compute node for Watcher development
# NOTE: Copy this file to the root DevStack directory for it to work properly.
[[local|localrc]]
ADMIN_PASSWORD=nomoresecrete
DATABASE_PASSWORD=stackdb
RABBIT_PASSWORD=stackqueue
SERVICE_PASSWORD=$ADMIN_PASSWORD
SERVICE_TOKEN=azertytoken
HOST_IP=192.168.42.2 # Change this to this compute node's IP address
#HOST_IPV6=2001:db8::7
FLAT_INTERFACE=eth0
FIXED_RANGE=10.254.1.0/24 # Change this to whatever your network is
NETWORK_GATEWAY=10.254.1.1 # Change this for your network
MULTI_HOST=1
SERVICE_HOST=192.168.42.1 # Change this to the IP of your controller node
MYSQL_HOST=$SERVICE_HOST
RABBIT_HOST=$SERVICE_HOST
GLANCE_HOSTPORT=${SERVICE_HOST}:9292
DATABASE_TYPE=mysql
# Enable services (including neutron)
ENABLED_SERVICES=n-cpu,n-api-meta,c-vol,q-agt,placement-client
NOVA_VNC_ENABLED=True
NOVNCPROXY_URL="http://$SERVICE_HOST:6080/vnc_auto.html"
VNCSERVER_LISTEN=0.0.0.0
VNCSERVER_PROXYCLIENT_ADDRESS=$HOST_IP # or HOST_IPV6
NOVA_INSTANCES_PATH=/opt/stack/data/instances
# Enable the Ceilometer plugin for the compute agent
enable_plugin ceilometer https://opendev.org/openstack/ceilometer
disable_service ceilometer-acentral,ceilometer-collector,ceilometer-api
LOGFILE=$DEST/logs/stack.sh.log
LOGDAYS=2
[[post-config|$NOVA_CONF]]
[DEFAULT]
compute_monitors=cpu.virt_driver
[notifications]
# Enable both versioned and unversioned notifications. Watcher only
# uses versioned notifications but ceilometer uses unversioned. We
# can change this to just versioned when ceilometer handles versioned
# notifications from nova: https://bugs.launchpad.net/ceilometer/+bug/1665449
notification_format=both

View File

@@ -1,57 +0,0 @@
# Sample ``local.conf`` for controller node for Watcher development
# NOTE: Copy this file to the root DevStack directory for it to work properly.
[[local|localrc]]
ADMIN_PASSWORD=nomoresecrete
DATABASE_PASSWORD=stackdb
RABBIT_PASSWORD=stackqueue
SERVICE_PASSWORD=$ADMIN_PASSWORD
SERVICE_TOKEN=azertytoken
HOST_IP=192.168.42.1 # Change this to your controller node IP address
#HOST_IPV6=2001:db8::7
FLAT_INTERFACE=eth0
FIXED_RANGE=10.254.1.0/24 # Change this to whatever your network is
NETWORK_GATEWAY=10.254.1.1 # Change this for your network
MULTI_HOST=1
#Set this to FALSE if do not want to run watcher-api behind mod-wsgi
#WATCHER_USE_MOD_WSGI=TRUE
# This is the controller node, so disable nova-compute
disable_service n-cpu
# Enable the Watcher Dashboard plugin
enable_plugin watcher-dashboard https://opendev.org/openstack/watcher-dashboard
# Enable the Watcher plugin
enable_plugin watcher https://opendev.org/openstack/watcher
# Enable the Ceilometer plugin
enable_plugin ceilometer https://opendev.org/openstack/ceilometer
# This is the controller node, so disable the ceilometer compute agent
disable_service ceilometer-acompute
# Enable the ceilometer api explicitly(bug:1667678)
enable_service ceilometer-api
# Enable the Gnocchi plugin
enable_plugin gnocchi https://github.com/gnocchixyz/gnocchi
LOGFILE=$DEST/logs/stack.sh.log
LOGDAYS=2
[[post-config|$NOVA_CONF]]
[DEFAULT]
compute_monitors=cpu.virt_driver
[notifications]
# Enable both versioned and unversioned notifications. Watcher only
# uses versioned notifications but ceilometer uses unversioned. We
# can change this to just versioned when ceilometer handles versioned
# notifications from nova: https://bugs.launchpad.net/ceilometer/+bug/1665449
notification_format=both

View File

@@ -1,16 +0,0 @@
global:
scrape_interval: 10s
scrape_configs:
- job_name: "node"
static_configs:
- targets: ["controller:3000"]
- targets: ["controller:9100"]
labels:
fqdn: "controller" # change the hostname here to your controller hostname
- targets: ["compute-1:9100"]
labels:
fqdn: "compute-1" # change the hostname here to your fist compute hostname
- targets: ["compute-2:9100"]
labels:
fqdn: "compute-2" # change the hostname her to your secondd compute hostname
# add as many blocks as compute nodes you have

View File

@@ -14,7 +14,6 @@
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "CANCELLED",
"status_message": null,
"action_plan": {
"watcher_object.namespace": "watcher",
"watcher_object.version": "1.0",
@@ -25,7 +24,6 @@
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "CANCELLING",
"status_message": null,
"audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
"deleted_at": null

View File

@@ -24,7 +24,6 @@
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "FAILED",
"status_message": null,
"action_plan": {
"watcher_object.namespace": "watcher",
"watcher_object.version": "1.0",
@@ -35,7 +34,6 @@
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "CANCELLING",
"status_message": null,
"audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
"deleted_at": null

View File

@@ -14,7 +14,6 @@
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "CANCELLING",
"status_message": null,
"action_plan": {
"watcher_object.namespace": "watcher",
"watcher_object.version": "1.0",
@@ -25,7 +24,6 @@
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "CANCELLING",
"status_message": null,
"audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
"deleted_at": null

View File

@@ -13,7 +13,6 @@
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "PENDING",
"status_message": null,
"action_plan": {
"watcher_object.namespace": "watcher",
"watcher_object.version": "1.0",
@@ -24,7 +23,6 @@
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "ONGOING",
"status_message": null,
"audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
"deleted_at": null

View File

@@ -13,7 +13,6 @@
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "DELETED",
"status_message": null,
"action_plan": {
"watcher_object.namespace": "watcher",
"watcher_object.version": "1.0",
@@ -24,7 +23,6 @@
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "ONGOING",
"status_message": null,
"audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
"deleted_at": null

View File

@@ -14,7 +14,6 @@
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "SUCCEEDED",
"status_message": null,
"action_plan": {
"watcher_object.namespace": "watcher",
"watcher_object.version": "1.0",
@@ -25,7 +24,6 @@
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "ONGOING",
"status_message": null,
"audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
"deleted_at": null

View File

@@ -24,7 +24,6 @@
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "FAILED",
"status_message": "Action execution failed",
"action_plan": {
"watcher_object.namespace": "watcher",
"watcher_object.version": "1.0",
@@ -35,7 +34,6 @@
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "ONGOING",
"status_message": null,
"audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
"deleted_at": null

View File

@@ -14,7 +14,6 @@
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "ONGOING",
"status_message": null,
"action_plan": {
"watcher_object.namespace": "watcher",
"watcher_object.version": "1.0",
@@ -25,7 +24,6 @@
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "ONGOING",
"status_message": null,
"audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
"deleted_at": null

View File

@@ -18,12 +18,10 @@
"watcher_object.name": "ActionStateUpdatePayload",
"watcher_object.data": {
"old_state": "PENDING",
"state": "ONGOING",
"status_message": null
"state": "ONGOING"
}
},
"state": "ONGOING",
"status_message": null,
"action_plan": {
"watcher_object.namespace": "watcher",
"watcher_object.version": "1.0",
@@ -34,7 +32,6 @@
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null,
"state": "ONGOING",
"status_message": null,
"audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d",
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
"deleted_at": null

View File

@@ -21,7 +21,6 @@
"scope": [],
"audit_type": "ONESHOT",
"state": "SUCCEEDED",
"status_message": null,
"parameters": {},
"interval": null,
"updated_at": null
@@ -30,7 +29,6 @@
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
"fault": null,
"state": "CANCELLED",
"status_message": null,
"global_efficacy": [],
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
"strategy": {

View File

@@ -52,15 +52,13 @@
"scope": [],
"updated_at": null,
"audit_type": "ONESHOT",
"status_message": null,
"interval": null,
"deleted_at": null,
"state": "SUCCEEDED"
}
},
"global_efficacy": [],
"state": "CANCELLING",
"status_message": null
"state": "CANCELLING"
}
},
"timestamp": "2016-10-18 09:52:05.219414"

View File

@@ -21,7 +21,6 @@
"scope": [],
"audit_type": "ONESHOT",
"state": "SUCCEEDED",
"status_message": null,
"parameters": {},
"interval": null,
"updated_at": null
@@ -30,7 +29,6 @@
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
"fault": null,
"state": "CANCELLING",
"status_message": null,
"global_efficacy": [],
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
"strategy": {

View File

@@ -33,7 +33,6 @@
"interval": null,
"deleted_at": null,
"state": "PENDING",
"status_message": null,
"created_at": "2016-10-18T09:52:05Z",
"updated_at": null
},
@@ -44,7 +43,6 @@
"global_efficacy": {},
"deleted_at": null,
"state": "RECOMMENDED",
"status_message": null,
"updated_at": null
},
"watcher_object.namespace": "watcher",

View File

@@ -18,7 +18,6 @@
"updated_at": null,
"deleted_at": null,
"state": "PENDING",
"status_message": null,
"created_at": "2016-10-18T09:52:05Z",
"parameters": {}
},
@@ -44,8 +43,7 @@
"watcher_object.name": "StrategyPayload",
"watcher_object.namespace": "watcher"
},
"state": "DELETED",
"status_message": null
"state": "DELETED"
},
"watcher_object.version": "1.0",
"watcher_object.name": "ActionPlanDeletePayload",

View File

@@ -22,7 +22,6 @@
"scope": [],
"audit_type": "ONESHOT",
"state": "SUCCEEDED",
"status_message": null,
"parameters": {},
"interval": null,
"updated_at": null
@@ -31,7 +30,6 @@
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
"fault": null,
"state": "ONGOING",
"status_message": null,
"global_efficacy": [],
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
"strategy": {

View File

@@ -55,13 +55,11 @@
"audit_type": "ONESHOT",
"interval": null,
"deleted_at": null,
"state": "PENDING",
"status_message": null
"state": "PENDING"
}
},
"global_efficacy": [],
"state": "ONGOING",
"status_message": null
"state": "ONGOING"
}
},
"timestamp": "2016-10-18 09:52:05.219414"

View File

@@ -22,7 +22,6 @@
"scope": [],
"audit_type": "ONESHOT",
"state": "PENDING",
"status_message": null,
"parameters": {},
"interval": null,
"updated_at": null
@@ -31,7 +30,6 @@
"uuid": "76be87bd-3422-43f9-93a0-e85a577e3061",
"fault": null,
"state": "ONGOING",
"status_message": null,
"global_efficacy": [],
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
"strategy": {

View File

@@ -16,7 +16,6 @@
"interval": null,
"updated_at": null,
"state": "PENDING",
"status_message": null,
"deleted_at": null,
"parameters": {}
},
@@ -36,7 +35,6 @@
"watcher_object.name": "ActionPlanStateUpdatePayload"
},
"state": "ONGOING",
"status_message": null,
"deleted_at": null,
"strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3",
"strategy": {

View File

@@ -9,7 +9,6 @@
"para1": 3.2
},
"state": "PENDING",
"status_message": null,
"updated_at": null,
"deleted_at": null,
"goal_uuid": "bc830f84-8ae3-4fc6-8bc6-e3dd15e8b49a",

View File

@@ -9,7 +9,6 @@
"para1": 3.2
},
"state": "DELETED",
"status_message": null,
"updated_at": null,
"deleted_at": null,
"goal_uuid": "bc830f84-8ae3-4fc6-8bc6-e3dd15e8b49a",

View File

@@ -9,7 +9,6 @@
"para1": 3.2
},
"state": "ONGOING",
"status_message": null,
"updated_at": null,
"deleted_at": null,
"fault": null,

View File

@@ -9,7 +9,6 @@
"para1": 3.2
},
"state": "ONGOING",
"status_message": null,
"updated_at": null,
"deleted_at": null,
"fault": {

View File

@@ -9,7 +9,6 @@
"para1": 3.2
},
"state": "ONGOING",
"status_message": null,
"updated_at": null,
"deleted_at": null,
"fault": null,

View File

@@ -9,7 +9,6 @@
"para1": 3.2
},
"state": "ONGOING",
"status_message": null,
"updated_at": null,
"deleted_at": null,
"fault": null,

View File

@@ -9,7 +9,6 @@
"para1": 3.2
},
"state": "ONGOING",
"status_message": null,
"updated_at": null,
"deleted_at": null,
"fault": {

View File

@@ -9,7 +9,6 @@
"para1": 3.2
},
"state": "ONGOING",
"status_message": null,
"updated_at": null,
"deleted_at": null,
"fault": null,

View File

@@ -70,7 +70,6 @@
"interval": null,
"updated_at": null,
"state": "ONGOING",
"status_message": null,
"audit_type": "ONESHOT"
},
"watcher_object.namespace": "watcher",

View File

@@ -384,9 +384,7 @@ following methods of the :ref:`Action <action_definition>` handler:
- **preconditions()**: this method will make sure that all conditions are met
before executing the action (for example, it makes sure that an instance
still exists before trying to migrate it). If action specific preconditions
are not met in this phase, the Action is set to **SKIPPED** state and will
not be executed.
still exists before trying to migrate it).
- **execute()**: this method is what triggers real commands on other
OpenStack services (such as Nova, ...) in order to change target resource
state. If the action is successfully executed, a notification message is
@@ -481,39 +479,6 @@ change to a new value:
.. image:: ./images/action_plan_state_machine.png
:width: 100%
.. _action_state_machine:
Action State Machine
-------------------------
An :ref:`Action <action_definition>` has a life-cycle and its current state may
be one of the following:
- **PENDING** : the :ref:`Action <action_definition>` has not been executed
yet by the :ref:`Watcher Applier <watcher_applier_definition>`
- **SKIPPED** : the :ref:`Action <action_definition>` will not be executed
because a predefined skipping condition is found by
:ref:`Watcher Applier <watcher_applier_definition>` or is explicitly
skipped by the :ref:`Administrator <administrator_definition>`.
- **ONGOING** : the :ref:`Action <action_definition>` is currently being
processed by the :ref:`Watcher Applier <watcher_applier_definition>`
- **SUCCEEDED** : the :ref:`Action <action_definition>` has been executed
successfully
- **FAILED** : an error occurred while trying to execute the
:ref:`Action <action_definition>`
- **DELETED** : the :ref:`Action <action_definition>` is still stored in the
:ref:`Watcher database <watcher_database_definition>` but is not returned
any more through the Watcher APIs.
- **CANCELLED** : the :ref:`Action <action_definition>` was in **PENDING** or
**ONGOING** state and was cancelled by the
:ref:`Administrator <administrator_definition>`
The following diagram shows the different possible states of an
:ref:`Action <action_definition>` and what event makes the state change
change to a new value:
.. image:: ./images/action_state_machine.png
:width: 100%
.. _Watcher API: https://docs.openstack.org/api-ref/resource-optimization/

View File

@@ -429,38 +429,20 @@ Configure Cinder Notifications
Watcher can also consume notifications generated by the Cinder services, in
order to build or update, in real time, its cluster data model related to
storage resources.
storage resources. To do so, you have to update the Cinder configuration
file on controller and volume nodes, in order to let Watcher receive Cinder
notifications in a dedicated ``watcher_notifications`` channel.
Cinder emits notifications on the ``notifications`` topic, in the openstack
control exchange (as it can be seen in the `Cinder conf`_).
* In the file ``/etc/cinder/cinder.conf``, the value of driver in the section
``[oslo_messaging_notifications]`` can't be noop.
* In the file ``/etc/cinder/cinder.conf``, update the section
``[oslo_messaging_notifications]``, by redefining the list of topics
into which Cinder services will publish events ::
[oslo_messaging_notifications]
driver = messagingv2
topics = notifications,watcher_notifications
.. _`Cinder conf`: https://docs.openstack.org/cinder/latest/configuration/block-storage/samples/cinder.conf.html
* Restart the Cinder services.
Configure Watcher listening to the Notifications
================================================
To consume either Cinder or Nova notifications, (or both), Watcher must be
configured to listen to the notifications topics that Cinder and Nova emit.
Use the `notification_topics`_ config option to indicate to Watcher that it
should listen to the correct topics. By default, Cinder emits notifications
on ``openstack.notifications``, while Nova emits notifications on
``nova.versioned_notifications``. The Watcher conf should have the topics for
the desired notifications, below is an example for both Cinder and Nova::
[watcher_decision_engine]
...
notification_topics = nova.versioned_notifications,openstack.notifications
.. _`notification_topics`: https://docs.openstack.org/watcher/latest/configuration/watcher.html#watcher_decision_engine.notification_topics
Workers
=======

View File

@@ -52,43 +52,18 @@ types of concurrency used in various services of Watcher.
.. _wait_for_any: https://docs.openstack.org/futurist/latest/reference/index.html#waiters
Concurrency modes
#################
Evenlet has been the main concurrency library within the OpenStack community
for the last 10 years since the removal of twisted. Over the last few years,
the maintenance of eventlet has decreased and the efforts to remove the GIL
from Python (PEP 703), have fundamentally changed how concurrency is making
eventlet no longer viable. While transitioning to a new native thread
solution, Watcher services will be supporting both modes, with the usage of
native threading mode initially classified as ``experimental``.
It is possible to enable the new native threading mode by setting the following
environment variable in the corresponding service configuration:
.. code:: bash
OS_WATCHER_DISABLE_EVENTLET_PATCHING=true
.. note::
The only service that supports two different concurrency modes is the
``decision engine``.
Decision engine concurrency
***************************
The concurrency in the decision engine is governed by two independent
threadpools. These threadpools can be configured as GreenThreadPoolExecutor_
or ThreadPoolExecutor_, both from the futurist_ library, depending on the
service configuration. One of these is used automatically and most contributors
threadpools. Both of these threadpools are GreenThreadPoolExecutor_ from the
futurist_ library. One of these is used automatically and most contributors
will not interact with it while developing new features. The other threadpool
can frequently be used while developing new features or updating existing ones.
It is known as the DecisionEngineThreadpool and allows to achieve performance
improvements in network or I/O bound operations.
.. _GreenThreadPoolExecutor: https://docs.openstack.org/futurist/latest/reference/index.html#futurist.GreenThreadPoolExecutor
.. _ThreadPoolExecutor: https://docs.openstack.org/futurist/latest/reference/index.html#futurist.ThreadPoolExecutor
.. _GreenThreadPoolExecutor: https://docs.openstack.org/futurist/latest/reference/index.html#executors
AuditEndpoint
#############

View File

@@ -31,45 +31,14 @@ Quick Devstack Instructions with Datasources
============================================
Watcher requires a datasource to collect metrics from compute nodes and
instances in order to execute most strategies. To enable this two possible
examples of ``[[local|localrc]]`` to setup DevStack for some of the
supported datasources is provided. These examples specify the minimal
configuration parameters to get both Watcher and the datasource working
but can be expanded is desired.
The first example configures watcher to user prometheus as a datasource, while
the second example show how to use gnocchi as the datasource. The procedure is
equivalent, it just requires using the ``local.conf.controller`` and
``local.conf.compute`` in the first example and
``local_gnocchi.conf.controller`` and ``local_gnocchi.conf.compute`` in the
second.
Prometheus
----------
With the Prometheus datasource most of the metrics for compute nodes and
instances will work with the provided configuration but metrics that
require Ironic such as ``host_airflow and`` ``host_power`` will still be
unavailable as well as ``instance_l3_cpu_cache``
.. code-block:: ini
[[local|localrc]]
enable_plugin watcher https://opendev.org/openstack/watcher
enable_plugin watcher-dashboard https://opendev.org/openstack/watcher-dashboard
enable_plugin ceilometer https://opendev.org/openstack/ceilometer.git
enable_plugin aodh https://opendev.org/openstack/aodh
enable_plugin devstack-plugin-prometheus https://opendev.org/openstack/devstack-plugin-prometheus
enable_plugin sg-core https://github.com/openstack-k8s-operators/sg-core main
CEILOMETER_BACKEND=sg-core
[[post-config|$NOVA_CONF]]
[DEFAULT]
compute_monitors=cpu.virt_driver
instances in order to execute most strategies. To enable this a
``[[local|localrc]]`` to setup DevStack for some of the supported datasources
is provided. These examples specify the minimal configuration parameters to
get both Watcher and the datasource working but can be expanded is desired.
Gnocchi
-------
With the Gnocchi datasource most of the metrics for compute nodes and
instances will work with the provided configuration but metrics that
require Ironic such as ``host_airflow and`` ``host_power`` will still be
@@ -127,8 +96,7 @@ Detailed DevStack Instructions
cd ~
git clone https://opendev.org/openstack/devstack.git
#. For each compute node, copy the provided `local.conf.compute`_
(`local_gnocchi.conf.compute`_ if deploying with gnocchi) example file
#. For each compute node, copy the provided `local.conf.compute`_ example file
to the compute node's system at ~/devstack/local.conf. Make sure the
HOST_IP and SERVICE_HOST values are changed appropriately - i.e., HOST_IP
is set to the IP address of the compute node and SERVICE_HOST is set to the
@@ -144,8 +112,7 @@ Detailed DevStack Instructions
to configure similar configuration options for the projects providing those
metrics.
#. For the controller node, copy the provided `local.conf.controller`_
(`local_gnocchi.conf.controller`_ if deploying with gnocchi) example
#. For the controller node, copy the provided `local.conf.controller`_ example
file to the controller node's system at ~/devstack/local.conf. Make sure
the HOST_IP value is changed appropriately - i.e., HOST_IP is set to the IP
address of the controller node.
@@ -175,17 +142,6 @@ Detailed DevStack Instructions
to FALSE. For Production environment it is suggested to keep it at the
default TRUE value.
#. If you want to use prometheus as a datasource, you need to provide a
Prometheus configuration with the compute nodes set as targets, so
it can consume their node-exporter metrics (if you are deploying watcher
with gnocchi as datasource you can skip this step altogether). Copy the
provided `prometheus.yml`_ example file and set the appropriate hostnames
for all the compute nodes (the example configures 2 of them plus the
controller, but you should add all of them if using more than 2 compute
nodes). Set the value of ``PROMETHEUS_CONFIG_FILE`` to the path of the
file you created in the local.conf file (the sample local.conf file uses
``$DEST`` as the default value for the prometheus config path).
#. Start stacking from the controller node::
./devstack/stack.sh
@@ -198,9 +154,6 @@ Detailed DevStack Instructions
.. _local.conf.controller: https://github.com/openstack/watcher/tree/master/devstack/local.conf.controller
.. _local.conf.compute: https://github.com/openstack/watcher/tree/master/devstack/local.conf.compute
.. _local_gnocchi.conf.controller: https://github.com/openstack/watcher/tree/master/devstack/local_gnocchi.conf.controller
.. _local_gnocchi.conf.compute: https://github.com/openstack/watcher/tree/master/devstack/local_gnocchi.conf.compute
.. _prometheus.yml: https://github.com/openstack/watcher/tree/master/devstack/prometheus.yml
Multi-Node DevStack Environment
===============================

View File

@@ -10,4 +10,3 @@ Contribution Guide
devstack
testing
rally_link
release-guide

View File

@@ -1,462 +0,0 @@
..
Licensed under the Apache License, Version 2.0 (the "License"); you may
not use this file except in compliance with the License. You may obtain
a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations
under the License.
Chronological Release Liaison Guide
====================================
This is a reference guide that a release liaison may use as an aid, if
they choose.
Watcher uses the `Distributed Project Leadership (DPL)`__ model where
traditional release liaison responsibilities are distributed among various
liaisons. The release liaison is responsible for requesting releases,
reviewing Feature Freeze Exception (FFE) requests, and coordinating
release-related activities with the team.
.. __: https://governance.openstack.org/tc/reference/distributed-project-leadership.html
How to Use This Guide
---------------------
This guide is organized chronologically to follow the OpenStack release
cycle from PTG planning through post-release activities. You can use it
in two ways:
**For New Release Liaisons**
Read through the entire guide to understand the full release cycle,
then bookmark it for reference during your term.
**For Experienced Release Liaisons**
Jump directly to the relevant section for your current phase in the
release cycle. Each major section corresponds to a specific time period.
**Key Navigation Tips**
* The :ref:`glossary` defines all acronyms and terminology used
* Time-sensitive activities are clearly marked by milestone phases
* DPL coordination notes indicate when team collaboration is required
DPL Liaison Coordination
-------------------------
Under the DPL model, the release liaison coordinates with other project
liaisons and the broader team for effective release management. The release
liaison has authority for release-specific decisions (FFE approvals, release
timing, etc.) while major process changes and strategic decisions require
team consensus.
This coordination approach ensures that:
* Release activities are properly managed by a dedicated liaison
* Team input is gathered for significant decisions
* Other liaisons are informed of release-related developments that may
affect their areas
* Release processes remain responsive while maintaining team alignment
Project Context
---------------
* Coordinate with the watcher meeting (chair rotates each meeting, with
volunteers requested at the end of each meeting)
* Meeting etherpad: https://etherpad.opendev.org/p/openstack-watcher-irc-meeting
* IRC channel: #openstack-watcher
* Get acquainted with the release schedule
* Example: https://releases.openstack.org/<current-release>/schedule.html
* Familiarize with Watcher project repositories and tracking:
Watcher Main Repository
`Primary codebase for the Watcher service <https://opendev.org/openstack/watcher>`__
Watcher Dashboard
`Horizon plugin for Watcher UI <https://opendev.org/openstack/watcher-dashboard>`__
Watcher Tempest Plugin
`Integration tests <https://opendev.org/openstack/watcher-tempest-plugin>`__ (follows tempest cycle)
Python Watcher Client
`Command-line client and Python library <https://opendev.org/openstack/python-watcherclient>`__
Watcher Specifications
`Design specifications <https://opendev.org/openstack/watcher-specs>`__ (not released)
Watcher Launchpad (Main)
`Primary bug and feature tracking <https://launchpad.net/watcher>`__
Watcher Dashboard Launchpad
`Dashboard-specific tracking <https://launchpad.net/watcher-dashboard/>`__
Watcher Tempest Plugin Launchpad
`Test plugin tracking <https://launchpad.net/watcher-tempest-plugin>`__
Python Watcher Client Launchpad
`Client library tracking <https://launchpad.net/python-watcherclient>`__
Project Team Gathering
----------------------
Event Liaison Coordination
~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Work with the project team to select an event liaison for PTG coordination.
The event liaison is responsible for:
* Reserving sufficient space at PTG for the project team's meetings
* Putting out an agenda for team meetings
* Ensuring meetings are organized and facilitated
* Documenting meeting results
* If no event liaison is selected, these duties revert to the release liaison.
* Monitor for OpenStack Events team queries on the mailing list requesting
event liaison volunteers - teams not responding may lose event
representation.
PTG Planning and Execution
~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Create PTG planning etherpad, retrospective etherpad and alert about it in
watcher meeting and dev mailing list
* Example: https://etherpad.opendev.org/p/apr2025-ptg-watcher
* Run sessions at the PTG (if no event liaison is selected)
* Do a retro of the previous cycle
* Coordinate with team to establish agreement on the agenda for this release:
Review Days Planning
Determine number of review days allocated for specs and implementation work
Freeze Dates Coordination
Define Spec approval and Feature freeze dates through team collaboration
Release Schedule Modifications
Modify the OpenStack release schedule if needed by proposing new dates
(Example: https://review.opendev.org/c/openstack/releases/+/877094)
* Discuss the implications of the `SLURP or non-SLURP`__ current release
.. __: https://governance.openstack.org/tc/resolutions/20220210-release-cadence-adjustment.html
* Sign up for group photo at the PTG (if applicable)
After PTG
---------
* Send PTG session summaries to the dev mailing list
* Add `RFE bugs`__ if you have action items that are simple to do but
without a owner yet.
* Update IRC #openstack-watcher channel topic to point to new
development-planning etherpad.
.. __: https://bugs.launchpad.net/watcher/+bugs?field.tag=rfe
A few weeks before milestone 1
------------------------------
* Plan a spec review day
* Periodically check the series goals others have proposed in the “Set series
goals” link:
* Example: https://blueprints.launchpad.net/watcher/<current-release>/+setgoals
Milestone 1
-----------
* Release watcher and python-watcherclient via the openstack/releases repo.
Watcher follows the `cycle-with-intermediary`__ release model:
.. __: https://releases.openstack.org/reference/release_models.html#cycle-with-intermediary
* Create actual releases (not just launchpad bookkeeping) at milestone points
* No launchpad milestone releases are created for intermediary releases
* When releasing the first version of a library for the cycle,
bump
the minor version to leave room for future stable branch
releases
* Release stable branches of watcher
Stable Branch Release Process
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Prepare the stable branch for evaluation:
.. code-block:: bash
git checkout <stable branch>
git log --no-merges <last tag>..
Analyze commits to determine version bump according to semantic versioning.
Semantic Versioning Guidelines
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Choose version bump based on changes since last release:
Major Version (X)
Backward-incompatible changes that break existing APIs
Minor Version (Y)
New features that maintain backward compatibility
Patch Version (Z)
Bug fixes that maintain backward compatibility
Release Command Usage
~~~~~~~~~~~~~~~~~~~~~
Generate the release using OpenStack tooling:
* Use the `new-release command
<https://releases.openstack.org/reference/using.html#using-new-release-command>`__
* Propose the release with version according to chosen semver format
(x.y.z)
Summit
------
``Responsibility Precedence for Summit Activities:``
1. ``Project Update/Onboarding Liaisons`` (if appointed):
* ``Project Update Liaison``: responsible for giving the project update
showcasing team's achievements for the cycle to the community
* ``Project Onboarding Liaison``: responsible for giving/facilitating
onboarding sessions during events for the project's community
2. ``Event Liaison`` (if no Project Update/Onboarding liaisons exist):
* Coordinates all Summit activities including project updates and onboarding
3. ``Release Liaison`` (if no Event Liaison is appointed):
* Work with the team to ensure Summit activities are properly handled:
* Prepare the project update presentation
* Prepare the on-boarding session materials
* Prepare the operator meet-and-greet session
.. note::
The team can choose to not have a Summit presence if desired.
A few weeks before milestone 2
------------------------------
* Plan a spec review day (optional)
Milestone 2
-----------
* Spec freeze (unless changed by team agreement at PTG)
* Release watcher and python-watcherclient (if needed)
* Stable branch releases of watcher
Shortly after spec freeze
-------------------------
* Create a blueprint status etherpad to help track, especially non-priority
blueprint work, to help things get done by Feature Freeze (FF). Example:
* https://etherpad.opendev.org/p/watcher-<release>-blueprint-status
* Create or review a patch to add the next releases specs directory so people
can propose specs for next release after spec freeze for current release
Milestone 3
-----------
* Feature freeze day
* Client library freeze, release python-watcherclient
* Close out all blueprints, including “catch all” blueprints like mox,
versioned notifications
* Stable branch releases of watcher
* Start writing the `cycle highlights
<https://docs.openstack.org/project-team-guide/release-management.html#cycle-highlights>`__
Week following milestone 3
--------------------------
* If warranted, announce the FFE (feature freeze exception process) to
have people propose FFE requests to a special etherpad where they will
be reviewed.
FFE requests should first be discussed in the IRC meeting with the
requester present.
The release liaison has final decision on granting exceptions.
.. note::
if there is only a short time between FF and RC1 (lately its been 2
weeks), then the only likely candidates will be low-risk things that are
almost done. In general Feature Freeze exceptions should not be granted,
instead features should be deferred and reproposed for the next
development
cycle. FFE never extend beyond RC1.
* Mark the max microversion for the release in the
:doc:`/contributor/api_microversion_history`
A few weeks before RC
---------------------
* Update the release status etherpad with RC1 todos and keep track
of them in meetings
* Go through the bug list and identify any rc-potential bugs and tag them
RC
--
* Follow the standard OpenStack release checklist process
* If we want to drop backward-compat RPC code, we have to do a major RPC
version bump and coordinate it just before the major release:
* https://wiki.openstack.org/wiki/RpcMajorVersionUpdates
* Example: https://review.opendev.org/541035
* “Merge latest translations" means translation patches
* Check for translations with:
* https://review.opendev.org/#/q/status:open+project:openstack/watcher+branch:master+topic:zanata/translations
* Should NOT plan to have more than one RC if possible. RC2 should only happen
if there was a mistake and something was missed for RC, or a new regression
was discovered
* Write the reno prelude for the release GA
* Example: https://review.opendev.org/644412
* Push the cycle-highlights in marketing-friendly sentences and propose to the
openstack/releases repo. Usually based on reno prelude but made more readable
and friendly
* Example: https://review.opendev.org/644697
Immediately after RC
--------------------
* Look for bot proposed changes to reno and stable/<cycle>
* Create the launchpad series for the next cycle
* Set the development focus of the project to the new cycle series
* Set the status of the new series to “active development”
* Set the last series status to “current stable branch release”
* Set the previous to last series status to “supported”
* Repeat launchpad steps ^ for all watcher deliverables.
* Make sure the specs directory for the next cycle gets created so people can
start proposing new specs
* Make sure to move implemented specs from the previous release
* Move implemented specs manually (TODO: add tox command in future)
* Remove template files:
.. code-block:: bash
rm doc/source/specs/<release>/index.rst
rm doc/source/specs/<release>/template.rst
* Ensure liaison handoff: either transition to new release liaison or confirm
reappointment for next cycle
.. _glossary:
Glossary
--------
DPL
Distributed Project Leadership - A governance model where traditional PTL
responsibilities are distributed among various specialized liaisons.
FFE
Feature Freeze Exception - A request to add a feature after the feature
freeze deadline. Should be used sparingly for low-risk, nearly
complete features.
GA
General Availability - The final release of a software version for
production use.
PTG
Project Team Gathering - A collaborative event where OpenStack project
teams meet to plan and coordinate development activities.
RC
Release Candidate - A pre-release version that is potentially the final
version, pending testing and bug fixes.
RFE
Request for Enhancement - A type of bug report requesting a new feature
or enhancement to existing functionality.
SLURP
Skip Level Upgrade Release Process - An extended maintenance release
that allows skipping intermediate versions during upgrades.
Summit
OpenStack Summit - A conference where the OpenStack community gathers
for presentations, discussions, and project updates.
Miscellaneous Notes
-------------------
How to track launchpad blueprint approvals
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Core team approves blueprints through team consensus. The release liaison
ensures launchpad status is updated correctly after core team approval:
* Set the approver as the core team member who approved the spec
* Set the Direction => Approved and Definition => Approved and make sure the
Series goal is set to the current release. If code is already proposed, set
Implementation => Needs Code Review
* Optional: add a comment to the Whiteboard explaining the approval,
with a date
(launchpad does not record approval dates). For example: “We discussed this
in the team meeting and agreed to approve this for <release>. -- <nick>
<YYYYMMDD>”
How to complete a launchpad blueprint
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Set Implementation => Implemented. The completion date will be recorded by
launchpad

View File

@@ -1,157 +0,0 @@
================
Aetos datasource
================
Synopsis
--------
The Aetos datasource allows Watcher to use an Aetos reverse proxy server as the
source for collected metrics used by the Watcher decision engine. Aetos is a
multi-tenant aware reverse proxy that sits in front of a Prometheus server and
provides Keystone authentication and role-based access control. The Aetos
datasource uses Keystone service discovery to locate the Aetos endpoint and
requires authentication via Keystone tokens.
Requirements
-------------
The Aetos datasource has the following requirements:
* An Aetos reverse proxy server deployed in front of Prometheus
* Aetos service registered in Keystone with service type 'metric-storage'
* Valid Keystone credentials for Watcher with admin or service role
* Prometheus metrics with appropriate labels (same as direct Prometheus access)
Like the Prometheus datasource, it is required that Prometheus metrics contain
a label to identify the hostname of the exporter from which the metric was
collected. This is used to match against the Watcher cluster model
``ComputeNode.hostname``. The default for this label is ``fqdn`` and in the
prometheus scrape configs would look like:
.. code-block::
scrape_configs:
- job_name: node
static_configs:
- targets: ['10.1.2.3:9100']
labels:
fqdn: "testbox.controlplane.domain"
This default can be overridden when a deployer uses a different label to
identify the exporter host (for example ``hostname`` or ``host``, or any other
label, as long as it identifies the host).
Internally this label is used in creating ``fqdn_instance_labels``, containing
the list of values assigned to the label in the Prometheus targets.
The elements of the resulting fqdn_instance_labels are expected to match the
``ComputeNode.hostname`` used in the Watcher decision engine cluster model.
An example ``fqdn_instance_labels`` is the following:
.. code-block::
[
'ena.controlplane.domain',
'dio.controlplane.domain',
'tria.controlplane.domain',
]
For instance metrics, it is required that Prometheus contains a label
with the uuid of the OpenStack instance in each relevant metric. By default,
the datasource will look for the label ``resource``. The
``instance_uuid_label`` config option in watcher.conf allows deployers to
override this default to any other label name that stores the ``uuid``.
Limitations
-----------
The Aetos datasource shares the same limitations as the Prometheus datasource:
The current implementation doesn't support the ``statistic_series`` function of
the Watcher ``class DataSourceBase``. It is expected that the
``statistic_aggregation`` function (which is implemented) is sufficient in
providing the **current** state of the managed resources in the cluster.
The ``statistic_aggregation`` function defaults to querying back 300 seconds,
starting from the present time (the time period is a function parameter and
can be set to a value as required). Implementing the ``statistic_series`` can
always be re-visited if the requisite interest and work cycles are volunteered
by the interested parties.
One further note about a limitation in the implemented
``statistic_aggregation`` function. This function is defined with a
``granularity`` parameter, to be used when querying whichever of the Watcher
``DataSourceBase`` metrics providers. In the case of Aetos (like Prometheus),
we do not fetch and then process individual metrics across the specified time
period. Instead we use the PromQL querying operators and functions, so that the
server itself will process the request across the specified parameters and
then return the result. So ``granularity`` parameter is redundant and remains
unused for the Aetos implementation of ``statistic_aggregation``. The
granularity of the data fetched by Prometheus server is specified in
configuration as the server ``scrape_interval`` (current default 15 seconds).
Additionally, there is a slight performance impact compared to direct
Prometheus access. Since Aetos acts as a reverse proxy in front of Prometheus,
there is an additional step for each request, resulting in slightly longer
delays.
Configuration
-------------
A deployer must set the ``datasources`` parameter to include ``aetos``
under the watcher_datasources section of watcher.conf (or add ``aetos`` in
datasources for a specific strategy if preferred eg. under the
``[watcher_strategies.workload_stabilization]`` section).
.. note::
Having both Prometheus and Aetos datasources configured at the same time
is not supported and will result in a configuration error. Allowing this
can be investigated in the future if a need or a proper use case is
identified.
The watcher.conf configuration file is also used to set the parameter values
required by the Watcher Aetos data source. The configuration can be
added under the ``[aetos_client]`` section and the available options are
duplicated below from the code as they are self documenting:
.. code-block::
cfg.StrOpt('interface',
default='public',
choices=['internal', 'public', 'admin'],
help="Type of endpoint to use in keystoneclient."),
cfg.StrOpt('region_name',
help="Region in Identity service catalog to use for "
"communication with the OpenStack service."),
cfg.StrOpt('fqdn_label',
default='fqdn',
help="The label that Prometheus uses to store the fqdn of "
"exporters. Defaults to 'fqdn'."),
cfg.StrOpt('instance_uuid_label',
default='resource',
help="The label that Prometheus uses to store the uuid of "
"OpenStack instances. Defaults to 'resource'."),
Authentication and Service Discovery
------------------------------------
Unlike the Prometheus datasource which requires explicit host and port
configuration, the Aetos datasource uses Keystone service discovery to
automatically locate the Aetos endpoint. The datasource:
1. Uses the configured Keystone credentials to authenticate
2. Searches the service catalog for a service with type 'metric-storage'
3. Uses the discovered endpoint URL to connect to Aetos
4. Attaches a Keystone token to each request for authentication
If the Aetos service is not registered in Keystone, the datasource will
fail to initialize and prevent the decision engine from starting.
So a sample watcher.conf configured to use the Aetos datasource would look
like the following:
.. code-block::
[watcher_datasources]
datasources = aetos
[aetos_client]
interface = public
region_name = RegionOne
fqdn_label = fqdn

View File

@@ -1,11 +1,6 @@
Datasources
===========
.. note::
The Monasca datasource is deprecated for removal and optional. To use it, install the optional extra:
``pip install watcher[monasca]``. If Monasca is configured without installing the extra, Watcher will raise
an error guiding you to install the client.
.. toctree::
:glob:
:maxdepth: 1

View File

@@ -30,7 +30,7 @@ identify the exporter host (for example ``hostname`` or ``host``, or any other
label, as long as it identifies the host).
Internally this label is used in creating ``fqdn_instance_labels``, containing
the list of values assigned to the label in the Prometheus targets.
the list of values assigned to the the label in the Prometheus targets.
The elements of the resulting fqdn_instance_labels are expected to match the
``ComputeNode.hostname`` used in the Watcher decision engine cluster model.
An example ``fqdn_instance_labels`` is the following:
@@ -47,7 +47,7 @@ For instance metrics, it is required that Prometheus contains a label
with the uuid of the OpenStack instance in each relevant metric. By default,
the datasource will look for the label ``resource``. The
``instance_uuid_label`` config option in watcher.conf allows deployers to
override this default to any other label name that stores the ``uuid``.
override this default to any other label name that stores the ``uuid``.
Limitations
-----------

View File

@@ -1,23 +0,0 @@
@startuml
skinparam ArrowColor DarkRed
skinparam StateBorderColor DarkRed
skinparam StateBackgroundColor LightYellow
skinparam Shadowing true
[*] --> PENDING: The Watcher Planner\ncreates the Action
PENDING --> SKIPPED: The Action detects skipping condition\n in pre_condition or was\n skipped by cloud Admin.
PENDING --> FAILED: The Action fails unexpectedly\n in pre_condition.
PENDING --> ONGOING: The Watcher Applier starts executing/n the action.
ONGOING --> FAILED: Something failed while executing\nthe Action in the Watcher Applier
ONGOING --> SUCCEEDED: The Watcher Applier executed\nthe Action successfully
FAILED --> DELETED : Administrator removes\nAction Plan
SUCCEEDED --> DELETED : Administrator removes\n theAction
ONGOING --> CANCELLED : The Action was cancelled\n as part of an Action Plan cancellation.
PENDING --> CANCELLED : The Action was cancelled\n as part of an Action Plan cancellation.
CANCELLED --> DELETED
FAILED --> DELETED
SKIPPED --> DELETED
DELETED --> [*]
@enduml

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

View File

@@ -42,7 +42,6 @@ specific prior release.
user/index
configuration/index
contributor/plugin/index
integrations/index
man/index
.. toctree::

View File

@@ -1,126 +0,0 @@
============
Integrations
============
The following table provides an Integration status with different services
which Watcher interact with. Some integrations are marked as Supported,
while others as Experimental due to the lack of testing and a proper
documentations.
Integration Status Matrix
-------------------------
.. list-table::
:widths: 20 20 20 20
:header-rows: 1
* - Service Name
- Integration Status
- Documentation
- Testing
* - :ref:`Cinder <cinder_integration>`
- Supported
- Minimal
- Unit
* - :ref:`Glance <glance_integration>`
- Experimental
- Missing
- None
* - :ref:`Ironic <ironic_integration>`
- Experimental
- Minimal
- Unit
* - :ref:`Keystone <keystone_integration>`
- Supported
- Minimal
- Integration
* - :ref:`MAAS <maas_integration>`
- Experimental
- Missing
- Unit
* - :ref:`Neutron <neutron_integration>`
- Experimental
- Missing
- Unit
* - :ref:`Nova <nova_integration>`
- Supported
- Minimal
- Unit and Integration
* - :ref:`Placement <placement_integration>`
- Supported
- Minimal
- Unit and Integration
.. note::
Minimal documentation covers only basic configuration and, if available,
how to enable notifications.
.. _cinder_integration:
Cinder
^^^^^^
The OpenStack Block Storage service integration includes a cluster data
model collector that creates a in-memory representation of the storage
resources, strategies that propose solutions based on storage capacity
and Actions that perform volume migration.
.. _glance_integration:
Glance
^^^^^^
The Image service integration is consumed by Nova Helper to create instances
from images, which was used older releases of Watcher to cold migrate
instances. This procedure is not used by Watcher anymore and this integration
is classified as Experimental and may be removed in future releases.
.. _ironic_integration:
Ironic
^^^^^^
The Bare Metal service integration includes a data model collector that
creates an in-memory representation of Ironic resources and Actions that
allows the management of the power state of nodes. This integration is
classified as Experimental and may be removed in future releases.
.. _keystone_integration:
Keystone
^^^^^^^^
The Identity service integration includes authentication with other services
and retrieving information about domains, projects and users.
.. _maas_integration:
MAAS (Metal As A Service)
^^^^^^^^^^^^^^^^^^^^^^^^^
This integration allows managing bare metal servers of a MAAS service,
which includes Actions that manage the power state of nodes. This
integration is classified as Experimental and may be removed in future
releases.
.. _neutron_integration:
Neutron
^^^^^^^
Neutron integration is currently consumed by Nova Helper to create instance,
which was used by older releases of Watcher to cold migrate instances. This
procedure is not used by Watcher anymore and this integration is classified
as Experimental and may be removed in future releases.
.. _nova_integration:
Nova
^^^^
Nova service integration includes a cluster data model collector that creates
an in-memory representation of the compute resources available in the cloud,
strategies that propose solutions based on available resources and Actions
that perform instance migrations.
.. _placement_integration:
Placement
^^^^^^^^^
Placement integration allows Watcher to track resource provider inventories
and usages information, building a in-memory representation of those resources
that can be used by strategies when calculating new solutions.

View File

@@ -11,6 +11,10 @@ Synopsis
.. watcher-term:: watcher.decision_engine.strategy.strategies.host_maintenance.HostMaintenance
Requirements
------------
None.
Metrics
*******
@@ -52,29 +56,15 @@ Configuration
Strategy parameters are:
========================== ======== ========================== ==========
parameter type description required
========================== ======== ========================== ==========
``maintenance_node`` String The name of the Required
compute node
which needs maintenance.
``backup_node`` String The name of the compute Optional
node which will backup
the maintenance node.
``disable_live_migration`` Boolean False: Active instances Optional
will be live migrated.
True: Active instances
will be cold migrated
if cold migration is
not disabled. Otherwise,
they will be stopped.
False by default.
``disable_cold_migration`` Boolean False: Inactive instances Optional
will be cold migrated.
True: Inactive instances
will not be cold migrated.
False by default.
========================== ======== ========================== ==========
==================== ====== ====================================
parameter type default Value description
==================== ====== ====================================
``maintenance_node`` String The name of the compute node which
need maintenance. Required.
``backup_node`` String The name of the compute node which
will backup the maintenance node.
Optional.
==================== ====== ====================================
Efficacy Indicator
------------------
@@ -90,46 +80,13 @@ to: https://specs.openstack.org/openstack/watcher-specs/specs/queens/approved/cl
How to use it ?
---------------
Run an audit using Host Maintenance strategy.
Executing the actions will move the servers from compute01 host
to a host determined by the Nova scheduler service.
.. code-block:: shell
$ openstack optimize audit create \
-g cluster_maintaining -s host_maintenance \
-p maintenance_node=compute01
Run an audit using Host Maintenance strategy with a backup node specified.
Executing the actions will move the servers from compute01 host
to compute02 host.
.. code-block:: shell
$ openstack optimize audit create \
-g cluster_maintaining -s host_maintenance \
-p maintenance_node=compute01 \
-p backup_node=compute02
Run an audit using Host Maintenance strategy with migration disabled.
This will only stop active instances on compute01, useful for maintenance
scenarios where operators do not want to migrate workloads to other hosts.
.. code-block:: shell
$ openstack optimize audit create \
-g cluster_maintaining -s host_maintenance \
-p maintenance_node=compute01 \
-p disable_live_migration=True \
-p disable_cold_migration=True
Note that after executing this strategy, the *maintenance_node* will be
marked as disabled, with the reason set to ``watcher_maintaining``.
To enable the node again:
.. code-block:: shell
$ openstack compute service set --enable compute01
-p backup_node=compute02 \
--auto-trigger
External Links
--------------

View File

@@ -6,67 +6,3 @@ Strategies
:maxdepth: 1
./*
Strategies status matrix
------------------------
.. list-table::
:widths: 20 20 20 20
:header-rows: 1
* - Strategy Name
- Status
- Testing
- Can Be Triggered from Horizon (UI)
* - :doc:`actuation`
- Experimental
- Unit, Integration
- No
* - :doc:`basic-server-consolidation`
- Experimental
- Missing
- Yes, with default values
* - :doc:`host_maintenance`
- Supported
- Unit, Integration
- No (requires parameters)
* - :doc:`node_resource_consolidation`
- Supported
- Unit, Integration
- Yes, with default values
* - :doc:`noisy_neighbor`
- Deprecated
- Unit
- N/A
* - :doc:`outlet_temp_control`
- Experimental
- Unit
- Yes, with default values
* - :doc:`saving_energy`
- Experimental
- Unit
- Yes, with default values
* - :doc:`storage_capacity_balance`
- Experimental
- Unit
- Yes, with default values
* - :doc:`uniform_airflow`
- Experimental
- Unit
- Yes, with default values
* - :doc:`vm_workload_consolidation`
- Supported
- Unit, Integration
- Yes, with default values
* - :doc:`workload-stabilization`
- Experimental
- Missing
- Yes, with default values
* - :doc:`workload_balance`
- Supported
- Unit, Integration
- Yes, with default values
* - :doc:`zone_migration`
- Supported (Instance migrations), Experimental (Volume migration)
- Unit, Some Integration
- No

View File

@@ -35,11 +35,6 @@ power ceilometer_ kwapi_ one point every 60s
.. _ceilometer: https://docs.openstack.org/ceilometer/latest/admin/telemetry-measurements.html#openstack-compute
.. _monasca: https://github.com/openstack/monasca-agent/blob/master/docs/Libvirt.md
.. note::
The Monasca datasource is deprecated for removal and optional. If a strategy requires Monasca metrics,
ensure the Monasca optional extra is installed: ``pip install watcher[monasca]``.
.. _kwapi: https://kwapi.readthedocs.io/en/latest/index.html

View File

@@ -1,6 +1,6 @@
===============================
Workload Stabilization Strategy
===============================
=============================================
Watcher Overload standard deviation algorithm
=============================================
Synopsis
--------
@@ -19,20 +19,20 @@ Metrics
The *workload_stabilization* strategy requires the following metrics:
============================ ==================================================
metric description
============================ ==================================================
``instance_ram_usage`` ram memory usage in an instance as float in
megabytes
``instance_cpu_usage`` cpu usage in an instance as float ranging between
0 and 100 representing the total cpu usage as
percentage
``host_ram_usage`` ram memory usage in a compute node as float in
megabytes
``host_cpu_usage`` cpu usage in a compute node as float ranging
between 0 and 100 representing the total cpu
usage as percentage
============================ ==================================================
============================ ============ ======= =============================
metric service name plugins comment
============================ ============ ======= =============================
``compute.node.cpu.percent`` ceilometer_ none need to set the
``compute_monitors`` option
to ``cpu.virt_driver`` in the
nova.conf.
``hardware.memory.used`` ceilometer_ SNMP_
``cpu`` ceilometer_ none
``instance_ram_usage`` ceilometer_ none
============================ ============ ======= =============================
.. _ceilometer: https://docs.openstack.org/ceilometer/latest/admin/telemetry-measurements.html#openstack-compute
.. _SNMP: https://docs.openstack.org/ceilometer/latest/admin/telemetry-measurements.html#snmp-based-meters
Cluster data model
******************
@@ -68,49 +68,23 @@ Configuration
Strategy parameters are:
====================== ====== =================== =============================
parameter type default Value description
====================== ====== =================== =============================
``metrics`` array |metrics| Metrics used as rates of
==================== ====== ===================== =============================
parameter type default Value description
==================== ====== ===================== =============================
``metrics`` array |metrics| Metrics used as rates of
cluster loads.
``thresholds`` object |thresholds| Dict where key is a metric
``thresholds`` object |thresholds| Dict where key is a metric
and value is a trigger value.
The strategy will only will
look for an action plan when
the standard deviation for
the usage of one of the
resources included in the
metrics, taken as a
normalized usage between
0 and 1 among the hosts is
higher than the threshold.
The value of a perfectly
balanced cluster for the
standard deviation would be
0, while in a totally
unbalanced one would be 0.5,
which should be the maximum
value.
``weights`` object |weights| These weights are used to
``weights`` object |weights| These weights used to
calculate common standard
deviation when optimizing
the resources usage.
Name of weight contains meter
name and _weight suffix.
Higher values imply the
metric will be prioritized
when calculating an optimal
resulting cluster
distribution.
``instance_metrics`` object |instance_metrics| This parameter represents
the compute node metrics
representing compute resource
usage for the instances
resource indicated in the
metrics parameter.
``host_choice`` string retry Method of hosts choice when
analyzing destination for
instances.
deviation. Name of weight
contains meter name and
_weight suffix.
``instance_metrics`` object |instance_metrics| Mapping to get hardware
statistics using instance
metrics.
``host_choice`` string retry Method of host's choice.
There are cycle, retry and
fullsearch methods. Cycle
will iterate hosts in cycle.
@@ -119,49 +93,32 @@ parameter type default Value description
retry_count option).
Fullsearch will return each
host from list.
``retry_count`` number 1 Count of random returned
``retry_count`` number 1 Count of random returned
hosts.
``periods`` object |periods| Time, in seconds, to get
statistical values for
resources usage for instance
and host metrics.
Watcher will use the last
period to calculate resource
usage.
``granularity`` number 300 NOT RECOMMENDED TO MODIFY:
The time between two measures
in an aggregated timeseries
of a metric.
``aggregation_method`` object |aggn_method| NOT RECOMMENDED TO MODIFY:
Function used to aggregate
multiple measures into an
aggregated value.
====================== ====== =================== =============================
``periods`` object |periods| These periods are used to get
statistic aggregation for
instance and host metrics.
The period is simply a
repeating interval of time
into which the samples are
grouped for aggregation.
Watcher uses only the last
period of all received ones.
==================== ====== ===================== =============================
.. |metrics| replace:: ["instance_cpu_usage", "instance_ram_usage"]
.. |thresholds| replace:: {"instance_cpu_usage": 0.2, "instance_ram_usage": 0.2}
.. |weights| replace:: {"instance_cpu_usage_weight": 1.0, "instance_ram_usage_weight": 1.0}
.. |instance_metrics| replace:: {"instance_cpu_usage": "host_cpu_usage", "instance_ram_usage": "host_ram_usage"}
.. |instance_metrics| replace:: {"instance_cpu_usage": "compute.node.cpu.percent", "instance_ram_usage": "hardware.memory.used"}
.. |periods| replace:: {"instance": 720, "node": 600}
.. |aggn_method| replace:: {"instance": 'mean', "compute_node": 'mean'}
Efficacy Indicator
------------------
Global efficacy indicator:
.. watcher-func::
:format: literal_block
watcher.decision_engine.goal.efficacy.specs.WorkloadBalancing.get_global_efficacy_indicator
Other efficacy indicators of the goal are:
- ``instance_migrations_count``: The number of VM migrations to be performed
- ``instances_count``: The total number of audited instances in strategy
- ``standard_deviation_after_audit``: The value of resulted standard deviation
- ``standard_deviation_before_audit``: The value of original standard deviation
watcher.decision_engine.goal.efficacy.specs.ServerConsolidation.get_global_efficacy_indicator
Algorithm
---------
@@ -184,4 +141,4 @@ How to use it ?
External Links
--------------
None
- `Watcher Overload standard deviation algorithm spec <https://specs.openstack.org/openstack/watcher-specs/specs/newton/implemented/sd-strategy.html>`_

View File

@@ -11,35 +11,25 @@ Synopsis
.. watcher-term:: watcher.decision_engine.strategy.strategies.workload_balance.WorkloadBalance
Requirements
------------
None.
Metrics
*******
The ``workload_balance`` strategy requires the following metrics:
The *workload_balance* strategy requires the following metrics:
======================= ============ ======= =========== ======================
metric service name plugins unit comment
======================= ============ ======= =========== ======================
``cpu`` ceilometer_ none percentage CPU of the instance.
Used to calculate the
threshold
``memory.resident`` ceilometer_ none MB RAM of the instance.
Used to calculate the
threshold
======================= ============ ======= =========== ======================
======================= ============ ======= =========================
metric service name plugins comment
======================= ============ ======= =========================
``cpu`` ceilometer_ none
``memory.resident`` ceilometer_ none
======================= ============ ======= =========================
.. _ceilometer: https://docs.openstack.org/ceilometer/latest/admin/telemetry-measurements.html#openstack-compute
.. note::
* The parameters above reference the instance CPU or RAM usage, but
the threshold calculation is based of the CPU/RAM usage on the
hypervisor.
* The RAM usage can be calculated based on the RAM consumed by the instance,
and the available RAM on the hypervisor.
* The CPU percentage calculation relies on the CPU load, but also on the
number of CPUs on the hypervisor.
* The host memory metric is calculated by summing the RAM usage of each
instance on the host. This measure is close to the real usage, but is
not the exact usage on the host.
Cluster data model
******************
@@ -74,28 +64,16 @@ Configuration
Strategy parameters are:
================ ====== ==================== ==================================
parameter type default value description
================ ====== ==================== ==================================
``metrics`` String instance_cpu_usage Workload balance base on cpu or
ram utilization. Choices:
['instance_cpu_usage',
'instance_ram_usage']
``threshold`` Number 25.0 Workload threshold for migration.
Used for both the source and the
destination calculations.
Threshold is always a percentage.
``period`` Number 300 Aggregate time period of
ceilometer
``granularity`` Number 300 The time between two measures in
an aggregated timeseries of a
metric.
This parameter is only used
with the Gnocchi data source,
and it must match to any of the
valid archive policies for the
metric.
================ ====== ==================== ==================================
============== ====== ==================== ====================================
parameter type default Value description
============== ====== ==================== ====================================
``metrics`` String 'instance_cpu_usage' Workload balance base on cpu or ram
utilization. Choices:
['instance_cpu_usage',
'instance_ram_usage']
``threshold`` Number 25.0 Workload threshold for migration
``period`` Number 300 Aggregate time period of ceilometer
============== ====== ==================== ====================================
Efficacy Indicator
------------------
@@ -111,36 +89,14 @@ to: https://specs.openstack.org/openstack/watcher-specs/specs/mitaka/implemented
How to use it ?
---------------
Create an audit template using the Workload Balancing strategy.
.. code-block:: shell
$ openstack optimize audittemplate create \
at1 workload_balancing --strategy workload_balance
Run an audit using the Workload Balance strategy. The result of
the audit should be an action plan to move VMs from any host
where the CPU usage is over the threshold of 26%, to a host
where the utilization of CPU is under the threshold.
The measurements of CPU utilization are taken from the configured
datasouce plugin with an aggregate period of 310.
.. code-block:: shell
$ openstack optimize audit create -a at1 -p threshold=26.0 \
-p period=310 -p metrics=instance_cpu_usage
Run an audit using the Workload Balance strategy to
obtain a plan to balance VMs over hosts with a threshold of 20%.
In this case, the stipulation of the CPU utilization metric
measurement is a combination of period and granularity.
.. code-block:: shell
$ openstack optimize audit create -a at1 \
-p granularity=30 -p threshold=20 -p period=300 \
-p metrics=instance_cpu_usage --auto-trigger
External Links
--------------

View File

@@ -11,13 +11,6 @@ Synopsis
.. watcher-term:: watcher.decision_engine.strategy.strategies.zone_migration.ZoneMigration
.. note::
The term ``Zone`` in the strategy name is not a reference to
`Openstack availability zones <https://docs.openstack.org/nova/latest/admin/availability-zones.html>`_
but rather a user-defined set of Compute nodes and storage pools.
Currently, migrations across actual availability zones is not fully tested
and might not work in all cluster configurations.
Requirements
------------
@@ -66,83 +59,66 @@ Configuration
Strategy parameters are:
======================== ======== ======== ========= ==========================
parameter type default required description
======================== ======== ======== ========= ==========================
``compute_nodes`` array None Optional Compute nodes to migrate.
``storage_pools`` array None Optional Storage pools to migrate.
``parallel_total`` integer 6 Optional The number of actions to
be run in parallel in
total.
``parallel_per_node`` integer 2 Optional The number of actions to
be run in parallel per
compute node in one
action plan.
``parallel_per_pool`` integer 2 Optional The number of actions to
be run in parallel per
storage pool.
``priority`` object None Optional List prioritizes instances
and volumes.
``with_attached_volume`` boolean False Optional False: Instances will
migrate after all volumes
migrate.
True: An instance will
migrate after the
attached volumes migrate.
======================== ======== ======== ========= ==========================
.. note::
* All parameters in the table above have defaults and therefore the
user can create an audit without specifying a value. However,
if **only** defaults parameters are used, there will be nothing
actionable for the audit.
* ``parallel_*`` parameters are not in reference to concurrency,
but rather on limiting the amount of actions to be added to the action
plan
* ``compute_nodes``, ``storage_pools``, and ``priority`` are optional
parameters, however, if they are passed they **require** the parameters
in the tables below:
======================== ======== ============= ==============================
parameter type default Value description
======================== ======== ============= ==============================
``compute_nodes`` array None Compute nodes to migrate.
``storage_pools`` array None Storage pools to migrate.
``parallel_total`` integer 6 The number of actions to be
run in parallel in total.
``parallel_per_node`` integer 2 The number of actions to be
run in parallel per compute
node.
``parallel_per_pool`` integer 2 The number of actions to be
run in parallel per storage
pool.
``priority`` object None List prioritizes instances
and volumes.
``with_attached_volume`` boolean False False: Instances will migrate
after all volumes migrate.
True: An instance will migrate
after the attached volumes
migrate.
======================== ======== ============= ==============================
The elements of compute_nodes array are:
============= ======= ======== ========= ========================
parameter type default required description
============= ======= ======== ========= ========================
``src_node`` string None Required Compute node from which
instances migrate.
``dst_node`` string None Optional Compute node to which
instances migrate.
If omitted, nova will
choose the destination
node automatically.
============= ======= ======== ========= ========================
============= ======= =============== =============================
parameter type default Value description
============= ======= =============== =============================
``src_node`` string None Compute node from which
instances migrate(mandatory).
``dst_node`` string None Compute node to which
instances migrate.
============= ======= =============== =============================
The elements of storage_pools array are:
============= ======= ======== ========= ========================
parameter type default required description
============= ======= ======== ========= ========================
``src_pool`` string None Required Storage pool from which
volumes migrate.
``dst_pool`` string None Optional Storage pool to which
volumes migrate.
``src_type`` string None Required Source volume type.
``dst_type`` string None Required Destination volume type
============= ======= ======== ========= ========================
============= ======= =============== ==============================
parameter type default Value description
============= ======= =============== ==============================
``src_pool`` string None Storage pool from which
volumes migrate(mandatory).
``dst_pool`` string None Storage pool to which
volumes migrate.
``src_type`` string None Source volume type(mandatory).
``dst_type`` string None Destination volume type
(mandatory).
============= ======= =============== ==============================
The elements of priority object are:
================ ======= ======== ========= =====================
parameter type default Required description
================ ======= ======== ========= =====================
``project`` array None Optional Project names.
``compute_node`` array None Optional Compute node names.
``storage_pool`` array None Optional Storage pool names.
``compute`` enum None Optional Instance attributes.
|compute|
``storage`` enum None Optional Volume attributes.
|storage|
================ ======= ======== ========= =====================
================ ======= =============== ======================
parameter type default Value description
================ ======= =============== ======================
``project`` array None Project names.
``compute_node`` array None Compute node names.
``storage_pool`` array None Storage pool names.
``compute`` enum None Instance attributes.
|compute|
``storage`` enum None Volume attributes.
|storage|
================ ======= =============== ======================
.. |compute| replace:: ["vcpu_num", "mem_size", "disk_size", "created_at"]
.. |storage| replace:: ["size", "created_at"]
@@ -150,26 +126,11 @@ parameter type default Required description
Efficacy Indicator
------------------
The efficacy indicators for action plans built from the command line
are:
.. watcher-func::
:format: literal_block
watcher.decision_engine.goal.efficacy.specs.HardwareMaintenance.get_global_efficacy_indicator
In **Horizon**, these indictors are shown with alternative text.
* ``live_migrate_instance_count`` is shown as
``The number of instances actually live migrated`` in Horizon
* ``planned_live_migrate_instance_count`` is shown as
``The number of instances planned to live migrate`` in Horizon
* ``planned_live_migration_instance_count`` refers to the instances planned
to live migrate in the action plan.
* ``live_migrate_instance_count`` tracks all the instances that could be
migrated according to the audit input.
Algorithm
---------
@@ -187,22 +148,6 @@ How to use it ?
$ openstack optimize audit create -a at1 \
-p compute_nodes='[{"src_node": "s01", "dst_node": "d01"}]'
.. note::
* Currently, the strategy will not generate both volume migration and
instance migrations in the same audit. If both are requested,
only volume migrations will be included in the action plan.
* The Cinder model collector is not enabled by default.
If the Cinder model collector is not enabled while deploying Watcher,
the model will become outdated and cause errors eventually.
See the `Configuration option to enable the storage collector <https://docs.openstack.org/watcher/latest/configuration/watcher.html#collector.collector_plugins>`_ documentation.
Support caveats
---------------
This strategy offers the option to perform both Instance migrations and
Volume migrations. Currently, Instance migrations are ready for production
use while Volume migrations remain experimental.
External Links
--------------

View File

@@ -1,23 +0,0 @@
---
prelude: |
The ``OpenStack 2025.2`` (``Watcher 15.0.0``) release delivers stronger security,
granular operational control, and comprehensive monitoring capabilities for cloud
optimization. This release strengthens the foundation for reliable, large-scale
cloud operations while giving administrators complete flexibility in
managing optimization workflows.
Cloud operators gain secure and reliable volume migration processes that eliminate
data loss scenarios and ensure tenant isolation. The Host Maintenance strategy
now provides granular control over migration behavior, including the ability to
disable live or cold migration and safely stop instances when migration
cannot proceed.
The new ``Aetos data source`` adds secure, role-based access to Prometheus metrics
through Keystone authentication. This enables multi-tenant monitoring while
maintaining access controls across your cloud infrastructure.
Administrators can now exercise precise control over optimization workflows by
manually skipping actions or allowing Watcher to automatically skip actions
based on detected conditions. Custom status messages document why administrators
or Watcher took specific actions, improving operational visibility and
troubleshooting.

View File

@@ -1,14 +0,0 @@
---
features:
- |
Three new parameters have been added to the ``nop`` action:
* ``fail_pre_condition``: When setting it to `true` the action
fails on the pre_condition execution.
* ``fail_execute``: When setting it to `true` the action fails
on the execute step.
* ``fail_post_condition``: When setting it to `true` the action
fails on the post_condition execution.

View File

@@ -1,13 +0,0 @@
---
features:
- |
A new Aetos data source is added. This allows the watcher decision
engine to collect metrics through an Aetos reverse proxy server which
provides multi-tenant aware access to Prometheus with Keystone
authentication and role-based access control. The Aetos datasource
uses Keystone service discovery to automatically locate the Aetos
endpoint and provides enhanced security compared to direct Prometheus
access. For more information about the Aetos data source, including
configuration options see
https://docs.openstack.org/watcher/latest/datasources/aetos.html

View File

@@ -1,20 +0,0 @@
---
features:
- |
A new state ``SKIPPED`` has been added to the Actions. Actions can reach this state
in two situations:
* Watcher detects a specific pre-defined condition in the `pre_condition` phase.
* An admin sets the state to SKIPPED using a call to the new Patch API `/actions/{action_id}`
before the action plan is started.
An action in ``SKIPPED`` state will not be executed by Watcher as part of an ActionPlan
run.
Additionally, a new field ``status_message`` has been added to Audits, ActionPlans and
Actions which will be used to provide additional details about the state of an object.
All these changes have been introduced in a new Watcher ``API microversion 1.5``.
For additional information, see the API reference.

View File

@@ -1,14 +0,0 @@
---
features:
- |
The compute model was extended with additional server attributes to provide
more detailed information about compute instances. These additions will
enable strategies to make more precise decisions by considering more server
placement constraints. The new attributes are ``flavor extra specs`` and
``pinned availability zone``. Each new attribute depends on a minimal
microversion to be supported in nova and configured in the watcher
configuration, at ``nova_client`` section. Please refer to the nova api-ref
documentation for more details on which microversion is required:
https://docs.openstack.org/api-ref/compute/
A new configuration option was added to allow the user to enable or disable
the extended attributes collection, which is disabled by default.

View File

@@ -1,11 +0,0 @@
---
upgrade:
- |
The default value of ``[keystone_client] interface`` has been changed from
``admin`` to ``public``.
fixes:
- |
When trying to do volume migration using the zone migration strategy, the
keystone service is reached, by default through the admin endpoint.
The default value of ``[keystone_client] interface`` has been fixed.
see Bug https://bugs.launchpad.net/watcher/+bug/2109494 for more info.

View File

@@ -1,11 +0,0 @@
---
fixes:
- |
Currently, when Watcher applies a `volume_migrate` action with value
`retype` for the `migratione_type`, it can wrongly report the result of
the action when the retype does not trigger a volume migration.
This patch fixes the logic to validate the resulting state of the action
and reports it correctly.
For more details: https://bugs.launchpad.net/watcher/+bug/2112100

View File

@@ -1,7 +0,0 @@
---
fixes:
- |
Fix API reference documentation for ``GET /infra-optim/v1/data_model``,
to include all missing fields from the response body. Please see
`Bug 2117726 <https://bugs.launchpad.net/watcher/+bug/2117726>`_ for
more details.

View File

@@ -1,7 +0,0 @@
---
fixes:
- |
Fixed nova client microversion comparison in enable and disable compute
service methods. The code was incorrectly comparing API versions, which
caused failures for microversions greater than 2.99. For more details,
see the bug report: https://bugs.launchpad.net/watcher/+bug/2120586

View File

@@ -1,11 +0,0 @@
---
fixes:
- |
Fixed action status_message update restrictions to allow updates when
action is in SKIPPED state. Previously, users could only update the
status_message when initially changing the action state to SKIPPED.
Now users can update the status_message field at any time while the
action remains in SKIPPED state, enabling them to fix typos, provide
more detailed explanations, or expand on reasons that were initially
omitted. For more details, see the bug report:
https://bugs.launchpad.net/watcher/+bug/2121601

View File

@@ -1,12 +0,0 @@
---
features:
- |
The Decision Engine service now supports running with ``native threading``
mode enabled as opposed to the use of the Eventlet library.
Note that the use of ``native threading`` is still ``experimental``,
and is disabled by default. It should not be used in production. To
switch from Eventlet to native threading mode, the environment variable
``OS_WATCHER_DISABLE_EVENTLET_PATCHING=true`` needs to be added to
the decision engine service configuration. For more information,
please check `eventlet removal
<https://wiki.openstack.org/wiki/Eventlet-removal>`__ documentation.

View File

@@ -1,6 +0,0 @@
---
deprecations:
- |
Noisy Neighbor strategy is deprecated and will be removed in a future release.
This strategy relies on Last Level Cache metrics that are not available in Nova
since `Victoria release <https://docs.openstack.org/releasenotes/nova/victoria.html>`_.

View File

@@ -1,6 +0,0 @@
---
other:
- |
Removed unused ``OperationNotPermitted`` exception that was dead code
since the initial import of the Watcher codebase. This exception
provides the appropriate 400 Bad Request response behavior.

View File

@@ -1,6 +0,0 @@
---
other:
- |
The `DELETE`, `POST` and `Patch` REST methods for the `action` APIs
are forbidden and not implemented. They are now removed from
the API controller.

View File

@@ -1,6 +0,0 @@
---
upgrade:
- |
Watcher now requires python 3.10 or newer.
The last release of watcher to support ``3.9`` was ``2025.1``.
Please ensure you have a supported python version before upgrading.

View File

@@ -1,5 +0,0 @@
---
fixes:
- |
Removed the ``python-dateutil`` dependency from Watcher to reduce the
number of external dependencies and improve maintainability.

View File

@@ -1,6 +0,0 @@
---
upgrade:
- |
Glance, Ironic, MAAS, and Neutron integrations with Watcher are now marked
as Experimental and may be deprecated in a future release. These
integrations have not been tested recently and may not be fully stable.

View File

@@ -1,17 +0,0 @@
---
features:
- |
The Host Maintenance strategy now supports two new input parameters:
``disable_live_migration`` and ``disable_cold_migration``. These
parameters allow cloud administrators to control whether live, cold or
no migration should be considered during host maintenance operations.
* If ``disable_live_migration`` is set, active instances will be cold
migrated if ``disable_cold_migration`` is not set, otherwise active
instances will be stopped.
* If ``disable_cold_migration`` is set, inactive instances will not be
cold migrated.
* If both are set, only stop actions will be applied on active instances.
A new `stop` action has been introduced and registered to support
scenarios where migration is disabled.

View File

@@ -1,13 +0,0 @@
---
upgrade:
- |
**Monasca client** dependency is now **optional**. The Monasca datasource
remains **deprecated for removal**, and the ``python-monascaclient`` package
is no longer installed by default. If you use the Monasca datasource,
you **MUST** install the optional extra when upgrading.
Behavior for deployments that do not use Monasca is unchanged.
**Example**
::
pip install watcher[monasca]

View File

@@ -1,21 +0,0 @@
---
deprecations:
- |
The ``[collector] api_query_timeout`` option was deprecated in favor of
the ``[collector] api_query_interval`` option.
- |
The ``[collector] api_call_retries`` option was deprecated in favor of
the ``[collector] api_query_max_retries`` option.
- |
The ``[watcher_datasources] query_timeout`` option was deprecated in favor
of the ``[watcher_datasources] query_interval`` option.
- |
The following deprecated options were removed.
- ``[gnocchi_client] query_timeout`` (Use
``[watcher_datsources] query_interval``)
- ``[gnocchi_client] query_max_retries`` (Use
``[watcher_datasources] query_max_retires``)

View File

@@ -1,7 +0,0 @@
---
upgrade:
- |
The storage model collector is now enabled by default if a cinder service exists
in the deployment. This is done to prevent the storage model becoming obsolete
when running volume migrations if new volumes are created and the model was not
enabled in the configuration.

View File

@@ -1,7 +0,0 @@
---
upgrade:
- |
Watcher now listens by default to the exchange and channel used by default
in Cinder, which is 'openstack.notifications'. The previous instructions
in the documentation to enable cinder notifications have been modified to
make clear that there is no need of changing the cinder conf.

View File

@@ -1,7 +0,0 @@
---
other:
- |
The Watcher Overload Standard Deviation algorithm is now referred to in the
documentation as the Workload Stabilization Strategy. The documentation of
this strategy has been enhanced to clarify and better explain the usage of
parameters.

View File

@@ -1,14 +0,0 @@
---
fixes:
- |
The zone migration strategy no longer requires a dst_node to be passed.
When unspecified, the Nova scheduler will select an appropriate host automatically.
This brings the implementation of the strategy in line with the the api schema
where dest_node is optional.
If a dst_pool is not passed, the strategy will not migrate some volumes, as Cinder can't compute a
destination host when migrating available volumes like Nova does. If src_type and dst_type are equal,
a migration is only performed if a dst_pool is provided, otherwise the volume will be skipped/ignored.
If src_type and dst_type are different, the strategy will retype the volumes.
See: https://bugs.launchpad.net/watcher/+bug/2108988 for more details.

View File

@@ -1,6 +0,0 @@
===========================
2025.1 Series Release Notes
===========================
.. release-notes::
:branch: stable/2025.1

Some files were not shown because too many files have changed in this diff Show More