From 50d396311c07d0c193d7aa956d8704dfa2b2619d Mon Sep 17 00:00:00 2001 From: Ulas Kozat Date: Fri, 16 Dec 2016 17:05:39 -0800 Subject: JIRA DOMINO-22 Change-Id: Ia2a9d280e28e53df9a50eb85063b5ce437718df8 Signed-off-by: Ulas Kozat --- DominoClient.py | 65 ++++++++++++---- DominoServer.py | 185 +++++++++++++++++++++++++++++++++------------- domino-cli.py | 3 +- domino-cli.thrift | 2 +- domino.thrift | 14 ++-- lib/dominoCLI/ttypes.py | 18 +++-- lib/dominoRPC/ttypes.py | 64 ++++++++++++++-- tests/logdata/client1.log | 66 ++++++++--------- tests/logdata/server.log | 76 ++++++++++--------- 9 files changed, 338 insertions(+), 155 deletions(-) diff --git a/DominoClient.py b/DominoClient.py index 39eceaa..d02027b 100755 --- a/DominoClient.py +++ b/DominoClient.py @@ -67,7 +67,7 @@ class CommunicationHandler: 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.seq_no)+'.yaml' , push_msg.template) + 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() @@ -131,10 +131,8 @@ 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 @@ -147,24 +145,29 @@ class DominoClientCLIService(threading.Thread): def process_input(self, args): if len(args) == 0: - print 'Empty API body' - return + 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 = [] @@ -197,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!' @@ -218,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) @@ -323,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() @@ -332,6 +343,8 @@ 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 = miscutil.read_templatefile(toscafile) @@ -371,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() @@ -415,7 +446,7 @@ def main(argv): 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 --cliport ' sys.exit(2) @@ -435,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: diff --git a/DominoServer.py b/DominoServer.py index e7ee04a..d92b72c 100755 --- a/DominoServer.py +++ b/DominoServer.py @@ -66,34 +66,33 @@ class CommunicationHandler: # 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) - + except: + raise def closeconnection(self): self.transport.close() - def push_template(self,template,ipaddr,tcpport): - self.openconnection(ipaddr,tcpport) - pushm = PushMessage() - pushm.domino_udid = SERVER_UDID - pushm.seq_no = self.seqno - pushm.template_type = 'tosca-nfv-v1.0' - pushm.template = template + def push_template(self,template,ipaddr,tcpport,TUID): try: + self.openconnection(ipaddr,tcpport) + pushm = PushMessage() + pushm.domino_udid = SERVER_UDID + pushm.seq_no = self.seqno + pushm.template_type = 'tosca-nfv-v1.0' + pushm.template = template + pushm.template_UUID = TUID + self.seqno = self.seqno + 1 + push_r = self.sender.d_push(pushm) logging.info('Push Response received from %s' , push_r.domino_udid) - except (Thrift.TException, TSocket.TTransportException) as tx: - logging.error('%s' , tx.message) + self.closeconnection() except (socket.timeout) as tx: self.dominoServer.handle_RPC_timeout(pushm) + raise tx except: logging.error('Unexpected error: %s', sys.exc_info()[0]) - - self.seqno = self.seqno + 1 - - self.closeconnection() + raise #Heartbeat from Domino Client is received #Actions: @@ -192,8 +191,8 @@ class CommunicationHandler: c = dbconn.cursor() newlabelset = self.dominoServer.subscribed_labels[sub_msg.domino_udid] try: - c.execute("REPLACE INTO labels (udid, label_list) VALUES ({udid}, '{newvalue}')".\ - format(udid=sub_msg.domino_udid, newvalue=','.join(list(newlabelset)) )) + newvalue=','.join(list(newlabelset)) + c.execute( "REPLACE INTO labels VALUES (?,?)", (sub_msg.domino_udid,newvalue) ) except sqlite3.OperationalError as ex1: logging.error('Could not add the new labels to %s for Domino Client %s : %s', SERVER_DBFILE, sub_msg.domino_udid, ex1.message) except: @@ -202,8 +201,8 @@ class CommunicationHandler: newttypeset = self.dominoServer.subscribed_templateformats[sub_msg.domino_udid] try: - c.execute("REPLACE INTO ttypes (udid, ttype_list) VALUES ({udid}, '{newvalue}')".\ - format(udid=sub_msg.domino_udid, newvalue=','.join(list(newttypeset)) )) + newvalue=','.join(list(newttypeset)) + c.execute( "REPLACE INTO ttypes VALUES (?,?)", (sub_msg.domino_udid,newvalue) ) except sqlite3.OperationalError as ex1: logging.error('Could not add the new labels to %s for Domino Client %s : %s', SERVER_DBFILE, sub_msg.domino_udid, ex1.message) except: @@ -228,11 +227,25 @@ class CommunicationHandler: #Actions: # - Parse the template, perform mapping, partition the template # - Launch Push service - # - Respond Back with Publication Response + # - Respond Back with Publication Response def d_publish(self, pub_msg): logging.info('Publish Request received from %s' , pub_msg.domino_udid) - logging.debug(pub_msg.template) + #logging.debug(pub_msg.template) + + # Create response with response code as SUCCESS by default + # Response code will be overwritten if partial or full failure occurs + pub_r = PublishResponseMessage() + pub_r.domino_udid = SERVER_UDID + pub_r.seq_no = self.seqno + pub_r.responseCode = SUCCESS + pub_r.template_UDID = pub_msg.template_UUID + self.seqno = self.seqno + 1 + if (pub_msg.template_UUID is not None) and (self.dominoServer.TUID2Publisher.has_key(pub_msg.template_UUID) == False): + logging.debug('TEMPLATE UUID %s does not exist', pub_msg.template_UUID) + pub_r.responseCode = FAILED + return pub_r + # Save as file try: os.makedirs(TOSCADIR) @@ -249,13 +262,9 @@ class CommunicationHandler: #Some sort of race condition should have occured that prevented the write operation #treat as failure logging.error('FAILED to write the published file: %s', sys.exc_info()[0]) - pub_r = PublishResponseMessage() - pub_r.domino_udid = SERVER_UDID - pub_r.seq_no = self.seqno pub_r.responseCode = FAILED - self.seqno = self.seqno + 1 return pub_r - + # Load tosca object from file into memory try: #tosca = ToscaTemplate( TOSCADIR+TOSCA_DEFAULT_FNAME ) @@ -263,11 +272,7 @@ class CommunicationHandler: except: logging.error('Tosca Parser error: %s', sys.exc_info()[0]) #tosca file could not be read - pub_r = PublishResponseMessage() - pub_r.domino_udid = SERVER_UDID - pub_r.seq_no = self.seqno pub_r.responseCode = FAILED - self.seqno = self.seqno + 1 return pub_r # Extract Labels @@ -288,13 +293,36 @@ class CommunicationHandler: # Create work-flow - # Create response with response code as SUCCESS by default - # Response code will be overwrittent if partial or full failure occurs - pub_r = PublishResponseMessage() - pub_r.domino_udid = SERVER_UDID - pub_r.seq_no = self.seqno - pub_r.responseCode = SUCCESS - self.seqno = self.seqno + 1 + # Assign template UUID if no UUID specified + # Otherwise update the existing domains subscribed to TUID + unsuccessful_updates = [] + if pub_msg.template_UUID is None: + pub_r.template_UDID = self.dominoServer.assign_tuid() #update response message with the newly assigned template UUID + else: + logging.debug('TEMPLATE UUID %s exists, verify publisher and update subscribers', pub_msg.template_UUID) + if self.dominoServer.TUID2Publisher[pub_msg.template_UUID] != pub_msg.domino_udid: #publisher is not the owner, reject + logging.error('FAILED to verify publisher: %s against the publisher on record: %s', pub_msg.domino_udid, self.dominoServer.TUID2Publisher[pub_msg.template_UUID]) + pub_r.responseCode = FAILED + return pub_r + else: #Template exists, we need to find clients that are no longer in the subscription list list + TUID_unsubscribed_list = list(set(self.dominoServer.TUID2Subscribers[pub_r.template_UDID]) - set(file_paths.keys())) + if len(TUID_unsubscribed_list) > 0: + logging.debug('%s no longer host any nodes for TUID %s', TUID_unsubscribed_list, pub_r.template_UDID) + # Send empty bodied templates to domains which no longer has any assigned resource + template_lines = [] + for i in range(len(TUID_unsubscribed_list)): + domino_client_ip = self.dominoServer.registration_record[TUID_unsubscribed_list[i]].ipaddr + domino_client_port = self.dominoServer.registration_record[TUID_unsubscribed_list[i]].tcpport + try: + self.push_template(template_lines, domino_client_ip, domino_client_port, pub_r.template_UDID) + except: + logging.error('Error in pushing template: %s', sys.exc_info()[0]) + unsuccessful_updates.append(TUID_unsubscribed_list[i]) + + # The following template distribution is not transactional, meaning that some domains + # might be successfull receiving their sub-templates while some other might not + # The function returns FAILED code to the publisher in such situations, meaning that + # publisher must republish to safely orchestrate/manage NS or VNF # Send domain templates to each domain agent/client # FOR NOW: send untranslated but partitioned tosca files to scheduled sites @@ -311,7 +339,7 @@ class CommunicationHandler: template_lines = [ output ] else: template_lines = miscutil.read_templatefile(file_paths[site]) - self.push_template(template_lines, domino_client_ip, domino_client_port) + self.push_template(template_lines, domino_client_ip, domino_client_port, pub_r.template_UDID) except IOError as e: logging.error('I/O error(%d): %s' , e.errno, e.strerror) pub_r.responseCode = FAILED @@ -325,6 +353,39 @@ class CommunicationHandler: if len(file_paths) == 0: pub_r.responseCode = FAILED + + dbconn = sqlite3.connect(SERVER_DBFILE) + c = dbconn.cursor() + + if pub_r.responseCode == SUCCESS: + # update in memory database + self.dominoServer.TUID2Publisher[pub_r.template_UDID] = pub_msg.domino_udid + try: + c.execute( "REPLACE INTO templates VALUES (?,?)", (pub_r.template_UDID,pub_msg.domino_udid) ) + dbconn.commit() + except sqlite3.OperationalError as ex1: + logging.error('Could not add new TUID %s DB for Domino Client %s : %s', pub_r.template_UDID, pub_msg.domino_udid, ex1.message) + except: + logging.error('Could not add new TUID %s to DB for Domino Client %s', pub_r.template_UDID, pub_msg.domino_udid) + logging.error('Unexpected error: %s', sys.exc_info()[0]) + else: + self.dominoServer.TUID2Publisher[pub_r.template_UDID] = pub_msg.domino_udid + + # update in memory database + self.dominoServer.TUID2Subscribers[pub_r.template_UDID] = list(set(unsuccessful_updates).union(set(file_paths.keys()))) #file_paths.keys() + logging.debug('Subscribers: %s for TUID: %s', self.dominoServer.TUID2Subscribers[pub_r.template_UDID], pub_r.template_UDID) + try: + newvalue = ','.join(self.dominoServer.TUID2Subscribers[pub_r.template_UDID]) + c.execute( "REPLACE INTO subscribers VALUES (?,?)", (pub_r.template_UDID,newvalue) ) + dbconn.commit() + except sqlite3.OperationalError as ex1: + logging.error('Could not add new subscribers for TUID %s for Domino Client %s: %s', pub_r.template_UDID, pub_msg.domino_udid, ex1.message) + except: + logging.error('Could not add new TUID %s to DB for Domino Client %s', pub_r.template_UDID, pub_msg.domino_udid) + logging.error('Unexpected error: %s', sys.exc_info()[0]) + + dbconn.close() + return pub_r #Query from Domino Client is received @@ -334,7 +395,16 @@ class CommunicationHandler: def d_query(self, qu_msg): #Fill in the details qu_r = QueryResponseMessage() + qu_r.domino_udid = SERVER_UDID + qu_r.seq_no = self.seqno + qu_r.responseCode = SUCCESS + qu_r.queryResponse = [] + + for i in range(len(qu_msg.queryString)): + if qu_msg.queryString[i] == 'list-tuids': # limit the response to TUIDs that belong to this domino client + qu_r.queryResponse.extend([j for j in self.dominoServer.TUID2Publisher.keys() if self.dominoServer.TUID2Publisher[j] == qu_msg.domino_udid]) + self.seqno = self.seqno + 1 return qu_r @@ -344,6 +414,9 @@ class DominoServer: self.subscribed_labels = dict() self.subscribed_templateformats = dict() self.registration_record = dict() + self.assignedTUIDs = list() + self.TUID2Publisher = dict() + self.TUID2Subscribers = dict() self.communicationHandler = CommunicationHandler(self) self.processor = Communication.Processor(self.communicationHandler) self.transport = TSocket.TServerSocket(port=DOMINO_SERVER_PORT) @@ -363,17 +436,19 @@ class DominoServer: #If not assigned, assign it #If assigned, offer a new random id def assign_udid(self, udid_desired): - if udid_desired in self.assignedUUIDs: - new_udid = uuid.uuid4().hex #random.getrandbits(63) - while new_udid in self.assignedUUIDs: - new_udid = uuid.uuid4().hex #random.getrandbits(63) - - self.assignedUUIDs.append(new_udid) - return new_udid - else: - self.assignedUUIDs.append(udid_desired) - return udid_desired - + new_udid = udid_desired + while new_udid in self.assignedUUIDs: + new_udid = uuid.uuid4().hex + self.assignedUUIDs.append(new_udid) + return new_udid + + def assign_tuid(self): + new_TUID = uuid.uuid4().hex + while new_TUID in self.assignedTUIDs: + new_TUID = uuid.uuid4().hex + self.assignedTUIDs.append(new_TUID) + return new_TUID + def handle_RPC_timeout(self, RPCmessage): if RPCmessage.messageType == PUSH: logging.debug('RPC Timeout for message type: PUSH') @@ -424,6 +499,16 @@ def main(argv): except sqlite3.OperationalError as ex: logging.debug('In database file %s, no table is created as %s', SERVER_DBFILE, ex.message) + try: + c.execute('''CREATE TABLE templates (uuid_t TEXT PRIMARY KEY, udid TEXT)''') + except sqlite3.OperationalError as ex: + logging.debug('In database file %s, no table is created as %s', SERVER_DBFILE, ex.message) + + try: + c.execute('''CREATE TABLE subscribers (tuid TEXT PRIMARY KEY, subscriber_list TEXT)''') + except sqlite3.OperationalError as ex: + logging.debug('In database file %s, no table is created as %s', SERVER_DBFILE, ex.message) + dbconn.commit() dbconn.close() diff --git a/domino-cli.py b/domino-cli.py index 1681139..d9245b3 100755 --- a/domino-cli.py +++ b/domino-cli.py @@ -49,7 +49,8 @@ def main(argv, cli_port): CLImsg = CLIMessage() CLImsg.CLI_input = argv CLIrespmsg = client.d_CLI(CLImsg) - + if CLIrespmsg.CLI_response is not None: + print CLIrespmsg.CLI_response except Thrift.TException, tx: print '%s' % (tx.message) diff --git a/domino-cli.thrift b/domino-cli.thrift index e21c0ec..04691ea 100644 --- a/domino-cli.thrift +++ b/domino-cli.thrift @@ -30,7 +30,7 @@ struct CLIMessage { } struct CLIResponse { - 1: string CLI_response + 1: list CLI_response } service DominoClientCLI { diff --git a/domino.thrift b/domino.thrift index a3335ca..dd48942 100644 --- a/domino.thrift +++ b/domino.thrift @@ -151,7 +151,8 @@ struct PublishMessage { 2: string domino_udid, 3: i64 seq_no, 4: string template_type, - 5: list template + 5: list template, + 6: optional string template_UUID } struct PublishResponseMessage { @@ -159,7 +160,8 @@ struct PublishResponseMessage { 2: string domino_udid, 3: i64 seq_no, 4: ResponseCode responseCode, - 5: optional list comments + 5: string template_UUID, + 6: optional list comments } struct PushMessage { @@ -167,7 +169,8 @@ struct PushMessage { 2: string domino_udid, 3: i64 seq_no, 4: string template_type, - 5: list template + 5: list template, + 6: string template_UUID } struct PushResponseMessage { @@ -182,7 +185,8 @@ struct QueryMessage{ 1: MessageType messageType = QUERY, 2: string domino_udid, 3: i64 seq_no, - 4: list queryString + 4: list queryString, + 5: optional string template_UUID } struct QueryResponseMessage{ @@ -190,7 +194,7 @@ struct QueryResponseMessage{ 2: string domino_udid, 3: i64 seq_no, 4: ResponseCode responseCode, - 5: optional list queryResponse, + 5: optional list queryResponse } service Communication { diff --git a/lib/dominoCLI/ttypes.py b/lib/dominoCLI/ttypes.py index 9794dba..4c23c8d 100644 --- a/lib/dominoCLI/ttypes.py +++ b/lib/dominoCLI/ttypes.py @@ -101,7 +101,7 @@ class CLIResponse: thrift_spec = ( None, # 0 - (1, TType.STRING, 'CLI_response', None, None, ), # 1 + (1, TType.LIST, 'CLI_response', (TType.STRING,None), None, ), # 1 ) def __init__(self, CLI_response=None,): @@ -117,8 +117,13 @@ class CLIResponse: if ftype == TType.STOP: break if fid == 1: - if ftype == TType.STRING: - self.CLI_response = iprot.readString() + if ftype == TType.LIST: + self.CLI_response = [] + (_etype10, _size7) = iprot.readListBegin() + for _i11 in xrange(_size7): + _elem12 = iprot.readString() + self.CLI_response.append(_elem12) + iprot.readListEnd() else: iprot.skip(ftype) else: @@ -132,8 +137,11 @@ class CLIResponse: return oprot.writeStructBegin('CLIResponse') if self.CLI_response is not None: - oprot.writeFieldBegin('CLI_response', TType.STRING, 1) - oprot.writeString(self.CLI_response) + oprot.writeFieldBegin('CLI_response', TType.LIST, 1) + oprot.writeListBegin(TType.STRING, len(self.CLI_response)) + for iter13 in self.CLI_response: + oprot.writeString(iter13) + oprot.writeListEnd() oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() diff --git a/lib/dominoRPC/ttypes.py b/lib/dominoRPC/ttypes.py index a37b244..47402f3 100644 --- a/lib/dominoRPC/ttypes.py +++ b/lib/dominoRPC/ttypes.py @@ -693,6 +693,7 @@ class PublishMessage: - seq_no - template_type - template + - template_UUID """ thrift_spec = ( @@ -702,9 +703,10 @@ class PublishMessage: (3, TType.I64, 'seq_no', None, None, ), # 3 (4, TType.STRING, 'template_type', None, None, ), # 4 (5, TType.LIST, 'template', (TType.STRING,None), None, ), # 5 + (6, TType.STRING, 'template_UUID', None, None, ), # 6 ) - def __init__(self, messageType=thrift_spec[1][4], domino_udid=None, seq_no=None, template_type=None, template=None,): + def __init__(self, messageType=thrift_spec[1][4], domino_udid=None, seq_no=None, template_type=None, template=None, template_UUID=None,): if messageType is self.thrift_spec[1][4]: messageType = 6 self.messageType = messageType @@ -712,6 +714,7 @@ class PublishMessage: self.seq_no = seq_no self.template_type = template_type self.template = template + self.template_UUID = template_UUID def read(self, iprot): if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None: @@ -752,6 +755,11 @@ class PublishMessage: iprot.readListEnd() else: iprot.skip(ftype) + elif fid == 6: + if ftype == TType.STRING: + self.template_UUID = iprot.readString() + else: + iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -785,6 +793,10 @@ class PublishMessage: oprot.writeString(iter41) oprot.writeListEnd() oprot.writeFieldEnd() + if self.template_UUID is not None: + oprot.writeFieldBegin('template_UUID', TType.STRING, 6) + oprot.writeString(self.template_UUID) + oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -799,6 +811,7 @@ class PublishMessage: value = (value * 31) ^ hash(self.seq_no) value = (value * 31) ^ hash(self.template_type) value = (value * 31) ^ hash(self.template) + value = (value * 31) ^ hash(self.template_UUID) return value def __repr__(self): @@ -819,6 +832,7 @@ class PublishResponseMessage: - domino_udid - seq_no - responseCode + - template_UUID - comments """ @@ -828,16 +842,18 @@ class PublishResponseMessage: (2, TType.STRING, 'domino_udid', None, None, ), # 2 (3, TType.I64, 'seq_no', None, None, ), # 3 (4, TType.BYTE, 'responseCode', None, None, ), # 4 - (5, TType.LIST, 'comments', (TType.STRING,None), None, ), # 5 + (5, TType.STRING, 'template_UUID', None, None, ), # 5 + (6, TType.LIST, 'comments', (TType.STRING,None), None, ), # 6 ) - def __init__(self, messageType=thrift_spec[1][4], domino_udid=None, seq_no=None, responseCode=None, comments=None,): + def __init__(self, messageType=thrift_spec[1][4], domino_udid=None, seq_no=None, responseCode=None, template_UUID=None, comments=None,): if messageType is self.thrift_spec[1][4]: messageType = 7 self.messageType = messageType self.domino_udid = domino_udid self.seq_no = seq_no self.responseCode = responseCode + self.template_UUID = template_UUID self.comments = comments def read(self, iprot): @@ -870,6 +886,11 @@ class PublishResponseMessage: else: iprot.skip(ftype) elif fid == 5: + if ftype == TType.STRING: + self.template_UUID = iprot.readString() + else: + iprot.skip(ftype) + elif fid == 6: if ftype == TType.LIST: self.comments = [] (_etype45, _size42) = iprot.readListBegin() @@ -905,8 +926,12 @@ class PublishResponseMessage: oprot.writeFieldBegin('responseCode', TType.BYTE, 4) oprot.writeByte(self.responseCode) oprot.writeFieldEnd() + if self.template_UUID is not None: + oprot.writeFieldBegin('template_UUID', TType.STRING, 5) + oprot.writeString(self.template_UUID) + oprot.writeFieldEnd() if self.comments is not None: - oprot.writeFieldBegin('comments', TType.LIST, 5) + oprot.writeFieldBegin('comments', TType.LIST, 6) oprot.writeListBegin(TType.STRING, len(self.comments)) for iter48 in self.comments: oprot.writeString(iter48) @@ -925,6 +950,7 @@ class PublishResponseMessage: value = (value * 31) ^ hash(self.domino_udid) value = (value * 31) ^ hash(self.seq_no) value = (value * 31) ^ hash(self.responseCode) + value = (value * 31) ^ hash(self.template_UUID) value = (value * 31) ^ hash(self.comments) return value @@ -947,6 +973,7 @@ class PushMessage: - seq_no - template_type - template + - template_UUID """ thrift_spec = ( @@ -956,9 +983,10 @@ class PushMessage: (3, TType.I64, 'seq_no', None, None, ), # 3 (4, TType.STRING, 'template_type', None, None, ), # 4 (5, TType.LIST, 'template', (TType.STRING,None), None, ), # 5 + (6, TType.STRING, 'template_UUID', None, None, ), # 6 ) - def __init__(self, messageType=thrift_spec[1][4], domino_udid=None, seq_no=None, template_type=None, template=None,): + def __init__(self, messageType=thrift_spec[1][4], domino_udid=None, seq_no=None, template_type=None, template=None, template_UUID=None,): if messageType is self.thrift_spec[1][4]: messageType = 8 self.messageType = messageType @@ -966,6 +994,7 @@ class PushMessage: self.seq_no = seq_no self.template_type = template_type self.template = template + self.template_UUID = template_UUID def read(self, iprot): if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None: @@ -1006,6 +1035,11 @@ class PushMessage: iprot.readListEnd() else: iprot.skip(ftype) + elif fid == 6: + if ftype == TType.STRING: + self.template_UUID = iprot.readString() + else: + iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -1039,6 +1073,10 @@ class PushMessage: oprot.writeString(iter55) oprot.writeListEnd() oprot.writeFieldEnd() + if self.template_UUID is not None: + oprot.writeFieldBegin('template_UUID', TType.STRING, 6) + oprot.writeString(self.template_UUID) + oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -1053,6 +1091,7 @@ class PushMessage: value = (value * 31) ^ hash(self.seq_no) value = (value * 31) ^ hash(self.template_type) value = (value * 31) ^ hash(self.template) + value = (value * 31) ^ hash(self.template_UUID) return value def __repr__(self): @@ -1200,6 +1239,7 @@ class QueryMessage: - domino_udid - seq_no - queryString + - template_UUID """ thrift_spec = ( @@ -1208,15 +1248,17 @@ class QueryMessage: (2, TType.STRING, 'domino_udid', None, None, ), # 2 (3, TType.I64, 'seq_no', None, None, ), # 3 (4, TType.LIST, 'queryString', (TType.STRING,None), None, ), # 4 + (5, TType.STRING, 'template_UUID', None, None, ), # 5 ) - def __init__(self, messageType=thrift_spec[1][4], domino_udid=None, seq_no=None, queryString=None,): + def __init__(self, messageType=thrift_spec[1][4], domino_udid=None, seq_no=None, queryString=None, template_UUID=None,): if messageType is self.thrift_spec[1][4]: messageType = 10 self.messageType = messageType self.domino_udid = domino_udid self.seq_no = seq_no self.queryString = queryString + self.template_UUID = template_UUID def read(self, iprot): if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None: @@ -1252,6 +1294,11 @@ class QueryMessage: iprot.readListEnd() else: iprot.skip(ftype) + elif fid == 5: + if ftype == TType.STRING: + self.template_UUID = iprot.readString() + else: + iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -1281,6 +1328,10 @@ class QueryMessage: oprot.writeString(iter69) oprot.writeListEnd() oprot.writeFieldEnd() + if self.template_UUID is not None: + oprot.writeFieldBegin('template_UUID', TType.STRING, 5) + oprot.writeString(self.template_UUID) + oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -1294,6 +1345,7 @@ class QueryMessage: value = (value * 31) ^ hash(self.domino_udid) value = (value * 31) ^ hash(self.seq_no) value = (value * 31) ^ hash(self.queryString) + value = (value * 31) ^ hash(self.template_UUID) return value def __repr__(self): diff --git a/tests/logdata/client1.log b/tests/logdata/client1.log index aa24fb1..c589f6d 100644 --- a/tests/logdata/client1.log +++ b/tests/logdata/client1.log @@ -1,33 +1,33 @@ -12/01/2016 12:06:19 PM Domino Client Starting... -12/01/2016 12:06:19 PM 1 Sending Registration -12/01/2016 12:06:19 PM Registration Response: Response Code: 1 -12/01/2016 12:06:19 PM CLI Service is starting -12/01/2016 12:06:19 PM RPC service for CLI is starting... -12/01/2016 12:06:21 PM Received CLI ['heartbeat'] -12/01/2016 12:06:21 PM 12345678123456781234567812345678 Sending heartbeat -12/01/2016 12:06:21 PM heart beat received from: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ,sequence number: 2 -12/01/2016 12:06:22 PM Received CLI ['subscribe', '-t', 'hot', '-l', 'tosca.policies.Placement:properties:region:nova-1'] -12/01/2016 12:06:22 PM subscribing labels ['tosca.policies.Placement:properties:region:nova-1'] and templates ['hot'] -12/01/2016 12:06:22 PM Subscribe Response is received from: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ,sequence number: 3 -12/01/2016 12:06:23 PM Received CLI ['subscribe', '-t', 'dummy1,dummy2', '--top', 'OVERWRITE'] -12/01/2016 12:06:23 PM subscribing labels [] and templates ['dummy1', 'dummy2'] -12/01/2016 12:06:23 PM Subscribe Response is received from: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ,sequence number: 4 -12/01/2016 12:06:24 PM Received CLI ['subscribe', '-t', 'dummy1,dummy2', '--top', 'DELETE'] -12/01/2016 12:06:24 PM subscribing labels [] and templates ['dummy1', 'dummy2'] -12/01/2016 12:06:24 PM Subscribe Response is received from: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ,sequence number: 5 -12/01/2016 12:06:25 PM Received CLI ['subscribe', '-l', 'tosca.policies.Placement:properties:region:nova-2'] -12/01/2016 12:06:25 PM subscribing labels ['tosca.policies.Placement:properties:region:nova-2'] and templates [] -12/01/2016 12:06:25 PM Subscribe Response is received from: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ,sequence number: 6 -12/01/2016 12:06:26 PM Received CLI ['subscribe', '-l', 'tosca.policies.Placement:properties:region:nova-3', '--lop', 'OVERWRITE'] -12/01/2016 12:06:26 PM subscribing labels ['tosca.policies.Placement:properties:region:nova-3'] and templates [] -12/01/2016 12:06:26 PM Subscribe Response is received from: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ,sequence number: 7 -12/01/2016 12:06:27 PM Received CLI ['subscribe', '-l', 'tosca.policies.Placement:properties:region:nova-3', '--lop', 'DELETE'] -12/01/2016 12:06:27 PM subscribing labels ['tosca.policies.Placement:properties:region:nova-3'] and templates [] -12/01/2016 12:06:27 PM Subscribe Response is received from: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ,sequence number: 8 -12/01/2016 12:06:28 PM Received CLI ['publish', '-t', './tosca-templates/tosca_helloworld_nfv.yaml'] -12/01/2016 12:06:28 PM Publishing the template file: ./tosca-templates/tosca_helloworld_nfv.yaml -12/01/2016 12:06:28 PM Publish Response is received from: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ,sequence number: 9 Status: 2 -12/01/2016 12:06:29 PM Received CLI ['subscribe', '-l', 'tosca.policies.Placement.Geolocation:properties:region:us-west-1'] -12/01/2016 12:06:29 PM subscribing labels ['tosca.policies.Placement.Geolocation:properties:region:us-west-1'] and templates [] -12/01/2016 12:06:29 PM Subscribe Response is received from: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ,sequence number: 10 -12/01/2016 12:06:30 PM 12345678123456781234567812345678 Received Template File +12/15/2016 04:19:39 PM Domino Client Starting... +12/15/2016 04:19:39 PM 1 Sending Registration +12/15/2016 04:19:39 PM Registration Response: Response Code: 1 +12/15/2016 04:19:39 PM CLI Service is starting +12/15/2016 04:19:39 PM RPC service for CLI is starting... +12/15/2016 04:19:41 PM Received CLI ['heartbeat'] +12/15/2016 04:19:41 PM 12345678123456781234567812345678 Sending heartbeat +12/15/2016 04:19:41 PM heart beat received from: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ,sequence number: 2 +12/15/2016 04:19:42 PM Received CLI ['subscribe', '-t', 'hot', '-l', 'tosca.policies.Placement:properties:region:nova-1'] +12/15/2016 04:19:42 PM subscribing labels ['tosca.policies.Placement:properties:region:nova-1'] and templates ['hot'] +12/15/2016 04:19:42 PM Subscribe Response is received from: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ,sequence number: 3 +12/15/2016 04:19:43 PM Received CLI ['subscribe', '-t', 'dummy1,dummy2', '--top', 'OVERWRITE'] +12/15/2016 04:19:43 PM subscribing labels [] and templates ['dummy1', 'dummy2'] +12/15/2016 04:19:43 PM Subscribe Response is received from: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ,sequence number: 4 +12/15/2016 04:19:44 PM Received CLI ['subscribe', '-t', 'dummy1,dummy2', '--top', 'DELETE'] +12/15/2016 04:19:44 PM subscribing labels [] and templates ['dummy1', 'dummy2'] +12/15/2016 04:19:44 PM Subscribe Response is received from: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ,sequence number: 5 +12/15/2016 04:19:45 PM Received CLI ['subscribe', '-l', 'tosca.policies.Placement:properties:region:nova-2'] +12/15/2016 04:19:45 PM subscribing labels ['tosca.policies.Placement:properties:region:nova-2'] and templates [] +12/15/2016 04:19:45 PM Subscribe Response is received from: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ,sequence number: 6 +12/15/2016 04:19:46 PM Received CLI ['subscribe', '-l', 'tosca.policies.Placement:properties:region:nova-3', '--lop', 'OVERWRITE'] +12/15/2016 04:19:46 PM subscribing labels ['tosca.policies.Placement:properties:region:nova-3'] and templates [] +12/15/2016 04:19:46 PM Subscribe Response is received from: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ,sequence number: 7 +12/15/2016 04:19:47 PM Received CLI ['subscribe', '-l', 'tosca.policies.Placement:properties:region:nova-3', '--lop', 'DELETE'] +12/15/2016 04:19:47 PM subscribing labels ['tosca.policies.Placement:properties:region:nova-3'] and templates [] +12/15/2016 04:19:47 PM Subscribe Response is received from: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ,sequence number: 8 +12/15/2016 04:19:48 PM Received CLI ['publish', '-t', './tosca-templates/tosca_helloworld_nfv.yaml'] +12/15/2016 04:19:48 PM Publishing the template file: ./tosca-templates/tosca_helloworld_nfv.yaml +12/15/2016 04:19:48 PM Publish Response is received from: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ,sequence number: 9 Status: 2 +12/15/2016 04:19:49 PM Received CLI ['subscribe', '-l', 'tosca.policies.Placement.Geolocation:properties:region:us-west-1'] +12/15/2016 04:19:49 PM subscribing labels ['tosca.policies.Placement.Geolocation:properties:region:us-west-1'] and templates [] +12/15/2016 04:19:49 PM Subscribe Response is received from: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ,sequence number: 10 +12/15/2016 04:19:50 PM 12345678123456781234567812345678 Received Template File diff --git a/tests/logdata/server.log b/tests/logdata/server.log index f50ed35..bdd4c20 100644 --- a/tests/logdata/server.log +++ b/tests/logdata/server.log @@ -1,39 +1,37 @@ -12/01/2016 12:06:18 PM Domino Server Starting... -12/01/2016 12:06:19 PM Registration Request received for UUID 12345678123456781234567812345678 from IP: 192.168.255.10 port: 9091 -12/01/2016 12:06:20 PM Registration Request received for UUID 12345678123456781234567812345678 from IP: 192.168.255.10 port: 9092 -12/01/2016 12:06:21 PM heartbeat received from 12345678123456781234567812345678 -12/01/2016 12:06:22 PM Subscribe Request received from 12345678123456781234567812345678 -12/01/2016 12:06:22 PM APPENDING Labels... -12/01/2016 12:06:22 PM Supported Template: set(['hot']) Supported Labels: set(['tosca.policies.Placement:properties:region:nova-1']) -12/01/2016 12:06:23 PM Subscribe Request received from 12345678123456781234567812345678 -12/01/2016 12:06:23 PM APPENDING Labels... -12/01/2016 12:06:23 PM Supported Template: set(['dummy2', 'dummy1']) Supported Labels: set(['tosca.policies.Placement:properties:region:nova-1']) -12/01/2016 12:06:24 PM Subscribe Request received from 12345678123456781234567812345678 -12/01/2016 12:06:24 PM APPENDING Labels... -12/01/2016 12:06:24 PM Supported Template: set([]) Supported Labels: set(['tosca.policies.Placement:properties:region:nova-1']) -12/01/2016 12:06:25 PM Subscribe Request received from 12345678123456781234567812345678 -12/01/2016 12:06:25 PM APPENDING Labels... -12/01/2016 12:06:25 PM Supported Template: set([]) Supported Labels: set(['tosca.policies.Placement:properties:region:nova-2', 'tosca.policies.Placement:properties:region:nova-1']) -12/01/2016 12:06:26 PM Subscribe Request received from 12345678123456781234567812345678 -12/01/2016 12:06:26 PM OVERWRITING Labels... -12/01/2016 12:06:26 PM Supported Template: set([]) Supported Labels: set(['tosca.policies.Placement:properties:region:nova-3']) -12/01/2016 12:06:27 PM Subscribe Request received from 12345678123456781234567812345678 -12/01/2016 12:06:27 PM DELETING Labels... -12/01/2016 12:06:27 PM Supported Template: set([]) Supported Labels: set([]) -12/01/2016 12:06:28 PM Publish Request received from 12345678123456781234567812345678 -12/01/2016 12:06:28 PM ['tosca_definitions_version: tosca_simple_profile_for_nfv_1_0_0', '', 'description: Template for deploying a single server with predefined properties.', '', 'metadata:', ' template_name: TOSCA NFV Sample Template', '', 'policy_types:', ' tosca.policies.Placement.Geolocation:', ' description: Geolocation policy', ' derived_from: tosca.policies.Placement', '', 'topology_template:', ' node_templates:', ' VNF1:', ' type: tosca.nodes.nfv.VNF', ' properties:', ' id: vnf1', ' vendor: acmetelco', ' version: 1.0', '', ' VNF2:', ' type: tosca.nodes.nfv.VNF', ' properties:', ' id: vnf2', ' vendor: ericsson', ' version: 1.0', '', ' VNF3:', ' type: tosca.nodes.nfv.VNF', ' properties:', ' id: vnf3', ' vendor: huawei', ' version: 1.0', '', ' policies:', ' - rule1:', ' type: tosca.policies.Placement.Geolocation', ' targets: [ VNF1 ]', ' properties:', ' region: [ us-west-1 ]', ' - rule2:', ' type: tosca.policies.Placement.Geolocation', ' targets: [ VNF2, VNF3 ]', ' properties:', ' region: [ us-west-1 , us-west-2 ]'] -12/01/2016 12:06:28 PM Node Labels: {'VNF2': set(['tosca.policies.Placement.Geolocation:properties:region:us-west-1', 'tosca.policies.Placement.Geolocation:properties:region:us-west-2']), 'VNF3': set(['tosca.policies.Placement.Geolocation:properties:region:us-west-1', 'tosca.policies.Placement.Geolocation:properties:region:us-west-2']), 'VNF1': set(['tosca.policies.Placement.Geolocation:properties:region:us-west-1'])} -12/01/2016 12:06:28 PM Site Maps: {'VNF2': set([]), 'VNF3': set([]), 'VNF1': set([])} -12/01/2016 12:06:28 PM Selected Sites: {'VNF2': [], 'VNF3': [], 'VNF1': []} -12/01/2016 12:06:28 PM Per domain file paths: {} -12/01/2016 12:06:29 PM Subscribe Request received from 12345678123456781234567812345678 -12/01/2016 12:06:29 PM APPENDING Labels... -12/01/2016 12:06:29 PM Supported Template: set([]) Supported Labels: set(['tosca.policies.Placement.Geolocation:properties:region:us-west-1']) -12/01/2016 12:06:30 PM Publish Request received from 35bf10e4d2524653bf88d6cf0a184f1b -12/01/2016 12:06:30 PM ['tosca_definitions_version: tosca_simple_profile_for_nfv_1_0_0', '', 'description: Template for deploying a single server with predefined properties.', '', 'metadata:', ' template_name: TOSCA NFV Sample Template', '', 'policy_types:', ' tosca.policies.Placement.Geolocation:', ' description: Geolocation policy', ' derived_from: tosca.policies.Placement', '', 'topology_template:', ' node_templates:', ' VNF1:', ' type: tosca.nodes.nfv.VNF', ' properties:', ' id: vnf1', ' vendor: acmetelco', ' version: 1.0', '', ' VNF2:', ' type: tosca.nodes.nfv.VNF', ' properties:', ' id: vnf2', ' vendor: ericsson', ' version: 1.0', '', ' VNF3:', ' type: tosca.nodes.nfv.VNF', ' properties:', ' id: vnf3', ' vendor: huawei', ' version: 1.0', '', ' policies:', ' - rule1:', ' type: tosca.policies.Placement.Geolocation', ' targets: [ VNF1 ]', ' properties:', ' region: [ us-west-1 ]', ' - rule2:', ' type: tosca.policies.Placement.Geolocation', ' targets: [ VNF2, VNF3 ]', ' properties:', ' region: [ us-west-1 , us-west-2 ]'] -12/01/2016 12:06:30 PM ERRNO 17; ./toscafiles/ exists. Creating: ./toscafiles/template1.yaml -12/01/2016 12:06:30 PM Node Labels: {'VNF2': set(['tosca.policies.Placement.Geolocation:properties:region:us-west-1', 'tosca.policies.Placement.Geolocation:properties:region:us-west-2']), 'VNF3': set(['tosca.policies.Placement.Geolocation:properties:region:us-west-1', 'tosca.policies.Placement.Geolocation:properties:region:us-west-2']), 'VNF1': set(['tosca.policies.Placement.Geolocation:properties:region:us-west-1'])} -12/01/2016 12:06:30 PM Site Maps: {'VNF2': set([]), 'VNF3': set([]), 'VNF1': set(['12345678123456781234567812345678'])} -12/01/2016 12:06:30 PM Selected Sites: {'VNF2': [], 'VNF3': [], 'VNF1': '12345678123456781234567812345678'} -12/01/2016 12:06:30 PM Per domain file paths: {'12345678123456781234567812345678': './toscafiles/template_part12345678123456781234567812345678.yaml'} -12/01/2016 12:06:30 PM Push Response received from 12345678123456781234567812345678 +12/15/2016 04:19:38 PM Domino Server Starting... +12/15/2016 04:19:39 PM Registration Request received for UUID 12345678123456781234567812345678 from IP: 192.168.253.148 port: 9091 +12/15/2016 04:19:40 PM Registration Request received for UUID 12345678123456781234567812345678 from IP: 192.168.253.148 port: 9092 +12/15/2016 04:19:41 PM heartbeat received from 12345678123456781234567812345678 +12/15/2016 04:19:42 PM Subscribe Request received from 12345678123456781234567812345678 +12/15/2016 04:19:42 PM APPENDING Labels... +12/15/2016 04:19:42 PM Supported Template: set(['hot']) Supported Labels: set(['tosca.policies.Placement:properties:region:nova-1']) +12/15/2016 04:19:43 PM Subscribe Request received from 12345678123456781234567812345678 +12/15/2016 04:19:43 PM APPENDING Labels... +12/15/2016 04:19:43 PM Supported Template: set(['dummy2', 'dummy1']) Supported Labels: set(['tosca.policies.Placement:properties:region:nova-1']) +12/15/2016 04:19:44 PM Subscribe Request received from 12345678123456781234567812345678 +12/15/2016 04:19:44 PM APPENDING Labels... +12/15/2016 04:19:44 PM Supported Template: set([]) Supported Labels: set(['tosca.policies.Placement:properties:region:nova-1']) +12/15/2016 04:19:45 PM Subscribe Request received from 12345678123456781234567812345678 +12/15/2016 04:19:45 PM APPENDING Labels... +12/15/2016 04:19:45 PM Supported Template: set([]) Supported Labels: set(['tosca.policies.Placement:properties:region:nova-2', 'tosca.policies.Placement:properties:region:nova-1']) +12/15/2016 04:19:46 PM Subscribe Request received from 12345678123456781234567812345678 +12/15/2016 04:19:46 PM OVERWRITING Labels... +12/15/2016 04:19:46 PM Supported Template: set([]) Supported Labels: set(['tosca.policies.Placement:properties:region:nova-3']) +12/15/2016 04:19:47 PM Subscribe Request received from 12345678123456781234567812345678 +12/15/2016 04:19:47 PM DELETING Labels... +12/15/2016 04:19:47 PM Supported Template: set([]) Supported Labels: set([]) +12/15/2016 04:19:48 PM Publish Request received from 12345678123456781234567812345678 +12/15/2016 04:19:48 PM Node Labels: {'VNF2': set(['tosca.policies.Placement.Geolocation:properties:region:us-west-1', 'tosca.policies.Placement.Geolocation:properties:region:us-west-2']), 'VNF3': set(['tosca.policies.Placement.Geolocation:properties:region:us-west-1', 'tosca.policies.Placement.Geolocation:properties:region:us-west-2']), 'VNF1': set(['tosca.policies.Placement.Geolocation:properties:region:us-west-1'])} +12/15/2016 04:19:48 PM Site Maps: {'VNF2': set([]), 'VNF3': set([]), 'VNF1': set([])} +12/15/2016 04:19:48 PM Selected Sites: {'VNF2': [], 'VNF3': [], 'VNF1': []} +12/15/2016 04:19:48 PM Per domain file paths: {} +12/15/2016 04:19:49 PM Subscribe Request received from 12345678123456781234567812345678 +12/15/2016 04:19:49 PM APPENDING Labels... +12/15/2016 04:19:49 PM Supported Template: set([]) Supported Labels: set(['tosca.policies.Placement.Geolocation:properties:region:us-west-1']) +12/15/2016 04:19:50 PM Publish Request received from 8339120b7e2e4e87a0164c806bea4e06 +12/15/2016 04:19:50 PM ERRNO 17; ./toscafiles/ exists. Creating: ./toscafiles/template1.yaml +12/15/2016 04:19:50 PM Node Labels: {'VNF2': set(['tosca.policies.Placement.Geolocation:properties:region:us-west-1', 'tosca.policies.Placement.Geolocation:properties:region:us-west-2']), 'VNF3': set(['tosca.policies.Placement.Geolocation:properties:region:us-west-1', 'tosca.policies.Placement.Geolocation:properties:region:us-west-2']), 'VNF1': set(['tosca.policies.Placement.Geolocation:properties:region:us-west-1'])} +12/15/2016 04:19:50 PM Site Maps: {'VNF2': set([]), 'VNF3': set([]), 'VNF1': set(['12345678123456781234567812345678'])} +12/15/2016 04:19:50 PM Selected Sites: {'VNF2': [], 'VNF3': [], 'VNF1': '12345678123456781234567812345678'} +12/15/2016 04:19:50 PM Per domain file paths: {'12345678123456781234567812345678': './toscafiles/template_part12345678123456781234567812345678.yaml'} +12/15/2016 04:19:50 PM Push Response received from 12345678123456781234567812345678 -- cgit 1.2.3-korg