aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlas Kozat <ulas.kozat@gmail.com>2016-12-16 17:05:39 -0800
committerUlas Kozat <ulas.kozat@gmail.com>2016-12-16 17:05:39 -0800
commit50d396311c07d0c193d7aa956d8704dfa2b2619d (patch)
treebb31f03b8b680729501383e49f2d4e2866efd931
parent7ad811e8d76d004cc55a7b4a4cc8637df260e42d (diff)
JIRA DOMINO-22
Change-Id: Ia2a9d280e28e53df9a50eb85063b5ce437718df8 Signed-off-by: Ulas Kozat <ulas.kozat@gmail.com>
-rwxr-xr-xDominoClient.py65
-rwxr-xr-xDominoServer.py185
-rwxr-xr-xdomino-cli.py3
-rw-r--r--domino-cli.thrift2
-rw-r--r--domino.thrift14
-rw-r--r--lib/dominoCLI/ttypes.py18
-rw-r--r--lib/dominoRPC/ttypes.py64
-rw-r--r--tests/logdata/client1.log66
-rw-r--r--tests/logdata/server.log76
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 <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:
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<string> 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<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 {
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