ee693786c855eef6f48cc02dc7aea33d0b9166bf
[sfa.git] / sfa / managers / aggregate_manager_vini.py
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 $
3
4 import datetime
5 import time
6 import traceback
7 import sys
8
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 *
25 from sfa.managers.aggregate_manager_pl import __get_registry_objects, __get_hostnames
26
27 # VINI aggregate is almost identical to PLC aggregate for many operations, 
28 # so lets just import the methods form the PLC manager
29
30 from sfa.managers.aggregate_manager_pl import (
31 start_slice, stop_slice, renew_slice, reset_slice, get_slices, get_ticket)
32
33
34 def get_version():
35     version = {}
36     version['geni_api'] = 1
37     version['sfa'] = 1
38     return version
39
40 def slice_status(api, slice_xrn, creds):
41     result = {}
42     result['geni_urn'] = slice_xrn
43     result['geni_status'] = 'unknown'
44     result['geni_resources'] = {}
45     return result
46
47
48 def delete_slice(api, xrn, creds):
49     hrn, type = urn_to_hrn(xrn)
50     slicename = hrn_to_pl_slicename(hrn)
51     slices = api.plshell.GetSlices(api.plauth, {'name': slicename})
52     if not slices:
53         return 1
54     slice = slices[0]
55
56     api.plshell.DeleteSliceFromNodes(api.plauth, slicename, slice['node_ids'])
57     return 1
58
59 def create_slice(api, xrn, creds, xml, users):
60     """
61     Verify HRN and initialize the slice record in PLC if necessary.
62     """
63
64     hrn, type = urn_to_hrn(xrn)
65     peer = None
66     reg_objects = __get_registry_objects(slice_xrn, creds, users)
67     slices = Slices(api)
68     peer = slices.get_peer(hrn)
69     sfa_peer = slices.get_sfa_peer(hrn)
70     registries = Registries(api)
71     registry = registries[api.hrn]
72     credential = api.getCredential()
73     site_id, remote_site_id = slices.verify_site(registry, credential, hrn, 
74                                                  peer, sfa_peer, reg_objects)
75     slice = slices.verify_slice(registry, credential, hrn, site_id, 
76                                 remote_site_id, peer, sfa_peer, reg_objects)
77
78     network = ViniNetwork(api)
79
80     slice = network.get_slice(api, hrn)
81     current = __get_hostnames(slice.get_nodes())
82
83     network.addRSpec(xml, "/var/www/html/schemas/vini.rng")
84     #network.addRSpec(xml, "/root/SVN/sfa/trunk/sfa/managers/vini/vini.rng")
85     request = __get_hostnames(network.nodesWithSlivers())
86     
87     # remove nodes not in rspec
88     deleted_nodes = list(set(current).difference(request))
89
90     # add nodes from rspec
91     added_nodes = list(set(request).difference(current))
92
93     api.plshell.AddSliceToNodes(api.plauth, slice.name, added_nodes) 
94     api.plshell.DeleteSliceFromNodes(api.plauth, slice.name, deleted_nodes)
95     network.updateSliceTags()
96
97     # print network.toxml()
98
99     return True
100
101 def get_rspec(api, creds, options):
102     # get slice's hrn from options
103     xrn = options.get('geni_slice_urn', None)
104     hrn, type = urn_to_hrn(xrn)
105     
106     # look in cache first
107     if api.cache and not xrn:
108         rspec = api.cache.get('nodes')
109         if rspec:
110             return rspec
111
112     network = ViniNetwork(api)
113     if (hrn):
114         if network.get_slice(api, hrn):
115             network.addSlice()
116
117     rspec =  network.toxml()
118
119     # cache the result
120     if api.cache and not xrn:
121         api.cache.add('nodes', rspec)
122
123     return rspec
124
125 def main():
126     api = SfaAPI()
127     """
128     #rspec = get_rspec(api, None, None)
129     rspec = get_rspec(api, "plc.princeton.iias", None)
130     print rspec
131     """
132     f = open(sys.argv[1])
133     xml = f.read()
134     f.close()
135     create_slice(api, "plc.princeton.iias", xml)
136
137 if __name__ == "__main__":
138     main()