1 from sfa.util.faults import *
2 from sfa.util.misc import *
3 from sfa.util.rspec import Rspec
4 from sfa.server.registry import Registries
8 SFA_VINI_DEFAULT_RSPEC = '/etc/sfa/vini.rspec'
11 Copied from create_slice_aggregate() in sfa.plc.slices
13 def create_slice_vini_aggregate(api, hrn, nodes):
14 # Get the slice record from geni
16 registries = Registries(api)
17 registry = registries[api.hrn]
18 credential = api.getCredential()
19 records = registry.resolve(credential, hrn)
20 for record in records:
21 if record.get_type() in ['slice']:
22 slice = record.as_dict()
24 raise RecordNotFound(hrn)
26 # Make sure slice exists at plc, if it doesnt add it
27 slicename = hrn_to_pl_slicename(hrn)
28 slices = api.plshell.GetSlices(api.plauth, [slicename], ['node_ids'])
30 parts = slicename.split("_")
32 # if site doesnt exist add it
33 sites = api.plshell.GetSites(api.plauth, [login_base])
35 authority = get_authority(hrn)
36 site_records = registry.resolve(credential, authority)
39 raise RecordNotFound(authority)
40 site_record = site_records[0]
41 site = site_record.as_dict()
45 site_id = api.plshell.AddSite(api.plauth, site)
50 slice_keys = ['name', 'url', 'description']
51 for key in slice_keys:
52 if key in slice and slice[key]:
53 slice_fields[key] = slice[key]
54 api.plshell.AddSlice(api.plauth, slice_fields)
60 # get the list of valid slice users from the registry and make
61 # they are added to the slice
62 researchers = record.get('researcher', [])
63 for researcher in researchers:
65 person_records = registry.resolve(credential, researcher)
66 for record in person_records:
67 if record.get_type() in ['user']:
68 person_record = record
71 person_dict = person_record.as_dict()
72 persons = api.plshell.GetPersons(api.plauth, [person_dict['email']],
73 ['person_id', 'key_ids'])
75 # Create the person record
77 person_id=api.plshell.AddPerson(api.plauth, person_dict)
79 # The line below enables the user account on the remote aggregate
80 # soon after it is created.
81 # without this the user key is not transfered to the slice
82 # (as GetSlivers returns key of only enabled users),
83 # which prevents the user from login to the slice.
84 # We may do additional checks before enabling the user.
86 api.plshell.UpdatePerson(api.plauth, person_id, {'enabled' : True})
89 key_ids = persons[0]['key_ids']
91 api.plshell.AddPersonToSlice(api.plauth, person_dict['email'],
94 # Get this users local keys
95 keylist = api.plshell.GetKeys(api.plauth, key_ids, ['key'])
96 keys = [key['key'] for key in keylist]
98 # add keys that arent already there
99 for personkey in person_dict['keys']:
100 if personkey not in keys:
101 key = {'key_type': 'ssh', 'key': personkey}
102 api.plshell.AddPersonKey(api.plauth, person_dict['email'], key)
104 # find out where this slice is currently running
105 nodelist = api.plshell.GetNodes(api.plauth, slice['node_ids'],
107 hostnames = [node['hostname'] for node in nodelist]
109 # remove nodes not in rspec
110 deleted_nodes = list(set(hostnames).difference(nodes))
111 # add nodes from rspec
112 added_nodes = list(set(nodes).difference(hostnames))
114 api.plshell.AddSliceToNodes(api.plauth, slicename, added_nodes)
115 api.plshell.DeleteSliceFromNodes(api.plauth, slicename, deleted_nodes)
119 def get_rspec(api, hrn):
123 # Convert HRN to slice name
124 # Get SliceTags for the slice
126 # Construct LinkSpecs from the topo_rspec SliceTags
127 # The first field is the NodeId of the remote node.
128 # So the endpoints are the SliceTag node and the remote node.
131 # - avoid duplicates?
132 # - verify both ends of the link?
135 # Return canned response for now...
137 r.parseFile(SFA_VINI_DEFAULT_RSPEC)
143 def create_slice(api, hrn, xml):
146 rspec = r.toGenDict()
148 # Check request against current allocations
151 nodes = rspec_to_nodeset(rspec)
152 create_slice_vini_aggregate(api, hrn, nodes)
154 # Add VINI-specific topology attributes to slice here
158 def rspec_to_nodeset(rspec):
162 sitespecs = rspec['Rspec'][0]['Capacity'][0]['NetSpec'][0]['SiteSpec']
164 for node in s['NodeSpec']:
165 nodedict[node['name'][0]] = node['hostname'][0]
167 linkspecs = rspec['Rspec'][0]['Request'][0]['NetSpec'][0]['LinkSpec']
169 for e in l['endpoint']:
170 nodes.add(nodedict[e])
180 r.parseFile(sys.argv[1])
181 rspec = r.toGenDict()
182 create_slice(None,'plc',rspec)
184 if __name__ == "__main__":