2 HCE project, Python bindings, Distributed Tasks Manager application. 3 AdminInterfaceServer object and related classes definitions. 4 This object acts as client-side admin interface. 5 It handles admin requests events. Most common admin events are: statistics data fetching from all threaded classes. 6 configuration parameters update and DTM application shutdown. 10 @author bgv bgv.hce@gmail.com 11 @link: http://hierarchical-cluster-engine.com/ 12 @copyright: Copyright © 2013-2014 IOIX Ukraine 13 @license: http://hierarchical-cluster-engine.com/license/ 21 from app.Utils import ExceptionLog, varDump
44 CONFIG_SERVER_HOST =
"serverHost" 45 CONFIG_SERVER_PORT =
"serverPort" 47 ERROR_EVENT_NOT_FOUND =
"Event not found in queue" 49 VERSION_STRING_NAME =
"VERSION" 57 def __init__(self, configParser, connectionBuilderLight=None):
58 super(AdminInterfaceServer, self).
__init__()
79 if connectionBuilderLight
is None:
82 className = self.__class__.__name__
90 tcpServerConnection = connectionBuilderLight.build(TRANSPORT_CONSTS.SERVER_CONNECT,
92 TRANSPORT_CONSTS.TCP_TYPE)
93 adminServerConnection = connectionBuilderLight.build(TRANSPORT_CONSTS.SERVER_CONNECT,
94 BaseServerManager.ADMIN_CONNECT_ENDPOINT)
97 self.
addConnection(BaseServerManager.ADMIN_CONNECT_ENDPOINT, adminServerConnection)
137 adminState = event.eventObj
138 if adminState.className == self.__class__.__name__:
145 requestEvent = self.
eventBuilder.build(DTM_CONSTS.EVENT_TYPES.ADMIN_STATE, adminState)
147 requestEvent.uid = event.uid
152 self.
send(BaseServerManager.ADMIN_CONNECT_ENDPOINT, requestEvent)
154 logger.info(
"Class instance [" + adminState.className +
"] not found ")
155 except Exception
as err:
156 ExceptionLog.handler(logger, err,
"Exception:")
165 adminState = event.eventObj
166 if adminState.command == dtm.EventObjects.AdminState.STATE_READY:
169 logger.info(
"Class instance [" + adminState.className +
"] registered!")
172 replyEvent = self.
eventBuilder.build(DTM_CONSTS.EVENT_TYPES.ADMIN_STATE_RESPONSE, adminState)
174 replyEvent.uid = event.uid
177 if replyEvent.connect_identity
is not None:
179 logger.info(
"Response to admin client sent!")
180 except Exception
as err:
181 ExceptionLog.handler(logger, err,
"Exception:")
190 adminStatData = event.eventObj
191 if adminStatData.className == self.__class__.__name__:
193 logger.debug(
"Process STAT request for himself!")
197 logger.debug(
"Forward the STAT request for target class [" + adminStatData.className +
"]!")
201 requestEvent = self.
eventBuilder.build(DTM_CONSTS.EVENT_TYPES.ADMIN_FETCH_STAT_DATA, adminStatData)
203 requestEvent.uid = event.uid
207 self.
send(BaseServerManager.ADMIN_CONNECT_ENDPOINT, requestEvent)
211 logger.debug(
"Requested STAT request for unregistered class [" + adminStatData.className +
"]!")
212 except Exception
as err:
213 ExceptionLog.handler(logger, err,
"Exception:")
222 adminStatData = event.eventObj
224 replyEvent = self.
eventBuilder.build(DTM_CONSTS.EVENT_TYPES.ADMIN_FETCH_STAT_DATA_RESPONSE, adminStatData)
226 replyEvent.uid = event.uid
229 if replyEvent.connect_identity
is not None:
231 except Exception
as err:
232 ExceptionLog.handler(logger, err,
"Exception:")
241 adminConfigVars = event.eventObj
242 if adminConfigVars.className == self.__class__.__name__:
244 logger.debug(
"Process GET_CONGIG_VARS request for himself!")
251 requestEvent = self.
eventBuilder.build(DTM_CONSTS.EVENT_TYPES.ADMIN_GET_CONFIG_VARS, adminConfigVars)
253 requestEvent.uid = event.uid
257 self.
send(BaseServerManager.ADMIN_CONNECT_ENDPOINT, requestEvent)
259 logger.debug(
"Wrong name of target class [" + adminConfigVars.className +
"]")
260 except Exception
as err:
261 ExceptionLog.handler(logger, err,
"Exception:")
271 adminConfigVars = event.eventObj
273 replyEvent = self.
eventBuilder.build(DTM_CONSTS.EVENT_TYPES.ADMIN_GET_CONFIG_VARS_RESPONSE, adminConfigVars)
275 replyEvent.uid = event.uid
278 if replyEvent.connect_identity
is not None:
280 except Exception
as err:
281 ExceptionLog.handler(logger, err,
"Exception:")
290 adminConfigVars = event.eventObj
291 if adminConfigVars.className == self.__class__.__name__:
293 logger.debug(
"Process SET_CONFIG_VARS request for himself!")
300 requestEvent = self.
eventBuilder.build(DTM_CONSTS.EVENT_TYPES.ADMIN_SET_CONFIG_VARS, adminConfigVars)
302 requestEvent.uid = event.uid
306 self.
send(BaseServerManager.ADMIN_CONNECT_ENDPOINT, requestEvent)
308 logger.debug(
"Wrong name of target class [" + adminConfigVars.className +
"]!")
309 except Exception
as err:
310 ExceptionLog.handler(logger, err,
"Exception:")
319 adminConfigVars = event.eventObj
321 replyEvent = self.
eventBuilder.build(DTM_CONSTS.EVENT_TYPES.ADMIN_SET_CONFIG_VARS_RESPONSE, adminConfigVars)
323 replyEvent.uid = event.uid
326 if replyEvent.connect_identity
is not None:
328 except Exception
as err:
329 ExceptionLog.handler(logger, err,
"Exception:")
336 logger.debug(
">>> SuspendResponse uid = " + str(event.uid))
345 replyEvent = self.
eventBuilder.build(DTM_CONSTS.EVENT_TYPES.ADMIN_SUSPEND_RESPONSE, responseObj)
347 if replyEvent.connect_identity
is not None:
357 adminState = event.eventObj
358 if adminState.command == dtm.EventObjects.AdminState.STATE_SHUTDOWN:
360 replyEvent = self.
eventBuilder.build(DTM_CONSTS.EVENT_TYPES.ADMIN_STATE_RESPONSE, adminState)
361 self.
reply(event, replyEvent)
362 logger.info(
"Has successfully shutdown!")
371 adminStatData = event.eventObj
372 fieldsListLen = len(adminStatData.fields)
376 if dtm.EventObjects.AdminStatData.FIELD_CLIENTS_LIST
in adminStatData.fields
or fieldsListLen == 0:
380 clientsList.append(key)
381 adminStatData.fields[dtm.EventObjects.AdminStatData.FIELD_CLIENTS_LIST] = clientsList
383 replyEvent = self.
eventBuilder.build(DTM_CONSTS.EVENT_TYPES.ADMIN_FETCH_STAT_DATA_RESPONSE, adminStatData)
384 self.
reply(event, replyEvent)
394 connect_identity =
None 402 return connect_identity
409 adminConfigVars = event.eventObj
413 replyEvent = self.
eventBuilder.build(DTM_CONSTS.EVENT_TYPES.ADMIN_GET_CONFIG_VARS_RESPONSE, adminConfigVars)
414 self.
reply(event, replyEvent)
421 adminConfigVars = event.eventObj
423 replyEvent = self.
eventBuilder.build(DTM_CONSTS.EVENT_TYPES.ADMIN_SET_CONFIG_VARS_RESPONSE,
425 self.
reply(event, replyEvent)
435 ">>> Suspend already in progress")
436 replyEvent = self.
eventBuilder.build(DTM_CONSTS.EVENT_TYPES.ADMIN_SUSPEND_RESPONSE, responseObj)
437 replyEvent.connect_identity = event.connect_identity
438 if replyEvent.connect_identity
is not None:
441 suspendObj = event.eventObj
445 requestEvent = self.
eventBuilder.build(DTM_CONSTS.EVENT_TYPES.ADMIN_SUSPEND, suspendObj)
451 self.
send(BaseServerManager.ADMIN_CONNECT_ENDPOINT, requestEvent)
452 logger.debug(
">>> SuspendRequest uid = " + str(requestEvent.uid))
453 except Exception
as err:
454 ExceptionLog.handler(logger, err,
"Exception:")
461 logger.debug(
">>> onAdminSystem uid = " + str(event.uid))
463 if event.eventObj.type
is None:
464 raise Exception(
'Wrong event data were got: ' +
varDump(event))
467 errorCode = systemCommand.execute(event.eventObj.type, event.eventObj.data)
469 if errorCode == dtm.EventObjects.GeneralResponse.ERROR_OK:
470 errorMessage =
">>> SystemCommand successfully finished" 472 errorMessage = systemCommand.errorMsg
475 replyEvent = self.
eventBuilder.build(DTM_CONSTS.EVENT_TYPES.ADMIN_SYSTEM_RESPONSE, responseObj)
476 replyEvent.connect_identity = event.connect_identity
477 if replyEvent.connect_identity
is not None:
480 except Exception
as err:
481 ExceptionLog.handler(logger, err,
"onAdminSystem:")
488 logger.debug(
">>> onAdminSQLCustom uid = " + str(event.uid))
491 if self.
dbi is not None:
492 sqlResponse = self.
dbi.sqlCustom(event.eventObj.query)
493 responseObj.result = [dict(row)
for row
in sqlResponse]
494 if self.
dbi.errorCode != DBI_CONSTANTS.DBI_SUCCESS_CODE:
495 responseObj.errString = self.
dbi.errorMessage
496 except Exception
as err:
497 ExceptionLog.handler(logger, err,
"onAdminSQLCustom:")
498 replyEvent = self.
eventBuilder.build(DTM_CONSTS.EVENT_TYPES.ADMIN_SQL_CUSTOM_RESPONSE, responseObj)
499 self.
reply(event, replyEvent)
def getConfigVarsFields(self, fields)
getConfigVarsFields returns config vars from storage
def getConnectionIdentityByEvent(self, event)
def reply(self, event, reply_event)
wrapper for sending event in reply for event
def createDBIDict(self, configParser)
string ERROR_EVENT_NOT_FOUND
def __init__(self, configParser, connectionBuilderLight=None)
def onAdminSetConfigVars(self, event)
def processOwnGetConfigVarsRequest(self, event)
string CONFIG_SERVER_PORT
GeneralResponse event object, represents general state response for multipurpose usage.
def getStatDataFields(self, fields)
getStatDataFields returns stat data from storage
def setEventHandler(self, eventType, handler)
set event handler rewrite the current handler for eventType
def addConnection(self, name, connection)
This is app base class for management server connection end-points and parallel transport messages pr...
string VERSION_STRING_NAME
def onAdminSuspendResponse(self, event)
def setConfigVars(self, setConfigVars)
processSetConfigVars sets config vars in storage
def onAdminGetConfigVars(self, event)
def onAdminSystem(self, event)
def onAdminStateResponse(self, event)
string CONFIG_SERVER_HOST
Class hides routines of bulding connection objects.
statFields
stat fields container
def send(self, connect_name, event)
send event
def onAdminSuspend(self, event)
def onAdminSQLCustom(self, event)
def onAdminState(self, event)
Class SystemCommandHandler for support different system command.
def processOwnSetConfigVarsRequest(self, event)
def processOwnStatDataRequest(self, event)
tcpServerEventIdToConnectIdentity
def onAdminStatDataResponse(self, event)
def onAdminStatData(self, event)
def varDump(obj, stringify=True, strTypeMaxLen=256, strTypeCutSuffix='...', stringifyType=1, ignoreErrors=False, objectsHash=None, depth=0, indent=2, ensure_ascii=False, maxDepth=10)
def processOwnStateRequest(self, event)
def onAdminSetConfigVarsResponse(self, event)
def onAdminGetConfigVarsResponse(self, event)