fixes to test scripts, added filter option to command line tool
[sfa.git] / cmdline / genicli.py
index 2c11f5f..b54d4f7 100644 (file)
@@ -5,8 +5,11 @@ import sys
 import os
 from cert import *
 from geniclient import *
+from geniticket import *
 
-long_opts = ["keyfile=", "help", "outfile=", "credfile=", "username=", "email=", "ip=", "dns=", "dump_parents", "server="]
+long_opts = ["keyfile=", "help", "outfile=", "credfile=", "ticketfile=",
+             "username=", "email=", "ip=", "dns=", "dump_parents", "server=",
+             "filter="]
 
 # default command line options
 username = "client"
@@ -18,6 +21,7 @@ key_file = None
 cred_file = None
 cert_file = None
 out_file = None
+ticket_file = None
 
 ip = None
 dns = None
@@ -25,6 +29,7 @@ email = None
 uuid = None
 gid_pkey_fn = None
 gid_fn = None
+filter = None
 
 dump_parents = False
 
@@ -39,14 +44,16 @@ def showhelp():
    print "syntax: cli <options> command <args>"
    print "options:"
    print "    --username       ... username (or hrn) of user making call"
-   print "    --outfile        ... save response to a file"
+   print "    --outfile       ... save response to a file"
    print "    --credfile       ... credential of user making call (or 'None')"
    print "    --keyfile        ... private key file of user making call"
+   print "    --ticketfile     ... filename of ticket (for redeemticket)"
    print "    --email          ... email address (for registering users)"
    print "    --ip             ... IP address (for registering nodes)"
    print "    --dns            ... DNS address (for registering nodes)"
    print "    --dump_parents   ... dump parents"
    print "    --server         ... geni server (registry/component) to connect to"
+   print "    --filter <type>  ... filter the results of a list operation (user | slice | node ...)"
    print "commands:"
    print "    resolve <hrn>"
    print "    dumpCredential"
@@ -59,16 +66,18 @@ def showhelp():
    print "    update <type> <hrn>"
    print "    startSlice"
    print "    stopSlice"
+   print "    listSlices"
 
 def process_options():
    global username
    global opname
    global type, hrn
    global cert_file, cred_file
-   global key_file, out_file
+   global key_file, out_file, ticket_file
    global uuid, pkey_fn, gid_fn, email, gid_pkey_fn, ip, dns
    global dump_parents
    global server_url
+   global filter
 
    (options, args) = getopt.getopt(sys.argv[1:], '', long_opts)
    for opt in options:
@@ -88,6 +97,8 @@ def process_options():
            cred_file = val
        elif name == "--keyfile":
            key_file = val
+       elif name == "--ticketfile":
+           ticket_file = val
        elif name == "--email":
            email = val
        elif name == "--ip":
@@ -98,6 +109,8 @@ def process_options():
            dump_parents = True
        elif name == "--server":
            server_url = val
+       elif name == "--filter":
+           filter = val
 
    if not args:
        print "no operation specified"
@@ -147,6 +160,12 @@ def process_options():
        type = args[1]
        hrn = args[2]
 
+   elif opname == "getTicket":
+       if len(args) < 2:
+           print "syntax: getTicket <hrn>"
+           sys.exit(-1)
+       hrn = args[1]
+
    leaf_name = get_leaf(username)
 
    if cert_file == None:
@@ -236,7 +255,8 @@ def main():
        client = GeniClient(server_url, key_file, cert_file)
 
    # if a cred_file was specified, then load the credential
-   if (cred_file=="None") or (opname == "help") or (opname == "createKey"):
+   if (cred_file=="None") or (opname == "help") or (opname == "createKey") or \
+      (opname == "redeemTicket"):
       cred = None
    else:
       cred = Credential(filename = cred_file)
@@ -272,6 +292,8 @@ def main():
    elif (opname == "list"):
       result = client.list(cred)
       if result:
+          if filter:
+              result = [r for r in result if r.type==filter]
           for record in result:
               print "RESULT:"
               record.dump(dump_parents=dump_parents)
@@ -359,6 +381,33 @@ def main():
    elif (opname == "startSlice"):
        client.start_slice(cred)
 
+   elif (opname == "resetSlice"):
+       client.reset_slice(cred)
+
+   elif (opname == "deleteSlice"):
+       client.delete_slice(cred)
+
+   elif (opname == "listSlices"):
+       result = client.list_slices(cred)
+       print "RESULT:"
+       print "\n".join(result)
+       if out_file:
+           file(out_file,"w").write("\n".join(result))
+
+   elif (opname == "getTicket"):
+      result = client.get_ticket(cred, hrn, {})
+      if result:
+          print "RESULT:"
+          result.dump(dump_parents=dump_parents)
+          if out_file:
+              file(out_file,"w").write(result.save_to_string(save_parents=True))
+      else:
+          print "NO RESULT"
+
+   elif (opname == "redeemTicket"):
+       ticket = Ticket(filename = ticket_file)
+       result = client.redeem_ticket(ticket)
+
    else:
       print "unknown operation: " + opname