3 # sfi -- slice-based facility interface
11 from types import StringTypes, ListType
12 from optparse import OptionParser
13 from sfa.trust.certificate import Keypair, Certificate
14 from sfa.trust.credential import Credential
15 from sfa.util.sfaticket import SfaTicket
16 from sfa.util.record import *
17 from sfa.util.namespace import *
18 from sfa.util.rspec import RSpec
19 from sfa.util.xmlrpcprotocol import ServerException
20 import sfa.util.xmlrpcprotocol as xmlrpcprotocol
21 from sfa.util.config import Config
24 # utility methods here
26 def display_rspec(rspec, format = 'rspec'):
29 spec.parseString(rspec)
31 nodespecs = spec.getDictsByTagName('NodeSpec')
32 for nodespec in nodespecs:
33 if nodespec.has_key('name') and nodespec['name']:
34 if isinstance(nodespec['name'], ListType):
35 hostnames.extend(nodespec['name'])
36 elif isinstance(nodespec['name'], StringTypes):
37 hostnames.append(nodespec['name'])
39 elif format in ['ip']:
41 spec.parseString(rspec)
43 ifspecs = spec.getDictsByTagName('IfSpec')
44 for ifspec in ifspecs:
45 if ifspec.has_key('addr') and ifspec['addr']:
46 ips.append(ifspec['addr'])
54 def display_list(results):
55 for result in results:
59 def display_records(recordList, dump = False):
60 ''' Print all fields in the record'''
61 for record in recordList:
62 display_record(record, dump)
64 def display_record(record, dump = False):
68 info = record.getdict()
69 print "%s (%s)" % (info['hrn'], info['type'])
73 def filter_records(type, records):
75 for record in records:
76 if (record['type'] == type) or (type == "all"):
77 filtered_records.append(record)
78 return filtered_records
82 def save_rspec_to_file(rspec, filename):
83 if not filename.endswith(".rspec"):
84 filename = filename + ".rspec"
86 f = open(filename, 'w')
91 def save_records_to_file(filename, recordList):
93 for record in recordList:
95 save_record_to_file(filename + "." + str(index), record)
97 save_record_to_file(filename, record)
100 def save_record_to_file(filename, record):
101 if record['type'] in ['user']:
102 record = UserRecord(dict = record)
103 elif record['type'] in ['slice']:
104 record = SliceRecord(dict = record)
105 elif record['type'] in ['node']:
106 record = NodeRecord(dict = record)
107 elif record['type'] in ['authority', 'ma', 'sa']:
108 record = AuthorityRecord(dict = record)
110 record = SfaRecord(dict = record)
111 str = record.save_to_string()
112 file(filename, "w").write(str)
117 def load_record_from_file(filename):
118 str = file(filename, "r").read()
119 record = SfaRecord(string=str)
134 def create_cmd_parser(self,command, additional_cmdargs = None):
135 cmdargs = {"gid": "",
141 "aggregates": "[name]",
142 "registries": "[name]",
144 "resources": "[name]",
145 "create": "name rspec",
146 "get_trusted_certs": "cred",
147 "get_ticket": "name rspec",
148 "redeem_ticket": "ticket",
154 "GetVersion": "name",
155 "ListResources": "name",
156 "CreateSliver": "name",
157 "get_geni_aggregates": "name"
160 if additional_cmdargs:
161 cmdargs.update(additional_cmdargs)
163 if command not in cmdargs:
164 print "Invalid command\n"
166 for key in cmdargs.keys():
171 parser = OptionParser(usage="sfi [sfi_options] %s [options] %s" \
172 % (command, cmdargs[command]))
174 if command in ("resources"):
175 parser.add_option("-f", "--format", dest="format",type="choice",
176 help="display format ([xml]|dns|ip)",default="xml",
177 choices=("xml","dns","ip"))
178 parser.add_option("-a", "--aggregate", dest="aggregate",
179 default=None, help="aggregate hrn")
181 if command in ("create", "get_ticket"):
182 parser.add_option("-a", "--aggregate", dest="aggregate",default=None,
183 help="aggregate hrn")
185 if command in ("start", "stop", "reset", "delete", "slices"):
186 parser.add_option("-c", "--component", dest="component",default=None,
187 help="component hrn")
189 if command in ("list", "show", "remove"):
190 parser.add_option("-t", "--type", dest="type",type="choice",
191 help="type filter ([all]|user|slice|sa|ma|node|aggregate)",
192 choices=("all","user","slice","sa","ma","node","aggregate"),
195 if command in ("resources", "show", "list"):
196 parser.add_option("-o", "--output", dest="file",
197 help="output XML to file", metavar="FILE", default=None)
199 if command in ("show", "list"):
200 parser.add_option("-f", "--format", dest="format", type="choice",
201 help="display format ([text]|xml)",default="text",
202 choices=("text","xml"))
204 if command in ("delegate"):
205 parser.add_option("-u", "--user",
206 action="store_true", dest="delegate_user", default=False,
207 help="delegate user credential")
208 parser.add_option("-s", "--slice", dest="delegate_slice",
209 help="delegate slice credential", metavar="HRN", default=None)
214 def create_parser(self):
216 # Generate command line parser
217 parser = OptionParser(usage="sfi [options] command [command_options] [command_args]",
218 description="Commands: gid,list,show,remove,add,update,nodes,slices,resources,create,delete,start,stop,reset")
219 parser.add_option("-g", "--geni_am", dest="geni_am",
220 help="geni am", metavar="URL", default=None)
221 parser.add_option("-r", "--registry", dest="registry",
222 help="root registry", metavar="URL", default=None)
223 parser.add_option("-s", "--slicemgr", dest="sm",
224 help="slice manager", metavar="URL", default=None)
225 default_sfi_dir=os.path.expanduser("~/.sfi/")
226 parser.add_option("-d", "--dir", dest="sfi_dir",
227 help="config & working directory - default is " + default_sfi_dir,
228 metavar="PATH", default = default_sfi_dir)
229 parser.add_option("-u", "--user", dest="user",
230 help="user name", metavar="HRN", default=None)
231 parser.add_option("-a", "--auth", dest="auth",
232 help="authority name", metavar="HRN", default=None)
233 parser.add_option("-v", "--verbose",
234 action="store_true", dest="verbose", default=False,
236 parser.add_option("-p", "--protocol",
237 dest="protocol", default="xmlrpc",
238 help="RPC protocol (xmlrpc or soap)")
239 parser.add_option("-k", "--hashrequest",
240 action="store_true", dest="hashrequest", default=False,
241 help="Create a hash of the request that will be authenticated on the server")
242 parser.disable_interspersed_args()
248 # Establish Connection to SliceMgr and Registry Servers
250 def set_servers(self):
251 config_file = self.options.sfi_dir + os.sep + "sfi_config"
253 config = Config (config_file)
255 print "Failed to read configuration file",config_file
256 print "Make sure to remove the export clauses and to add quotes"
257 if not self.options.verbose:
258 print "Re-run with -v for more details"
260 traceback.print_exc()
265 if (self.options.sm is not None):
266 sm_url = self.options.sm
267 elif hasattr(config,"SFI_SM"):
268 sm_url = config.SFI_SM
270 print "You need to set e.g. SFI_SM='http://your.slicemanager.url:12347/' in %s"%config_file
274 if (self.options.registry is not None):
275 reg_url = self.options.registry
276 elif hasattr(config,"SFI_REGISTRY"):
277 reg_url = config.SFI_REGISTRY
279 print "You need to set e.g. SFI_REGISTRY='http://your.registry.url:12345/' in %s"%config_file
283 if (self.options.geni_am is not None):
284 geni_am_url = self.options.geni_am
285 elif hasattr(config,"SFI_GENI_AM"):
286 geni_am_url = config.SFI_GENI_AM
289 if (self.options.user is not None):
290 self.user = self.options.user
291 elif hasattr(config,"SFI_USER"):
292 self.user = config.SFI_USER
294 print "You need to set e.g. SFI_USER='plc.princeton.username' in %s"%config_file
298 if (self.options.auth is not None):
299 self.authority = self.options.auth
300 elif hasattr(config,"SFI_AUTH"):
301 self.authority = config.SFI_AUTH
303 print "You need to set e.g. SFI_AUTH='plc.princeton' in %s"%config_file
309 if self.options.verbose :
310 print "Contacting Slice Manager at:", sm_url
311 print "Contacting Registry at:", reg_url
313 # Get key and certificate
314 key_file = self.get_key_file()
315 cert_file = self.get_cert_file(key_file)
316 self.key = Keypair(filename=key_file)
317 self.key_file = key_file
318 self.cert_file = cert_file
319 self.cert = Certificate(filename=cert_file)
320 # Establish connection to server(s)
321 self.registry = xmlrpcprotocol.get_server(reg_url, key_file, cert_file)
322 self.slicemgr = xmlrpcprotocol.get_server(sm_url, key_file, cert_file)
323 self.geni_am = xmlrpcprotocol.get_server(geni_am_url, key_file, cert_file)
327 # Get various credential and spec files
329 # Establishes limiting conventions
330 # - conflates MAs and SAs
331 # - assumes last token in slice name is unique
333 # Bootstraps credentials
334 # - bootstrap user credential from self-signed certificate
335 # - bootstrap authority credential from user credential
336 # - bootstrap slice credential from user credential
340 def get_key_file(self):
341 file=os.path.join(self.options.sfi_dir, self.user.replace(self.authority + '.', '') + ".pkey")
342 #file = os.path.join(self.options.sfi_dir, get_leaf(self.user) + ".pkey")
343 if (os.path.isfile(file)):
346 print "Key file", file, "does not exist"
350 def get_cert_file(self,key_file):
352 #file = os.path.join(self.options.sfi_dir, get_leaf(self.user) + ".cert")
353 file=os.path.join(self.options.sfi_dir, self.user.replace(self.authority + '.', '') + ".cert")
354 if (os.path.isfile(file)):
357 k = Keypair(filename = key_file)
358 cert = Certificate(subject=self.user)
360 cert.set_issuer(k, self.user)
362 if self.options.verbose :
363 print "Writing self-signed certificate to", file
364 cert.save_to_file(file)
368 #file = os.path.join(self.options.sfi_dir, get_leaf(self.user) + ".gid")
369 file=os.path.join(self.options.sfi_dir, self.user.replace(self.authority + '.', '') + ".gid")
370 if (os.path.isfile(file)):
371 gid = GID(filename=file)
374 cert_str = self.cert.save_to_string(save_parents=True)
375 gid_str = self.registry.get_gid(cert_str, self.user, "user")
376 gid = GID(string=gid_str)
377 if self.options.verbose:
378 print "Writing user gid to", file
379 gid.save_to_file(file, save_parents=True)
382 def get_user_cred(self):
383 #file = os.path.join(self.options.sfi_dir, get_leaf(self.user) + ".cred")
384 file=os.path.join(self.options.sfi_dir, self.user.replace(self.authority + '.', '') + ".cred")
385 if (os.path.isfile(file)):
386 user_cred = Credential(filename=file)
389 # bootstrap user credential
390 cert_string = self.cert.save_to_string(save_parents=True)
391 user_name=self.user.replace(self.authority+".", '')
392 if user_name.count(".") > 0:
393 user_name = user_name.replace(".", '_')
394 self.user=self.authority + "." + user_name
396 user_cred = self.registry.get_self_credential(cert_string, "user", self.user)
398 cred = Credential(string=user_cred)
399 cred.save_to_file(file, save_parents=True)
400 if self.options.verbose:
401 print "Writing user credential to", file
404 print "Failed to get user credential"
407 def get_auth_cred(self):
408 if not self.authority:
409 print "no authority specified. Use -a or set SF_AUTH"
412 file = os.path.join(self.options.sfi_dir, get_leaf("authority") +".cred")
413 if (os.path.isfile(file)):
414 auth_cred = Credential(filename=file)
417 # bootstrap authority credential from user credential
418 user_cred = self.get_user_cred().save_to_string(save_parents=True)
419 auth_cred = self.registry.get_credential(user_cred, "authority", self.authority)
421 cred = Credential(string=auth_cred)
422 cred.save_to_file(file, save_parents=True)
423 if self.options.verbose:
424 print "Writing authority credential to", file
427 print "Failed to get authority credential"
430 def get_slice_cred(self,name):
431 file = os.path.join(self.options.sfi_dir, "slice_" + get_leaf(name) + ".cred")
432 if (os.path.isfile(file)):
433 slice_cred = Credential(filename=file)
436 # bootstrap slice credential from user credential
437 user_cred = self.get_user_cred().save_to_string(save_parents=True)
438 arg_list = [user_cred, "slice", name]
439 slice_cred_str = self.registry.get_credential(user_cred, "slice", name)
441 slice_cred = Credential(string=slice_cred_str)
442 slice_cred.save_to_file(file, save_parents=True)
443 if self.options.verbose:
444 print "Writing slice credential to", file
447 print "Failed to get slice credential"
450 def delegate_cred(self,cred, hrn, type = 'authority'):
451 # the gid and hrn of the object we are delegating
452 user_cred = Credential(string=cred)
453 object_gid = user_cred.get_gid_object()
454 object_hrn = object_gid.get_hrn()
455 #cred.set_delegate(True)
456 #if not cred.get_delegate():
457 # raise Exception, "Error: Object credential %(object_hrn)s does not have delegate bit set" % locals()
460 records = self.registry.resolve(cred, hrn)
461 records = filter_records(type, records)
464 raise Exception, "Error: Didn't find a %(type)s record for %(hrn)s" % locals()
466 # the gid of the user who will be delegated too
467 record = SfaRecord(dict=records[0])
468 delegee_gid = record.get_gid_object()
469 delegee_hrn = delegee_gid.get_hrn()
471 # the key and hrn of the user who will be delegating
472 user_key = Keypair(filename = self.get_key_file())
473 user_hrn = user_cred.get_gid_caller().get_hrn()
475 dcred = Credential(subject=object_hrn + " delegated to " + delegee_hrn)
476 dcred.set_gid_caller(delegee_gid)
477 dcred.set_gid_object(object_gid)
478 dcred.set_privileges(user_cred.get_privileges())
479 dcred.set_delegate(True)
480 dcred.set_pubkey(object_gid.get_pubkey())
481 dcred.set_issuer(user_key, user_hrn)
482 dcred.set_parent(user_cred)
486 return dcred.save_to_string(save_parents=True)
488 def get_rspec_file(self,rspec):
489 if (os.path.isabs(rspec)):
492 file = os.path.join(self.options.sfi_dir, rspec)
493 if (os.path.isfile(file)):
496 print "No such rspec file", rspec
499 def get_record_file(self,record):
500 if (os.path.isabs(record)):
503 file = os.path.join(self.options.sfi_dir, record)
504 if (os.path.isfile(file)):
507 print "No such registry record file", record
510 def load_publickey_string(self,fn):
512 key_string = f.read()
514 # if the filename is a private key file, then extract the public key
515 if "PRIVATE KEY" in key_string:
516 outfn = tempfile.mktemp()
517 cmd = "openssl rsa -in " + fn + " -pubout -outform PEM -out " + outfn
520 key_string = f.read()
525 def get_component_server_from_hrn(self, hrn):
526 # direct connection to the nodes component manager interface
527 user_cred = self.get_user_cred().save_to_string(save_parents=True)
528 records = self.registry.resolve(user_cred, hrn)
529 records = filter_records('node', records)
531 print "No such component:", opts.component
534 url = "https://%s:%s" % (record['hostname'], cm_port)
535 return xmlrpcprotocol.get_server(url, self.key_file, self.cert_file)
538 # Following functions implement the commands
540 # Registry-related commands
543 def dispatch(self,command, cmd_opts, cmd_args):
544 getattr(self,command)(cmd_opts, cmd_args)
546 def gid(self, opts, args):
548 print "GID: %s" % (gid.save_to_string(save_parents=True))
551 # list entires in named authority registry
552 def list(self,opts, args):
553 user_cred = self.get_user_cred().save_to_string(save_parents=True)
556 list = self.registry.list(user_cred, hrn)
558 raise Exception, "Not enough parameters for the 'list' command"
560 # filter on person, slice, site, node, etc.
561 # THis really should be in the self.filter_records funct def comment...
562 list = filter_records(opts.type, list)
564 print "%s (%s)" % (record['hrn'], record['type'])
567 if not file.startswith(os.sep):
568 file = os.path.join(self.options.sfi_dir, file)
569 save_records_to_file(file, list)
572 # show named registry record
573 def show(self,opts, args):
574 user_cred = self.get_user_cred().save_to_string(save_parents=True)
576 records = self.registry.resolve(user_cred, hrn)
577 records = filter_records(opts.type, records)
579 print "No record of type", opts.type
580 for record in records:
581 if record['type'] in ['user']:
582 record = UserRecord(dict = record)
583 elif record['type'] in ['slice']:
584 record = SliceRecord(dict = record)
585 elif record['type'] in ['node']:
586 record = NodeRecord(dict = record)
587 elif record['type'] in ['authority', 'ma', 'sa']:
588 record = AuthorityRecord(dict = record)
590 record = SfaRecord(dict = record)
591 if (opts.format=="text"):
594 print record.save_to_string()
598 if not file.startswith(os.sep):
599 file = os.path.join(self.options.sfi_dir, file)
600 save_records_to_file(file, records)
603 def delegate(self,opts, args):
604 user_cred = self.get_user_cred()
605 if opts.delegate_user:
606 object_cred = user_cred
607 elif opts.delegate_slice:
608 object_cred = self.get_slice_cred(opts.delegate_slice)
610 print "Must specify either --user or --slice <hrn>"
613 # the gid and hrn of the object we are delegating
614 object_gid = object_cred.get_gid_object()
615 object_hrn = object_gid.get_hrn()
617 if not object_cred.get_delegate():
618 print "Error: Object credential", object_hrn, "does not have delegate bit set"
621 records = self.registry.resolve(user_cred, args[0])
622 records = filter_records("user", records)
625 print "Error: Didn't find a user record for", args[0]
628 # the gid of the user who will be delegated to
629 delegee_gid = records[0].get_gid_object()
630 delegee_hrn = delegee_gid.get_hrn()
632 # the key and hrn of the user who will be delegating
633 user_key = Keypair(filename = self.get_key_file())
634 user_hrn = user_cred.get_gid_caller().get_hrn()
636 dcred = Credential(subject=object_hrn + " delegated to " + delegee_hrn)
637 dcred.set_gid_caller(delegee_gid)
638 dcred.set_gid_object(object_gid)
639 dcred.set_privileges(object_cred.get_privileges())
640 dcred.set_delegate(True)
641 dcred.set_pubkey(object_gid.get_pubkey())
642 dcred.set_issuer(user_key, user_hrn)
643 dcred.set_parent(object_cred)
647 if opts.delegate_user:
648 dest_fn = os.path.join(self.options.sfi_dir, get_leaf(delegee_hrn) + "_"
649 + get_leaf(object_hrn) + ".cred")
650 elif opts.delegate_slice:
651 dest_fn = os.path_join(self.options.sfi_dir, get_leaf(delegee_hrn) + "_slice_"
652 + get_leaf(object_hrn) + ".cred")
654 dcred.save_to_file(dest_fn, save_parents = True)
656 print "delegated credential for", object_hrn, "to", delegee_hrn, "and wrote to", dest_fn
658 # removed named registry record
659 # - have to first retrieve the record to be removed
660 def remove(self,opts, args):
661 auth_cred = self.get_auth_cred().save_to_string(save_parents=True)
666 return self.registry.remove(auth_cred, type, hrn)
668 # add named registry record
669 def add(self,opts, args):
670 auth_cred = self.get_auth_cred().save_to_string(save_parents=True)
671 record_filepath = args[0]
672 rec_file = self.get_record_file(record_filepath)
673 record = load_record_from_file(rec_file).as_dict()
674 return self.registry.register(auth_cred, record)
676 # update named registry entry
677 def update(self,opts, args):
678 user_cred = self.get_user_cred()
679 rec_file = self.get_record_file(args[0])
680 record = load_record_from_file(rec_file)
681 if record['type'] == "user":
682 if record.get_name() == user_cred.get_gid_object().get_hrn():
683 cred = user_cred.save_to_string(save_parents=True)
685 cred = self.get_auth_cred().save_to_string(save_parents=True)
686 elif record['type'] in ["slice"]:
688 cred = self.get_slice_cred(record.get_name()).save_to_string(save_parents=True)
689 except ServerException, e:
690 # XXX smbaker -- once we have better error return codes, update this
691 # to do something better than a string compare
692 if "Permission error" in e.args[0]:
693 cred = self.get_auth_cred().save_to_string(save_parents=True)
696 elif record.get_type() in ["authority"]:
697 cred = self.get_auth_cred().save_to_string(save_parents=True)
698 elif record.get_type() == 'node':
699 cred = self.get_auth_cred().save_to_string(save_parents=True)
701 raise "unknown record type" + record.get_type()
702 record = record.as_dict()
703 return self.registry.update(cred, record)
705 def get_trusted_certs(self, opts, args):
707 return the trusted certs at this interface
709 trusted_certs = self.registry.get_trusted_certs()
710 for trusted_cert in trusted_certs:
711 cert = Certificate(string=trusted_cert)
712 print cert.get_subject()
715 def aggregates(self, opts, args):
717 return a list of details about known aggregates
719 user_cred = self.get_user_cred().save_to_string(save_parents=True)
724 result = self.registry.get_aggregates(user_cred, hrn)
728 def get_geni_aggregates(self, opts, args):
730 return a list of details about known aggregates
732 user_cred = self.get_user_cred().save_to_string(save_parents=True)
737 result = self.registry.get_geni_aggregates(user_cred, hrn)
742 def registries(self, opts, args):
744 return a list of details about known registries
746 user_cred = self.get_user_cred().save_to_string(save_parents=True)
750 result = self.registry.get_registries(user_cred, hrn)
756 # Slice-related commands
759 # list available nodes -- use 'resources' w/ no argument instead
761 # list instantiated slices
762 def slices(self,opts, args):
763 user_cred = self.get_user_cred().save_to_string(save_parents=True)
764 server = self.slicemgr
765 # direct connection to the nodes component manager interface
767 server = self.get_component_server_from_hrn(opts.component)
768 results = server.get_slices(user_cred)
769 display_list(results)
772 # show rspec for named slice
773 def resources(self,opts, args):
774 user_cred = self.get_user_cred().save_to_string(save_parents=True)
775 server = self.slicemgr
777 agg_hrn = opts.aggregate
778 aggregates = self.registry.get_aggregates(user_cred, agg_hrn)
780 raise Exception, "No such aggregate %s" % agg_hrn
781 aggregate = aggregates[0]
782 url = "http://%s:%s" % (aggregate['addr'], aggregate['port'])
783 server = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file)
785 cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True)
791 result = server.get_resources(cred, hrn)
794 display_rspec(result, format)
795 if (opts.file is not None):
797 if not file.startswith(os.sep):
798 file = os.path.join(self.options.sfi_dir, file)
799 save_rspec_to_file(result, file)
802 # created named slice with given rspec
803 def create(self,opts, args):
805 user_cred = self.get_user_cred()
806 slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True)
807 rspec_file = self.get_rspec_file(args[1])
808 rspec=open(rspec_file).read()
809 server = self.slicemgr
811 aggregates = self.registry.get_aggregates(user_cred, opts.aggregate)
813 raise Exception, "No such aggregate %s" % opts.aggregate
814 aggregate = aggregates[0]
815 url = "http://%s:%s" % (aggregate['addr'], aggregate['port'])
816 server = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file, self.options.protocol)
817 return server.create_slice(slice_cred, slice_hrn, rspec)
819 # get a ticket for the specified slice
820 def get_ticket(self, opts, args):
821 slice_hrn, rspec_path = args[0], args[1]
822 user_cred = self.get_user_cred()
823 slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True)
824 rspec_file = self.get_rspec_file(rspec_path)
825 rspec=open(rspec_file).read()
826 server = self.slicemgr
828 aggregates = self.registry.get_aggregates(user_cred, opts.aggregate)
830 raise Exception, "No such aggregate %s" % opts.aggregate
831 aggregate = aggregates[0]
832 url = "http://%s:%s" % (aggregate['addr'], aggregate['port'])
833 server = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file, self.options.protocol)
834 ticket_string = server.get_ticket(slice_cred, slice_hrn, rspec)
835 file = os.path.join(self.options.sfi_dir, get_leaf(slice_hrn) + ".ticket")
836 print "writing ticket to ", file
837 ticket = SfaTicket(string=ticket_string)
838 ticket.save_to_file(filename=file, save_parents=True)
840 def redeem_ticket(self, opts, args):
841 ticket_file = args[0]
843 # get slice hrn from the ticket
844 # use this to get the right slice credential
845 ticket = SfaTicket(filename=ticket_file)
847 slice_hrn=ticket.gidObject.get_hrn()
848 #slice_hrn = ticket.attributes['slivers'][0]['hrn']
849 user_cred = self.get_user_cred()
850 slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True)
852 # get a list node hostnames from the nodespecs in the rspec
854 rspec.parseString(ticket.rspec)
855 nodespecs = rspec.getDictsByTagName('NodeSpec')
856 hostnames = [nodespec['name'] for nodespec in nodespecs]
858 # create an xmlrpc connection to the component manager at each of these
859 # components and gall redeem_ticket
861 for hostname in hostnames:
864 url = "https://%(hostname)s:%(cm_port)s" % locals()
865 print "Calling redeem_ticket at %(url)s " % locals(),
866 cm = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file)
867 cm.redeem_ticket(slice_cred, ticket.save_to_string(save_parents=True))
869 except socket.gaierror:
871 print "Componet Manager not accepting requests"
873 print "Failed:", e.message
878 def delete(self,opts, args):
880 server = self.slicemgr
881 # direct connection to the nodes component manager interface
883 server = self.get_component_server_from_hrn(opts.component)
885 slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True)
886 return server.delete_slice(slice_cred, slice_hrn)
889 def start(self,opts, args):
891 server = self.slicemgr
892 # direct connection to the nodes component manager interface
894 server = self.get_component_server_from_hrn(opts.component)
896 slice_cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True)
897 return server.start_slice(slice_cred, slice_hrn)
900 def stop(self,opts, args):
902 server = self.slicemgr
903 # direct connection to the nodes component manager interface
905 server = self.get_component_server_from_hrn(opts.component)
907 slice_cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True)
908 return server.stop_slice(slice_cred, slice_hrn)
911 def reset(self,opts, args):
913 server = self.slicemgr
914 # direct connection to the nodes component manager interface
916 server = self.get_component_server_from_hrn(opts.component)
917 slice_cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True)
918 return server.reset_slice(slice_cred, slice_hrn)
921 # GENI AM related calls
923 def GetVersion(self,opts,args):
924 server = self.geni_am
925 print server.GetVersion()
927 def ListResources(self,opts,args):
928 user_cred = self.get_user_cred().save_to_string(save_parents=True)
929 server = self.geni_am
930 call_options = {'geni_compressed': True}
935 cred = self.get_slice_cred(xrn).save_to_string(save_parents=True)
938 call_options['geni_slice_urn'] = xrn
940 rspec = server.ListResources([user_cred], call_options)
941 rspec = zlib.decompress(rspec.decode('base64'))
944 def CreateSliver(self,opts,args):
946 user_cred = self.get_user_cred()
947 slice_cred = self.get_slice_cred(slice_xrn).save_to_string(save_parents=True)
948 rspec_file = self.get_rspec_file(args[1])
949 rspec = open(rspec_file).read()
950 server = self.geni_am
951 return server.CreateSliver(slice_xrn, [slice_cred], rspec)
953 # Main: parse arguments and dispatch to command
956 parser = self.create_parser()
957 (options, args) = parser.parse_args()
958 self.options = options
960 if options.hashrequest:
961 self.hashrequest=True
964 print "No command given. Use -h for help."
968 (cmd_opts, cmd_args) = self.create_cmd_parser(command).parse_args(args[1:])
969 if self.options.verbose :
970 print "Registry %s, sm %s, dir %s, user %s, auth %s" % (options.registry, options.sm,
971 options.sfi_dir, options.user,
973 print "Command %s" %command
974 if command in ("resources"):
975 print "resources cmd_opts %s" %cmd_opts.format
976 elif command in ("list","show","remove"):
977 print "cmd_opts.type %s" %cmd_opts.type
978 print "cmd_args %s" %cmd_args
983 self.dispatch(command, cmd_opts, cmd_args)
986 print "Command not found:", command
991 if __name__=="__main__":