def handle_response_message_type_verify(self, msg_group, response_msg_type, message): """ """ # check response message type if (msg_group == event.EVENT_RPC_GROUP): if not DUTqueue.WAIT_RPC_RESPONSE_POST_FALG: if ((self.msg_type + 1) == response_msg_type or (self.msg_type + 2) == response_msg_type): return True else: return False tmp_obj = message.get(event.KEY_OBJECT) strio = StringIO(tmp_obj) tmp_msg_key_obj = pickle.load(strio) if not (isinstance(tmp_msg_key_obj, event.MsgUserRpcCheck)): return False tmp_event_request = tmp_msg_key_obj.event_rqst #log.debug_info(response_msg_type) log.debug_info("request message=%s" % event.get_event_desc(self.msg_type)) log.debug_info("response message=%s" % event.get_event_desc(tmp_event_request)) if (response_msg_type == event.EV_RPC_CHECK_RSP): if (self.msg_type == tmp_event_request): return True else: return False elif (response_msg_type == event.EV_RPC_CHECK_FAIL): return False else: return False elif (msg_group == event.EVENT_QUERY_GROUP or msg_group == event.EVENT_CONFIGURE_GROUP or msg_group == event.EVENT_WORKLIST_GROUP): if ((self.msg_type + 1) == response_msg_type or (self.msg_type + 2) == response_msg_type): return True else: return False return False
def send_event(self, queue_type, message, conn): """ 处理消息请求,并将消息分发到具体的功能服务器。 """ err_info = ("(Request from client %s)DUTQueue send_event message(%s)" % (ResponseClientHandle.get_client_ipaddress(conn), event.get_event_desc(message.get(event.KEY_MESSAGE)))) log.debug_info(err_info) #查询消息队列查询消息节点 if self.DUT_QUEUE_MODULE_TYPE_QUERY == queue_type: msg_type = message.get(event.KEY_MESSAGE) if msg_type == event.EV_WORKLIST_DOWNLOAD_RQST: RequestClientHandle.send_event_to_WLserver(self, message, conn) elif msg_type == event.EV_WORKLIST_EXEC_FINISH_RQST: RequestClientHandle.send_event_to_acsserver( self, message, conn, True) else: RequestClientHandle.send_event_to_acsserver( self, message, conn) #请求消息队列消息节点 elif self.DUT_QUEUE_MODULE_TYPE_REQUEST == queue_type: if not WAIT_RPC_RESPONSE_POST_FALG: RequestClientHandle.send_event_to_acsserver( self, message, conn, True) else: msg_group = int(message.get(event.KEY_MESSAGE)) & 0xFF00 if msg_group == event.EVENT_RPC_GROUP: self.send_event_rpc_methond(message, conn) else: RequestClientHandle.send_event_to_acsserver( self, message, conn, True) #工单RPC消息队列消息节点 elif self.DUT_QUEUE_MODULE_TYPE_WL_REQUEST == queue_type: if not WAIT_RPC_RESPONSE_POST_FALG: RequestClientHandle.send_event_to_acsserver( self, message, conn, True) else: self.send_event_rpc_methond(message, conn) else: pass return
def handle_event_acsserver2agent(self, msg_type, msg_priority_level, request, msg_key_sender): """ 分发从ACS端来的消息,消息来源分为执行逻辑工单和RPC方法响应。 """ if not (event.KEY_SENDER_ACS == msg_key_sender): return False msg_group = int(msg_type) & 0xFF00 if (msg_group == event.EVENT_WORKLIST_GROUP): #特殊处理从ACS端来的请求执行工单消息 if msg_type == event.EV_WORKLIST_EXECUTE_RQST: log.debug_info( "(Request from client %s)Agent response ACS's exec worklist request event" % ResponseClientHandle.get_client_ipaddress(request[1])) self.intercept_client_worklist_execute_post(msg_type, request) #dispath event to query_queue or request_queue self.dispath_event_to_normal(msg_type, msg_priority_level, request) else: return False elif (msg_group == event.EVENT_RPC_GROUP): #特殊处理从ACS端来的RPC响应消息 if not WAIT_RPC_RESPONSE_POST_FALG: return True #[step-1] message = request[0] conn = request[1] if not self.rpc_request_node_message: log.debug_err( "(Request from client %s)DUTQueue not found running rpc request" % ResponseClientHandle.get_client_ipaddress(request[1])) dict_ret = {} dict_ret[ 'str_result'] = "DUTQueue not found running rpc request" dict_ret['dict_data'] = {} ResponseClientHandle.handle_send_rpc_check_toACS_request_reponse( message, conn, True, dict_ret) return True #防止RPC线程在服务器返回信息以后,由于处理时间差仍然超时的问题。 #add by wangjun 20130627 self.reset_check_rpc_status_totalcount() log.debug_err("Reset check_RPC_status_totalcount=%d" % self.check_RPC_status_totalcount) #[step-2] # check response from ACS server's(client rpc request) tmp_request_msg_type = self.rpc_request_node_message[0].get( event.KEY_MESSAGE) log.debug_info( "(Request from client %s)ACS server's rpc response RPC request(message=%s)" % (ResponseClientHandle.get_client_ipaddress( request[1]), event.get_event_desc(tmp_request_msg_type))) #[step-3] if not self.handle_response_message_type_verify( tmp_request_msg_type, msg_type): #[step-3-1] # send response to user or ACS and reset self.rpc_request_node_message value self.handle_close_wait_rpc_response_control() #[step-3-2] # send resoponse rpc check message to ACS dict_ret = {} dict_ret[ 'str_result'] = "ACS server's rpc response message type error" dict_ret['dict_data'] = {} ResponseClientHandle.handle_send_rpc_check_toACS_request_reponse( message, conn, True, dict_ret) log.debug_info( "(Request from client %s)ACS server's rpc response message fail" % ResponseClientHandle.get_client_ipaddress(request[1])) else: #[step-3-1] # send response to user or ACS and reset self.rpc_request_node_message value self.handle_close_wait_rpc_response_control( response_suc_flag=True, response_message=message) #[step-3-2] # send resoponse rpc check message to ACS ResponseClientHandle.handle_send_rpc_check_toACS_request_reponse( message, conn) log.debug_info( "(Request from client %s)ACS server's rpc response message suc" % ResponseClientHandle.get_client_ipaddress(request[1])) else: log.app_info( "(Request from client %s)ACS server's query or configure response message suc" % ResponseClientHandle.get_client_ipaddress(request[1])) return False return True
def insert_dut_obj(request): """ 解析消息,根据消息类型,分发到DUT_ID对应的DUTQueue对象消息队列中 """ #检查消息的完整性 tmp_msg_is_complete = ResponseClientHandle.check_message_complete( request[0]) if False == tmp_msg_is_complete: err_info = "Recv client request event data incomplete" log.debug_err(err_info) ResponseClientHandle.handle_except(request[0], request[1], err_info) return DUTQueueManagement.delete_expired_dut_obj() message = request[0] message_type = message.get(event.KEY_MESSAGE) #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #add by wangjun 20131024 #拦截守护进程的心跳包数据并发送响应结果 if (message_type == event.EV_QUERY_IS_HANG_RQST): rc_status = DUTQueueManagement.keepalive_request_response( message, request[1]) if True == rc_status: #消息不在往下分发 return #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #add by wangjun 20130716 #获取消息的sequence id message_sequence_id = message.get(event.KEY_SEQUENCE) #将消息加入到MessageSequenceManagement管理队列中,如果该消息已经处理过了, #则直接向client发送处理结果,并返回False标志,否则,返回True,继续消息分发流程 insert_sequence_rc = MessageSequenceManagement.insert_message_sequence_obj( message_sequence_id, request[1]) if False == insert_sequence_rc: return #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ log.app_info( "(Request from client %s)Insert request(message==%s) to DUTQueue" % (ResponseClientHandle.get_client_ipaddress( request[1]), event.get_event_desc(message_type))) dut_id = DUTQueueManagement.get_dut_id(message) if None == dut_id: err_info = "Not found message request sn data" log.debug_err(err_info) if (message_type == event.EV_WORKLIST_EXECUTE_RSP_RQST ): #add by wangjun 20130531 DUTqueue.ResponseWLexecHandle.handle_WLexec_request_except( request[0], err_info) else: ResponseClientHandle.handle_except(request[0], request[1], err_info) return log_dut_id = "insert_dut_obj get_dut_id=" + dut_id log.debug_err(log_dut_id) dut_obj_handle = DUTQueueManagement.get_dut_obj_handle(dut_id) if None == dut_obj_handle: if (message_type == event.EV_WORKLIST_EXECUTE_RSP_RQST ): #add by wangjun 20130531 err_info = "Not found execute worklist DUTQueue running process" log.debug_err(err_info) DUTqueue.ResponseWLexecHandle.handle_WLexec_request_except( request[0], err_info) else: dut_obj_handle = DUTQueueManagement.new_dut_obj(dut_id) if None == dut_obj_handle: return conn = request[1] #add by wangjun 20130523 message_key_sender = message.get(event.KEY_SENDER) if (None == message_key_sender): message_key_sender = event.KEY_SENDER_USER #open QUEUE_INIT key control to GUI #change by wangjun 20130826 if (event.KEY_SENDER_USER == message_key_sender): dut_obj_request_queue_busy = DUTQueueManagement.handle_dutqueue_request_queue_status_check( dut_obj_handle, message, conn) if True == dut_obj_request_queue_busy: log.debug_err("DUTQueue request queue busy") return else: pass #log.debug_err("insert_dut_obj call dispath_event") message_priority_level = message.get(event.KEY_PRIORITY_LEVEL) dut_obj_handle.dispath_event(message_type, message_priority_level, request, message_key_sender)
def run(self): """ override run """ #更新从Agent发送出去消息的KEY_SEQUENCE属性 #add by wangjun 20130722 self.construct_agent_send_message_sequence_property() # send http request and recv response log.app_info( "(Request from client %s)Send request(message=%s) to WorkList server's" % (ResponseClientHandle.get_client_ipaddress( self.conn), event.get_event_desc(self.msg_type))) res, self.response = httpclienthandle.HttClientHandle.send_http_msg( in_message=self.msg, in_timeout=self.timeout, in_try_count=3, in_url=self.url, in_method=self.method) log.app_info( "(Request from client %s)Recv WorkList Server server's response(request message=%s)" % (ResponseClientHandle.get_client_ipaddress( self.conn), event.get_event_desc(self.msg_type))) # parse response data try: if res == "error": err_info = "Agent to WorkList server's http client error:" + self.response log.debug_err(err_info) self.handle_request_except(self.msg, self.conn, err_info) return elif res == "fail": err_info = "Agent to WorkList server's http client fail:" + self.response log.debug_err(err_info) self.handle_request_except(self.msg, self.conn, err_info) return elif res == "response": #检查消息的完整性 check_complete_flag = ResponseClientHandle.check_message_complete( self.response) if False == check_complete_flag: err_info = "Recv HTTP server's response incomplete" log.debug_info(err_info) self.handle_request_except(self.msg, self.conn, err_info) return else: self.hanale_worklistserver_response( self.response, self.conn) return except Exception, e: err_info = "Pickle object occurs exception: %s" % e log.debug_err(err_info) self.handle_request_except(self.msg, self.conn, err_info) return