2 from __future__ import with_statement
4 # sfi -- slice-based facility interface
8 from cert import Keypair, Certificate, Credential
9 from optparse import OptionParser
10 from util.geniclient import GeniClient
12 sfi_dir = os.path.expanduser("~/.sfi/")
20 # Establish Connection to SliceMgr and Registry Servers
22 def set_servers(options):
29 if (options.sm is not None):
31 elif ("SFI_SM" in os.environ):
32 sm_url = os.environ["SFI_SM"]
34 print "No Known Slice Manager"
38 if (options.registry is not None):
39 reg_url = options.registry
40 elif ("SFI_REGISTRY" in os.environ):
41 reg_url = os.environ["SFI_REGISTRY"]
43 print "No Known Registry Server"
47 print "Contacting Slice Manager at:", sm_url
48 print "Contacting Registry at:", registry_url
51 if (options.user is not None):
53 elif ("SFI_USER" in os.environ):
54 user = os.environ["SFI_USER"]
56 print "No Known User Name"
60 if (options.auth is not None):
61 authority = options.auth
62 elif ("SFI_AUTH" in os.environ):
63 authority = os.environ["SFI_AUTH"]
67 # Get key and certificate
68 key_file = get_key_file()
69 cert_file = get_cert_file(key_file)
71 # Establish connection to server(s)
72 # SliceMgr and Registry may be available on the same server
73 if (sm_url == registry_url):
74 sm_chan = GeniClient(sm_url, key_file, cert_file)
77 sm_chan = GeniClient(sm_url, key_file, cert_file)
78 reg_chan = GeniClient(registry_url, key_file, cert_file)
82 # Get various credential and spec files
84 # Establishes limiting conventions
85 # - conflates MAs and SAs
86 # - assumes last token in slice name is unique
88 # Bootstraps credentials
89 # - bootstrap user credential from self-signed certificate
90 # - bootstrap authority credential from user credential
91 # - bootstrap slice credential from user credential
95 parts = name.split(".")
99 file = os.path.join(sfi_dir, get_leaf(user) + ".pkey")
100 if (os.path.isfile(file)):
103 print "Key file", file, "does not exist"
107 def get_cert_file(key_file):
110 file = os.path.join(sfi_dir, get_leaf(user) + ".cert")
111 if (os.path.isfile(file)):
114 k = Keypair(filename = key_file)
115 cert = Certificate(subject=user)
117 cert.set_issuer(k, user)
120 print "Writing self-signed certificate to", file
121 cert.save_to_file(file)
127 file = os.path.join(sfi_dir, get_leaf(user) + ".cred")
128 if (os.path.isfile(file)):
129 user_cred = Credential(filename=file)
132 # bootstrap user credential
133 user_cred = get_credential(None, "user", user)
135 user_cred.save_to_file(file, save_parents=True)
137 print "Writing user credential to", file
140 print "Failed to get user credential"
146 file = os.path.join(sfi_dir, "authority.cred")
147 if (os.path.isfile(file)):
148 auth_cred = Credential(filename=file)
151 # bootstrap authority credential from user credential
152 user_cred = get_user_cred()
153 auth_cred = get_credential(user_cred, "sa", authority)
155 auth_cred.save_to_file(file, save_parents=True)
157 print "Writing authority credential to", file
160 print "Failed to get authority credential"
163 def get_slice_cred(name):
164 file = os.path.join(sfi_dir, "slice_" + get_leaf(name) + ".cred")
165 if (os.path.isfile(file)):
166 slice_cred = Credential(filename=file)
169 # bootstrap slice credential from user credential
170 user_cred = get_user_cred()
171 slice_cred = get_credential(user_cred, "slice", name)
173 slice_cred.save_to_file(file, save_parents=True)
175 print "Writing slice credential to", file
178 print "Failed to get slice credential"
181 def get_rspec_file(rspec):
182 if (os.path.isabs(rspec)):
185 file = os.path.join(sfi_dir, rspec)
186 if (os.path.isfile(file)):
189 print "No such rspec file"
192 def get_record_file(record):
193 if (os.path.isabs(record)):
196 file = os.path.join(sfi_dir, record)
197 if (os.path.isfile(file)):
200 print "No such registry record file"
204 # Generate sub-command parser
206 def create_cmd_parser(command):
207 cmdargs = {"list": "name",
210 "add": "name record",
211 "update": "name record",
215 "create": "name rspec",
221 if command not in cmdargs:
222 print "Invalid command\n"
223 print "Commands:list,show,remove,add,update,nodes,slices,resources,create,delete,start,stop,reset"
226 parser = OptionParser(usage="sfi [sfi_options] %s [options] %s" \
227 % (command, cmdargs[command]))
228 if command in ("nodes", "resources"):
229 parser.add_option("-f", "--format", dest="format",type="choice",
230 help="output format (dns|ip|hrn|rspec)",default="rspec",
231 choices=("dns","ip","hrn","rspec"))
232 elif command in ("list", "show", "remove"):
233 parser.add_option("-t", "--type", dest="type",type="choice",
234 help="type filter (user|slice|sa|ma|node|aggregate)",
235 choices=("user","slice","sa","ma","node","aggregate", "all"),
240 # Main: parse arguments and dispatch to command
247 # Generate command line parser
248 parser = OptionParser(usage="sfi [options] command [command_options] [command_args]",
249 description="Commands: list,show,remove,add,update,nodes,slices,resources,create,delete,start,stop,reset")
250 parser.add_option("-r", "--registry", dest="registry",
251 help="root registry", metavar="URL", default=None)
252 parser.add_option("-s", "--slicemgr", dest="sm",
253 help="slice manager", metavar="URL", default=None)
254 parser.add_option("-d", "--dir", dest="dir",
255 help="working directory", metavar="PATH", default = sfi_dir)
256 parser.add_option("-u", "--user", dest="user",
257 help="user name", metavar="USER_HRN", default=None)
258 parser.add_option("-a", "--auth", dest="auth",
259 help="authority name", metavar="AUTH_HRN", default=None)
260 parser.add_option("-v", "--verbose",
261 action="store_true", dest="verbose", default=False,
263 parser.disable_interspersed_args()
264 (options, args) = parser.parse_args()
266 (cmd_opts, cmd_args) = create_cmd_parser(command).parse_args(args[1:])
267 verbose = options.verbose
269 print options.registry, options.sm, options.dir, options.verbose,\
270 options.user, options.auth
272 if command in ("nodes", "resources"):
273 print cmd_opts.format
274 elif command in ("list","show","remove"):
280 # Dispatch to selected command
282 globals()[command](cmd_opts, cmd_args)
284 print "Command not found:", command
289 # Following functions implement the commands
291 # Registry-related commands
294 # list entires in named authority registry
295 def list(opts, args):
297 user_cred = get_user_cred()
298 result = reg_chan.list(user_cred, args[0])
299 display_record(opts.type, results)
302 # show named registry record
303 def show(opts, args):
305 user_cred = get_user_cred()
306 result = reg_chan.resolve(user_cred, args[0])
307 display_record(opts.type, results)
310 # removed named registry record
311 # - have to first retrieve the record to be removed
312 def remove(opts, args):
314 auth_cred = get_auth_cred()
315 results = reg_chan.resolve(auth_cred, args[0])
316 record = filter_record(opts.type, results)
317 return reg_chan.remove(auth_cred, record)
319 # add named registry record
322 auth_cred = get_auth_cred()
323 rec_file = get_record_file(args[1])
324 with open(rec_file) as f:
326 return reg_chan.register(auth_cred, record)
328 # update named registry entry
329 def update(opts, args):
331 user_cred = get_user_cred()
332 rec_file = get_record_file(args[1])
333 with open(rec_file) as f:
335 return reg_chan.update(user_cred, record)
338 # Slice-related commands
341 # list available nodes
342 def nodes(opts, args):
344 user_cred = get_user_cred()
349 result = sm_chan.list_nodes(user_cred, context)
350 display_rspec(opts.format, result)
353 # list instantiated slices
354 def slices(opts, args):
356 user_cred = get_user_cred()
357 result = sm_chan.list_slices(user_cred)
358 display_rspec(opts.format, results)
361 # show rspec for named slice
362 def resources(opts, args):
364 slice_cred = get_slice_cred(args[0])
365 print "resources:", opts.format, args[0], sm_chan
366 result = sm_chan.get_resources(slice_cred, args[0])
367 display_rspec(opts.format, result)
370 # created named slice with given rspec
371 def create(opts, args):
373 slice_cred = get_slice_cred(args[0])
374 rspec_file = get_rspec_file(args[1])
375 with open(rspec_file) as f:
377 return sm_chan.instantiate(slice_cred, rspec)
380 def delete(opts, args):
382 slice_cred = get_slice_cred(args[0])
383 return sm_chan.delete_slice(slice_cred)
386 def start(opts, args):
388 slice_cred = get_slice_cred(args[0])
389 return sm_chan.start_slice(slice_cred)
392 def stop(opts, args):
394 slice_cred = get_slice_cred(args[0])
395 return sm_chan.stop_slice(slice_cred)
398 def reset(opts, args):
400 slice_cred = get_slice_cred(args[0])
401 return sm_chan.reset_slice(slice_cred)
405 # Display and Filter RSpecs and Records
409 def display_rspec(format, rspec):
410 print "display rspec"
413 def display_record(type, record):
414 rec = filter_record(type, record)
415 print "display record"
418 def filter_record(type, record):
419 print "filter record"
423 if __name__=="__main__":