Merge lp:~verterok/ubuntuone-client/fix-645519-stable-1-4 into lp:ubuntuone-client/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
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
Revision history for this message
Facundo Batista (facundo) wrote :

Looks ok

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',

Subscribers

People subscribed via source and target branches