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