watcher-tempest-plugin 3.6.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.
Files changed (101) hide show
  1. watcher_tempest_plugin-3.7.0/.zuul.yaml +59 -0
  2. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/AUTHORS +1 -0
  3. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/ChangeLog +17 -0
  4. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/PKG-INFO +13 -4
  5. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/setup.cfg +2 -2
  6. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/config.py +11 -0
  7. watcher_tempest_plugin-3.7.0/watcher_tempest_plugin/tests/api/admin/base.py +114 -0
  8. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/api/admin/test_action.py +49 -23
  9. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/api/admin/test_action_plan.py +25 -10
  10. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/api/admin/test_audit.py +254 -78
  11. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/api/admin/test_audit_template.py +6 -7
  12. watcher_tempest_plugin-3.7.0/watcher_tempest_plugin/tests/common/base.py +375 -0
  13. watcher_tempest_plugin-3.7.0/watcher_tempest_plugin/tests/scenario/__init__.py +0 -0
  14. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/scenario/base.py +9 -92
  15. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/scenario/test_continuous_audit.py +11 -1
  16. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/scenario/test_execute_zone_migration.py +150 -13
  17. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin.egg-info/PKG-INFO +13 -4
  18. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin.egg-info/SOURCES.txt +2 -0
  19. watcher_tempest_plugin-3.7.0/watcher_tempest_plugin.egg-info/pbr.json +1 -0
  20. watcher_tempest_plugin-3.6.0/.zuul.yaml +0 -49
  21. watcher_tempest_plugin-3.6.0/watcher_tempest_plugin/tests/api/admin/base.py +0 -378
  22. watcher_tempest_plugin-3.6.0/watcher_tempest_plugin.egg-info/pbr.json +0 -1
  23. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/.coveragerc +0 -0
  24. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/.mailmap +0 -0
  25. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/.stestr.conf +0 -0
  26. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/.testr.conf +0 -0
  27. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/CONTRIBUTING.rst +0 -0
  28. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/HACKING.rst +0 -0
  29. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/LICENSE +0 -0
  30. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/README.rst +0 -0
  31. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/doc/requirements.txt +0 -0
  32. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/doc/source/conf.py +0 -0
  33. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/doc/source/contributing.rst +0 -0
  34. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/doc/source/index.rst +0 -0
  35. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/doc/source/readme.rst +0 -0
  36. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/pyproject.toml +0 -0
  37. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/releasenotes/notes/.placeholder +0 -0
  38. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/releasenotes/notes/drop-py-2-7-eb1979587d237f5e.yaml +0 -0
  39. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/releasenotes/notes/drop-python38-support-eeb09a8bc0170ce2.yaml +0 -0
  40. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/releasenotes/source/_static/.placeholder +0 -0
  41. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/releasenotes/source/_templates/.placeholder +0 -0
  42. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/releasenotes/source/conf.py +0 -0
  43. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/releasenotes/source/index.rst +0 -0
  44. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/releasenotes/source/unreleased.rst +0 -0
  45. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/requirements.txt +0 -0
  46. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/setup.py +0 -0
  47. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/test-requirements.txt +0 -0
  48. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/tox.ini +0 -0
  49. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/__init__.py +0 -0
  50. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/infra_optim_clients.py +0 -0
  51. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/plugin.py +0 -0
  52. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/services/__init__.py +0 -0
  53. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/services/base.py +0 -0
  54. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/services/infra_optim/__init__.py +0 -0
  55. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/services/infra_optim/v1/__init__.py +0 -0
  56. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/services/infra_optim/v1/json/__init__.py +0 -0
  57. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/services/infra_optim/v1/json/api_microversion_fixture.py +0 -0
  58. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/services/infra_optim/v1/json/client.py +0 -0
  59. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/services/metric/__init__.py +0 -0
  60. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/services/metric/prometheus_client.py +0 -0
  61. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/services/metric/v1/__init__.py +0 -0
  62. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/services/metric/v1/json/__init__.py +0 -0
  63. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/services/metric/v1/json/client.py +0 -0
  64. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/__init__.py +0 -0
  65. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/api/__init__.py +0 -0
  66. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/api/admin/__init__.py +0 -0
  67. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/api/admin/test_api_discovery.py +0 -0
  68. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/api/admin/test_data_model.py +0 -0
  69. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/api/admin/test_goal.py +0 -0
  70. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/api/admin/test_scoring_engine.py +0 -0
  71. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/api/admin/test_service.py +0 -0
  72. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/api/admin/test_strategy.py +0 -0
  73. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/client_functional/__init__.py +0 -0
  74. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/client_functional/v1/__init__.py +0 -0
  75. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/client_functional/v1/base.py +0 -0
  76. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/client_functional/v1/test_action.py +0 -0
  77. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/client_functional/v1/test_action_plan.py +0 -0
  78. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/client_functional/v1/test_audit.py +0 -0
  79. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/client_functional/v1/test_audit_template.py +0 -0
  80. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/client_functional/v1/test_goal.py +0 -0
  81. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/client_functional/v1/test_scoring_engine.py +0 -0
  82. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/client_functional/v1/test_service.py +0 -0
  83. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/client_functional/v1/test_strategy.py +0 -0
  84. {watcher_tempest_plugin-3.6.0/watcher_tempest_plugin/tests/scenario → watcher_tempest_plugin-3.7.0/watcher_tempest_plugin/tests/common}/__init__.py +0 -0
  85. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/scenario/test_data_model.py +0 -0
  86. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/scenario/test_execute_actuator.py +0 -0
  87. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/scenario/test_execute_basic_optim.py +0 -0
  88. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/scenario/test_execute_dummy_optim.py +0 -0
  89. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/scenario/test_execute_host_maintenance.py +0 -0
  90. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/scenario/test_execute_node_resource_consolidation.py +0 -0
  91. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/scenario/test_execute_storage_balance.py +0 -0
  92. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/scenario/test_execute_strategies_real.py +0 -0
  93. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/scenario/test_execute_vm_workload_consolidation.py +0 -0
  94. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/scenario/test_execute_workload_balance.py +0 -0
  95. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/tests/scenario/test_execute_workload_stabilization.py +0 -0
  96. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin/utils.py +0 -0
  97. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin.egg-info/dependency_links.txt +0 -0
  98. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin.egg-info/entry_points.txt +0 -0
  99. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin.egg-info/not-zip-safe +0 -0
  100. {watcher_tempest_plugin-3.6.0 → watcher_tempest_plugin-3.7.0}/watcher_tempest_plugin.egg-info/requires.txt +0 -0
  101. {watcher_tempest_plugin-3.6.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>
@@ -1,6 +1,23 @@
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
+
4
21
  3.6.0
5
22
  -----
6
23
 
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: watcher-tempest-plugin
3
- Version: 3.6.0
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
- Requires-Python: >=3.9
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
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 =
@@ -144,4 +144,15 @@ OptimizationGroup = [
144
144
  "`watcher_cluster_data_model_collectors` period configuration is "
145
145
  "less than 300 seconds."
146
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
+ ),
147
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
- @classmethod
30
- def resource_setup(cls):
31
- super(TestShowListAction, cls).resource_setup()
32
- _, cls.goal = cls.client.show_goal("DUMMY")
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(cls.has_audit_finished, cls.audit['uuid']),
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
- _, action_plans = cls.client.list_action_plans(
42
- audit_uuid=cls.audit['uuid'])
43
- cls.action_plan = action_plans['action_plans'][0]
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
- @classmethod
123
- def setup(cls):
124
- super(TestPatchAction, cls).setup()
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
- @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'])
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(cls.has_audit_finished, cls.audit['uuid']),
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
- _, action_plans = cls.client.list_action_plans(
139
- audit_uuid=cls.audit['uuid'])
140
- cls.action_plan = action_plans['action_plans'][0]
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
- @classmethod
102
- def resource_setup(cls):
103
- super(TestShowListActionPlan, cls).resource_setup()
104
- _, cls.goal = cls.client.show_goal("dummy")
105
- _, cls.audit_template = cls.create_audit_template(cls.goal['uuid'])
106
- _, cls.audit = cls.create_audit(cls.audit_template['uuid'])
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(cls.has_audit_finished, cls.audit['uuid']),
122
+ func=functools.partial(
123
+ self.has_audit_finished, self.audit['uuid']),
110
124
  duration=30,
111
125
  sleep_for=.5
112
126
  )
113
- _, action_plans = cls.client.list_action_plans(
114
- audit_uuid=cls.audit['uuid'])
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
- cls.action_plan = action_plans['action_plans'][0]
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')