3 from PLC.Faults import *
4 from PLC.Method import Method
5 from PLC.Parameter import Parameter, Mixed
6 from PLC.Slices import Slice, Slices
7 from PLC.Auth import Auth
8 from PLC.Sites import Site, Sites
9 import uuid ##################################soners
11 sys.path.append('../../../../util')
12 from pl_to_geni import *
16 can_update = lambda (field, value): field in \
17 ['name', 'instantiation', 'url', 'description', 'max_nodes', 'uuid']
19 class AddSlice(Method):
21 Adds a new slice. Any fields specified in slice_fields are used,
22 otherwise defaults are used.
24 Valid slice names are lowercase and begin with the login_base
25 (slice prefix) of a valid site, followed by a single
26 underscore. Thereafter, only letters, numbers, or additional
27 underscores may be used.
29 PIs may only add slices associated with their own sites (i.e.,
30 slice prefixes must always be the login_base of one of their
33 Returns the new slice_id (> 0) if successful, faults otherwise.
36 roles = ['admin', 'pi']
38 slice_fields = dict(filter(can_update, Slice.fields.items()))
45 returns = Parameter(int, 'New slice_id (> 0) if successful')
47 def call(self, auth, slice_fields):
48 slice_fields = dict(filter(can_update, slice_fields.items()))
51 # 2. Begins with login_base (letters or numbers).
52 # 3. Then single underscore after login_base.
53 # 4. Then letters, numbers, or underscores.
54 name = slice_fields['name']
55 good_name = r'^[a-z0-9]+_[a-zA-Z0-9_]+$'
57 not re.match(good_name, name):
58 raise PLCInvalidArgument, "Invalid slice name"
60 # Get associated site details
61 login_base = name.split("_")[0]
62 sites = Sites(self.api, [login_base])
64 raise PLCInvalidArgument, "Invalid slice prefix %s in %s"%(login_base,name)
67 if 'admin' not in self.caller['roles']:
68 if site['site_id'] not in self.caller['site_ids']:
69 raise PLCPermissionDenied, "Slice prefix %s must be the same as the login_base of one of your sites"%login_base
71 if len(site['slice_ids']) >= site['max_slices']:
72 raise PLCInvalidArgument, "Site %s has reached (%d) its maximum allowable slice count (%d)"%(site['name'],
73 len(site['slice_ids']),
76 if not site['enabled']:
77 raise PLCInvalidArgument, "Site %s is disabled can cannot create slices" % (site['name'])
79 slice = Slice(self.api, slice_fields)
80 slice['creator_person_id'] = self.caller['person_id']
81 slice['site_id'] = site['site_id']
82 slice['uuid'] = str(uuid.uuid4().int)###############################soner
86 self.event_objects = {'Slice': [slice['slice_id']]}
88 #insert the record into GENI tables ###############################soner
89 (global_sr_tree, global_cr_tree) = get_tree_globals()
90 (site_id, site_hrn) = site_to_auth(site['site_id'])
91 dbinfo = determine_dbinfo(site_hrn, global_sr_tree)
93 raise PLCInvalidArgument, "No GENI authority corresponding to the site "+site['name']
97 new_hrn = plslice_to_slice(slice['name'])
98 geni_record = {'hrn':''}
99 geni_record["hrn"] = new_hrn
100 geni_record["type"] = 'slice'
101 geni_record['pointer'] = slice['slice_id']
103 querystr = generate_querystr('INSERT', tablename, geni_record)
106 return slice['slice_id']