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",
157 if additional_cmdargs:
158 cmdargs.update(additional_cmdargs)
160 if command not in cmdargs:
161 print "Invalid command\n"
163 for key in cmdargs.keys():
168 parser = OptionParser(usage="sfi [sfi_options] %s [options] %s" \
169 % (command, cmdargs[command]))
171 if command in ("resources"):
172 parser.add_option("-f", "--format", dest="format",type="choice",
173 help="display format ([xml]|dns|ip)",default="xml",
174 choices=("xml","dns","ip"))
175 parser.add_option("-a", "--aggregate", dest="aggregate",
176 default=None, help="aggregate hrn")
178 if command in ("create", "get_ticket"):
179 parser.add_option("-a", "--aggregate", dest="aggregate",default=None,
180 help="aggregate hrn")
182 if command in ("start", "stop", "reset", "delete", "slices"):
183 parser.add_option("-c", "--component", dest="component",default=None,
184 help="component hrn")
186 if command in ("list", "show", "remove"):
187 parser.add_option("-t", "--type", dest="type",type="choice",
188 help="type filter ([all]|user|slice|sa|ma|node|aggregate)",
189 choices=("all","user","slice","sa","ma","node","aggregate"),
192 if command in ("resources", "show", "list"):
193 parser.add_option("-o", "--output", dest="file",
194 help="output XML to file", metavar="FILE", default=None)
196 if command in ("show", "list"):
197 parser.add_option("-f", "--format", dest="format", type="choice",
198 help="display format ([text]|xml)",default="text",
199 choices=("text","xml"))
201 if command in ("delegate"):
202 parser.add_option("-u", "--user",
203 action="store_true", dest="delegate_user", default=False,
204 help="delegate user credential")
205 parser.add_option("-s", "--slice", dest="delegate_slice",
206 help="delegate slice credential", metavar="HRN", default=None)
211 def create_parser(self):
213 # Generate command line parser
214 parser = OptionParser(usage="sfi [options] command [command_options] [command_args]",
215 description="Commands: gid,list,show,remove,add,update,nodes,slices,resources,create,delete,start,stop,reset")
216 parser.add_option("-g", "--geni_am", dest="geni_am",
217 help="geni am", metavar="URL", default=None)
218 parser.add_option("-r", "--registry", dest="registry",
219 help="root registry", metavar="URL", default=None)
220 parser.add_option("-s", "--slicemgr", dest="sm",
221 help="slice manager", metavar="URL", default=None)
222 default_sfi_dir=os.path.expanduser("~/.sfi/")
223 parser.add_option("-d", "--dir", dest="sfi_dir",
224 help="config & working directory - default is " + default_sfi_dir,
225 metavar="PATH", default = default_sfi_dir)
226 parser.add_option("-u", "--user", dest="user",
227 help="user name", metavar="HRN", default=None)
228 parser.add_option("-a", "--auth", dest="auth",
229 help="authority name", metavar="HRN", default=None)
230 parser.add_option("-v", "--verbose",
231 action="store_true", dest="verbose", default=False,
233 parser.add_option("-p", "--protocol",
234 dest="protocol", default="xmlrpc",
235 help="RPC protocol (xmlrpc or soap)")
236 parser.add_option("-k", "--hashrequest",
237 action="store_true", dest="hashrequest", default=False,
238 help="Create a hash of the request that will be authenticated on the server")
239 parser.disable_interspersed_args()
245 # Establish Connection to SliceMgr and Registry Servers
247 def set_servers(self):
248 config_file = self.options.sfi_dir + os.sep + "sfi_config"
250 config = Config (config_file)
252 print "Failed to read configuration file",config_file
253 print "Make sure to remove the export clauses and to add quotes"
254 if not self.options.verbose:
255 print "Re-run with -v for more details"
257 traceback.print_exc()
262 if (self.options.sm is not None):
263 sm_url = self.options.sm
264 elif hasattr(config,"SFI_SM"):
265 sm_url = config.SFI_SM
267 print "You need to set e.g. SFI_SM='http://your.slicemanager.url:12347/' in %s"%config_file
271 if (self.options.registry is not None):
272 reg_url = self.options.registry
273 elif hasattr(config,"SFI_REGISTRY"):
274 reg_url = config.SFI_REGISTRY
276 print "You need to set e.g. SFI_REGISTRY='http://your.registry.url:12345/' in %s"%config_file
280 if (self.options.geni_am is not None):
281 geni_am_url = self.options.geni_am
282 elif hasattr(config,"SFI_GENI_AM"):
283 geni_am_url = config.SFI_GENI_AM
286 if (self.options.user is not None):
287 self.user = self.options.user
288 elif hasattr(config,"SFI_USER"):
289 self.user = config.SFI_USER
291 print "You need to set e.g. SFI_USER='plc.princeton.username' in %s"%config_file
295 if (self.options.auth is not None):
296 self.authority = self.options.auth
297 elif hasattr(config,"SFI_AUTH"):
298 self.authority = config.SFI_AUTH
300 print "You need to set e.g. SFI_AUTH='plc.princeton' in %s"%config_file
306 if self.options.verbose :
307 print "Contacting Slice Manager at:", sm_url
308 print "Contacting Registry at:", reg_url
310 # Get key and certificate
311 key_file = self.get_key_file()
312 cert_file = self.get_cert_file(key_file)
313 self.key = Keypair(filename=key_file)
314 self.key_file = key_file
315 self.cert_file = cert_file
316 self.cert = Certificate(filename=cert_file)
317 # Establish connection to server(s)
318 self.registry = xmlrpcprotocol.get_server(reg_url, key_file, cert_file)
319 self.slicemgr = xmlrpcprotocol.get_server(sm_url, key_file, cert_file)
320 self.geni_am = xmlrpcprotocol.get_server(geni_am_url, key_file, cert_file)
324 # Get various credential and spec files
326 # Establishes limiting conventions
327 # - conflates MAs and SAs
328 # - assumes last token in slice name is unique
330 # Bootstraps credentials
331 # - bootstrap user credential from self-signed certificate
332 # - bootstrap authority credential from user credential
333 # - bootstrap slice credential from user credential
337 def get_key_file(self):
338 file=os.path.join(self.options.sfi_dir, self.user.replace(self.authority + '.', '') + ".pkey")
339 #file = os.path.join(self.options.sfi_dir, get_leaf(self.user) + ".pkey")
340 if (os.path.isfile(file)):
343 print "Key file", file, "does not exist"
347 def get_cert_file(self,key_file):
349 #file = os.path.join(self.options.sfi_dir, get_leaf(self.user) + ".cert")
350 file=os.path.join(self.options.sfi_dir, self.user.replace(self.authority + '.', '') + ".cert")
351 if (os.path.isfile(file)):
354 k = Keypair(filename = key_file)
355 cert = Certificate(subject=self.user)
357 cert.set_issuer(k, self.user)
359 if self.options.verbose :
360 print "Writing self-signed certificate to", file
361 cert.save_to_file(file)
365 #file = os.path.join(self.options.sfi_dir, get_leaf(self.user) + ".gid")
366 file=os.path.join(self.options.sfi_dir, self.user.replace(self.authority + '.', '') + ".gid")
367 if (os.path.isfile(file)):
368 gid = GID(filename=file)
371 cert_str = self.cert.save_to_string(save_parents=True)
372 gid_str = self.registry.get_gid(cert_str, self.user, "user")
373 gid = GID(string=gid_str)
374 if self.options.verbose:
375 print "Writing user gid to", file
376 gid.save_to_file(file, save_parents=True)
379 def get_user_cred(self):
380 #file = os.path.join(self.options.sfi_dir, get_leaf(self.user) + ".cred")
381 file=os.path.join(self.options.sfi_dir, self.user.replace(self.authority + '.', '') + ".cred")
382 if (os.path.isfile(file)):
383 user_cred = Credential(filename=file)
386 # bootstrap user credential
387 cert_string = self.cert.save_to_string(save_parents=True)
388 user_name=self.user.replace(self.authority+".", '')
389 if user_name.count(".") > 0:
390 user_name = user_name.replace(".", '_')
391 self.user=self.authority + "." + user_name
393 user_cred = self.registry.get_self_credential(cert_string, "user", self.user)
395 cred = Credential(string=user_cred)
396 cred.save_to_file(file, save_parents=True)
397 if self.options.verbose:
398 print "Writing user credential to", file
401 print "Failed to get user credential"
404 def get_auth_cred(self):
405 if not self.authority:
406 print "no authority specified. Use -a or set SF_AUTH"
409 file = os.path.join(self.options.sfi_dir, get_leaf("authority") +".cred")
410 if (os.path.isfile(file)):
411 auth_cred = Credential(filename=file)
414 # bootstrap authority credential from user credential
415 user_cred = self.get_user_cred().save_to_string(save_parents=True)
416 auth_cred = self.registry.get_credential(user_cred, "authority", self.authority)
418 cred = Credential(string=auth_cred)
419 cred.save_to_file(file, save_parents=True)
420 if self.options.verbose:
421 print "Writing authority credential to", file
424 print "Failed to get authority credential"
427 def get_slice_cred(self,name):
428 file = os.path.join(self.options.sfi_dir, "slice_" + get_leaf(name) + ".cred")
429 if (os.path.isfile(file)):
430 slice_cred = Credential(filename=file)
433 # bootstrap slice credential from user credential
434 user_cred = self.get_user_cred().save_to_string(save_parents=True)
435 arg_list = [user_cred, "slice", name]
436 slice_cred_str = self.registry.get_credential(user_cred, "slice", name)
438 slice_cred = Credential(string=slice_cred_str)
439 slice_cred.save_to_file(file, save_parents=True)
440 if self.options.verbose:
441 print "Writing slice credential to", file
444 print "Failed to get slice credential"
447 def delegate_cred(self,cred, hrn, type = 'authority'):
448 # the gid and hrn of the object we are delegating
449 user_cred = Credential(string=cred)
450 object_gid = user_cred.get_gid_object()
451 object_hrn = object_gid.get_hrn()
452 #cred.set_delegate(True)
453 #if not cred.get_delegate():
454 # raise Exception, "Error: Object credential %(object_hrn)s does not have delegate bit set" % locals()
457 records = self.registry.resolve(cred, hrn)
458 records = filter_records(type, records)
461 raise Exception, "Error: Didn't find a %(type)s record for %(hrn)s" % locals()
463 # the gid of the user who will be delegated too
464 record = SfaRecord(dict=records[0])
465 delegee_gid = record.get_gid_object()
466 delegee_hrn = delegee_gid.get_hrn()
468 # the key and hrn of the user who will be delegating
469 user_key = Keypair(filename = self.get_key_file())
470 user_hrn = user_cred.get_gid_caller().get_hrn()
472 dcred = Credential(subject=object_hrn + " delegated to " + delegee_hrn)
473 dcred.set_gid_caller(delegee_gid)
474 dcred.set_gid_object(object_gid)
475 dcred.set_privileges(user_cred.get_privileges())
476 dcred.set_delegate(True)
477 dcred.set_pubkey(object_gid.get_pubkey())
478 dcred.set_issuer(user_key, user_hrn)
479 dcred.set_parent(user_cred)
483 return dcred.save_to_string(save_parents=True)
485 def get_rspec_file(self,rspec):
486 if (os.path.isabs(rspec)):
489 file = os.path.join(self.options.sfi_dir, rspec)
490 if (os.path.isfile(file)):
493 print "No such rspec file", rspec
496 def get_record_file(self,record):
497 if (os.path.isabs(record)):
500 file = os.path.join(self.options.sfi_dir, record)
501 if (os.path.isfile(file)):
504 print "No such registry record file", record
507 def load_publickey_string(self,fn):
509 key_string = f.read()
511 # if the filename is a private key file, then extract the public key
512 if "PRIVATE KEY" in key_string:
513 outfn = tempfile.mktemp()
514 cmd = "openssl rsa -in " + fn + " -pubout -outform PEM -out " + outfn
517 key_string = f.read()
522 def get_component_server_from_hrn(self, hrn):
523 # direct connection to the nodes component manager interface
524 user_cred = self.get_user_cred().save_to_string(save_parents=True)
525 records = self.registry.resolve(user_cred, hrn)
526 records = filter_records('node', records)
528 print "No such component:", opts.component
531 url = "https://%s:%s" % (record['hostname'], cm_port)
532 return xmlrpcprotocol.get_server(url, self.key_file, self.cert_file)
535 # Following functions implement the commands
537 # Registry-related commands
540 def dispatch(self,command, cmd_opts, cmd_args):
541 getattr(self,command)(cmd_opts, cmd_args)
543 def gid(self, opts, args):
545 print "GID: %s" % (gid.save_to_string(save_parents=True))
548 # list entires in named authority registry
549 def list(self,opts, args):
550 user_cred = self.get_user_cred().save_to_string(save_parents=True)
553 list = self.registry.list(user_cred, hrn)
555 raise Exception, "Not enough parameters for the 'list' command"
557 # filter on person, slice, site, node, etc.
558 # THis really should be in the self.filter_records funct def comment...
559 list = filter_records(opts.type, list)
561 print "%s (%s)" % (record['hrn'], record['type'])
564 if not file.startswith(os.sep):
565 file = os.path.join(self.options.sfi_dir, file)
566 save_records_to_file(file, list)
569 # show named registry record
570 def show(self,opts, args):
571 user_cred = self.get_user_cred().save_to_string(save_parents=True)
573 records = self.registry.resolve(user_cred, hrn)
574 records = filter_records(opts.type, records)
576 print "No record of type", opts.type
577 for record in records:
578 if record['type'] in ['user']:
579 record = UserRecord(dict = record)
580 elif record['type'] in ['slice']:
581 record = SliceRecord(dict = record)
582 elif record['type'] in ['node']:
583 record = NodeRecord(dict = record)
584 elif record['type'] in ['authority', 'ma', 'sa']:
585 record = AuthorityRecord(dict = record)
587 record = SfaRecord(dict = record)
588 if (opts.format=="text"):
591 print record.save_to_string()
595 if not file.startswith(os.sep):
596 file = os.path.join(self.options.sfi_dir, file)
597 save_records_to_file(file, records)
600 def delegate(self,opts, args):
601 user_cred = self.get_user_cred()
602 if opts.delegate_user:
603 object_cred = user_cred
604 elif opts.delegate_slice:
605 object_cred = self.get_slice_cred(opts.delegate_slice)
607 print "Must specify either --user or --slice <hrn>"
610 # the gid and hrn of the object we are delegating
611 object_gid = object_cred.get_gid_object()
612 object_hrn = object_gid.get_hrn()
614 if not object_cred.get_delegate():
615 print "Error: Object credential", object_hrn, "does not have delegate bit set"
618 records = self.registry.resolve(user_cred, args[0])
619 records = filter_records("user", records)
622 print "Error: Didn't find a user record for", args[0]
625 # the gid of the user who will be delegated to
626 delegee_gid = records[0].get_gid_object()
627 delegee_hrn = delegee_gid.get_hrn()
629 # the key and hrn of the user who will be delegating
630 user_key = Keypair(filename = self.get_key_file())
631 user_hrn = user_cred.get_gid_caller().get_hrn()
633 dcred = Credential(subject=object_hrn + " delegated to " + delegee_hrn)
634 dcred.set_gid_caller(delegee_gid)
635 dcred.set_gid_object(object_gid)
636 dcred.set_privileges(object_cred.get_privileges())
637 dcred.set_delegate(True)
638 dcred.set_pubkey(object_gid.get_pubkey())
639 dcred.set_issuer(user_key, user_hrn)
640 dcred.set_parent(object_cred)
644 if opts.delegate_user:
645 dest_fn = os.path.join(self.options.sfi_dir, get_leaf(delegee_hrn) + "_"
646 + get_leaf(object_hrn) + ".cred")
647 elif opts.delegate_slice:
648 dest_fn = os.path_join(self.options.sfi_dir, get_leaf(delegee_hrn) + "_slice_"
649 + get_leaf(object_hrn) + ".cred")
651 dcred.save_to_file(dest_fn, save_parents = True)
653 print "delegated credential for", object_hrn, "to", delegee_hrn, "and wrote to", dest_fn
655 # removed named registry record
656 # - have to first retrieve the record to be removed
657 def remove(self,opts, args):
658 auth_cred = self.get_auth_cred().save_to_string(save_parents=True)
663 return self.registry.remove(auth_cred, type, hrn)
665 # add named registry record
666 def add(self,opts, args):
667 auth_cred = self.get_auth_cred().save_to_string(save_parents=True)
668 record_filepath = args[0]
669 rec_file = self.get_record_file(record_filepath)
670 record = load_record_from_file(rec_file).as_dict()
671 return self.registry.register(auth_cred, record)
673 # update named registry entry
674 def update(self,opts, args):
675 user_cred = self.get_user_cred()
676 rec_file = self.get_record_file(args[0])
677 record = load_record_from_file(rec_file)
678 if record['type'] == "user":
679 if record.get_name() == user_cred.get_gid_object().get_hrn():
680 cred = user_cred.save_to_string(save_parents=True)
682 cred = self.get_auth_cred().save_to_string(save_parents=True)
683 elif record['type'] in ["slice"]:
685 cred = self.get_slice_cred(record.get_name()).save_to_string(save_parents=True)
686 except ServerException, e:
687 # XXX smbaker -- once we have better error return codes, update this
688 # to do something better than a string compare
689 if "Permission error" in e.args[0]:
690 cred = self.get_auth_cred().save_to_string(save_parents=True)
693 elif record.get_type() in ["authority"]:
694 cred = self.get_auth_cred().save_to_string(save_parents=True)
695 elif record.get_type() == 'node':
696 cred = self.get_auth_cred().save_to_string(save_parents=True)
698 raise "unknown record type" + record.get_type()
699 record = record.as_dict()
700 return self.registry.update(cred, record)
702 def get_trusted_certs(self, opts, args):
704 return the trusted certs at this interface
706 trusted_certs = self.registry.get_trusted_certs()
707 for trusted_cert in trusted_certs:
708 cert = Certificate(string=trusted_cert)
709 print cert.get_subject()
712 def aggregates(self, opts, args):
714 return a list of details about known aggregates
716 user_cred = self.get_user_cred().save_to_string(save_parents=True)
720 result = self.registry.get_aggregates(user_cred, hrn)
724 def registries(self, opts, args):
726 return a list of details about known registries
728 user_cred = self.get_user_cred().save_to_string(save_parents=True)
732 result = self.registry.get_registries(user_cred, hrn)
738 # Slice-related commands
741 # list available nodes -- use 'resources' w/ no argument instead
743 # list instantiated slices
744 def slices(self,opts, args):
745 user_cred = self.get_user_cred().save_to_string(save_parents=True)
746 server = self.slicemgr
747 # direct connection to the nodes component manager interface
749 server = self.get_component_server_from_hrn(opts.component)
750 results = server.get_slices(user_cred)
751 display_list(results)
754 # show rspec for named slice
755 def resources(self,opts, args):
756 user_cred = self.get_user_cred().save_to_string(save_parents=True)
757 server = self.slicemgr
759 agg_hrn = opts.aggregate
760 aggregates = self.registry.get_aggregates(user_cred, agg_hrn)
762 raise Exception, "No such aggregate %s" % agg_hrn
763 aggregate = aggregates[0]
764 url = "http://%s:%s" % (aggregate['addr'], aggregate['port'])
765 server = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file)
767 cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True)
773 result = server.get_resources(cred, hrn)
776 display_rspec(result, format)
777 if (opts.file is not None):
779 if not file.startswith(os.sep):
780 file = os.path.join(self.options.sfi_dir, file)
781 save_rspec_to_file(result, file)
784 # created named slice with given rspec
785 def create(self,opts, args):
787 user_cred = self.get_user_cred()
788 slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True)
789 rspec_file = self.get_rspec_file(args[1])
790 rspec=open(rspec_file).read()
791 server = self.slicemgr
793 aggregates = self.registry.get_aggregates(user_cred, opts.aggregate)
795 raise Exception, "No such aggregate %s" % opts.aggregate
796 aggregate = aggregates[0]
797 url = "http://%s:%s" % (aggregate['addr'], aggregate['port'])
798 server = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file, self.options.protocol)
799 return server.create_slice(slice_cred, slice_hrn, rspec)
801 # get a ticket for the specified slice
802 def get_ticket(self, opts, args):
803 slice_hrn, rspec_path = args[0], args[1]
804 user_cred = self.get_user_cred()
805 slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True)
806 rspec_file = self.get_rspec_file(rspec_path)
807 rspec=open(rspec_file).read()
808 server = self.slicemgr
810 aggregates = self.registry.get_aggregates(user_cred, opts.aggregate)
812 raise Exception, "No such aggregate %s" % opts.aggregate
813 aggregate = aggregates[0]
814 url = "http://%s:%s" % (aggregate['addr'], aggregate['port'])
815 server = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file, self.options.protocol)
816 ticket_string = server.get_ticket(slice_cred, slice_hrn, rspec)
817 file = os.path.join(self.options.sfi_dir, get_leaf(slice_hrn) + ".ticket")
818 print "writing ticket to ", file
819 ticket = SfaTicket(string=ticket_string)
820 ticket.save_to_file(filename=file, save_parents=True)
822 def redeem_ticket(self, opts, args):
823 ticket_file = args[0]
825 # get slice hrn from the ticket
826 # use this to get the right slice credential
827 ticket = SfaTicket(filename=ticket_file)
829 slice_hrn=ticket.gidObject.get_hrn()
830 #slice_hrn = ticket.attributes['slivers'][0]['hrn']
831 user_cred = self.get_user_cred()
832 slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True)
834 # get a list node hostnames from the nodespecs in the rspec
836 rspec.parseString(ticket.rspec)
837 nodespecs = rspec.getDictsByTagName('NodeSpec')
838 hostnames = [nodespec['name'] for nodespec in nodespecs]
840 # create an xmlrpc connection to the component manager at each of these
841 # components and gall redeem_ticket
843 for hostname in hostnames:
846 url = "https://%(hostname)s:%(cm_port)s" % locals()
847 print "Calling redeem_ticket at %(url)s " % locals(),
848 cm = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file)
849 cm.redeem_ticket(slice_cred, ticket.save_to_string(save_parents=True))
851 except socket.gaierror:
853 print "Componet Manager not accepting requests"
855 print "Failed:", e.message
860 def delete(self,opts, args):
862 server = self.slicemgr
863 # direct connection to the nodes component manager interface
865 server = self.get_component_server_from_hrn(opts.component)
867 slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True)
868 return server.delete_slice(slice_cred, slice_hrn)
871 def start(self,opts, args):
873 server = self.slicemgr
874 # direct connection to the nodes component manager interface
876 server = self.get_component_server_from_hrn(opts.component)
878 slice_cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True)
879 return server.start_slice(slice_cred, slice_hrn)
882 def stop(self,opts, args):
884 server = self.slicemgr
885 # direct connection to the nodes component manager interface
887 server = self.get_component_server_from_hrn(opts.component)
889 slice_cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True)
890 return server.stop_slice(slice_cred, slice_hrn)
893 def reset(self,opts, args):
895 server = self.slicemgr
896 # direct connection to the nodes component manager interface
898 server = self.get_component_server_from_hrn(opts.component)
899 slice_cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True)
900 return server.reset_slice(slice_cred, slice_hrn)
903 # GENI AM related calls
905 def GetVersion(self,opts,args):
906 server = self.geni_am
907 print server.GetVersion()
910 # Main: parse arguments and dispatch to command
913 parser = self.create_parser()
914 (options, args) = parser.parse_args()
915 self.options = options
917 if options.hashrequest:
918 self.hashrequest=True
921 print "No command given. Use -h for help."
925 (cmd_opts, cmd_args) = self.create_cmd_parser(command).parse_args(args[1:])
926 if self.options.verbose :
927 print "Registry %s, sm %s, dir %s, user %s, auth %s" % (options.registry, options.sm,
928 options.sfi_dir, options.user,
930 print "Command %s" %command
931 if command in ("resources"):
932 print "resources cmd_opts %s" %cmd_opts.format
933 elif command in ("list","show","remove"):
934 print "cmd_opts.type %s" %cmd_opts.type
935 print "cmd_args %s" %cmd_args
940 self.dispatch(command, cmd_opts, cmd_args)
943 print "Command not found:", command
948 if __name__=="__main__":