Merge ~gabrielcocenza/charm-openstack-service-checks:bug/1998333 into charm-openstack-service-checks:master

Proposed by Gabriel Cocenza
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)
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

To post a comment you must log in.
Revision history for this message
🤖 Canonical IS Merge Bot (canonical-is-mergebot) wrote :

This merge proposal is being monitored by mergebot. Change the status to Approved to merge.

Revision history for this message
🤖 prod-jenkaas-bootstack (prod-jenkaas-bootstack) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
🤖 prod-jenkaas-bootstack (prod-jenkaas-bootstack) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
🤖 prod-jenkaas-bootstack (prod-jenkaas-bootstack) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
🤖 prod-jenkaas-bootstack (prod-jenkaas-bootstack) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
🤖 prod-jenkaas-bootstack (prod-jenkaas-bootstack) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
🤖 prod-jenkaas-bootstack (prod-jenkaas-bootstack) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Martin Kalcok (martin-kalcok) wrote :

Two inline comments that I think are worth considering, otherwise LGTM.

Revision history for this message
🤖 prod-jenkaas-bootstack (prod-jenkaas-bootstack) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
JamesLin (jneo8) wrote :

LGTM

review: Approve
Revision history for this message
🤖 prod-jenkaas-bootstack (prod-jenkaas-bootstack) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
🤖 prod-jenkaas-bootstack (prod-jenkaas-bootstack) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
🤖 prod-jenkaas-bootstack (prod-jenkaas-bootstack) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
🤖 prod-jenkaas-bootstack (prod-jenkaas-bootstack) wrote :
review: Approve (continuous-integration)
Revision history for this message
Eric Chen (eric-chen) :
review: Approve
Revision history for this message
🤖 Canonical IS Merge Bot (canonical-is-mergebot) wrote :

Change successfully merged at revision b90b7cab7784da57b943a7d67a80cd00158d0577

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/lib/lib_openstack_service_checks.py b/src/lib/lib_openstack_service_checks.py
2index 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
62diff --git a/src/reactive/openstack_service_checks.py b/src/reactive/openstack_service_checks.py
63index 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")
85diff --git a/src/templates/nagios.novarc b/src/templates/nagios.novarc
86index 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
104diff --git a/src/tests/unit/requirements.txt b/src/tests/unit/requirements.txt
105index 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
116diff --git a/src/tests/unit/test_lib.py b/src/tests/unit/test_lib.py
117index 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)

Subscribers

People subscribed via source and target branches

to all changes: