X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FMethods%2FUpdateSlice.py;h=107f0787bc79865596afa67d7a1e4a664c4df94b;hb=1d3540bd2ece27d91a2ec5843628c5fa38a25024;hp=b58a1062ae9fbd84399dfc0fcfe2663792b1da08;hpb=c4274cc50530a9e9e7043a5614f1432eb20659ef;p=plcapi.git diff --git a/PLC/Methods/UpdateSlice.py b/PLC/Methods/UpdateSlice.py index b58a106..107f078 100644 --- a/PLC/Methods/UpdateSlice.py +++ b/PLC/Methods/UpdateSlice.py @@ -1,4 +1,3 @@ -# $Id$ import time from PLC.Faults import * @@ -14,8 +13,7 @@ from PLC.SliceTags import SliceTags from PLC.Methods.AddSliceTag import AddSliceTag from PLC.Methods.UpdateSliceTag import UpdateSliceTag -can_update = ['instantiation', 'url', 'description', 'max_nodes', 'expires'] + \ - Slice.related_fields.keys() +can_update = ['instantiation', 'url', 'description', 'max_nodes', 'expires'] class UpdateSlice(Method): """ @@ -35,32 +33,37 @@ class UpdateSlice(Method): roles = ['admin', 'pi', 'user'] - slice_fields = Row.accepted_fields(can_update, [Slice.fields,Slice.related_fields,Slice.tags]) + accepted_fields = Row.accepted_fields(can_update, Slice.fields) + # xxx check the related_fields feature + accepted_fields.update(Slice.related_fields) + accepted_fields.update(Slice.tags) accepts = [ Auth(), Mixed(Slice.fields['slice_id'], Slice.fields['name']), - slice_fields + accepted_fields ] returns = Parameter(int, '1 if successful') def call(self, auth, slice_id_or_name, slice_fields): - # split provided fields + # split provided fields [native,related,tags,rejected] = Row.split_fields(slice_fields,[Slice.fields,Slice.related_fields,Slice.tags]) + # type checking + native = Row.check_fields (native, self.accepted_fields) if rejected: - raise PLCInvalidArgument, "Cannot update Node column(s) %r"%rejected + raise PLCInvalidArgument("Cannot update Slice column(s) %r"%rejected) - slices = Slices(self.api, [slice_id_or_name]) + slices = Slices(self.api, [slice_id_or_name]) if not slices: - raise PLCInvalidArgument, "No such slice %r"%slice_id_or_name + raise PLCInvalidArgument("No such slice %r"%slice_id_or_name) slice = slices[0] if slice['peer_id'] is not None: - raise PLCInvalidArgument, "Not a local slice" + raise PLCInvalidArgument("Not a local slice") # Authenticated function assert self.caller is not None @@ -69,9 +72,9 @@ class UpdateSlice(Method): if self.caller['person_id'] in slice['person_ids']: pass elif 'pi' not in self.caller['roles']: - raise PLCPermissionDenied, "Not a member of the specified slice" + raise PLCPermissionDenied("Not a member of the specified slice") elif slice['site_id'] not in self.caller['site_ids']: - raise PLCPermissionDenied, "Specified slice not associated with any of your sites" + raise PLCPermissionDenied("Specified slice not associated with any of your sites") # Renewing renewing=False @@ -81,55 +84,60 @@ class UpdateSlice(Method): site = sites[0] if site['max_slices'] <= 0: - raise PLCInvalidArgument, "Slice creation and renewal have been disabled for the site" + raise PLCInvalidArgument("Slice creation and renewal have been disabled for the site") # Maximum expiration date is 8 weeks from now # XXX Make this configurable max_expires = time.time() + (8 * 7 * 24 * 60 * 60) if 'admin' not in self.caller['roles'] and slice_fields['expires'] > max_expires: - raise PLCInvalidArgument, "Cannot renew a slice beyond 8 weeks from now" + raise PLCInvalidArgument("Cannot renew a slice beyond 8 weeks from now") - # XXX Make this a configurable policy + # XXX Make this a configurable policy if slice['description'] is None or not slice['description'].strip(): - if 'description' not in slice_fields or slice_fields['description'] is None or \ - not slice_fields['description'].strip(): - raise PLCInvalidArgument, "Cannot renew a slice with an empty description or URL" - - if slice['url'] is None or not slice['url'].strip(): - if 'url' not in slice_fields or slice_fields['url'] is None or \ - not slice_fields['url'].strip(): - raise PLCInvalidArgument, "Cannot renew a slice with an empty description or URL" + if 'description' not in slice_fields or slice_fields['description'] is None or \ + not slice_fields['description'].strip(): + raise PLCInvalidArgument("Cannot renew a slice with an empty description or URL") + + if slice['url'] is None or not slice['url'].strip(): + if 'url' not in slice_fields or slice_fields['url'] is None or \ + not slice_fields['url'].strip(): + raise PLCInvalidArgument("Cannot renew a slice with an empty description or URL") renewing=True - + 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" + raise PLCInvalidArgument("Only admins and PIs may update max_nodes") - # Make requested associations - for (k,v) in related.iteritems(): + # Make requested associations + for (k,v) in related.items(): slice.associate(auth,k,v) - slice.update(slice_fields) + slice.update(slice_fields) slice.sync(commit=True) - for (tagname,value) in tags.iteritems(): + for (tagname,value) in tags.items(): # the tagtype instance is assumed to exist, just check that if not TagTypes(self.api,{'tagname':tagname}): - raise PLCInvalidArgument,"No such TagType %s"%tagname + raise PLCInvalidArgument("No such TagType %s"%tagname) slice_tags=SliceTags(self.api,{'tagname':tagname,'slice_id':slice['slice_id']}) if not slice_tags: AddSliceTag(self.api).__call__(auth,slice['slice_id'],tagname,value) else: UpdateSliceTag(self.api).__call__(auth,slice_tags[0]['slice_tag_id'],value) - self.event_objects = {'Slice': [slice['slice_id']]} + self.event_objects = {'Slice': [slice['slice_id']]} if 'name' in slice: self.message='Slice %s updated'%slice['name'] else: self.message='Slice %d updated'%slice['slice_id'] if renewing: - self.message += ' renewed until %s'%time.strftime('%Y-%m-%d:%H:%M',localtime(slice['expires'])) + # it appears that slice['expires'] may be either an int, or a formatted string + try: + expire_date=time.strftime('%Y-%m-%d:%H:%M',time.localtime(float(slice['expires']))) + except: + expire_date=slice['expires'] + self.message += ' renewed until %s'%expire_date return 1