def main(): stack = [] n = Semaphore(0) s = Semaphore(1) # Create Producer and Consumer threads producer1 = Producer(stack, n, s, 1) producer2 = Producer(stack, n, s, 2) producer3 = Producer(stack, n, s, 3) producer4 = Producer(stack, n, s, 4) producer5 = Producer(stack, n, s, 5) consumer = Consumer(stack, n, s) # Start all the threads producer1.start() producer2.start() producer3.start() producer4.start() producer5.start() consumer.start() # Wait for threads to finish producer1.join() producer2.join() producer3.join() producer4.join() producer5.join() consumer.join() print("Done.")
def main(): stack = Manager().list() n = Semaphore(0) s = Semaphore(1) # Create Producer and Consumer threads producer1 = Producer(stack, n, s, 1) #producer2 = Producer(stack, n, s, 2) #producer3 = Producer(stack, n, s, 3) #producer4 = Producer(stack, n, s, 4) #producer5 = Producer(stack, n, s, 5) consumer = Consumer(stack, n, s) # Start all the threads producer1.start() #producer2.start() #producer3.start() #producer4.start() #producer5.start() consumer.start() time.sleep(2) consumer.stop() time.sleep(0.1) producer1.stop() # Wait for threads to finish producer1.join() #producer2.join() #producer3.join() #producer4.join() #producer5.join() consumer.join() print("Done.")
class TestPpDev: dmcs_pub_broker_url = None dmcs_publisher = None dmcs_consumer = None dmcs_consumer_msg_list = [] ncsa_pub_broker_url = None ncsa_publisher = None ncsa_ctrl_consumer = None ncsa_consumer_msg_list = [] F1_pub_broker_url = None F1_publisher = None F1_consumer = None f1_consumer_msg_list = [] F2_pub_broker_url = None F2_publisher = None F2_consumer = None f2_consumer_msg_list = [] EXPECTED_NCSA_MESSAGES = 1 EXPECTED_DMCS_MESSAGES = 1 EXPECTED_F1_MESSAGES = 1 EXPECTED_F2_MESSAGES = 1 ccd_list = [14,17,21,86] prp = toolsmod.prp # pretty printing DP = toolsmod.DP # Debug printing either True of False...set here to override this file only def test_ppdev(self, Ppdev): self.ppdev = Ppdev try: cdm = toolsmod.intake_yaml_file('./tests/yaml/L1SystemCfg_Test.yaml') except IOError as e: trace = traceback.print_exc() emsg = "Unable to find CFG Yaml file %s\n" % self._config_file print(emsg + trace) sys.exit(101) broker_addr = cdm[ROOT]['BASE_BROKER_ADDR'] dmcs_name = cdm[ROOT]['DMCS_BROKER_NAME'] dmcs_passwd = cdm[ROOT]['DMCS_BROKER_PASSWD'] dmcs_pub_name = cdm[ROOT]['DMCS_BROKER_PUB_NAME'] dmcs_pub_passwd = cdm[ROOT]['DMCS_BROKER_PUB_PASSWD'] dmcs_broker_url = "amqp://" + dmcs_name + ":" + \ dmcs_passwd + "@" + \ broker_addr dmcs_pub_broker_url = "amqp://" + dmcs_pub_name + ":" + \ dmcs_pub_passwd + "@" + \ broker_addr self.dmcs_publisher = SimplePublisher(dmcs_pub_broker_url, "YAML") ncsa_name = cdm[ROOT]['NCSA_BROKER_NAME'] ncsa_passwd = cdm[ROOT]['NCSA_BROKER_PASSWD'] ncsa_pub_name = cdm[ROOT]['NCSA_BROKER_PUB_NAME'] ncsa_pub_passwd = cdm[ROOT]['NCSA_BROKER_PUB_PASSWD'] ncsa_broker_url = "amqp://" + ncsa_name + ":" + \ ncsa_passwd + "@" + \ broker_addr ncsa_pub_broker_url = "amqp://" + ncsa_pub_name + ":" + \ ncsa_pub_passwd + "@" + \ broker_addr self.ncsa_publisher = SimplePublisher(ncsa_pub_broker_url, "YAML") F1_name = 'F1' F1_passwd = 'F1' F1_pub_name = 'F1_PUB' F1_pub_passwd = 'F1_PUB' F1_broker_url = "amqp://" + F1_name + ":" + \ F1_passwd + "@" + \ broker_addr F1_pub_broker_url = "amqp://" + F1_pub_name + ":" + \ F1_pub_passwd + "@" + \ broker_addr self.f1_publisher = SimplePublisher(F1_pub_broker_url, "YAML") F2_name = 'F2' F2_passwd = 'F2' F2_pub_name = 'F2_PUB' F2_pub_passwd = 'F2_PUB' F2_broker_url = "amqp://" + F2_name + ":" + \ F2_passwd + "@" + \ broker_addr F2_pub_broker_url = "amqp://" + F2_pub_name + ":" + \ F2_pub_passwd + "@" + \ broker_addr self.f2_publisher = SimplePublisher(F2_pub_broker_url, "YAML") # Must be done before consumer threads are started # This is used for verifying message structure self._msg_auth = MessageAuthority() self.dmcs_consumer = Consumer(dmcs_broker_url,'dmcs_ack_consume', 'thread-dmcs', self.on_dmcs_message,'YAML') self.dmcs_consumer.start() self.ncsa_consumer = Consumer(ncsa_broker_url,'ncsa_consume', 'thread-ncsa', self.on_ncsa_message,'YAML') self.ncsa_consumer.start() self.F1_consumer = Consumer(F1_broker_url,'f1_consume', 'thread-f1', self.on_f1_message,'YAML') self.F1_consumer.start() self.F2_consumer = Consumer(F2_broker_url,'f2_consume', 'thread-f2', self.on_f2_message,'YAML') self.F2_consumer.start() sleep(3) if self.DP: print("Test Setup Complete. Commencing Messages...") self.send_messages() sleep(6) self.verify_ncsa_messages() self.verify_F2_messages() self.verify_F1_messages() self.verify_dmcs_messages() sleep(2) self.dmcs_consumer.stop() self.dmcs_consumer.join() self.ncsa_consumer.stop() self.ncsa_consumer.join() self.F1_consumer.stop() self.F1_consumer.join() self.F2_consumer.stop() self.F2_consumer.join() if self.DP: print("Finished with PP tests.") def send_messages(self): if self.DP: print("Starting send_messages") # Tests only an AR device # self.clear_message_lists() self.EXPECTED_NCSA_MESSAGES = 3 self.EXPECTED_DMCS_MESSAGES = 4 self.EXPECTED_F1_MESSAGES = 3 self.EXPECTED_F2_MESSAGES = 3 msg = {} msg['MSG_TYPE'] = "PP_NEW_SESSION" msg['SESSION_ID'] = 'SI_469976' msg['ACK_ID'] = 'NEW_SESSION_ACK_44221' msg['REPLY_QUEUE'] = 'dmcs_ack_consume' time.sleep(3) if self.DP: print("New Session Message") self.dmcs_publisher.publish_message("pp_foreman_consume", msg) msg = {} msg['MSG_TYPE'] = "PP_NEXT_VISIT" msg['VISIT_ID'] = 'XX_28272' msg['REPLY_QUEUE'] = 'dmcs_ack_consume' msg['ACK_ID'] = 'NEW_VISIT_ACK_76' msg['BORE_SIGHT'] = "231,123786456342, -45.3457156906, FK5" time.sleep(2) if self.DP: print("Next Visit Message") self.dmcs_publisher.publish_message("pp_foreman_consume", msg) msg = {} msg['MSG_TYPE'] = "PP_START_INTEGRATION" msg['JOB_NUM'] = '4xx72' msg['IMAGE_ID'] = 'IMG_444244' msg['VISIT_ID'] = 'V14494' msg['SESSION_ID'] = '4_14_7211511' msg['REPLY_QUEUE'] = 'dmcs_ack_consume' msg['ACK_ID'] = 'PP_ACK_94671' msg['CCD_LIST'] = [4,14,16,17,29,35,36] time.sleep(4) if self.DP: print("PP_START_INTEGRATION Message") self.dmcs_publisher.publish_message("pp_foreman_consume", msg) msg = {} msg['MSG_TYPE'] = "PP_READOUT" msg['JOB_NUM'] = '4xx72' msg['IMAGE_ID'] = 'IMG_444244' msg['VISIT_ID'] = 'V14494' msg['SESSION_ID'] = '4_14_7211511' msg['REPLY_QUEUE'] = 'dmcs_ack_consume' msg['ACK_ID'] = 'PP_READOUT_ACK_44221' time.sleep(4) if self.DP: print("PP_READOUT Message") self.dmcs_publisher.publish_message("pp_foreman_consume", msg) time.sleep(2) if self.DP: print("Message Sender done") def verify_dmcs_messages(self): if self.DP: print("Messages received by verify_dmcs_messages:") self.prp.pprint(self.dmcs_consumer_msg_list) len_list = len(self.dmcs_consumer_msg_list) if len_list != self.EXPECTED_DMCS_MESSAGES: pytest.fail('DMCS simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_DMCS_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.dmcs_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: pytest.fail("The following DMCS Bridge response message failed when compared with the sovereign example: %s" % msg) print("Responses to DMCS Bridge pass verification.") def verify_ncsa_messages(self): if self.DP: print("Messages received by verify_ncsa_messages:") self.prp.pprint(self.ncsa_consumer_msg_list) len_list = len(self.ncsa_consumer_msg_list) if len_list != self.EXPECTED_NCSA_MESSAGES: pytest.fail('NCSA simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_NCSA_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.ncsa_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: pytest.fail("The following message to the NCSA Foreman failed when compared with the sovereign example: %s" % msg) print("Messages to the NCSA Foreman pass verification.") def verify_F1_messages(self): if self.DP: print("Messages received by verify_F1_messages:") self.prp.pprint(self.f1_consumer_msg_list) len_list = len(self.f1_consumer_msg_list) if len_list != self.EXPECTED_F1_MESSAGES: pytest.fail('F1 simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_F1_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.f1_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: pytest.fail("The following message to F1 failed when compared with the sovereign example: %s" % msg) else: print("Messages to F1 pass verification.") def verify_F2_messages(self): if self.DP: print("Messages received by verify_F2_messages:") self.prp.pprint(self.f2_consumer_msg_list) len_list = len(self.f2_consumer_msg_list) if len_list != self.EXPECTED_F2_MESSAGES: pytest.fail('F2 simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_F2_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.f2_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: pytest.fail("The following message to F2 failed when compared with the sovereign example: %s" % msg) else: print("Messages to F2 pass verification.") def on_dmcs_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) if self.DP: print("In test_pp_dev - incoming on_dmcs_message") self.prp.pprint(body) print("\n----------------------\n\n") self.dmcs_consumer_msg_list.append(body) def on_ncsa_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) if self.DP: print("In test_pp_dev - incoming on_ncsa_message") self.prp.pprint(body) print("\n----------------------\n\n") self.ncsa_consumer_msg_list.append(body) if body['MSG_TYPE'] == 'NCSA_NEW_SESSION': msg = {} msg['MSG_TYPE'] = 'NCSA_NEW_SESSION_ACK' msg['COMPONENT'] = 'NCSA_FOREMAN' msg['ACK_ID'] = body['ACK_ID'] msg['ACK_BOOL'] = True self.ncsa_publisher.publish_message(body['REPLY_QUEUE'], msg) return if body['MSG_TYPE'] == 'NCSA_NEXT_VISIT': msg = {} msg['MSG_TYPE'] = 'NCSA_NEXT_VISIT_ACK' msg['COMPONENT'] = 'NCSA_FOREMAN' msg['ACK_ID'] = body['ACK_ID'] msg['ACK_BOOL'] = True self.ncsa_publisher.publish_message(body['REPLY_QUEUE'], msg) return if body['MSG_TYPE'] == 'NCSA_START_INTEGRATION': msg = {} msg['ACK_ID'] = body['ACK_ID'] msg['MSG_TYPE'] = 'NCSA_START_INTEGRATION_ACK' msg['COMPONENT'] = 'NCSA_FOREMAN' fwdrs = deepcopy(body['FORWARDERS']) fwdr_list = fwdrs['FORWARDER_LIST'] ccd_list = fwdrs['CCD_LIST'] i = 1 msg['PAIRS'] = [] # This will be a list of dictionaries for i in range(0,len(fwdr_list)): fwdr = fwdr_list[i] dist = {} pair = {} dist['FQN'] = "Distributor_" + str(i) dist['NAME'] = "D" + str(i) dist['HOSTNAME'] = "D" + str(i) dist['TARGET_DIR'] = "/dev/null" dist['IP_ADDR'] = "141.142.237.16" + str(i) pair['FORWARDER'] = fwdr_list[i] pair['CCD_LIST'] = ccd_list[i] #Get the list at index position i in ccd_list pair['DISTRIBUTOR'] = dist msg['PAIRS'].append(deepcopy(pair)) msg['ACK_BOOL'] = True msg['JOB_NUM'] = body['JOB_NUM'] msg['IMAGE_ID'] = body['IMAGE_ID'] msg['VISIT_ID'] = body['VISIT_ID'] msg['SESSION_ID'] = body['SESSION_ID'] self.ncsa_publisher.publish_message(body['REPLY_QUEUE'], msg) return if body['MSG_TYPE'] == 'NCSA_READOUT': # Find earlier Start Int message st_int_msg = None for msg in self.ncsa_consumer_msg_list: if msg['MSG_TYPE'] == 'NCSA_START_INTEGRATION': st_int_msg = msg break if st_int_msg == None: pytest.fail("The NCSA_START_INTEGRATION message wasn't received before NCSA_READOUT in on_ncsa_msg") # Now build response with previous message msg = {} msg['MSG_TYPE'] = 'NCSA_READOUT_ACK' msg['JOB_NUM'] = body['JOB_NUM'] msg['IMAGE_ID'] = body['IMAGE_ID'] msg['VISIT_ID'] = body['VISIT_ID'] msg['SESSION_ID'] = body['SESSION_ID'] msg['COMPONENT'] = 'NCSA_FOREMAN' msg['ACK_BOOL'] = True msg['ACK_ID'] = body['ACK_ID'] #msg['RESULT_LIST']['FORWARDER_LIST'] = st_int_msg['FORWARDERS']['FORWARDER_LIST'] ccd_list = st_int_msg['FORWARDERS']['CCD_LIST'] receipt_list = [] for i in range(0, len(ccd_list)): receipt_list.append('Rec_x447_' + str(i)) msg['RESULT_LIST'] = {} msg['RESULT_LIST']['RECEIPT_LIST'] = receipt_list msg['RESULT_LIST']['CCD_LIST'] = list(ccd_list) #sleep(2) #Give FWDRs time to respond with ack first self.ncsa_publisher.publish_message(body['REPLY_QUEUE'], msg) def on_f1_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) if self.DP: print("In test_pp_dev - incoming on_f1_message") self.prp.pprint(body) print("\n----------------------\n\n") self.f1_consumer_msg_list.append(body) if body['MSG_TYPE'] == 'PP_FWDR_HEALTH_CHECK': msg = {} msg['MSG_TYPE'] = 'PP_FWDR_HEALTH_CHECK_ACK' msg['COMPONENT'] = 'FORWARDER_1' msg['ACK_BOOL'] = True msg['ACK_ID'] = body['ACK_ID'] self.f1_publisher.publish_message(body['REPLY_QUEUE'], msg) elif body['MSG_TYPE'] == 'PP_FWDR_XFER_PARAMS': msg = {} msg['MSG_TYPE'] = 'PP_FWDR_XFER_PARAMS_ACK' msg['COMPONENT'] = 'FORWARDER_1' msg['ACK_BOOL'] = True msg['ACK_ID'] = body['ACK_ID'] self.f1_publisher.publish_message(body['REPLY_QUEUE'], msg) elif body['MSG_TYPE'] == 'PP_FWDR_READOUT': # Find message in message list for xfer_params xfer_msg = None for msg in self.f1_consumer_msg_list: if msg['MSG_TYPE'] == 'PP_FWDR_XFER_PARAMS': xfer_msg = msg break if xfer_msg == None: pytest.fail("The PP_FWDR_XFER_PARAMS message was not received before PP_FWDR_READOUT in F1") # use message to build response msg = {} msg['MSG_TYPE'] = 'PP_FWDR_READOUT_ACK' msg['COMPONENT'] = 'FORWARDER_1' msg['JOB_NUM'] = xfer_msg['JOB_NUM'] msg['IMAGE_ID'] = xfer_msg['IMAGE_ID'] msg['ACK_ID'] = body['ACK_ID'] msg['ACK_BOOL'] = True msg['RESULT_LIST'] = {} msg['RESULT_LIST']['CCD_LIST'] = [] msg['RESULT_LIST']['RECEIPT_LIST'] = [] ccd_list = xfer_msg['XFER_PARAMS']['CCD_LIST'] receipt_list = [] for i in range(0, len(ccd_list)): receipt_list.append('F1_Rec_x477_' + str(i)) msg['RESULT_LIST']['RECEIPT_LIST'] = receipt_list msg['RESULT_LIST']['CCD_LIST'] = list(ccd_list) self.f1_publisher.publish_message(body['REPLY_QUEUE'], msg) else: pytest.fail("The following unknown message was received by FWDR F1: %s" % body) def on_f2_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) if self.DP: print("In test_pp_dev - incoming on_f2_message") self.prp.pprint(body) print("\n----------------------\n\n") self.f2_consumer_msg_list.append(body) if body['MSG_TYPE'] == 'PP_FWDR_HEALTH_CHECK': msg = {} msg['MSG_TYPE'] = 'PP_FWDR_HEALTH_CHECK_ACK' msg['COMPONENT'] = 'FORWARDER_2' msg['ACK_BOOL'] = True msg['ACK_ID'] = body['ACK_ID'] self.f2_publisher.publish_message(body['REPLY_QUEUE'], msg) elif body['MSG_TYPE'] == 'PP_FWDR_XFER_PARAMS': msg = {} msg['MSG_TYPE'] = 'PP_FWDR_XFER_PARAMS_ACK' msg['COMPONENT'] = 'FORWARDER_2' msg['ACK_BOOL'] = True msg['ACK_ID'] = body['ACK_ID'] self.f2_publisher.publish_message(body['REPLY_QUEUE'], msg) elif body['MSG_TYPE'] == 'PP_FWDR_READOUT': # Find message in message list for xfer_params xfer_msg = None for msg in self.f2_consumer_msg_list: if msg['MSG_TYPE'] == 'PP_FWDR_XFER_PARAMS': xfer_msg = msg break if xfer_msg == None: pytest.fail("The PP_FWDR_XFER_PARAMS message was not received before AR_FWDR_READOUT in F2") # use message to build response msg = {} msg['MSG_TYPE'] = 'PP_FWDR_READOUT_ACK' msg['COMPONENT'] = 'FORWARDER_2' msg['JOB_NUM'] = xfer_msg['JOB_NUM'] msg['IMAGE_ID'] = xfer_msg['IMAGE_ID'] msg['ACK_ID'] = body['ACK_ID'] msg['ACK_BOOL'] = True msg['RESULT_LIST'] = {} msg['RESULT_LIST']['CCD_LIST'] = [] msg['RESULT_LIST']['RECEIPT_LIST'] = [] ccd_list = xfer_msg['XFER_PARAMS']['CCD_LIST'] receipt_list = [] for i in range(0, len(ccd_list)): receipt_list.append('F2_Rec_x447_' + str(i)) msg['RESULT_LIST']['RECEIPT_LIST'] = receipt_list msg['RESULT_LIST']['CCD_LIST'] = list(ccd_list) self.f2_publisher.publish_message(body['REPLY_QUEUE'], msg) else: pytest.fail("The following unknown message was received by FWDR F2: %s" % body)
class TestNcsa: pp_pub_broker_url = None pp_publisher = None pp_consumer = None pp_consumer_msg_list = [] D1_pub_broker_url = None D1_publisher = None D1_consumer = None d1_consumer_msg_list = [] D2_pub_broker_url = None D2_publisher = None D2_consumer = None d2_consumer_msg_list = [] EXPECTED_PP_MESSAGES = 1 EXPECTED_D1_MESSAGES = 1 EXPECTED_D2_MESSAGES = 1 ccd_list = [14, 17, 21, 86] prp = toolsmod.prp DP = toolsmod.DP def test_ncsa(self, Ncsa): self.ncsa = Ncsa try: cdm = toolsmod.intake_yaml_file( './tests/yaml/L1SystemCfg_Test_ncsa.yaml') except IOError as e: trace = traceback.print_exc() emsg = "Unable to find CFG Yaml file %s\n" % self._config_file print(emsg + trace) sys.exit(101) broker_addr = cdm[ROOT]['BASE_BROKER_ADDR'] pp_name = cdm[ROOT]['PFM_BROKER_NAME'] pp_passwd = cdm[ROOT]['PFM_BROKER_PASSWD'] pp_pub_name = cdm[ROOT]['PFM_BROKER_PUB_NAME'] pp_pub_passwd = cdm[ROOT]['PFM_BROKER_PUB_PASSWD'] pp_broker_url = "amqp://" + pp_name + ":" + \ pp_passwd + "@" + \ broker_addr pp_pub_broker_url = "amqp://" + pp_pub_name + ":" + \ pp_pub_passwd + "@" + \ broker_addr self.pp_publisher = SimplePublisher(pp_pub_broker_url, "YAML") D1_name = 'D1' D1_passwd = 'D1' D1_pub_name = 'D1_PUB' D1_pub_passwd = 'D1_PUB' D1_broker_url = "amqp://" + D1_name + ":" + \ D1_passwd + "@" + \ broker_addr D1_pub_broker_url = "amqp://" + D1_pub_name + ":" + \ D1_pub_passwd + "@" + \ broker_addr self.d1_publisher = SimplePublisher(D1_pub_broker_url, "YAML") D2_name = 'D2' D2_passwd = 'D2' D2_pub_name = 'D2_PUB' D2_pub_passwd = 'D2_PUB' D2_broker_url = "amqp://" + D2_name + ":" + \ D2_passwd + "@" + \ broker_addr D2_pub_broker_url = "amqp://" + D2_pub_name + ":" + \ D2_pub_passwd + "@" + \ broker_addr self.d2_publisher = SimplePublisher(D2_pub_broker_url, "YAML") # Must be done before consumer threads are started # This is used for verifying message structure self._msg_auth = MessageAuthority() self.pp_consumer = Consumer(pp_broker_url, 'pp_foreman_ack_publish', 'thread-pp', self.on_pp_message, 'YAML') self.pp_consumer.start() self.D1_consumer = Consumer(D1_broker_url, 'd1_consume', 'thread-d1', self.on_d1_message, 'YAML') self.D1_consumer.start() self.D2_consumer = Consumer(D2_broker_url, 'd2_consume', 'thread-d2', self.on_d2_message, 'YAML') self.D2_consumer.start() sleep(3) print("Test Setup Complete. Commencing Messages...") self.send_messages() sleep(7) self.verify_pp_messages() self.verify_D2_messages() self.verify_D1_messages() sleep(2) self.pp_consumer.stop() self.pp_consumer.join() self.D1_consumer.stop() self.D1_consumer.join() self.D2_consumer.stop() self.D2_consumer.join() if self.DP: print("Finished with NCSA tests.") def send_messages(self): print("Starting send_messages") # Tests only an AR device # self.clear_message_lists() self.EXPECTED_PP_MESSAGES = 4 self.EXPECTED_D1_MESSAGES = 3 self.EXPECTED_D2_MESSAGES = 3 msg = {} msg['MSG_TYPE'] = "NCSA_NEW_SESSION" msg['SESSION_ID'] = 'SI_469976' msg['ACK_ID'] = 'NCSA_NEW_SESSION_ACK_44221' msg['REPLY_QUEUE'] = 'pp_foreman_ack_publish' time.sleep(1) if self.DP: print("New Session Message") self.pp_publisher.publish_message("ncsa_consume", msg) msg = {} msg['MSG_TYPE'] = "NCSA_NEXT_VISIT" msg['VISIT_ID'] = 'XX_28272' msg['SESSION_ID'] = 'NNV_469976' msg['REPLY_QUEUE'] = 'pp_foreman_ack_publish' msg['ACK_ID'] = 'NCSA_NEW_VISIT_ACK_76' msg['BORE_SIGHT'] = "231,123786456342, -45.3457156906, FK5" time.sleep(1) if self.DP: print("Next Visit Message") self.pp_publisher.publish_message("ncsa_consume", msg) msg = {} msg['MSG_TYPE'] = "NCSA_START_INTEGRATION" msg['JOB_NUM'] = '4xx72' msg['IMAGE_ID'] = 'IMG_444244' msg['VISIT_ID'] = 'V14494' msg['SESSION_ID'] = '4_14_7211511' msg['REPLY_QUEUE'] = 'pp_foreman_ack_publish' msg['ACK_ID'] = 'PP_ACK_94671' msg['CCD_LIST'] = [4, 14, 16, 17, 29, 35, 36] time.sleep(2) msg['FORWARDERS'] = {} forwarder_list = ['FORWARDER_2', 'FORWARDER_1'] ccd_list = [[17, 18, 111, 126], [128, 131, 132]] msg['FORWARDERS']['FORWARDER_LIST'] = forwarder_list msg['FORWARDERS']['CCD_LIST'] = ccd_list if self.DP: print("NCSA START INTEGRATION Message") self.pp_publisher.publish_message("ncsa_consume", msg) time.sleep(7) msg = {} msg['MSG_TYPE'] = "NCSA_READOUT" msg['JOB_NUM'] = '4xx72' msg['IMAGE_ID'] = 'IMG_444244' msg['VISIT_ID'] = 'V14494' msg['SESSION_ID'] = '4_14_7211511' msg['REPLY_QUEUE'] = 'pp_foreman_ack_publish' msg['ACK_ID'] = 'NCSA_READOUT_ACK_44221' time.sleep(2) if self.DP: print("NCSA READOUT Message") self.pp_publisher.publish_message("ncsa_consume", msg) time.sleep(2) print("Message Sender done") def verify_pp_messages(self): len_list = len(self.pp_consumer_msg_list) if len_list != self.EXPECTED_PP_MESSAGES: pytest.fail('PP simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_PP_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.pp_consumer_msg_list[i] if msg['MSG_TYPE'] == 'NCSA_START_INTEGRATION_ACK': result = self.check_start_int_ack(msg) else: result = self._msg_auth.check_message_shape(msg) if result == False: pytest.fail( "The following message to the PP Foreman failed when compared with the sovereign example: %s" % msg) if self.DP: print("Messages to the PP Foreman pass verification.") def check_start_int_ack(self, msg): """the PAIRS param in the message is a list. Every item in the list is a dictionary. because it is not known how many entried will be on the list, the dictionaries are deepcopied and checked against the MessageAuthority and check one at a time. In the meanwhile, the shape of the incoming message without the dictionaries and the PAIRS list set to None is checked against the MessageAuthority. BTW, because the individual dictionaries do not have a MSG_TYPE, one is added to each dictionary to be checked so the dict to compare to can be located in the messages.yaml file. """ c_msg = deepcopy(msg) pairs = deepcopy(c_msg['PAIRS']) c_msg['PAIRS'] = None overall_shape = self._msg_auth.check_message_shape(c_msg) if overall_shape == False: return False for i in range(0, len(pairs)): pairs[i]['MSG_TYPE'] = 'PAIR' result = self._msg_auth.check_message_shape(pairs[i]) if result == False: return False return True def verify_D1_messages(self): len_list = len(self.d1_consumer_msg_list) if len_list != self.EXPECTED_D1_MESSAGES: if self.DP: print("Messages received by verify_D1_messages:") self.prp.pprint(self.f1_consumer_msg_list) pytest.fail('F1 simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_D1_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.d1_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: pytest.fail( "The following message to D1 failed when compared with the sovereign example: %s" % msg) if self.DP: print("Messages to D1 pass verification.") def verify_D2_messages(self): len_list = len(self.d2_consumer_msg_list) if len_list != self.EXPECTED_D2_MESSAGES: if self.DP: print("Messages received by verify_D2_messages:") self.prp.pprint(self.d2_consumer_msg_list) pytest.fail('D2 simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_D2_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.d2_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: pytest.fail( "The following message to D2 failed when compared with the sovereign example: %s" % msg) if self.DP: print("Messages to D2 pass verification.") def on_pp_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) if self.DP: print("In test_ncsa - incoming on_pp_message") self.prp.pprint(body) print("\n----------------------\n\n") self.pp_consumer_msg_list.append(body) def on_d1_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) if self.DP: print("In test_ncsa - incoming on_D1_message") self.prp.pprint(body) print("\n----------------------\n\n") self.d1_consumer_msg_list.append(body) if body['MSG_TYPE'] == 'DISTRIBUTOR_HEALTH_CHECK': msg = {} msg['MSG_TYPE'] = 'DISTRIBUTOR_HEALTH_CHECK_ACK' msg['COMPONENT'] = 'DISTRIBUTOR_1' msg['ACK_BOOL'] = True msg['ACK_ID'] = body['ACK_ID'] self.d1_publisher.publish_message(body['REPLY_QUEUE'], msg) elif body['MSG_TYPE'] == 'DISTRIBUTOR_XFER_PARAMS': msg = {} msg['MSG_TYPE'] = 'DISTRIBUTOR_XFER_PARAMS_ACK' msg['COMPONENT'] = 'DISTRIBUTOR_1' msg['ACK_BOOL'] = True msg['ACK_ID'] = body['ACK_ID'] self.d1_publisher.publish_message(body['REPLY_QUEUE'], msg) elif body['MSG_TYPE'] == 'DISTRIBUTOR_READOUT': # Find message in message list for xfer_params xfer_msg = None for msg in self.d1_consumer_msg_list: if msg['MSG_TYPE'] == 'DISTRIBUTOR_XFER_PARAMS': xfer_msg = msg break if xfer_msg == None: pytest.fail( "The DISTRIBUTOR_XFER_PARAMS message was not received before DISTRIBUTOE_READOUT in D1" ) # use message to build response msg = {} msg['MSG_TYPE'] = 'DISTRIBUTOR_READOUT_ACK' msg['COMPONENT'] = 'DISTRIBUTOR_1' msg['JOB_NUM'] = xfer_msg['JOB_NUM'] msg['IMAGE_ID'] = xfer_msg['IMAGE_ID'] msg['ACK_ID'] = body['ACK_ID'] msg['ACK_BOOL'] = True msg['RESULT_LIST'] = {} msg['RESULT_LIST']['CCD_LIST'] = [] msg['RESULT_LIST']['RECEIPT_LIST'] = [] ccd_list = xfer_msg['XFER_PARAMS']['CCD_LIST'] receipt_list = [] for i in range(0, len(ccd_list)): receipt_list.append('F1_Rec_x477_' + str(i)) msg['RESULT_LIST']['RECEIPT_LIST'] = receipt_list msg['RESULT_LIST']['CCD_LIST'] = list(ccd_list) self.d1_publisher.publish_message(body['REPLY_QUEUE'], msg) else: pytest.fail( "The following unknown message was received by D1: %s" % body) def on_d2_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) if self.DP: print("In test_ncsa - incoming on_D2_message") self.prp.pprint(body) print("\n----------------------\n\n") self.d2_consumer_msg_list.append(body) if body['MSG_TYPE'] == 'DISTRIBUTOR_HEALTH_CHECK': msg = {} msg['MSG_TYPE'] = 'DISTRIBUTOR_HEALTH_CHECK_ACK' msg['COMPONENT'] = 'DISTRIBUTOR_2' msg['ACK_BOOL'] = True msg['ACK_ID'] = body['ACK_ID'] self.d2_publisher.publish_message(body['REPLY_QUEUE'], msg) elif body['MSG_TYPE'] == 'DISTRIBUTOR_XFER_PARAMS': msg = {} msg['MSG_TYPE'] = 'DISTRIBUTOR_XFER_PARAMS_ACK' msg['COMPONENT'] = 'DISTRIBUTOR_2' msg['ACK_BOOL'] = True msg['ACK_ID'] = body['ACK_ID'] self.d2_publisher.publish_message(body['REPLY_QUEUE'], msg) elif body['MSG_TYPE'] == 'DISTRIBUTOR_READOUT': # Find message in message list for xfer_params xfer_msg = None for msg in self.d2_consumer_msg_list: if msg['MSG_TYPE'] == 'DISTRIBUTOR_XFER_PARAMS': xfer_msg = msg break if xfer_msg == None: pytest.fail( "The DISTRIBUTOR_XFER_PARAMS message was not received before DISTRIBUTOR_READOUT in D2" ) # use message to build response msg = {} msg['MSG_TYPE'] = 'DISTRIBUTOR_READOUT_ACK' msg['COMPONENT'] = 'DISTRIBUTOR_2' msg['JOB_NUM'] = xfer_msg['JOB_NUM'] msg['IMAGE_ID'] = xfer_msg['IMAGE_ID'] msg['ACK_ID'] = body['ACK_ID'] msg['ACK_BOOL'] = True msg['RESULT_LIST'] = {} msg['RESULT_LIST']['CCD_LIST'] = [] msg['RESULT_LIST']['RECEIPT_LIST'] = [] ccd_list = xfer_msg['XFER_PARAMS']['CCD_LIST'] receipt_list = [] for i in range(0, len(ccd_list)): receipt_list.append('F2_Rec_x447_' + str(i)) msg['RESULT_LIST']['RECEIPT_LIST'] = receipt_list msg['RESULT_LIST']['CCD_LIST'] = list(ccd_list) self.d2_publisher.publish_message(body['REPLY_QUEUE'], msg) else: pytest.fail( "The following unknown message was received by D2: %s" % body)
class TestArDev: dmcs_pub_broker_url = None dmcs_publisher = None dmcs_consumer = None dmcs_consumer_msg_list = [] ar_ctrl_pub_broker_url = None ar_ctrl_publisher = None ar_ctrl_consumer = None ar_ctrl_consumer_msg_list = [] F1_pub_broker_url = None F1_publisher = None F1_consumer = None f1_consumer_msg_list = [] F2_pub_broker_url = None F2_publisher = None F2_consumer = None f2_consumer_msg_list = [] EXPECTED_AR_CTRL_MESSAGES = 1 EXPECTED_DMCS_MESSAGES = 1 EXPECTED_F1_MESSAGES = 1 EXPECTED_F2_MESSAGES = 1 NUM_READOUTS = 0 ccd_list = [14,17,21.86] prp = toolsmod.prp DP = toolsmod.DP # Debug Printing either True or False...override for this file only... def test_ardev(self, Ardev): self.ardev = Ardev try: cdm = toolsmod.intake_yaml_file('tests/yaml/L1SystemCfg_Test_ar.yaml') except IOError as e: trace = traceback.print_exc() emsg = "Unable to find CFG Yaml file %s\n" % self._config_file print(emsg + trace) raise raft_dict = cdm[ROOT]['DEFAULT_RAFT_CONFIGURATION'] broker_addr = cdm[ROOT]['BASE_BROKER_ADDR'] dmcs_name = cdm[ROOT]['DMCS_BROKER_NAME'] dmcs_passwd = cdm[ROOT]['DMCS_BROKER_PASSWD'] dmcs_pub_name = cdm[ROOT]['DMCS_BROKER_PUB_NAME'] dmcs_pub_passwd = cdm[ROOT]['DMCS_BROKER_PUB_PASSWD'] dmcs_broker_url = "amqp://" + dmcs_name + ":" + \ dmcs_passwd + "@" + \ broker_addr dmcs_pub_broker_url = "amqp://" + dmcs_pub_name + ":" + \ dmcs_pub_passwd + "@" + \ broker_addr print("Opening publisher with this URL string: %s" % dmcs_pub_broker_url) self.dmcs_publisher = SimplePublisher(dmcs_pub_broker_url, "YAML") ar_ctrl_name = cdm[ROOT]['ARCHIVE_BROKER_NAME'] ar_ctrl_passwd = cdm[ROOT]['ARCHIVE_BROKER_PASSWD'] ar_ctrl_pub_name = cdm[ROOT]['ARCHIVE_BROKER_PUB_NAME'] ar_ctrl_pub_passwd = cdm[ROOT]['ARCHIVE_BROKER_PUB_PASSWD'] ar_ctrl_broker_url = "amqp://" + ar_ctrl_name + ":" + \ ar_ctrl_passwd + "@" + \ broker_addr ar_ctrl_pub_broker_url = "amqp://" + ar_ctrl_pub_name + ":" + \ ar_ctrl_pub_passwd + "@" + \ broker_addr print("Opening publisher with this URL string: %s" % ar_ctrl_pub_broker_url) self.ar_ctrl_publisher = SimplePublisher(ar_ctrl_pub_broker_url, "YAML") F1_name = 'F1' F1_passwd = 'F1' F1_pub_name = 'F1_PUB' F1_pub_passwd = 'F1_PUB' F1_broker_url = "amqp://" + F1_name + ":" + \ F1_passwd + "@" + \ broker_addr F1_pub_broker_url = "amqp://" + F1_pub_name + ":" + \ F1_pub_passwd + "@" + \ broker_addr print("Opening publisher with this URL string: %s" % F1_pub_broker_url) self.F1_publisher = SimplePublisher(F1_pub_broker_url, "YAML") F2_name = 'F2' F2_passwd = 'F2' F2_pub_name = 'F2_PUB' F2_pub_passwd = 'F2_PUB' F2_broker_url = "amqp://" + F2_name + ":" + \ F2_passwd + "@" + \ broker_addr F2_pub_broker_url = "amqp://" + F2_pub_name + ":" + \ F2_pub_passwd + "@" + \ broker_addr print("Opening publisher with this URL string: %s" % F2_pub_broker_url) self.F2_publisher = SimplePublisher(F2_pub_broker_url, "YAML") print("All publishers are running...") # Must be done before consumer threads are started # This is used for verifying message structure self._msg_auth = MessageAuthority() print("MessageAuthority running...") self.dmcs_consumer = Consumer(dmcs_broker_url,'dmcs_ack_consume', 'thread-dmcs', self.on_dmcs_message,'YAML') self.dmcs_consumer.start() print("DMCS Consumer running...") self.ar_ctrl_consumer = Consumer(ar_ctrl_broker_url,'archive_ctrl_consume', 'thread-ar-ctrl', self.on_ar_ctrl_message,'YAML') self.ar_ctrl_consumer.start() print("ar_ctrl Consumer running...") self.F1_consumer = Consumer(F1_broker_url,'f1_consume', 'thread-f1', self.on_f1_message,'YAML') self.F1_consumer.start() print("F1 Consumer running...") self.F2_consumer = Consumer(F2_broker_url,'f2_consume', 'thread-f2', self.on_f2_message,'YAML') self.F2_consumer.start() print("F2 Consumer running...") sleep(3) print("Test Setup Complete. Commencing Messages...") self.send_messages() sleep(8) self.verify_dmcs_messages() self.verify_ar_ctrl_messages() self.verify_F1_messages() self.verify_F2_messages() sleep(3) # Shut down consumer threads nicely self.dmcs_consumer.stop() self.dmcs_consumer.join() self.ar_ctrl_consumer.stop() self.ar_ctrl_consumer.join() self.F1_consumer.stop() self.F1_consumer.join() self.F2_consumer.stop() self.F2_consumer.join() if self.DP: print("Finished with AR tests.") def send_messages(self): print("Starting send_messages") # Tests only an AR device self.EXPECTED_AR_CTRL_MESSAGES = 2 self.EXPECTED_DMCS_MESSAGES = 2 self.EXPECTED_F1_MESSAGES = 3 self.EXPECTED_F2_MESSAGES = 3 msg = {} msg['MSG_TYPE'] = "AR_NEW_SESSION" msg['SESSION_ID'] = 'SI_469976' msg['ACK_ID'] = 'NEW_SESSION_ACK_44221' msg['REPLY_QUEUE'] = 'dmcs_ack_consume' time.sleep(2) print("New Session Message") self.dmcs_publisher.publish_message("ar_foreman_consume", msg) msg = {} msg['MSG_TYPE'] = "AR_NEXT_VISIT" msg['VISIT_ID'] = 'XX_28272' msg['JOB_NUM'] = '4xx72' msg['SESSION_ID'] = 'SI_469976' msg['REPLY_QUEUE'] = 'dmcs_ack_consume' msg['ACK_ID'] = 'NEW_VISIT_ACK_76' msg['RA'] = "231.221" msg['DEC'] = "-45.34" msg['ANGLE'] = "120.0" msg['RAFT_LIST'] = ['10','32','41','42','43'] msg['RAFT_CCD_LIST'] = [['ALL'],['02','11','12'],['00','02'],['02','12','11','22','00'],['ALL']] time.sleep(2) print("Next Visit Message") self.dmcs_publisher.publish_message("ar_foreman_consume", msg) msg = {} msg['MSG_TYPE'] = "AR_TAKE_IMAGES" msg['JOB_NUM'] = '4xx72' msg['NUM_IMAGES'] = '4' msg['REPLY_QUEUE'] = 'dmcs_ack_consume' msg['ACK_ID'] = 'ACK_44221' time.sleep(2) print("AR Take Images Message") self.dmcs_publisher.publish_message("ar_foreman_consume", msg) msg = {} msg['MSG_TYPE'] = "AR_END_READOUT" msg['JOB_NUM'] = '4xx72' msg['IMAGE_ID'] = 'IMG_444245' msg['REPLY_QUEUE'] = 'dmcs_ack_consume' msg['ACK_ID'] = 'AR_ACK_94671' time.sleep(2) print("AR END READOUT Message") self.dmcs_publisher.publish_message("ar_foreman_consume", msg) msg = {} msg['MSG_TYPE'] = "AR_END_READOUT" msg['JOB_NUM'] = '4xx72' msg['IMAGE_ID'] = 'IMG_444246' msg['REPLY_QUEUE'] = 'dmcs_ack_consume' msg['ACK_ID'] = 'AR_ACK_94673' time.sleep(2) print("AR END READOUT Message") self.dmcs_publisher.publish_message("ar_foreman_consume", msg) msg = {} msg['MSG_TYPE'] = "AR_END_READOUT" msg['JOB_NUM'] = '4xx72' msg['IMAGE_ID'] = 'IMG_444247' msg['REPLY_QUEUE'] = 'dmcs_ack_consume' msg['ACK_ID'] = 'AR_ACK_94676' time.sleep(2) print("AR END READOUT Message") self.dmcs_publisher.publish_message("ar_foreman_consume", msg) msg = {} msg['MSG_TYPE'] = "AR_END_READOUT" msg['JOB_NUM'] = '4xx72' msg['IMAGE_ID'] = 'IMG_444248' msg['REPLY_QUEUE'] = 'dmcs_ack_consume' msg['ACK_ID'] = 'AR_ACK_94677' time.sleep(2) print("AR END READOUT Message") self.dmcs_publisher.publish_message("ar_foreman_consume", msg) msg = {} msg['MSG_TYPE'] = "AR_TAKE_IMAGES_DONE" msg['JOB_NUM'] = '4xx72' msg['REPLY_QUEUE'] = 'dmcs_ack_consume' msg['ACK_ID'] = 'ACK_44221' time.sleep(2) print("AR Take Images Done Message") self.dmcs_publisher.publish_message("ar_foreman_consume", msg) time.sleep(9) print("Message Sender done") def verify_dmcs_messages(self): len_list = len(self.dmcs_consumer_msg_list) print("DMCS RECEIVED %s MESSAGES" % len_list) if len_list != self.EXPECTED_DMCS_MESSAGES: print("Incorrect number of DMCS messages received") pytest.fail('DMCS simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_DMCS_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.dmcs_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: print("This DMCS message failed verification: ") self.prp.pprint(msg) pytest.fail("The following DMCS Bridge response message failed when compared with the sovereign example: %s" % msg) print("Responses to DMCS Bridge pass verification.") def verify_ar_ctrl_messages(self): len_list = len(self.ar_ctrl_consumer_msg_list) print("AR_CTRL RECEIVED %s MESSAGES" % len_list) if len_list != self.EXPECTED_AR_CTRL_MESSAGES: print("Incorrect number of AR_CTRL messages received") pytest.fail('AR CTRL simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_AR_CTRL_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.ar_ctrl_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: print("This AR_CTRL message failed verification: ") self.prp.pprint(msg) pytest.fail("The following message to the AR CTRL failed when compared with the sovereign example: %s" % msg) print("Messages to the AR CTRL pass verification.") def verify_F1_messages(self): len_list = len(self.f1_consumer_msg_list) print("F1 RECEIVED %s MESSAGES" % len_list) if len_list != self.EXPECTED_F1_MESSAGES: print("Incorrect number of F1 messages received") pytest.fail('F1 simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_F1_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.f1_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: print("This F1 message failed verification: ") self.prp.pprint(msg) pytest.fail("The following message to F1 failed when compared with the sovereign example: %s" % msg) print("Messages to F1 pass verification.") def verify_F2_messages(self): len_list = len(self.f2_consumer_msg_list) print("F2 RECEIVED %s MESSAGES" % len_list) if len_list != self.EXPECTED_F2_MESSAGES: print("Incorrect number of F2 messages received") pytest.fail('F2 simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_F2_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.f2_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: print("This F2 message failed verification: ") self.prp.pprint(msg) pytest.fail("The following message to F2 failed when compared with the sovereign example: %s" % msg) print("Messages to F2 pass verification.") def on_dmcs_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) self.dmcs_consumer_msg_list.append(body) def on_ar_ctrl_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) self.ar_ctrl_consumer_msg_list.append(body) if body['MSG_TYPE'] == 'NEW_ARCHIVE_ITEM': msg = {} msg['MSG_TYPE'] = 'NEW_ARCHIVE_ITEM_ACK' msg['COMPONENT'] = 'ARCHIVE_CTRL' msg['ACK_ID'] = body['ACK_ID'] msg['ACK_BOOL'] = True msg['TARGET_LOCATION'] = '/tmp' self.ar_ctrl_publisher.publish_message(body['REPLY_QUEUE'], msg) elif body['MSG_TYPE'] == 'AR_ITEMS_XFERD': msg = {} msg['MSG_TYPE'] = 'AR_ITEMS_XFERD_ACK' msg['COMPONENT'] = 'ARCHIVE_CTRL' msg['ACK_ID'] = body['ACK_ID'] msg['ACK_BOOL'] = True filename_list = body['RESULT_SET']['FILENAME_LIST'] msg['RESULT_SET'] = {} msg['RESULT_SET']['IMAGE_ID_LIST'] = body['RESULT_SET']['IMAGE_ID_LIST'] msg['RESULT_SET']['RECEIPT_LIST'] = [] msg['RESULT_SET']['FILENAME_LIST'] = filename_list RECEIPT_LIST = [] for filename in filename_list: RECEIPT_LIST.append('x14_' + str(filename)) msg['RESULT_LIST']['RECEIPT_LIST'] = RECEIPT_LIST self.ar_ctrl_publisher.publish_message(body['REPLY_QUEUE'], msg) else: pytest.fail("The following unknown message was received by the Archive CTRL: %s" % body) def on_f1_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) self.f1_consumer_msg_list.append(body) if body['MSG_TYPE'] == 'AR_FWDR_HEALTH_CHECK': msg = {} msg['MSG_TYPE'] = 'AR_FWDR_HEALTH_CHECK_ACK' msg['COMPONENT'] = 'FORWARDER_1' msg['ACK_BOOL'] = True msg['ACK_ID'] = body['ACK_ID'] self.F1_publisher.publish_message(body['REPLY_QUEUE'], msg) elif body['MSG_TYPE'] == 'AR_FWDR_XFER_PARAMS': msg = {} msg['MSG_TYPE'] = 'AR_FWDR_XFER_PARAMS_ACK' msg['COMPONENT'] = 'FORWARDER_1' msg['ACK_BOOL'] = True msg['ACK_ID'] = body['ACK_ID'] self.F1_publisher.publish_message(body['REPLY_QUEUE'], msg) elif body['MSG_TYPE'] == 'AR_FWDR_TAKE_IMAGES': # This message handler is not necessary as it does nothing # But it is explanatory in nature for understanding/maintaining the file. # # No ack necessary - but NUM_IMAGES param will be # needed in AR_FWDR_TAKE_IMAGES_DONE message handler below pass elif body['MSG_TYPE'] == 'AR_FWDR_END_READOUT': self.NUM_READOUTS = self.NUM_READOUTS + 1 elif body['MSG_TYPE'] == 'AR_FWDR_TAKE_IMAGES_DONE': # Find message in message list for xfer_params xfer_msg = None image_id_list = [] num_images = 0 for msg in self.f1_consumer_msg_list: if msg['MSG_TYPE'] == 'AR_FWDR_END_READOUT': image_id_list.append(msg['IMAGE_ID']) if msg['MSG_TYPE'] == 'AR_FWDR_XFER_PARAMS': xfer_msg = msg if msg['MSG_TYPE'] == 'AR_FWDR_TAKE_IMAGES': num_images = int(msg['NUM_IMAGES']) if xfer_msg == None: pytest.fail("The AR_FWDR_XFER_PARAMS message was not received before AR_FWDR_READOUT in F1") # use message to build response msg = {} msg['MSG_TYPE'] = 'AR_FWDR_TAKE_IMAGES_DONE_ACK' msg['COMPONENT'] = 'FORWARDER_1' msg['JOB_NUM'] = xfer_msg['JOB_NUM'] msg['ACK_ID'] = body['ACK_ID'] raft_list = xfer_msg['XFER_PARAMS']['RAFT_LIST'] raft_ccd_list = xfer_msg['XFER_PARAMS']['RAFT_CCD_LIST'] msg['RESULT_SET'] = {} msg['RESULT_SET']['RAFT_LIST'] = raft_list msg['RESULT_SET']['RAFT_CCD_LIST'] = raft_ccd_list msg['RESULT_SET']['RAFT_PLUS_CCD_LIST'] = [] msg['RESULT_SET']['FILENAME_LIST'] = [] msg['RESULT_SET']['CHECKSUM_LIST'] = [] RAFT_PLUS_CCD_LIST = [] FILENAME_LIST = [] CHECKSUM_LIST = [] target_location = xfer_msg['TARGET_LOCATION'] raft_plus_ccd_list = self.convert_raft_and_ccd_list_to_name_list(raft_list, raft_ccd_list) for ccd in raft_plus_ccd_list: RAFT_PLUS_CCD_LIST.append(ccd) ### XXX ADD IMAGE_ID from IMAGE_ID_LIST to target_dir and ccd name FILENAME_LIST.append(target_location + "/" + str(ccd)) CHECKSUM_LIST.append('XXXXFFFF4444$$$$') msg['RESULT_SET']['RAFT_PLUS_CCD_LIST'] = RAFT_PLUS_CCD_LIST msg['RESULT_SET']['FILENAME_LIST'] = FILENAME_LIST msg['RESULT_SET']['CHECKSUM_LIST'] = CHECKSUM_LIST if num_images == self.NUM_READOUTS: msg['ACK_BOOL'] = True else: msg['ACK_BOOL'] = False self.F1_publisher.publish_message(body['REPLY_QUEUE'], msg) else: pytest.fail("The following unknown message was received by FWDR F1: %s" % body) def on_f2_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) self.f2_consumer_msg_list.append(body) if body['MSG_TYPE'] == 'AR_FWDR_HEALTH_CHECK': msg = {} msg['MSG_TYPE'] = 'AR_FWDR_HEALTH_CHECK_ACK' msg['COMPONENT'] = 'FORWARDER_2' msg['ACK_BOOL'] = True msg['ACK_ID'] = body['ACK_ID'] self.F2_publisher.publish_message(body['REPLY_QUEUE'], msg) elif body['MSG_TYPE'] == 'AR_FWDR_XFER_PARAMS': msg = {} msg['MSG_TYPE'] = 'AR_FWDR_XFER_PARAMS_ACK' msg['COMPONENT'] = 'FORWARDER_2' msg['ACK_BOOL'] = True msg['ACK_ID'] = body['ACK_ID'] self.F2_publisher.publish_message(body['REPLY_QUEUE'], msg) elif body['MSG_TYPE'] == 'AR_FWDR_TAKE_IMAGES': # This message handler is not necessary as it does nothing # But it is explanatory in nature for understanding/maintaining the file. # # No ack necessary - but NUM_IMAGES param will be # needed in AR_FWDR_TAKE_IMAGES_DONE message handler below pass elif body['MSG_TYPE'] == 'AR_FWDR_END_READOUT': pass elif body['MSG_TYPE'] == 'AR_FWDR_TAKE_IMAGES_DONE': # Find message in message list for xfer_params xfer_msg = None image_id_list = [] num_images = 0; for msg in self.f2_consumer_msg_list: if msg['MSG_TYPE'] == 'AR_FWDR_END_READOUT': image_id_list.append(msg['IMAGE_ID']) if msg['MSG_TYPE'] == 'AR_FWDR_XFER_PARAMS': xfer_msg = msg if msg['MSG_TYPE'] == 'AR_FWDR_TAKE_IMAGES': num_images = msg['NUM_IMAGES'] if xfer_msg == None: pytest.fail("The AR_FWDR_XFER_PARAMS message was not received before AR_FWDR_READOUT in F1") # use message to build response msg = {} msg['MSG_TYPE'] = 'AR_FWDR_TAKE_IMAGES_DONE_ACK' msg['COMPONENT'] = 'FORWARDER_2' msg['JOB_NUM'] = xfer_msg['JOB_NUM'] msg['ACK_ID'] = body['ACK_ID'] msg['ACK_BOOL'] = True raft_list = xfer_msg['XFER_PARAMS']['RAFT_LIST'] raft_ccd_list = xfer_msg['XFER_PARAMS']['RAFT_CCD_LIST'] msg['RESULT_SET'] = {} msg['RESULT_SET']['RAFT_LIST'] = raft_list msg['RESULT_SET']['RAFT_CCD_LIST'] = raft_ccd_list msg['RESULT_SET']['RAFT_PLUS_CCD_LIST'] = [] msg['RESULT_SET']['FILENAME_LIST'] = [] msg['RESULT_SET']['CHECKSUM_LIST'] = [] RAFT_PLUS_CCD_LIST = [] FILENAME_LIST = [] CHECKSUM_LIST = [] target_location = xfer_msg['TARGET_LOCATION'] raft_plus_ccd_list = self.convert_raft_and_ccd_list_to_name_list(raft_list, raft_ccd_list) for ccd in raft_plus_ccd_list: RAFT_PLUS_CCD_LIST.append(ccd) ### XXX ADD IMAGE_ID from IMAGE_ID_LIST to target_location and ccd name FILENAME_LIST.append(target_location + "/" + str(ccd)) CHECKSUM_LIST.append('XXXXFFFF4444$$$$') msg['RESULT_SET']['RAFT_PLUS_CCD_LIST'] = RAFT_PLUS_CCD_LIST msg['RESULT_SET']['FILENAME_LIST'] = FILENAME_LIST msg['RESULT_SET']['CHECKSUM_LIST'] = CHECKSUM_LIST self.F2_publisher.publish_message(body['REPLY_QUEUE'], msg) else: pytest.fail("The following unknown message was received by FWDR F2: %s" % body) def convert_raftdict_to_name_list(self, rdict): raft_list = list(rdict.keys()) num_rafts = len(raft_list) integrated_names_list = [] for i in range(0,num_rafts): current_raft = raft_list[i] ccd_list = [] ccd_list = rdict[current_raft] if ccd_list[0] == 'ALL': ccd_list = ['00','10','20','01','11','21','02','12','22'] num_current_ccds = len(ccd_list) for j in range(0,num_current_ccds): tmp_str = current_raft + '-' + ccd_list[j] integrated_names_list.append(tmp_str) return integrated_names_list def convert_raft_and_ccd_list_to_name_list(self, raft_list, raft_ccd_list): #raft_list = list(rdict.keys()) num_rafts = len(raft_list) integrated_names_list = [] for i in range(0,num_rafts): current_raft = raft_list[i] ccd_list = [] ccd_list = raft_ccd_list[i] if ccd_list[0] == 'ALL': ccd_list = ['00','10','20','01','11','21','02','12','22'] num_current_ccds = len(ccd_list) for j in range(0,num_current_ccds): tmp_str = current_raft + '-' + ccd_list[j] integrated_names_list.append(tmp_str) return integrated_names_list
class TestNcsa: pp_pub_broker_url = None pp_publisher = None pp_consumer = None pp_consumer_msg_list = [] D1_pub_broker_url = None D1_publisher = None D1_consumer = None d1_consumer_msg_list = [] D2_pub_broker_url = None D2_publisher = None D2_consumer = None d2_consumer_msg_list = [] EXPECTED_PP_MESSAGES = 1 EXPECTED_D1_MESSAGES = 1 EXPECTED_D2_MESSAGES = 1 ccd_list = [14,17,21,86] prp = toolsmod.prp DP = toolsmod.DP def test_ncsa(self, Ncsa): self.ncsa = Ncsa try: cdm = toolsmod.intake_yaml_file('./tests/yaml/L1SystemCfg_Test_ncsa.yaml') except IOError as e: trace = traceback.print_exc() emsg = "Unable to find CFG Yaml file %s\n" % self._config_file print(emsg + trace) sys.exit(101) broker_addr = cdm[ROOT]['BASE_BROKER_ADDR'] pp_name = cdm[ROOT]['PFM_BROKER_NAME'] pp_passwd = cdm[ROOT]['PFM_BROKER_PASSWD'] pp_pub_name = cdm[ROOT]['PFM_BROKER_PUB_NAME'] pp_pub_passwd = cdm[ROOT]['PFM_BROKER_PUB_PASSWD'] pp_broker_url = "amqp://" + pp_name + ":" + \ pp_passwd + "@" + \ broker_addr pp_pub_broker_url = "amqp://" + pp_pub_name + ":" + \ pp_pub_passwd + "@" + \ broker_addr self.pp_publisher = SimplePublisher(pp_pub_broker_url, "YAML") D1_name = 'D1' D1_passwd = 'D1' D1_pub_name = 'D1_PUB' D1_pub_passwd = 'D1_PUB' D1_broker_url = "amqp://" + D1_name + ":" + \ D1_passwd + "@" + \ broker_addr D1_pub_broker_url = "amqp://" + D1_pub_name + ":" + \ D1_pub_passwd + "@" + \ broker_addr self.d1_publisher = SimplePublisher(D1_pub_broker_url, "YAML") D2_name = 'D2' D2_passwd = 'D2' D2_pub_name = 'D2_PUB' D2_pub_passwd = 'D2_PUB' D2_broker_url = "amqp://" + D2_name + ":" + \ D2_passwd + "@" + \ broker_addr D2_pub_broker_url = "amqp://" + D2_pub_name + ":" + \ D2_pub_passwd + "@" + \ broker_addr self.d2_publisher = SimplePublisher(D2_pub_broker_url, "YAML") # Must be done before consumer threads are started # This is used for verifying message structure self._msg_auth = MessageAuthority() self.pp_consumer = Consumer(pp_broker_url,'pp_foreman_ack_publish', 'thread-pp', self.on_pp_message,'YAML') self.pp_consumer.start() self.D1_consumer = Consumer(D1_broker_url,'d1_consume', 'thread-d1', self.on_d1_message,'YAML') self.D1_consumer.start() self.D2_consumer = Consumer(D2_broker_url,'d2_consume', 'thread-d2', self.on_d2_message,'YAML') self.D2_consumer.start() sleep(3) print("Test Setup Complete. Commencing Messages...") self.send_messages() sleep(7) self.verify_pp_messages() self.verify_D2_messages() self.verify_D1_messages() sleep(2) self.pp_consumer.stop() self.pp_consumer.join() self.D1_consumer.stop() self.D1_consumer.join() self.D2_consumer.stop() self.D2_consumer.join() if self.DP: print("Finished with NCSA tests.") def send_messages(self): print("Starting send_messages") # Tests only an AR device # self.clear_message_lists() self.EXPECTED_PP_MESSAGES = 4 self.EXPECTED_D1_MESSAGES = 3 self.EXPECTED_D2_MESSAGES = 3 msg = {} msg['MSG_TYPE'] = "NCSA_NEW_SESSION" msg['SESSION_ID'] = 'SI_469976' msg['ACK_ID'] = 'NCSA_NEW_SESSION_ACK_44221' msg['REPLY_QUEUE'] = 'pp_foreman_ack_publish' time.sleep(1) if self.DP: print("New Session Message") self.pp_publisher.publish_message("ncsa_consume", msg) msg = {} msg['MSG_TYPE'] = "NCSA_NEXT_VISIT" msg['VISIT_ID'] = 'XX_28272' msg['SESSION_ID'] = 'NNV_469976' msg['REPLY_QUEUE'] = 'pp_foreman_ack_publish' msg['ACK_ID'] = 'NCSA_NEW_VISIT_ACK_76' msg['BORE_SIGHT'] = "231,123786456342, -45.3457156906, FK5" time.sleep(1) if self.DP: print("Next Visit Message") self.pp_publisher.publish_message("ncsa_consume", msg) msg = {} msg['MSG_TYPE'] = "NCSA_START_INTEGRATION" msg['JOB_NUM'] = '4xx72' msg['IMAGE_ID'] = 'IMG_444244' msg['VISIT_ID'] = 'V14494' msg['SESSION_ID'] = '4_14_7211511' msg['REPLY_QUEUE'] = 'pp_foreman_ack_publish' msg['ACK_ID'] = 'PP_ACK_94671' msg['CCD_LIST'] = [4,14,16,17,29,35,36] time.sleep(2) msg['FORWARDERS'] = {} forwarder_list = ['FORWARDER_2', 'FORWARDER_1'] ccd_list = [[17,18,111,126],[128,131,132]] msg['FORWARDERS']['FORWARDER_LIST'] = forwarder_list msg['FORWARDERS']['CCD_LIST'] = ccd_list if self.DP: print("NCSA START INTEGRATION Message") self.pp_publisher.publish_message("ncsa_consume", msg) time.sleep(7) msg = {} msg['MSG_TYPE'] = "NCSA_READOUT" msg['JOB_NUM'] = '4xx72' msg['IMAGE_ID'] = 'IMG_444244' msg['VISIT_ID'] = 'V14494' msg['SESSION_ID'] = '4_14_7211511' msg['REPLY_QUEUE'] = 'pp_foreman_ack_publish' msg['ACK_ID'] = 'NCSA_READOUT_ACK_44221' time.sleep(2) if self.DP: print("NCSA READOUT Message") self.pp_publisher.publish_message("ncsa_consume", msg) time.sleep(2) print("Message Sender done") def verify_pp_messages(self): len_list = len(self.pp_consumer_msg_list) if len_list != self.EXPECTED_PP_MESSAGES: pytest.fail('PP simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_PP_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.pp_consumer_msg_list[i] if msg['MSG_TYPE'] == 'NCSA_START_INTEGRATION_ACK': result = self.check_start_int_ack(msg) else: result = self._msg_auth.check_message_shape(msg) if result == False: pytest.fail("The following message to the PP Foreman failed when compared with the sovereign example: %s" % msg) if self.DP: print("Messages to the PP Foreman pass verification.") def check_start_int_ack(self, msg): """the PAIRS param in the message is a list. Every item in the list is a dictionary. because it is not known how many entried will be on the list, the dictionaries are deepcopied and checked against the MessageAuthority and check one at a time. In the meanwhile, the shape of the incoming message without the dictionaries and the PAIRS list set to None is checked against the MessageAuthority. BTW, because the individual dictionaries do not have a MSG_TYPE, one is added to each dictionary to be checked so the dict to compare to can be located in the messages.yaml file. """ c_msg = deepcopy(msg) pairs = deepcopy(c_msg['PAIRS']) c_msg['PAIRS'] = None overall_shape = self._msg_auth.check_message_shape(c_msg) if overall_shape == False: return False for i in range (0, len(pairs)): pairs[i]['MSG_TYPE'] = 'PAIR' result = self._msg_auth.check_message_shape(pairs[i]) if result == False: return False return True def verify_D1_messages(self): len_list = len(self.d1_consumer_msg_list) if len_list != self.EXPECTED_D1_MESSAGES: if self.DP: print("Messages received by verify_D1_messages:") self.prp.pprint(self.f1_consumer_msg_list) pytest.fail('F1 simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_D1_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.d1_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: pytest.fail("The following message to D1 failed when compared with the sovereign example: %s" % msg) if self.DP: print("Messages to D1 pass verification.") def verify_D2_messages(self): len_list = len(self.d2_consumer_msg_list) if len_list != self.EXPECTED_D2_MESSAGES: if self.DP: print("Messages received by verify_D2_messages:") self.prp.pprint(self.d2_consumer_msg_list) pytest.fail('D2 simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_D2_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.d2_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: pytest.fail("The following message to D2 failed when compared with the sovereign example: %s" % msg) if self.DP: print("Messages to D2 pass verification.") def on_pp_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) if self.DP: print("In test_ncsa - incoming on_pp_message") self.prp.pprint(body) print("\n----------------------\n\n") self.pp_consumer_msg_list.append(body) def on_d1_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) if self.DP: print("In test_ncsa - incoming on_D1_message") self.prp.pprint(body) print("\n----------------------\n\n") self.d1_consumer_msg_list.append(body) if body['MSG_TYPE'] == 'DISTRIBUTOR_HEALTH_CHECK': msg = {} msg['MSG_TYPE'] = 'DISTRIBUTOR_HEALTH_CHECK_ACK' msg['COMPONENT'] = 'DISTRIBUTOR_1' msg['ACK_BOOL'] = True msg['ACK_ID'] = body['ACK_ID'] self.d1_publisher.publish_message(body['REPLY_QUEUE'], msg) elif body['MSG_TYPE'] == 'DISTRIBUTOR_XFER_PARAMS': msg = {} msg['MSG_TYPE'] = 'DISTRIBUTOR_XFER_PARAMS_ACK' msg['COMPONENT'] = 'DISTRIBUTOR_1' msg['ACK_BOOL'] = True msg['ACK_ID'] = body['ACK_ID'] self.d1_publisher.publish_message(body['REPLY_QUEUE'], msg) elif body['MSG_TYPE'] == 'DISTRIBUTOR_READOUT': # Find message in message list for xfer_params xfer_msg = None for msg in self.d1_consumer_msg_list: if msg['MSG_TYPE'] == 'DISTRIBUTOR_XFER_PARAMS': xfer_msg = msg break if xfer_msg == None: pytest.fail("The DISTRIBUTOR_XFER_PARAMS message was not received before DISTRIBUTOE_READOUT in D1") # use message to build response msg = {} msg['MSG_TYPE'] = 'DISTRIBUTOR_READOUT_ACK' msg['COMPONENT'] = 'DISTRIBUTOR_1' msg['JOB_NUM'] = xfer_msg['JOB_NUM'] msg['IMAGE_ID'] = xfer_msg['IMAGE_ID'] msg['ACK_ID'] = body['ACK_ID'] msg['ACK_BOOL'] = True msg['RESULT_LIST'] = {} msg['RESULT_LIST']['CCD_LIST'] = [] msg['RESULT_LIST']['RECEIPT_LIST'] = [] ccd_list = xfer_msg['XFER_PARAMS']['CCD_LIST'] receipt_list = [] for i in range(0, len(ccd_list)): receipt_list.append('F1_Rec_x477_' + str(i)) msg['RESULT_LIST']['RECEIPT_LIST'] = receipt_list msg['RESULT_LIST']['CCD_LIST'] = list(ccd_list) self.d1_publisher.publish_message(body['REPLY_QUEUE'], msg) else: pytest.fail("The following unknown message was received by D1: %s" % body) def on_d2_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) if self.DP: print("In test_ncsa - incoming on_D2_message") self.prp.pprint(body) print("\n----------------------\n\n") self.d2_consumer_msg_list.append(body) if body['MSG_TYPE'] == 'DISTRIBUTOR_HEALTH_CHECK': msg = {} msg['MSG_TYPE'] = 'DISTRIBUTOR_HEALTH_CHECK_ACK' msg['COMPONENT'] = 'DISTRIBUTOR_2' msg['ACK_BOOL'] = True msg['ACK_ID'] = body['ACK_ID'] self.d2_publisher.publish_message(body['REPLY_QUEUE'], msg) elif body['MSG_TYPE'] == 'DISTRIBUTOR_XFER_PARAMS': msg = {} msg['MSG_TYPE'] = 'DISTRIBUTOR_XFER_PARAMS_ACK' msg['COMPONENT'] = 'DISTRIBUTOR_2' msg['ACK_BOOL'] = True msg['ACK_ID'] = body['ACK_ID'] self.d2_publisher.publish_message(body['REPLY_QUEUE'], msg) elif body['MSG_TYPE'] == 'DISTRIBUTOR_READOUT': # Find message in message list for xfer_params xfer_msg = None for msg in self.d2_consumer_msg_list: if msg['MSG_TYPE'] == 'DISTRIBUTOR_XFER_PARAMS': xfer_msg = msg break if xfer_msg == None: pytest.fail("The DISTRIBUTOR_XFER_PARAMS message was not received before DISTRIBUTOR_READOUT in D2") # use message to build response msg = {} msg['MSG_TYPE'] = 'DISTRIBUTOR_READOUT_ACK' msg['COMPONENT'] = 'DISTRIBUTOR_2' msg['JOB_NUM'] = xfer_msg['JOB_NUM'] msg['IMAGE_ID'] = xfer_msg['IMAGE_ID'] msg['ACK_ID'] = body['ACK_ID'] msg['ACK_BOOL'] = True msg['RESULT_LIST'] = {} msg['RESULT_LIST']['CCD_LIST'] = [] msg['RESULT_LIST']['RECEIPT_LIST'] = [] ccd_list = xfer_msg['XFER_PARAMS']['CCD_LIST'] receipt_list = [] for i in range(0, len(ccd_list)): receipt_list.append('F2_Rec_x447_' + str(i)) msg['RESULT_LIST']['RECEIPT_LIST'] = receipt_list msg['RESULT_LIST']['CCD_LIST'] = list(ccd_list) self.d2_publisher.publish_message(body['REPLY_QUEUE'], msg) else: pytest.fail("The following unknown message was received by D2: %s" % body)
class TestPpDev: dmcs_pub_broker_url = None dmcs_publisher = None dmcs_consumer = None dmcs_consumer_msg_list = [] ncsa_pub_broker_url = None ncsa_publisher = None ncsa_ctrl_consumer = None ncsa_consumer_msg_list = [] F1_pub_broker_url = None F1_publisher = None F1_consumer = None f1_consumer_msg_list = [] F2_pub_broker_url = None F2_publisher = None F2_consumer = None f2_consumer_msg_list = [] EXPECTED_NCSA_MESSAGES = 1 EXPECTED_DMCS_MESSAGES = 1 EXPECTED_F1_MESSAGES = 1 EXPECTED_F2_MESSAGES = 1 ccd_list = [14, 17, 21, 86] prp = toolsmod.prp # pretty printing DP = toolsmod.DP # Debug printing either True of False...set here to override this file only def test_ppdev(self, Ppdev): self.ppdev = Ppdev try: cdm = toolsmod.intake_yaml_file( './tests/yaml/L1SystemCfg_Test.yaml') except IOError as e: trace = traceback.print_exc() emsg = "Unable to find CFG Yaml file %s\n" % self._config_file print(emsg + trace) sys.exit(101) broker_addr = cdm[ROOT]['BASE_BROKER_ADDR'] dmcs_name = cdm[ROOT]['DMCS_BROKER_NAME'] dmcs_passwd = cdm[ROOT]['DMCS_BROKER_PASSWD'] dmcs_pub_name = cdm[ROOT]['DMCS_BROKER_PUB_NAME'] dmcs_pub_passwd = cdm[ROOT]['DMCS_BROKER_PUB_PASSWD'] dmcs_broker_url = "amqp://" + dmcs_name + ":" + \ dmcs_passwd + "@" + \ broker_addr dmcs_pub_broker_url = "amqp://" + dmcs_pub_name + ":" + \ dmcs_pub_passwd + "@" + \ broker_addr self.dmcs_publisher = SimplePublisher(dmcs_pub_broker_url, "YAML") ncsa_name = cdm[ROOT]['NCSA_BROKER_NAME'] ncsa_passwd = cdm[ROOT]['NCSA_BROKER_PASSWD'] ncsa_pub_name = cdm[ROOT]['NCSA_BROKER_PUB_NAME'] ncsa_pub_passwd = cdm[ROOT]['NCSA_BROKER_PUB_PASSWD'] ncsa_broker_url = "amqp://" + ncsa_name + ":" + \ ncsa_passwd + "@" + \ broker_addr ncsa_pub_broker_url = "amqp://" + ncsa_pub_name + ":" + \ ncsa_pub_passwd + "@" + \ broker_addr self.ncsa_publisher = SimplePublisher(ncsa_pub_broker_url, "YAML") F1_name = 'F1' F1_passwd = 'F1' F1_pub_name = 'F1_PUB' F1_pub_passwd = 'F1_PUB' F1_broker_url = "amqp://" + F1_name + ":" + \ F1_passwd + "@" + \ broker_addr F1_pub_broker_url = "amqp://" + F1_pub_name + ":" + \ F1_pub_passwd + "@" + \ broker_addr self.f1_publisher = SimplePublisher(F1_pub_broker_url, "YAML") F2_name = 'F2' F2_passwd = 'F2' F2_pub_name = 'F2_PUB' F2_pub_passwd = 'F2_PUB' F2_broker_url = "amqp://" + F2_name + ":" + \ F2_passwd + "@" + \ broker_addr F2_pub_broker_url = "amqp://" + F2_pub_name + ":" + \ F2_pub_passwd + "@" + \ broker_addr self.f2_publisher = SimplePublisher(F2_pub_broker_url, "YAML") # Must be done before consumer threads are started # This is used for verifying message structure self._msg_auth = MessageAuthority() self.dmcs_consumer = Consumer(dmcs_broker_url, 'dmcs_ack_consume', 'thread-dmcs', self.on_dmcs_message, 'YAML') self.dmcs_consumer.start() self.ncsa_consumer = Consumer(ncsa_broker_url, 'ncsa_consume', 'thread-ncsa', self.on_ncsa_message, 'YAML') self.ncsa_consumer.start() self.F1_consumer = Consumer(F1_broker_url, 'f1_consume', 'thread-f1', self.on_f1_message, 'YAML') self.F1_consumer.start() self.F2_consumer = Consumer(F2_broker_url, 'f2_consume', 'thread-f2', self.on_f2_message, 'YAML') self.F2_consumer.start() sleep(3) if self.DP: print("Test Setup Complete. Commencing Messages...") self.send_messages() sleep(6) self.verify_ncsa_messages() self.verify_F2_messages() self.verify_F1_messages() self.verify_dmcs_messages() sleep(2) self.dmcs_consumer.stop() self.dmcs_consumer.join() self.ncsa_consumer.stop() self.ncsa_consumer.join() self.F1_consumer.stop() self.F1_consumer.join() self.F2_consumer.stop() self.F2_consumer.join() if self.DP: print("Finished with PP tests.") def send_messages(self): if self.DP: print("Starting send_messages") # Tests only an AR device # self.clear_message_lists() self.EXPECTED_NCSA_MESSAGES = 3 self.EXPECTED_DMCS_MESSAGES = 4 self.EXPECTED_F1_MESSAGES = 3 self.EXPECTED_F2_MESSAGES = 3 msg = {} msg['MSG_TYPE'] = "PP_NEW_SESSION" msg['SESSION_ID'] = 'SI_469976' msg['ACK_ID'] = 'NEW_SESSION_ACK_44221' msg['REPLY_QUEUE'] = 'dmcs_ack_consume' time.sleep(3) if self.DP: print("New Session Message") self.dmcs_publisher.publish_message("pp_foreman_consume", msg) msg = {} msg['MSG_TYPE'] = "PP_NEXT_VISIT" msg['VISIT_ID'] = 'XX_28272' msg['REPLY_QUEUE'] = 'dmcs_ack_consume' msg['ACK_ID'] = 'NEW_VISIT_ACK_76' msg['BORE_SIGHT'] = "231,123786456342, -45.3457156906, FK5" time.sleep(2) if self.DP: print("Next Visit Message") self.dmcs_publisher.publish_message("pp_foreman_consume", msg) msg = {} msg['MSG_TYPE'] = "PP_START_INTEGRATION" msg['JOB_NUM'] = '4xx72' msg['IMAGE_ID'] = 'IMG_444244' msg['VISIT_ID'] = 'V14494' msg['SESSION_ID'] = '4_14_7211511' msg['REPLY_QUEUE'] = 'dmcs_ack_consume' msg['ACK_ID'] = 'PP_ACK_94671' msg['CCD_LIST'] = [4, 14, 16, 17, 29, 35, 36] time.sleep(4) if self.DP: print("PP_START_INTEGRATION Message") self.dmcs_publisher.publish_message("pp_foreman_consume", msg) msg = {} msg['MSG_TYPE'] = "PP_READOUT" msg['JOB_NUM'] = '4xx72' msg['IMAGE_ID'] = 'IMG_444244' msg['VISIT_ID'] = 'V14494' msg['SESSION_ID'] = '4_14_7211511' msg['REPLY_QUEUE'] = 'dmcs_ack_consume' msg['ACK_ID'] = 'PP_READOUT_ACK_44221' time.sleep(4) if self.DP: print("PP_READOUT Message") self.dmcs_publisher.publish_message("pp_foreman_consume", msg) time.sleep(2) if self.DP: print("Message Sender done") def verify_dmcs_messages(self): if self.DP: print("Messages received by verify_dmcs_messages:") self.prp.pprint(self.dmcs_consumer_msg_list) len_list = len(self.dmcs_consumer_msg_list) if len_list != self.EXPECTED_DMCS_MESSAGES: pytest.fail('DMCS simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_DMCS_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.dmcs_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: pytest.fail( "The following DMCS Bridge response message failed when compared with the sovereign example: %s" % msg) print("Responses to DMCS Bridge pass verification.") def verify_ncsa_messages(self): if self.DP: print("Messages received by verify_ncsa_messages:") self.prp.pprint(self.ncsa_consumer_msg_list) len_list = len(self.ncsa_consumer_msg_list) if len_list != self.EXPECTED_NCSA_MESSAGES: pytest.fail('NCSA simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_NCSA_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.ncsa_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: pytest.fail( "The following message to the NCSA Foreman failed when compared with the sovereign example: %s" % msg) print("Messages to the NCSA Foreman pass verification.") def verify_F1_messages(self): if self.DP: print("Messages received by verify_F1_messages:") self.prp.pprint(self.f1_consumer_msg_list) len_list = len(self.f1_consumer_msg_list) if len_list != self.EXPECTED_F1_MESSAGES: pytest.fail('F1 simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_F1_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.f1_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: pytest.fail( "The following message to F1 failed when compared with the sovereign example: %s" % msg) else: print("Messages to F1 pass verification.") def verify_F2_messages(self): if self.DP: print("Messages received by verify_F2_messages:") self.prp.pprint(self.f2_consumer_msg_list) len_list = len(self.f2_consumer_msg_list) if len_list != self.EXPECTED_F2_MESSAGES: pytest.fail('F2 simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_F2_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.f2_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: pytest.fail( "The following message to F2 failed when compared with the sovereign example: %s" % msg) else: print("Messages to F2 pass verification.") def on_dmcs_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) if self.DP: print("In test_pp_dev - incoming on_dmcs_message") self.prp.pprint(body) print("\n----------------------\n\n") self.dmcs_consumer_msg_list.append(body) def on_ncsa_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) if self.DP: print("In test_pp_dev - incoming on_ncsa_message") self.prp.pprint(body) print("\n----------------------\n\n") self.ncsa_consumer_msg_list.append(body) if body['MSG_TYPE'] == 'NCSA_NEW_SESSION': msg = {} msg['MSG_TYPE'] = 'NCSA_NEW_SESSION_ACK' msg['COMPONENT'] = 'NCSA_FOREMAN' msg['ACK_ID'] = body['ACK_ID'] msg['ACK_BOOL'] = True self.ncsa_publisher.publish_message(body['REPLY_QUEUE'], msg) return if body['MSG_TYPE'] == 'NCSA_NEXT_VISIT': msg = {} msg['MSG_TYPE'] = 'NCSA_NEXT_VISIT_ACK' msg['COMPONENT'] = 'NCSA_FOREMAN' msg['ACK_ID'] = body['ACK_ID'] msg['ACK_BOOL'] = True self.ncsa_publisher.publish_message(body['REPLY_QUEUE'], msg) return if body['MSG_TYPE'] == 'NCSA_START_INTEGRATION': msg = {} msg['ACK_ID'] = body['ACK_ID'] msg['MSG_TYPE'] = 'NCSA_START_INTEGRATION_ACK' msg['COMPONENT'] = 'NCSA_FOREMAN' fwdrs = deepcopy(body['FORWARDERS']) fwdr_list = fwdrs['FORWARDER_LIST'] ccd_list = fwdrs['CCD_LIST'] i = 1 msg['PAIRS'] = [] # This will be a list of dictionaries for i in range(0, len(fwdr_list)): fwdr = fwdr_list[i] dist = {} pair = {} dist['FQN'] = "Distributor_" + str(i) dist['NAME'] = "D" + str(i) dist['HOSTNAME'] = "D" + str(i) dist['TARGET_DIR'] = "/dev/null" dist['IP_ADDR'] = "141.142.237.16" + str(i) pair['FORWARDER'] = fwdr_list[i] pair['CCD_LIST'] = ccd_list[ i] #Get the list at index position i in ccd_list pair['DISTRIBUTOR'] = dist msg['PAIRS'].append(deepcopy(pair)) msg['ACK_BOOL'] = True msg['JOB_NUM'] = body['JOB_NUM'] msg['IMAGE_ID'] = body['IMAGE_ID'] msg['VISIT_ID'] = body['VISIT_ID'] msg['SESSION_ID'] = body['SESSION_ID'] self.ncsa_publisher.publish_message(body['REPLY_QUEUE'], msg) return if body['MSG_TYPE'] == 'NCSA_READOUT': # Find earlier Start Int message st_int_msg = None for msg in self.ncsa_consumer_msg_list: if msg['MSG_TYPE'] == 'NCSA_START_INTEGRATION': st_int_msg = msg break if st_int_msg == None: pytest.fail( "The NCSA_START_INTEGRATION message wasn't received before NCSA_READOUT in on_ncsa_msg" ) # Now build response with previous message msg = {} msg['MSG_TYPE'] = 'NCSA_READOUT_ACK' msg['JOB_NUM'] = body['JOB_NUM'] msg['IMAGE_ID'] = body['IMAGE_ID'] msg['VISIT_ID'] = body['VISIT_ID'] msg['SESSION_ID'] = body['SESSION_ID'] msg['COMPONENT'] = 'NCSA_FOREMAN' msg['ACK_BOOL'] = True msg['ACK_ID'] = body['ACK_ID'] #msg['RESULT_LIST']['FORWARDER_LIST'] = st_int_msg['FORWARDERS']['FORWARDER_LIST'] ccd_list = st_int_msg['FORWARDERS']['CCD_LIST'] receipt_list = [] for i in range(0, len(ccd_list)): receipt_list.append('Rec_x447_' + str(i)) msg['RESULT_LIST'] = {} msg['RESULT_LIST']['RECEIPT_LIST'] = receipt_list msg['RESULT_LIST']['CCD_LIST'] = list(ccd_list) #sleep(2) #Give FWDRs time to respond with ack first self.ncsa_publisher.publish_message(body['REPLY_QUEUE'], msg) def on_f1_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) if self.DP: print("In test_pp_dev - incoming on_f1_message") self.prp.pprint(body) print("\n----------------------\n\n") self.f1_consumer_msg_list.append(body) if body['MSG_TYPE'] == 'PP_FWDR_HEALTH_CHECK': msg = {} msg['MSG_TYPE'] = 'PP_FWDR_HEALTH_CHECK_ACK' msg['COMPONENT'] = 'FORWARDER_1' msg['ACK_BOOL'] = True msg['ACK_ID'] = body['ACK_ID'] self.f1_publisher.publish_message(body['REPLY_QUEUE'], msg) elif body['MSG_TYPE'] == 'PP_FWDR_XFER_PARAMS': msg = {} msg['MSG_TYPE'] = 'PP_FWDR_XFER_PARAMS_ACK' msg['COMPONENT'] = 'FORWARDER_1' msg['ACK_BOOL'] = True msg['ACK_ID'] = body['ACK_ID'] self.f1_publisher.publish_message(body['REPLY_QUEUE'], msg) elif body['MSG_TYPE'] == 'PP_FWDR_READOUT': # Find message in message list for xfer_params xfer_msg = None for msg in self.f1_consumer_msg_list: if msg['MSG_TYPE'] == 'PP_FWDR_XFER_PARAMS': xfer_msg = msg break if xfer_msg == None: pytest.fail( "The PP_FWDR_XFER_PARAMS message was not received before PP_FWDR_READOUT in F1" ) # use message to build response msg = {} msg['MSG_TYPE'] = 'PP_FWDR_READOUT_ACK' msg['COMPONENT'] = 'FORWARDER_1' msg['JOB_NUM'] = xfer_msg['JOB_NUM'] msg['IMAGE_ID'] = xfer_msg['IMAGE_ID'] msg['ACK_ID'] = body['ACK_ID'] msg['ACK_BOOL'] = True msg['RESULT_LIST'] = {} msg['RESULT_LIST']['CCD_LIST'] = [] msg['RESULT_LIST']['RECEIPT_LIST'] = [] ccd_list = xfer_msg['XFER_PARAMS']['CCD_LIST'] receipt_list = [] for i in range(0, len(ccd_list)): receipt_list.append('F1_Rec_x477_' + str(i)) msg['RESULT_LIST']['RECEIPT_LIST'] = receipt_list msg['RESULT_LIST']['CCD_LIST'] = list(ccd_list) self.f1_publisher.publish_message(body['REPLY_QUEUE'], msg) else: pytest.fail( "The following unknown message was received by FWDR F1: %s" % body) def on_f2_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) if self.DP: print("In test_pp_dev - incoming on_f2_message") self.prp.pprint(body) print("\n----------------------\n\n") self.f2_consumer_msg_list.append(body) if body['MSG_TYPE'] == 'PP_FWDR_HEALTH_CHECK': msg = {} msg['MSG_TYPE'] = 'PP_FWDR_HEALTH_CHECK_ACK' msg['COMPONENT'] = 'FORWARDER_2' msg['ACK_BOOL'] = True msg['ACK_ID'] = body['ACK_ID'] self.f2_publisher.publish_message(body['REPLY_QUEUE'], msg) elif body['MSG_TYPE'] == 'PP_FWDR_XFER_PARAMS': msg = {} msg['MSG_TYPE'] = 'PP_FWDR_XFER_PARAMS_ACK' msg['COMPONENT'] = 'FORWARDER_2' msg['ACK_BOOL'] = True msg['ACK_ID'] = body['ACK_ID'] self.f2_publisher.publish_message(body['REPLY_QUEUE'], msg) elif body['MSG_TYPE'] == 'PP_FWDR_READOUT': # Find message in message list for xfer_params xfer_msg = None for msg in self.f2_consumer_msg_list: if msg['MSG_TYPE'] == 'PP_FWDR_XFER_PARAMS': xfer_msg = msg break if xfer_msg == None: pytest.fail( "The PP_FWDR_XFER_PARAMS message was not received before AR_FWDR_READOUT in F2" ) # use message to build response msg = {} msg['MSG_TYPE'] = 'PP_FWDR_READOUT_ACK' msg['COMPONENT'] = 'FORWARDER_2' msg['JOB_NUM'] = xfer_msg['JOB_NUM'] msg['IMAGE_ID'] = xfer_msg['IMAGE_ID'] msg['ACK_ID'] = body['ACK_ID'] msg['ACK_BOOL'] = True msg['RESULT_LIST'] = {} msg['RESULT_LIST']['CCD_LIST'] = [] msg['RESULT_LIST']['RECEIPT_LIST'] = [] ccd_list = xfer_msg['XFER_PARAMS']['CCD_LIST'] receipt_list = [] for i in range(0, len(ccd_list)): receipt_list.append('F2_Rec_x447_' + str(i)) msg['RESULT_LIST']['RECEIPT_LIST'] = receipt_list msg['RESULT_LIST']['CCD_LIST'] = list(ccd_list) self.f2_publisher.publish_message(body['REPLY_QUEUE'], msg) else: pytest.fail( "The following unknown message was received by FWDR F2: %s" % body)
class TestDMCS_AT: ocs_pub_broker_url = None ocs_publisher = None ocs_consumer = None ocs_consumer_msg_list = [] at_pub_broker_url = None at_publisher = None at_consumer = None at_consumer_msg_list = [] EXPECTED_AT_MESSAGES = 1 EXPECTED_OCS_MESSAGES = 1 prp = toolsmod.prp #DP = toolsmod.DP #Debug print DP = True #Debug print def test_dmcs(self, Dmcs): self.dmcs = Dmcs #logging.warning("Logging is Working!") LOGGER.critical("LOGGING is Working!") #self.LOGGER.info("self Logging is Working!") try: cdm = toolsmod.intake_yaml_file('tests/yaml/L1SystemCfg_Test.yaml') except IOError as e: trace = traceback.print_exc() emsg = "Unable to find CFG Yaml file %s\n" % self._config_file print(emsg + trace) sys.exit(101) broker_addr = cdm[ROOT]['BASE_BROKER_ADDR'] ocs_name = cdm[ROOT]['OCS_BROKER_NAME'] ocs_passwd = cdm[ROOT]['OCS_BROKER_PASSWD'] ocs_pub_name = cdm[ROOT]['OCS_BROKER_PUB_NAME'] ocs_pub_passwd = cdm[ROOT]['OCS_BROKER_PUB_PASSWD'] ocs_broker_url = "amqp://" + ocs_name + ":" + \ ocs_passwd + "@" + \ broker_addr self.ocs_pub_broker_url = "amqp://" + ocs_pub_name + ":" + \ ocs_pub_passwd + "@" + \ broker_addr self.ocs_publisher = SimplePublisher(self.ocs_pub_broker_url, "YAML") at_name = cdm[ROOT]['AUX_BROKER_NAME'] at_passwd = cdm[ROOT]['AUX_BROKER_PASSWD'] at_pub_name = cdm[ROOT]['AUX_BROKER_PUB_NAME'] at_pub_passwd = cdm[ROOT]['AUX_BROKER_PUB_PASSWD'] at_broker_url = "amqp://" + at_name + ":" + \ at_passwd + "@" + \ broker_addr self.at_pub_broker_url = "amqp://" + at_pub_name + ":" + \ at_pub_passwd + "@" + \ broker_addr self.at_publisher = SimplePublisher(self.at_pub_broker_url, "YAML") # Must be done before consumer threads are started # This is used for verifying message structure self._msg_auth = MessageAuthority() self.ocs_consumer = Consumer(ocs_broker_url, 'dmcs_ocs_publish', 'thread-ocs', self.on_ocs_message, 'YAML') self.ocs_consumer.start() self.at_consumer = Consumer(at_broker_url, 'at_foreman_consume', 'thread-at', self.on_at_message, 'YAML') self.at_consumer.start() sleep(3) if self.DP: print("Test Setup Complete. Commencing Messages...") self.send_messages() sleep(3) self.verify_ocs_messages() sleep(3) self.verify_at_messages() sleep(2) self.ocs_consumer.stop() self.ocs_consumer.join() self.at_consumer.stop() self.at_consumer.join() if self.DP: print("Finished with DMCS AT tests.") def send_messages(self): if self.DP: print("Starting send_messages") # Tests only an AT device self.clear_message_lists() self.EXPECTED_OCS_MESSAGES = 6 self.EXPECTED_AT_MESSAGES = 4 msg = {} msg['MSG_TYPE'] = "STANDBY" msg['DEVICE'] = 'AT' msg['CMD_ID'] = '17718411' msg['CFG_KEY'] = "2C16" msg['ACK_ID'] = 'AT_4' msg['ACK_DELAY'] = 2 time.sleep(2) if self.DP: print("Sending AT STANDBY") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) msg = {} msg['MSG_TYPE'] = "DISABLE" msg['DEVICE'] = 'AT' msg['CMD_ID'] = '17718411' msg['ACK_ID'] = 'AT_6' msg['ACK_DELAY'] = 2 time.sleep(2) if self.DP: print("Sending AT DISABLE") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) sleep(2.0) # Make sertain scoreboard values are being set if self.DP: print("Checking State Scoreboard entries.") #assert self.dmcs.STATE_SCBD.get_auxdev_state() == 'DISABLE' assert self.dmcs.STATE_SCBD.get_auxtel_state() == 'DISABLE' msg = {} msg['MSG_TYPE'] = "ENABLE" msg['DEVICE'] = 'AT' msg['CMD_ID'] = '17718411' msg['ACK_ID'] = 'AT_11' msg['ACK_DELAY'] = 2 time.sleep(4) if self.DP: print("Sending AT ENABLE") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) sleep(2.0) #assert self.dmcs.STATE_SCBD.get_auxdev_state() == 'ENABLE' assert self.dmcs.STATE_SCBD.get_auxtel_state() == 'ENABLE' msg = {} msg['MSG_TYPE'] = "DMCS_AT_START_INTEGRATION" msg['IMAGE_ID'] = 'IMG_4280' msg['IMAGE_INDEX'] = 2 msg['IMAGE_SEQUENCE_NAME'] = 'XX_seq' msg['IMAGES_IN_SEQUENCE'] = 8 time.sleep(5) if self.DP: print("Sending Start Integration Message") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) msg = {} msg['MSG_TYPE'] = "DMCS_AT_END_READOUT" msg['IMAGE_ID'] = 'IMG_4280' msg['IMAGE_INDEX'] = 2 msg['IMAGE_SEQUENCE_NAME'] = 'XX_seq' msg['IMAGES_IN_SEQUENCE'] = 8 time.sleep(5) if self.DP: print("Sending READOUT Message") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) msg = {} msg['MSG_TYPE'] = "DMCS_AT_HEADER_READY" msg['IMAGE_ID'] = 'IMG_4280' msg['FILENAME'] = "/mnt/headers/IMG_4277.header" msg['ACK_ID'] = 'DMCS_END_READOUT_ACK_82' time.sleep(5) if self.DP: print("Sending READOUT Message") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) time.sleep(5) if self.DP: print("Message Sender done") def clear_message_lists(self): self.ocs_consumer_msg_list = [] self.at_consumer_msg_list = [] def verify_ocs_messages(self): if self.DP: print("Messages received by verify_ocs_messages:") self.prp.pprint(self.ocs_consumer_msg_list) len_list = len(self.ocs_consumer_msg_list) if len_list != self.EXPECTED_OCS_MESSAGES: if self.DP: print( "Incorrect number of messages received by OCS ACK Consumer." ) print("Messages received by verify_ocs_messages:") self.prp.pprint(self.ocs_consumer_msg_list) pytest.fail('OCS simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_OCS_MESSAGES, len_list)) # Now check num keys in each message and check for key errors for i in range(0, len_list): msg = self.ocs_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: pytest.fail( "The following OCS Bridge response message failed when compared with the sovereign example: %s" % msg) if self.DP: print("Responses to OCS Bridge pass verification.") def verify_at_messages(self): if self.DP: print("Messages received by verify_at_messages:") self.prp.pprint(self.at_consumer_msg_list) len_list = len(self.at_consumer_msg_list) if self.DP: print("The number of messages the AT received is %s" % len_list) if len_list != self.EXPECTED_AT_MESSAGES: if self.DP: print("Messages received by verify_at_messages:") self.prp.pprint(self.at_consumer_msg_list) pytest.fail('AT simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_AT_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.at_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: if self.DP: print("The following message to the AT failed when compared with " \ "the sovereign example: %s" % msg) pytest.fail("The following message to the AT failed when compared with " \ "the sovereign example: %s" % msg) if self.DP: print("Messages to the AT pass verification.") def on_ocs_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) if self.DP: print("In test_dmcs-at - incoming on_ocs_message") self.prp.pprint(body) print("\n----------------------\n\n") self.ocs_consumer_msg_list.append(body) def on_at_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) if self.DP: print("In test_dmcs-at - incoming on_at_message") self.prp.pprint(body) print("\n----------------------\n\n") self.at_consumer_msg_list.append(body)
class TestDMCS_AT: ocs_pub_broker_url = None ocs_publisher = None ocs_consumer = None ocs_consumer_msg_list = [] at_pub_broker_url = None at_publisher = None at_consumer = None at_consumer_msg_list = [] EXPECTED_AT_MESSAGES = 1 EXPECTED_OCS_MESSAGES = 1 prp = toolsmod.prp #DP = toolsmod.DP #Debug print DP = True #Debug print def test_dmcs(self, Dmcs): self.dmcs = Dmcs #logging.warning("Logging is Working!") LOGGER.critical("LOGGING is Working!") #self.LOGGER.info("self Logging is Working!") try: cdm = toolsmod.intake_yaml_file('tests/yaml/L1SystemCfg_Test.yaml') except IOError as e: trace = traceback.print_exc() emsg = "Unable to find CFG Yaml file %s\n" % self._config_file print(emsg + trace) sys.exit(101) broker_addr = cdm[ROOT]['BASE_BROKER_ADDR'] ocs_name = cdm[ROOT]['OCS_BROKER_NAME'] ocs_passwd = cdm[ROOT]['OCS_BROKER_PASSWD'] ocs_pub_name = cdm[ROOT]['OCS_BROKER_PUB_NAME'] ocs_pub_passwd = cdm[ROOT]['OCS_BROKER_PUB_PASSWD'] ocs_broker_url = "amqp://" + ocs_name + ":" + \ ocs_passwd + "@" + \ broker_addr self.ocs_pub_broker_url = "amqp://" + ocs_pub_name + ":" + \ ocs_pub_passwd + "@" + \ broker_addr self.ocs_publisher = SimplePublisher(self.ocs_pub_broker_url, "YAML") at_name = cdm[ROOT]['AUX_BROKER_NAME'] at_passwd = cdm[ROOT]['AUX_BROKER_PASSWD'] at_pub_name = cdm[ROOT]['AUX_BROKER_PUB_NAME'] at_pub_passwd = cdm[ROOT]['AUX_BROKER_PUB_PASSWD'] at_broker_url = "amqp://" + at_name + ":" + \ at_passwd + "@" + \ broker_addr self.at_pub_broker_url = "amqp://" + at_pub_name + ":" + \ at_pub_passwd + "@" + \ broker_addr self.at_publisher = SimplePublisher(self.at_pub_broker_url, "YAML") # Must be done before consumer threads are started # This is used for verifying message structure self._msg_auth = MessageAuthority() self.ocs_consumer = Consumer(ocs_broker_url,'dmcs_ocs_publish', 'thread-ocs', self.on_ocs_message,'YAML') self.ocs_consumer.start() self.at_consumer = Consumer(at_broker_url,'at_foreman_consume', 'thread-at', self.on_at_message,'YAML') self.at_consumer.start() sleep(3) if self.DP: print("Test Setup Complete. Commencing Messages...") self.send_messages() sleep(3) self.verify_ocs_messages() sleep(3) self.verify_at_messages() sleep(2) self.ocs_consumer.stop() self.ocs_consumer.join() self.at_consumer.stop() self.at_consumer.join() if self.DP: print("Finished with DMCS AT tests.") def send_messages(self): if self.DP: print("Starting send_messages") # Tests only an AT device self.clear_message_lists() self.EXPECTED_OCS_MESSAGES = 6 self.EXPECTED_AT_MESSAGES = 4 msg = {} msg['MSG_TYPE'] = "STANDBY" msg['DEVICE'] = 'AT' msg['CMD_ID'] = '17718411' msg['CFG_KEY'] = "2C16" msg['ACK_ID'] = 'AT_4' msg['ACK_DELAY'] = 2 time.sleep(2) if self.DP: print("Sending AT STANDBY") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) msg = {} msg['MSG_TYPE'] = "DISABLE" msg['DEVICE'] = 'AT' msg['CMD_ID'] = '17718411' msg['ACK_ID'] = 'AT_6' msg['ACK_DELAY'] = 2 time.sleep(2) if self.DP: print("Sending AT DISABLE") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) sleep(2.0) # Make sertain scoreboard values are being set if self.DP: print("Checking State Scoreboard entries.") #assert self.dmcs.STATE_SCBD.get_auxdev_state() == 'DISABLE' assert self.dmcs.STATE_SCBD.get_auxtel_state() == 'DISABLE' msg = {} msg['MSG_TYPE'] = "ENABLE" msg['DEVICE'] = 'AT' msg['CMD_ID'] = '17718411' msg['ACK_ID'] = 'AT_11' msg['ACK_DELAY'] = 2 time.sleep(4) if self.DP: print("Sending AT ENABLE") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) sleep(2.0) #assert self.dmcs.STATE_SCBD.get_auxdev_state() == 'ENABLE' assert self.dmcs.STATE_SCBD.get_auxtel_state() == 'ENABLE' msg = {} msg['MSG_TYPE'] = "DMCS_AT_START_INTEGRATION" msg['IMAGE_ID'] = 'IMG_4280' msg['IMAGE_INDEX'] = 2 msg['IMAGE_SEQUENCE_NAME'] = 'XX_seq' msg['IMAGES_IN_SEQUENCE'] = 8 time.sleep(5) if self.DP: print("Sending Start Integration Message") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) msg = {} msg['MSG_TYPE'] = "DMCS_AT_END_READOUT" msg['IMAGE_ID'] = 'IMG_4280' msg['IMAGE_INDEX'] = 2 msg['IMAGE_SEQUENCE_NAME'] = 'XX_seq' msg['IMAGES_IN_SEQUENCE'] = 8 time.sleep(5) if self.DP: print("Sending READOUT Message") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) msg = {} msg['MSG_TYPE'] = "DMCS_AT_HEADER_READY" msg['IMAGE_ID'] = 'IMG_4280' msg['FILENAME'] = "/mnt/headers/IMG_4277.header" msg['ACK_ID'] = 'DMCS_END_READOUT_ACK_82' time.sleep(5) if self.DP: print("Sending READOUT Message") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) time.sleep(5) if self.DP: print("Message Sender done") def clear_message_lists(self): self.ocs_consumer_msg_list = [] self.at_consumer_msg_list = [] def verify_ocs_messages(self): if self.DP: print("Messages received by verify_ocs_messages:") self.prp.pprint(self.ocs_consumer_msg_list) len_list = len(self.ocs_consumer_msg_list) if len_list != self.EXPECTED_OCS_MESSAGES: if self.DP: print("Incorrect number of messages received by OCS ACK Consumer.") print("Messages received by verify_ocs_messages:") self.prp.pprint(self.ocs_consumer_msg_list) pytest.fail('OCS simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_OCS_MESSAGES, len_list)) # Now check num keys in each message and check for key errors for i in range(0, len_list): msg = self.ocs_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: pytest.fail("The following OCS Bridge response message failed when compared with the sovereign example: %s" % msg) if self.DP: print("Responses to OCS Bridge pass verification.") def verify_at_messages(self): if self.DP: print("Messages received by verify_at_messages:") self.prp.pprint(self.at_consumer_msg_list) len_list = len(self.at_consumer_msg_list) if self.DP: print("The number of messages the AT received is %s" % len_list) if len_list != self.EXPECTED_AT_MESSAGES: if self.DP: print("Messages received by verify_at_messages:") self.prp.pprint(self.at_consumer_msg_list) pytest.fail('AT simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_AT_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.at_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: if self.DP: print("The following message to the AT failed when compared with " \ "the sovereign example: %s" % msg) pytest.fail("The following message to the AT failed when compared with " \ "the sovereign example: %s" % msg) if self.DP: print("Messages to the AT pass verification.") def on_ocs_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) if self.DP: print("In test_dmcs-at - incoming on_ocs_message") self.prp.pprint(body) print("\n----------------------\n\n") self.ocs_consumer_msg_list.append(body) def on_at_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) if self.DP: print("In test_dmcs-at - incoming on_at_message") self.prp.pprint(body) print("\n----------------------\n\n") self.at_consumer_msg_list.append(body)
class TestDMCS_AR: ocs_pub_broker_url = None ocs_publisher = None ocs_consumer = None ocs_consumer_msg_list = [] ar_pub_broker_url = None ar_publisher = None ar_consumer = None ar_consumer_msg_list = [] EXPECTED_AR_MESSAGES = 1 EXPECTED_OCS_MESSAGES = 1 ccd_list = [14, 17, 21.86] prp = toolsmod.prp DP = toolsmod.DP #Debug print def test_dmcs(self, Dmcs): self.dmcs = Dmcs #logging.warning("Logging is Working!") LOGGER.critical("LOGGING is Working!") #self.LOGGER.info("self Logging is Working!") try: cdm = toolsmod.intake_yaml_file('tests/yaml/L1SystemCfg_Test.yaml') except IOError as e: trace = traceback.print_exc() emsg = "Unable to find CFG Yaml file %s\n" % self._config_file print(emsg + trace) sys.exit(101) broker_addr = cdm[ROOT]['BASE_BROKER_ADDR'] ocs_name = cdm[ROOT]['OCS_BROKER_NAME'] ocs_passwd = cdm[ROOT]['OCS_BROKER_PASSWD'] ocs_pub_name = cdm[ROOT]['OCS_BROKER_PUB_NAME'] ocs_pub_passwd = cdm[ROOT]['OCS_BROKER_PUB_PASSWD'] ocs_broker_url = "amqp://" + ocs_name + ":" + \ ocs_passwd + "@" + \ broker_addr self.ocs_pub_broker_url = "amqp://" + ocs_pub_name + ":" + \ ocs_pub_passwd + "@" + \ broker_addr self.ocs_publisher = SimplePublisher(self.ocs_pub_broker_url, "YAML") ar_name = cdm[ROOT]['AFM_BROKER_NAME'] ar_passwd = cdm[ROOT]['AFM_BROKER_PASSWD'] ar_pub_name = cdm[ROOT]['AFM_BROKER_PUB_NAME'] ar_pub_passwd = cdm[ROOT]['AFM_BROKER_PUB_PASSWD'] ar_broker_url = "amqp://" + ar_name + ":" + \ ar_passwd + "@" + \ broker_addr self.ar_pub_broker_url = "amqp://" + ar_pub_name + ":" + \ ar_pub_passwd + "@" + \ broker_addr self.ar_publisher = SimplePublisher(self.ar_pub_broker_url, "YAML") # Must be done before consumer threads are started # This is used for verifying message structure self._msg_auth = MessageAuthority() self.ocs_consumer = Consumer(ocs_broker_url, 'dmcs_ocs_publish', 'thread-ocs', self.on_ocs_message, 'YAML') self.ocs_consumer.start() self.ar_consumer = Consumer(ar_broker_url, 'ar_foreman_consume', 'thread-ar', self.on_ar_message, 'YAML') self.ar_consumer.start() sleep(3) if self.DP: print("Test Setup Complete. Commencing Messages...") self.send_messages() sleep(3) self.verify_ocs_messages() sleep(3) self.verify_ar_messages() sleep(2) self.ocs_consumer.stop() self.ocs_consumer.join() self.ar_consumer.stop() self.ar_consumer.join() if self.DP: print("Finished with DMCS AR tests.") def send_messages(self): if self.DP: print("Starting send_messages") # Tests only an AR device self.clear_message_lists() self.EXPECTED_OCS_MESSAGES = 6 self.EXPECTED_AR_MESSAGES = 6 msg = {} msg['MSG_TYPE'] = "STANDBY" msg['DEVICE'] = 'AR' msg['CMD_ID'] = '17718411' msg['CFG_KEY'] = "2C16" msg['ACK_ID'] = 'AR_4' msg['ACK_DELAY'] = 2 time.sleep(2) if self.DP: print("Sending AR STANDBY") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) msg = {} msg['MSG_TYPE'] = "DISABLE" msg['DEVICE'] = 'AR' msg['CMD_ID'] = '17718411' msg['ACK_ID'] = 'AR_6' msg['ACK_DELAY'] = 2 time.sleep(2) if self.DP: print("Sending AR DISABLE") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) sleep(2.0) # Make sertain scoreboard values are being set if self.DP: print("Checking State Scoreboard entries.") #assert self.dmcs.STATE_SCBD.get_archive_state() == 'DISABLE' assert self.dmcs.STATE_SCBD.get_archive_state() == 'DISABLE' msg = {} msg['MSG_TYPE'] = "ENABLE" msg['DEVICE'] = 'AR' msg['CMD_ID'] = '17718411' msg['ACK_ID'] = 'AR_11' msg['ACK_DELAY'] = 2 time.sleep(4) if self.DP: print("Sending AR ENABLE") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) sleep(2.0) #assert self.dmcs.STATE_SCBD.get_archive_state() == 'ENABLE' assert self.dmcs.STATE_SCBD.get_archive_state() == 'ENABLE' msg = {} msg['MSG_TYPE'] = "DMCS_TCS_TARGET" msg['VISIT_ID'] = 'V_1443' msg['RESPONSE_QUEUE'] = "dmcs_ack_consume" msg['ACK_ID'] = 'NEW_VISIT_ACK_76' msg['RA'] = "231,123786456342" msg['DEC'] = "152,188723196342" msg['ANGLE'] = "15" time.sleep(4) if self.DP: print("Sending Next Visit Message") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) sleep(2.0) assert self.dmcs.STATE_SCBD.get_current_visit() == 'V_1443' msg = {} msg['MSG_TYPE'] = "DMCS_TAKE_IMAGES" msg['NUM_IMAGES'] = '5' msg['VISIT_ID'] = 'V_1443' msg['ACK_ID'] = 'DMCS_TAKE_IMAGES_ACK_76' msg['RESPONSE_QUEUE'] = "dmcs_ack_consume" time.sleep(4) if self.DP: print("Sending Start Integration Message") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) msg = {} msg['MSG_TYPE'] = "DMCS_END_READOUT" msg['VISIT_ID'] = 'V_1443' msg['IMAGE_ID'] = 'IMG_4276' msg['REPLY_QUEUE'] = "dmcs_ack_consume" msg['ACK_ID'] = 'DMCS_END_READOUT_ACK_81' time.sleep(5) if self.DP: print("Sending READOUT Message") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) msg = {} msg['MSG_TYPE'] = "DMCS_END_READOUT" msg['VISIT_ID'] = 'V_1443' msg['IMAGE_ID'] = 'IMG_4277' msg['REPLY_QUEUE'] = "dmcs_ack_consume" msg['ACK_ID'] = 'DMCS_END_READOUT_ACK_82' time.sleep(5) if self.DP: print("Sending READOUT Message") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) msg = {} msg['MSG_TYPE'] = "DMCS_END_READOUT" msg['VISIT_ID'] = 'V_1443' msg['IMAGE_ID'] = 'IMG_4278' msg['REPLY_QUEUE'] = "dmcs_ack_consume" msg['ACK_ID'] = 'DMCS_END_READOUT_ACK_85' time.sleep(5) if self.DP: print("Sending READOUT Message") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) msg = {} msg['MSG_TYPE'] = "DMCS_END_READOUT" msg['VISIT_ID'] = 'V_1443' msg['IMAGE_ID'] = 'IMG_4279' msg['REPLY_QUEUE'] = "dmcs_ack_consume" msg['ACK_ID'] = 'DMCS_END_READOUT_ACK_86' time.sleep(5) if self.DP: print("Sending READOUT Message") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) msg = {} msg['MSG_TYPE'] = "DMCS_END_READOUT" msg['VISIT_ID'] = 'V_1443' msg['IMAGE_ID'] = 'IMG_4280' msg['REPLY_QUEUE'] = "dmcs_ack_consume" msg['ACK_ID'] = 'DMCS_END_READOUT_ACK_88' time.sleep(5) if self.DP: print("Sending READOUT Message") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) msg = {} msg['MSG_TYPE'] = "DMCS_TAKE_IMAGES_DONE" msg['VISIT_ID'] = 'V_1443' msg['ACK_ID'] = 'DMCS_TAKE_IMAGES_ACK_76' msg['RESPONSE_QUEUE'] = "dmcs_ack_consume" time.sleep(4) if self.DP: print("Sending Start Integration Message") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) time.sleep(5) if self.DP: print("Message Sender done") def clear_message_lists(self): self.ocs_consumer_msg_list = [] self.ar_consumer_msg_list = [] def verify_ocs_messages(self): if self.DP: print("Messages received by verify_ocs_messages:") self.prp.pprint(self.ocs_consumer_msg_list) len_list = len(self.ocs_consumer_msg_list) if len_list != self.EXPECTED_OCS_MESSAGES: if self.DP: print( "Incorrect number of messages received by OCS ACK Consumer." ) print("Messages received by verify_ocs_messages:") self.prp.pprint(self.ocs_consumer_msg_list) pytest.fail('OCS simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_OCS_MESSAGES, len_list)) # Now check num keys in each message and check for key errors for i in range(0, len_list): msg = self.ocs_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: pytest.fail( "The following OCS Bridge response message failed when compared with the sovereign example: %s" % msg) if self.DP: print("Responses to OCS Bridge pass verification.") def verify_ar_messages(self): if self.DP: print("Messages received by verify_ar_messages:") self.prp.pprint(self.ar_consumer_msg_list) len_list = len(self.ar_consumer_msg_list) if self.DP: print("The number of messages the AR received is %s" % len_list) if len_list != self.EXPECTED_AR_MESSAGES: if self.DP: print("Messages received by verify_ar_messages:") self.prp.pprint(self.ar_consumer_msg_list) pytest.fail('AR simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_AR_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.ar_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: if self.DP: print("The following message to the AR failed when compared with " \ "the sovereign example: %s" % msg) pytest.fail("The following message to the AR failed when compared with " \ "the sovereign example: %s" % msg) if self.DP: print("Messages to the AR pass verification.") def on_ocs_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) if self.DP: print("In test_dmcs-ar - incoming on_ocs_message") self.prp.pprint(body) print("\n----------------------\n\n") self.ocs_consumer_msg_list.append(body) def on_ar_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) if self.DP: print("In test_dmcs-ar - incoming on_ar_message") self.prp.pprint(body) print("\n----------------------\n\n") self.ar_consumer_msg_list.append(body)
class TestDMCS_AR_PP: ocs_pub_broker_url = None ocs_publisher = None ocs_consumer = None ocs_consumer_msg_list = [] ar_pub_broker_url = None ar_publisher = None ar_consumer = None ar_consumer_msg_list = [] pp_pub_broker_url = None pp_publisher = None pp_consumer = None pp_consumer_msg_list = [] EXPECTED_AR_MESSAGES = 1 EXPECTED_PP_MESSAGES = 1 EXPECTED_OCS_MESSAGES = 1 ccd_list = [14,17,21.86] prp = toolsmod.prp DP = toolsmod.DP # Debug Print def test_dmcs(self, Dmcs): self.dmcs = Dmcs try: cdm = toolsmod.intake_yaml_file('tests/yaml/L1SystemCfg_Test.yaml') except IOError as e: trace = traceback.print_exc() emsg = "Unable to find CFG Yaml file %s\n" % self._config_file print(emsg + trace) sys.exit(101) broker_addr = cdm[ROOT]['BASE_BROKER_ADDR'] ocs_name = cdm[ROOT]['OCS_BROKER_NAME'] ocs_passwd = cdm[ROOT]['OCS_BROKER_PASSWD'] ocs_pub_name = cdm[ROOT]['OCS_BROKER_PUB_NAME'] ocs_pub_passwd = cdm[ROOT]['OCS_BROKER_PUB_PASSWD'] ocs_broker_url = "amqp://" + ocs_name + ":" + \ ocs_passwd + "@" + \ broker_addr self. ocs_pub_broker_url = "amqp://" + ocs_pub_name + ":" + \ ocs_pub_passwd + "@" + \ broker_addr self.ocs_publisher = SimplePublisher(self.ocs_pub_broker_url, "YAML") ar_name = cdm[ROOT]['AFM_BROKER_NAME'] ar_passwd = cdm[ROOT]['AFM_BROKER_PASSWD'] ar_pub_name = cdm[ROOT]['AFM_BROKER_PUB_NAME'] ar_pub_passwd = cdm[ROOT]['AFM_BROKER_PUB_PASSWD'] ar_broker_url = "amqp://" + ar_name + ":" + \ ar_passwd + "@" + \ broker_addr self.ar_pub_broker_url = "amqp://" + ar_pub_name + ":" + \ ar_pub_passwd + "@" + \ broker_addr self.ar_publisher = SimplePublisher(self.ar_pub_broker_url, "YAML") pp_name = cdm[ROOT]['PFM_BROKER_NAME'] pp_passwd = cdm[ROOT]['PFM_BROKER_PASSWD'] pp_pub_name = cdm[ROOT]['PFM_BROKER_PUB_NAME'] pp_pub_passwd = cdm[ROOT]['PFM_BROKER_PUB_PASSWD'] pp_broker_url = "amqp://" + pp_name + ":" + \ pp_passwd + "@" + \ broker_addr self.pp_pub_broker_url = "amqp://" + pp_pub_name + ":" + \ pp_pub_passwd + "@" + \ broker_addr self.pp_publisher = SimplePublisher(self.pp_pub_broker_url, "YAML") # Must be done before consumer threads are started # This is used for verifying message structure self._msg_auth = MessageAuthority() self.ocs_consumer = Consumer(ocs_broker_url,'dmcs_ocs_publish', 'thread-ocs', self.on_ocs_message,'YAML') self.ocs_consumer.start() self.ar_consumer = Consumer(ar_broker_url,'ar_foreman_consume', 'thread-ar', self.on_ar_message,'YAML') self.ar_consumer.start() self.pp_consumer = Consumer(pp_broker_url,'pp_foreman_consume', 'thread-pp', self.on_pp_message,'YAML') self.pp_consumer.start() ### call message sender and pass in ocs_publisher sleep(3) print("Test Setup Complete. Commencing Messages...") self.send_messages() sleep(3) self.verify_ocs_messages() sleep(3) self.verify_ar_messages() sleep(3) self.verify_pp_messages() sleep(2) self.ocs_consumer.stop() self.ocs_consumer.join() self.ar_consumer.stop() self.ar_consumer.join() self.pp_consumer.stop() self.pp_consumer.join() print("Finished with DMCS AR and PP tests.") def send_messages(self): print("Starting send_messages") # Tests both AR and PP devices self.EXPECTED_OCS_MESSAGES = 12 self.EXPECTED_AR_MESSAGES = 7 self.EXPECTED_PP_MESSAGES = 7 self.clear_message_lists() msg = {} msg['MSG_TYPE'] = "STANDBY" msg['DEVICE'] = 'AR' msg['CMD_ID'] = '16729948' msg['CFG_KEY'] = "2C16" msg['ACK_ID'] = 'AR_4' msg['ACK_DELAY'] = 2 time.sleep(1) print("AR STANDBY") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) msg = {} msg['MSG_TYPE'] = "STANDBY" msg['DEVICE'] = 'PP' msg['CMD_ID'] = '16729948' msg['CFG_KEY'] = "2C16" msg['ACK_ID'] = 'PP_7' msg['ACK_DELAY'] = 2 time.sleep(5) print("PP STANDBY") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) #msg = {} #msg['MSG_TYPE'] = "NEW_SESSION" #msg['SESSION_ID'] = 'SI_469976' #msg['ACK_ID'] = 'NEW_SESSION_ACK_44221' #msg['RESPONSE_QUEUE'] = "dmcs_ack_consume" ##time.sleep(1) ##self.ocs_publisher.publish_message("ar_foreman_consume", msg) msg = {} msg['MSG_TYPE'] = "DISABLE" msg['DEVICE'] = 'AR' msg['CMD_ID'] = '16729948' msg['ACK_ID'] = 'AR_6' msg['ACK_DELAY'] = 2 time.sleep(5) print("AR DISABLE") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) msg = {} msg['MSG_TYPE'] = "DISABLE" msg['DEVICE'] = 'PP' msg['CMD_ID'] = '16729948' msg['ACK_ID'] = 'PP_8' msg['ACK_DELAY'] = 2 time.sleep(5) print("PP DISABLE") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) # Make certain DMCS is doing proper bookkeeping sleep(6.5) assert self.dmcs.STATE_SCBD.get_archive_state() == 'DISABLE' assert self.dmcs.STATE_SCBD.get_prompt_process_state() == 'DISABLE' msg = {} msg['MSG_TYPE'] = "ENABLE" msg['DEVICE'] = 'AR' msg['CMD_ID'] = '16729948' msg['ACK_ID'] = 'AR_11' msg['ACK_DELAY'] = 2 time.sleep(5) print("AR ENABLE") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) msg = {} msg['MSG_TYPE'] = "ENABLE" msg['DEVICE'] = 'PP' msg['CMD_ID'] = '16729948' msg['ACK_ID'] = 'PP_12' msg['ACK_DELAY'] = 2 time.sleep(5) print("PP ENABLE") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) sleep(6.5) assert self.dmcs.STATE_SCBD.get_archive_state() == 'ENABLE' assert self.dmcs.STATE_SCBD.get_prompt_process_state() == 'ENABLE' msg = {} msg['MSG_TYPE'] = "NEXT_VISIT" msg['VISIT_ID'] = 'V_1443' msg['RESPONSE_QUEUE'] = "dmcs_ack_consume" msg['ACK_ID'] = 'NEW_VISIT_ACK_76' msg['BORE_SIGHT'] = "231,123786456342, -45.3457156906, FK5" time.sleep(5) print("Next Visit Message") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) sleep(3.5) assert self.dmcs.STATE_SCBD.get_current_visit() == 'V_1443' msg = {} msg['MSG_TYPE'] = "START_INTEGRATION" msg['IMAGE_ID'] = 'IMG_4276' msg['VISIT_ID'] = 'V_1443' msg['ACK_ID'] = 'START_INT_ACK_76' msg['RESPONSE_QUEUE'] = "dmcs_ack_consume" msg['CCD_LIST'] = self.ccd_list time.sleep(5) print("Start Integration Message") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) msg = {} msg['MSG_TYPE'] = "READOUT" msg['VISIT_ID'] = 'V_1443' msg['IMAGE_ID'] = 'IMG_4276' msg['IMAGE_SRC'] = 'MAIN' msg['RESPONSE_QUEUE'] = "dmcs_ack_consume" msg['ACK_ID'] = 'READOUT_ACK_77' time.sleep(5) print("READOUT Message") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) msg = {} msg['MSG_TYPE'] = "START_INTEGRATION" msg['IMAGE_ID'] = 'IMG_4277' msg['IMAGE_SRC'] = 'MAIN' msg['VISIT_ID'] = 'V_1443' msg['ACK_ID'] = 'START_INT_ACK_78' msg['RESPONSE_QUEUE'] = "dmcs_ack_consume" msg['CCD_LIST'] = self.ccd_list time.sleep(5) print("Start Integration Message") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) msg = {} msg['MSG_TYPE'] = "READOUT" msg['VISIT_ID'] = 'V_1443' msg['IMAGE_ID'] = 'IMG_4277' msg['IMAGE_SRC'] = 'MAIN' msg['RESPONSE_QUEUE'] = "dmcs_ack_consume" msg['ACK_ID'] = 'READOUT_ACK_79' time.sleep(5) print("READOUT Message") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) time.sleep(2) print("Message Sender done") def clear_message_lists(self): self.ocs_consumer_msg_list = [] self.ar_consumer_msg_list = [] self.pp_consumer_msg_list = [] def verify_ocs_messages(self): print("Messages received by verify_ocs_messages:") self.prp.pprint(self.ocs_consumer_msg_list) len_list = len(self.ocs_consumer_msg_list) if len_list != self.EXPECTED_OCS_MESSAGES: print("Messages received by verify_ocs_messages:") self.prp.pprint(self.ocs_consumer_msg_list) pytest.fail('OCS simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_OCS_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.ocs_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: pytest.fail("The following OCS Bridge response message failed when compared with the sovereign example: %s" % msg) print("Responses to OCS Bridge pass verification.") def verify_ar_messages(self): print("Messages received by verify_ar_messages:") self.prp.pprint(self.ar_consumer_msg_list) len_list = len(self.ar_consumer_msg_list) if len_list != self.EXPECTED_AR_MESSAGES: print("Messages received by verify_ar_messages:") self.prp.pprint(self.ar_consumer_msg_list) pytest.fail('AR simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_AR_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.ar_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: pytest.fail("The following message to the AR failed when compared with the sovereign example: %s" % msg) print("Messages to the AR pass verification.") def verify_pp_messages(self): print("Messages received by verify_pp_messages:") self.prp.pprint(self.pp_consumer_msg_list) len_list = len(self.pp_consumer_msg_list) if len_list != self.EXPECTED_PP_MESSAGES: print("Messages received by verify_pp_messages:") self.prp.pprint(self.pp_consumer_list) pytest.fail('PP simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_PP_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.pp_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: pytest.fail("The following message to the PP device failed when compared with the sovereign example: %s" % msg) print("Messages to the PP device pass verification.") def on_ocs_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) self.ocs_consumer_msg_list.append(body) def on_ar_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) self.ar_consumer_msg_list.append(body) def on_pp_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) self.pp_consumer_msg_list.append(body)
class TestDMCS_AR_PP: ocs_pub_broker_url = None ocs_publisher = None ocs_consumer = None ocs_consumer_msg_list = [] ar_pub_broker_url = None ar_publisher = None ar_consumer = None ar_consumer_msg_list = [] pp_pub_broker_url = None pp_publisher = None pp_consumer = None pp_consumer_msg_list = [] EXPECTED_AR_MESSAGES = 1 EXPECTED_PP_MESSAGES = 1 EXPECTED_OCS_MESSAGES = 1 ccd_list = [14, 17, 21.86] prp = toolsmod.prp DP = toolsmod.DP # Debug Print def test_dmcs(self, Dmcs): self.dmcs = Dmcs try: cdm = toolsmod.intake_yaml_file('tests/yaml/L1SystemCfg_Test.yaml') except IOError as e: trace = traceback.print_exc() emsg = "Unable to find CFG Yaml file %s\n" % self._config_file print(emsg + trace) sys.exit(101) broker_addr = cdm[ROOT]['BASE_BROKER_ADDR'] ocs_name = cdm[ROOT]['OCS_BROKER_NAME'] ocs_passwd = cdm[ROOT]['OCS_BROKER_PASSWD'] ocs_pub_name = cdm[ROOT]['OCS_BROKER_PUB_NAME'] ocs_pub_passwd = cdm[ROOT]['OCS_BROKER_PUB_PASSWD'] ocs_broker_url = "amqp://" + ocs_name + ":" + \ ocs_passwd + "@" + \ broker_addr self. ocs_pub_broker_url = "amqp://" + ocs_pub_name + ":" + \ ocs_pub_passwd + "@" + \ broker_addr self.ocs_publisher = SimplePublisher(self.ocs_pub_broker_url, "YAML") ar_name = cdm[ROOT]['AFM_BROKER_NAME'] ar_passwd = cdm[ROOT]['AFM_BROKER_PASSWD'] ar_pub_name = cdm[ROOT]['AFM_BROKER_PUB_NAME'] ar_pub_passwd = cdm[ROOT]['AFM_BROKER_PUB_PASSWD'] ar_broker_url = "amqp://" + ar_name + ":" + \ ar_passwd + "@" + \ broker_addr self.ar_pub_broker_url = "amqp://" + ar_pub_name + ":" + \ ar_pub_passwd + "@" + \ broker_addr self.ar_publisher = SimplePublisher(self.ar_pub_broker_url, "YAML") pp_name = cdm[ROOT]['PFM_BROKER_NAME'] pp_passwd = cdm[ROOT]['PFM_BROKER_PASSWD'] pp_pub_name = cdm[ROOT]['PFM_BROKER_PUB_NAME'] pp_pub_passwd = cdm[ROOT]['PFM_BROKER_PUB_PASSWD'] pp_broker_url = "amqp://" + pp_name + ":" + \ pp_passwd + "@" + \ broker_addr self.pp_pub_broker_url = "amqp://" + pp_pub_name + ":" + \ pp_pub_passwd + "@" + \ broker_addr self.pp_publisher = SimplePublisher(self.pp_pub_broker_url, "YAML") # Must be done before consumer threads are started # This is used for verifying message structure self._msg_auth = MessageAuthority() self.ocs_consumer = Consumer(ocs_broker_url, 'dmcs_ocs_publish', 'thread-ocs', self.on_ocs_message, 'YAML') self.ocs_consumer.start() self.ar_consumer = Consumer(ar_broker_url, 'ar_foreman_consume', 'thread-ar', self.on_ar_message, 'YAML') self.ar_consumer.start() self.pp_consumer = Consumer(pp_broker_url, 'pp_foreman_consume', 'thread-pp', self.on_pp_message, 'YAML') self.pp_consumer.start() ### call message sender and pass in ocs_publisher sleep(3) print("Test Setup Complete. Commencing Messages...") self.send_messages() sleep(3) self.verify_ocs_messages() sleep(3) self.verify_ar_messages() sleep(3) self.verify_pp_messages() sleep(2) self.ocs_consumer.stop() self.ocs_consumer.join() self.ar_consumer.stop() self.ar_consumer.join() self.pp_consumer.stop() self.pp_consumer.join() print("Finished with DMCS AR and PP tests.") def send_messages(self): print("Starting send_messages") # Tests both AR and PP devices self.EXPECTED_OCS_MESSAGES = 12 self.EXPECTED_AR_MESSAGES = 7 self.EXPECTED_PP_MESSAGES = 7 self.clear_message_lists() msg = {} msg['MSG_TYPE'] = "STANDBY" msg['DEVICE'] = 'AR' msg['CMD_ID'] = '16729948' msg['CFG_KEY'] = "2C16" msg['ACK_ID'] = 'AR_4' msg['ACK_DELAY'] = 2 time.sleep(1) print("AR STANDBY") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) msg = {} msg['MSG_TYPE'] = "STANDBY" msg['DEVICE'] = 'PP' msg['CMD_ID'] = '16729948' msg['CFG_KEY'] = "2C16" msg['ACK_ID'] = 'PP_7' msg['ACK_DELAY'] = 2 time.sleep(5) print("PP STANDBY") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) #msg = {} #msg['MSG_TYPE'] = "NEW_SESSION" #msg['SESSION_ID'] = 'SI_469976' #msg['ACK_ID'] = 'NEW_SESSION_ACK_44221' #msg['RESPONSE_QUEUE'] = "dmcs_ack_consume" ##time.sleep(1) ##self.ocs_publisher.publish_message("ar_foreman_consume", msg) msg = {} msg['MSG_TYPE'] = "DISABLE" msg['DEVICE'] = 'AR' msg['CMD_ID'] = '16729948' msg['ACK_ID'] = 'AR_6' msg['ACK_DELAY'] = 2 time.sleep(5) print("AR DISABLE") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) msg = {} msg['MSG_TYPE'] = "DISABLE" msg['DEVICE'] = 'PP' msg['CMD_ID'] = '16729948' msg['ACK_ID'] = 'PP_8' msg['ACK_DELAY'] = 2 time.sleep(5) print("PP DISABLE") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) # Make certain DMCS is doing proper bookkeeping sleep(6.5) assert self.dmcs.STATE_SCBD.get_archive_state() == 'DISABLE' assert self.dmcs.STATE_SCBD.get_prompt_process_state() == 'DISABLE' msg = {} msg['MSG_TYPE'] = "ENABLE" msg['DEVICE'] = 'AR' msg['CMD_ID'] = '16729948' msg['ACK_ID'] = 'AR_11' msg['ACK_DELAY'] = 2 time.sleep(5) print("AR ENABLE") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) msg = {} msg['MSG_TYPE'] = "ENABLE" msg['DEVICE'] = 'PP' msg['CMD_ID'] = '16729948' msg['ACK_ID'] = 'PP_12' msg['ACK_DELAY'] = 2 time.sleep(5) print("PP ENABLE") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) sleep(6.5) assert self.dmcs.STATE_SCBD.get_archive_state() == 'ENABLE' assert self.dmcs.STATE_SCBD.get_prompt_process_state() == 'ENABLE' msg = {} msg['MSG_TYPE'] = "NEXT_VISIT" msg['VISIT_ID'] = 'V_1443' msg['RESPONSE_QUEUE'] = "dmcs_ack_consume" msg['ACK_ID'] = 'NEW_VISIT_ACK_76' msg['BORE_SIGHT'] = "231,123786456342, -45.3457156906, FK5" time.sleep(5) print("Next Visit Message") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) sleep(3.5) assert self.dmcs.STATE_SCBD.get_current_visit() == 'V_1443' msg = {} msg['MSG_TYPE'] = "START_INTEGRATION" msg['IMAGE_ID'] = 'IMG_4276' msg['VISIT_ID'] = 'V_1443' msg['ACK_ID'] = 'START_INT_ACK_76' msg['RESPONSE_QUEUE'] = "dmcs_ack_consume" msg['CCD_LIST'] = self.ccd_list time.sleep(5) print("Start Integration Message") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) msg = {} msg['MSG_TYPE'] = "READOUT" msg['VISIT_ID'] = 'V_1443' msg['IMAGE_ID'] = 'IMG_4276' msg['IMAGE_SRC'] = 'MAIN' msg['RESPONSE_QUEUE'] = "dmcs_ack_consume" msg['ACK_ID'] = 'READOUT_ACK_77' time.sleep(5) print("READOUT Message") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) msg = {} msg['MSG_TYPE'] = "START_INTEGRATION" msg['IMAGE_ID'] = 'IMG_4277' msg['IMAGE_SRC'] = 'MAIN' msg['VISIT_ID'] = 'V_1443' msg['ACK_ID'] = 'START_INT_ACK_78' msg['RESPONSE_QUEUE'] = "dmcs_ack_consume" msg['CCD_LIST'] = self.ccd_list time.sleep(5) print("Start Integration Message") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) msg = {} msg['MSG_TYPE'] = "READOUT" msg['VISIT_ID'] = 'V_1443' msg['IMAGE_ID'] = 'IMG_4277' msg['IMAGE_SRC'] = 'MAIN' msg['RESPONSE_QUEUE'] = "dmcs_ack_consume" msg['ACK_ID'] = 'READOUT_ACK_79' time.sleep(5) print("READOUT Message") self.ocs_publisher.publish_message("ocs_dmcs_consume", msg) time.sleep(2) print("Message Sender done") def clear_message_lists(self): self.ocs_consumer_msg_list = [] self.ar_consumer_msg_list = [] self.pp_consumer_msg_list = [] def verify_ocs_messages(self): print("Messages received by verify_ocs_messages:") self.prp.pprint(self.ocs_consumer_msg_list) len_list = len(self.ocs_consumer_msg_list) if len_list != self.EXPECTED_OCS_MESSAGES: print("Messages received by verify_ocs_messages:") self.prp.pprint(self.ocs_consumer_msg_list) pytest.fail('OCS simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_OCS_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.ocs_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: pytest.fail( "The following OCS Bridge response message failed when compared with the sovereign example: %s" % msg) print("Responses to OCS Bridge pass verification.") def verify_ar_messages(self): print("Messages received by verify_ar_messages:") self.prp.pprint(self.ar_consumer_msg_list) len_list = len(self.ar_consumer_msg_list) if len_list != self.EXPECTED_AR_MESSAGES: print("Messages received by verify_ar_messages:") self.prp.pprint(self.ar_consumer_msg_list) pytest.fail('AR simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_AR_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.ar_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: pytest.fail( "The following message to the AR failed when compared with the sovereign example: %s" % msg) print("Messages to the AR pass verification.") def verify_pp_messages(self): print("Messages received by verify_pp_messages:") self.prp.pprint(self.pp_consumer_msg_list) len_list = len(self.pp_consumer_msg_list) if len_list != self.EXPECTED_PP_MESSAGES: print("Messages received by verify_pp_messages:") self.prp.pprint(self.pp_consumer_list) pytest.fail('PP simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_PP_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.pp_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: pytest.fail( "The following message to the PP device failed when compared with the sovereign example: %s" % msg) print("Messages to the PP device pass verification.") def on_ocs_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) self.ocs_consumer_msg_list.append(body) def on_ar_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) self.ar_consumer_msg_list.append(body) def on_pp_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) self.pp_consumer_msg_list.append(body)
class TestAtDev: dmcs_pub_broker_url = None dmcs_publisher = None dmcs_consumer = None dmcs_consumer_msg_list = [] at_ctrl_pub_broker_url = None at_ctrl_publisher = None at_ctrl_consumer = None at_ctrl_consumer_msg_list = [] F99_pub_broker_url = None F99_publisher = None F99_consumer = None f99_consumer_msg_list = [] EXPECTED_AR_CTRL_MESSAGES = 1 EXPECTED_DMCS_MESSAGES = 1 EXPECTED_F99_MESSAGES = 1 ccd_list = [14, 17, 21.86] prp = toolsmod.prp DP = toolsmod.DP # Debug Printing either True or False...override for this file only... def test_atdev(self, Atdev): self.atdev = Atdev try: cdm = toolsmod.intake_yaml_file( 'tests/yaml/L1SystemCfg_Test_at.yaml') except IOError as e: trace = traceback.print_exc() emsg = "Unable to find CFG Yaml file %s\n" % self._config_file print(emsg + trace) raise raft_dict = cdm[ROOT]['DEFAULT_RAFT_CONFIGURATION'] broker_addr = cdm[ROOT]['BASE_BROKER_ADDR'] dmcs_name = cdm[ROOT]['DMCS_BROKER_NAME'] dmcs_passwd = cdm[ROOT]['DMCS_BROKER_PASSWD'] dmcs_pub_name = cdm[ROOT]['DMCS_BROKER_PUB_NAME'] dmcs_pub_passwd = cdm[ROOT]['DMCS_BROKER_PUB_PASSWD'] dmcs_broker_url = "amqp://" + dmcs_name + ":" + \ dmcs_passwd + "@" + \ broker_addr dmcs_pub_broker_url = "amqp://" + dmcs_pub_name + ":" + \ dmcs_pub_passwd + "@" + \ broker_addr print("Opening publisher with this URL string: %s" % dmcs_pub_broker_url) self.dmcs_publisher = SimplePublisher(dmcs_pub_broker_url, "YAML") """ ar_ctrl_name = cdm[ROOT]['ARCHIVE_BROKER_NAME'] ar_ctrl_passwd = cdm[ROOT]['ARCHIVE_BROKER_PASSWD'] ar_ctrl_pub_name = cdm[ROOT]['ARCHIVE_BROKER_PUB_NAME'] ar_ctrl_pub_passwd = cdm[ROOT]['ARCHIVE_BROKER_PUB_PASSWD'] ar_ctrl_broker_url = "amqp://" + ar_ctrl_name + ":" + \ ar_ctrl_passwd + "@" + \ broker_addr ar_ctrl_pub_broker_url = "amqp://" + ar_ctrl_pub_name + ":" + \ ar_ctrl_pub_passwd + "@" + \ broker_addr print("Opening publisher with this URL string: %s" % ar_ctrl_pub_broker_url) self.ar_ctrl_publisher = SimplePublisher(ar_ctrl_pub_broker_url, "YAML") """ F99_name = 'F99' F99_passwd = 'F99' F99_pub_name = 'F99_PUB' F99_pub_passwd = 'F99_PUB' F99_broker_url = "amqp://" + F99_name + ":" + \ F99_passwd + "@" + \ broker_addr F99_pub_broker_url = "amqp://" + F99_pub_name + ":" + \ F99_pub_passwd + "@" + \ broker_addr print("Opening publisher with this URL string: %s" % F99_pub_broker_url) self.F99_publisher = SimplePublisher(F99_pub_broker_url, "YAML") print("All publishers are running...") # Must be done before consumer threads are started # This is used for verifying message structure self._msg_auth = MessageAuthority() print("MessageAuthority running...") self.dmcs_consumer = Consumer(dmcs_broker_url, 'dmcs_ack_consume', 'thread-dmcs', self.on_dmcs_message, 'YAML') self.dmcs_consumer.start() print("DMCS Consumer running...") """ self.ar_ctrl_consumer = Consumer(ar_ctrl_broker_url,'archive_ctrl_consume', 'thread-ar-ctrl', self.on_ar_ctrl_message,'YAML') self.ar_ctrl_consumer.start() print("ar_ctrl Consumer running...") """ self.F99_consumer = Consumer(F99_broker_url, 'f99_consume', 'thread-f99', self.on_f99_message, 'YAML') self.F99_consumer.start() print("F99 Consumer running...") sleep(3) print("Test Setup Complete. Commencing Messages...") self.send_messages() sleep(8) self.verify_dmcs_messages() self.verify_F99_messages() #self.verify_ar_ctrl_messages() sleep(3) # Shut down consumer threads nicely self.dmcs_consumer.stop() self.dmcs_consumer.join() #self.ar_ctrl_consumer.stop() #self.ar_ctrl_consumer.join() self.F99_consumer.stop() self.F99_consumer.join() if self.DP: print("Finished with AT tests.") def send_messages(self): LOGGER.warning('In on_f99_message handler') print("Starting send_messages") # Tests only an AT device self.EXPECTED_AR_CTRL_MESSAGES = 2 self.EXPECTED_DMCS_MESSAGES = 2 self.EXPECTED_F99_MESSAGES = 4 """ msg = {} msg['MSG_TYPE'] = "AT_NEW_SESSION" msg['SESSION_ID'] = 'SI_469976' msg['ACK_ID'] = 'AT_NEW_SESSION_ACK_44221' msg['REPLY_QUEUE'] = 'dmcs_ack_consume' #time.sleep(2) time.sleep(12) print("New Session Message") self.dmcs_publisher.publish_message("at_foreman_consume", msg) """ LOGGER.warning('About to send start_int') msg = {} msg['MSG_TYPE'] = "AT_START_INTEGRATION" msg['JOB_NUM'] = '4xx72' msg['IMAGE_ID'] = 'IMG_444245' msg['IMAGE_INDEX'] = 2 msg['IMAGE_SEQUENCE_NAME'] = 'XX_seq' msg['IMAGES_IN_SEQUENCE'] = 8 msg['SESSION_ID'] = 'SI_469976' msg['REPLY_QUEUE'] = 'dmcs_ack_consume' msg['ACK_ID'] = 'NEW_VISIT_ACK_76' msg['RAFT_LIST'] = ['WFS_RAFT'] msg['RAFT_CCD_LIST'] = [['WFS_CCD']] time.sleep(12) LOGGER.warning('Here comes start_int message') print("Start Integration Message") self.dmcs_publisher.publish_message("at_foreman_consume", msg) LOGGER.warning('Just after publishing start_int message') #time.sleep(3) time.sleep(8) msg = {} msg['MSG_TYPE'] = "AT_END_READOUT" msg['JOB_NUM'] = '4xx72' msg['SESSION_ID'] = 'SI_469976' msg['IMAGE_ID'] = 'IMG_444245' msg['IMAGE_INDEX'] = 2 msg['IMAGE_SEQUENCE_NAME'] = 'XX_seq' msg['IMAGES_IN_SEQUENCE'] = 8 msg['REPLY_QUEUE'] = 'dmcs_ack_consume' msg['ACK_ID'] = 'AT_ACK_94671' #time.sleep(11) #time.sleep(3) print("AT END READOUT Message") self.dmcs_publisher.publish_message("at_foreman_consume", msg) time.sleep(5) msg = {} msg['MSG_TYPE'] = "AT_HEADER_READY" msg['IMAGE_ID'] = 'IMG_444245' msg['FILENAME'] = '/mnt/headers' msg['ACK_ID'] = 'AT_ACK_1444' msg['REPLY_QUEUE'] = 'dmcs_ack_consume' print("AT HEADER_READY Message") self.dmcs_publisher.publish_message("at_foreman_consume", msg) time.sleep(2) print("Message Sender done") def verify_dmcs_messages(self): len_list = len(self.dmcs_consumer_msg_list) print("DMCS RECEIVED %s MESSAGES" % len_list) if len_list != self.EXPECTED_DMCS_MESSAGES: print("Incorrect number of DMCS messages received") pytest.fail('DMCS simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_DMCS_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.dmcs_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: print("This DMCS message failed verification: ") self.prp.pprint(msg) pytest.fail( "The following DMCS Bridge response message failed when compared with the sovereign example: %s" % msg) print("Responses to DMCS Bridge pass verification.") def verify_ar_ctrl_messages(self): len_list = len(self.ar_ctrl_consumer_msg_list) print("AR_CTRL RECEIVED %s MESSAGES" % len_list) if len_list != self.EXPECTED_AR_CTRL_MESSAGES: print("Incorrect number of AR_CTRL messages received") pytest.fail('AR CTRL simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_AR_CTRL_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.ar_ctrl_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: print("This AR_CTRL message failed verification: ") self.prp.pprint(msg) pytest.fail( "The following message to the AR CTRL failed when compared with the sovereign example: %s" % msg) print("Messages to the AR CTRL pass verification.") def verify_F99_messages(self): len_list = len(self.f99_consumer_msg_list) print("Number of messages is: %s" % len_list) if len_list != self.EXPECTED_F99_MESSAGES: print("Incorrect number of F99 messages received") pytest.fail('F99 simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_F99_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.f99_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: print("This F99 message failed verification: ") self.prp.pprint(msg) pytest.fail( "The following message to F99 failed when compared with the sovereign example: %s" % msg) print("Messages to F99 pass verification.") def on_dmcs_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) self.dmcs_consumer_msg_list.append(body) def on_ar_ctrl_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) self.ar_ctrl_consumer_msg_list.append(body) if body['MSG_TYPE'] == 'NEW_ARCHIVE_ITEM': msg = {} msg['MSG_TYPE'] = 'NEW_ARCHIVE_ITEM_ACK' msg['COMPONENT'] = 'ARCHIVE_CTRL' msg['ACK_ID'] = body['ACK_ID'] msg['ACK_BOOL'] = True msg['TARGET_LOCATION'] = '/tmp' self.ar_ctrl_publisher.publish_message(body['REPLY_QUEUE'], msg) elif body['MSG_TYPE'] == 'AR_ITEMS_XFERD': msg = {} msg['MSG_TYPE'] = 'AR_ITEMS_XFERD_ACK' msg['COMPONENT'] = 'ARCHIVE_CTRL' msg['ACK_ID'] = body['ACK_ID'] msg['ACK_BOOL'] = True filename_list = body['RESULT_SET']['FILENAME_LIST'] msg['RESULT_SET'] = {} msg['RESULT_SET']['IMAGE_ID_LIST'] = body['RESULT_SET'][ 'IMAGE_ID_LIST'] msg['RESULT_SET']['RECEIPT_LIST'] = [] msg['RESULT_SET']['FILENAME_LIST'] = filename_list RECEIPT_LIST = [] for filename in filename_list: RECEIPT_LIST.append('x14_' + str(filename)) msg['RESULT_LIST']['RECEIPT_LIST'] = RECEIPT_LIST self.ar_ctrl_publisher.publish_message(body['REPLY_QUEUE'], msg) else: pytest.fail( "The following unknown message was received by the Archive CTRL: %s" % body) def on_f99_message(self, ch, method, properties, body): LOGGER.debug("Inside on_f99_message......") print("Inside on_f99_message test handler........") ch.basic_ack(method.delivery_tag) self.f99_consumer_msg_list.append(body) if body['MSG_TYPE'] == 'AT_FWDR_HEALTH_CHECK': LOGGER.debug( 'Message received by health check test code. body is: %s', pformat(str(body))) msg = {} msg['MSG_TYPE'] = 'AT_FWDR_HEALTH_CHECK_ACK' msg['COMPONENT'] = 'FORWARDER_99' msg['ACK_BOOL'] = True msg['ACK_ID'] = body['ACK_ID'] if self.DP: print( "In test - on_f99_message health check - sending ack: %s" % msg) self.F99_publisher.publish_message(body['REPLY_QUEUE'], msg) elif body['MSG_TYPE'] == 'AT_FWDR_XFER_PARAMS': msg = {} msg['MSG_TYPE'] = 'AT_FWDR_XFER_PARAMS_ACK' msg['COMPONENT'] = 'FORWARDER_99' msg['ACK_BOOL'] = True msg['ACK_ID'] = body['ACK_ID'] self.F99_publisher.publish_message(body['REPLY_QUEUE'], msg) elif body['MSG_TYPE'] == 'AT_FWDR_HEADER_READY': # No need to ACK pass elif body['MSG_TYPE'] == 'AT_FWDR_END_READOUT': LOGGER.warning("Inside on_f99_message AT_FWDR_END_READOUT case...") xfer_msg = None image_id = body['IMAGE_ID'] for msg in self.f99_consumer_msg_list: if msg['MSG_TYPE'] == 'AT_FWDR_XFER_PARAMS': xfer_msg = msg if xfer_msg == None: LOGGER.warning( "The AT_FWDR_XFER_PARAMS message was not received before AT_FWDR_READOUT in F99" ) fail_msg = "The AT_FWDR_XFER_PARAMS message was not received before AT_FWDR_READOUT in F99" pytest.fail("\n".join(fail_msg), pytrace=True) # use message to build response msg = {} msg['MSG_TYPE'] = 'AT_FWDR_END_READOUT_ACK' msg['COMPONENT'] = 'FORWARDER_99' msg['JOB_NUM'] = body['JOB_NUM'] msg['SESSION_ID'] = body['SESSION_ID'] msg['ACK_ID'] = body['ACK_ID'] msg['ACK_BOOL'] = True msg['RESULT_SET'] = {} msg['RESULT_SET']['FILENAME_LIST'] = [] msg['RESULT_SET']['CHECKSUM_LIST'] = [] RAFT_PLUS_CCD_LIST = [] FILENAME_LIST = [] CHECKSUM_LIST = [] target_location = xfer_msg['TARGET_LOCATION'] FILENAME_LIST.append(target_location + "/" + image_id + ".fits") CHECKSUM_LIST.append('XXXXFFFF4444$$$$') msg['RESULT_SET']['FILENAME_LIST'] = FILENAME_LIST msg['RESULT_SET']['CHECKSUM_LIST'] = CHECKSUM_LIST self.F99_publisher.publish_message(body['REPLY_QUEUE'], msg) else: pytest.fail( "The following unknown message was received by FWDR F99: %s" % body) def convert_raftdict_to_name_list(self, rdict): raft_list = list(rdict.keys()) num_rafts = len(raft_list) integrated_names_list = [] for i in range(0, num_rafts): current_raft = raft_list[i] ccd_list = [] ccd_list = rdict[current_raft] if ccd_list[0] == 'ALL': ccd_list = [ '00', '10', '20', '01', '11', '21', '02', '12', '22' ] num_current_ccds = len(ccd_list) for j in range(0, num_current_ccds): tmp_str = current_raft + '-' + ccd_list[j] integrated_names_list.append(tmp_str) return integrated_names_list def convert_raft_and_ccd_list_to_name_list(self, raft_list, raft_ccd_list): #raft_list = list(rdict.keys()) num_rafts = len(raft_list) integrated_names_list = [] for i in range(0, num_rafts): current_raft = raft_list[i] ccd_list = [] ccd_list = raft_ccd_list[i] if ccd_list[0] == 'ALL': ccd_list = [ '00', '10', '20', '01', '11', '21', '02', '12', '22' ] num_current_ccds = len(ccd_list) for j in range(0, num_current_ccds): tmp_str = current_raft + '-' + ccd_list[j] integrated_names_list.append(tmp_str) return integrated_names_list
class TestAtDev: dmcs_pub_broker_url = None dmcs_publisher = None dmcs_consumer = None dmcs_consumer_msg_list = [] at_ctrl_pub_broker_url = None at_ctrl_publisher = None at_ctrl_consumer = None at_ctrl_consumer_msg_list = [] F99_pub_broker_url = None F99_publisher = None F99_consumer = None f99_consumer_msg_list = [] EXPECTED_AR_CTRL_MESSAGES = 1 EXPECTED_DMCS_MESSAGES = 1 EXPECTED_F99_MESSAGES = 1 ccd_list = [14,17,21.86] prp = toolsmod.prp DP = toolsmod.DP # Debug Printing either True or False...override for this file only... def test_atdev(self, Atdev): self.atdev = Atdev try: cdm = toolsmod.intake_yaml_file('tests/yaml/L1SystemCfg_Test_at.yaml') except IOError as e: trace = traceback.print_exc() emsg = "Unable to find CFG Yaml file %s\n" % self._config_file print(emsg + trace) raise raft_dict = cdm[ROOT]['DEFAULT_RAFT_CONFIGURATION'] broker_addr = cdm[ROOT]['BASE_BROKER_ADDR'] dmcs_name = cdm[ROOT]['DMCS_BROKER_NAME'] dmcs_passwd = cdm[ROOT]['DMCS_BROKER_PASSWD'] dmcs_pub_name = cdm[ROOT]['DMCS_BROKER_PUB_NAME'] dmcs_pub_passwd = cdm[ROOT]['DMCS_BROKER_PUB_PASSWD'] dmcs_broker_url = "amqp://" + dmcs_name + ":" + \ dmcs_passwd + "@" + \ broker_addr dmcs_pub_broker_url = "amqp://" + dmcs_pub_name + ":" + \ dmcs_pub_passwd + "@" + \ broker_addr print("Opening publisher with this URL string: %s" % dmcs_pub_broker_url) self.dmcs_publisher = SimplePublisher(dmcs_pub_broker_url, "YAML") """ ar_ctrl_name = cdm[ROOT]['ARCHIVE_BROKER_NAME'] ar_ctrl_passwd = cdm[ROOT]['ARCHIVE_BROKER_PASSWD'] ar_ctrl_pub_name = cdm[ROOT]['ARCHIVE_BROKER_PUB_NAME'] ar_ctrl_pub_passwd = cdm[ROOT]['ARCHIVE_BROKER_PUB_PASSWD'] ar_ctrl_broker_url = "amqp://" + ar_ctrl_name + ":" + \ ar_ctrl_passwd + "@" + \ broker_addr ar_ctrl_pub_broker_url = "amqp://" + ar_ctrl_pub_name + ":" + \ ar_ctrl_pub_passwd + "@" + \ broker_addr print("Opening publisher with this URL string: %s" % ar_ctrl_pub_broker_url) self.ar_ctrl_publisher = SimplePublisher(ar_ctrl_pub_broker_url, "YAML") """ F99_name = 'F99' F99_passwd = 'F99' F99_pub_name = 'F99_PUB' F99_pub_passwd = 'F99_PUB' F99_broker_url = "amqp://" + F99_name + ":" + \ F99_passwd + "@" + \ broker_addr F99_pub_broker_url = "amqp://" + F99_pub_name + ":" + \ F99_pub_passwd + "@" + \ broker_addr print("Opening publisher with this URL string: %s" % F99_pub_broker_url) self.F99_publisher = SimplePublisher(F99_pub_broker_url, "YAML") print("All publishers are running...") # Must be done before consumer threads are started # This is used for verifying message structure self._msg_auth = MessageAuthority() print("MessageAuthority running...") self.dmcs_consumer = Consumer(dmcs_broker_url,'dmcs_ack_consume', 'thread-dmcs', self.on_dmcs_message,'YAML') self.dmcs_consumer.start() print("DMCS Consumer running...") """ self.ar_ctrl_consumer = Consumer(ar_ctrl_broker_url,'archive_ctrl_consume', 'thread-ar-ctrl', self.on_ar_ctrl_message,'YAML') self.ar_ctrl_consumer.start() print("ar_ctrl Consumer running...") """ self.F99_consumer = Consumer(F99_broker_url,'f99_consume', 'thread-f99', self.on_f99_message,'YAML') self.F99_consumer.start() print("F99 Consumer running...") sleep(3) print("Test Setup Complete. Commencing Messages...") self.send_messages() sleep(8) self.verify_dmcs_messages() self.verify_F99_messages() #self.verify_ar_ctrl_messages() sleep(3) # Shut down consumer threads nicely self.dmcs_consumer.stop() self.dmcs_consumer.join() #self.ar_ctrl_consumer.stop() #self.ar_ctrl_consumer.join() self.F99_consumer.stop() self.F99_consumer.join() if self.DP: print("Finished with AT tests.") def send_messages(self): LOGGER.warning('In on_f99_message handler') print("Starting send_messages") # Tests only an AT device self.EXPECTED_AR_CTRL_MESSAGES = 2 self.EXPECTED_DMCS_MESSAGES = 2 self.EXPECTED_F99_MESSAGES = 4 """ msg = {} msg['MSG_TYPE'] = "AT_NEW_SESSION" msg['SESSION_ID'] = 'SI_469976' msg['ACK_ID'] = 'AT_NEW_SESSION_ACK_44221' msg['REPLY_QUEUE'] = 'dmcs_ack_consume' #time.sleep(2) time.sleep(12) print("New Session Message") self.dmcs_publisher.publish_message("at_foreman_consume", msg) """ LOGGER.warning('About to send start_int') msg = {} msg['MSG_TYPE'] = "AT_START_INTEGRATION" msg['JOB_NUM'] = '4xx72' msg['IMAGE_ID'] = 'IMG_444245' msg['IMAGE_INDEX'] = 2 msg['IMAGE_SEQUENCE_NAME'] = 'XX_seq' msg['IMAGES_IN_SEQUENCE'] = 8 msg['SESSION_ID'] = 'SI_469976' msg['REPLY_QUEUE'] = 'dmcs_ack_consume' msg['ACK_ID'] = 'NEW_VISIT_ACK_76' msg['RAFT_LIST'] = ['WFS_RAFT'] msg['RAFT_CCD_LIST'] = [['WFS_CCD']] time.sleep(12) LOGGER.warning('Here comes start_int message') print("Start Integration Message") self.dmcs_publisher.publish_message("at_foreman_consume", msg) LOGGER.warning('Just after publishing start_int message') #time.sleep(3) time.sleep(8) msg = {} msg['MSG_TYPE'] = "AT_END_READOUT" msg['JOB_NUM'] = '4xx72' msg['SESSION_ID'] = 'SI_469976' msg['IMAGE_ID'] = 'IMG_444245' msg['IMAGE_INDEX'] = 2 msg['IMAGE_SEQUENCE_NAME'] = 'XX_seq' msg['IMAGES_IN_SEQUENCE'] = 8 msg['REPLY_QUEUE'] = 'dmcs_ack_consume' msg['ACK_ID'] = 'AT_ACK_94671' #time.sleep(11) #time.sleep(3) print("AT END READOUT Message") self.dmcs_publisher.publish_message("at_foreman_consume", msg) time.sleep(5) msg = {} msg['MSG_TYPE'] = "AT_HEADER_READY" msg['IMAGE_ID'] = 'IMG_444245' msg['FILENAME'] = '/mnt/headers' msg['ACK_ID'] = 'AT_ACK_1444' msg['REPLY_QUEUE'] = 'dmcs_ack_consume' print("AT HEADER_READY Message") self.dmcs_publisher.publish_message("at_foreman_consume", msg) time.sleep(2) print("Message Sender done") def verify_dmcs_messages(self): len_list = len(self.dmcs_consumer_msg_list) print("DMCS RECEIVED %s MESSAGES" % len_list) if len_list != self.EXPECTED_DMCS_MESSAGES: print("Incorrect number of DMCS messages received") pytest.fail('DMCS simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_DMCS_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.dmcs_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: print("This DMCS message failed verification: ") self.prp.pprint(msg) pytest.fail("The following DMCS Bridge response message failed when compared with the sovereign example: %s" % msg) print("Responses to DMCS Bridge pass verification.") def verify_ar_ctrl_messages(self): len_list = len(self.ar_ctrl_consumer_msg_list) print("AR_CTRL RECEIVED %s MESSAGES" % len_list) if len_list != self.EXPECTED_AR_CTRL_MESSAGES: print("Incorrect number of AR_CTRL messages received") pytest.fail('AR CTRL simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_AR_CTRL_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.ar_ctrl_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: print("This AR_CTRL message failed verification: ") self.prp.pprint(msg) pytest.fail("The following message to the AR CTRL failed when compared with the sovereign example: %s" % msg) print("Messages to the AR CTRL pass verification.") def verify_F99_messages(self): len_list = len(self.f99_consumer_msg_list) print("Number of messages is: %s" % len_list) if len_list != self.EXPECTED_F99_MESSAGES: print("Incorrect number of F99 messages received") pytest.fail('F99 simulator received incorrect number of messages.\nExpected %s but received %s'\ % (self.EXPECTED_F99_MESSAGES, len_list)) # Now check num keys in each message first, then check for key errors for i in range(0, len_list): msg = self.f99_consumer_msg_list[i] result = self._msg_auth.check_message_shape(msg) if result == False: print("This F99 message failed verification: ") self.prp.pprint(msg) pytest.fail("The following message to F99 failed when compared with the sovereign example: %s" % msg) print("Messages to F99 pass verification.") def on_dmcs_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) self.dmcs_consumer_msg_list.append(body) def on_ar_ctrl_message(self, ch, method, properties, body): ch.basic_ack(method.delivery_tag) self.ar_ctrl_consumer_msg_list.append(body) if body['MSG_TYPE'] == 'NEW_ARCHIVE_ITEM': msg = {} msg['MSG_TYPE'] = 'NEW_ARCHIVE_ITEM_ACK' msg['COMPONENT'] = 'ARCHIVE_CTRL' msg['ACK_ID'] = body['ACK_ID'] msg['ACK_BOOL'] = True msg['TARGET_LOCATION'] = '/tmp' self.ar_ctrl_publisher.publish_message(body['REPLY_QUEUE'], msg) elif body['MSG_TYPE'] == 'AR_ITEMS_XFERD': msg = {} msg['MSG_TYPE'] = 'AR_ITEMS_XFERD_ACK' msg['COMPONENT'] = 'ARCHIVE_CTRL' msg['ACK_ID'] = body['ACK_ID'] msg['ACK_BOOL'] = True filename_list = body['RESULT_SET']['FILENAME_LIST'] msg['RESULT_SET'] = {} msg['RESULT_SET']['IMAGE_ID_LIST'] = body['RESULT_SET']['IMAGE_ID_LIST'] msg['RESULT_SET']['RECEIPT_LIST'] = [] msg['RESULT_SET']['FILENAME_LIST'] = filename_list RECEIPT_LIST = [] for filename in filename_list: RECEIPT_LIST.append('x14_' + str(filename)) msg['RESULT_LIST']['RECEIPT_LIST'] = RECEIPT_LIST self.ar_ctrl_publisher.publish_message(body['REPLY_QUEUE'], msg) else: pytest.fail("The following unknown message was received by the Archive CTRL: %s" % body) def on_f99_message(self, ch, method, properties, body): LOGGER.debug("Inside on_f99_message......") print("Inside on_f99_message test handler........") ch.basic_ack(method.delivery_tag) self.f99_consumer_msg_list.append(body) if body['MSG_TYPE'] == 'AT_FWDR_HEALTH_CHECK': LOGGER.debug('Message received by health check test code. body is: %s', pformat(str(body))) msg = {} msg['MSG_TYPE'] = 'AT_FWDR_HEALTH_CHECK_ACK' msg['COMPONENT'] = 'FORWARDER_99' msg['ACK_BOOL'] = True msg['ACK_ID'] = body['ACK_ID'] if self.DP: print("In test - on_f99_message health check - sending ack: %s" % msg) self.F99_publisher.publish_message(body['REPLY_QUEUE'], msg) elif body['MSG_TYPE'] == 'AT_FWDR_XFER_PARAMS': msg = {} msg['MSG_TYPE'] = 'AT_FWDR_XFER_PARAMS_ACK' msg['COMPONENT'] = 'FORWARDER_99' msg['ACK_BOOL'] = True msg['ACK_ID'] = body['ACK_ID'] self.F99_publisher.publish_message(body['REPLY_QUEUE'], msg) elif body['MSG_TYPE'] == 'AT_FWDR_HEADER_READY': # No need to ACK pass elif body['MSG_TYPE'] == 'AT_FWDR_END_READOUT': LOGGER.warning("Inside on_f99_message AT_FWDR_END_READOUT case...") xfer_msg = None image_id = body['IMAGE_ID'] for msg in self.f99_consumer_msg_list: if msg['MSG_TYPE'] == 'AT_FWDR_XFER_PARAMS': xfer_msg = msg if xfer_msg == None: LOGGER.warning("The AT_FWDR_XFER_PARAMS message was not received before AT_FWDR_READOUT in F99") fail_msg = "The AT_FWDR_XFER_PARAMS message was not received before AT_FWDR_READOUT in F99" pytest.fail("\n".join(fail_msg), pytrace=True) # use message to build response msg = {} msg['MSG_TYPE'] = 'AT_FWDR_END_READOUT_ACK' msg['COMPONENT'] = 'FORWARDER_99' msg['JOB_NUM'] = body['JOB_NUM'] msg['SESSION_ID'] = body['SESSION_ID'] msg['ACK_ID'] = body['ACK_ID'] msg['ACK_BOOL'] = True msg['RESULT_SET'] = {} msg['RESULT_SET']['FILENAME_LIST'] = [] msg['RESULT_SET']['CHECKSUM_LIST'] = [] RAFT_PLUS_CCD_LIST = [] FILENAME_LIST = [] CHECKSUM_LIST = [] target_location = xfer_msg['TARGET_LOCATION'] FILENAME_LIST.append(target_location + "/" + image_id + ".fits") CHECKSUM_LIST.append('XXXXFFFF4444$$$$') msg['RESULT_SET']['FILENAME_LIST'] = FILENAME_LIST msg['RESULT_SET']['CHECKSUM_LIST'] = CHECKSUM_LIST self.F99_publisher.publish_message(body['REPLY_QUEUE'], msg) else: pytest.fail("The following unknown message was received by FWDR F99: %s" % body) def convert_raftdict_to_name_list(self, rdict): raft_list = list(rdict.keys()) num_rafts = len(raft_list) integrated_names_list = [] for i in range(0,num_rafts): current_raft = raft_list[i] ccd_list = [] ccd_list = rdict[current_raft] if ccd_list[0] == 'ALL': ccd_list = ['00','10','20','01','11','21','02','12','22'] num_current_ccds = len(ccd_list) for j in range(0,num_current_ccds): tmp_str = current_raft + '-' + ccd_list[j] integrated_names_list.append(tmp_str) return integrated_names_list def convert_raft_and_ccd_list_to_name_list(self, raft_list, raft_ccd_list): #raft_list = list(rdict.keys()) num_rafts = len(raft_list) integrated_names_list = [] for i in range(0,num_rafts): current_raft = raft_list[i] ccd_list = [] ccd_list = raft_ccd_list[i] if ccd_list[0] == 'ALL': ccd_list = ['00','10','20','01','11','21','02','12','22'] num_current_ccds = len(ccd_list) for j in range(0,num_current_ccds): tmp_str = current_raft + '-' + ccd_list[j] integrated_names_list.append(tmp_str) return integrated_names_list