9084dfda5d0ee70c8d6607b90244301ac827e5f1
[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     version['geni_stitching'] = False
20     return version
21
22
23 def ListResources(api, creds, options):
24     manager_base = 'sfa.managers'
25     mgr_type = 'pl'
26     manager_module = manager_base + ".aggregate_manager_%s" % mgr_type
27     manager = __import__(manager_module, fromlist=[manager_base])
28
29     xrn = None
30     if options.has_key('geni_slice_urn'):
31         xrn = options['geni_slice_urn']
32         api.logger.info(xrn)
33
34
35     rspec = manager.get_rspec(api, xrn, None)
36     
37     
38     # Filter out those objects that aren't allocated
39     if xrn:
40         tree = etree.parse(StringIO(rspec))    
41         used_nodes = [sliver.getparent() for sliver in tree.iterfind("./network/site/node/sliver")]
42         used_sites = [node.getparent() for node in used_nodes]
43         for node in tree.iterfind("./network/site/node"):
44             if node not in used_nodes:
45                 parent = node.getparent()
46                 parent.remove(node)
47         
48         # Remove unused sites
49         for site in tree.iterfind("./network/site"):
50             if site not in used_sites:
51                 parent = site.getparent()
52                 parent.remove(site)
53         rspec = etree.tostring(tree)
54
55     return rspec
56
57
58 def CreateSliver(api, slice_xrn, creds, rspec, users):
59     hrn, type = urn_to_hrn(slice_xrn)
60     
61     hrn_auth = get_authority(hrn)
62     
63     # Build up objects that an SFA registry would return if SFA
64     # could contact the slice's registry directly
65     reg_objects = None
66     
67     if users:
68         reg_objects = {}
69     
70         site = {}
71         site['site_id'] = 0
72         site['name'] = 'geni.%s' % hrn_auth
73         site['enabled'] = True
74         site['max_slices'] = 100
75         
76         # Note:
77         # Is it okay if this login base is the same as one already at this myplc site?  
78         # Do we need uniqueness?  Should use hrn_auth instead of just the leaf perhaps?
79         site['login_base'] = get_leaf(hrn_auth)
80         site['abbreviated_name'] = hrn
81         site['max_slivers'] = 1000    
82         reg_objects['site'] = site
83         
84         slice = {}
85         slice['expires'] = int(mktime(Credential(string=creds[0]).get_lifetime().timetuple()))
86         slice['hrn'] = hrn
87         slice['name'] = site['login_base'] + "_" +  get_leaf(hrn)
88         slice['url'] = hrn
89         slice['description'] = hrn
90         slice['pointer'] = 0
91         reg_objects['slice_record'] = slice
92         
93         reg_objects['users'] = {}
94         for user in users:
95             user['key_ids'] = []
96             if user['email']:
97                 user['email'] = user['email'] + "@geni.net"
98             else:
99                 user['email'] = user['urn'] + "@geni.net"
100             user['first_name'] = user['urn']
101             user['last_name'] = user['urn']
102             reg_objects['users'][user['email']] = user     
103             
104                
105     manager_base = 'sfa.managers'
106     mgr_type = 'pl'
107     manager_module = manager_base + ".aggregate_manager_%s" % mgr_type
108     manager = __import__(manager_module, fromlist=[manager_base])
109
110     allocated = manager.create_slice(api, slice_xrn, rspec, reg_objects)
111     
112     return allocated
113
114 def DeleteSliver(api, slice_xrn, creds):
115     manager_base = 'sfa.managers'
116     mgr_type = 'pl'
117     manager_module = manager_base + ".aggregate_manager_%s" % mgr_type
118     manager = __import__(manager_module, fromlist=[manager_base])
119
120     allocated = manager.delete_slice(api, slice_xrn)
121     return allocated
122
123 def SliverStatus(api, slice_xrn, creds):
124     result = {}
125     result['geni_urn'] = slice_xrn
126     result['geni_status'] = 'unknown'
127     result['geni_resources'] = {}
128     return result
129
130 def RenewSliver(api, slice_xrn, creds, renew_time):
131     return False
132
133 def Shutdown(api, slice_xrn, creds):
134     return False
135