1 from sfa.util.rspec import Rspec
5 SFA_VINI_DEFAULT_RSPEC = '/etc/sfa/vini.rspec'
8 Copied from create_slice_aggregate() in sfa.plc.slices.
9 I could even call that directly.
11 def create_slice_vini_aggregate(api, hrn, nodes):
12 # Get the slice record from geni
14 registries = Registries(api)
15 registry = registries[api.hrn]
16 credential = api.getCredential()
17 records = registry.resolve(credential, hrn)
18 for record in records:
19 if record.get_type() in ['slice']:
20 slice = record.as_dict()
22 raise RecordNotFound(hrn)
24 # Make sure slice exists at plc, if it doesnt add it
25 slicename = hrn_to_pl_slicename(hrn)
26 slices = api.plshell.GetSlices(api.plauth, [slicename], ['node_ids'])
28 parts = slicename.split("_")
30 # if site doesnt exist add it
31 sites = api.plshell.GetSites(api.plauth, [login_base])
33 authority = get_authority(hrn)
34 site_records = registry.resolve(credential, authority)
37 raise RecordNotFound(authority)
38 site_record = site_records[0]
39 site = site_record.as_dict()
43 site_id = api.plshell.AddSite(api.plauth, site)
48 slice_keys = ['name', 'url', 'description']
49 for key in slice_keys:
50 if key in slice and slice[key]:
51 slice_fields[key] = slice[key]
52 api.plshell.AddSlice(api.plauth, slice_fields)
57 # get the list of valid slice users from the registry and make
58 # they are added to the slice
59 researchers = record.get('researcher', [])
60 for researcher in researchers:
62 person_records = registry.resolve(credential, researcher)
63 for record in person_records:
64 if record.get_type() in ['user']:
65 person_record = record
68 person_dict = person_record.as_dict()
69 persons = api.plshell.GetPersons(api.plauth, [person_dict['email']], ['person_id', 'key_ids'])
71 # Create the person record
73 person_id=api.plshell.AddPerson(api.plauth, person_dict)
75 # The line below enables the user account on the remote aggregate soon after it is created.
76 # without this the user key is not transfered to the slice (as GetSlivers returns key of only enabled users),
77 # which prevents the user from login to the slice. We may do additional checks before enabling the user.
79 api.plshell.UpdatePerson(api.plauth, person_id, {'enabled' : True})
82 key_ids = persons[0]['key_ids']
84 api.plshell.AddPersonToSlice(api.plauth, person_dict['email'], slicename)
86 # Get this users local keys
87 keylist = api.plshell.GetKeys(api.plauth, key_ids, ['key'])
88 keys = [key['key'] for key in keylist]
90 # add keys that arent already there
91 for personkey in person_dict['keys']:
92 if personkey not in keys:
93 key = {'key_type': 'ssh', 'key': personkey}
94 api.plshell.AddPersonKey(api.plauth, person_dict['email'], key)
96 # find out where this slice is currently running
97 nodelist = api.plshell.GetNodes(api.plauth, slice['node_ids'], ['hostname'])
98 hostnames = [node['hostname'] for node in nodelist]
100 # remove nodes not in rspec
101 deleted_nodes = list(set(hostnames).difference(nodes))
102 # add nodes from rspec
103 added_nodes = list(set(nodes).difference(hostnames))
105 api.plshell.AddSliceToNodes(api.plauth, slicename, added_nodes)
106 api.plshell.DeleteSliceFromNodes(api.plauth, slicename, deleted_nodes)
117 # Return canned response for now...
119 r.parseFile(SFA_VINI_DEFAULT_RSPEC)
120 rspec = r.toGenDict()
125 def create_slice(api, hrn, rspec):
126 # Check request against current allocations
129 nodes = rspec_to_nodeset(rspec)
130 create_slice_vini_aggregate(api, hrn, nodes)
132 # Add VINI-specific topology attributes to slice here
136 def rspec_to_nodeset(rspec):
140 sitespecs = rspec['Rspec'][0]['Capacity'][0]['NetSpec'][0]['SiteSpec']
142 for node in s['NodeSpec']:
143 nodedict[node['name'][0]] = node['hostname'][0]
145 linkspecs = rspec['Rspec'][0]['Request'][0]['NetSpec'][0]['LinkSpec']
147 for e in l['endpoint']:
148 nodes.add(nodedict[e])
158 r.parseFile(sys.argv[1])
159 rspec = r.toGenDict()
160 create_slice(None,'plc',rspec)
162 if __name__ == "__main__":