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.geniclient import GeniClient
16 from sfa.util.sfaticket import SfaTicket
17 from sfa.util.record import *
18 from sfa.util.namespace import *
19 from sfa.util.rspec import RSpec
20 from sfa.util.xmlrpcprotocol import ServerException
21 import sfa.util.xmlrpcprotocol as xmlrpcprotocol
22 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 = GeniRecord(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 = GeniRecord(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",
155 if additional_cmdargs:
156 cmdargs.update(additional_cmdargs)
158 if command not in cmdargs:
159 print "Invalid command\n"
161 for key in cmdargs.keys():
166 parser = OptionParser(usage="sfi [sfi_options] %s [options] %s" \
167 % (command, cmdargs[command]))
169 if command in ("resources"):
170 parser.add_option("-f", "--format", dest="format",type="choice",
171 help="display format ([xml]|dns|ip)",default="xml",
172 choices=("xml","dns","ip"))
173 parser.add_option("-a", "--aggregate", dest="aggregate",
174 default=None, help="aggregate hrn")
176 if command in ("create", "get_ticket"):
177 parser.add_option("-a", "--aggregate", dest="aggregate",default=None,
178 help="aggregate hrn")
180 if command in ("start", "stop", "reset", "delete", "slices"):
181 parser.add_option("-c", "--component", dest="component",default=None,
182 help="component hrn")
184 if command in ("list", "show", "remove"):
185 parser.add_option("-t", "--type", dest="type",type="choice",
186 help="type filter ([all]|user|slice|sa|ma|node|aggregate)",
187 choices=("all","user","slice","sa","ma","node","aggregate"),
190 if command in ("resources", "show", "list"):
191 parser.add_option("-o", "--output", dest="file",
192 help="output XML to file", metavar="FILE", default=None)
194 if command in ("show", "list"):
195 parser.add_option("-f", "--format", dest="format", type="choice",
196 help="display format ([text]|xml)",default="text",
197 choices=("text","xml"))
199 if command in ("delegate"):
200 parser.add_option("-u", "--user",
201 action="store_true", dest="delegate_user", default=False,
202 help="delegate user credential")
203 parser.add_option("-s", "--slice", dest="delegate_slice",
204 help="delegate slice credential", metavar="HRN", default=None)
208 def create_parser(self):
210 # Generate command line parser
211 parser = OptionParser(usage="sfi [options] command [command_options] [command_args]",
212 description="Commands: gid,list,show,remove,add,update,nodes,slices,resources,create,delete,start,stop,reset")
213 parser.add_option("-r", "--registry", dest="registry",
214 help="root registry", metavar="URL", default=None)
215 parser.add_option("-s", "--slicemgr", dest="sm",
216 help="slice manager", metavar="URL", default=None)
217 default_sfi_dir=os.path.expanduser("~/.sfi/")
218 parser.add_option("-d", "--dir", dest="sfi_dir",
219 help="config & working directory - default is " + default_sfi_dir,
220 metavar="PATH", default = default_sfi_dir)
221 parser.add_option("-u", "--user", dest="user",
222 help="user name", metavar="HRN", default=None)
223 parser.add_option("-a", "--auth", dest="auth",
224 help="authority name", metavar="HRN", default=None)
225 parser.add_option("-v", "--verbose",
226 action="store_true", dest="verbose", default=False,
228 parser.add_option("-p", "--protocol",
229 dest="protocol", default="xmlrpc",
230 help="RPC protocol (xmlrpc or soap)")
231 parser.add_option("-k", "--hashrequest",
232 action="store_true", dest="hashrequest", default=False,
233 help="Create a hash of the request that will be authenticated on the server")
234 parser.disable_interspersed_args()
240 # Establish Connection to SliceMgr and Registry Servers
242 def set_servers(self):
243 config_file = self.options.sfi_dir + os.sep + "sfi_config"
245 config = Config (config_file)
247 print "Failed to read configuration file",config_file
248 print "Make sure to remove the export clauses and to add quotes"
249 if not self.options.verbose:
250 print "Re-run with -v for more details"
252 traceback.print_exc()
257 if (self.options.sm is not None):
258 sm_url = self.options.sm
259 elif hasattr(config,"SFI_SM"):
260 sm_url = config.SFI_SM
262 print "You need to set e.g. SFI_SM='http://your.slicemanager.url:12347/' in %s"%config_file
266 if (self.options.registry is not None):
267 reg_url = self.options.registry
268 elif hasattr(config,"SFI_REGISTRY"):
269 reg_url = config.SFI_REGISTRY
271 print "You need to set e.g. SFI_REGISTRY='http://your.registry.url:12345/' in %s"%config_file
275 if (self.options.user is not None):
276 self.user = self.options.user
277 elif hasattr(config,"SFI_USER"):
278 self.user = config.SFI_USER
280 print "You need to set e.g. SFI_USER='plc.princeton.username' in %s"%config_file
284 if (self.options.auth is not None):
285 self.authority = self.options.auth
286 elif hasattr(config,"SFI_AUTH"):
287 self.authority = config.SFI_AUTH
289 print "You need to set e.g. SFI_AUTH='plc.princeton' in %s"%config_file
295 if self.options.verbose :
296 print "Contacting Slice Manager at:", sm_url
297 print "Contacting Registry at:", reg_url
299 # Get key and certificate
300 key_file = self.get_key_file()
301 cert_file = self.get_cert_file(key_file)
302 self.key = Keypair(filename=key_file)
303 self.key_file = key_file
304 self.cert_file = cert_file
305 self.cert = Certificate(filename=cert_file)
306 # Establish connection to server(s)
307 #self.slicemgr = GeniClient(sm_url, key_file, cert_file, self.options.protocol)
308 #self.registry = GeniClient(reg_url, key_file, cert_file, self.options.protocol)
309 self.registry = xmlrpcprotocol.get_server(reg_url, key_file, cert_file)
310 self.slicemgr = xmlrpcprotocol.get_server(sm_url, key_file, cert_file)
314 # Get various credential and spec files
316 # Establishes limiting conventions
317 # - conflates MAs and SAs
318 # - assumes last token in slice name is unique
320 # Bootstraps credentials
321 # - bootstrap user credential from self-signed certificate
322 # - bootstrap authority credential from user credential
323 # - bootstrap slice credential from user credential
327 def get_key_file(self):
328 file=os.path.join(self.options.sfi_dir, self.user.replace(self.authority + '.', '') + ".pkey")
329 #file = os.path.join(self.options.sfi_dir, get_leaf(self.user) + ".pkey")
330 if (os.path.isfile(file)):
333 print "Key file", file, "does not exist"
337 def get_cert_file(self,key_file):
339 #file = os.path.join(self.options.sfi_dir, get_leaf(self.user) + ".cert")
340 file=os.path.join(self.options.sfi_dir, self.user.replace(self.authority + '.', '') + ".cert")
341 if (os.path.isfile(file)):
344 k = Keypair(filename = key_file)
345 cert = Certificate(subject=self.user)
347 cert.set_issuer(k, self.user)
349 if self.options.verbose :
350 print "Writing self-signed certificate to", file
351 cert.save_to_file(file)
355 #file = os.path.join(self.options.sfi_dir, get_leaf(self.user) + ".gid")
356 file=os.path.join(self.options.sfi_dir, self.user.replace(self.authority + '.', '') + ".gid")
357 if (os.path.isfile(file)):
358 gid = GID(filename=file)
361 cert_str = self.cert.save_to_string(save_parents=True)
362 gid_str = self.registry.get_gid(cert_str, self.user, "user")
363 gid = GID(string=gid_str)
364 if self.options.verbose:
365 print "Writing user gid to", file
366 gid.save_to_file(file, save_parents=True)
369 def get_user_cred(self):
370 #file = os.path.join(self.options.sfi_dir, get_leaf(self.user) + ".cred")
371 file=os.path.join(self.options.sfi_dir, self.user.replace(self.authority + '.', '') + ".cred")
372 if (os.path.isfile(file)):
373 user_cred = Credential(filename=file)
376 # bootstrap user credential
377 cert_string = self.cert.save_to_string(save_parents=True)
378 request_hash = self.key.compute_hash([cert_string, "user", self.user])
379 user_name=self.user.replace(self.authority+".", '')
380 if user_name.count(".") > 0:
381 user_name = user_name.replace(".", '_')
382 self.user=self.authority + "." + user_name
384 user_cred = self.registry.get_self_credential(cert_string, "user", self.user, request_hash)
386 cred = Credential(string=user_cred)
387 cred.save_to_file(file, save_parents=True)
388 if self.options.verbose:
389 print "Writing user credential to", file
392 print "Failed to get user credential"
395 def get_auth_cred(self):
396 if not self.authority:
397 print "no authority specified. Use -a or set SF_AUTH"
400 file = os.path.join(self.options.sfi_dir, get_leaf("authority") +".cred")
401 if (os.path.isfile(file)):
402 auth_cred = Credential(filename=file)
405 # bootstrap authority credential from user credential
406 user_cred = self.get_user_cred().save_to_string(save_parents=True)
407 auth_cred = self.registry.get_credential(user_cred, "authority", self.authority)
409 cred = Credential(string=auth_cred)
410 cred.save_to_file(file, save_parents=True)
411 if self.options.verbose:
412 print "Writing authority credential to", file
415 print "Failed to get authority credential"
418 def get_slice_cred(self,name):
419 file = os.path.join(self.options.sfi_dir, "slice_" + get_leaf(name) + ".cred")
420 if (os.path.isfile(file)):
421 slice_cred = Credential(filename=file)
424 # bootstrap slice credential from user credential
425 user_cred = self.get_user_cred().save_to_string(save_parents=True)
426 arg_list = [user_cred, "slice", name]
427 slice_cred_str = self.registry.get_credential(user_cred, "slice", name)
429 slice_cred = Credential(string=slice_cred_str)
430 slice_cred.save_to_file(file, save_parents=True)
431 if self.options.verbose:
432 print "Writing slice credential to", file
435 print "Failed to get slice credential"
438 def delegate_cred(self,cred, hrn, type = 'authority'):
439 # the gid and hrn of the object we are delegating
440 user_cred = Credential(string=cred)
441 object_gid = user_cred.get_gid_object()
442 object_hrn = object_gid.get_hrn()
443 #cred.set_delegate(True)
444 #if not cred.get_delegate():
445 # raise Exception, "Error: Object credential %(object_hrn)s does not have delegate bit set" % locals()
448 records = self.registry.resolve(cred, hrn)
449 records = filter_records(type, records)
452 raise Exception, "Error: Didn't find a %(type)s record for %(hrn)s" % locals()
454 # the gid of the user who will be delegated too
455 record = GeniRecord(dict=records[0])
456 delegee_gid = record.get_gid_object()
457 delegee_hrn = delegee_gid.get_hrn()
459 # the key and hrn of the user who will be delegating
460 user_key = Keypair(filename = self.get_key_file())
461 user_hrn = user_cred.get_gid_caller().get_hrn()
463 dcred = Credential(subject=object_hrn + " delegated to " + delegee_hrn)
464 dcred.set_gid_caller(delegee_gid)
465 dcred.set_gid_object(object_gid)
466 dcred.set_privileges(user_cred.get_privileges())
467 dcred.set_delegate(True)
468 dcred.set_pubkey(object_gid.get_pubkey())
469 dcred.set_issuer(user_key, user_hrn)
470 dcred.set_parent(user_cred)
474 return dcred.save_to_string(save_parents=True)
476 def get_rspec_file(self,rspec):
477 if (os.path.isabs(rspec)):
480 file = os.path.join(self.options.sfi_dir, rspec)
481 if (os.path.isfile(file)):
484 print "No such rspec file", rspec
487 def get_record_file(self,record):
488 if (os.path.isabs(record)):
491 file = os.path.join(self.options.sfi_dir, record)
492 if (os.path.isfile(file)):
495 print "No such registry record file", record
498 def load_publickey_string(self,fn):
500 key_string = f.read()
502 # if the filename is a private key file, then extract the public key
503 if "PRIVATE KEY" in key_string:
504 outfn = tempfile.mktemp()
505 cmd = "openssl rsa -in " + fn + " -pubout -outform PEM -out " + outfn
508 key_string = f.read()
513 def get_component_server_from_hrn(self, hrn):
514 # direct connection to the nodes component manager interface
515 user_cred = self.get_user_cred().save_to_string(save_parents=True)
516 records = self.registry.resolve(user_cred, hrn)
517 records = filter_records('node', records)
519 print "No such component:", opts.component
522 url = "https://%s:%s" % (record['hostname'], cm_port)
523 return xmlrpcprotocol.get_server(url, self.key_file, self.cert_file)
526 # Following functions implement the commands
528 # Registry-related commands
531 def dispatch(self,command, cmd_opts, cmd_args):
532 getattr(self,command)(cmd_opts, cmd_args)
534 def gid(self, opts, args):
536 print "GID: %s" % (gid.save_to_string(save_parents=True))
539 # list entires in named authority registry
540 def list(self,opts, args):
541 user_cred = self.get_user_cred().save_to_string(save_parents=True)
544 list = self.registry.list(user_cred, hrn)
546 raise Exception, "Not enough parameters for the 'list' command"
548 # filter on person, slice, site, node, etc.
549 # THis really should be in the self.filter_records funct def comment...
550 list = filter_records(opts.type, list)
552 print "%s (%s)" % (record['hrn'], record['type'])
555 if not file.startswith(os.sep):
556 file = os.path.join(self.options.sfi_dir, file)
557 save_records_to_file(file, list)
560 # show named registry record
561 def show(self,opts, args):
562 user_cred = self.get_user_cred().save_to_string(save_parents=True)
564 records = self.registry.resolve(user_cred, hrn)
565 records = filter_records(opts.type, records)
567 print "No record of type", opts.type
568 for record in records:
569 if record['type'] in ['user']:
570 record = UserRecord(dict = record)
571 elif record['type'] in ['slice']:
572 record = SliceRecord(dict = record)
573 elif record['type'] in ['node']:
574 record = NodeRecord(dict = record)
575 elif record['type'] in ['authority', 'ma', 'sa']:
576 record = AuthorityRecord(dict = record)
578 record = GeniRecord(dict = record)
579 if (opts.format=="text"):
582 print record.save_to_string()
586 if not file.startswith(os.sep):
587 file = os.path.join(self.options.sfi_dir, file)
588 save_records_to_file(file, records)
591 def delegate(self,opts, args):
592 user_cred = self.get_user_cred()
593 if opts.delegate_user:
594 object_cred = user_cred
595 elif opts.delegate_slice:
596 object_cred = self.get_slice_cred(opts.delegate_slice)
598 print "Must specify either --user or --slice <hrn>"
601 # the gid and hrn of the object we are delegating
602 object_gid = object_cred.get_gid_object()
603 object_hrn = object_gid.get_hrn()
605 if not object_cred.get_delegate():
606 print "Error: Object credential", object_hrn, "does not have delegate bit set"
609 records = self.registry.resolve(user_cred, args[0])
610 records = filter_records("user", records)
613 print "Error: Didn't find a user record for", args[0]
616 # the gid of the user who will be delegated too
617 delegee_gid = records[0].get_gid_object()
618 delegee_hrn = delegee_gid.get_hrn()
620 # the key and hrn of the user who will be delegating
621 user_key = Keypair(filename = self.get_key_file())
622 user_hrn = user_cred.get_gid_caller().get_hrn()
624 dcred = Credential(subject=object_hrn + " delegated to " + delegee_hrn)
625 dcred.set_gid_caller(delegee_gid)
626 dcred.set_gid_object(object_gid)
627 dcred.set_privileges(object_cred.get_privileges())
628 dcred.set_delegate(True)
629 dcred.set_pubkey(object_gid.get_pubkey())
630 dcred.set_issuer(user_key, user_hrn)
631 dcred.set_parent(object_cred)
635 if opts.delegate_user:
636 dest_fn = os.path.join(self.options.sfi_dir, get_leaf(delegee_hrn) + "_"
637 + get_leaf(object_hrn) + ".cred")
638 elif opts.delegate_slice:
639 dest_fn = os.path_join(self.options.sfi_dir, get_leaf(delegee_hrn) + "_slice_"
640 + get_leaf(object_hrn) + ".cred")
642 dcred.save_to_file(dest_fn, save_parents = True)
644 print "delegated credential for", object_hrn, "to", delegee_hrn, "and wrote to", dest_fn
646 # removed named registry record
647 # - have to first retrieve the record to be removed
648 def remove(self,opts, args):
649 auth_cred = self.get_auth_cred().save_to_string(save_parents=True)
654 return self.registry.remove(auth_cred, type, hrn)
656 # add named registry record
657 def add(self,opts, args):
658 auth_cred = self.get_auth_cred().save_to_string(save_parents=True)
659 record_filepath = args[0]
660 rec_file = self.get_record_file(record_filepath)
661 record = load_record_from_file(rec_file).as_dict()
662 return self.registry.register(auth_cred, record)
664 # update named registry entry
665 def update(self,opts, args):
666 user_cred = self.get_user_cred()
667 rec_file = self.get_record_file(args[0])
668 record = load_record_from_file(rec_file)
669 if record['type'] == "user":
670 if record.get_name() == user_cred.get_gid_object().get_hrn():
671 cred = user_cred.save_to_string(save_parents=True)
673 cred = self.get_auth_cred().save_to_string(save_parents=True)
674 elif record['type'] in ["slice"]:
676 cred = self.get_slice_cred(record.get_name()).save_to_string(save_parents=True)
677 except ServerException, e:
678 # XXX smbaker -- once we have better error return codes, update this
679 # to do something better than a string compare
680 if "Permission error" in e.args[0]:
681 cred = self.get_auth_cred().save_to_string(save_parents=True)
684 elif record.get_type() in ["authority"]:
685 cred = self.get_auth_cred().save_to_string(save_parents=True)
686 elif record.get_type() == 'node':
687 cred = self.get_auth_cred().save_to_string(save_parents=True)
689 raise "unknown record type" + record.get_type()
690 record = record.as_dict()
691 return self.registry.update(cred, record)
693 def get_trusted_certs(self, opts, args):
695 return the trusted certs at this interface
697 trusted_certs = self.registry.get_trusted_certs()
698 for trusted_cert in trusted_certs:
699 cert = Certificate(string=trusted_cert)
700 print cert.get_subject()
703 def aggregates(self, opts, args):
705 return a list of details about known aggregates
707 user_cred = self.get_user_cred().save_to_string(save_parents=True)
711 result = self.registry.get_aggregates(user_cred, hrn)
715 def registries(self, opts, args):
717 return a list of details about known registries
719 user_cred = self.get_user_cred().save_to_string(save_parents=True)
723 result = self.registry.get_registries(user_cred, hrn)
729 # Slice-related commands
732 # list available nodes -- use 'resources' w/ no argument instead
734 # list instantiated slices
735 def slices(self,opts, args):
736 user_cred = self.get_user_cred().save_to_string(save_parents=True)
737 server = self.slicemgr
738 # direct connection to the nodes component manager interface
740 server = self.get_component_server_from_hrn(opts.component)
741 results = server.get_slices(user_cred)
742 display_list(results)
745 # show rspec for named slice
746 def resources(self,opts, args):
747 user_cred = self.get_user_cred().save_to_string(save_parents=True)
748 server = self.slicemgr
750 agg_hrn = opts.aggregate
751 aggregates = self.registry.get_aggregates(user_cred, agg_hrn)
753 raise Exception, "No such aggregate %s" % agg_hrn
754 aggregate = aggregates[0]
755 url = "http://%s:%s" % (aggregate['addr'], aggregate['port'])
756 server = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file)
758 cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True)
764 result = server.get_resources(cred, hrn)
767 display_rspec(result, format)
768 if (opts.file is not None):
770 if not file.startswith(os.sep):
771 file = os.path.join(self.options.sfi_dir, file)
772 save_rspec_to_file(result, file)
775 # created named slice with given rspec
776 def create(self,opts, args):
778 user_cred = self.get_user_cred()
779 slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True)
780 rspec_file = self.get_rspec_file(args[1])
781 rspec=open(rspec_file).read()
782 server = self.slicemgr
784 aggregates = self.registry.get_aggregates(user_cred, opts.aggregate)
786 raise Exception, "No such aggregate %s" % opts.aggregate
787 aggregate = aggregates[0]
788 url = "http://%s:%s" % (aggregate['addr'], aggregate['port'])
789 server = GeniClient(url, self.key_file, self.cert_file, self.options.protocol)
790 return server.create_slice(slice_cred, slice_hrn, rspec)
792 # get a ticket for the specified slice
793 def get_ticket(self, opts, args):
794 slice_hrn, rspec_path = args[0], args[1]
795 user_cred = self.get_user_cred()
796 slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True)
797 rspec_file = self.get_rspec_file(rspec_path)
798 rspec=open(rspec_file).read()
799 server = self.slicemgr
801 aggregates = self.registry.get_aggregates(user_cred, opts.aggregate)
803 raise Exception, "No such aggregate %s" % opts.aggregate
804 aggregate = aggregates[0]
805 url = "http://%s:%s" % (aggregate['addr'], aggregate['port'])
806 server = GeniClient(url, self.key_file, self.cert_file, self.options.protocol)
807 ticket_string = server.get_ticket(slice_cred, slice_hrn, rspec)
808 file = os.path.join(self.options.sfi_dir, get_leaf(slice_hrn) + ".ticket")
809 print "writing ticket to ", file
810 ticket = SfaTicket(string=ticket_string)
811 ticket.save_to_file(filename=file, save_parents=True)
813 def redeem_ticket(self, opts, args):
814 ticket_file = args[0]
816 # get slice hrn from the ticket
817 # use this to get the right slice credential
818 ticket = SfaTicket(filename=ticket_file)
820 slice_hrn = ticket.attributes['slivers'][0]['hrn']
821 user_cred = self.get_user_cred()
822 slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True)
824 # get a list node hostnames from the nodespecs in the rspec
826 rspec.parseString(ticket.rspec)
827 nodespecs = rspec.getDictsByTagName('NodeSpec')
828 hostnames = [nodespec['name'] for nodespec in nodespecs]
830 # create an xmlrpc connection to the component manager at each of these
831 # components and gall redeem_ticket
833 for hostname in hostnames:
836 url = "https://%(hostname)s:%(cm_port)s" % locals()
837 print "Calling get_ticket at %(url)s " % locals(),
838 cm = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file)
839 cm.redeem_ticket(slice_cred, ticket.save_to_string(save_parents=True))
841 except socket.gaierror:
843 print "Componet Manager not accepting requests"
845 print "Failed:", e.message
850 def delete(self,opts, args):
852 server = self.slicemgr
853 # direct connection to the nodes component manager interface
855 server = self.get_component_server_from_hrn(opts.component)
857 slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True)
858 return server.delete_slice(slice_cred, slice_hrn)
861 def start(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(args[0]).save_to_string(save_parents=True)
869 return server.start_slice(slice_cred, slice_hrn)
872 def stop(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.stop_slice(slice_cred, slice_hrn)
883 def reset(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)
889 slice_cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True)
890 return server.reset_slice(slice_cred, slice_hrn)
893 # Main: parse arguments and dispatch to command
896 parser = self.create_parser()
897 (options, args) = parser.parse_args()
898 self.options = options
900 if options.hashrequest:
901 self.hashrequest=True
904 print "No command given. Use -h for help."
908 (cmd_opts, cmd_args) = self.create_cmd_parser(command).parse_args(args[1:])
909 if self.options.verbose :
910 print "Registry %s, sm %s, dir %s, user %s, auth %s" % (options.registry, options.sm,
911 options.sfi_dir, options.user,
913 print "Command %s" %command
914 if command in ("resources"):
915 print "resources cmd_opts %s" %cmd_opts.format
916 elif command in ("list","show","remove"):
917 print "cmd_opts.type %s" %cmd_opts.type
918 print "cmd_args %s" %cmd_args
923 self.dispatch(command, cmd_opts, cmd_args)
926 print "Command not found:", command
931 if __name__=="__main__":