コード例 #1
0
ファイル: Driver.py プロジェクト: Harry73/IGVC2017
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.")
コード例 #2
0
ファイル: Driver.py プロジェクト: Harry73/IGVC2017
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.")
コード例 #3
0
ファイル: test_pp_dev.py プロジェクト: lsst/ctrl_iip
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)
コード例 #4
0
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)
コード例 #5
0
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
コード例 #6
0
ファイル: test_ncsa.py プロジェクト: lsst/ctrl_iip
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)
コード例 #7
0
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)
コード例 #8
0
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)
コード例 #9
0
ファイル: test_dmcs-at.py プロジェクト: lsst/ctrl_iip
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)
コード例 #10
0
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)
コード例 #11
0
ファイル: test_dmcs-ar_pp.py プロジェクト: lsst/ctrl_iip
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)
コード例 #12
0
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)
コード例 #13
0
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
コード例 #14
0
ファイル: test_at_dev.py プロジェクト: lsst/ctrl_iip
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