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
23 # utility methods here
25 def display_rspec(rspec, format = 'rspec'):
28 spec.parseString(rspec)
30 nodespecs = spec.getDictsByTagName('NodeSpec')
31 for nodespec in nodespecs:
32 if nodespec.has_key('name') and nodespec['name']:
33 if isinstance(nodespec['name'], ListType):
34 hostnames.extend(nodespec['name'])
35 elif isinstance(nodespec['name'], StringTypes):
36 hostnames.append(nodespec['name'])
38 elif format in ['ip']:
40 spec.parseString(rspec)
42 ifspecs = spec.getDictsByTagName('IfSpec')
43 for ifspec in ifspecs:
44 if ifspec.has_key('addr') and ifspec['addr']:
45 ips.append(ifspec['addr'])
53 def display_list(results):
54 for result in results:
58 def display_records(recordList, dump = False):
59 ''' Print all fields in the record'''
60 for record in recordList:
61 display_record(record, dump)
63 def display_record(record, dump = False):
67 info = record.getdict()
68 print "%s (%s)" % (info['hrn'], info['type'])
72 def filter_records(type, records):
74 for record in records:
75 if (record['type'] == type) or (type == "all"):
76 filtered_records.append(record)
77 return filtered_records
81 def save_rspec_to_file(rspec, filename):
82 if not filename.endswith(".rspec"):
83 filename = filename + ".rspec"
85 f = open(filename, 'w')
90 def save_records_to_file(filename, recordList):
92 for record in recordList:
94 save_record_to_file(filename + "." + str(index), record)
96 save_record_to_file(filename, record)
99 def save_record_to_file(filename, record):
100 if record['type'] in ['user']:
101 record = UserRecord(dict = record)
102 elif record['type'] in ['slice']:
103 record = SliceRecord(dict = record)
104 elif record['type'] in ['node']:
105 record = NodeRecord(dict = record)
106 elif record['type'] in ['authority', 'ma', 'sa']:
107 record = AuthorityRecord(dict = record)
109 record = SfaRecord(dict = record)
110 str = record.save_to_string()
111 file(filename, "w").write(str)
116 def load_record_from_file(filename):
117 str = file(filename, "r").read()
118 record = SfaRecord(string=str)
133 def create_cmd_parser(self,command, additional_cmdargs = None):
134 cmdargs = {"gid": "",
140 "aggregates": "[name]",
141 "registries": "[name]",
143 "resources": "[name]",
144 "create": "name rspec",
145 "get_trusted_certs": "cred",
146 "get_ticket": "name rspec",
147 "redeem_ticket": "ticket",
153 "GetVersion": "name",
154 "ListResources": "name"
158 if additional_cmdargs:
159 cmdargs.update(additional_cmdargs)
161 if command not in cmdargs:
162 print "Invalid command\n"
164 for key in cmdargs.keys():
169 parser = OptionParser(usage="sfi [sfi_options] %s [options] %s" \
170 % (command, cmdargs[command]))
172 if command in ("resources"):
173 parser.add_option("-f", "--format", dest="format",type="choice",
174 help="display format ([xml]|dns|ip)",default="xml",
175 choices=("xml","dns","ip"))
176 parser.add_option("-a", "--aggregate", dest="aggregate",
177 default=None, help="aggregate hrn")
179 if command in ("create", "get_ticket"):
180 parser.add_option("-a", "--aggregate", dest="aggregate",default=None,
181 help="aggregate hrn")
183 if command in ("start", "stop", "reset", "delete", "slices"):
184 parser.add_option("-c", "--component", dest="component",default=None,
185 help="component hrn")
187 if command in ("list", "show", "remove"):
188 parser.add_option("-t", "--type", dest="type",type="choice",
189 help="type filter ([all]|user|slice|sa|ma|node|aggregate)",
190 choices=("all","user","slice","sa","ma","node","aggregate"),
193 if command in ("resources", "show", "list"):
194 parser.add_option("-o", "--output", dest="file",
195 help="output XML to file", metavar="FILE", default=None)
197 if command in ("show", "list"):
198 parser.add_option("-f", "--format", dest="format", type="choice",
199 help="display format ([text]|xml)",default="text",
200 choices=("text","xml"))
202 if command in ("delegate"):
203 parser.add_option("-u", "--user",
204 action="store_true", dest="delegate_user", default=False,
205 help="delegate user credential")
206 parser.add_option("-s", "--slice", dest="delegate_slice",
207 help="delegate slice credential", metavar="HRN", default=None)
212 def create_parser(self):
214 # Generate command line parser
215 parser = OptionParser(usage="sfi [options] command [command_options] [command_args]",
216 description="Commands: gid,list,show,remove,add,update,nodes,slices,resources,create,delete,start,stop,reset")
217 parser.add_option("-g", "--geni_am", dest="geni_am",
218 help="geni am", metavar="URL", default=None)
219 parser.add_option("-r", "--registry", dest="registry",
220 help="root registry", metavar="URL", default=None)
221 parser.add_option("-s", "--slicemgr", dest="sm",
222 help="slice manager", metavar="URL", default=None)
223 default_sfi_dir=os.path.expanduser("~/.sfi/")
224 parser.add_option("-d", "--dir", dest="sfi_dir",
225 help="config & working directory - default is " + default_sfi_dir,
226 metavar="PATH", default = default_sfi_dir)
227 parser.add_option("-u", "--user", dest="user",
228 help="user name", metavar="HRN", default=None)
229 parser.add_option("-a", "--auth", dest="auth",
230 help="authority name", metavar="HRN", default=None)
231 parser.add_option("-v", "--verbose",
232 action="store_true", dest="verbose", default=False,
234 parser.add_option("-p", "--protocol",
235 dest="protocol", default="xmlrpc",
236 help="RPC protocol (xmlrpc or soap)")
237 parser.add_option("-k", "--hashrequest",
238 action="store_true", dest="hashrequest", default=False,
239 help="Create a hash of the request that will be authenticated on the server")
240 parser.disable_interspersed_args()
246 # Establish Connection to SliceMgr and Registry Servers
248 def set_servers(self):
249 config_file = self.options.sfi_dir + os.sep + "sfi_config"
251 config = Config (config_file)
253 print "Failed to read configuration file",config_file
254 print "Make sure to remove the export clauses and to add quotes"
255 if not self.options.verbose:
256 print "Re-run with -v for more details"
258 traceback.print_exc()
263 if (self.options.sm is not None):
264 sm_url = self.options.sm
265 elif hasattr(config,"SFI_SM"):
266 sm_url = config.SFI_SM
268 print "You need to set e.g. SFI_SM='http://your.slicemanager.url:12347/' in %s"%config_file
272 if (self.options.registry is not None):
273 reg_url = self.options.registry
274 elif hasattr(config,"SFI_REGISTRY"):
275 reg_url = config.SFI_REGISTRY
277 print "You need to set e.g. SFI_REGISTRY='http://your.registry.url:12345/' in %s"%config_file
281 if (self.options.geni_am is not None):
282 geni_am_url = self.options.geni_am
283 elif hasattr(config,"SFI_GENI_AM"):
284 geni_am_url = config.SFI_GENI_AM
287 if (self.options.user is not None):
288 self.user = self.options.user
289 elif hasattr(config,"SFI_USER"):
290 self.user = config.SFI_USER
292 print "You need to set e.g. SFI_USER='plc.princeton.username' in %s"%config_file
296 if (self.options.auth is not None):
297 self.authority = self.options.auth
298 elif hasattr(config,"SFI_AUTH"):
299 self.authority = config.SFI_AUTH
301 print "You need to set e.g. SFI_AUTH='plc.princeton' in %s"%config_file
307 if self.options.verbose :
308 print "Contacting Slice Manager at:", sm_url
309 print "Contacting Registry at:", reg_url
311 # Get key and certificate
312 key_file = self.get_key_file()
313 cert_file = self.get_cert_file(key_file)
314 self.key = Keypair(filename=key_file)
315 self.key_file = key_file
316 self.cert_file = cert_file
317 self.cert = Certificate(filename=cert_file)
318 # Establish connection to server(s)
319 self.registry = xmlrpcprotocol.get_server(reg_url, key_file, cert_file)
320 self.slicemgr = xmlrpcprotocol.get_server(sm_url, key_file, cert_file)
321 self.geni_am = xmlrpcprotocol.get_server(geni_am_url, key_file, cert_file)
325 # Get various credential and spec files
327 # Establishes limiting conventions
328 # - conflates MAs and SAs
329 # - assumes last token in slice name is unique
331 # Bootstraps credentials
332 # - bootstrap user credential from self-signed certificate
333 # - bootstrap authority credential from user credential
334 # - bootstrap slice credential from user credential
338 def get_key_file(self):
339 file=os.path.join(self.options.sfi_dir, self.user.replace(self.authority + '.', '') + ".pkey")
340 #file = os.path.join(self.options.sfi_dir, get_leaf(self.user) + ".pkey")
341 if (os.path.isfile(file)):
344 print "Key file", file, "does not exist"
348 def get_cert_file(self,key_file):
350 #file = os.path.join(self.options.sfi_dir, get_leaf(self.user) + ".cert")
351 file=os.path.join(self.options.sfi_dir, self.user.replace(self.authority + '.', '') + ".cert")
352 if (os.path.isfile(file)):
355 k = Keypair(filename = key_file)
356 cert = Certificate(subject=self.user)
358 cert.set_issuer(k, self.user)
360 if self.options.verbose :
361 print "Writing self-signed certificate to", file
362 cert.save_to_file(file)
366 #file = os.path.join(self.options.sfi_dir, get_leaf(self.user) + ".gid")
367 file=os.path.join(self.options.sfi_dir, self.user.replace(self.authority + '.', '') + ".gid")
368 if (os.path.isfile(file)):
369 gid = GID(filename=file)
372 cert_str = self.cert.save_to_string(save_parents=True)
373 gid_str = self.registry.get_gid(cert_str, self.user, "user")
374 gid = GID(string=gid_str)
375 if self.options.verbose:
376 print "Writing user gid to", file
377 gid.save_to_file(file, save_parents=True)
380 def get_user_cred(self):
381 #file = os.path.join(self.options.sfi_dir, get_leaf(self.user) + ".cred")
382 file=os.path.join(self.options.sfi_dir, self.user.replace(self.authority + '.', '') + ".cred")
383 if (os.path.isfile(file)):
384 user_cred = Credential(filename=file)
387 # bootstrap user credential
388 cert_string = self.cert.save_to_string(save_parents=True)
389 user_name=self.user.replace(self.authority+".", '')
390 if user_name.count(".") > 0:
391 user_name = user_name.replace(".", '_')
392 self.user=self.authority + "." + user_name
394 user_cred = self.registry.get_self_credential(cert_string, "user", self.user)
396 cred = Credential(string=user_cred)
397 cred.save_to_file(file, save_parents=True)
398 if self.options.verbose:
399 print "Writing user credential to", file
402 print "Failed to get user credential"
405 def get_auth_cred(self):
406 if not self.authority:
407 print "no authority specified. Use -a or set SF_AUTH"
410 file = os.path.join(self.options.sfi_dir, get_leaf("authority") +".cred")
411 if (os.path.isfile(file)):
412 auth_cred = Credential(filename=file)
415 # bootstrap authority credential from user credential
416 user_cred = self.get_user_cred().save_to_string(save_parents=True)
417 auth_cred = self.registry.get_credential(user_cred, "authority", self.authority)
419 cred = Credential(string=auth_cred)
420 cred.save_to_file(file, save_parents=True)
421 if self.options.verbose:
422 print "Writing authority credential to", file
425 print "Failed to get authority credential"
428 def get_slice_cred(self,name):
429 file = os.path.join(self.options.sfi_dir, "slice_" + get_leaf(name) + ".cred")
430 if (os.path.isfile(file)):
431 slice_cred = Credential(filename=file)
434 # bootstrap slice credential from user credential
435 user_cred = self.get_user_cred().save_to_string(save_parents=True)
436 arg_list = [user_cred, "slice", name]
437 slice_cred_str = self.registry.get_credential(user_cred, "slice", name)
439 slice_cred = Credential(string=slice_cred_str)
440 slice_cred.save_to_file(file, save_parents=True)
441 if self.options.verbose:
442 print "Writing slice credential to", file
445 print "Failed to get slice credential"
448 def delegate_cred(self,cred, hrn, type = 'authority'):
449 # the gid and hrn of the object we are delegating
450 user_cred = Credential(string=cred)
451 object_gid = user_cred.get_gid_object()
452 object_hrn = object_gid.get_hrn()
453 #cred.set_delegate(True)
454 #if not cred.get_delegate():
455 # raise Exception, "Error: Object credential %(object_hrn)s does not have delegate bit set" % locals()
458 records = self.registry.resolve(cred, hrn)
459 records = filter_records(type, records)
462 raise Exception, "Error: Didn't find a %(type)s record for %(hrn)s" % locals()
464 # the gid of the user who will be delegated too
465 record = SfaRecord(dict=records[0])
466 delegee_gid = record.get_gid_object()
467 delegee_hrn = delegee_gid.get_hrn()
469 # the key and hrn of the user who will be delegating
470 user_key = Keypair(filename = self.get_key_file())
471 user_hrn = user_cred.get_gid_caller().get_hrn()
473 dcred = Credential(subject=object_hrn + " delegated to " + delegee_hrn)
474 dcred.set_gid_caller(delegee_gid)
475 dcred.set_gid_object(object_gid)
476 dcred.set_privileges(user_cred.get_privileges())
477 dcred.set_delegate(True)
478 dcred.set_pubkey(object_gid.get_pubkey())
479 dcred.set_issuer(user_key, user_hrn)
480 dcred.set_parent(user_cred)
484 return dcred.save_to_string(save_parents=True)
486 def get_rspec_file(self,rspec):
487 if (os.path.isabs(rspec)):
490 file = os.path.join(self.options.sfi_dir, rspec)
491 if (os.path.isfile(file)):
494 print "No such rspec file", rspec
497 def get_record_file(self,record):
498 if (os.path.isabs(record)):
501 file = os.path.join(self.options.sfi_dir, record)
502 if (os.path.isfile(file)):
505 print "No such registry record file", record
508 def load_publickey_string(self,fn):
510 key_string = f.read()
512 # if the filename is a private key file, then extract the public key
513 if "PRIVATE KEY" in key_string:
514 outfn = tempfile.mktemp()
515 cmd = "openssl rsa -in " + fn + " -pubout -outform PEM -out " + outfn
518 key_string = f.read()
523 def get_component_server_from_hrn(self, hrn):
524 # direct connection to the nodes component manager interface
525 user_cred = self.get_user_cred().save_to_string(save_parents=True)
526 records = self.registry.resolve(user_cred, hrn)
527 records = filter_records('node', records)
529 print "No such component:", opts.component
532 url = "https://%s:%s" % (record['hostname'], cm_port)
533 return xmlrpcprotocol.get_server(url, self.key_file, self.cert_file)
536 # Following functions implement the commands
538 # Registry-related commands
541 def dispatch(self,command, cmd_opts, cmd_args):
542 getattr(self,command)(cmd_opts, cmd_args)
544 def gid(self, opts, args):
546 print "GID: %s" % (gid.save_to_string(save_parents=True))
549 # list entires in named authority registry
550 def list(self,opts, args):
551 user_cred = self.get_user_cred().save_to_string(save_parents=True)
554 list = self.registry.list(user_cred, hrn)
556 raise Exception, "Not enough parameters for the 'list' command"
558 # filter on person, slice, site, node, etc.
559 # THis really should be in the self.filter_records funct def comment...
560 list = filter_records(opts.type, list)
562 print "%s (%s)" % (record['hrn'], record['type'])
565 if not file.startswith(os.sep):
566 file = os.path.join(self.options.sfi_dir, file)
567 save_records_to_file(file, list)
570 # show named registry record
571 def show(self,opts, args):
572 user_cred = self.get_user_cred().save_to_string(save_parents=True)
574 records = self.registry.resolve(user_cred, hrn)
575 records = filter_records(opts.type, records)
577 print "No record of type", opts.type
578 for record in records:
579 if record['type'] in ['user']:
580 record = UserRecord(dict = record)
581 elif record['type'] in ['slice']:
582 record = SliceRecord(dict = record)
583 elif record['type'] in ['node']:
584 record = NodeRecord(dict = record)
585 elif record['type'] in ['authority', 'ma', 'sa']:
586 record = AuthorityRecord(dict = record)
588 record = SfaRecord(dict = record)
589 if (opts.format=="text"):
592 print record.save_to_string()
596 if not file.startswith(os.sep):
597 file = os.path.join(self.options.sfi_dir, file)
598 save_records_to_file(file, records)
601 def delegate(self,opts, args):
602 user_cred = self.get_user_cred()
603 if opts.delegate_user:
604 object_cred = user_cred
605 elif opts.delegate_slice:
606 object_cred = self.get_slice_cred(opts.delegate_slice)
608 print "Must specify either --user or --slice <hrn>"
611 # the gid and hrn of the object we are delegating
612 object_gid = object_cred.get_gid_object()
613 object_hrn = object_gid.get_hrn()
615 if not object_cred.get_delegate():
616 print "Error: Object credential", object_hrn, "does not have delegate bit set"
619 records = self.registry.resolve(user_cred, args[0])
620 records = filter_records("user", records)
623 print "Error: Didn't find a user record for", args[0]
626 # the gid of the user who will be delegated to
627 delegee_gid = records[0].get_gid_object()
628 delegee_hrn = delegee_gid.get_hrn()
630 # the key and hrn of the user who will be delegating
631 user_key = Keypair(filename = self.get_key_file())
632 user_hrn = user_cred.get_gid_caller().get_hrn()
634 dcred = Credential(subject=object_hrn + " delegated to " + delegee_hrn)
635 dcred.set_gid_caller(delegee_gid)
636 dcred.set_gid_object(object_gid)
637 dcred.set_privileges(object_cred.get_privileges())
638 dcred.set_delegate(True)
639 dcred.set_pubkey(object_gid.get_pubkey())
640 dcred.set_issuer(user_key, user_hrn)
641 dcred.set_parent(object_cred)
645 if opts.delegate_user:
646 dest_fn = os.path.join(self.options.sfi_dir, get_leaf(delegee_hrn) + "_"
647 + get_leaf(object_hrn) + ".cred")
648 elif opts.delegate_slice:
649 dest_fn = os.path_join(self.options.sfi_dir, get_leaf(delegee_hrn) + "_slice_"
650 + get_leaf(object_hrn) + ".cred")
652 dcred.save_to_file(dest_fn, save_parents = True)
654 print "delegated credential for", object_hrn, "to", delegee_hrn, "and wrote to", dest_fn
656 # removed named registry record
657 # - have to first retrieve the record to be removed
658 def remove(self,opts, args):
659 auth_cred = self.get_auth_cred().save_to_string(save_parents=True)
664 return self.registry.remove(auth_cred, type, hrn)
666 # add named registry record
667 def add(self,opts, args):
668 auth_cred = self.get_auth_cred().save_to_string(save_parents=True)
669 record_filepath = args[0]
670 rec_file = self.get_record_file(record_filepath)
671 record = load_record_from_file(rec_file).as_dict()
672 return self.registry.register(auth_cred, record)
674 # update named registry entry
675 def update(self,opts, args):
676 user_cred = self.get_user_cred()
677 rec_file = self.get_record_file(args[0])
678 record = load_record_from_file(rec_file)
679 if record['type'] == "user":
680 if record.get_name() == user_cred.get_gid_object().get_hrn():
681 cred = user_cred.save_to_string(save_parents=True)
683 cred = self.get_auth_cred().save_to_string(save_parents=True)
684 elif record['type'] in ["slice"]:
686 cred = self.get_slice_cred(record.get_name()).save_to_string(save_parents=True)
687 except ServerException, e:
688 # XXX smbaker -- once we have better error return codes, update this
689 # to do something better than a string compare
690 if "Permission error" in e.args[0]:
691 cred = self.get_auth_cred().save_to_string(save_parents=True)
694 elif record.get_type() in ["authority"]:
695 cred = self.get_auth_cred().save_to_string(save_parents=True)
696 elif record.get_type() == 'node':
697 cred = self.get_auth_cred().save_to_string(save_parents=True)
699 raise "unknown record type" + record.get_type()
700 record = record.as_dict()
701 return self.registry.update(cred, record)
703 def get_trusted_certs(self, opts, args):
705 return the trusted certs at this interface
707 trusted_certs = self.registry.get_trusted_certs()
708 for trusted_cert in trusted_certs:
709 cert = Certificate(string=trusted_cert)
710 print cert.get_subject()
713 def aggregates(self, opts, args):
715 return a list of details about known aggregates
717 user_cred = self.get_user_cred().save_to_string(save_parents=True)
721 result = self.registry.get_aggregates(user_cred, hrn)
725 def registries(self, opts, args):
727 return a list of details about known registries
729 user_cred = self.get_user_cred().save_to_string(save_parents=True)
733 result = self.registry.get_registries(user_cred, hrn)
739 # Slice-related commands
742 # list available nodes -- use 'resources' w/ no argument instead
744 # list instantiated slices
745 def slices(self,opts, args):
746 user_cred = self.get_user_cred().save_to_string(save_parents=True)
747 server = self.slicemgr
748 # direct connection to the nodes component manager interface
750 server = self.get_component_server_from_hrn(opts.component)
751 results = server.get_slices(user_cred)
752 display_list(results)
755 # show rspec for named slice
756 def resources(self,opts, args):
757 user_cred = self.get_user_cred().save_to_string(save_parents=True)
758 server = self.slicemgr
760 agg_hrn = opts.aggregate
761 aggregates = self.registry.get_aggregates(user_cred, agg_hrn)
763 raise Exception, "No such aggregate %s" % agg_hrn
764 aggregate = aggregates[0]
765 url = "http://%s:%s" % (aggregate['addr'], aggregate['port'])
766 server = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file)
768 cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True)
774 result = server.get_resources(cred, hrn)
777 display_rspec(result, format)
778 if (opts.file is not None):
780 if not file.startswith(os.sep):
781 file = os.path.join(self.options.sfi_dir, file)
782 save_rspec_to_file(result, file)
785 # created named slice with given rspec
786 def create(self,opts, args):
788 user_cred = self.get_user_cred()
789 slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True)
790 rspec_file = self.get_rspec_file(args[1])
791 rspec=open(rspec_file).read()
792 server = self.slicemgr
794 aggregates = self.registry.get_aggregates(user_cred, opts.aggregate)
796 raise Exception, "No such aggregate %s" % opts.aggregate
797 aggregate = aggregates[0]
798 url = "http://%s:%s" % (aggregate['addr'], aggregate['port'])
799 server = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file, self.options.protocol)
800 return server.create_slice(slice_cred, slice_hrn, rspec)
802 # get a ticket for the specified slice
803 def get_ticket(self, opts, args):
804 slice_hrn, rspec_path = args[0], args[1]
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(rspec_path)
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 ticket_string = server.get_ticket(slice_cred, slice_hrn, rspec)
818 file = os.path.join(self.options.sfi_dir, get_leaf(slice_hrn) + ".ticket")
819 print "writing ticket to ", file
820 ticket = SfaTicket(string=ticket_string)
821 ticket.save_to_file(filename=file, save_parents=True)
823 def redeem_ticket(self, opts, args):
824 ticket_file = args[0]
826 # get slice hrn from the ticket
827 # use this to get the right slice credential
828 ticket = SfaTicket(filename=ticket_file)
830 slice_hrn=ticket.gidObject.get_hrn()
831 #slice_hrn = ticket.attributes['slivers'][0]['hrn']
832 user_cred = self.get_user_cred()
833 slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True)
835 # get a list node hostnames from the nodespecs in the rspec
837 rspec.parseString(ticket.rspec)
838 nodespecs = rspec.getDictsByTagName('NodeSpec')
839 hostnames = [nodespec['name'] for nodespec in nodespecs]
841 # create an xmlrpc connection to the component manager at each of these
842 # components and gall redeem_ticket
844 for hostname in hostnames:
847 url = "https://%(hostname)s:%(cm_port)s" % locals()
848 print "Calling redeem_ticket at %(url)s " % locals(),
849 cm = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file)
850 cm.redeem_ticket(slice_cred, ticket.save_to_string(save_parents=True))
852 except socket.gaierror:
854 print "Componet Manager not accepting requests"
856 print "Failed:", e.message
861 def delete(self,opts, args):
863 server = self.slicemgr
864 # direct connection to the nodes component manager interface
866 server = self.get_component_server_from_hrn(opts.component)
868 slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True)
869 return server.delete_slice(slice_cred, slice_hrn)
872 def start(self,opts, args):
874 server = self.slicemgr
875 # direct connection to the nodes component manager interface
877 server = self.get_component_server_from_hrn(opts.component)
879 slice_cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True)
880 return server.start_slice(slice_cred, slice_hrn)
883 def stop(self,opts, args):
885 server = self.slicemgr
886 # direct connection to the nodes component manager interface
888 server = self.get_component_server_from_hrn(opts.component)
890 slice_cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True)
891 return server.stop_slice(slice_cred, slice_hrn)
894 def reset(self,opts, args):
896 server = self.slicemgr
897 # direct connection to the nodes component manager interface
899 server = self.get_component_server_from_hrn(opts.component)
900 slice_cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True)
901 return server.reset_slice(slice_cred, slice_hrn)
904 # GENI AM related calls
906 def GetVersion(self,opts,args):
907 server = self.geni_am
908 print server.GetVersion()
910 def ListResources(self,opts,args):
911 user_cred = self.get_user_cred().save_to_string(save_parents=True)
912 server = self.geni_am
914 return server.ListResources([user_cred], call_options)
918 # Main: parse arguments and dispatch to command
921 parser = self.create_parser()
922 (options, args) = parser.parse_args()
923 self.options = options
925 if options.hashrequest:
926 self.hashrequest=True
929 print "No command given. Use -h for help."
933 (cmd_opts, cmd_args) = self.create_cmd_parser(command).parse_args(args[1:])
934 if self.options.verbose :
935 print "Registry %s, sm %s, dir %s, user %s, auth %s" % (options.registry, options.sm,
936 options.sfi_dir, options.user,
938 print "Command %s" %command
939 if command in ("resources"):
940 print "resources cmd_opts %s" %cmd_opts.format
941 elif command in ("list","show","remove"):
942 print "cmd_opts.type %s" %cmd_opts.type
943 print "cmd_args %s" %cmd_args
948 self.dispatch(command, cmd_opts, cmd_args)
951 print "Command not found:", command
956 if __name__=="__main__":