Merge ~gabrielcocenza/charm-openstack-service-checks:bug/1998333 into charm-openstack-service-checks:master
- Git
- lp:~gabrielcocenza/charm-openstack-service-checks
- bug/1998333
- Merge into master
Status: | Merged |
---|---|
Approved by: | Eric Chen |
Approved revision: | 97dcb4cb3c2e676c01ecd8dc10aeda876e56faf9 |
Merged at revision: | b90b7cab7784da57b943a7d67a80cd00158d0577 |
Proposed branch: | ~gabrielcocenza/charm-openstack-service-checks:bug/1998333 |
Merge into: | charm-openstack-service-checks:master |
Diff against target: |
232 lines (+165/-0) 5 files modified
src/lib/lib_openstack_service_checks.py (+46/-0) src/reactive/openstack_service_checks.py (+5/-0) src/templates/nagios.novarc (+4/-0) src/tests/unit/requirements.txt (+1/-0) src/tests/unit/test_lib.py (+109/-0) |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Eric Chen | Approve | ||
🤖 prod-jenkaas-bootstack (community) | continuous-integration | Approve | |
JamesLin | Approve | ||
BootStack Reviewers | Pending | ||
Review via email: mp+434530@code.launchpad.net |
Commit message
render template using volume_api_version when related with keystone
- fix fcbtest snap channel for bionic. See lp #1999667
Closes-Bug: #1998333
Description of the change
🤖 Canonical IS Merge Bot (canonical-is-mergebot) wrote : | # |
🤖 prod-jenkaas-bootstack (prod-jenkaas-bootstack) wrote : | # |
FAILED: Continuous integration, rev:d883a6f356b
https:/
Executed test runs:
FAILURE: https:/
None: https:/
Click here to trigger a rebuild:
https:/
🤖 prod-jenkaas-bootstack (prod-jenkaas-bootstack) wrote : | # |
FAILED: Continuous integration, rev:509cc5f3e98
https:/
Executed test runs:
FAILURE: https:/
None: https:/
Click here to trigger a rebuild:
https:/
🤖 prod-jenkaas-bootstack (prod-jenkaas-bootstack) wrote : | # |
FAILED: Continuous integration, rev:2d009d09c3c
https:/
Executed test runs:
FAILURE: https:/
None: https:/
Click here to trigger a rebuild:
https:/
🤖 prod-jenkaas-bootstack (prod-jenkaas-bootstack) wrote : | # |
FAILED: Continuous integration, rev:3d6cc647658
https:/
Executed test runs:
FAILURE: https:/
None: https:/
Click here to trigger a rebuild:
https:/
🤖 prod-jenkaas-bootstack (prod-jenkaas-bootstack) wrote : | # |
FAILED: Continuous integration, rev:9764ff0fc06
https:/
Executed test runs:
FAILURE: https:/
None: https:/
Click here to trigger a rebuild:
https:/
🤖 prod-jenkaas-bootstack (prod-jenkaas-bootstack) wrote : | # |
FAILED: Continuous integration, rev:539ed36908b
https:/
Executed test runs:
FAILURE: https:/
None: https:/
Click here to trigger a rebuild:
https:/
Martin Kalcok (martin-kalcok) wrote : | # |
Two inline comments that I think are worth considering, otherwise LGTM.
🤖 prod-jenkaas-bootstack (prod-jenkaas-bootstack) wrote : | # |
FAILED: Continuous integration, rev:f2ba3d43e46
https:/
Executed test runs:
FAILURE: https:/
None: https:/
Click here to trigger a rebuild:
https:/
🤖 prod-jenkaas-bootstack (prod-jenkaas-bootstack) wrote : | # |
FAILED: Continuous integration, rev:97dcb4cb3c2
https:/
Executed test runs:
FAILURE: https:/
None: https:/
Click here to trigger a rebuild:
https:/
🤖 prod-jenkaas-bootstack (prod-jenkaas-bootstack) wrote : | # |
FAILED: Continuous integration, rev:97dcb4cb3c2
https:/
Executed test runs:
FAILURE: https:/
None: https:/
Click here to trigger a rebuild:
https:/
🤖 prod-jenkaas-bootstack (prod-jenkaas-bootstack) wrote : | # |
FAILED: Continuous integration, rev:97dcb4cb3c2
https:/
Executed test runs:
FAILURE: https:/
None: https:/
Click here to trigger a rebuild:
https:/
🤖 prod-jenkaas-bootstack (prod-jenkaas-bootstack) wrote : | # |
PASSED: Continuous integration, rev:97dcb4cb3c2
https:/
Executed test runs:
SUCCESS: https:/
None: https:/
Click here to trigger a rebuild:
https:/
Eric Chen (eric-chen) : | # |
🤖 Canonical IS Merge Bot (canonical-is-mergebot) wrote : | # |
Change successfully merged at revision b90b7cab7784da5
Preview Diff
1 | diff --git a/src/lib/lib_openstack_service_checks.py b/src/lib/lib_openstack_service_checks.py |
2 | index d9782e7..c0dc696 100644 |
3 | --- a/src/lib/lib_openstack_service_checks.py |
4 | +++ b/src/lib/lib_openstack_service_checks.py |
5 | @@ -1025,6 +1025,12 @@ class OSCHelper: |
6 | force=False, |
7 | ) |
8 | |
9 | + # NOTE(gabrielcocenza) See bug# 1999667 for more context. |
10 | + release = host.lsb_release()["DISTRIB_CODENAME"].lower() |
11 | + if host.CompareHostReleases(release) <= "bionic": |
12 | + hookenv.log("Refreshing fcbtest to channel V1/stable", hookenv.WARNING) |
13 | + fetch.snap.snap_refresh("fcbtest", "--channel=V1/stable") |
14 | + |
15 | for tool in ["rally", "tempest"]: |
16 | toolname = "fcbtest.{}init".format(tool) |
17 | installed = self._run_as(user, [toolname]) |
18 | @@ -1180,3 +1186,43 @@ class OSCHelper: |
19 | self.remove_rally_check() |
20 | unitdata.kv().set("rallyconfigured", False) |
21 | return True |
22 | + |
23 | + def get_cinder_api_version(self): |
24 | + """Get the cinder version to set on OS_VOLUME_API_VERSION.""" |
25 | + creds = self.get_keystone_credentials() |
26 | + if creds: |
27 | + try: |
28 | + self.get_keystone_client(creds) |
29 | + cinder_name = [ |
30 | + service |
31 | + for service in self.endpoint_service_names.values() |
32 | + if service.startswith("cinder") |
33 | + ][0] |
34 | + except IndexError as err: |
35 | + hookenv.log( |
36 | + f"Missing Cinder Service: {err}", |
37 | + hookenv.WARNING, |
38 | + ) |
39 | + hookenv.log( |
40 | + "Disconsider if your deployment doesn't have Cinder", |
41 | + hookenv.WARNING, |
42 | + ) |
43 | + return |
44 | + except OSCKeystoneError as keystone_error: |
45 | + error_status_message = ( |
46 | + "Failed to create endpoint checks due issue " |
47 | + "communicating with Keystone" |
48 | + ) |
49 | + hookenv.log( |
50 | + "{}. Error:\n{}".format(error_status_message, keystone_error), |
51 | + level=hookenv.ERROR, |
52 | + ) |
53 | + hookenv.status_set("blocked", keystone_error.workload_status) |
54 | + return |
55 | + |
56 | + try: |
57 | + return cinder_name.rsplit("v", maxsplit=1)[1] |
58 | + except IndexError as err: |
59 | + raise ValueError( |
60 | + f"Cinder API version {cinder_name} has unknown format" |
61 | + ) from err |
62 | diff --git a/src/reactive/openstack_service_checks.py b/src/reactive/openstack_service_checks.py |
63 | index 24f4122..e572128 100644 |
64 | --- a/src/reactive/openstack_service_checks.py |
65 | +++ b/src/reactive/openstack_service_checks.py |
66 | @@ -174,6 +174,10 @@ def get_credentials(): |
67 | "blocked", "Missing os-credentials vars: {}".format(error) |
68 | ) |
69 | return |
70 | + |
71 | + volume_api_version = helper.get_cinder_api_version() |
72 | + if volume_api_version: |
73 | + creds["volume_api_version"] = volume_api_version |
74 | return creds |
75 | |
76 | |
77 | @@ -267,6 +271,7 @@ def configure_nrpe_endpoints(): |
78 | def endpoints_changed(): |
79 | """Clear configured flag if endpoints are updated.""" |
80 | clear_flag("openstack-service-checks.endpoints.configured") |
81 | + clear_flag("openstack-service-checks.configured") |
82 | |
83 | |
84 | @when("openstack-service-checks.configured") |
85 | diff --git a/src/templates/nagios.novarc b/src/templates/nagios.novarc |
86 | index a6e6be8..7a72705 100644 |
87 | --- a/src/templates/nagios.novarc |
88 | +++ b/src/templates/nagios.novarc |
89 | @@ -1,10 +1,14 @@ |
90 | export OS_USERNAME={{ username }} |
91 | +{%- if tenant_name %} |
92 | export OS_TENANT_NAME={{ tenant_name }} |
93 | +{%- endif %} |
94 | export OS_PROJECT_NAME={{ project_name }} |
95 | export OS_PASSWORD={{ password }} |
96 | export OS_REGION_NAME={{ region }} |
97 | export OS_AUTH_URL={{ auth_url }} |
98 | +{%- if volume_api_version %} |
99 | export OS_VOLUME_API_VERSION={{ volume_api_version }} |
100 | +{%- endif %} |
101 | {%- if cacert %} |
102 | export OS_CACERT={{ cacert }} |
103 | export REQUESTS_CA_BUNDLE=$OS_CACERT |
104 | diff --git a/src/tests/unit/requirements.txt b/src/tests/unit/requirements.txt |
105 | index 6abbf5d..cdcd551 100644 |
106 | --- a/src/tests/unit/requirements.txt |
107 | +++ b/src/tests/unit/requirements.txt |
108 | @@ -3,6 +3,7 @@ charms.reactive |
109 | mock |
110 | pytest |
111 | pytest-cov |
112 | +pytest-mock |
113 | os-client-config |
114 | os-testr>=0.4.1 |
115 | requests>=2.18.4 |
116 | diff --git a/src/tests/unit/test_lib.py b/src/tests/unit/test_lib.py |
117 | index 12a2186..718a3ac 100644 |
118 | --- a/src/tests/unit/test_lib.py |
119 | +++ b/src/tests/unit/test_lib.py |
120 | @@ -554,3 +554,112 @@ def test_create_endpoint_checks__v3_services( |
121 | OSCHelper().create_endpoint_checks() |
122 | assert mock_render_http.call_count == result[0] |
123 | assert mock_render_https.call_count == result[1] |
124 | + |
125 | + |
126 | +@pytest.mark.parametrize( |
127 | + "endpoint_service_names, result", |
128 | + [ |
129 | + ( |
130 | + { |
131 | + "1606b9c42008495e96d323bbb9a45aa7": "cinderv3", |
132 | + "2438857485f34ffc9b9d550f7f5e73af": "nova", |
133 | + }, |
134 | + "3", |
135 | + ), |
136 | + ( |
137 | + { |
138 | + "1606b9c42008495e96d323bbb9a45aa7": "cinderv2", |
139 | + "2438857485f34ffc9b9d550f7f5e73af": "nova", |
140 | + }, |
141 | + "2", |
142 | + ), |
143 | + ( |
144 | + { |
145 | + "1606b9c42008495e96d323bbb9a45aa7": "cinderv1", |
146 | + "2438857485f34ffc9b9d550f7f5e73af": "nova", |
147 | + }, |
148 | + "1", |
149 | + ), |
150 | + ], |
151 | +) |
152 | +def test_get_cinder_api_version(mocker, endpoint_service_names, result): |
153 | + """Test get_cinder_api_version working as expected.""" |
154 | + mocker.patch("charmhelpers.core.hookenv.config", return_value={}) |
155 | + mocker.patch("lib_openstack_service_checks.OSCHelper.get_keystone_client") |
156 | + mocker.patch( |
157 | + "lib_openstack_service_checks.OSCHelper.get_keystone_credentials", |
158 | + return_value={ |
159 | + "auth_url": "auth_url", |
160 | + "project_name": "project_name", |
161 | + "username": "username", |
162 | + "password": "password", |
163 | + "region": "region_name", |
164 | + "user_domain_name": "user_domain_name", |
165 | + "project_domain_name": "project_domain_name", |
166 | + "app_version": "app_version", |
167 | + "auth_version": "auth_version", |
168 | + }, |
169 | + ) |
170 | + with mock.patch( |
171 | + "lib_openstack_service_checks.OSCHelper.endpoint_service_names", |
172 | + new_callable=mocker.PropertyMock, |
173 | + ) as mock_endpoint_name: |
174 | + mock_endpoint_name.return_value = endpoint_service_names |
175 | + assert OSCHelper().get_cinder_api_version() == result |
176 | + |
177 | + |
178 | +@pytest.mark.parametrize( |
179 | + "endpoint_service_names, expected_exception, err_msg", |
180 | + [ |
181 | + ( |
182 | + { |
183 | + "1606b9c42008495e96d323bbb9a45aa7": "keystone", |
184 | + "2438857485f34ffc9b9d550f7f5e73af": "nova", |
185 | + }, |
186 | + None, |
187 | + "Missing Cinder Service: list index out of range", |
188 | + ), |
189 | + ( |
190 | + { |
191 | + "1606b9c42008495e96d323bbb9a45aa7": "cinder", |
192 | + "2438857485f34ffc9b9d550f7f5e73af": "nova", |
193 | + }, |
194 | + ValueError, |
195 | + "Cinder API version cinder has unknown format", |
196 | + ), |
197 | + ], |
198 | +) |
199 | +def test_get_cinder_api_version_exceptions( |
200 | + mocker, endpoint_service_names, expected_exception, err_msg |
201 | +): |
202 | + """Test get_cinder_api_version exceptions.""" |
203 | + mocker.patch("charmhelpers.core.hookenv.config", return_value={}) |
204 | + mock_log = mocker.patch("charmhelpers.core.hookenv.log") |
205 | + mocker.patch("lib_openstack_service_checks.OSCHelper.get_keystone_client") |
206 | + mocker.patch( |
207 | + "lib_openstack_service_checks.OSCHelper.get_keystone_credentials", |
208 | + return_value={ |
209 | + "auth_url": "auth_url", |
210 | + "project_name": "project_name", |
211 | + "username": "username", |
212 | + "password": "password", |
213 | + "region": "region_name", |
214 | + "user_domain_name": "user_domain_name", |
215 | + "project_domain_name": "project_domain_name", |
216 | + "app_version": "app_version", |
217 | + "auth_version": "auth_version", |
218 | + }, |
219 | + ) |
220 | + with mock.patch( |
221 | + "lib_openstack_service_checks.OSCHelper.endpoint_service_names", |
222 | + new_callable=mocker.PropertyMock, |
223 | + ) as mock_endpoint_name: |
224 | + mock_endpoint_name.return_value = endpoint_service_names |
225 | + if expected_exception: |
226 | + with pytest.raises(expected_exception) as err: |
227 | + OSCHelper().get_cinder_api_version() |
228 | + assert str(err.value) == err_msg |
229 | + mock_log.assert_not_called() |
230 | + else: |
231 | + OSCHelper().get_cinder_api_version() |
232 | + mock_log.assert_any_call(err_msg, hookenv.WARNING) |
This merge proposal is being monitored by mergebot. Change the status to Approved to merge.