Merge lp:~verterok/ubuntuone-client/fix-583412-stable into lp:ubuntuone-client/stable-1-2

Proposed by Guillermo Gonzalez
Status: Merged
Approved by: Stuart Colville
Approved revision: 513
Merged at revision: 514
Proposed branch: lp:~verterok/ubuntuone-client/fix-583412-stable
Merge into: lp:ubuntuone-client/stable-1-2
Diff against target: 241 lines (+72/-27)
5 files modified
tests/syncdaemon/test_dbus.py (+28/-5)
tests/syncdaemon/test_vm.py (+8/-0)
ubuntuone/syncdaemon/dbus_interface.py (+12/-8)
ubuntuone/syncdaemon/filesystem_manager.py (+2/-1)
ubuntuone/syncdaemon/volume_manager.py (+22/-13)
To merge this branch: bzr merge lp:~verterok/ubuntuone-client/fix-583412-stable
Reviewer Review Type Date Requested Status
Stuart Colville (community) Approve
Rick McBride (community) Approve
Review via email: mp+26623@code.launchpad.net

Commit message

Fix dbus_interface error handling in Folders.delete (and Shares.delete_share) when the volume_id is invalid.

Description of the change

Fix syncdaemon dbus interface when Folders.delete (or Shares.delete_share) is called with an invalid udf id, now the correct error signal is fired.

To post a comment you must log in.
Revision history for this message
Rick McBride (rmcbride) wrote :

+1

review: Approve
Revision history for this message
Stuart Colville (muffinresearch) wrote :

