Merge ~niedbalski/ubuntu/+source/cinder:stable/newton into ~ubuntu-server-dev/ubuntu/+source/cinder:stable/newton
- Git
- lp:~niedbalski/ubuntu/+source/cinder
- stable/newton
- Merge into stable/newton
Proposed by
Jorge Niedbalski
Status: | Merged |
---|---|
Merged at revision: | 42e7a27b2c1068d6b8f0c103f7c0fb29a8bdff7f |
Proposed branch: | ~niedbalski/ubuntu/+source/cinder:stable/newton |
Merge into: | ~ubuntu-server-dev/ubuntu/+source/cinder:stable/newton |
Diff against target: |
335 lines (+314/-0) 3 files modified
debian/changelog (+7/-0) debian/patches/log-message-cleanup-for-volume-usage-audit.patch (+306/-0) debian/patches/series (+1/-0) |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Ubuntu Server Developers | Pending | ||
Review via email: mp+319623@code.launchpad.net |
Commit message
Description of the change
* d/p/log-
Fixes LP: #1631561.
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | diff --git a/debian/changelog b/debian/changelog |
2 | index 570a073..cdcd84a 100644 |
3 | --- a/debian/changelog |
4 | +++ b/debian/changelog |
5 | @@ -1,3 +1,10 @@ |
6 | +cinder (2:9.1.2-0ubuntu2) yakkety; urgency=medium |
7 | + |
8 | + * d/p/log-message-cleanup-for-volume-usage-audit.patch: |
9 | + Fixes LP: #1631561. |
10 | + |
11 | + -- Jorge Niedbalski <jorge.niedbalski@canonical.com> Fri, 10 Mar 2017 18:20:41 -0300 |
12 | + |
13 | cinder (2:9.1.2-0ubuntu1) yakkety; urgency=medium |
14 | |
15 | [ Corey Bryant ] |
16 | diff --git a/debian/patches/log-message-cleanup-for-volume-usage-audit.patch b/debian/patches/log-message-cleanup-for-volume-usage-audit.patch |
17 | new file mode 100644 |
18 | index 0000000..9421d04 |
19 | --- /dev/null |
20 | +++ b/debian/patches/log-message-cleanup-for-volume-usage-audit.patch |
21 | @@ -0,0 +1,306 @@ |
22 | +From 82792be330e3b88aa1f625537ae1d2649e14ba4f Mon Sep 17 00:00:00 2001 |
23 | +From: Zhiteng Huang <zhithuang@ebaysf.com> |
24 | +Date: Sat, 8 Oct 2016 13:03:37 -0700 |
25 | +Subject: [PATCH] Log message cleanup for volume-usage-audit |
26 | + |
27 | +volume-usage-audit utlis logs unecessary message at for deleted |
28 | +volumes or exception: |
29 | + |
30 | + try: |
31 | + LOG.debug('Send notification for vol X') |
32 | + _notify_func |
33 | + except Exception: |
34 | + LOG.exception(...) |
35 | + |
36 | +In the case when _notify_func raises exception, it logs |
37 | +'Send notification' and the exception. |
38 | + |
39 | +This change reduce logs by only logging 'Sent notification' when |
40 | +there is no exception by: |
41 | + |
42 | + try: |
43 | + _notify_func |
44 | + LOG.debug('Sent notification for vol X') |
45 | + except Exception: |
46 | + LOG.exception(...) |
47 | + |
48 | +Also, this change fixes notify_snapshot_usage() for not handling |
49 | +the case when source volume for the snapshot is deleted. |
50 | + |
51 | +Closes-bug: #1631561 |
52 | + |
53 | +Change-Id: Iff5448e888ee39bce1ff99c7bf48581d655fb687 |
54 | +--- |
55 | + cinder/cmd/volume_usage_audit.py | 80 +++++++++++++++++----------------- |
56 | + cinder/tests/unit/test_volume_utils.py | 46 +++++++++++++++++++ |
57 | + cinder/volume/utils.py | 14 +++++- |
58 | + 3 files changed, 99 insertions(+), 41 deletions(-) |
59 | + |
60 | +diff --git a/cinder/cmd/volume_usage_audit.py b/cinder/cmd/volume_usage_audit.py |
61 | +index ba8d38f..678d4e0 100644 |
62 | +--- a/cinder/cmd/volume_usage_audit.py |
63 | ++++ b/cinder/cmd/volume_usage_audit.py |
64 | +@@ -48,7 +48,7 @@ from cinder import i18n |
65 | + i18n.enable_lazy() |
66 | + from cinder import context |
67 | + from cinder import db |
68 | +-from cinder.i18n import _, _LE |
69 | ++from cinder.i18n import _, _LE, _LI |
70 | + from cinder import objects |
71 | + from cinder import rpc |
72 | + from cinder import utils |
73 | +@@ -95,9 +95,9 @@ def main(): |
74 | + 'end': end} |
75 | + LOG.error(msg) |
76 | + sys.exit(-1) |
77 | +- LOG.debug("Starting volume usage audit") |
78 | +- msg = _("Creating usages for %(begin_period)s until %(end_period)s") |
79 | +- LOG.debug(msg, {"begin_period": str(begin), "end_period": str(end)}) |
80 | ++ LOG.info(_LI("Starting volume usage audit")) |
81 | ++ msg = _LI("Creating usages for %(begin_period)s until %(end_period)s") |
82 | ++ LOG.info(msg, {"begin_period": str(begin), "end_period": str(end)}) |
83 | + |
84 | + extra_info = { |
85 | + 'audit_period_beginning': str(begin), |
86 | +@@ -107,19 +107,19 @@ def main(): |
87 | + volumes = db.volume_get_active_by_window(admin_context, |
88 | + begin, |
89 | + end) |
90 | +- LOG.debug("Found %d volumes", len(volumes)) |
91 | ++ LOG.info(_LI("Found %d volumes"), len(volumes)) |
92 | + for volume_ref in volumes: |
93 | + try: |
94 | +- LOG.debug("Send exists notification for <volume_id: " |
95 | ++ cinder.volume.utils.notify_about_volume_usage( |
96 | ++ admin_context, |
97 | ++ volume_ref, |
98 | ++ 'exists', extra_usage_info=extra_info) |
99 | ++ LOG.debug("Sent exists notification for <volume_id: " |
100 | + "%(volume_id)s> <project_id %(project_id)s> " |
101 | + "<%(extra_info)s>", |
102 | + {'volume_id': volume_ref.id, |
103 | + 'project_id': volume_ref.project_id, |
104 | + 'extra_info': extra_info}) |
105 | +- cinder.volume.utils.notify_about_volume_usage( |
106 | +- admin_context, |
107 | +- volume_ref, |
108 | +- 'exists', extra_usage_info=extra_info) |
109 | + except Exception as exc_msg: |
110 | + LOG.exception(_LE("Exists volume notification failed: %s"), |
111 | + exc_msg, resource=volume_ref) |
112 | +@@ -132,12 +132,6 @@ def main(): |
113 | + 'audit_period_beginning': str(volume_ref.created_at), |
114 | + 'audit_period_ending': str(volume_ref.created_at), |
115 | + } |
116 | +- LOG.debug("Send create notification for " |
117 | +- "<volume_id: %(volume_id)s> " |
118 | +- "<project_id %(project_id)s> <%(extra_info)s>", |
119 | +- {'volume_id': volume_ref.id, |
120 | +- 'project_id': volume_ref.project_id, |
121 | +- 'extra_info': local_extra_info}) |
122 | + cinder.volume.utils.notify_about_volume_usage( |
123 | + admin_context, |
124 | + volume_ref, |
125 | +@@ -146,6 +140,12 @@ def main(): |
126 | + admin_context, |
127 | + volume_ref, |
128 | + 'create.end', extra_usage_info=local_extra_info) |
129 | ++ LOG.debug("Sent create notification for " |
130 | ++ "<volume_id: %(volume_id)s> " |
131 | ++ "<project_id %(project_id)s> <%(extra_info)s>", |
132 | ++ {'volume_id': volume_ref.id, |
133 | ++ 'project_id': volume_ref.project_id, |
134 | ++ 'extra_info': local_extra_info}) |
135 | + except Exception as exc_msg: |
136 | + LOG.exception(_LE("Create volume notification failed: %s"), |
137 | + exc_msg, resource=volume_ref) |
138 | +@@ -158,12 +158,6 @@ def main(): |
139 | + 'audit_period_beginning': str(volume_ref.deleted_at), |
140 | + 'audit_period_ending': str(volume_ref.deleted_at), |
141 | + } |
142 | +- LOG.debug("Send delete notification for " |
143 | +- "<volume_id: %(volume_id)s> " |
144 | +- "<project_id %(project_id)s> <%(extra_info)s>", |
145 | +- {'volume_id': volume_ref.id, |
146 | +- 'project_id': volume_ref.project_id, |
147 | +- 'extra_info': local_extra_info}) |
148 | + cinder.volume.utils.notify_about_volume_usage( |
149 | + admin_context, |
150 | + volume_ref, |
151 | +@@ -172,24 +166,30 @@ def main(): |
152 | + admin_context, |
153 | + volume_ref, |
154 | + 'delete.end', extra_usage_info=local_extra_info) |
155 | ++ LOG.debug("Sent delete notification for " |
156 | ++ "<volume_id: %(volume_id)s> " |
157 | ++ "<project_id %(project_id)s> <%(extra_info)s>", |
158 | ++ {'volume_id': volume_ref.id, |
159 | ++ 'project_id': volume_ref.project_id, |
160 | ++ 'extra_info': local_extra_info}) |
161 | + except Exception as exc_msg: |
162 | + LOG.exception(_LE("Delete volume notification failed: %s"), |
163 | + exc_msg, resource=volume_ref) |
164 | + |
165 | + snapshots = objects.SnapshotList.get_active_by_window(admin_context, |
166 | + begin, end) |
167 | +- LOG.debug("Found %d snapshots", len(snapshots)) |
168 | ++ LOG.info(_LI("Found %d snapshots"), len(snapshots)) |
169 | + for snapshot_ref in snapshots: |
170 | + try: |
171 | +- LOG.debug("Send notification for <snapshot_id: %(snapshot_id)s> " |
172 | +- "<project_id %(project_id)s> <%(extra_info)s>", |
173 | +- {'snapshot_id': snapshot_ref.id, |
174 | +- 'project_id': snapshot_ref.project_id, |
175 | +- 'extra_info': extra_info}) |
176 | + cinder.volume.utils.notify_about_snapshot_usage(admin_context, |
177 | + snapshot_ref, |
178 | + 'exists', |
179 | + extra_info) |
180 | ++ LOG.debug("Sent notification for <snapshot_id: %(snapshot_id)s> " |
181 | ++ "<project_id %(project_id)s> <%(extra_info)s>", |
182 | ++ {'snapshot_id': snapshot_ref.id, |
183 | ++ 'project_id': snapshot_ref.project_id, |
184 | ++ 'extra_info': extra_info}) |
185 | + except Exception as exc_msg: |
186 | + LOG.exception(_LE("Exists snapshot notification failed: %s"), |
187 | + exc_msg, resource=snapshot_ref) |
188 | +@@ -202,12 +202,6 @@ def main(): |
189 | + 'audit_period_beginning': str(snapshot_ref.created_at), |
190 | + 'audit_period_ending': str(snapshot_ref.created_at), |
191 | + } |
192 | +- LOG.debug("Send create notification for " |
193 | +- "<snapshot_id: %(snapshot_id)s> " |
194 | +- "<project_id %(project_id)s> <%(extra_info)s>", |
195 | +- {'snapshot_id': snapshot_ref.id, |
196 | +- 'project_id': snapshot_ref.project_id, |
197 | +- 'extra_info': local_extra_info}) |
198 | + cinder.volume.utils.notify_about_snapshot_usage( |
199 | + admin_context, |
200 | + snapshot_ref, |
201 | +@@ -216,6 +210,12 @@ def main(): |
202 | + admin_context, |
203 | + snapshot_ref, |
204 | + 'create.end', extra_usage_info=local_extra_info) |
205 | ++ LOG.debug("Sent create notification for " |
206 | ++ "<snapshot_id: %(snapshot_id)s> " |
207 | ++ "<project_id %(project_id)s> <%(extra_info)s>", |
208 | ++ {'snapshot_id': snapshot_ref.id, |
209 | ++ 'project_id': snapshot_ref.project_id, |
210 | ++ 'extra_info': local_extra_info}) |
211 | + except Exception as exc_msg: |
212 | + LOG.exception(_LE("Create snapshot notification failed: %s"), |
213 | + exc_msg, resource=snapshot_ref) |
214 | +@@ -228,12 +228,6 @@ def main(): |
215 | + 'audit_period_beginning': str(snapshot_ref.deleted_at), |
216 | + 'audit_period_ending': str(snapshot_ref.deleted_at), |
217 | + } |
218 | +- LOG.debug("Send delete notification for " |
219 | +- "<snapshot_id: %(snapshot_id)s> " |
220 | +- "<project_id %(project_id)s> <%(extra_info)s>", |
221 | +- {'snapshot_id': snapshot_ref.id, |
222 | +- 'project_id': snapshot_ref.project_id, |
223 | +- 'extra_info': local_extra_info}) |
224 | + cinder.volume.utils.notify_about_snapshot_usage( |
225 | + admin_context, |
226 | + snapshot_ref, |
227 | +@@ -242,6 +236,12 @@ def main(): |
228 | + admin_context, |
229 | + snapshot_ref, |
230 | + 'delete.end', extra_usage_info=local_extra_info) |
231 | ++ LOG.debug("Sent delete notification for " |
232 | ++ "<snapshot_id: %(snapshot_id)s> " |
233 | ++ "<project_id %(project_id)s> <%(extra_info)s>", |
234 | ++ {'snapshot_id': snapshot_ref.id, |
235 | ++ 'project_id': snapshot_ref.project_id, |
236 | ++ 'extra_info': local_extra_info}) |
237 | + except Exception as exc_msg: |
238 | + LOG.exception(_LE("Delete snapshot notification failed: %s"), |
239 | + exc_msg, resource=snapshot_ref) |
240 | +diff --git a/cinder/tests/unit/test_volume_utils.py b/cinder/tests/unit/test_volume_utils.py |
241 | +index c49b113..bca8c71 100644 |
242 | +--- a/cinder/tests/unit/test_volume_utils.py |
243 | ++++ b/cinder/tests/unit/test_volume_utils.py |
244 | +@@ -166,6 +166,52 @@ class NotifyUsageTestCase(test.TestCase): |
245 | + } |
246 | + self.assertDictMatch(expected_snapshot, usage_info) |
247 | + |
248 | ++ @mock.patch('cinder.objects.Volume.get_by_id') |
249 | ++ def test_usage_from_deleted_snapshot(self, volume_get_by_id): |
250 | ++ raw_volume = { |
251 | ++ 'id': fake.VOLUME_ID, |
252 | ++ 'availability_zone': 'nova', |
253 | ++ 'deleted': 1 |
254 | ++ } |
255 | ++ ctxt = context.get_admin_context() |
256 | ++ volume_obj = fake_volume.fake_volume_obj(ctxt, **raw_volume) |
257 | ++ volume_get_by_id.side_effect = exception.VolumeNotFound( |
258 | ++ volume_id=fake.VOLUME_ID) |
259 | ++ |
260 | ++ raw_snapshot = { |
261 | ++ 'project_id': fake.PROJECT_ID, |
262 | ++ 'user_id': fake.USER_ID, |
263 | ++ 'volume': volume_obj, |
264 | ++ 'volume_id': fake.VOLUME_ID, |
265 | ++ 'volume_size': 1, |
266 | ++ 'id': fake.SNAPSHOT_ID, |
267 | ++ 'display_name': '11', |
268 | ++ 'created_at': '2014-12-11T10:10:00', |
269 | ++ 'status': fields.SnapshotStatus.ERROR, |
270 | ++ 'deleted': '', |
271 | ++ 'snapshot_metadata': [{'key': 'fake_snap_meta_key', |
272 | ++ 'value': 'fake_snap_meta_value'}], |
273 | ++ 'expected_attrs': ['metadata'], |
274 | ++ } |
275 | ++ |
276 | ++ snapshot_obj = fake_snapshot.fake_snapshot_obj(ctxt, **raw_snapshot) |
277 | ++ usage_info = volume_utils._usage_from_snapshot(snapshot_obj) |
278 | ++ expected_snapshot = { |
279 | ++ 'tenant_id': fake.PROJECT_ID, |
280 | ++ 'user_id': fake.USER_ID, |
281 | ++ 'availability_zone': '', |
282 | ++ 'volume_id': fake.VOLUME_ID, |
283 | ++ 'volume_size': 1, |
284 | ++ 'snapshot_id': fake.SNAPSHOT_ID, |
285 | ++ 'display_name': '11', |
286 | ++ 'created_at': 'DONTCARE', |
287 | ++ 'status': fields.SnapshotStatus.ERROR, |
288 | ++ 'deleted': '', |
289 | ++ 'metadata': six.text_type({'fake_snap_meta_key': |
290 | ++ u'fake_snap_meta_value'}), |
291 | ++ } |
292 | ++ self.assertDictMatch(expected_snapshot, usage_info) |
293 | ++ |
294 | + @mock.patch('cinder.db.volume_glance_metadata_get') |
295 | + @mock.patch('cinder.db.volume_attachment_get_all_by_volume_id') |
296 | + def test_usage_from_volume(self, mock_attachment, mock_image_metadata): |
297 | +diff --git a/cinder/volume/utils.py b/cinder/volume/utils.py |
298 | +index 0aec08a..c811e2d 100644 |
299 | +--- a/cinder/volume/utils.py |
300 | ++++ b/cinder/volume/utils.py |
301 | +@@ -149,10 +149,22 @@ def notify_about_backup_usage(context, backup, event_suffix, |
302 | + |
303 | + |
304 | + def _usage_from_snapshot(snapshot, **extra_usage_info): |
305 | ++ try: |
306 | ++ az = snapshot.volume['availability_zone'] |
307 | ++ except exception.VolumeNotFound: |
308 | ++ # (zhiteng) Snapshot's source volume could have been deleted |
309 | ++ # (which means snapshot has been deleted as well), |
310 | ++ # lazy-loading volume would raise VolumeNotFound exception. |
311 | ++ # In that case, not going any further by abusing low level |
312 | ++ # DB API to fetch deleted volume but simply return empty |
313 | ++ # string for snapshot's AZ info. |
314 | ++ az = '' |
315 | ++ LOG.debug("Source volume %s deleted", snapshot.volume_id) |
316 | ++ |
317 | + usage_info = { |
318 | + 'tenant_id': snapshot.project_id, |
319 | + 'user_id': snapshot.user_id, |
320 | +- 'availability_zone': snapshot.volume['availability_zone'], |
321 | ++ 'availability_zone': az, |
322 | + 'volume_id': snapshot.volume_id, |
323 | + 'volume_size': snapshot.volume_size, |
324 | + 'snapshot_id': snapshot.id, |
325 | +-- |
326 | +2.7.4 |
327 | + |
328 | diff --git a/debian/patches/series b/debian/patches/series |
329 | index 7abc008..238c9c6 100644 |
330 | --- a/debian/patches/series |
331 | +++ b/debian/patches/series |
332 | @@ -1,2 +1,3 @@ |
333 | google-back-requirements.patch |
334 | fix-long-casting.patch |
335 | +log-message-cleanup-for-volume-usage-audit.patch |