#!/usr/bin/env python
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

#!/usr/bin/env python
#
# Autogenerated by Thrift Compiler (0.13.0)
#
# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
#
#  options string: py:utf8strings
#

import sys
import pprint
if sys.version_info[0] > 2:
    from urllib.parse import urlparse
else:
    from urlparse import urlparse
from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient
from thrift.protocol.TBinaryProtocol import TBinaryProtocol

from storm import Nimbus
from storm.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]] [-s[sl]] [-novalidate] [-ca_certs certs] [-keyfile keyfile] [-certfile certfile] function [arg1 [arg2...]]')
    print('')
    print('Functions:')
    print('  void submitTopology(string name, string uploadedJarLocation, string jsonConf, StormTopology topology)')
    print('  void submitTopologyWithOpts(string name, string uploadedJarLocation, string jsonConf, StormTopology topology, SubmitOptions options)')
    print('  void killTopology(string name)')
    print('  void killTopologyWithOpts(string name, KillOptions options)')
    print('  void activate(string name)')
    print('  void deactivate(string name)')
    print('  void rebalance(string name, RebalanceOptions options)')
    print('  void setLogConfig(string name, LogConfig config)')
    print('  LogConfig getLogConfig(string name)')
    print('  void debug(string name, string component, bool enable, double samplingPercentage)')
    print('  void setWorkerProfiler(string id, ProfileRequest profileRequest)')
    print('   getComponentPendingProfileActions(string id, string component_id, ProfileAction action)')
    print('  void uploadNewCredentials(string name, Credentials creds)')
    print('  string beginCreateBlob(string key, SettableBlobMeta meta)')
    print('  string beginUpdateBlob(string key)')
    print('  void uploadBlobChunk(string session, string chunk)')
    print('  void finishBlobUpload(string session)')
    print('  void cancelBlobUpload(string session)')
    print('  ReadableBlobMeta getBlobMeta(string key)')
    print('  void setBlobMeta(string key, SettableBlobMeta meta)')
    print('  BeginDownloadResult beginBlobDownload(string key)')
    print('  string downloadBlobChunk(string session)')
    print('  void deleteBlob(string key)')
    print('  ListBlobsResult listBlobs(string session)')
    print('  i32 getBlobReplication(string key)')
    print('  i32 updateBlobReplication(string key, i32 replication)')
    print('  void createStateInZookeeper(string key)')
    print('  string beginFileUpload()')
    print('  void uploadChunk(string location, string chunk)')
    print('  void finishFileUpload(string location)')
    print('  string downloadChunk(string id)')
    print('  string getNimbusConf()')
    print('  ClusterSummary getClusterInfo()')
    print('  NimbusSummary getLeader()')
    print('  bool isTopologyNameAllowed(string name)')
    print('  TopologyInfo getTopologyInfo(string id)')
    print('  TopologyInfo getTopologyInfoWithOpts(string id, GetInfoOptions options)')
    print('  TopologyPageInfo getTopologyPageInfo(string id, string window, bool is_include_sys)')
    print('  SupervisorPageInfo getSupervisorPageInfo(string id, string host, bool is_include_sys)')
    print('  ComponentPageInfo getComponentPageInfo(string topology_id, string component_id, string window, bool is_include_sys)')
    print('  string getTopologyConf(string id)')
    print('  StormTopology getTopology(string id)')
    print('  StormTopology getUserTopology(string id)')
    print('  TopologyHistoryInfo getTopologyHistory(string user)')
    print('   getOwnerResourceSummaries(string owner)')
    print('  SupervisorAssignments getSupervisorAssignments(string node)')
    print('  void sendSupervisorWorkerHeartbeats(SupervisorWorkerHeartbeats heartbeats)')
    print('  void sendSupervisorWorkerHeartbeat(SupervisorWorkerHeartbeat heatbeat)')
    print('  void processWorkerMetrics(WorkerMetrics metrics)')
    print('  bool isRemoteBlobExists(string blobKey)')
    print('')
    sys.exit(0)

pp = pprint.PrettyPrinter(indent=2)
host = 'localhost'
port = 9090
uri = ''
framed = False
ssl = False
validate = True
ca_certs = None
keyfile = None
certfile = None
http = False
argi = 1

if sys.argv[argi] == '-h':
    parts = sys.argv[argi + 1].split(':')
    host = parts[0]
    if len(parts) > 1:
        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]
    if url[4]:
        uri += '?%s' % url[4]
    http = True
    argi += 2

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

if sys.argv[argi] == '-s' or sys.argv[argi] == '-ssl':
    ssl = True
    argi += 1

if sys.argv[argi] == '-novalidate':
    validate = False
    argi += 1

if sys.argv[argi] == '-ca_certs':
    ca_certs = sys.argv[argi+1]
    argi += 2

if sys.argv[argi] == '-keyfile':
    keyfile = sys.argv[argi+1]
    argi += 2

if sys.argv[argi] == '-certfile':
    certfile = sys.argv[argi+1]
    argi += 2

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

if http:
    transport = THttpClient.THttpClient(host, port, uri)
else:
    if ssl:
        socket = TSSLSocket.TSSLSocket(host, port, validate=validate, ca_certs=ca_certs, keyfile=keyfile, certfile=certfile)
    else:
        socket = TSocket.TSocket(host, port)
    if framed:
        transport = TTransport.TFramedTransport(socket)
    else:
        transport = TTransport.TBufferedTransport(socket)
protocol = 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 == 'submitTopologyWithOpts':
    if len(args) != 5:
        print('submitTopologyWithOpts requires 5 args')
        sys.exit(1)
    pp.pprint(client.submitTopologyWithOpts(args[0], args[1], args[2], eval(args[3]), eval(args[4]),))

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

elif cmd == 'createStateInZookeeper':
    if len(args) != 1:
        print('createStateInZookeeper requires 1 args')
        sys.exit(1)
    pp.pprint(client.createStateInZookeeper(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 == 'downloadChunk':
    if len(args) != 1:
        print('downloadChunk requires 1 args')
        sys.exit(1)
    pp.pprint(client.downloadChunk(args[0],))

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

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

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

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

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

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

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

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

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

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],))

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

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

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

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

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

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

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

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

else:
    print('Unrecognized method %s' % cmd)
    sys.exit(1)

transport.close()