tests pass - looks good.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'tests/syncdaemon/test_dbus.py'
2--- tests/syncdaemon/test_dbus.py 2010-05-17 22:23:56 +0000
3+++ tests/syncdaemon/test_dbus.py 2010-06-02 18:23:20 +0000
4@@ -37,7 +37,12 @@
5 DBUS_IFACE_PUBLIC_FILES_NAME,
6 EventListener,
7 )
8-from ubuntuone.syncdaemon.volume_manager import Share, Shared, UDF
9+from ubuntuone.syncdaemon.volume_manager import (
10+ Share,
11+ Shared,
12+ UDF,
13+ VolumeDoesNotExist,
14+)
15 from ubuntuone.syncdaemon.tools import DBusClient
16 from ubuntuone.syncdaemon import event_queue, states, main, config
17 from contrib.testing.testcase import (
18@@ -2036,7 +2041,7 @@
19 """FolderDeleted handler."""
20 self.assertRaises(KeyError, self.main.fs.get_by_path,
21 info['path'].decode('utf-8'))
22- self.assertRaises(KeyError, self.main.vm.get_volume, info['volume_id'])
23+ self.assertRaises(VolumeDoesNotExist, self.main.vm.get_volume, info['volume_id'])
24 d.callback(True)
25 match = self.bus.add_signal_receiver(deleted_handler,
26 signal_name='FolderDeleted')
27@@ -2045,7 +2050,7 @@
28 """the callback"""
29 self.assertNotIn(udf.volume_id, self.main.vm.udfs)
30 self.assertRaises(KeyError, self.main.fs.get_by_path, udf.path)
31- self.assertRaises(KeyError, self.main.vm.get_volume, udf.volume_id)
32+ self.assertRaises(VolumeDoesNotExist, self.main.vm.get_volume, udf.volume_id)
33 self.folders_client.call_method('delete', udf.volume_id,
34 reply_handler=check_deleted,
35 error_handler=self.error_handler)
36@@ -2078,6 +2083,24 @@
37 return d
38
39 @defer.inlineCallbacks
40+ def test_delete_error_signal_folder_id(self):
41+ """Test for FolderDeleteError for a volume that doesn't exists."""
42+ udf_id = 'foobar'
43+ d = defer.Deferred()
44+ def deleted_error_handler(info, error):
45+ """FolderDeleteError handler"""
46+ d.callback((info, error))
47+ match = self.bus.add_signal_receiver(deleted_error_handler,
48+ signal_name='FolderDeleteError')
49+ self.signal_receivers.add(match)
50+ self.folders_client.call_method('delete', udf_id,
51+ reply_handler=lambda *args: None,
52+ error_handler=d.errback)
53+ info, error = yield d
54+ self.assertEquals(info['volume_id'], udf_id)
55+ self.assertEquals(error, "DOES_NOT_EXIST")
56+
57+ @defer.inlineCallbacks
58 def test_subscribe(self):
59 """Test for Folders.subscribe and that it fires a dbus signal."""
60 suggested_path = u'~/ñoño'
61@@ -2182,7 +2205,7 @@
62 """FolderDeleted handler."""
63 self.assertRaises(KeyError, self.main.fs.get_by_path,
64 info['path'].decode('utf-8'))
65- self.assertRaises(KeyError, self.main.vm.get_volume, info['volume_id'])
66+ self.assertRaises(VolumeDoesNotExist, self.main.vm.get_volume, info['volume_id'])
67 d.callback(True)
68 match = self.bus.add_signal_receiver(deleted_handler,
69 signal_name='ShareDeleted')
70@@ -2191,7 +2214,7 @@
71 """the callback"""
72 self.assertNotIn(share.volume_id, self.main.vm.shares)
73 self.assertRaises(KeyError, self.main.fs.get_by_path, share.path)
74- self.assertRaises(KeyError, self.main.vm.get_volume, share.volume_id)
75+ self.assertRaises(VolumeDoesNotExist, self.main.vm.get_volume, share.volume_id)
76 client = DBusClient(self.bus, '/shares', DBUS_IFACE_SHARES_NAME)
77 client.call_method('delete_share', share.volume_id,
78 reply_handler=check_deleted,
79
80=== modified file 'tests/syncdaemon/test_vm.py'
81--- tests/syncdaemon/test_vm.py 2010-05-25 21:00:09 +0000
82+++ tests/syncdaemon/test_vm.py 2010-06-02 18:23:20 +0000
83@@ -46,6 +46,7 @@
84 LegacyShareFileShelf,
85 MetadataUpgrader,
86 VMFileShelf,
87+ VolumeDoesNotExist,
88 )
89 from twisted.internet import defer, reactor
90
91@@ -1376,6 +1377,13 @@
92 self.vm.delete_volume(udf.volume_id)
93 yield d
94
95+ def test_handle_AQ_DELETE_VOLUME_ERROR_missing_volume(self):
96+ """Test for handle_AQ_DELETE_VOLUME_ERROR for a missing volume."""
97+ volume_id = 'foobar'
98+ self.assertRaises(VolumeDoesNotExist,
99+ self.vm.handle_AQ_DELETE_VOLUME_ERROR,
100+ volume_id=volume_id, error="ERROR!")
101+
102 def _test_handle_SV_VOLUME_CREATED(self, auto_subscribe):
103 """Test for handle_SV_VOLUME_CREATED."""
104 user_conf = config.get_user_config()
105
106=== modified file 'ubuntuone/syncdaemon/dbus_interface.py'
107--- ubuntuone/syncdaemon/dbus_interface.py 2010-05-17 22:23:56 +0000
108+++ ubuntuone/syncdaemon/dbus_interface.py 2010-06-02 18:23:20 +0000
109@@ -32,7 +32,7 @@
110 from ubuntuone.syncdaemon.event_queue import EVENTS
111 from ubuntuone.syncdaemon.interfaces import IMarker
112 from ubuntuone.syncdaemon import config
113-from ubuntuone.syncdaemon.volume_manager import Share, UDF
114+from ubuntuone.syncdaemon.volume_manager import Share, UDF, VolumeDoesNotExist
115
116
117 # Disable the "Invalid Name" check here, as we have lots of DBus style names
118@@ -669,9 +669,9 @@
119 self.handle_default('VM_VOLUME_DELETE_ERROR', volume_id, error)
120 try:
121 volume = self.dbus_iface.volume_manager.get_volume(volume_id)
122- except KeyError:
123+ except VolumeDoesNotExist:
124 logger.error("Unable to handle VM_VOLUME_DELETE_ERROR for "
125- "volume_id=%r", volume_id)
126+ "volume_id=%r, no such volume.", volume_id)
127 else:
128 if isinstance(volume, Share):
129 self.dbus_iface.shares.emit_share_delete_error(volume, error)
130@@ -886,10 +886,12 @@
131 try:
132 self.vm.delete_volume(str(share_id))
133 reply_handler()
134- except KeyError:
135- error_handler(ValueError("The volume with id: %s don't exists" % \
136- str(share_id)))
137-
138+ except VolumeDoesNotExist, e:
139+ self.ShareDeleteError({'volume_id':share_id}, str(e))
140+ except Exception, e:
141+ error_handler(e)
142+ logger.exception('Error while deleting share: %r', share_id)
143+ self.ShareDeleteError({'volume_id':share_id}, str(e))
144
145 @dbus.service.signal(DBUS_IFACE_SHARES_NAME,
146 signature='a{ss}')
147@@ -1269,9 +1271,11 @@
148 logger.debug('Folders.delete: %r', folder_id)
149 try:
150 self.vm.delete_volume(folder_id)
151+ except VolumeDoesNotExist, e:
152+ self.FolderDeleteError({'volume_id':folder_id}, str(e))
153 except Exception, e:
154 logger.exception('Error while deleting volume: %r', folder_id)
155- self.emit_folder_delete_error({'id':folder_id}, str(e))
156+ self.FolderDeleteError({'volume_id':folder_id}, str(e))
157
158 @dbus.service.method(DBUS_IFACE_FOLDERS_NAME, out_signature='aa{ss}')
159 def get_folders(self):
160
161=== modified file 'ubuntuone/syncdaemon/filesystem_manager.py'
162--- ubuntuone/syncdaemon/filesystem_manager.py 2010-03-26 20:24:15 +0000
163+++ ubuntuone/syncdaemon/filesystem_manager.py 2010-06-02 18:23:20 +0000
164@@ -29,6 +29,7 @@
165 import stat
166
167 from ubuntuone.syncdaemon import file_shelf
168+from ubuntuone.syncdaemon.volume_manager import VolumeDoesNotExist
169 import uuid
170
171 METADATA_VERSION = "4"
172@@ -277,7 +278,7 @@
173 # check if the share exists
174 try:
175 self._get_share(mdobj["share_id"])
176- except KeyError:
177+ except VolumeDoesNotExist:
178 # oops, the share is gone!, invalidate this mdid
179 log_warning('Share %r disappeared! deleting mdid: %s', mdobj['share_id'], mdid)
180 del self.fs[mdid]
181
182=== modified file 'ubuntuone/syncdaemon/volume_manager.py'
183--- ubuntuone/syncdaemon/volume_manager.py 2010-05-25 21:00:09 +0000
184+++ ubuntuone/syncdaemon/volume_manager.py 2010-06-02 18:23:20 +0000
185@@ -276,6 +276,20 @@
186 return result
187
188
189+class VolumeDoesNotExist(Exception):
190+ """Exception for non existing volumes."""
191+
192+ msg = 'DOES_NOT_EXIST'
193+
194+ def __init__(self, volume_id):
195+ """Create the instance."""
196+ super(VolumeDoesNotExist, self).__init__(self.msg, volume_id)
197+
198+ def __str__(self):
199+ """The error message."""
200+ return self.msg
201+
202+
203 class VolumeManager(object):
204 """Manages shares and mount points."""
205
206@@ -807,13 +821,13 @@
207 del self.udfs[udf_id]
208 self.m.event_q.push('VM_VOLUME_DELETED', udf)
209
210- def get_volume(self, id):
211+ def get_volume(self, volume_id):
212 """Returns the Share or UDF with the matching id."""
213- volume = self.shares.get(id, None)
214- if volume is None:
215- volume = self.udfs.get(id, None)
216- if volume is None:
217- raise KeyError(id)
218+ volume = self.shares.get(volume_id, None)
219+ if volume is None:
220+ volume = self.udfs.get(volume_id, None)
221+ if volume is None:
222+ raise VolumeDoesNotExist(volume_id)
223 return volume
224
225 def get_volumes(self, all_volumes=False):
226@@ -920,13 +934,8 @@
227
228 """
229 self.log.info('delete_volume: %r', volume_id)
230- try:
231- volume = self.get_volume(volume_id)
232- except KeyError:
233- self.m.event_q.push('VM_VOLUME_DELETE_ERROR', volume_id,
234- "DOES_NOT_EXIST")
235- else:
236- self.m.action_q.delete_volume(volume.id)
237+ volume = self.get_volume(volume_id)
238+ self.m.action_q.delete_volume(volume.id)
239
240 def subscribe_udf(self, udf_id):
241 """Mark the UDF with id as subscribed.

Subscribers

People subscribed via source and target branches