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.namespace 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 SfaRecord
15 from sfa.util.policy import Policy
16 from sfa.util.record import *
17 from sfa.util.sfaticket import SfaTicket
18 from sfa.server.registry import Registries
19 from sfa.util.debug import log
20 from sfa.plc.slices import Slices
21 import sfa.plc.peers as peers
22 from sfa.managers.vini.vini_network import *
23 from sfa.plc.api import SfaAPI
24 from sfa.plc.slices import *
26 def delete_slice(api, xrn):
27 hrn, type = urn_to_hrn(xrn)
28 slicename = hrn_to_pl_slicename(hrn)
29 slices = api.plshell.GetSlices(api.plauth, {'name': slicename})
34 # determine if this is a peer slice
35 peer = peers.get_peer(api, hrn)
37 api.plshell.UnBindObjectFromPeer(api.plauth, 'slice', slice['slice_id'], peer)
38 api.plshell.DeleteSliceFromNodes(api.plauth, slicename, slice['node_ids'])
40 api.plshell.BindObjectToPeer(api.plauth, 'slice', slice['slice_id'], peer, slice['peer_slice_id'])
43 def __get_hostnames(nodes):
46 hostnames.append(node.hostname)
49 def create_slice(api, xrn, xml):
50 hrn, type = urn_to_hrn(xrn)
54 Verify HRN and initialize the slice record in PLC if necessary.
57 peer = slices.get_peer(hrn)
58 sfa_peer = slices.get_sfa_peer(hrn)
59 registries = Registries(api)
60 registry = registries[api.hrn]
61 credential = api.getCredential()
62 site_id, remote_site_id = slices.verify_site(registry, credential, hrn,
64 slice = slices.verify_slice(registry, credential, hrn, site_id,
65 remote_site_id, peer, sfa_peer)
67 network = ViniNetwork(api)
69 slice = network.get_slice(api, hrn)
70 current = __get_hostnames(slice.get_nodes())
72 network.addRSpec(xml, "/var/www/html/schemas/vini.rng")
73 #network.addRSpec(xml, "/root/SVN/sfa/trunk/sfa/managers/vini/vini.rng")
74 request = __get_hostnames(network.nodesWithSlivers())
76 # remove nodes not in rspec
77 deleted_nodes = list(set(current).difference(request))
79 # add nodes from rspec
80 added_nodes = list(set(request).difference(current))
83 api.plshell.UnBindObjectFromPeer(api.plauth, 'slice', slice.id, peer)
85 api.plshell.AddSliceToNodes(api.plauth, slice.name, added_nodes)
86 api.plshell.DeleteSliceFromNodes(api.plauth, slice.name, deleted_nodes)
88 network.updateSliceTags()
91 api.plshell.BindObjectToPeer(api.plauth, 'slice', slice.id, peer,
94 # print network.toxml()
99 def get_ticket(api, xrn, rspec, origin_hrn=None):
100 slice_hrn, type = urn_to_hrn(xrn)
101 # the the slice record
102 registries = Registries(api)
103 registry = registries[api.hrn]
104 credential = api.getCredential()
105 records = registry.resolve(credential, xrn)
107 # make sure we get a local slice record
109 for tmp_record in records:
110 if tmp_record['type'] == 'slice' and \
111 not tmp_record['peer_authority']:
112 record = SliceRecord(dict=tmp_record)
114 raise RecordNotFound(slice_hrn)
117 slivers = Slices(api).get_slivers(slice_hrn)
119 raise SliverDoesNotExist(slice_hrn)
124 'timestamp': int(time.time()),
125 'initscripts': initscripts,
130 object_gid = record.get_gid_object()
131 new_ticket = SfaTicket(subject = object_gid.get_subject())
132 new_ticket.set_gid_caller(api.auth.client_gid)
133 new_ticket.set_gid_object(object_gid)
134 new_ticket.set_issuer(key=api.key, subject=api.hrn)
135 new_ticket.set_pubkey(object_gid.get_pubkey())
136 new_ticket.set_attributes(data)
137 new_ticket.set_rspec(rspec)
138 #new_ticket.set_parent(api.auth.hierarchy.get_auth_ticket(auth_hrn))
142 return new_ticket.save_to_string(save_parents=True)
144 def start_slice(api, xrn):
145 hrn, type = urn_to_hrn(xrn)
146 slicename = hrn_to_pl_slicename(hrn)
147 slices = api.plshell.GetSlices(api.plauth, {'name': slicename}, ['slice_id'])
149 raise RecordNotFound(hrn)
151 attributes = api.plshell.GetSliceTags(api.plauth, {'slice_id': slice_id, 'name': 'enabled'}, ['slice_attribute_id'])
152 attribute_id = attreibutes[0]['slice_attribute_id']
153 api.plshell.UpdateSliceTag(api.plauth, attribute_id, "1" )
157 def stop_slice(api, xrn):
158 hrn, type = urn_to_hrn(xrn)
159 slicename = hrn_to_pl_slicename(hrn)
160 slices = api.plshell.GetSlices(api.plauth, {'name': slicename}, ['slice_id'])
162 raise RecordNotFound(hrn)
163 slice_id = slices[0]['slice_id']
164 attributes = api.plshell.GetSliceTags(api.plauth, {'slice_id': slice_id, 'name': 'enabled'}, ['slice_attribute_id'])
165 attribute_id = attributes[0]['slice_attribute_id']
166 api.plshell.UpdateSliceTag(api.plauth, attribute_id, "0")
169 def reset_slice(api, xrn):
170 # XX not implemented at this interface
174 # XX just import the legacy module and excute that until
175 # we transition the code to this module
176 from sfa.plc.slices import Slices
179 return [hrn_to_urn(slice_hrn, 'slice') for slice_hrn in slices['hrn']]
182 def get_rspec(api, xrn=None, origin_hrn=None):
183 hrn, type = urn_to_hrn(xrn)
184 network = ViniNetwork(api)
186 if network.get_slice(api, hrn):
189 return network.toxml()
192 Returns the request context required by sfatables. At some point, this
193 mechanism should be changed to refer to "contexts", which is the
194 information that sfatables is requesting. But for now, we just return
195 the basic information needed in a dict.
197 def fetch_context(slice_xrn, user_xrn, contexts):
198 slice_hrn, type = urn_to_hrn(slice_xrn)
199 user_hrn, type = urn_to_hrn(user_xrn)
200 base_context = {'sfa':{'user':{'hrn':user_hrn}, 'slice':{'hrn':slice_hrn}}}
206 #rspec = get_rspec(api, None, None)
207 rspec = get_rspec(api, "plc.princeton.iias", None)
210 f = open(sys.argv[1])
213 create_slice(api, "plc.princeton.iias", xml)
215 if __name__ == "__main__":