def ensure_server_available(self): udpactive = self.udpEndpoint.check_heartbeat() if udpactive and self.tcpEndpoint.connectionStatus is NetworkEndpoint.PIPE_DISCONNECTED and not \ self.tcpEndpoint.hangup: Log.network("Heartbeat found! Reconnecting TCP to " + str(self.tcpEndpoint.remoteAddr)) if self.tcpEndpoint.connect(): self.inputSockets[self.tcpEndpoint.socket] = self.tcpEndpoint self.outputSockets[self.tcpEndpoint.socket] = self.tcpEndpoint Log.network("TCP connection established. Socket is %s" % self.tcpEndpoint.socket) else: Log.warn("TCP not up yet!") if not udpactive and self.tcpEndpoint.connectionStatus >= NetworkEndpoint.PIPE_CONNECTED: Log.network("Heartbeat lost. Closing TCP") self.tcpEndpoint.close() try: del self.inputSockets[self.tcpEndpoint.socket] del self.outputSockets[self.tcpEndpoint.socket] except KeyError: Log.error("TCP already removed from pollable sockets") if self.tcpEndpoint.connectionStatus == NetworkEndpoint.PIPE_CONNECTED: self.tcpEndpoint.send_handshake()
def event_received(self, event): self.requestLock = True # Lock the request loop Log.info("Received method " + event.subject[2:]) Log.info("Args are:" + str(event.msg)) try: self.incomingActions[event.subject](event.msg) except KeyError: Log.error("Nothing registered for incoming action " + event.subject)
def validate_same_day_duty(self, preacher_id, duty_date): Log.info("\nValidating Duties for Preacher ID: " + str(preacher_id) + " for date: " + str(duty_date)) duty_date_list = [] for roaster_obj in roaster_list: if roaster_obj.preacher_id == preacher_id and roaster_obj.duty_date == duty_date: duty_date_list.append(roaster_obj.duty_date) if len(duty_date_list) != 1: Log.error("\t Test failed, the preacher has been allotted " + len(duty_date_list) + " duties on date: " + str(duty_date)) else: Log.info("\t Validation successful, the preacher has been allotted only one duty for date: " + str(duty_date))
def execute_query(self, query, use_parameter="false", param="0"): cursor = None try: cursor = self.get_connection().cursor() Log.debug("\tExecuting the query: " + query) if use_parameter == "true": cursor.execute(query, param) else: cursor.execute(query) Log.debug('\tQuery was executed successfully') except Exception as ex: Log.error(ex) return cursor
def validate_preacher_details(self, roaster_obj): Log.info("\nValidating Preacher Details for Preacher ID: " + str(roaster_obj.preacher_id) + " , language: " + roaster_obj.language) db_conn = DBBase() cursor = db_conn.execute_query((DBConstants.PREACHER_LANGUAGE).replace('$preacher_id', str(roaster_obj.preacher_id)).replace('$language', roaster_obj.language)) preacher_obj = None if cursor is not None: row = cursor.fetchone() db_conn.close(cursor) if row is not None: preacher_obj = PreacherDTO(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7]) self.match_values('Active', preacher_obj.status, "ensuring the preacher assigned is in active status") self.match_values(roaster_obj.sewadar_name, preacher_obj.sewadar_name, "for sewadar name in roaster duty and preacher details") else: Log.error("Test failed, the preacher at id: " + str(roaster_obj.preacher_id) + " doesn't use the language: " + roaster_obj.language) else: Log.error("Unable to Open cursor")
def send_message(self, message, args): args = args if args else {} retries = 5 success = False Log.info("Publishing message " + str(message)) while retries > 0: try: self.publish(message, args) success = True except Pyro.errors.ConnectionClosedError, e: Log.error(e) Log.error( "Rebinding to server. {0} retries left.".format(str(retries))) self.adapter.rebindURI() retries -= 1 if success: break
def validate_centre_schedule(self, roaster_obj): Log.info("\nValidating Centre details for Centre ID: " + str(roaster_obj.centre_id) + " , week: " + roaster_obj.week + " , weekday: " + roaster_obj.weekday) db_conn = DBBase() query = (DBConstants.CENTRE_ID_QUERY).replace('$centre_id', str(roaster_obj.centre_id)).replace('$weeknum', roaster_obj.week).replace('$weekday', roaster_obj.weekday) cursor = db_conn.execute_query(query) if cursor is not None: row = cursor.fetchone() db_conn.close(cursor) if row is not None: centre_obj = CentreDTO(row[0], row[1], row[2], row[3], row[4], row[5]) self.match_values('Active', centre_obj.status, "ensuring the details of centre are in active status") self.match_values(roaster_obj.centre_name, centre_obj.centre_name, "for centre name in roaster duty and centre schedule") self.match_values(roaster_obj.time, centre_obj.time, "for time details in roaster duty and centre schedule") self.match_values(roaster_obj.language, centre_obj.language, "for language in roaster duty and centre schedule") else: Log.error("Test failed, the language of centre and scheduled roaster for mentioned week, weekday and time doesn't match") else: Log.error("Unable to Open cursor")
def __init__(self): """ Virtually private constructor. """ if Browser.__instance != None: raise Exception("This class is a singleton!") else: try: command_executor = os.getenv(constants.EXECUTOR, "") chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-gpu') Browser.__instance = webdriver.Remote( command_executor=command_executor, desired_capabilities=chrome_options.to_capabilities()) except WebDriverException as e: s = "%s" % e Log.error("Got exception %s" % s) Log.error("%s" % dir(s)) if "Empty pool of VM for setup Capabilities" not in s: raise
def validate_preacher_leaves(self, roaster_obj): duty_date = roaster_obj.duty_date Log.info("\nValidating Preacher Leaves for Preacher ID: " + str(roaster_obj.preacher_id) + " for duty date: " + str(duty_date)) db_conn = DBBase() cursor = db_conn.execute_query((DBConstants.PREACHER_LEAVES).replace('$preacher_id', str(roaster_obj.preacher_id))) i = 0 if cursor is not None: for row in cursor.fetchall(): i = i + 1 from_date = row[1] till_date = row[2] Log.info("\tPreacher is on leave from date: " + str(from_date) + " till date: " + str(till_date)) if from_date<=duty_date and duty_date<=till_date: Log.error("The Duty date: " + duty_date + " is during preacher leave period from date: " + str(from_date) + " till date: " + str(till_date)) else: Log.info("The duty date doesn't fall under the leave period from date: " + str(from_date) + " till date: " + str(till_date)) db_conn.close(cursor) if i==0 : Log.info("Validation not needed, the preacher has not applied for any leaves") else: Log.error("Unable to Open cursor")
def get_connection(self): if self.db_connection is not None: Log.debug('\tDB Connection Successful') return self.db_connection else: try: driver = pyodbc.drivers()[0] Log.debug("\tConnecting to DB Using Driver: " + driver) username = os.getenv("DB_USERNAME", "dev") password = os.getenv("DB_PASSWORD", "dera@54321") db_connection = pyodbc.connect('DRIVER={' + driver + '};' + 'SERVER=' + DBConstants.SERVER + ';' + 'PORT=' + DBConstants.DEFAULT_PORT + ';' + 'DATABASE=' + DBConstants.DATABASE + ';' + 'UID=' + username + ';' + 'PWD=' + password) Log.debug('\tDB Connection Successful') return db_connection except Exception as ex: Log.error(ex) raise Exception('ERROR: Not able to establish a DB Connection')
def poll(self): self.ensure_server_available() # Loop through all messages in the socket till it's empty # If the lock is active, then the queue is not empty requestcounter = 0 while self.requestLock: self.requestLock = False badsockets = [] inputready = None outputready = None try: inputready, outputready, exceptready = select.select( self.inputSockets.keys(), self.outputSockets.keys(), badsockets, 0) except socket.error, e: if e[0] == NetworkErrors.EBADF: Log.error( "Bad file descriptor! Probably a dead socket passed to select" ) Log.debug(self.inputSockets.keys()) Log.debug(self.outputSockets.keys()) if badsockets: Log.error("Bad sockets: %s" % badsockets) if inputready: for s in inputready: endpoint = self.inputSockets[s] try: endpoint.recv_msg() except (ReadError, RuntimeError), e: Log.error( "Socket receive error! Closing %s. Reason: %s" % (endpoint, e)) endpoint.close() try: del self.inputSockets[endpoint.socket] del self.outputSockets[endpoint.socket] try: outputready.remove(endpoint.socket) except ValueError: pass except KeyError: Log.network("Socket missing. In input hangup") continue
def poll(self): self.ensure_server_available() # Loop through all messages in the socket till it's empty # If the lock is active, then the queue is not empty requestcounter = 0 while self.requestLock: self.requestLock = False badsockets = [] inputready = None outputready = None try: inputready, outputready, exceptready = select.select( self.inputSockets.keys(), self.outputSockets.keys(), badsockets, 0) except socket.error, e: if e[0] == NetworkErrors.EBADF: Log.error("Bad file descriptor! Probably a dead socket passed to select") Log.debug(self.inputSockets.keys()) Log.debug(self.outputSockets.keys()) if badsockets: Log.error("Bad sockets: %s" % badsockets) if inputready: for s in inputready: endpoint = self.inputSockets[s] try: endpoint.recv_msg() except (ReadError, RuntimeError), e: Log.error("Socket receive error! Closing %s. Reason: %s" % (endpoint, e)) endpoint.close() try: del self.inputSockets[endpoint.socket] del self.outputSockets[endpoint.socket] try: outputready.remove(endpoint.socket) except ValueError: pass except KeyError: Log.network("Socket missing. In input hangup") continue
def connect(self): self.create_socket() status = 0 retries = 5 while retries > 0: try: status = self.socket.connect(self.remoteAddr) except socket.error, e: if e[0] == NetworkErrors.EISCONN: Log.network("...TCP connected!") self.connectionStatus = NetworkEndpoint.PIPE_CONNECTED break elif e[0] == NetworkErrors.EAGAIN: Log.network("TCP connecting...") retries -= 1 elif e[0] == socket.timeout: Log.error("Timed out") self.connectionStatus = NetworkEndpoint.PIPE_DISCONNECTED else: Log.error("Connection failed!") Log.error("Reason: " + str(e)) self.connectionStatus = NetworkEndpoint.PIPE_DISCONNECTED break
class TCPEndpoint(NetworkEndpoint): """Network endpoint using TCP""" def __init__(self, localport, remoteport, threaded=True, isserversocket=True, existingsocket=None): self.serverSocket = isserversocket self.hangup = False self.clientHandshakeCallbacks = set() self.handshakeAckCallbacks = set() if existingsocket: self.socket = existingsocket NetworkEndpoint.__init__(self, localport, remoteport, threaded) def close(self): self.hangup = True NetworkEndpoint.close(self) def create_socket(self): self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, True) self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.socket.settimeout(5) if self.serverSocket: self.socket.bind(self.localAddr) self.socket.listen(2) if not self.threaded: self.socket.setblocking(0) else: self.socket.setblocking(1) def connect(self): self.create_socket() status = 0 retries = 5 while retries > 0: try: status = self.socket.connect(self.remoteAddr) except socket.error, e: if e[0] == NetworkErrors.EISCONN: Log.network("...TCP connected!") self.connectionStatus = NetworkEndpoint.PIPE_CONNECTED break elif e[0] == NetworkErrors.EAGAIN: Log.network("TCP connecting...") retries -= 1 elif e[0] == socket.timeout: Log.error("Timed out") self.connectionStatus = NetworkEndpoint.PIPE_DISCONNECTED else: Log.error("Connection failed!") Log.error("Reason: " + str(e)) self.connectionStatus = NetworkEndpoint.PIPE_DISCONNECTED break if status == 0: self.connectionStatus = NetworkEndpoint.PIPE_CONNECTED else: Log.error("Connection failed with error %s" % status) return self.connectionStatus
def match_values(self, expected_value, actual_value, msg=""): if not actual_value == expected_value: message = "EXPECTED VALUE " + msg + " IS: " + expected_value + " HOWEVER ACTUAL VALUE IS: " + actual_value Log.error(message) else: Log.info("\tThe expected value and actual value matches "+ msg + " : " + actual_value)