Import methods from the pl aggregate manager instead of redefining them here since...
[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 StringIO import StringIO
12 from time import mktime
13
14 from lxml import etree
15
16 def GetVersion():
17     version = {}
18     version['geni_api'] = 1
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, users):
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 = None
65     
66     if users:
67         reg_objects = {}
68     
69         site = {}
70         site['site_id'] = 0
71         site['name'] = 'geni.%s' % hrn_auth
72         site['enabled'] = True
73         site['max_slices'] = 100
74         
75         # Note:
76         # Is it okay if this login base is the same as one already at this myplc site?  
77         # Do we need uniqueness?  Should use hrn_auth instead of just the leaf perhaps?
78         site['login_base'] = get_leaf(hrn_auth)
79         site['abbreviated_name'] = hrn
80         site['max_slivers'] = 1000    
81         reg_objects['site'] = site
82         
83         slice = {}
84         slice['expires'] = int(mktime(Credential(string=creds[0]).get_lifetime().timetuple()))
85         slice['hrn'] = hrn
86         slice['name'] = site['login_base'] + "_" +  get_leaf(hrn)
87         slice['url'] = hrn
88         slice['description'] = hrn
89         slice['pointer'] = 0
90         reg_objects['slice_record'] = slice
91         
92         reg_objects['users'] = {}
93         for user in users:
94             user['key_ids'] = []
95             hrn, _ = urn_to_hrn(user['urn'])
96             user['email'] = hrn + "@geni.net"
97             user['first_name'] = hrn
98             user['last_name'] = hrn
99             reg_objects['users'][user['email']] = user     
100             
101                
102     manager_base = 'sfa.managers'
103     mgr_type = 'pl'
104     manager_module = manager_base + ".aggregate_manager_%s" % mgr_type
105     manager = __import__(manager_module, fromlist=[manager_base])
106
107     allocated = manager.create_slice(api, slice_xrn, rspec, reg_objects)
108     
109     return allocated
110
111 def DeleteSliver(api, slice_xrn, creds):
112     manager_base = 'sfa.managers'
113     mgr_type = 'pl'
114     manager_module = manager_base + ".aggregate_manager_%s" % mgr_type
115     manager = __import__(manager_module, fromlist=[manager_base])
116
117     allocated = manager.delete_slice(api, slice_xrn)
118     return allocated
119
120 def SliverStatus(api, slice_xrn, creds):
121     result = {}
122     result['geni_urn'] = slice_xrn
123     result['geni_status'] = 'unknown'
124     result['geni_resources'] = {}
125     return result
126
127 def RenewSliver(api, slice_xrn, creds, renew_time):
128     return False
129
130 def Shutdown(api, slice_xrn, creds):
131     return False
132