#!/usr/bin/env python
#
# Autogenerated by Thrift
#
# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
#

import sys
import pprint
from urlparse import urlparse
from thrift.transport import TTransport
from thrift.transport import TSocket
from thrift.transport import THttpClient
from thrift.protocol import TBinaryProtocol

import Nimbus
from ttypes import *

if len(sys.argv) <= 1 or sys.argv[1] == '--help':
  print ''
  print 'Usage: ' + sys.argv[0] + ' [-h host:port] [-u url] [-f[ramed]] function [arg1 [arg2...]]'
  print ''
  print 'Functions:'
  print '  void submitTopology(string name, string uploadedJarLocation, string jsonConf, StormTopology topology)'
  print '  void killTopology(string name)'
  print '  string beginFileUpload()'
  print '  void uploadChunk(string location, string chunk)'
  print '  void finishFileUpload(string location)'
  print '  string beginFileDownload(string file)'
  print '  string downloadChunk(string id)'
  print '  ClusterSummary getClusterInfo()'
  print '  TopologyInfo getTopologyInfo(string id)'
  print '  string getTopologyConf(string id)'
  print '  StormTopology getTopology(string id)'
  print ''
  sys.exit(0)

pp = pprint.PrettyPrinter(indent = 2)
host = 'localhost'
port = 9090
uri = ''
framed = False
http = False
argi = 1

if sys.argv[argi] == '-h':
  parts = sys.argv[argi+1].split(':') 
  host = parts[0]
  port = int(parts[1])
  argi += 2

if sys.argv[argi] == '-u':
  url = urlparse(sys.argv[argi+1])
  parts = url[1].split(':') 
  host = parts[0]
  if len(parts) > 1:
    port = int(parts[1])
  else:
    port = 80
  uri = url[2]
  http = True
  argi += 2

if sys.argv[argi] == '-f' or sys.argv[argi] == '-framed':
  framed = True
  argi += 1

cmd = sys.argv[argi]
args = sys.argv[argi+1:]

if http:
  transport = THttpClient.THttpClient(host, port, uri)
else:
  socket = TSocket.TSocket(host, port)
  if framed:
    transport = TTransport.TFramedTransport(socket)
  else:
    transport = TTransport.TBufferedTransport(socket)
protocol = TBinaryProtocol.TBinaryProtocol(transport)
client = Nimbus.Client(protocol)
transport.open()

if cmd == 'submitTopology':
  if len(args) != 4:
    print 'submitTopology requires 4 args'
    sys.exit(1)
  pp.pprint(client.submitTopology(args[0],args[1],args[2],eval(args[3]),))

elif cmd == 'killTopology':
  if len(args) != 1:
    print 'killTopology requires 1 args'
    sys.exit(1)
  pp.pprint(client.killTopology(args[0],))

elif cmd == 'beginFileUpload':
  if len(args) != 0:
    print 'beginFileUpload requires 0 args'
    sys.exit(1)
  pp.pprint(client.beginFileUpload())

elif cmd == 'uploadChunk':
  if len(args) != 2:
    print 'uploadChunk requires 2 args'
    sys.exit(1)
  pp.pprint(client.uploadChunk(args[0],args[1],))

elif cmd == 'finishFileUpload':
  if len(args) != 1:
    print 'finishFileUpload requires 1 args'
    sys.exit(1)
  pp.pprint(client.finishFileUpload(args[0],))

elif cmd == 'beginFileDownload':
  if len(args) != 1:
    print 'beginFileDownload requires 1 args'
    sys.exit(1)
  pp.pprint(client.beginFileDownload(args[0],))

elif cmd == 'downloadChunk':
  if len(args) != 1:
    print 'downloadChunk requires 1 args'
    sys.exit(1)
  pp.pprint(client.downloadChunk(args[0],))

elif cmd == 'getClusterInfo':
  if len(args) != 0:
    print 'getClusterInfo requires 0 args'
    sys.exit(1)
  pp.pprint(client.getClusterInfo())

elif cmd == 'getTopologyInfo':
  if len(args) != 1:
    print 'getTopologyInfo requires 1 args'
    sys.exit(1)
  pp.pprint(client.getTopologyInfo(args[0],))

elif cmd == 'getTopologyConf':
  if len(args) != 1:
    print 'getTopologyConf requires 1 args'
    sys.exit(1)
  pp.pprint(client.getTopologyConf(args[0],))

elif cmd == 'getTopology':
  if len(args) != 1:
    print 'getTopology requires 1 args'
    sys.exit(1)
  pp.pprint(client.getTopology(args[0],))

transport.close()
