watcher-tempest-plugin 3.4.0__tar.gz → 3.5.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.4.0 → watcher_tempest_plugin-3.5.0}/.zuul.yaml +20 -8
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/AUTHORS +5 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/ChangeLog +43 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/PKG-INFO +2 -2
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/README.rst +1 -1
- watcher_tempest_plugin-3.5.0/pyproject.toml +3 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/test-requirements.txt +1 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/tox.ini +7 -2
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/config.py +18 -0
- watcher_tempest_plugin-3.5.0/watcher_tempest_plugin/services/infra_optim/v1/json/api_microversion_fixture.py +47 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/services/infra_optim/v1/json/client.py +11 -1
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/services/metric/prometheus_client.py +25 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/api/admin/base.py +23 -1
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/api/admin/test_action.py +65 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/api/admin/test_action_plan.py +8 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/api/admin/test_api_discovery.py +3 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/api/admin/test_audit.py +13 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/api/admin/test_audit_template.py +12 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/api/admin/test_goal.py +3 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/api/admin/test_scoring_engine.py +3 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/api/admin/test_service.py +3 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/api/admin/test_strategy.py +3 -0
- watcher_tempest_plugin-3.5.0/watcher_tempest_plugin/tests/client_functional/__init__.py +30 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/client_functional/v1/test_action.py +4 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/client_functional/v1/test_action_plan.py +5 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/client_functional/v1/test_audit.py +11 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/client_functional/v1/test_audit_template.py +7 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/client_functional/v1/test_goal.py +5 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/client_functional/v1/test_scoring_engine.py +5 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/client_functional/v1/test_service.py +5 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/client_functional/v1/test_strategy.py +6 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/scenario/base.py +384 -66
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/scenario/test_execute_actuator.py +21 -14
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/scenario/test_execute_basic_optim.py +15 -4
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/scenario/test_execute_dummy_optim.py +2 -0
- watcher_tempest_plugin-3.5.0/watcher_tempest_plugin/tests/scenario/test_execute_host_maintenance.py +115 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/scenario/test_execute_storage_balance.py +2 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/scenario/test_execute_strategies.py +69 -45
- watcher_tempest_plugin-3.5.0/watcher_tempest_plugin/tests/scenario/test_execute_strategies_real.py +179 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/scenario/test_execute_vm_workload_consolidation.py +15 -4
- watcher_tempest_plugin-3.5.0/watcher_tempest_plugin/tests/scenario/test_execute_workload_balance.py +131 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/scenario/test_execute_workload_balancing.py +16 -5
- watcher_tempest_plugin-3.5.0/watcher_tempest_plugin/tests/scenario/test_execute_zone_migration.py +106 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin.egg-info/PKG-INFO +2 -2
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin.egg-info/SOURCES.txt +4 -0
- watcher_tempest_plugin-3.5.0/watcher_tempest_plugin.egg-info/pbr.json +1 -0
- watcher_tempest_plugin-3.4.0/watcher_tempest_plugin/tests/scenario/__init__.py +0 -0
- watcher_tempest_plugin-3.4.0/watcher_tempest_plugin/tests/scenario/test_execute_host_maintenance.py +0 -129
- watcher_tempest_plugin-3.4.0/watcher_tempest_plugin/tests/scenario/test_execute_zone_migration.py +0 -134
- watcher_tempest_plugin-3.4.0/watcher_tempest_plugin.egg-info/pbr.json +0 -1
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/.coveragerc +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/.mailmap +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/.stestr.conf +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/.testr.conf +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/CONTRIBUTING.rst +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/HACKING.rst +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/LICENSE +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/doc/requirements.txt +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/doc/source/conf.py +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/doc/source/contributing.rst +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/doc/source/index.rst +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/doc/source/readme.rst +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/releasenotes/notes/.placeholder +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/releasenotes/notes/drop-py-2-7-eb1979587d237f5e.yaml +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/releasenotes/notes/drop-python38-support-eeb09a8bc0170ce2.yaml +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/releasenotes/source/_static/.placeholder +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/releasenotes/source/_templates/.placeholder +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/releasenotes/source/conf.py +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/releasenotes/source/index.rst +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/releasenotes/source/unreleased.rst +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/requirements.txt +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/setup.cfg +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/setup.py +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/__init__.py +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/infra_optim_clients.py +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/plugin.py +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/services/__init__.py +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/services/base.py +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/services/infra_optim/__init__.py +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/services/infra_optim/v1/__init__.py +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/services/infra_optim/v1/json/__init__.py +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/services/metric/__init__.py +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/services/metric/v1/__init__.py +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/services/metric/v1/json/__init__.py +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/services/metric/v1/json/client.py +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/__init__.py +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/api/__init__.py +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/api/admin/__init__.py +0 -0
- {watcher_tempest_plugin-3.4.0/watcher_tempest_plugin/tests/client_functional → watcher_tempest_plugin-3.5.0/watcher_tempest_plugin/tests/client_functional/v1}/__init__.py +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/tests/client_functional/v1/base.py +0 -0
- {watcher_tempest_plugin-3.4.0/watcher_tempest_plugin/tests/client_functional/v1 → watcher_tempest_plugin-3.5.0/watcher_tempest_plugin/tests/scenario}/__init__.py +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin.egg-info/dependency_links.txt +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin.egg-info/entry_points.txt +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin.egg-info/not-zip-safe +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin.egg-info/requires.txt +0 -0
- {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin.egg-info/top_level.txt +0 -0
|
@@ -7,16 +7,34 @@
|
|
|
7
7
|
- release-notes-jobs-python3
|
|
8
8
|
check:
|
|
9
9
|
jobs:
|
|
10
|
-
- watcherclient-tempest-functional
|
|
11
10
|
- watcher-tempest-functional
|
|
12
11
|
- watcher-tempest-actuator
|
|
13
12
|
- watcher-tempest-strategies
|
|
13
|
+
- watcher-prometheus-integration
|
|
14
|
+
- watcher-aetos-integration
|
|
15
|
+
- watcher-tempest-functional-2025-2
|
|
16
|
+
- watcher-tempest-functional-2025-1
|
|
14
17
|
- watcher-tempest-functional-2024-2
|
|
15
18
|
- watcher-tempest-functional-2024-1
|
|
16
|
-
- watcher-tempest-functional-2023-2
|
|
17
19
|
gate:
|
|
18
20
|
jobs:
|
|
19
21
|
- watcher-tempest-functional
|
|
22
|
+
experimental:
|
|
23
|
+
jobs:
|
|
24
|
+
- watcher-prometheus-integration-realdata
|
|
25
|
+
- watcher-aetos-integration-realdata
|
|
26
|
+
|
|
27
|
+
- job:
|
|
28
|
+
name: watcher-tempest-functional-2025-2
|
|
29
|
+
parent: watcher-tempest-functional
|
|
30
|
+
nodeset: openstack-single-node-noble
|
|
31
|
+
override-checkout: stable/2025.2
|
|
32
|
+
|
|
33
|
+
- job:
|
|
34
|
+
name: watcher-tempest-functional-2025-1
|
|
35
|
+
parent: watcher-tempest-functional
|
|
36
|
+
nodeset: openstack-single-node-noble
|
|
37
|
+
override-checkout: stable/2025.1
|
|
20
38
|
|
|
21
39
|
- job:
|
|
22
40
|
name: watcher-tempest-functional-2024-2
|
|
@@ -29,9 +47,3 @@
|
|
|
29
47
|
parent: watcher-tempest-functional
|
|
30
48
|
nodeset: openstack-single-node-jammy
|
|
31
49
|
override-checkout: stable/2024.1
|
|
32
|
-
|
|
33
|
-
- job:
|
|
34
|
-
name: watcher-tempest-functional-2023-2
|
|
35
|
-
parent: watcher-tempest-functional
|
|
36
|
-
nodeset: openstack-single-node-jammy
|
|
37
|
-
override-checkout: stable/2023.2
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
98k <18552437190@163.com>
|
|
2
2
|
Alexander Chadin <a.chadin@servionica.ru>
|
|
3
|
+
Alfredo Moralejo <amoralej@redhat.com>
|
|
3
4
|
Andrea Frittoli <andrea.frittoli@gmail.com>
|
|
4
5
|
Andreas Jaeger <aj@suse.com>
|
|
5
6
|
Chandan Kumar (raukadah) <chkumar@redhat.com>
|
|
@@ -13,6 +14,7 @@ Gábor Antal <antal@inf.u-szeged.hu>
|
|
|
13
14
|
Hervé Beraud <hberaud@redhat.com>
|
|
14
15
|
Hidekazu Nakamura <hid-nakamura@vf.jp.nec.com>
|
|
15
16
|
Jaewoo Park <jp655p@att.com>
|
|
17
|
+
Jaromir Wysoglad <jwysogla@redhat.com>
|
|
16
18
|
Ken'ichi Ohmichi <ken-oomichi@wx.jp.nec.com>
|
|
17
19
|
Larry Rensing <lr699s@att.com>
|
|
18
20
|
Martin Kopec <mkopec@redhat.com>
|
|
@@ -21,6 +23,7 @@ Ngo Quoc Cuong <cuongnq@vn.fujitsu.com>
|
|
|
21
23
|
Nguyen Hai <nguyentrihai93@gmail.com>
|
|
22
24
|
Nishant Kumar <nishant.e.kumar@ericsson.com>
|
|
23
25
|
Roman Popelka <rpopelka@redhat.com>
|
|
26
|
+
Sean Mooney <work@seanmooney.info>
|
|
24
27
|
ShangXiao <shangxiaobj@inspur.com>
|
|
25
28
|
Sumit Jamgade <sjamgade@suse.com>
|
|
26
29
|
Takashi Kajinami <kajinamit@oss.nttdata.com>
|
|
@@ -42,6 +45,8 @@ limin.lc <limin.lc@inspur.com>
|
|
|
42
45
|
liyou01 <liyou01@inspur.com>
|
|
43
46
|
maaoyu <maaoyu@inspur.com>
|
|
44
47
|
malinga tembo <mtembo@redhat.com>
|
|
48
|
+
morenod <dsanz@redhat.com>
|
|
49
|
+
morenod <dsanzmor@redhat.com>
|
|
45
50
|
qinchunhua <qin.chunhua@zte.com.cn>
|
|
46
51
|
qingszhao <zhao.daqing@99cloud.net>
|
|
47
52
|
rajat29 <rajat.sharma@nectechnologies.in>
|
|
@@ -1,6 +1,49 @@
|
|
|
1
1
|
CHANGES
|
|
2
2
|
=======
|
|
3
3
|
|
|
4
|
+
3.5.0
|
|
5
|
+
-----
|
|
6
|
+
|
|
7
|
+
* Add stable/2025.2 job
|
|
8
|
+
* Check for single instance migration to backup node
|
|
9
|
+
* Add Aetos jobs in check and experimental pipelines
|
|
10
|
+
* Add custom flavor and dynamic threshold to workload\_balance tests
|
|
11
|
+
* Add api test for skip action
|
|
12
|
+
* Add support for microversion testing for api and scenario tests
|
|
13
|
+
* Skip execute\_workload\_balance\_strategy\_cpu|ram due to known bug
|
|
14
|
+
* Create a function for deleting old injected metrics on prometheus
|
|
15
|
+
* Inject metrics for host total ram on prometheus
|
|
16
|
+
* Add workload\_stabilization RAM tests and adapt the current one for CPU
|
|
17
|
+
* Add tests for workload\_balance with injected data
|
|
18
|
+
* Add tests for workload balance with real data
|
|
19
|
+
* Fix injected host\_ram\_usage metrics
|
|
20
|
+
* Refact on creating instances and inject metrics
|
|
21
|
+
* Update tests on zone migration strategy
|
|
22
|
+
* Update tests for host maintenance strategy
|
|
23
|
+
* Move function for creating instances from 1 to variable number
|
|
24
|
+
* Add reusable method for getting enabled compute nodes
|
|
25
|
+
* Enforce compute host in create\_one\_instance\_per\_host
|
|
26
|
+
* Change destination node calculation on actuator tests
|
|
27
|
+
* Change timeframe of fake metrics uploaded to gnocchi
|
|
28
|
+
* Use get\_host\_for\_server and get\_host\_other\_than to get src/dst node
|
|
29
|
+
* Remove stable/2023.2 job
|
|
30
|
+
* Add metrics for RAM to gnocchi and prometheus injected data
|
|
31
|
+
* Add experimental pipeline to allow run jobs with real data
|
|
32
|
+
* Refactor of wait\_for\_instances\_in\_model function to wait until all instances are in the correct compute node on the model
|
|
33
|
+
* add pyproject.toml to support pip 23.1
|
|
34
|
+
* Add tests for host\_maintenance strategy with backup node
|
|
35
|
+
* Add check-uuid to pep8 tox tests
|
|
36
|
+
* Bug: 2107531. Adding unique uuid decorator to all watcher tests
|
|
37
|
+
* Ensure test\_execute\_workload\_stabilization\_strategy creates non-emtpy action nplan
|
|
38
|
+
* skip metric injection when not needed
|
|
39
|
+
* Replace UPPER\_CONSTRAINTS\_FILE
|
|
40
|
+
* Fix typo on bugs link
|
|
41
|
+
* Add stable/2025.1 job
|
|
42
|
+
* Add real-data scenario tests
|
|
43
|
+
* Add deprecation about client\_functional tests
|
|
44
|
+
* Check expected actions included in plans when executing strategies
|
|
45
|
+
* Drop watcherclient-tempest-functional job
|
|
46
|
+
|
|
4
47
|
3.4.0
|
|
5
48
|
-----
|
|
6
49
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: watcher-tempest-plugin
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.5.0
|
|
4
4
|
Summary: Tempest plugin watcher-tempest-plugin
|
|
5
5
|
Home-page: https://docs.openstack.org/watcher/latest/
|
|
6
6
|
Author: OpenStack
|
|
@@ -39,7 +39,7 @@ See the following docs to learn more:
|
|
|
39
39
|
* Documentation: https://docs.openstack.org/watcher-tempest-plugin/latest/
|
|
40
40
|
* Release notes: https://docs.openstack.org/releasenotes/watcher-tempest-plugin/
|
|
41
41
|
* Source: https://opendev.org/openstack/watcher-tempest-plugin
|
|
42
|
-
* Bugs: https://bugs.launchpad.net/watcher
|
|
42
|
+
* Bugs: https://bugs.launchpad.net/watcher-tempest-plugin
|
|
43
43
|
|
|
44
44
|
.. _Tempest: https://docs.openstack.org/tempest
|
|
45
45
|
.. _test plugin: https://docs.openstack.org/tempest/latest/plugin.html
|
|
@@ -11,7 +11,7 @@ See the following docs to learn more:
|
|
|
11
11
|
* Documentation: https://docs.openstack.org/watcher-tempest-plugin/latest/
|
|
12
12
|
* Release notes: https://docs.openstack.org/releasenotes/watcher-tempest-plugin/
|
|
13
13
|
* Source: https://opendev.org/openstack/watcher-tempest-plugin
|
|
14
|
-
* Bugs: https://bugs.launchpad.net/watcher
|
|
14
|
+
* Bugs: https://bugs.launchpad.net/watcher-tempest-plugin
|
|
15
15
|
|
|
16
16
|
.. _Tempest: https://docs.openstack.org/tempest
|
|
17
17
|
.. _test plugin: https://docs.openstack.org/tempest/latest/plugin.html
|
|
@@ -7,10 +7,11 @@ ignore_basepython_conflict = True
|
|
|
7
7
|
[testenv]
|
|
8
8
|
basepython = python3
|
|
9
9
|
usedevelop = True
|
|
10
|
-
install_command = pip install -c{env:
|
|
10
|
+
install_command = pip install -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} {opts} {packages}
|
|
11
11
|
setenv =
|
|
12
12
|
PYTHONWARNINGS=default::DeprecationWarning
|
|
13
13
|
deps =
|
|
14
|
+
-r{toxinidir}/requirements.txt
|
|
14
15
|
-r{toxinidir}/test-requirements.txt
|
|
15
16
|
commands = stestr run --slowest {posargs}
|
|
16
17
|
|
|
@@ -19,11 +20,12 @@ commands =
|
|
|
19
20
|
doc8 doc/source/ CONTRIBUTING.rst HACKING.rst README.rst
|
|
20
21
|
flake8
|
|
21
22
|
bandit -r watcher_tempest_plugin -x tests -n5 -ll
|
|
23
|
+
check-uuid --package watcher_tempest_plugin
|
|
22
24
|
|
|
23
25
|
[testenv:cover]
|
|
24
26
|
setenv =
|
|
25
27
|
{[testenv]setenv}
|
|
26
|
-
PYTHON=coverage run --source
|
|
28
|
+
PYTHON=coverage run --source watcher_tempest_plugin --parallel-mode
|
|
27
29
|
commands =
|
|
28
30
|
stestr run {posargs}
|
|
29
31
|
coverage combine
|
|
@@ -74,3 +76,6 @@ exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build,demo/,releasenotes
|
|
|
74
76
|
|
|
75
77
|
[doc8]
|
|
76
78
|
extension=.rst
|
|
79
|
+
|
|
80
|
+
[testenv:uuidgen]
|
|
81
|
+
commands = check-uuid --fix --package watcher_tempest_plugin
|
{watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.5.0}/watcher_tempest_plugin/config.py
RENAMED
|
@@ -109,4 +109,22 @@ OptimizationGroup = [
|
|
|
109
109
|
help="Namespace where OpenStack is deployed in a podified "
|
|
110
110
|
"control plane environment."
|
|
111
111
|
),
|
|
112
|
+
cfg.IntOpt(
|
|
113
|
+
"real_workload_period",
|
|
114
|
+
default=120,
|
|
115
|
+
help="In real-data test cases, the period of time during which "
|
|
116
|
+
"the load will be executed in seconds."
|
|
117
|
+
),
|
|
118
|
+
cfg.StrOpt(
|
|
119
|
+
"min_microversion",
|
|
120
|
+
default=None,
|
|
121
|
+
help="Lower version of the test target microversion range. "
|
|
122
|
+
"The format is 'X.Y', where 'X' and 'Y' are int values."
|
|
123
|
+
),
|
|
124
|
+
cfg.StrOpt(
|
|
125
|
+
"max_microversion",
|
|
126
|
+
default=None,
|
|
127
|
+
help="Upper version of the test target microversion range. "
|
|
128
|
+
"The format is 'X.Y', where 'X' and 'Y' are int values."
|
|
129
|
+
),
|
|
112
130
|
]
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Copyright 2025 Red Hat, Inc. All rights reserved.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
4
|
+
# not use this file except in compliance with the License. You may obtain
|
|
5
|
+
# a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
11
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
12
|
+
# License for the specific language governing permissions and limitations
|
|
13
|
+
# under the License.
|
|
14
|
+
|
|
15
|
+
import fixtures
|
|
16
|
+
|
|
17
|
+
from watcher_tempest_plugin.services.infra_optim.v1.json import client
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class APIMicroversionFixture(fixtures.Fixture):
|
|
21
|
+
"""API Microversion Fixture to set service microversion.
|
|
22
|
+
|
|
23
|
+
This class provides the fixture to set and reset the microversion
|
|
24
|
+
on service client. Service client has global variable to set the
|
|
25
|
+
microversion for that service API request.
|
|
26
|
+
This class can be used with useFixture: Example::
|
|
27
|
+
|
|
28
|
+
def setUp(self):
|
|
29
|
+
super(BaseInfraOptimTest, self).setUp()
|
|
30
|
+
self.useFixture(api_microversion_fixture.APIMicroversionFixture(
|
|
31
|
+
optimize_microversion=self.request_microversion))
|
|
32
|
+
This class only supports the Resource Optimization service.
|
|
33
|
+
|
|
34
|
+
:param str optimize_microversion: microvesion to be set on resource
|
|
35
|
+
optimization service client
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
def __init__(self, optimize_microversion):
|
|
39
|
+
self.optimize_microversion = optimize_microversion
|
|
40
|
+
|
|
41
|
+
def _setUp(self):
|
|
42
|
+
super(APIMicroversionFixture, self)._setUp()
|
|
43
|
+
client.INFRA_OPTIM_VERSION = self.optimize_microversion
|
|
44
|
+
self.addCleanup(self._reset_optimize_microversion)
|
|
45
|
+
|
|
46
|
+
def _reset_optimize_microversion(self):
|
|
47
|
+
client.INFRA_OPTIM_VERSION = None
|
|
@@ -19,7 +19,7 @@ from oslo_utils import uuidutils
|
|
|
19
19
|
from watcher_tempest_plugin.services import base
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
INFRA_OPTIM_VERSION =
|
|
22
|
+
INFRA_OPTIM_VERSION = None
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
class InfraOptimClientJSON(base.BaseClient):
|
|
@@ -279,6 +279,16 @@ class InfraOptimClientJSON(base.BaseClient):
|
|
|
279
279
|
"""
|
|
280
280
|
return self._show_request('/actions', action_uuid)
|
|
281
281
|
|
|
282
|
+
@base.handle_errors
|
|
283
|
+
def update_action(self, action_uuid, patch):
|
|
284
|
+
"""Update the specified action
|
|
285
|
+
|
|
286
|
+
:param action_uuid: The unique identifier of the action
|
|
287
|
+
:param patch: List of dicts representing json patches.
|
|
288
|
+
:return: Tuple with the server response and the updated action_plan
|
|
289
|
+
"""
|
|
290
|
+
return self._patch_request('/actions', action_uuid, patch)
|
|
291
|
+
|
|
282
292
|
# ### STRATEGIES ### #
|
|
283
293
|
|
|
284
294
|
@base.handle_errors
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
import json
|
|
16
16
|
|
|
17
17
|
from oslo_log import log
|
|
18
|
+
from urllib.parse import quote
|
|
18
19
|
|
|
19
20
|
from watcher_tempest_plugin.services import base
|
|
20
21
|
|
|
@@ -62,12 +63,15 @@ class PromtoolClient:
|
|
|
62
63
|
|
|
63
64
|
self.prometheus_url = url
|
|
64
65
|
self.prometheus_write_url = url + "/api/v1/write"
|
|
66
|
+
self.prometheus_delete_series_url = (
|
|
67
|
+
url + "/api/v1/admin/tsdb/delete_series")
|
|
65
68
|
# active targets
|
|
66
69
|
self.prometheus_targets_url = url + "/api/v1/targets?state=active"
|
|
67
70
|
self.prometheus_fqdn_label = prometheus_fqdn_label
|
|
68
71
|
self.promtool_cmd = [promtool_path]
|
|
69
72
|
if prometheus_ssl_cert:
|
|
70
73
|
self.promtool_cmd.insert(0, f"SSL_CERT_DIR={prometheus_ssl_cert}")
|
|
74
|
+
|
|
71
75
|
# Map hostnames and fqdn to prometheus instances
|
|
72
76
|
self._prometheus_instances = {}
|
|
73
77
|
|
|
@@ -122,6 +126,27 @@ class PromtoolClient:
|
|
|
122
126
|
|
|
123
127
|
return self.client.exec_cmd(cmd)
|
|
124
128
|
|
|
129
|
+
def delete_series(self, expr='{job="promtool"}'):
|
|
130
|
+
"""Delete prometheus time series with the specified parameters.
|
|
131
|
+
|
|
132
|
+
:param expr: expression to match the time series
|
|
133
|
+
:returns: Stdout output generated by the command.
|
|
134
|
+
"""
|
|
135
|
+
|
|
136
|
+
# Having a lot of problems passing the expression
|
|
137
|
+
# with double quotes both on direct command and
|
|
138
|
+
# ssh command so using url encoding
|
|
139
|
+
|
|
140
|
+
quoted_expr = quote(expr)
|
|
141
|
+
|
|
142
|
+
cmd = ['curl', '-s', '-k', '-X', 'POST', '-g',
|
|
143
|
+
self.prometheus_delete_series_url + '?match[]=' + quoted_expr]
|
|
144
|
+
|
|
145
|
+
LOG.debug(f"curl command: {' '.join(cmd)}")
|
|
146
|
+
out = self.client.exec_cmd(cmd)
|
|
147
|
+
if len(out) > 1:
|
|
148
|
+
LOG.debug(f"delete_series execution output: {out}")
|
|
149
|
+
|
|
125
150
|
def add_measures(self, input_data):
|
|
126
151
|
"""Add measures resources with the specified parameters.
|
|
127
152
|
|
|
@@ -18,16 +18,21 @@ import functools
|
|
|
18
18
|
import time
|
|
19
19
|
|
|
20
20
|
from tempest import config
|
|
21
|
+
from tempest.lib.common import api_version_utils
|
|
21
22
|
from tempest.lib.common.utils import data_utils
|
|
22
23
|
from tempest.lib.common.utils import test_utils
|
|
23
24
|
from tempest import test
|
|
24
25
|
|
|
25
26
|
from watcher_tempest_plugin import infra_optim_clients as clients
|
|
27
|
+
from watcher_tempest_plugin.services.infra_optim.v1.json import (
|
|
28
|
+
api_microversion_fixture
|
|
29
|
+
)
|
|
26
30
|
|
|
27
31
|
CONF = config.CONF
|
|
28
32
|
|
|
29
33
|
|
|
30
|
-
class BaseInfraOptimTest(
|
|
34
|
+
class BaseInfraOptimTest(api_version_utils.BaseMicroversionTest,
|
|
35
|
+
test.BaseTestCase):
|
|
31
36
|
"""Base class for Infrastructure Optimization API tests."""
|
|
32
37
|
|
|
33
38
|
# States where the object is waiting for some event to perform a transition
|
|
@@ -35,6 +40,7 @@ class BaseInfraOptimTest(test.BaseTestCase):
|
|
|
35
40
|
'FAILED',
|
|
36
41
|
'SUCCEEDED',
|
|
37
42
|
'CANCELLED',
|
|
43
|
+
'SUPERSEDED',
|
|
38
44
|
'SUSPENDED')
|
|
39
45
|
# States where the object can only be DELETED (end of its life-cycle)
|
|
40
46
|
FINISHED_STATES = ('FAILED',
|
|
@@ -48,6 +54,12 @@ class BaseInfraOptimTest(test.BaseTestCase):
|
|
|
48
54
|
if not CONF.service_available.watcher:
|
|
49
55
|
raise cls.skipException('Watcher support is required')
|
|
50
56
|
|
|
57
|
+
api_version_utils.check_skip_with_microversion(
|
|
58
|
+
cls.min_microversion,
|
|
59
|
+
cls.max_microversion,
|
|
60
|
+
CONF.optimize.min_microversion,
|
|
61
|
+
CONF.optimize.max_microversion)
|
|
62
|
+
|
|
51
63
|
@classmethod
|
|
52
64
|
def setup_credentials(cls):
|
|
53
65
|
super(BaseInfraOptimTest, cls).setup_credentials()
|
|
@@ -59,6 +71,11 @@ class BaseInfraOptimTest(test.BaseTestCase):
|
|
|
59
71
|
cls.client = cls.mgr.io_client
|
|
60
72
|
cls.gnocchi = cls.mgr.gn_client
|
|
61
73
|
|
|
74
|
+
def setUp(self):
|
|
75
|
+
super(BaseInfraOptimTest, self).setUp()
|
|
76
|
+
self.useFixture(api_microversion_fixture.APIMicroversionFixture(
|
|
77
|
+
optimize_microversion=self.request_microversion))
|
|
78
|
+
|
|
62
79
|
@classmethod
|
|
63
80
|
def resource_setup(cls):
|
|
64
81
|
super(BaseInfraOptimTest, cls).resource_setup()
|
|
@@ -71,6 +88,11 @@ class BaseInfraOptimTest(test.BaseTestCase):
|
|
|
71
88
|
# action plans to delete (including potential orphan one(s))
|
|
72
89
|
cls.created_action_plans_audit_uuids = set()
|
|
73
90
|
|
|
91
|
+
cls.request_microversion = (
|
|
92
|
+
api_version_utils.select_request_microversion(
|
|
93
|
+
cls.min_microversion,
|
|
94
|
+
CONF.optimize.min_microversion))
|
|
95
|
+
|
|
74
96
|
@classmethod
|
|
75
97
|
def resource_cleanup(cls):
|
|
76
98
|
"""Ensure that all created objects get destroyed."""
|
|
@@ -43,6 +43,7 @@ class TestShowListAction(base.BaseInfraOptimTest):
|
|
|
43
43
|
cls.action_plan = action_plans['action_plans'][0]
|
|
44
44
|
|
|
45
45
|
@decorators.attr(type='smoke')
|
|
46
|
+
@decorators.idempotent_id('0390c465-df10-460f-9924-ff3d14779395')
|
|
46
47
|
def test_show_one_action(self):
|
|
47
48
|
_, body = self.client.list_actions(
|
|
48
49
|
action_plan_uuid=self.action_plan["uuid"])
|
|
@@ -54,6 +55,7 @@ class TestShowListAction(base.BaseInfraOptimTest):
|
|
|
54
55
|
self.assertEqual("PENDING", action['state'])
|
|
55
56
|
|
|
56
57
|
@decorators.attr(type='smoke')
|
|
58
|
+
@decorators.idempotent_id('a5dd767a-6d4f-4d72-bd58-9ce69a6c327d')
|
|
57
59
|
def test_show_action_with_links(self):
|
|
58
60
|
_, body = self.client.list_actions(
|
|
59
61
|
action_plan_uuid=self.action_plan["uuid"])
|
|
@@ -66,6 +68,7 @@ class TestShowListAction(base.BaseInfraOptimTest):
|
|
|
66
68
|
self.assertIn(action['uuid'], action['links'][0]['href'])
|
|
67
69
|
|
|
68
70
|
@decorators.attr(type="smoke")
|
|
71
|
+
@decorators.idempotent_id('530a308a-f590-4af7-832d-1714ee3e4d59')
|
|
69
72
|
def test_list_actions(self):
|
|
70
73
|
_, body = self.client.list_actions()
|
|
71
74
|
|
|
@@ -75,6 +78,7 @@ class TestShowListAction(base.BaseInfraOptimTest):
|
|
|
75
78
|
action['links'][0]['href'])
|
|
76
79
|
|
|
77
80
|
@decorators.attr(type="smoke")
|
|
81
|
+
@decorators.idempotent_id('570ef821-af69-473d-989d-bbe86b585a78')
|
|
78
82
|
def test_list_actions_by_action_plan(self):
|
|
79
83
|
_, body = self.client.list_actions(
|
|
80
84
|
action_plan_uuid=self.action_plan["uuid"])
|
|
@@ -92,6 +96,7 @@ class TestShowListAction(base.BaseInfraOptimTest):
|
|
|
92
96
|
self.assertEqual(1, action_counter.get("sleep"))
|
|
93
97
|
|
|
94
98
|
@decorators.attr(type="smoke")
|
|
99
|
+
@decorators.idempotent_id('5aa8ff0c-aa8c-4488-a246-4e0c98180a69')
|
|
95
100
|
def test_list_actions_by_audit(self):
|
|
96
101
|
_, body = self.client.list_actions(audit_uuid=self.audit["uuid"])
|
|
97
102
|
|
|
@@ -106,3 +111,63 @@ class TestShowListAction(base.BaseInfraOptimTest):
|
|
|
106
111
|
self.assertEqual(3, len(body['actions']))
|
|
107
112
|
self.assertEqual(2, action_counter.get("nop"))
|
|
108
113
|
self.assertEqual(1, action_counter.get("sleep"))
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
class TestPatchAction(base.BaseInfraOptimTest):
|
|
117
|
+
"""Tests for patch actions"""
|
|
118
|
+
|
|
119
|
+
# Minimal version required for Actions Patch API
|
|
120
|
+
min_microversion = "1.5"
|
|
121
|
+
|
|
122
|
+
@classmethod
|
|
123
|
+
def setup(cls):
|
|
124
|
+
super(TestPatchAction, cls).setup()
|
|
125
|
+
|
|
126
|
+
@classmethod
|
|
127
|
+
def resource_setup(cls):
|
|
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'])
|
|
132
|
+
|
|
133
|
+
assert test_utils.call_until_true(
|
|
134
|
+
func=functools.partial(cls.has_audit_finished, cls.audit['uuid']),
|
|
135
|
+
duration=30,
|
|
136
|
+
sleep_for=.5
|
|
137
|
+
)
|
|
138
|
+
_, action_plans = cls.client.list_action_plans(
|
|
139
|
+
audit_uuid=cls.audit['uuid'])
|
|
140
|
+
cls.action_plan = action_plans['action_plans'][0]
|
|
141
|
+
|
|
142
|
+
@decorators.attr(type="smoke")
|
|
143
|
+
@decorators.idempotent_id('e2360342-8042-4faf-a028-5e63fd844387')
|
|
144
|
+
def test_skip_action(self):
|
|
145
|
+
_, body = self.client.list_actions(audit_uuid=self.audit["uuid"])
|
|
146
|
+
actions = body['actions']
|
|
147
|
+
|
|
148
|
+
_, action = self.client.show_action(actions[0]["uuid"])
|
|
149
|
+
action_plan = action['action_plan_uuid']
|
|
150
|
+
|
|
151
|
+
self.assertEqual("PENDING", action['state'])
|
|
152
|
+
self.client.update_action(
|
|
153
|
+
action['uuid'],
|
|
154
|
+
[{'op': 'replace', 'path': '/state', 'value': 'SKIPPED'},
|
|
155
|
+
{'op': 'replace', 'path': '/status_message',
|
|
156
|
+
'value': 'skipped test'}]
|
|
157
|
+
)
|
|
158
|
+
_, updated_action = self.client.show_action(actions[0]["uuid"])
|
|
159
|
+
|
|
160
|
+
self.assertEqual("SKIPPED", updated_action['state'])
|
|
161
|
+
self.assertEqual("Action skipped by user. Reason: skipped test",
|
|
162
|
+
updated_action['status_message'])
|
|
163
|
+
|
|
164
|
+
self.start_action_plan(action_plan)
|
|
165
|
+
|
|
166
|
+
_, action_plan = self.client.show_action_plan(action_plan)
|
|
167
|
+
self.assertEqual('SUCCEEDED', action_plan['state'])
|
|
168
|
+
|
|
169
|
+
_, final_body = self.client.list_actions(audit_uuid=self.audit["uuid"])
|
|
170
|
+
final_actions = final_body['actions']
|
|
171
|
+
self.assertEqual("SKIPPED", final_actions[0]['state'])
|
|
172
|
+
self.assertEqual("SUCCEEDED", final_actions[1]['state'])
|
|
173
|
+
self.assertEqual("SUCCEEDED", final_actions[2]['state'])
|
|
@@ -27,6 +27,7 @@ class TestCreateDeleteExecuteActionPlan(base.BaseInfraOptimTest):
|
|
|
27
27
|
"""Tests for action plans"""
|
|
28
28
|
|
|
29
29
|
@decorators.attr(type='smoke')
|
|
30
|
+
@decorators.idempotent_id('3ac90a92-1022-4868-b93d-ede7ef7b5041')
|
|
30
31
|
def test_create_action_plan(self):
|
|
31
32
|
_, goal = self.client.show_goal("dummy")
|
|
32
33
|
_, audit_template = self.create_audit_template(goal['uuid'])
|
|
@@ -47,6 +48,7 @@ class TestCreateDeleteExecuteActionPlan(base.BaseInfraOptimTest):
|
|
|
47
48
|
self.assertEqual('RECOMMENDED', action_plan['state'])
|
|
48
49
|
|
|
49
50
|
@decorators.attr(type='smoke')
|
|
51
|
+
@decorators.idempotent_id('621878a9-0a0b-4cf7-952f-6fd5a0cd613e')
|
|
50
52
|
def test_execute_action_plan(self):
|
|
51
53
|
_, goal = self.client.show_goal("dummy")
|
|
52
54
|
_, audit_template = self.create_audit_template(goal['uuid'])
|
|
@@ -70,6 +72,7 @@ class TestCreateDeleteExecuteActionPlan(base.BaseInfraOptimTest):
|
|
|
70
72
|
self.assertEqual('SUCCEEDED', action_plan['state'])
|
|
71
73
|
|
|
72
74
|
@decorators.attr(type='smoke')
|
|
75
|
+
@decorators.idempotent_id('67dbb485-5bcb-41d6-b19b-adc8e581eec8')
|
|
73
76
|
def test_delete_action_plan(self):
|
|
74
77
|
_, goal = self.client.show_goal("dummy")
|
|
75
78
|
_, audit_template = self.create_audit_template(goal['uuid'])
|
|
@@ -113,6 +116,7 @@ class TestShowListActionPlan(base.BaseInfraOptimTest):
|
|
|
113
116
|
cls.action_plan = action_plans['action_plans'][0]
|
|
114
117
|
|
|
115
118
|
@decorators.attr(type='smoke')
|
|
119
|
+
@decorators.idempotent_id('33465228-aac1-4688-9db3-6b1532c84323')
|
|
116
120
|
def test_show_action_plan(self):
|
|
117
121
|
_, action_plan = self.client.show_action_plan(
|
|
118
122
|
self.action_plan['uuid'])
|
|
@@ -120,6 +124,7 @@ class TestShowListActionPlan(base.BaseInfraOptimTest):
|
|
|
120
124
|
self.assert_expected(self.action_plan, action_plan)
|
|
121
125
|
|
|
122
126
|
@decorators.attr(type='smoke')
|
|
127
|
+
@decorators.idempotent_id('fec6938c-215e-41a1-a63b-65000051acdd')
|
|
123
128
|
def test_show_action_plan_detail(self):
|
|
124
129
|
_, action_plans = self.client.list_action_plans_detail(
|
|
125
130
|
audit_uuid=self.audit['uuid'])
|
|
@@ -129,6 +134,7 @@ class TestShowListActionPlan(base.BaseInfraOptimTest):
|
|
|
129
134
|
self.assert_expected(self.action_plan, action_plan)
|
|
130
135
|
|
|
131
136
|
@decorators.attr(type='smoke')
|
|
137
|
+
@decorators.idempotent_id('edf017b4-5685-466d-825d-751ba624e36e')
|
|
132
138
|
def test_show_action_plan_with_links(self):
|
|
133
139
|
_, action_plan = self.client.show_action_plan(
|
|
134
140
|
self.action_plan['uuid'])
|
|
@@ -138,6 +144,7 @@ class TestShowListActionPlan(base.BaseInfraOptimTest):
|
|
|
138
144
|
action_plan['links'][0]['href'])
|
|
139
145
|
|
|
140
146
|
@decorators.attr(type="smoke")
|
|
147
|
+
@decorators.idempotent_id('1978e51a-9af2-4d80-a2ba-46caf7fa6f04')
|
|
141
148
|
def test_list_action_plans(self):
|
|
142
149
|
_, body = self.client.list_action_plans()
|
|
143
150
|
self.assertIn(self.action_plan['uuid'],
|
|
@@ -148,6 +155,7 @@ class TestShowListActionPlan(base.BaseInfraOptimTest):
|
|
|
148
155
|
action_plan['links'][0]['href'])
|
|
149
156
|
|
|
150
157
|
@decorators.attr(type='smoke')
|
|
158
|
+
@decorators.idempotent_id('50e227a7-b173-40fb-8957-82989dba8bca')
|
|
151
159
|
def test_list_with_limit(self):
|
|
152
160
|
# We create 3 extra audits to exceed the limit we fix
|
|
153
161
|
for _ in range(3):
|
|
@@ -23,6 +23,7 @@ class TestApiDiscovery(base.BaseInfraOptimTest):
|
|
|
23
23
|
"""Tests for API discovery features."""
|
|
24
24
|
|
|
25
25
|
@decorators.attr(type='smoke')
|
|
26
|
+
@decorators.idempotent_id('e5c9cfc5-1890-4e8e-949e-ab2dca4d5595')
|
|
26
27
|
def test_api_versions(self):
|
|
27
28
|
_, descr = self.client.get_api_description()
|
|
28
29
|
expected_versions = ('v1',)
|
|
@@ -32,12 +33,14 @@ class TestApiDiscovery(base.BaseInfraOptimTest):
|
|
|
32
33
|
self.assertIn(v, versions)
|
|
33
34
|
|
|
34
35
|
@decorators.attr(type='smoke')
|
|
36
|
+
@decorators.idempotent_id('60602d80-fac7-44cc-a207-275dfcb62112')
|
|
35
37
|
def test_default_version(self):
|
|
36
38
|
_, descr = self.client.get_api_description()
|
|
37
39
|
default_version = descr['default_version']
|
|
38
40
|
self.assertEqual('v1', default_version['id'])
|
|
39
41
|
|
|
40
42
|
@decorators.attr(type='smoke')
|
|
43
|
+
@decorators.idempotent_id('79e4bfd1-a349-4dd3-bb32-e24586649255')
|
|
41
44
|
def test_version_1_resources(self):
|
|
42
45
|
_, descr = self.client.get_version_description(version='v1')
|
|
43
46
|
expected_resources = ('audit_templates', 'audits', 'action_plans',
|