watcher-tempest-plugin 3.4.0__tar.gz → 3.6.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.
Files changed (106) hide show
  1. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/.zuul.yaml +20 -8
  2. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/AUTHORS +6 -0
  3. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/ChangeLog +57 -0
  4. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/PKG-INFO +2 -2
  5. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/README.rst +1 -1
  6. watcher_tempest_plugin-3.6.0/pyproject.toml +3 -0
  7. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/test-requirements.txt +1 -0
  8. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/tox.ini +7 -2
  9. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/config.py +35 -0
  10. watcher_tempest_plugin-3.6.0/watcher_tempest_plugin/services/infra_optim/v1/json/api_microversion_fixture.py +47 -0
  11. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/services/infra_optim/v1/json/client.py +11 -1
  12. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/services/metric/prometheus_client.py +25 -0
  13. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/tests/api/admin/base.py +23 -1
  14. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/tests/api/admin/test_action.py +65 -0
  15. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/tests/api/admin/test_action_plan.py +8 -0
  16. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/tests/api/admin/test_api_discovery.py +3 -0
  17. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/tests/api/admin/test_audit.py +13 -0
  18. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/tests/api/admin/test_audit_template.py +12 -0
  19. watcher_tempest_plugin-3.6.0/watcher_tempest_plugin/tests/api/admin/test_data_model.py +65 -0
  20. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/tests/api/admin/test_goal.py +3 -0
  21. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/tests/api/admin/test_scoring_engine.py +3 -0
  22. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/tests/api/admin/test_service.py +3 -0
  23. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/tests/api/admin/test_strategy.py +3 -0
  24. watcher_tempest_plugin-3.6.0/watcher_tempest_plugin/tests/client_functional/__init__.py +30 -0
  25. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/tests/client_functional/v1/test_action.py +4 -0
  26. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/tests/client_functional/v1/test_action_plan.py +5 -0
  27. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/tests/client_functional/v1/test_audit.py +11 -0
  28. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/tests/client_functional/v1/test_audit_template.py +7 -0
  29. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/tests/client_functional/v1/test_goal.py +5 -0
  30. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/tests/client_functional/v1/test_scoring_engine.py +5 -0
  31. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/tests/client_functional/v1/test_service.py +5 -0
  32. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/tests/client_functional/v1/test_strategy.py +6 -0
  33. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/tests/scenario/base.py +514 -92
  34. watcher_tempest_plugin-3.6.0/watcher_tempest_plugin/tests/scenario/test_continuous_audit.py +171 -0
  35. watcher_tempest_plugin-3.6.0/watcher_tempest_plugin/tests/scenario/test_data_model.py +161 -0
  36. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/tests/scenario/test_execute_actuator.py +24 -23
  37. watcher_tempest_plugin-3.6.0/watcher_tempest_plugin/tests/scenario/test_execute_basic_optim.py +87 -0
  38. watcher_tempest_plugin-3.6.0/watcher_tempest_plugin/tests/scenario/test_execute_dummy_optim.py +61 -0
  39. watcher_tempest_plugin-3.6.0/watcher_tempest_plugin/tests/scenario/test_execute_host_maintenance.py +114 -0
  40. watcher_tempest_plugin-3.6.0/watcher_tempest_plugin/tests/scenario/test_execute_node_resource_consolidation.py +102 -0
  41. watcher_tempest_plugin-3.6.0/watcher_tempest_plugin/tests/scenario/test_execute_storage_balance.py +69 -0
  42. watcher_tempest_plugin-3.6.0/watcher_tempest_plugin/tests/scenario/test_execute_strategies_real.py +192 -0
  43. watcher_tempest_plugin-3.6.0/watcher_tempest_plugin/tests/scenario/test_execute_vm_workload_consolidation.py +91 -0
  44. watcher_tempest_plugin-3.6.0/watcher_tempest_plugin/tests/scenario/test_execute_workload_balance.py +137 -0
  45. watcher_tempest_plugin-3.6.0/watcher_tempest_plugin/tests/scenario/test_execute_workload_stabilization.py +121 -0
  46. watcher_tempest_plugin-3.6.0/watcher_tempest_plugin/tests/scenario/test_execute_zone_migration.py +197 -0
  47. watcher_tempest_plugin-3.6.0/watcher_tempest_plugin/utils.py +25 -0
  48. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin.egg-info/PKG-INFO +2 -2
  49. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin.egg-info/SOURCES.txt +10 -2
  50. watcher_tempest_plugin-3.6.0/watcher_tempest_plugin.egg-info/pbr.json +1 -0
  51. watcher_tempest_plugin-3.4.0/watcher_tempest_plugin/tests/scenario/__init__.py +0 -0
  52. watcher_tempest_plugin-3.4.0/watcher_tempest_plugin/tests/scenario/test_execute_basic_optim.py +0 -137
  53. watcher_tempest_plugin-3.4.0/watcher_tempest_plugin/tests/scenario/test_execute_dummy_optim.py +0 -91
  54. watcher_tempest_plugin-3.4.0/watcher_tempest_plugin/tests/scenario/test_execute_host_maintenance.py +0 -129
  55. watcher_tempest_plugin-3.4.0/watcher_tempest_plugin/tests/scenario/test_execute_storage_balance.py +0 -118
  56. watcher_tempest_plugin-3.4.0/watcher_tempest_plugin/tests/scenario/test_execute_strategies.py +0 -212
  57. watcher_tempest_plugin-3.4.0/watcher_tempest_plugin/tests/scenario/test_execute_vm_workload_consolidation.py +0 -140
  58. watcher_tempest_plugin-3.4.0/watcher_tempest_plugin/tests/scenario/test_execute_workload_balancing.py +0 -113
  59. watcher_tempest_plugin-3.4.0/watcher_tempest_plugin/tests/scenario/test_execute_zone_migration.py +0 -134
  60. watcher_tempest_plugin-3.4.0/watcher_tempest_plugin.egg-info/pbr.json +0 -1
  61. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/.coveragerc +0 -0
  62. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/.mailmap +0 -0
  63. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/.stestr.conf +0 -0
  64. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/.testr.conf +0 -0
  65. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/CONTRIBUTING.rst +0 -0
  66. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/HACKING.rst +0 -0
  67. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/LICENSE +0 -0
  68. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/doc/requirements.txt +0 -0
  69. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/doc/source/conf.py +0 -0
  70. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/doc/source/contributing.rst +0 -0
  71. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/doc/source/index.rst +0 -0
  72. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/doc/source/readme.rst +0 -0
  73. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/releasenotes/notes/.placeholder +0 -0
  74. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/releasenotes/notes/drop-py-2-7-eb1979587d237f5e.yaml +0 -0
  75. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/releasenotes/notes/drop-python38-support-eeb09a8bc0170ce2.yaml +0 -0
  76. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/releasenotes/source/_static/.placeholder +0 -0
  77. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/releasenotes/source/_templates/.placeholder +0 -0
  78. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/releasenotes/source/conf.py +0 -0
  79. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/releasenotes/source/index.rst +0 -0
  80. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/releasenotes/source/unreleased.rst +0 -0
  81. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/requirements.txt +0 -0
  82. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/setup.cfg +0 -0
  83. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/setup.py +0 -0
  84. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/__init__.py +0 -0
  85. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/infra_optim_clients.py +0 -0
  86. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/plugin.py +0 -0
  87. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/services/__init__.py +0 -0
  88. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/services/base.py +0 -0
  89. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/services/infra_optim/__init__.py +0 -0
  90. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/services/infra_optim/v1/__init__.py +0 -0
  91. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/services/infra_optim/v1/json/__init__.py +0 -0
  92. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/services/metric/__init__.py +0 -0
  93. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/services/metric/v1/__init__.py +0 -0
  94. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/services/metric/v1/json/__init__.py +0 -0
  95. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/services/metric/v1/json/client.py +0 -0
  96. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/tests/__init__.py +0 -0
  97. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/tests/api/__init__.py +0 -0
  98. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/tests/api/admin/__init__.py +0 -0
  99. {watcher_tempest_plugin-3.4.0/watcher_tempest_plugin/tests/client_functional → watcher_tempest_plugin-3.6.0/watcher_tempest_plugin/tests/client_functional/v1}/__init__.py +0 -0
  100. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin/tests/client_functional/v1/base.py +0 -0
  101. {watcher_tempest_plugin-3.4.0/watcher_tempest_plugin/tests/client_functional/v1 → watcher_tempest_plugin-3.6.0/watcher_tempest_plugin/tests/scenario}/__init__.py +0 -0
  102. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin.egg-info/dependency_links.txt +0 -0
  103. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin.egg-info/entry_points.txt +0 -0
  104. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin.egg-info/not-zip-safe +0 -0
  105. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.0}/watcher_tempest_plugin.egg-info/requires.txt +0 -0
  106. {watcher_tempest_plugin-3.4.0 → watcher_tempest_plugin-3.6.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>
@@ -37,11 +40,14 @@ digambar <digambarpatil15@yahoo.co.in>
37
40
  ghanshyam <gmann@ghanshyammann.com>
38
41
  gujin <gu.jin@99cloud.net>
39
42
  huang.zhiping <huang.zhiping@99cloud.net>
43
+ jgilaber <jgilaber@redhat.com>
40
44
  licanwei <li.canwei2@zte.com.cn>
41
45
  limin.lc <limin.lc@inspur.com>
42
46
  liyou01 <liyou01@inspur.com>
43
47
  maaoyu <maaoyu@inspur.com>
44
48
  malinga tembo <mtembo@redhat.com>
49
+ morenod <dsanz@redhat.com>
50
+ morenod <dsanzmor@redhat.com>
45
51
  qinchunhua <qin.chunhua@zte.com.cn>
46
52
  qingszhao <zhao.daqing@99cloud.net>
47
53
  rajat29 <rajat.sharma@nectechnologies.in>
@@ -1,6 +1,63 @@
1
1
  CHANGES
2
2
  =======
3
3
 
4
+ 3.6.0
5
+ -----
6
+
7
+ * Skip Storage Capacity test until it's fixed
8
+ * Add tests for extended compute datamodel
9
+ * Remove server\_state check from data\_model test
10
+ * Fail if action plan cannot be execute
11
+ * Remove resource\_setup skip checks
12
+ * Refactor execute\_strategy method into smaller helpers
13
+ * Organize strategy tests and remove duplicated tests
14
+ * Add basic datamodel list tests
15
+ * Add a scenario test with continuous audit
16
+
17
+ 3.5.0
18
+ -----
19
+
20
+ * Add stable/2025.2 job
21
+ * Add test for volume retype with zone migration
22
+ * Check for single instance migration to backup node
23
+ * Add Aetos jobs in check and experimental pipelines
24
+ * Add custom flavor and dynamic threshold to workload\_balance tests
25
+ * Add api test for skip action
26
+ * Add support for microversion testing for api and scenario tests
27
+ * Skip execute\_workload\_balance\_strategy\_cpu|ram due to known bug
28
+ * Create a function for deleting old injected metrics on prometheus
29
+ * Inject metrics for host total ram on prometheus
30
+ * Add workload\_stabilization RAM tests and adapt the current one for CPU
31
+ * Add tests for workload\_balance with injected data
32
+ * Add tests for workload balance with real data
33
+ * Fix injected host\_ram\_usage metrics
34
+ * Refact on creating instances and inject metrics
35
+ * Update tests on zone migration strategy
36
+ * Update tests for host maintenance strategy
37
+ * Move function for creating instances from 1 to variable number
38
+ * Add reusable method for getting enabled compute nodes
39
+ * Enforce compute host in create\_one\_instance\_per\_host
40
+ * Change destination node calculation on actuator tests
41
+ * Change timeframe of fake metrics uploaded to gnocchi
42
+ * Use get\_host\_for\_server and get\_host\_other\_than to get src/dst node
43
+ * Remove stable/2023.2 job
44
+ * Add metrics for RAM to gnocchi and prometheus injected data
45
+ * Add experimental pipeline to allow run jobs with real data
46
+ * Refactor of wait\_for\_instances\_in\_model function to wait until all instances are in the correct compute node on the model
47
+ * add pyproject.toml to support pip 23.1
48
+ * Add tests for host\_maintenance strategy with backup node
49
+ * Add check-uuid to pep8 tox tests
50
+ * Bug: 2107531. Adding unique uuid decorator to all watcher tests
51
+ * Ensure test\_execute\_workload\_stabilization\_strategy creates non-emtpy action nplan
52
+ * skip metric injection when not needed
53
+ * Replace UPPER\_CONSTRAINTS\_FILE
54
+ * Fix typo on bugs link
55
+ * Add stable/2025.1 job
56
+ * Add real-data scenario tests
57
+ * Add deprecation about client\_functional tests
58
+ * Check expected actions included in plans when executing strategies
59
+ * Drop watcherclient-tempest-functional job
60
+
4
61
  3.4.0
5
62
  -----
6
63
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: watcher-tempest-plugin
3
- Version: 3.4.0
3
+ Version: 3.6.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 plugin watcher-tempest-plugin
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 plugin watcher-tempest-plugin
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
@@ -0,0 +1,3 @@
1
+ [build-system]
2
+ requires = ["pbr>=6.0.0", "setuptools>=64.0.0"]
3
+ build-backend = "pbr.build"
@@ -2,6 +2,7 @@
2
2
  # of appearance. Changing the order has an impact on the overall integration
3
3
  # process, which may cause wedges in the gate later.
4
4
 
5
+ debtcollector>=1.2.0 # Apache-2.0
5
6
  hacking>=3.2
6
7
  stestr>=1.0.0 # Apache-2.0
7
8
  coverage!=4.4,>=4.0 # Apache-2.0
@@ -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:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} {opts} {packages}
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 ironic_tempest_plugin --parallel-mode
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
@@ -109,4 +109,39 @@ 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
+ ),
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
+ ),
112
147
  ]
@@ -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 = '1.4'
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(test.BaseTestCase):
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',