Merge lp:~verterok/ubuntuone-client/fix-645519-stable-1-4 into lp:ubuntuone-client/stable-1-4
- fix-645519-stable-1-4
- Merge into stable-1-4
Proposed by
Guillermo Gonzalez
Status: | Merged |
---|---|
Approved by: | Facundo Batista |
Approved revision: | 718 |
Merged at revision: | 724 |
Proposed branch: | lp:~verterok/ubuntuone-client/fix-645519-stable-1-4 |
Merge into: | lp:ubuntuone-client/stable-1-4 |
Diff against target: |
519 lines (+299/-23) 8 files modified
contrib/testing/testcase.py (+2/-0) tests/syncdaemon/test_action_queue.py (+50/-1) tests/syncdaemon/test_dbus.py (+69/-0) tests/syncdaemon/test_vm.py (+98/-11) ubuntuone/syncdaemon/action_queue.py (+30/-0) ubuntuone/syncdaemon/dbus_interface.py (+21/-11) ubuntuone/syncdaemon/event_queue.py (+4/-0) ubuntuone/syncdaemon/volume_manager.py (+25/-0) |
To merge this branch: | bzr merge lp:~verterok/ubuntuone-client/fix-645519-stable-1-4 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Facundo Batista (community) | Approve | ||
Natalia Bidart (community) | Approve | ||
Review via email: mp+36484@code.launchpad.net |
Commit message
Fix delete_share DBus method to actually delete shares
Description of the change
This branch fix delete_share DBus method to actually delete shares (from_me), and mainting support for deleting share volumes (to me).
To post a comment you must log in.
- 718. By Guillermo Gonzalez
-
fix duplicated docstring
Revision history for this message
Natalia Bidart (nataliabidart) : | # |
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'contrib/testing/testcase.py' |
2 | --- contrib/testing/testcase.py 2010-09-07 16:02:04 +0000 |
3 | +++ contrib/testing/testcase.py 2010-09-23 18:31:45 +0000 |
4 | @@ -145,6 +145,8 @@ |
5 | """Send the event.""" |
6 | self.eq.push('AQ_ANSWER_SHARE_OK', share_id, answer) |
7 | |
8 | + def delete_share(self, share_id): |
9 | + """Stub.""" |
10 | |
11 | def disconnect(self, *a, **k): |
12 | """Stub implementation.""" |
13 | |
14 | === modified file 'tests/syncdaemon/test_action_queue.py' |
15 | --- tests/syncdaemon/test_action_queue.py 2010-09-14 16:30:15 +0000 |
16 | +++ tests/syncdaemon/test_action_queue.py 2010-09-23 18:31:45 +0000 |
17 | @@ -51,7 +51,7 @@ |
18 | ActionQueue, ActionQueueCommand, ChangePublicAccess, CreateUDF, |
19 | DeleteVolume, Download, ListVolumes, |
20 | NoisyRequestQueue, RequestQueue, UploadProgressWrapper, Upload, |
21 | - CreateShare, GetPublicFiles, GetDelta, GetDeltaFromScratch, |
22 | + CreateShare, DeleteShare, GetPublicFiles, GetDelta, GetDeltaFromScratch, |
23 | TRANSFER_PROGRESS_THRESHOLD, Unlink, Move, MakeFile, MakeDir, |
24 | DeltaList, ZipQueue, DeferredMap, UniqueRequestQueue |
25 | ) |
26 | @@ -64,6 +64,7 @@ |
27 | VOLUME = uuid.UUID('12345678-1234-1234-1234-123456789abc') |
28 | NODE = uuid.UUID('FEDCBA98-7654-3211-2345-6789ABCDEF12') |
29 | USER = u'Dude' |
30 | +SHARE = uuid.uuid4() |
31 | |
32 | NO_OP = lambda *args, **kwargs: None |
33 | |
34 | @@ -2681,6 +2682,54 @@ |
35 | self.assertEqual(len(self.queue), 0) |
36 | |
37 | |
38 | +class DeleteShareTestCase(ConnectedBaseTestCase): |
39 | + """Test for DeleteShare ActionQueueCommand.""" |
40 | + |
41 | + @defer.inlineCallbacks |
42 | + def setUp(self): |
43 | + """Init.""" |
44 | + yield super(DeleteShareTestCase, self).setUp() |
45 | + request_queue = RequestQueue(name='fu', action_queue=self.action_queue) |
46 | + self.command = DeleteShare(request_queue, SHARE) |
47 | + vm = self.action_queue.main.vm |
48 | + self.patch(vm, 'handle_AQ_DELETE_SHARE_OK', NO_OP) |
49 | + self.patch(vm, 'handle_AQ_DELETE_SHARE_ERROR', NO_OP) |
50 | + |
51 | + def test_run_returns_a_deferred(self): |
52 | + """Test a deferred is returned.""" |
53 | + res = self.command._run() |
54 | + self.assertTrue(isinstance(res, defer.Deferred), 'deferred returned') |
55 | + |
56 | + def test_run_calls_protocol(self): |
57 | + """Test protocol's delete_volume is called.""" |
58 | + self.called = False |
59 | + def check(share_id): |
60 | + """Take control over client's feature.""" |
61 | + self.called = True |
62 | + self.assertEqual(SHARE, share_id) |
63 | + self.patch(self.command.action_queue.client, 'delete_share', check) |
64 | + self.command._run() |
65 | + self.assertTrue(self.called, "command wasn't called") |
66 | + |
67 | + def test_handle_success_push_event(self): |
68 | + """Test AQ_DELETE_SHARE_OK is pushed on success.""" |
69 | + request = client.DeleteShare(self.action_queue.client, SHARE) |
70 | + res = self.command.handle_success(success=request) |
71 | + events = [('AQ_DELETE_SHARE_OK', (), {'share_id': SHARE})] |
72 | + self.assertEqual(events, self.command.action_queue.event_queue.events) |
73 | + self.assertEqual(request, res) |
74 | + |
75 | + def test_handle_failure_push_event(self): |
76 | + """Test AQ_DELETE_SHARE_ERROR is pushed on failure.""" |
77 | + msg = 'Something went wrong' |
78 | + failure = Failure(DefaultException(msg)) |
79 | + res = self.command.handle_failure(failure=failure) |
80 | + events = [('AQ_DELETE_SHARE_ERROR', (), |
81 | + {'share_id': SHARE, 'error': msg})] |
82 | + self.assertEqual(events, self.command.action_queue.event_queue.events) |
83 | + self.assertTrue(res is None) |
84 | + |
85 | + |
86 | class SimpleAQTestCase(BasicTestCase): |
87 | """Simple tests for AQ API.""" |
88 | |
89 | |
90 | === modified file 'tests/syncdaemon/test_dbus.py' |
91 | --- tests/syncdaemon/test_dbus.py 2010-09-13 16:55:35 +0000 |
92 | +++ tests/syncdaemon/test_dbus.py 2010-09-23 18:31:45 +0000 |
93 | @@ -2885,6 +2885,31 @@ |
94 | error_handler=self.error_handler) |
95 | return d |
96 | |
97 | + def test_delete_share_from_me(self): |
98 | + """Test for Shares.delete_share with share from_me.""" |
99 | + share_path = os.path.join(self.main.shares_dir, 'share') |
100 | + share = Shared(path=share_path, volume_id='share_id', |
101 | + node_id='node_id', accepted=True) |
102 | + self.main.vm.add_shared(share) |
103 | + d = defer.Deferred() |
104 | + def delete_share(volume_id): |
105 | + """Fake delete_volume.""" |
106 | + self.main.event_q.push("AQ_DELETE_SHARE_OK", share_id=volume_id) |
107 | + self.patch(self.main.action_q, 'delete_share', delete_share) |
108 | + def deleted_handler(info): |
109 | + """ShareDeleted handler.""" |
110 | + self.assertRaises(KeyError, |
111 | + self.main.vm.shared.__getitem__, info['volume_id']) |
112 | + d.callback(True) |
113 | + match = self.bus.add_signal_receiver(deleted_handler, |
114 | + signal_name='ShareDeleted') |
115 | + self.signal_receivers.add(match) |
116 | + client = DBusClient(self.bus, '/shares', DBUS_IFACE_SHARES_NAME) |
117 | + client.call_method('delete_share', share.volume_id, |
118 | + reply_handler=lambda _: None, |
119 | + error_handler=self.error_handler) |
120 | + return d |
121 | + |
122 | def test_delete_share_error_signal(self): |
123 | """Test for Shares.delete_share with an error.""" |
124 | share_path = os.path.join(self.main.shares_dir, 'share') |
125 | @@ -2912,6 +2937,50 @@ |
126 | error_handler=self.error_handler) |
127 | return d |
128 | |
129 | + def test_delete_share_from_me_error(self): |
130 | + """Test failure of Shares.delete_share with a share from_me.""" |
131 | + share_path = os.path.join(self.main.shares_dir, 'share') |
132 | + share = Shared(path=share_path, volume_id='share_id', |
133 | + node_id='node_id', accepted=True) |
134 | + self.main.vm.add_shared(share) |
135 | + d = defer.Deferred() |
136 | + # patch delete_share to fail |
137 | + def delete_share(share_id): |
138 | + """Fake delete_share.""" |
139 | + self.main.event_q.push("AQ_DELETE_SHARE_ERROR", |
140 | + share_id=share_id, error="I'm broken") |
141 | + self.patch(self.main.action_q, 'delete_share', delete_share) |
142 | + def deleted_error_handler(info, error): |
143 | + """FolderDeleteError handler.""" |
144 | + self.assertEquals(info['volume_id'], share.volume_id) |
145 | + self.assertEquals(error, "I'm broken") |
146 | + d.callback(True) |
147 | + match = self.bus.add_signal_receiver(deleted_error_handler, |
148 | + signal_name='ShareDeleteError') |
149 | + self.signal_receivers.add(match) |
150 | + client = DBusClient(self.bus, '/shares', DBUS_IFACE_SHARES_NAME) |
151 | + client.call_method('delete_share', share.volume_id, |
152 | + reply_handler=lambda *args: None, |
153 | + error_handler=self.error_handler) |
154 | + return d |
155 | + |
156 | + def test_delete_share_from_me_doesnotexist(self): |
157 | + """Test failure of Shares.delete_share with a share from_me.""" |
158 | + d = defer.Deferred() |
159 | + # patch delete_share to fail |
160 | + def deleted_error_handler(info, error): |
161 | + """FolderDeleteError handler.""" |
162 | + self.assertEquals(info['volume_id'], 'missing_share_id') |
163 | + self.assertEquals(error, "DOES_NOT_EXIST") |
164 | + d.callback(True) |
165 | + match = self.bus.add_signal_receiver(deleted_error_handler, |
166 | + signal_name='ShareDeleteError') |
167 | + self.signal_receivers.add(match) |
168 | + client = DBusClient(self.bus, '/shares', DBUS_IFACE_SHARES_NAME) |
169 | + client.call_method('delete_share', 'missing_share_id', |
170 | + reply_handler=lambda *args: None, |
171 | + error_handler=self.error_handler) |
172 | + return d |
173 | |
174 | def test_suite(): |
175 | # pylint: disable-msg=C0111 |
176 | |
177 | === modified file 'tests/syncdaemon/test_vm.py' |
178 | --- tests/syncdaemon/test_vm.py 2010-09-16 20:38:05 +0000 |
179 | +++ tests/syncdaemon/test_vm.py 2010-09-23 18:31:45 +0000 |
180 | @@ -412,6 +412,63 @@ |
181 | share = self.vm.shared[str(expected_share_id)] |
182 | self.assertEquals(str(expected_node_id), share.node_id) |
183 | |
184 | + @defer.inlineCallbacks |
185 | + def test_delete_shared(self): |
186 | + """Test VolumeManager.delete_share.""" |
187 | + path = os.path.join(self.vm.root.path, 'shared_path') |
188 | + self.main.fs.create(path, "") |
189 | + self.main.fs.set_node_id(path, 'node_id') |
190 | + share = Shared(path=path, volume_id='share_id', node_id="node_id") |
191 | + self.vm.add_shared(share) |
192 | + |
193 | + def fake_delete_share(share_id): |
194 | + """Fake delete_share.""" |
195 | + self.assertEqual(share_id, share.volume_id) |
196 | + self.main.event_q.push('AQ_DELETE_SHARE_OK', share_id) |
197 | + |
198 | + self.patch(self.main.action_q, 'delete_share', fake_delete_share) |
199 | + d = defer.Deferred() |
200 | + self._listen_for('VM_SHARE_DELETED', d.callback, 1, collect=True) |
201 | + self.vm.delete_share(share.volume_id) |
202 | + events = yield d |
203 | + event = events[0] |
204 | + self.assertEqual(event[0], (share,)) |
205 | + |
206 | + @defer.inlineCallbacks |
207 | + def test_delete_shared_error(self): |
208 | + """Test VolumeManager.delete_share.""" |
209 | + path = os.path.join(self.vm.root.path, 'shared_path') |
210 | + self.main.fs.create(path, "") |
211 | + self.main.fs.set_node_id(path, 'node_id') |
212 | + share = Shared(path=path, volume_id='share_id', node_id="node_id") |
213 | + self.vm.add_shared(share) |
214 | + |
215 | + def fake_delete_share(share_id): |
216 | + """Fake delete_share that always fails.""" |
217 | + self.main.event_q.push('AQ_DELETE_SHARE_ERROR', |
218 | + share_id, 'a fake error') |
219 | + |
220 | + self.patch(self.main.action_q, 'delete_share', fake_delete_share) |
221 | + d = defer.Deferred() |
222 | + self._listen_for('VM_SHARE_DELETE_ERROR', d.callback, 1, collect=True) |
223 | + self.vm.delete_share(share.volume_id) |
224 | + events = yield d |
225 | + event = events[0] |
226 | + self.assertEqual(event[0], (share.volume_id, 'a fake error')) |
227 | + |
228 | + @defer.inlineCallbacks |
229 | + def test_delete_shared_error_missing_share(self): |
230 | + """Test VolumeManager.delete_share with a non-existent share.""" |
231 | + path = os.path.join(self.vm.root.path, 'shared_path') |
232 | + self.main.fs.create(path, "") |
233 | + self.main.fs.set_node_id(path, 'node_id') |
234 | + d = defer.Deferred() |
235 | + self._listen_for('VM_SHARE_DELETE_ERROR', d.callback, 1, collect=True) |
236 | + self.vm.delete_share('fake_share_id') |
237 | + events = yield d |
238 | + event = events[0] |
239 | + self.assertEqual(event[0], ('fake_share_id', 'DOES_NOT_EXIST')) |
240 | + |
241 | def test_accept_share(self): |
242 | """ Test the accept_share method. """ |
243 | d = defer.Deferred() |
244 | @@ -680,6 +737,37 @@ |
245 | self.assertTrue(os.path.exists(share.path), |
246 | 'share path missing on disk!') |
247 | |
248 | + @defer.inlineCallbacks |
249 | + def test_handle_AQ_DELETE_SHARE_OK(self): |
250 | + """Test for handle_AQ_DELETE_SHARE_OK.""" |
251 | + path = os.path.join(self.vm.root.path, 'shared_path') |
252 | + self.main.fs.create(path, "") |
253 | + self.main.fs.set_node_id(path, 'node_id') |
254 | + share = Shared(path=path, volume_id='share_id', node_id="node_id") |
255 | + self.vm.add_shared(share) |
256 | + d = defer.Deferred() |
257 | + self._listen_for('VM_SHARE_DELETED', d.callback, 1, collect=True) |
258 | + self.main.event_q.push('AQ_DELETE_SHARE_OK', 'share_id') |
259 | + events = yield d |
260 | + event = events[0] |
261 | + self.assertEqual(event[0], (share,)) |
262 | + |
263 | + @defer.inlineCallbacks |
264 | + def test_handle_AQ_DELETE_SHARE_ERROR(self): |
265 | + """Test for handle_AQ_DELETE_SHARE_ERROR.""" |
266 | + path = os.path.join(self.vm.root.path, 'shared_path') |
267 | + self.main.fs.create(path, "") |
268 | + self.main.fs.set_node_id(path, 'node_id') |
269 | + share = Shared(path=path, volume_id='share_id', node_id="node_id") |
270 | + self.vm.add_shared(share) |
271 | + d = defer.Deferred() |
272 | + self._listen_for('VM_SHARE_DELETE_ERROR', d.callback, 1, collect=True) |
273 | + self.main.event_q.push('AQ_DELETE_SHARE_ERROR', |
274 | + 'share_id', 'a fake error') |
275 | + events = yield d |
276 | + event = events[0] |
277 | + self.assertEqual(event[0], (share.volume_id, 'a fake error')) |
278 | + |
279 | |
280 | class VolumeManagerUnicodeTests(BaseVolumeManagerTests): |
281 | """Tests for Volume Manager unicode capabilities.""" |
282 | @@ -1008,8 +1096,8 @@ |
283 | """Test the handling of the AQ_LIST_VOLUMES event.""" |
284 | share_id = uuid.uuid4() |
285 | share_volume = volumes.ShareVolume(share_id, 'fake_share_uuid', None, |
286 | - 10, 'to_me', u'ñoño'.encode("utf8"), |
287 | - 'username', 'visible_username', |
288 | + 10, 'to_me', u'ñoño', |
289 | + 'username', u'visible_username', |
290 | True, 'View') |
291 | udf_id = uuid.uuid4() |
292 | udf_volume = volumes.UDFVolume(udf_id, 'udf_uuid', None, 10, u'~/ñoño') |
293 | @@ -1028,7 +1116,7 @@ |
294 | self.assertIn(str(share_id), self.vm.shares) |
295 | self.assertIn(str(udf_id), self.vm.udfs) |
296 | share = self.vm.shares[str(share_id)] |
297 | - self.assertEqual(u'ñoño'.encode("utf8"), share.name) |
298 | + self.assertEqual(u'ñoño', share.name) |
299 | self.assertEqual('fake_share_uuid', share.node_id) |
300 | udf = self.vm.udfs[str(udf_id)] |
301 | self.assertEqual('udf_uuid', udf.node_id) |
302 | @@ -1140,8 +1228,8 @@ |
303 | yield self.vm.add_udf(udf) |
304 | share_id = uuid.uuid4() |
305 | share_volume = volumes.ShareVolume(share_id, 'fake_share_uuid', None, |
306 | - 10, 'to_me', u'ñoño'.encode("utf8"), |
307 | - 'username', 'visible_username', |
308 | + 10, 'to_me', u'ñoño', |
309 | + 'username', u'visible_username', |
310 | True, 'View') |
311 | dir_name = self.vm._build_share_path(share_volume.share_name, |
312 | share_volume.other_visible_name) |
313 | @@ -1604,8 +1692,8 @@ |
314 | udf_volume = volumes.UDFVolume(udf_id, 'udf_uuid', None, 10, u'~/ñoño') |
315 | share_id = uuid.uuid4() |
316 | share_volume = volumes.ShareVolume(share_id, 'fake_share_uuid', None, |
317 | - 10, 'to_me', u'ñoño'.encode("utf8"), |
318 | - 'username', 'visible_username', |
319 | + 10, 'to_me', u'ñoño', |
320 | + 'username', u'visible_username', |
321 | True, 'View') |
322 | # initialize the the root |
323 | self.vm._got_root('root_uuid') |
324 | @@ -1656,8 +1744,8 @@ |
325 | """Test for handle_SV_VOLUME_DELETED.""" |
326 | share_id = uuid.uuid4() |
327 | share_volume = volumes.ShareVolume(share_id, 'fake_share_uuid', None, |
328 | - 10, 'to_me', u'ñoño'.encode("utf8"), |
329 | - 'username', 'visible_username', |
330 | + 10, 'to_me', u'ñoño', |
331 | + 'username', u'visible_username', |
332 | True, 'View') |
333 | dir_name = self.vm._build_share_path(share_volume.share_name, |
334 | share_volume.other_visible_name) |
335 | @@ -1665,8 +1753,7 @@ |
336 | share = Share.from_share_volume(share_volume, share_path) |
337 | # create a UDF |
338 | udf_id = uuid.uuid4() |
339 | - udf, udf_volume = self._create_udf(udf_id, 'udf_uuid', |
340 | - u'~/ñoño'.encode("utf8")) |
341 | + udf, udf_volume = self._create_udf(udf_id, 'udf_uuid', u'~/ñoño') |
342 | yield self.vm.add_udf(udf) |
343 | self.vm.add_share(share) |
344 | # initialize the the root |
345 | |
346 | === modified file 'ubuntuone/syncdaemon/action_queue.py' |
347 | --- ubuntuone/syncdaemon/action_queue.py 2010-09-14 16:30:15 +0000 |
348 | +++ ubuntuone/syncdaemon/action_queue.py 2010-09-23 18:31:45 +0000 |
349 | @@ -1016,6 +1016,10 @@ |
350 | return CreateShare(self.meta_queue, node_id, share_to, name, |
351 | access_level, marker).queue() |
352 | |
353 | + def delete_share(self, share_id): |
354 | + """Delete a offered share.""" |
355 | + return DeleteShare(self.meta_queue, share_id).queue() |
356 | + |
357 | def create_udf(self, path, name, marker): |
358 | """Create a User Defined Folder. |
359 | |
360 | @@ -1703,6 +1707,32 @@ |
361 | error=failure.getErrorMessage()) |
362 | |
363 | |
364 | +class DeleteShare(ActionQueueCommand): |
365 | + """Delete a offered Share.""" |
366 | + |
367 | + __slots__ = ('share_id',) |
368 | + |
369 | + def __init__(self, request_queue, share_id): |
370 | + super(DeleteShare, self).__init__(request_queue) |
371 | + self.share_id = share_id |
372 | + |
373 | + def _run(self): |
374 | + """Do the actual running.""" |
375 | + return self.action_queue.client.delete_share(self.share_id) |
376 | + |
377 | + def handle_success(self, success): |
378 | + """It worked! Push the event.""" |
379 | + self.action_queue.event_queue.push('AQ_DELETE_SHARE_OK', |
380 | + share_id=self.share_id) |
381 | + return success |
382 | + |
383 | + def handle_failure(self, failure): |
384 | + """It didn't work. Push the event.""" |
385 | + self.action_queue.event_queue.push('AQ_DELETE_SHARE_ERROR', |
386 | + share_id=self.share_id, |
387 | + error=failure.getErrorMessage()) |
388 | + |
389 | + |
390 | class CreateUDF(ActionQueueCommand): |
391 | """Create a new User Defined Folder.""" |
392 | |
393 | |
394 | === modified file 'ubuntuone/syncdaemon/dbus_interface.py' |
395 | --- ubuntuone/syncdaemon/dbus_interface.py 2010-09-16 16:54:48 +0000 |
396 | +++ ubuntuone/syncdaemon/dbus_interface.py 2010-09-23 18:31:45 +0000 |
397 | @@ -788,6 +788,16 @@ |
398 | self.handle_default('VM_SHARE_CREATED', share_id) |
399 | self.dbus_iface.shares.emit_new_share(share_id) |
400 | |
401 | + def handle_VM_SHARE_DELETED(self, share): |
402 | + """Handle VM_SHARE_DELETED event, emit NewShare event.""" |
403 | + self.handle_default('VM_SHARE_DELETED', getattr(share, 'id', share)) |
404 | + self.dbus_iface.shares.emit_share_changed('deleted', share) |
405 | + |
406 | + def handle_VM_SHARE_DELETE_ERROR(self, share_id, error): |
407 | + """Handle VM_DELETE_SHARE_ERROR event, emit ShareCreateError signal.""" |
408 | + self.handle_default('VM_SHARE_DELETE_ERROR', share_id, error) |
409 | + self.dbus_iface.shares.ShareDeleteError(dict(volume_id=share_id), error) |
410 | + |
411 | def handle_VM_VOLUME_DELETED(self, volume): |
412 | """Handle VM_VOLUME_DELETED event. |
413 | |
414 | @@ -804,7 +814,7 @@ |
415 | "volume_id=%r as it's not a share or UDF", volume.id) |
416 | |
417 | def handle_VM_VOLUME_DELETE_ERROR(self, volume_id, error): |
418 | - """Handle VM_SHARE_DELETED event, emit ShareDeleted event.""" |
419 | + """Handle VM_VOLUME_DELETE_ERROR event, emit ShareDeleted event.""" |
420 | self.handle_default('VM_VOLUME_DELETE_ERROR', volume_id, error) |
421 | try: |
422 | volume = self.dbus_iface.volume_manager.get_volume(volume_id) |
423 | @@ -1131,21 +1141,21 @@ |
424 | str(share_id))) |
425 | |
426 | @dbus.service.method(DBUS_IFACE_SHARES_NAME, |
427 | - in_signature='s', out_signature='', |
428 | - async_callbacks=('reply_handler', 'error_handler')) |
429 | - def delete_share(self, share_id, reply_handler=None, error_handler=None): |
430 | - """Delete a Share.""" |
431 | + in_signature='s', out_signature='') |
432 | + def delete_share(self, share_id): |
433 | + """Delete a Share, both kinds: "to me" and "from me".""" |
434 | logger.debug('delete_share: %r', share_id) |
435 | try: |
436 | - self.vm.delete_volume(str(share_id)) |
437 | - reply_handler() |
438 | - except VolumeDoesNotExist, e: |
439 | - self.ShareDeleteError({'volume_id':share_id}, str(e)) |
440 | + try: |
441 | + self.vm.delete_volume(str(share_id)) |
442 | + except VolumeDoesNotExist: |
443 | + # isn't a volume! it might be a "share from me (a.k.a shared)" |
444 | + self.vm.delete_share(str(share_id)) |
445 | except Exception, e: |
446 | - error_handler(e) |
447 | logger.exception('Error while deleting share: %r', share_id) |
448 | self.ShareDeleteError({'volume_id':share_id}, str(e)) |
449 | - |
450 | + # propagate the error |
451 | + raise |
452 | |
453 | @dbus.service.signal(DBUS_IFACE_SHARES_NAME, |
454 | signature='a{ss}') |
455 | |
456 | === modified file 'ubuntuone/syncdaemon/event_queue.py' |
457 | --- ubuntuone/syncdaemon/event_queue.py 2010-08-31 14:19:53 +0000 |
458 | +++ ubuntuone/syncdaemon/event_queue.py 2010-09-23 18:31:45 +0000 |
459 | @@ -69,6 +69,8 @@ |
460 | 'AQ_LIST_SHARES_ERROR': ('error',), |
461 | 'AQ_CREATE_SHARE_OK': ('share_id', 'marker'), |
462 | 'AQ_CREATE_SHARE_ERROR': ('marker', 'error'), |
463 | + 'AQ_DELETE_SHARE_OK': ('share_id',), |
464 | + 'AQ_DELETE_SHARE_ERROR': ('share_id', 'error'), |
465 | 'AQ_QUERY_ERROR': ('item', 'error'), |
466 | 'AQ_ANSWER_SHARE_OK': ('share_id', 'answer'), |
467 | 'AQ_ANSWER_SHARE_ERROR': ('share_id', 'answer', 'error'), |
468 | @@ -145,6 +147,8 @@ |
469 | 'VM_UDF_CREATED': ('udf',), |
470 | 'VM_UDF_CREATE_ERROR': ('path', 'error'), |
471 | 'VM_SHARE_CREATED': ('share_id',), |
472 | + 'VM_SHARE_DELETED': ('udf',), |
473 | + 'VM_SHARE_DELETE_ERROR': ('path', 'error'), |
474 | 'VM_VOLUME_DELETED': ('volume',), |
475 | 'VM_VOLUME_DELETE_ERROR': ('volume_id', 'error'), |
476 | 'VM_SHARE_CHANGED': ('share_id',), |
477 | |
478 | === modified file 'ubuntuone/syncdaemon/volume_manager.py' |
479 | --- ubuntuone/syncdaemon/volume_manager.py 2010-09-16 20:38:05 +0000 |
480 | +++ ubuntuone/syncdaemon/volume_manager.py 2010-09-23 18:31:45 +0000 |
481 | @@ -717,6 +717,22 @@ |
482 | if marker in self.marker_share_map: |
483 | del self.marker_share_map[marker] |
484 | |
485 | + def handle_AQ_DELETE_SHARE_OK(self, share_id): |
486 | + """Handle AQ_DELETE_SHARE_OK event.""" |
487 | + share = self.shared.get(share_id) |
488 | + if share is not None: |
489 | + del self.shared[share_id] |
490 | + self.m.event_q.push('VM_SHARE_DELETED', share) |
491 | + else: |
492 | + # delete ok, of something we don't have. |
493 | + self.log.warning("AQ_DELETE_SHARE_OK of a non-existing shared " |
494 | + "dir: %s", share_id) |
495 | + |
496 | + def handle_AQ_DELETE_SHARE_ERROR(self, share_id, error): |
497 | + """Gandle AQ_DELETE_SHARE_ERROR event.""" |
498 | + self.log.error("Error while deleting offered share: %s", error) |
499 | + self.m.event_q.push('VM_SHARE_DELETE_ERROR', share_id, error) |
500 | + |
501 | def handle_SV_SHARE_ANSWERED(self, share_id, answer): |
502 | """ handle SV_SHARE_ANSWERED event. """ |
503 | share = self.shared.get(share_id, None) |
504 | @@ -908,6 +924,15 @@ |
505 | self.m.action_q.create_share(node_id, username, name, |
506 | access_level, marker) |
507 | |
508 | + def delete_share(self, share_id): |
509 | + """Reuqest the deletion of an offered share.""" |
510 | + share = self.shared.get(share_id) |
511 | + if share is None: |
512 | + # if the share isn't there, push the error! |
513 | + self.m.event_q.push('VM_SHARE_DELETE_ERROR', share_id, "DOES_NOT_EXIST") |
514 | + else: |
515 | + self.m.action_q.delete_share(share_id) |
516 | + |
517 | def add_shared(self, share): |
518 | """ Add a share with direction == from_me """ |
519 | self.log.info('New shared subtree: id: %s - path: %r', |
Looks ok