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
19 class AltAggregate(GeniServer):
35 # Create a new aggregate object.
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)
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
51 nodes_file = os.sep.join([self.server_basedir, 'agg.' + self.hrn + '.components'])
52 self.nodes = SimpleStorage(nodes_file)
55 slices_file = os.sep.join([self.server_basedir, 'agg.' + self.hrn + '.slices'])
56 self.slices = SimpleStorage(slices_file)
59 policy_file = os.sep.join([self.server_basedir, 'agg.' + self.hrn + '.policy'])
60 self.policy = SimpleStorage(policy_file, {'whitelist': [], 'blacklist': []})
63 timestamp_file = os.sep.join([self.server_basedir, 'agg.' + self.hrn + '.timestamp'])
64 self.timestamp = SimpleStorage(timestamp_file)
68 self.connectRegistry()
69 #self.loadCredential()
71 def connectRegistry(self):
73 Connect to the registry
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)
81 def loadCredential(self):
83 Attempt to load credential from file if it exists. If it doesnt get
84 credential from registry.
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"
90 # see if this file exists
92 cred = Credential(filename = ma_cred_filename, subject=self.hrn)
93 self.credential = cred.save_to_string()
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)
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
106 def load_policy(self):
108 Read the list of blacklisted and whitelisted nodes.
112 def getNodes(self, format = 'rspec'):
114 Return a list of components at this aggregate.
119 Return a list of instnatiated managed by this slice manager.
122 def getResources(self, slice_hrn):
124 Return the current rspec for the specified slice.
127 def getTicket(self, hrn, rspec):
132 def createSlice(self, slice_hrn, rspec, attributes = []):
134 Instantiate/update slice according rspec
137 def updateSlice(self, slice_hrn, rspec, attributes = []):
138 return self.create_slice(slice_hrn, rspec, attributes)
140 def deleteSlice(self, slice_hrn):
145 def startSlice(self, slice_hrn):
150 def stopSlice(self, slice_hrn):
152 Stop the slice at the aggregate level
155 def resetSlice(self, slice_hrn):
162 Return this aggregates policy.
166 ##############################
167 ## Server methods here for now
168 ##############################
170 def list_nodes(self, cred, format):
171 self.decode_authentication(cred, 'listnodes')
172 return self.getNodes(format)
174 def list_slices(self, cred):
175 self.decode_authentication(cred, 'listslices')
176 return self.getSlices()
178 def get_resources(self, cred, hrn):
179 self.decode_authentication(cred, 'listnodes')
180 return self.getResources(hrn)
182 def get_ticket(self, cred, hrn, rspec):
183 self.decode_authentication(cred, 'getticket')
184 return self.getTicket(hrn, rspec)
186 def get_policy(self, cred):
187 self.decode_authentication(cred, 'getpolicy')
188 return self.getPolicy()
190 def create_slice(self, cred, hrn, rspec):
191 self.decode_authentication(cred, 'createslice')
192 return self.createSlice(hrn, rspec)
194 def update_slice(self, cred, hrn, rspec):
195 self.decode_authentication(cred, 'updateslice')
196 return self.updateSlice(hrn)
198 def delete_slice(self, cred, hrn):
199 self.decode_authentication(cred, 'deleteslice')
200 return self.deleteSlice(hrn)
202 def start_slice(self, cred, hrn):
203 self.decode_authentication(cred, 'startslice')
204 return self.startSlice(hrn)
206 def stop_slice(self, cred, hrn):
207 self.decode_authentication(cred, 'stopslice')
208 return self.stopSlice(hrn)
210 def reset_slice(self, cred, hrn):
211 self.decode_authentication(cred, 'resetslice')
212 return self.resetSlice(hrn)
214 def register_functions(self):
215 GeniServer.register_functions(self)
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)