87d8a95933703b80be59724610dfb875d2fb1d0e
[sfa.git] / sfa / managers / geni_am_pl.py
1 from sfa.util.namespace import *
2 from sfa.util.rspec import *
3 from sfa.util.specdict import *
4 from sfa.util.faults import *
5 from sfa.trust.credential import Credential
6 from sfa.util.record import *
7
8 from sfa.plc.slices import *
9 from sfa.util.sfalogging import *
10 from sfa.util.record import SfaRecord
11 from lxml import etree
12 from StringIO import StringIO
13 from time import mktime
14
15 def GetVersion():
16     version = {}
17     version['geni_api'] = 1
18     version['geni_stitching'] = False
19     return version
20
21
22 def ListResources(api, creds, options):
23     manager_base = 'sfa.managers'
24     mgr_type = 'pl'
25     manager_module = manager_base + ".aggregate_manager_%s" % mgr_type
26     manager = __import__(manager_module, fromlist=[manager_base])
27
28     xrn = None
29     if options.has_key('geni_slice_urn'):
30         xrn = options['geni_slice_urn']
31         api.logger.info(xrn)
32
33
34     rspec = manager.get_rspec(api, xrn, None)
35     
36     
37     # Filter out those objects that aren't allocated
38     if xrn:
39         tree = etree.parse(StringIO(rspec))    
40         used_nodes = [sliver.getparent() for sliver in tree.iterfind("./network/site/node/sliver")]
41         used_sites = [node.getparent() for node in used_nodes]
42         for node in tree.iterfind("./network/site/node"):
43             if node not in used_nodes:
44                 parent = node.getparent()
45                 parent.remove(node)
46         
47         # Remove unused sites
48         for site in tree.iterfind("./network/site"):
49             if site not in used_sites:
50                 parent = site.getparent()
51                 parent.remove(site)
52         rspec = etree.tostring(tree)
53
54     return rspec
55
56
57 def CreateSliver(api, slice_xrn, creds, rspec):
58     hrn, type = urn_to_hrn(slice_xrn)
59     
60     hrn_auth = get_authority(hrn)
61     
62     # Build up objects that an SFA registry would return if SFA
63     # could contact the slice's registry directly
64     reg_objects = {}
65
66     site = {}
67     site['site_id'] = 0
68     site['name'] = 'geni.%s' % hrn_auth
69     site['enabled'] = True
70     site['max_slices'] = 100
71     
72     # Note:
73     # Is it okay if this login base is the same as one already at this myplc site?  
74     # Do we need uniqueness?  Should use hrn_auth instead of just the leaf perhaps?
75     site['login_base'] = get_leaf(hrn_auth)
76     site['abbreviated_name'] = hrn
77     site['max_slivers'] = 1000    
78     reg_objects['site'] = site
79     
80     slice = {}
81     slice['expires'] = int(mktime(Credential(string=creds[0]).get_lifetime().timetuple()))
82     slice['hrn'] = hrn
83     slice['name'] = site['login_base'] + "_" +  get_leaf(hrn)
84     slice['url'] = hrn
85     slice['description'] = hrn
86     slice['pointer'] = 0
87     reg_objects['slice_record'] = slice
88     
89     manager_base = 'sfa.managers'
90     mgr_type = 'pl'
91     manager_module = manager_base + ".aggregate_manager_%s" % mgr_type
92     manager = __import__(manager_module, fromlist=[manager_base])
93
94     allocated = manager.create_slice(api, slice_xrn, rspec, reg_objects)
95     
96     return allocated
97
98 def DeleteSliver(api, slice_xrn, creds):
99     manager_base = 'sfa.managers'
100     mgr_type = 'pl'
101     manager_module = manager_base + ".aggregate_manager_%s" % mgr_type
102     manager = __import__(manager_module, fromlist=[manager_base])
103
104     allocated = manager.delete_slice(api, slice_xrn)
105     return allocated
106
107 def SliverStatus(api, slice_xrn, creds):
108     result = {}
109     result['geni_urn'] = slice_xrn
110     result['geni_status'] = 'unknown'
111     result['geni_resources'] = {}
112     return result
113
114 def RenewSliver(api, slice_xrn, creds, renew_time):
115     return False
116
117 def Shutdown(api, slice_xrn, creds):
118     return False
119