watcher-tempest-plugin 3.5.0__tar.gz → 3.7.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- watcher_tempest_plugin-3.7.0/.zuul.yaml +59 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/AUTHORS +2 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/ChangeLog +31 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/PKG-INFO +13 -4
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/setup.cfg +2 -2
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/config.py +28 -0
- watcher_tempest_plugin-3.7.0/watcher_tempest_plugin/tests/api/admin/base.py +114 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/api/admin/test_action.py +49 -23
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/api/admin/test_action_plan.py +25 -10
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/api/admin/test_audit.py +254 -78
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/api/admin/test_audit_template.py +6 -7
- watcher_tempest_plugin-3.7.0/watcher_tempest_plugin/tests/api/admin/test_data_model.py +65 -0
- watcher_tempest_plugin-3.7.0/watcher_tempest_plugin/tests/common/base.py +375 -0
- watcher_tempest_plugin-3.7.0/watcher_tempest_plugin/tests/scenario/__init__.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/scenario/base.py +143 -122
- watcher_tempest_plugin-3.7.0/watcher_tempest_plugin/tests/scenario/test_continuous_audit.py +181 -0
- watcher_tempest_plugin-3.7.0/watcher_tempest_plugin/tests/scenario/test_data_model.py +161 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/scenario/test_execute_actuator.py +4 -10
- watcher_tempest_plugin-3.7.0/watcher_tempest_plugin/tests/scenario/test_execute_basic_optim.py +87 -0
- watcher_tempest_plugin-3.7.0/watcher_tempest_plugin/tests/scenario/test_execute_dummy_optim.py +61 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/scenario/test_execute_host_maintenance.py +26 -27
- watcher_tempest_plugin-3.7.0/watcher_tempest_plugin/tests/scenario/test_execute_node_resource_consolidation.py +102 -0
- watcher_tempest_plugin-3.7.0/watcher_tempest_plugin/tests/scenario/test_execute_storage_balance.py +69 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/scenario/test_execute_strategies_real.py +41 -28
- watcher_tempest_plugin-3.7.0/watcher_tempest_plugin/tests/scenario/test_execute_vm_workload_consolidation.py +91 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/scenario/test_execute_workload_balance.py +29 -23
- watcher_tempest_plugin-3.7.0/watcher_tempest_plugin/tests/scenario/test_execute_workload_stabilization.py +121 -0
- watcher_tempest_plugin-3.7.0/watcher_tempest_plugin/tests/scenario/test_execute_zone_migration.py +334 -0
- watcher_tempest_plugin-3.7.0/watcher_tempest_plugin/utils.py +25 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin.egg-info/PKG-INFO +13 -4
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin.egg-info/SOURCES.txt +8 -2
- watcher_tempest_plugin-3.7.0/watcher_tempest_plugin.egg-info/pbr.json +1 -0
- watcher_tempest_plugin-3.5.0/.zuul.yaml +0 -49
- watcher_tempest_plugin-3.5.0/watcher_tempest_plugin/tests/api/admin/base.py +0 -378
- watcher_tempest_plugin-3.5.0/watcher_tempest_plugin/tests/scenario/test_execute_basic_optim.py +0 -148
- watcher_tempest_plugin-3.5.0/watcher_tempest_plugin/tests/scenario/test_execute_dummy_optim.py +0 -93
- watcher_tempest_plugin-3.5.0/watcher_tempest_plugin/tests/scenario/test_execute_storage_balance.py +0 -120
- watcher_tempest_plugin-3.5.0/watcher_tempest_plugin/tests/scenario/test_execute_strategies.py +0 -236
- watcher_tempest_plugin-3.5.0/watcher_tempest_plugin/tests/scenario/test_execute_vm_workload_consolidation.py +0 -151
- watcher_tempest_plugin-3.5.0/watcher_tempest_plugin/tests/scenario/test_execute_workload_balancing.py +0 -124
- watcher_tempest_plugin-3.5.0/watcher_tempest_plugin/tests/scenario/test_execute_zone_migration.py +0 -106
- watcher_tempest_plugin-3.5.0/watcher_tempest_plugin.egg-info/pbr.json +0 -1
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/.coveragerc +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/.mailmap +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/.stestr.conf +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/.testr.conf +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/CONTRIBUTING.rst +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/HACKING.rst +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/LICENSE +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/README.rst +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/doc/requirements.txt +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/doc/source/conf.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/doc/source/contributing.rst +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/doc/source/index.rst +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/doc/source/readme.rst +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/pyproject.toml +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/releasenotes/notes/.placeholder +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/releasenotes/notes/drop-py-2-7-eb1979587d237f5e.yaml +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/releasenotes/notes/drop-python38-support-eeb09a8bc0170ce2.yaml +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/releasenotes/source/_static/.placeholder +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/releasenotes/source/_templates/.placeholder +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/releasenotes/source/conf.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/releasenotes/source/index.rst +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/releasenotes/source/unreleased.rst +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/requirements.txt +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/setup.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/test-requirements.txt +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/tox.ini +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/__init__.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/infra_optim_clients.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/plugin.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/services/__init__.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/services/base.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/services/infra_optim/__init__.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/services/infra_optim/v1/__init__.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/services/infra_optim/v1/json/__init__.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/services/infra_optim/v1/json/api_microversion_fixture.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/services/infra_optim/v1/json/client.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/services/metric/__init__.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/services/metric/prometheus_client.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/services/metric/v1/__init__.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/services/metric/v1/json/__init__.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/services/metric/v1/json/client.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/__init__.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/api/__init__.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/api/admin/__init__.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/api/admin/test_api_discovery.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/api/admin/test_goal.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/api/admin/test_scoring_engine.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/api/admin/test_service.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/api/admin/test_strategy.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/client_functional/__init__.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/client_functional/v1/__init__.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/client_functional/v1/base.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/client_functional/v1/test_action.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/client_functional/v1/test_action_plan.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/client_functional/v1/test_audit.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/client_functional/v1/test_audit_template.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/client_functional/v1/test_goal.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/client_functional/v1/test_scoring_engine.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/client_functional/v1/test_service.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/client_functional/v1/test_strategy.py +0 -0
- {watcher_tempest_plugin-3.5.0/watcher_tempest_plugin/tests/scenario → watcher_tempest_plugin-3.7.0/watcher_tempest_plugin/tests/common}/__init__.py +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin.egg-info/dependency_links.txt +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin.egg-info/entry_points.txt +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin.egg-info/not-zip-safe +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin.egg-info/requires.txt +0 -0
- {watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
- project:
|
|
2
|
+
queue: watcher
|
|
3
|
+
templates:
|
|
4
|
+
- check-requirements
|
|
5
|
+
- tempest-plugin-jobs
|
|
6
|
+
- publish-openstack-docs-pti
|
|
7
|
+
- release-notes-jobs-python3
|
|
8
|
+
check:
|
|
9
|
+
jobs:
|
|
10
|
+
- watcher-tempest-aetos
|
|
11
|
+
- watcher-tempest-gnocchi
|
|
12
|
+
- watcher-tempest-prometheus
|
|
13
|
+
- watcher-tempest-aetos-2025-2
|
|
14
|
+
- watcher-tempest-gnocchi-2025-2
|
|
15
|
+
- watcher-tempest-gnocchi-2025-1
|
|
16
|
+
- watcher-tempest-prometheus-2025-1
|
|
17
|
+
- watcher-tempest-gnocchi-2024-2
|
|
18
|
+
gate:
|
|
19
|
+
jobs:
|
|
20
|
+
- watcher-tempest-aetos
|
|
21
|
+
- watcher-tempest-gnocchi
|
|
22
|
+
- watcher-tempest-prometheus
|
|
23
|
+
- watcher-tempest-aetos-2025-2
|
|
24
|
+
- watcher-tempest-gnocchi-2025-2
|
|
25
|
+
- watcher-tempest-gnocchi-2025-1
|
|
26
|
+
- watcher-tempest-prometheus-2025-1
|
|
27
|
+
- watcher-tempest-gnocchi-2024-2
|
|
28
|
+
experimental:
|
|
29
|
+
jobs:
|
|
30
|
+
- watcher-tempest-prometheus-realdata
|
|
31
|
+
- watcher-tempest-aetos-realdata
|
|
32
|
+
|
|
33
|
+
# stable/2025.2 jobs
|
|
34
|
+
- job:
|
|
35
|
+
name: watcher-tempest-aetos-2025-2
|
|
36
|
+
parent: watcher-tempest-aetos
|
|
37
|
+
override-checkout: stable/2025.2
|
|
38
|
+
|
|
39
|
+
- job:
|
|
40
|
+
name: watcher-tempest-gnocchi-2025-2
|
|
41
|
+
parent: watcher-tempest-gnocchi
|
|
42
|
+
override-checkout: stable/2025.2
|
|
43
|
+
|
|
44
|
+
# stable/2025.1 jobs
|
|
45
|
+
- job:
|
|
46
|
+
name: watcher-tempest-gnocchi-2025-1
|
|
47
|
+
parent: watcher-tempest-gnocchi
|
|
48
|
+
override-checkout: stable/2025.1
|
|
49
|
+
|
|
50
|
+
- job:
|
|
51
|
+
name: watcher-tempest-prometheus-2025-1
|
|
52
|
+
parent: watcher-tempest-prometheus
|
|
53
|
+
override-checkout: stable/2025.1
|
|
54
|
+
|
|
55
|
+
# stable/2024.2 jobs
|
|
56
|
+
- job:
|
|
57
|
+
name: watcher-tempest-gnocchi-2024-2
|
|
58
|
+
parent: watcher-tempest-gnocchi
|
|
59
|
+
override-checkout: stable/2024.2
|
|
@@ -9,6 +9,7 @@ Dantali0n <info@dantalion.nl>
|
|
|
9
9
|
David TARDIVEL <David.TARDIVEL@b-com.com>
|
|
10
10
|
Douglas Viroel <viroel@gmail.com>
|
|
11
11
|
Drew Thorstensen <thorst@us.ibm.com>
|
|
12
|
+
Ghanshyam Maan <gmaan@ghanshyammann.com>
|
|
12
13
|
Ghanshyam Mann <gmann@ghanshyammann.com>
|
|
13
14
|
Gábor Antal <antal@inf.u-szeged.hu>
|
|
14
15
|
Hervé Beraud <hberaud@redhat.com>
|
|
@@ -40,6 +41,7 @@ digambar <digambarpatil15@yahoo.co.in>
|
|
|
40
41
|
ghanshyam <gmann@ghanshyammann.com>
|
|
41
42
|
gujin <gu.jin@99cloud.net>
|
|
42
43
|
huang.zhiping <huang.zhiping@99cloud.net>
|
|
44
|
+
jgilaber <jgilaber@redhat.com>
|
|
43
45
|
licanwei <li.canwei2@zte.com.cn>
|
|
44
46
|
limin.lc <limin.lc@inspur.com>
|
|
45
47
|
liyou01 <liyou01@inspur.com>
|
|
@@ -1,10 +1,41 @@
|
|
|
1
1
|
CHANGES
|
|
2
2
|
=======
|
|
3
3
|
|
|
4
|
+
3.7.0
|
|
5
|
+
-----
|
|
6
|
+
|
|
7
|
+
* Add test for volume migrate with zone migration
|
|
8
|
+
* Consolidate and improve Zuul CI jobs for stable branches
|
|
9
|
+
* Fix unsupported operand types in internal methods
|
|
10
|
+
* Refresh the state of the actionplan before asserting status
|
|
11
|
+
* Fix experimental job names after refactoring watcher jobs
|
|
12
|
+
* Add config flags to control zone migration test execution
|
|
13
|
+
* Skip test api.admin.test\_audit.TestShowListAudit.test\_list\_with\_limit
|
|
14
|
+
* Consolidate and improve Zuul CI job definitions
|
|
15
|
+
* Wait action plan to finish before asserting state
|
|
16
|
+
* Improved continuous audit api test coverage
|
|
17
|
+
* Refactor: Extract common test utilities into shared base class
|
|
18
|
+
* Drop job to test unmaintained 2024.1 branch
|
|
19
|
+
* Drop python 3.9 and support python 3.13
|
|
20
|
+
|
|
21
|
+
3.6.0
|
|
22
|
+
-----
|
|
23
|
+
|
|
24
|
+
* Skip Storage Capacity test until it's fixed
|
|
25
|
+
* Add tests for extended compute datamodel
|
|
26
|
+
* Remove server\_state check from data\_model test
|
|
27
|
+
* Fail if action plan cannot be execute
|
|
28
|
+
* Remove resource\_setup skip checks
|
|
29
|
+
* Refactor execute\_strategy method into smaller helpers
|
|
30
|
+
* Organize strategy tests and remove duplicated tests
|
|
31
|
+
* Add basic datamodel list tests
|
|
32
|
+
* Add a scenario test with continuous audit
|
|
33
|
+
|
|
4
34
|
3.5.0
|
|
5
35
|
-----
|
|
6
36
|
|
|
7
37
|
* Add stable/2025.2 job
|
|
38
|
+
* Add test for volume retype with zone migration
|
|
8
39
|
* Check for single instance migration to backup node
|
|
9
40
|
* Add Aetos jobs in check and experimental pipelines
|
|
10
41
|
* Add custom flavor and dynamic threshold to workload\_balance tests
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: watcher-tempest-plugin
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.7.0
|
|
4
4
|
Summary: Tempest plugin watcher-tempest-plugin
|
|
5
5
|
Home-page: https://docs.openstack.org/watcher/latest/
|
|
6
6
|
Author: OpenStack
|
|
@@ -14,17 +14,26 @@ Classifier: Programming Language :: Python
|
|
|
14
14
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
15
15
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
16
16
|
Classifier: Programming Language :: Python :: 3
|
|
17
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
18
17
|
Classifier: Programming Language :: Python :: 3.10
|
|
19
18
|
Classifier: Programming Language :: Python :: 3.11
|
|
20
19
|
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
-
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Requires-Python: >=3.10
|
|
22
22
|
License-File: LICENSE
|
|
23
23
|
Requires-Dist: pbr>=3.1.1
|
|
24
24
|
Requires-Dist: oslo.log>=3.36.0
|
|
25
25
|
Requires-Dist: oslo.utils>=3.33.0
|
|
26
26
|
Requires-Dist: tempest>=27.0.0
|
|
27
27
|
Requires-Dist: os-traits>=0.15.0
|
|
28
|
+
Dynamic: author
|
|
29
|
+
Dynamic: author-email
|
|
30
|
+
Dynamic: classifier
|
|
31
|
+
Dynamic: description
|
|
32
|
+
Dynamic: home-page
|
|
33
|
+
Dynamic: license-file
|
|
34
|
+
Dynamic: requires-dist
|
|
35
|
+
Dynamic: requires-python
|
|
36
|
+
Dynamic: summary
|
|
28
37
|
|
|
29
38
|
======================
|
|
30
39
|
watcher-tempest-plugin
|
|
@@ -6,7 +6,7 @@ description_file =
|
|
|
6
6
|
author = OpenStack
|
|
7
7
|
author_email = openstack-discuss@lists.openstack.org
|
|
8
8
|
home_page = https://docs.openstack.org/watcher/latest/
|
|
9
|
-
python_requires = >=3.
|
|
9
|
+
python_requires = >=3.10
|
|
10
10
|
classifier =
|
|
11
11
|
Environment :: OpenStack
|
|
12
12
|
Intended Audience :: Information Technology
|
|
@@ -17,10 +17,10 @@ classifier =
|
|
|
17
17
|
Programming Language :: Python :: Implementation :: CPython
|
|
18
18
|
Programming Language :: Python :: 3 :: Only
|
|
19
19
|
Programming Language :: Python :: 3
|
|
20
|
-
Programming Language :: Python :: 3.9
|
|
21
20
|
Programming Language :: Python :: 3.10
|
|
22
21
|
Programming Language :: Python :: 3.11
|
|
23
22
|
Programming Language :: Python :: 3.12
|
|
23
|
+
Programming Language :: Python :: 3.13
|
|
24
24
|
|
|
25
25
|
[files]
|
|
26
26
|
packages =
|
{watcher_tempest_plugin-3.5.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/config.py
RENAMED
|
@@ -127,4 +127,32 @@ OptimizationGroup = [
|
|
|
127
127
|
help="Upper version of the test target microversion range. "
|
|
128
128
|
"The format is 'X.Y', where 'X' and 'Y' are int values."
|
|
129
129
|
),
|
|
130
|
+
cfg.BoolOpt(
|
|
131
|
+
"run_continuous_audit_tests",
|
|
132
|
+
default=False,
|
|
133
|
+
help="Whether or not to run continuous audit scenario tests.",
|
|
134
|
+
),
|
|
135
|
+
cfg.BoolOpt(
|
|
136
|
+
"run_extended_attributes_tests",
|
|
137
|
+
default=False,
|
|
138
|
+
help="Whether or not to run compute model extended attributes tests. "
|
|
139
|
+
"Note that Watcher also needs to be configured to enable the "
|
|
140
|
+
"collection of extended attributes for the compute model and the "
|
|
141
|
+
"watcher option nova_client.api_version must be set configured "
|
|
142
|
+
"accordingly. Note that some attributes require the model "
|
|
143
|
+
"collector to run and update the model, so make sure that your "
|
|
144
|
+
"`watcher_cluster_data_model_collectors` period configuration is "
|
|
145
|
+
"less than 300 seconds."
|
|
146
|
+
),
|
|
147
|
+
cfg.BoolOpt(
|
|
148
|
+
"run_zone_migration_extra_tests",
|
|
149
|
+
default=False,
|
|
150
|
+
help="Whether or not to run extra zone migration tests that test"
|
|
151
|
+
"migration without specified destination nodes."
|
|
152
|
+
),
|
|
153
|
+
cfg.BoolOpt(
|
|
154
|
+
"run_zone_migration_storage_tests",
|
|
155
|
+
default=False,
|
|
156
|
+
help="Whether or not to run storage zone migration tests."
|
|
157
|
+
),
|
|
130
158
|
]
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
# Copyright (c) 2016 b<>com
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
13
|
+
# implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
|
|
17
|
+
from tempest import config
|
|
18
|
+
from tempest.lib.common import api_version_utils
|
|
19
|
+
from tempest.lib.common.utils import test_utils
|
|
20
|
+
from tempest import test
|
|
21
|
+
|
|
22
|
+
from watcher_tempest_plugin import infra_optim_clients as clients
|
|
23
|
+
from watcher_tempest_plugin.services.infra_optim.v1.json import (
|
|
24
|
+
api_microversion_fixture
|
|
25
|
+
)
|
|
26
|
+
from watcher_tempest_plugin.tests.common import base
|
|
27
|
+
|
|
28
|
+
CONF = config.CONF
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class BaseInfraOptimTest(api_version_utils.BaseMicroversionTest,
|
|
32
|
+
test.BaseTestCase,
|
|
33
|
+
base.WatcherHelperMixin):
|
|
34
|
+
"""Base class for Infrastructure Optimization API tests."""
|
|
35
|
+
|
|
36
|
+
@classmethod
|
|
37
|
+
def skip_checks(cls):
|
|
38
|
+
super(BaseInfraOptimTest, cls).skip_checks()
|
|
39
|
+
if not CONF.service_available.watcher:
|
|
40
|
+
raise cls.skipException('Watcher support is required')
|
|
41
|
+
|
|
42
|
+
api_version_utils.check_skip_with_microversion(
|
|
43
|
+
cls.min_microversion,
|
|
44
|
+
cls.max_microversion,
|
|
45
|
+
CONF.optimize.min_microversion,
|
|
46
|
+
CONF.optimize.max_microversion)
|
|
47
|
+
|
|
48
|
+
@classmethod
|
|
49
|
+
def setup_credentials(cls):
|
|
50
|
+
super(BaseInfraOptimTest, cls).setup_credentials()
|
|
51
|
+
cls.mgr = clients.AdminManager()
|
|
52
|
+
|
|
53
|
+
@classmethod
|
|
54
|
+
def setup_clients(cls):
|
|
55
|
+
super(BaseInfraOptimTest, cls).setup_clients()
|
|
56
|
+
cls.client = cls.mgr.io_client
|
|
57
|
+
cls.gnocchi = cls.mgr.gn_client
|
|
58
|
+
|
|
59
|
+
def setUp(self):
|
|
60
|
+
super(BaseInfraOptimTest, self).setUp()
|
|
61
|
+
self.useFixture(api_microversion_fixture.APIMicroversionFixture(
|
|
62
|
+
optimize_microversion=self.request_microversion))
|
|
63
|
+
|
|
64
|
+
@classmethod
|
|
65
|
+
def resource_setup(cls):
|
|
66
|
+
super(BaseInfraOptimTest, cls).resource_setup()
|
|
67
|
+
|
|
68
|
+
# Set of all created audit templates UUIDs
|
|
69
|
+
cls.created_audit_templates = set()
|
|
70
|
+
# Set of all created audit UUIDs
|
|
71
|
+
cls.created_audits = set()
|
|
72
|
+
# Set of all created audit UUIDs. We use it to build the list of
|
|
73
|
+
# action plans to delete (including potential orphan one(s))
|
|
74
|
+
cls.created_action_plans_audit_uuids = set()
|
|
75
|
+
|
|
76
|
+
cls.request_microversion = (
|
|
77
|
+
api_version_utils.select_request_microversion(
|
|
78
|
+
cls.min_microversion,
|
|
79
|
+
CONF.optimize.min_microversion))
|
|
80
|
+
|
|
81
|
+
@classmethod
|
|
82
|
+
def resource_cleanup(cls):
|
|
83
|
+
"""Ensure that all created objects get destroyed."""
|
|
84
|
+
super(BaseInfraOptimTest, cls).resource_cleanup()
|
|
85
|
+
|
|
86
|
+
def _are_all_action_plans_finished(self):
|
|
87
|
+
_, action_plans = self.client.list_action_plans()
|
|
88
|
+
return all([ap['state'] in self.IDLE_STATES.values()
|
|
89
|
+
for ap in action_plans['action_plans']])
|
|
90
|
+
|
|
91
|
+
def wait_for_all_action_plans_to_finish(self):
|
|
92
|
+
assert test_utils.call_until_true(
|
|
93
|
+
func=self._are_all_action_plans_finished,
|
|
94
|
+
duration=300,
|
|
95
|
+
sleep_for=5
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
def validate_self_link(self, resource, uuid, link):
|
|
99
|
+
"""Check whether the given self link formatted correctly."""
|
|
100
|
+
expected_link = "{base}/{pref}/{res}/{uuid}".format(
|
|
101
|
+
base='https?://[^/]*',
|
|
102
|
+
pref=self.client.URI_PREFIX,
|
|
103
|
+
res=resource,
|
|
104
|
+
uuid=uuid
|
|
105
|
+
)
|
|
106
|
+
self.assertRegex(link, expected_link)
|
|
107
|
+
|
|
108
|
+
def assert_expected(self, expected, actual,
|
|
109
|
+
keys=('created_at', 'updated_at', 'deleted_at')):
|
|
110
|
+
# Check if not expected keys/values exists in actual response body
|
|
111
|
+
for key, value in expected.items():
|
|
112
|
+
if key not in keys:
|
|
113
|
+
self.assertIn(key, actual)
|
|
114
|
+
self.assertEqual(value, actual[key])
|
|
@@ -26,21 +26,36 @@ from watcher_tempest_plugin.tests.api.admin import base
|
|
|
26
26
|
class TestShowListAction(base.BaseInfraOptimTest):
|
|
27
27
|
"""Tests for actions"""
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
_,
|
|
33
|
-
_, cls.audit_template = cls.create_audit_template(cls.goal['uuid'])
|
|
34
|
-
_, cls.audit = cls.create_audit(cls.audit_template['uuid'])
|
|
29
|
+
def setUp(self):
|
|
30
|
+
super().setUp()
|
|
31
|
+
_, self.goal = self.client.show_goal("DUMMY")
|
|
32
|
+
_, self.audit_template = self.create_audit_template(self.goal['uuid'])
|
|
35
33
|
|
|
34
|
+
# Wait for any running action plans to finish before creating audit
|
|
35
|
+
self.wait_for_all_action_plans_to_finish()
|
|
36
|
+
|
|
37
|
+
_, self.audit = self.create_audit(self.audit_template['uuid'])
|
|
38
|
+
|
|
39
|
+
# Wait for audit to finish (in any state)
|
|
36
40
|
assert test_utils.call_until_true(
|
|
37
|
-
func=functools.partial(
|
|
41
|
+
func=functools.partial(self.has_audit_finished,
|
|
42
|
+
self.audit['uuid']),
|
|
38
43
|
duration=30,
|
|
39
44
|
sleep_for=.5
|
|
45
|
+
), "Audit %s did not finish within expected time" % self.audit['uuid']
|
|
46
|
+
|
|
47
|
+
# Check if audit succeeded
|
|
48
|
+
_, finished_audit = self.client.show_audit(self.audit['uuid'])
|
|
49
|
+
audit_state = finished_audit.get('state')
|
|
50
|
+
assert audit_state == 'SUCCEEDED', (
|
|
51
|
+
"Audit %s ended in state %s instead of SUCCEEDED" %
|
|
52
|
+
(self.audit['uuid'], audit_state)
|
|
40
53
|
)
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
54
|
+
|
|
55
|
+
_, action_plans = self.client.list_action_plans(
|
|
56
|
+
audit_uuid=self.audit['uuid'])
|
|
57
|
+
|
|
58
|
+
self.action_plan = action_plans['action_plans'][0]
|
|
44
59
|
|
|
45
60
|
@decorators.attr(type='smoke')
|
|
46
61
|
@decorators.idempotent_id('0390c465-df10-460f-9924-ff3d14779395')
|
|
@@ -119,25 +134,36 @@ class TestPatchAction(base.BaseInfraOptimTest):
|
|
|
119
134
|
# Minimal version required for Actions Patch API
|
|
120
135
|
min_microversion = "1.5"
|
|
121
136
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
137
|
+
def setUp(self):
|
|
138
|
+
super().setUp()
|
|
139
|
+
_, self.goal = self.client.show_goal("DUMMY")
|
|
140
|
+
_, self.audit_template = self.create_audit_template(self.goal['uuid'])
|
|
125
141
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
super(TestPatchAction, cls).resource_setup()
|
|
129
|
-
_, cls.goal = cls.client.show_goal("DUMMY")
|
|
130
|
-
_, cls.audit_template = cls.create_audit_template(cls.goal['uuid'])
|
|
131
|
-
_, cls.audit = cls.create_audit(cls.audit_template['uuid'])
|
|
142
|
+
# Wait for any running action plans to finish before creating audit
|
|
143
|
+
self.wait_for_all_action_plans_to_finish()
|
|
132
144
|
|
|
145
|
+
_, self.audit = self.create_audit(self.audit_template['uuid'])
|
|
146
|
+
|
|
147
|
+
# Wait for audit to finish (in any state)
|
|
133
148
|
assert test_utils.call_until_true(
|
|
134
|
-
func=functools.partial(
|
|
149
|
+
func=functools.partial(self.has_audit_finished,
|
|
150
|
+
self.audit['uuid']),
|
|
135
151
|
duration=30,
|
|
136
152
|
sleep_for=.5
|
|
153
|
+
), "Audit %s did not finish within expected time" % self.audit['uuid']
|
|
154
|
+
|
|
155
|
+
# Check if audit succeeded
|
|
156
|
+
_, finished_audit = self.client.show_audit(self.audit['uuid'])
|
|
157
|
+
audit_state = finished_audit.get('state')
|
|
158
|
+
assert audit_state == 'SUCCEEDED', (
|
|
159
|
+
"Audit %s ended in state %s instead of SUCCEEDED" %
|
|
160
|
+
(self.audit['uuid'], audit_state)
|
|
137
161
|
)
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
162
|
+
|
|
163
|
+
_, action_plans = self.client.list_action_plans(
|
|
164
|
+
audit_uuid=self.audit['uuid'])
|
|
165
|
+
|
|
166
|
+
self.action_plan = action_plans['action_plans'][0]
|
|
141
167
|
|
|
142
168
|
@decorators.attr(type="smoke")
|
|
143
169
|
@decorators.idempotent_id('e2360342-8042-4faf-a028-5e63fd844387')
|
|
@@ -52,6 +52,10 @@ class TestCreateDeleteExecuteActionPlan(base.BaseInfraOptimTest):
|
|
|
52
52
|
def test_execute_action_plan(self):
|
|
53
53
|
_, goal = self.client.show_goal("dummy")
|
|
54
54
|
_, audit_template = self.create_audit_template(goal['uuid'])
|
|
55
|
+
|
|
56
|
+
# Wait for any running action plans to finish before creating audit
|
|
57
|
+
self.wait_for_all_action_plans_to_finish()
|
|
58
|
+
|
|
55
59
|
_, audit = self.create_audit(audit_template['uuid'])
|
|
56
60
|
|
|
57
61
|
self.assertTrue(test_utils.call_until_true(
|
|
@@ -59,6 +63,7 @@ class TestCreateDeleteExecuteActionPlan(base.BaseInfraOptimTest):
|
|
|
59
63
|
duration=30,
|
|
60
64
|
sleep_for=.5
|
|
61
65
|
))
|
|
66
|
+
|
|
62
67
|
_, action_plans = self.client.list_action_plans(
|
|
63
68
|
audit_uuid=audit['uuid'])
|
|
64
69
|
action_plan = action_plans['action_plans'][0]
|
|
@@ -76,6 +81,10 @@ class TestCreateDeleteExecuteActionPlan(base.BaseInfraOptimTest):
|
|
|
76
81
|
def test_delete_action_plan(self):
|
|
77
82
|
_, goal = self.client.show_goal("dummy")
|
|
78
83
|
_, audit_template = self.create_audit_template(goal['uuid'])
|
|
84
|
+
|
|
85
|
+
# Wait for any running action plans to finish before creating audit
|
|
86
|
+
self.wait_for_all_action_plans_to_finish()
|
|
87
|
+
|
|
79
88
|
_, audit = self.create_audit(audit_template['uuid'])
|
|
80
89
|
|
|
81
90
|
self.assertTrue(test_utils.call_until_true(
|
|
@@ -83,6 +92,7 @@ class TestCreateDeleteExecuteActionPlan(base.BaseInfraOptimTest):
|
|
|
83
92
|
duration=30,
|
|
84
93
|
sleep_for=.5
|
|
85
94
|
))
|
|
95
|
+
|
|
86
96
|
_, action_plans = self.client.list_action_plans(
|
|
87
97
|
audit_uuid=audit['uuid'])
|
|
88
98
|
action_plan = action_plans['action_plans'][0]
|
|
@@ -98,22 +108,27 @@ class TestCreateDeleteExecuteActionPlan(base.BaseInfraOptimTest):
|
|
|
98
108
|
class TestShowListActionPlan(base.BaseInfraOptimTest):
|
|
99
109
|
"""Tests for action_plan."""
|
|
100
110
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
_,
|
|
105
|
-
|
|
106
|
-
|
|
111
|
+
def setUp(self):
|
|
112
|
+
super().setUp()
|
|
113
|
+
_, self.goal = self.client.show_goal("dummy")
|
|
114
|
+
_, self.audit_template = self.create_audit_template(self.goal['uuid'])
|
|
115
|
+
|
|
116
|
+
# Wait for any running action plans to finish before creating audit
|
|
117
|
+
self.wait_for_all_action_plans_to_finish()
|
|
118
|
+
|
|
119
|
+
_, self.audit = self.create_audit(self.audit_template['uuid'])
|
|
107
120
|
|
|
108
121
|
assert test_utils.call_until_true(
|
|
109
|
-
func=functools.partial(
|
|
122
|
+
func=functools.partial(
|
|
123
|
+
self.has_audit_finished, self.audit['uuid']),
|
|
110
124
|
duration=30,
|
|
111
125
|
sleep_for=.5
|
|
112
126
|
)
|
|
113
|
-
|
|
114
|
-
|
|
127
|
+
|
|
128
|
+
_, action_plans = self.client.list_action_plans(
|
|
129
|
+
audit_uuid=self.audit['uuid'])
|
|
115
130
|
if len(action_plans['action_plans']) > 0:
|
|
116
|
-
|
|
131
|
+
self.action_plan = action_plans['action_plans'][0]
|
|
117
132
|
|
|
118
133
|
@decorators.attr(type='smoke')
|
|
119
134
|
@decorators.idempotent_id('33465228-aac1-4688-9db3-6b1532c84323')
|