1 ### $Id: slices.py 15842 2009-11-22 09:56:13Z anil $
2 ### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/plc/slices.py $
9 from types import StringTypes
10 from sfa.util.misc import *
11 from sfa.util.rspec import *
12 from sfa.util.specdict import *
13 from sfa.util.faults import *
14 from sfa.util.record import GeniRecord
15 from sfa.util.policy import Policy
16 from sfa.util.prefixTree import prefixTree
17 from sfa.util.rspec import *
18 from sfa.util.debug import log
19 from sfa.server.registry import Registries
20 from sfa.server.aggregate import Aggregates
21 import sfa.plc.peers as peers
23 def delete_slice(api, hrn, origin_hrn=None):
24 credential = api.getCredential()
25 aggregates = Aggregates(api)
26 for aggregate in aggregates:
28 # request hash is optional so lets try the call without it
31 aggregates[aggregate].delete_slice(credential, hrn, request_hash, origin_hrn)
34 print >> log, "%s" % (traceback.format_exc())
35 print >> log, "Error calling delete slice at aggregate %s" % aggregate
37 # try sending the request hash if the previous call failed
40 arg_list = [credential, hrn]
41 request_hash = api.key.compute_hash(arg_list)
42 aggregates[aggregate].delete_slice(credential, hrn, request_hash, origin_hrn)
45 print >> log, "%s" % (traceback.format_exc())
46 print >> log, "Error calling list nodes at aggregate %s" % aggregate
49 def create_slice(api, hrn, rspec, origin_hrn=None):
52 spec.parseString(rspec)
53 slicename = hrn_to_pl_slicename(hrn)
54 specDict = spec.toDict()
55 if specDict.has_key('RSpec'): specDict = specDict['RSpec']
56 if specDict.has_key('start_time'): start_time = specDict['start_time']
58 if specDict.has_key('end_time'): end_time = specDict['end_time']
62 aggregates = Aggregates(api)
63 credential = api.getCredential()
65 # split the netspecs into individual rspecs
66 netspecs = spec.getDictsByTagName('NetSpec')
67 for netspec in netspecs:
68 net_hrn = netspec['name']
69 resources = {'start_time': start_time, 'end_time': end_time, 'networks': netspec}
70 resourceDict = {'RSpec': resources}
71 tempspec.parseDict(resourceDict)
72 rspecs[net_hrn] = tempspec.toxml()
74 print "rspecs:", rspecs.keys()
75 print "aggregates:", aggregates.keys()
76 # send each rspec to the appropriate aggregate/sm
77 for net_hrn in rspecs:
79 # if we are directly connected to the aggregate then we can just
80 # send them the rspec. if not, then we may be connected to an sm
81 # thats connected to the aggregate
82 if net_hrn in aggregates:
83 # send the whloe rspec to the local aggregate
84 if net_hrn in [api.hrn]:
87 aggregates[net_hrn].create_slice(credential, hrn, \
88 rspec, request_hash, origin_hrn)
90 arg_list = [credential,hrn,rspec]
91 request_hash = api.key.compute_hash(arg_list)
92 aggregates[net_hrn].create_slice(credential, hrn, \
93 rspec, request_hash, origin_hrn)
97 aggregates[net_hrn].create_slice(credential, hrn, \
98 rspecs[net_hrn], request_hash, origin_hrn)
100 arg_list = [credential,hrn,rspecs[net_hrn]]
101 request_hash = api.key.compute_hash(arg_list)
102 aggregates[net_hrn].create_slice(credential, hrn, \
103 rspecs[net_hrn], request_hash, origin_hrn)
105 # lets forward this rspec to a sm that knows about the network
106 arg_list = [credential, net_hrn]
107 request_hash = api.key.compute_hash(arg_list)
108 for aggregate in aggregates:
110 network_found = aggregates[aggregate].get_aggregates(credential, net_hrn)
112 network_found = aggregates[aggregate].get_aggregates(credential, net_hrn, request_hash)
116 aggregates[aggregate].create_slice(credential, hrn, \
117 rspecs[net_hrn], request_hash, origin_hrn)
119 arg_list = [credential, hrn, rspecs[net_hrn]]
120 request_hash = api.key.compute_hash(arg_list)
121 aggregates[aggregate].create_slice(credential, hrn, \
122 rspecs[net_hrn], request_hash, origin_hrn)
125 print >> log, "Error creating slice %(hrn)s at aggregate %(net_hrn)s" % \
127 traceback.print_exc()
130 def start_slice(api, hrn, origin_hrn=None):
131 slicename = hrn_to_pl_slicename(hrn)
132 slices = api.plshell.GetSlices(api.plauth, {'name': slicename}, ['slice_id'])
134 raise RecordNotFound(hrn)
136 attributes = api.plshell.GetSliceTags(api.plauth, {'slice_id': slice_id, 'name': 'enabled'}, ['slice_attribute_id'])
137 attribute_id = attreibutes[0]['slice_attribute_id']
138 api.plshell.UpdateSliceTag(api.plauth, attribute_id, "1" )
142 def stop_slice(api, hrn, origin_hrn):
143 slicename = hrn_to_pl_slicename(hrn)
144 slices = api.plshell.GetSlices(api.plauth, {'name': slicename}, ['slice_id'])
146 raise RecordNotFound(hrn)
147 slice_id = slices[0]['slice_id']
148 attributes = api.plshell.GetSliceTags(api.plauth, {'slice_id': slice_id, 'name': 'enabled'}, ['slice_attribute_id'])
149 attribute_id = attributes[0]['slice_attribute_id']
150 api.plshell.UpdateSliceTag(api.plauth, attribute_id, "0")
153 def reset_slice(api, hrn, origin_hrn):
154 # XX not implemented at this interface
158 # XX just import the legacy module and excute that until
159 # we transition the code to this module
160 from sfa.plc.slices import Slices
165 def get_rspec(api, hrn=None, origin_hrn=None):
166 from sfa.plc.nodes import Nodes
167 nodes = Nodes(api, origin_hrn=origin_hrn)
169 rspec = nodes.get_rspec(hrn)
172 rspec = nodes['rspec']
177 Returns the request context required by sfatables. At some point, this mechanism should be changed
178 to refer to "contexts", which is the information that sfatables is requesting. But for now, we just
179 return the basic information needed in a dict.
181 def fetch_context(slice_hrn, user_hrn, contexts):
182 base_context = {'sfa':{'user':{'hrn':user_hrn}}}
187 r.parseFile(sys.argv[1])
189 create_slice(None,'plc.princeton.tmacktestslice',rspec)
191 if __name__ == "__main__":