X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FMethods%2FAddSlice.py;h=a7fb5b989cfcb76998e5a9ec41ceb07030a58922;hb=6030284de1426b8666ebd3aa0eee099ce4b5f232;hp=c166e70a61f5026180e19392b8fa9b02ef4315e1;hpb=1f8c38dd1357c93e4be8d94456b7274a591d2db4;p=plcapi.git diff --git a/PLC/Methods/AddSlice.py b/PLC/Methods/AddSlice.py index c166e70..a7fb5b9 100644 --- a/PLC/Methods/AddSlice.py +++ b/PLC/Methods/AddSlice.py @@ -1,14 +1,21 @@ +# $Id$ +# $URL$ import re from PLC.Faults import * +from PLC.Auth import Auth from PLC.Method import Method from PLC.Parameter import Parameter, Mixed +from PLC.Table import Row + from PLC.Slices import Slice, Slices -from PLC.Auth import Auth from PLC.Sites import Site, Sites +from PLC.TagTypes import TagTypes +from PLC.SliceTags import SliceTags +from PLC.Methods.AddSliceTag import AddSliceTag +from PLC.Methods.UpdateSliceTag import UpdateSliceTag -can_update = lambda (field, value): field in \ - ['name', 'instantiation', 'url', 'description', 'max_nodes'] +can_update = ['name', 'instantiation', 'url', 'description', 'max_nodes'] class AddSlice(Method): """ @@ -29,51 +36,73 @@ class AddSlice(Method): roles = ['admin', 'pi'] - slice_fields = dict(filter(can_update, Slice.fields.items())) + accepted_fields = Row.accepted_fields(can_update, Slice.fields) + accepted_fields.update(Slice.tags) accepts = [ Auth(), - slice_fields + accepted_fields ] returns = Parameter(int, 'New slice_id (> 0) if successful') - event_type = 'Add' - object_type = 'Slice' - object_ids = [] - def call(self, auth, slice_fields): - slice_fields = dict(filter(can_update, slice_fields.items())) + + [native,tags,rejected]=Row.split_fields(slice_fields,[Slice.fields,Slice.tags]) + + # type checking + native = Row.check_fields (native, self.accepted_fields) + if rejected: + raise PLCInvalidArgument, "Cannot add Slice with column(s) %r"%rejected + + # Authenticated function + assert self.caller is not None # 1. Lowercase. - # 2. Begins with login_base (only letters). + # 2. Begins with login_base (letters or numbers). # 3. Then single underscore after login_base. # 4. Then letters, numbers, or underscores. name = slice_fields['name'] - good_name = r'^[a-z]+_[a-z0-9_]+$' + good_name = r'^[a-z0-9]+_[a-zA-Z0-9_]+$' if not name or \ not re.match(good_name, name): raise PLCInvalidArgument, "Invalid slice name" # Get associated site details login_base = name.split("_")[0] - sites = Sites(self.api, [login_base]).values() + sites = Sites(self.api, [login_base]) if not sites: - raise PLCInvalidArgument, "Invalid slice prefix" + raise PLCInvalidArgument, "Invalid slice prefix %s in %s"%(login_base,name) site = sites[0] if 'admin' not in self.caller['roles']: if site['site_id'] not in self.caller['site_ids']: - raise PLCPermissionDenied, "Slice prefix must be the same as the login_base of one of your sites" + raise PLCPermissionDenied, "Slice prefix %s must match one of your sites' login_base"%login_base if len(site['slice_ids']) >= site['max_slices']: - raise PLCInvalidArgument, "Site has reached its maximum allowable slice count" - - slice = Slice(self.api, slice_fields) + raise PLCInvalidArgument, \ + "Site %s has reached (%d) its maximum allowable slice count (%d)"%(site['name'], + len(site['slice_ids']), + site['max_slices']) + if not site['enabled']: + raise PLCInvalidArgument, "Site %s is disabled and can cannot create slices" % (site['name']) + + slice = Slice(self.api, native) slice['creator_person_id'] = self.caller['person_id'] slice['site_id'] = site['site_id'] slice.sync() - self.object_ids = [slice['slice_id']] + for (tagname,value) in tags.iteritems(): + # the tagtype instance is assumed to exist, just check that + if not TagTypes(self.api,{'tagname':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.message = "Slice %d created" % slice['slice_id'] return slice['slice_id']