X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FMethods%2FUpdateSlice.py;h=357a10f6c62315fe0068fa170b351ba00d4e73b4;hb=fc20bc8ec22a52ca24bb696e998ebf59af5f3213;hp=8b34ed1090fc3157efa8e359ec99213a6e0fc006;hpb=81d4a2b05167e54888d196ac2e9623ae2dcb1ca4;p=plcapi.git diff --git a/PLC/Methods/UpdateSlice.py b/PLC/Methods/UpdateSlice.py index 8b34ed1..357a10f 100644 --- a/PLC/Methods/UpdateSlice.py +++ b/PLC/Methods/UpdateSlice.py @@ -4,7 +4,7 @@ from PLC.Faults import * from PLC.Method import Method from PLC.Parameter import Parameter, Mixed from PLC.Slices import Slice, Slices -from PLC.Auth import PasswordAuth +from PLC.Auth import Auth from PLC.Sites import Site, Sites can_update = lambda (field, value): field in \ @@ -28,25 +28,30 @@ class UpdateSlice(Method): roles = ['admin', 'pi', 'user'] - update_fields = dict(filter(can_update, Slice.fields.items())) + slice_fields = dict(filter(can_update, Slice.fields.items())) accepts = [ - PasswordAuth(), + Auth(), Mixed(Slice.fields['slice_id'], Slice.fields['name']), - update_fields + slice_fields ] returns = Parameter(int, '1 if successful') + object_type = 'Slice' + def call(self, auth, slice_id_or_name, slice_fields): slice_fields = dict(filter(can_update, slice_fields.items())) - slices = Slices(self.api, [slice_id_or_name]).values() + slices = Slices(self.api, [slice_id_or_name]) if not slices: raise PLCInvalidArgument, "No such slice" slice = slices[0] + if slice['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local slice" + if 'admin' not in self.caller['roles']: if self.caller['person_id'] in slice['person_ids']: pass @@ -56,8 +61,8 @@ class UpdateSlice(Method): raise PLCPermissionDenied, "Specified slice not associated with any of your sites" # Renewing - if 'expires' in update_fields and update_fields['expires'] > slice['expires']: - sites = Sites(self.api, [slice['site_id']]).values() + if 'expires' in slice_fields and slice_fields['expires'] > slice['expires']: + sites = Sites(self.api, [slice['site_id']]) assert sites site = sites[0] @@ -68,15 +73,15 @@ class UpdateSlice(Method): # XXX Make this configurable max_expires = time.time() + (8 * 7 * 24 * 60 * 60) - if 'admin' not in self.caller['roles'] and update_fields['expires'] > max_expires: + if 'admin' not in self.caller['roles'] and slice_fields['expires'] > max_expires: raise PLCInvalidArgument, "Cannot renew a slice beyond 8 weeks from now" - if 'max_nodes' in update_fields and update_fields['max_nodes'] != slice['max_nodes']: + if 'max_nodes' in slice_fields and slice_fields['max_nodes'] != slice['max_nodes']: if 'admin' not in self.caller['roles'] and \ 'pi' not in self.caller['roles']: raise PLCInvalidArgument, "Only admins and PIs may update max_nodes" - slice.update(update_fields) + slice.update(slice_fields) # XXX Make this a configurable policy if slice['description'] is None or not slice['description'].strip() or \ @@ -84,5 +89,6 @@ class UpdateSlice(Method): raise PLCInvalidArgument, "Cannot renew a slice with an empty description or URL" slice.sync() + self.object_ids = [slice['slice_id']] return 1