X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FMethods%2FUpdateSlice.py;h=391f22155ebcfbe43ce0070bed6e4173b63182b4;hb=e499729c53c1bbfcfe3ec46043477f1e28c04119;hp=7846754cc9355354fcc513ce3e622d703bd9af18;hpb=a017c56cdd2a833ce6d1102eacfc3e7df0d5ee57;p=plcapi.git diff --git a/PLC/Methods/UpdateSlice.py b/PLC/Methods/UpdateSlice.py index 7846754..391f221 100644 --- a/PLC/Methods/UpdateSlice.py +++ b/PLC/Methods/UpdateSlice.py @@ -4,17 +4,20 @@ 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 \ + ['instantiation', 'url', 'description', 'max_nodes', 'expires'] + class UpdateSlice(Method): """ Updates the parameters of an existing slice with the values in - update_fields. + slice_fields. Users may only update slices of which they are members. PIs may - update any of the slices at their slices. Admins may update any - slice. + update any of the slices at their sites, or any slices of which + they are members. Admins may update any slice. Only PIs and admins may update max_nodes. Slices cannot be renewed (by updating the expires parameter) more than 8 weeks into the @@ -25,28 +28,28 @@ class UpdateSlice(Method): roles = ['admin', 'pi', 'user'] - can_update = lambda (field, value): field in \ - ['instantiation', 'url', 'description', 'max_nodes', 'expires'] - 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') - def call(self, auth, slice_id_or_name, update_fields): - if filter(lambda field: field not in self.update_fields, update_fields): - raise PLCInvalidArgument, "Invalid field specified" + 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 +59,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 +71,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 +87,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