X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=DominoClient.py;h=d02027b9fbfc1bc66b194950ace9e516e1065336;hb=refs%2Fchanges%2F31%2F26131%2F1;hp=d324e0dabf1404905eaa1665565de6d4dd1fa681;hpb=fd9248da568af0825aee8bdf612b605721c2a24b;p=domino.git diff --git a/DominoClient.py b/DominoClient.py index d324e0d..d02027b 100755 --- a/DominoClient.py +++ b/DominoClient.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -#Copyright 2015 Open Platform for NFV Project, Inc. and its contributors +#Copyright 2016 Open Platform for NFV Project, Inc. and its contributors # Licensed 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 @@ -12,9 +12,10 @@ # limitations under the License. -import sys, glob, threading +import sys, os, glob, threading import getopt, socket -import logging +import logging, errno +import uuid #sys.path.append('gen-py') #sys.path.insert(0, glob.glob('./lib/py/build/lib.*')[0]) @@ -46,30 +47,36 @@ class CommunicationHandler: def __init__(self, dominoclient): self.log = {} self.dominoClient = dominoclient - try: - # Make socket - transport = TSocket.TSocket(DOMINO_SERVER_IP, DOMINO_SERVER_PORT) - transport.setTimeout(THRIFT_RPC_TIMEOUT_MS) - # Add buffering to compensate for slow raw sockets - self.transport = TTransport.TBufferedTransport(transport) - # Wrap in a protocol - self.protocol = TBinaryProtocol.TBinaryProtocol(self.transport) - # Create a client to use the protocol encoder - self.sender = Communication.Client(self.protocol) - except Thrift.TException, tx: - logging.error('%s' , tx.message) + self.transport = None + self.protocol = None + self.sender = None # Template Push from Domino Server is received # Actions: # - Depending on Controller Domain, call API # - Respond Back with Push Response def d_push(self, push_msg): - logging.info('%d Received Template File', self.dominoClient.UDID) + logging.info('%s Received Template File', self.dominoClient.UDID) # Retrieve the template file - - ## End of retrieval - - # Any inspection code goes here + try: + os.makedirs(TOSCA_RX_DIR+str(self.dominoClient.UDID)) + except OSError as exception: + if exception.errno == errno.EEXIST: + logging.debug('IGNORING error: ERRNO %d; %s exists.', exception.errno, TOSCA_RX_DIR+str(self.dominoClient.UDID)) + else: + logging.error('IGNORING error in creating %s. Err no: %d', exception.errno) + + try: + miscutil.write_templatefile(TOSCA_RX_DIR+str(self.dominoClient.UDID)+'/'+str(push_msg.template_UUID)+'.yaml' , push_msg.template) + except: + logging.error('FAILED to write the pushed file: %s', sys.exc_info()[0]) + push_r = PushResponseMessage() + # Fill response message fields + push_r.domino_udid = self.dominoClient.UDID + push_r.seq_no = self.dominoClient.seqno + push_r.responseCode = FAILED + self.dominoClient.seqno = self.dominoClient.seqno + 1 + return push_r# Any inspection code goes here ## End of inspection @@ -95,7 +102,19 @@ class CommunicationHandler: def openconnection(self): - self.transport.open() + try: + # Make socket + transport = TSocket.TSocket(self.dominoClient.dominoserver_IP, DOMINO_SERVER_PORT) + transport.setTimeout(THRIFT_RPC_TIMEOUT_MS) + # Add buffering to compensate for slow raw sockets + self.transport = TTransport.TBufferedTransport(transport) + # Wrap in a protocol + self.protocol = TBinaryProtocol.TBinaryProtocol(self.transport) + # Create a client to use the protocol encoder + self.sender = Communication.Client(self.protocol) + self.transport.open() + except Thrift.TException, tx: + logging.error('%s' , tx.message) def closeconnection(): self.transport.close() @@ -112,17 +131,10 @@ class CLIHandler: def d_CLI(self, msg): logging.info('Received CLI %s', msg.CLI_input) - self.CLIservice.process_input(msg.CLI_input) - CLIrespmsg = CLIResponse() - CLIrespmsg.CLI_response = "Testing..." + CLIrespmsg.CLI_response = self.CLIservice.process_input(msg.CLI_input) return CLIrespmsg -def read_templatefile(temp_filename): - f = open(temp_filename, 'r') - lines = f.read().splitlines() - - return lines class DominoClientCLIService(threading.Thread): def __init__(self, dominoclient, communicationhandler, interactive): @@ -132,21 +144,30 @@ class DominoClientCLIService(threading.Thread): self.interactive = interactive def process_input(self, args): + if len(args) == 0: + return 'Empty API body' + try: if args[0] == 'heartbeat': self.dominoclient.heartbeat() elif args[0] == 'publish': - opts, args = getopt.getopt(args[1:],"t:",["tosca-file="]) + opts, args = getopt.getopt(args[1:],"t:k:",["tosca-file=","tuid"]) if len(opts) == 0: - print '\nUsage: publish -t ' + print '\nUsage: publish -t -k ' return - + + template_UUID = None + toscafile = None for opt, arg in opts: if opt in ('-t', '--tosca-file'): toscafile = arg - - self.dominoclient.publish(toscafile) + elif opt in ('-k', '--tuid'): + template_UUID = arg + if toscafile is not None: + self.dominoclient.publish(toscafile,template_UUID) + else: + print '\nUsage: publish -t -k ' elif args[0] == 'subscribe': labels = [] @@ -179,6 +200,12 @@ class DominoClientCLIService(threading.Thread): elif args[0] == 'register': self.dominoclient.start() + elif args[0] == 'list-tuids': + return self.dominoclient.query(['list-tuids']) + + else: + return 'Command is misentered or not supported!' + except getopt.GetoptError: print 'Command is misentered or not supported!' @@ -200,7 +227,9 @@ class DominoClientCLIService(threading.Thread): sys.stdout.write('>>') #process input arguments - self.process_input(args) + resp_msg = self.process_input(args) + if resp_msg is not None: + print resp_msg else: #domino cli-client is used, listen for the CLI rpc calls cliHandler = CLIHandler(self.dominoclient, self) processor = DominoClientCLI.Processor(cliHandler) @@ -214,6 +243,8 @@ class DominoClientCLIService(threading.Thread): class DominoClient: def __init__(self): + + self.communicationHandler = CommunicationHandler(self) self.processor = None self.transport = None @@ -223,9 +254,8 @@ class DominoClient: self.CLIservice = None - self.serviceport = 9091 - self.dominoserver_IP = 'localhost' - + self.serviceport = DOMINO_CLIENT_PORT + self.dominoserver_IP = DOMINO_SERVER_IP self.CLIport = DOMINO_CLI_PORT #Start from UNREGISTERED STATE @@ -278,7 +308,7 @@ class DominoClient: except (Thrift.TException, TSocket.TTransportException) as tx: logging.error('%s' , tx.message) except (socket.timeout) as tx: - self.dominoclient.handle_RPC_timeout(pub_msg) + self.handle_RPC_timeout(reg_msg) except (socket.error) as tx: logging.error('%s' , tx.message) self.seqno = self.seqno + 1 @@ -287,14 +317,14 @@ class DominoClient: if self.state == 'UNREGISTERED': self.start() - logging.info('%d Sending heartbeat', self.UDID) + logging.info('%s Sending heartbeat', self.UDID) hbm = HeartBeatMessage() hbm.domino_udid = self.UDID hbm.seq_no = self.seqno try: hbm_r = self.sender().d_heartbeat(hbm) - logging.info('heart beat received from: %d ,sequence number: %d' , hbm_r.domino_udid, hbm_r.seq_no) + logging.info('heart beat received from: %s ,sequence number: %d' , hbm_r.domino_udid, hbm_r.seq_no) except (Thrift.TException, TSocket.TTransportException) as tx: logging.error('%s' , tx.message) except (socket.timeout) as tx: @@ -304,7 +334,7 @@ class DominoClient: self.seqno = self.seqno + 1 - def publish(self, toscafile): + def publish(self, toscafile, template_UUID=None): if self.state == 'UNREGISTERED': self.start() @@ -313,15 +343,17 @@ class DominoClient: pub_msg.domino_udid = self.UDID pub_msg.seq_no = self.seqno pub_msg.template_type = 'tosca-nfv-v1.0' + if template_UUID is not None: + pub_msg.template_UUID = template_UUID try: - pub_msg.template = read_templatefile(toscafile) + pub_msg.template = miscutil.read_templatefile(toscafile) except IOError as e: logging.error('I/O error(%d): %s' , e.errno, e.strerror) return try: pub_msg_r = self.sender().d_publish(pub_msg) - logging.info('Publish Response is received from: %d ,sequence number: %d', pub_msg_r.domino_udid, pub_msg_r.seq_no) + logging.info('Publish Response is received from: %s ,sequence number: %d Status: %d', pub_msg_r.domino_udid, pub_msg_r.seq_no, pub_msg_r.responseCode) except (Thrift.TException, TSocket.TTransportException) as tx: print '%s' % (tx.message) except (socket.timeout) as tx: @@ -344,7 +376,7 @@ class DominoClient: sub_msg.labels = labels try: sub_msg_r = self.sender().d_subscribe(sub_msg) - logging.info('Subscribe Response is received from: %d ,sequence number: %d', sub_msg_r.domino_udid,sub_msg_r.seq_no) + logging.info('Subscribe Response is received from: %s ,sequence number: %d', sub_msg_r.domino_udid,sub_msg_r.seq_no) except (Thrift.TException, TSocket.TTransportException) as tx: logging.error('%s' , tx.message) except (socket.timeout) as tx: @@ -352,6 +384,24 @@ class DominoClient: self.seqno = self.seqno + 1 + def query(self, queryString, template_UUID=None): + logging.info('querying Domino Server: %s', queryString) + query_msg = QueryMessage() + query_msg.domino_udid = self.UDID + query_msg.seq_no = self.seqno + query_msg.queryString = queryString + query_msg.template_UUID = template_UUID + self.seqno = self.seqno + 1 + try: + query_msg_r = self.sender().d_query(query_msg) + logging.info('Query Response is received from: %s ,sequence number: %d', query_msg_r.domino_udid,query_msg_r.seq_no) + if (query_msg_r.queryResponse is not None) and (len(query_msg_r.queryResponse)>0): + return query_msg_r.queryResponse + except (Thrift.TException, TSocket.TTransportException) as tx: + logging.error('%s' , tx.message) + except (socket.timeout) as tx: + self.handle_RPC_timeout(query_msg) + def stop(self): try: self.communicationHandler.closeconnection() @@ -392,17 +442,17 @@ class DominoClient: def main(argv): client = DominoClient() - loglevel = 'WARNING' - interactive = "FALSE" + loglevel = LOGLEVEL + interactive = INTERACTIVE #process input arguments try: - opts, args = getopt.getopt(argv,"hc:p:i:l:",["conf=","port=","ipaddr=","log=","iac=","cliport="]) + opts, args = getopt.getopt(argv,"hc:p:i:l:",["conf=","port=","ipaddr=","log=","iac=","cliport=","uuid=","regmod="]) except getopt.GetoptError: - print 'DominoClient.py -c/--conf -p/--port -i/--ipaddr -l/--log --iac=true/false' + print 'DominoClient.py -c/--conf -p/--port -i/--ipaddr -l/--log --iac=true/false --cliport ' sys.exit(2) for opt, arg in opts: if opt == '-h': - print 'DominoClient.py -c/--conf -p/--port -i/--ipaddr -l/--log --iac=true/false' + print 'DominoClient.py -c/--conf -p/--port -i/--ipaddr -l/--log --iac=true/false --cliport ' sys.exit() elif opt in ("-c", "--conf"): configfile = arg @@ -416,7 +466,11 @@ def main(argv): interactive = arg.upper() elif opt in ("--cliport"): client.set_CLIport(int(arg)) - + elif opt in ("--uuid"): + client.UDID = arg + elif opt in ("--regmod"): + if arg.upper() == 'REGISTERED': + client.state = 'REGISTERED' #Set logging level numeric_level = getattr(logging, loglevel.upper(), None) try: