JIRA DOMINO-22 31/26131/1
authorUlas Kozat <ulas.kozat@gmail.com>
Sat, 17 Dec 2016 01:05:39 +0000 (17:05 -0800)
committerUlas Kozat <ulas.kozat@gmail.com>
Sat, 17 Dec 2016 01:05:39 +0000 (17:05 -0800)
Change-Id: Ia2a9d280e28e53df9a50eb85063b5ce437718df8
Signed-off-by: Ulas Kozat <ulas.kozat@gmail.com>
DominoClient.py
DominoServer.py
domino-cli.py
domino-cli.thrift
domino.thrift
lib/dominoCLI/ttypes.py
lib/dominoRPC/ttypes.py
tests/logdata/client1.log
tests/logdata/server.log

index 39eceaa..d02027b 100755 (executable)
@@ -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 <toscafile>'
+         print '\nUsage: publish -t <toscafile> -k <TUID>'
          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 <toscafile> -k <TUID>'
 
       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 <configfile> -p/--port <socketport> -i/--ipaddr <IPaddr> -l/--log <loglevel> --iac=true/false --cliport <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:
index e7ee04a..d92b72c 100755 (executable)
@@ -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()
 
index 1681139..d9245b3 100755 (executable)
@@ -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)
 
index e21c0ec..04691ea 100644 (file)
@@ -30,7 +30,7 @@ struct CLIMessage {
 }
 
 struct CLIResponse {
- 1: string CLI_response
+ 1: list<string> CLI_response
 }
 
 service DominoClientCLI {
index a3335ca..dd48942 100644 (file)
@@ -151,7 +151,8 @@ struct PublishMessage {
  2: string domino_udid,
  3: i64 seq_no,
  4: string template_type,
- 5: list<string> template
+ 5: list<string> 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<string> comments
+ 5: string template_UUID,
+ 6: optional list<string> comments
 }
 
 struct PushMessage {
@@ -167,7 +169,8 @@ struct PushMessage {
  2: string domino_udid,
  3: i64 seq_no,
  4: string template_type,
- 5: list<string> template
+ 5: list<string> 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<string> queryString
+ 4: list<string> 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<string> queryResponse,
+ 5: optional list<string> queryResponse
 }
 
 service Communication {
index 9794dba..4c23c8d 100644 (file)
@@ -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()
index a37b244..47402f3 100644 (file)
@@ -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):
index aa24fb1..c589f6d 100644 (file)
@@ -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
index f50ed35..bdd4c20 100644 (file)
@@ -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