added sfa.pdf
[sfa.git] / geni / alt_aggregate.py
1 import os
2 import sys
3 import datetime
4 import time
5 import xmlrpclib
6
7 from geni.util.geniserver import GeniServer
8 from geni.util.geniclient import *
9 from geni.util.cert import Keypair, Certificate
10 from geni.util.credential import Credential
11 from geni.util.trustedroot import TrustedRootList
12 from geni.util.excep import *
13 from geni.util.misc import *
14 from geni.util.config import Config
15 from geni.util.rspec import Rspec
16 from geni.util.specdict import *
17 from geni.util.storage import SimpleStorage
18
19 class AltAggregate(GeniServer):
20
21     hrn = None
22     nodes_ttl = None
23     nodes = None
24     slices = None 
25     policy = None
26     timestamp = None
27     threshold = None    
28     shell = None
29     registry = None
30     key_file = None
31     cert_file = None
32     credential = None
33   
34     ##
35     # Create a new aggregate object.
36     #
37     # @param ip the ip address to listen on
38     # @param port the port to listen on
39     # @param key_file private key filename of registry
40     # @param cert_file certificate filename containing public key (could be a GID file)     
41
42     def __init__(self, ip, port, key_file, cert_file, config = "/usr/share/geniwrapper/geni/util/geni_config"):
43         GeniServer.__init__(self, ip, port, key_file, cert_file)
44         self.key_file = key_file
45         self.cert_file = cert_file
46         self.config = Config(config)
47         self.basedir = self.config.GENI_BASE_DIR + os.sep
48         self.server_basedir = self.basedir + os.sep + "geni" + os.sep
49         self.hrn = self.config.GENI_INTERFACE_HRN
50         
51         nodes_file = os.sep.join([self.server_basedir, 'agg.' + self.hrn + '.components'])
52         self.nodes = SimpleStorage(nodes_file)
53         self.nodes.load()
54        
55         slices_file = os.sep.join([self.server_basedir, 'agg.' + self.hrn + '.slices'])
56         self.slices = SimpleStorage(slices_file)
57         self.slices.load()
58  
59         policy_file = os.sep.join([self.server_basedir, 'agg.' + self.hrn + '.policy'])
60         self.policy = SimpleStorage(policy_file, {'whitelist': [], 'blacklist': []})
61         self.policy.load()
62         
63         timestamp_file = os.sep.join([self.server_basedir, 'agg.' + self.hrn + '.timestamp']) 
64         self.timestamp = SimpleStorage(timestamp_file)
65
66         self.nodes_ttl = 1
67
68         self.connectRegistry()
69         #self.loadCredential()
70
71     def connectRegistry(self):
72         """
73         Connect to the registry
74         """
75         # connect to registry using GeniClient
76         address = self.config.GENI_REGISTRY_HOSTNAME
77         port = self.config.GENI_REGISTRY_PORT
78         url = 'https://%(address)s:%(port)s' % locals()
79         self.registry = GeniClient(url, self.key_file, self.cert_file)
80
81     def loadCredential(self):
82         """
83         Attempt to load credential from file if it exists. If it doesnt get 
84         credential from registry.
85         """ 
86
87         self_cred_filename = self.server_basedir + os.sep + "agg." + self.hrn + ".cred"
88         ma_cred_filename = self.server_basedir + os.sep + "agg." + self.hrn + ".ma.cred"
89         
90         # see if this file exists
91         try:
92             cred = Credential(filename = ma_cred_filename, subject=self.hrn)
93             self.credential = cred.save_to_string()
94         except IOError:
95             # get self credential
96             self_cred = self.registry.get_credential(None, 'ma', self.hrn)
97             self_credential = Credential(string = self_cred)
98             self_credential.save_to_file(self_cred_filename)
99
100             # get ma credential
101             ma_cred = self.registry.get_credential(self_cred)
102             ma_credential = Credential(string = ma_cred)
103             ma_credential.save_to_file(ma_cred_filename)
104             self.credential = ma_cred
105
106     def load_policy(self):
107         """
108         Read the list of blacklisted and whitelisted nodes.
109         """
110         self.policy.load()
111
112     def getNodes(self, format = 'rspec'):
113         """
114         Return a list of components at this aggregate.
115         """
116     
117     def getSlices(self):
118         """
119         Return a list of instnatiated managed by this slice manager.
120         """
121  
122     def getResources(self, slice_hrn):
123         """
124         Return the current rspec for the specified slice.
125         """
126     
127     def getTicket(self, hrn, rspec):
128         """
129         Retrieve a ticket
130         """
131
132     def createSlice(self, slice_hrn, rspec, attributes = []):
133         """
134         Instantiate/update slice according rspec
135         """
136
137     def updateSlice(self, slice_hrn, rspec, attributes = []):
138         return self.create_slice(slice_hrn, rspec, attributes)
139          
140     def deleteSlice(self, slice_hrn):
141         """
142         Remove this slice
143         """
144
145     def startSlice(self, slice_hrn):
146         """
147         Stop the slice
148         """
149
150     def stopSlice(self, slice_hrn):
151         """
152         Stop the slice at the aggregate level
153         """
154
155     def resetSlice(self, slice_hrn):
156         """
157         Reset the slice
158         """
159
160     def getPolicy(self):
161         """
162         Return this aggregates policy.
163         """
164     
165
166 ##############################
167 ## Server methods here for now
168 ##############################
169
170     def list_nodes(self, cred, format):
171         self.decode_authentication(cred, 'listnodes')
172         return self.getNodes(format)
173
174     def list_slices(self, cred):
175         self.decode_authentication(cred, 'listslices')
176         return self.getSlices()
177
178     def get_resources(self, cred, hrn):
179         self.decode_authentication(cred, 'listnodes')
180         return self.getResources(hrn)
181
182     def get_ticket(self, cred, hrn, rspec):
183         self.decode_authentication(cred, 'getticket')
184         return self.getTicket(hrn, rspec)
185  
186     def get_policy(self, cred):
187         self.decode_authentication(cred, 'getpolicy')
188         return self.getPolicy()
189
190     def create_slice(self, cred, hrn, rspec):
191         self.decode_authentication(cred, 'createslice')
192         return self.createSlice(hrn, rspec)
193
194     def update_slice(self, cred, hrn, rspec):
195         self.decode_authentication(cred, 'updateslice')
196         return self.updateSlice(hrn)    
197
198     def delete_slice(self, cred, hrn):
199         self.decode_authentication(cred, 'deleteslice')
200         return self.deleteSlice(hrn)
201
202     def start_slice(self, cred, hrn):
203         self.decode_authentication(cred, 'startslice')
204         return self.startSlice(hrn)
205
206     def stop_slice(self, cred, hrn):
207         self.decode_authentication(cred, 'stopslice')
208         return self.stopSlice(hrn)
209
210     def reset_slice(self, cred, hrn):
211         self.decode_authentication(cred, 'resetslice')
212         return self.resetSlice(hrn)
213
214     def register_functions(self):
215         GeniServer.register_functions(self)
216
217         # Aggregate interface methods
218         self.server.register_function(self.list_nodes)
219         self.server.register_function(self.list_slices)
220         self.server.register_function(self.get_resources)
221         self.server.register_function(self.get_ticket)
222         self.server.register_function(self.get_policy)
223         self.server.register_function(self.create_slice)
224         self.server.register_function(self.update_slice)
225         self.server.register_function(self.delete_slice)
226         self.server.register_function(self.start_slice)
227         self.server.register_function(self.stop_slice)
228         self.server.register_function(self.reset_slice)
229