HCE Project Python language Distributed Tasks Manager Application, Distributed Crawler Application and client API bindings.  2.0.0-chaika
Hierarchical Cluster Engine Python language binding
ResourcesManager.py
Go to the documentation of this file.
1 '''
2 Created on Mar 13, 2014
3 
4 @package: dtm
5 @author: scorp
6 @link: http://hierarchical-cluster-engine.com/
7 @copyright: Copyright © 2013-2014 IOIX Ukraine
8 @license: http://hierarchical-cluster-engine.com/license/
9 @since: 0.1
10 '''
11 
12 
13 from transport.ConnectionBuilderLight import ConnectionBuilderLight
14 from transport.Event import EventBuilder
15 from app.BaseServerManager import BaseServerManager
16 from dbi.dbi import DBI
17 from dbi.dbi import DBIErr
18 from Constants import EVENT_TYPES as EVENT
19 from EventObjects import GeneralResponse
20 from app.LogFormatter import LogFormatterEvent
21 from ResourcesTable import ResourcesTable
22 from ResourcesRecalculating import ResourcesRecalculating
23 import transport.Consts
24 import ConfigParser
25 import logging
26 import Constants as CONSTANTS
27 
28 logger = logging.getLogger(CONSTANTS.LOGGER_NAME)
29 
30 
31 
34 
35  RESOURCE_MANAGER_SERV_NAME = "Server"
36  RESOURCE_MANAGER_SERV_CONFIG_NAME = "ServerName"
37 
38 
39 
41  def __init__(self, config, connectionBuilder=None):
42  BaseServerManager.__init__(self)
43  self.moduleName = self.__class__.__name__
44  self.servIndex = 1
46  self.setEventHandler(EVENT.UPDATE_RESOURCES_DATA, self.onUpdateResourcesData)
47  self.setEventHandler(EVENT.GET_AVG_RESOURCES, self.onGetAVGResources)
48  self.connectionBuilder = connectionBuilder
49  self.config = config
50  self.dbi = None
51  self.connectionInit()
52  self.dbInit()
54 
55 
56 
58  def connectionInit(self):
59  if self.connectionBuilder == None:
61  try:
62  localConnection = self.connectionBuilder.build(transport.Consts.SERVER_CONNECT, \
64  self.addConnection(self.RESOURCE_MANAGER_SERV_NAME + str(self.servIndex), localConnection)
65  self.servIndex = self.servIndex + 1
66  except ConfigParser.NoSectionError:
67  logger.error(">>> ResourcesManager can't read config - Section Error")
68  except ConfigParser.NoOptionError:
69  logger.error(">>> ResourcesManager can't read config - Option Error")
70 
71 
72 
74  def dbInit(self):
75  if self.config != None:
76  dic = None
77  dic = dict(self.config.items(CONSTANTS.DB_CONFIG_SECTION))
78  if dic != None:
79  self.dbi = DBI(dic)
80 
81 
82 
86  def badEventType(self, msg, event):
87  errorStr = msg + str(event.eventType)
88  logger.error(LogFormatterEvent(event, [], errorStr))
89 # raise Exception(errorStr)
90 
91 
92 
95  def onUpdateResourcesData(self, event):
96  logger.debug(LogFormatterEvent(event, [], ">>> ResourcesManager [UPDATE_RESOURCES_DATA] Handler start"))
97  if event.eventType != EVENT.UPDATE_RESOURCES_DATA:
98  self.badEventType(">>> Wrong Event type [UPDATE_RESOURCES_DATA] != ", event)
99  response = GeneralResponse()
100  wasUpdate = False
101  for updateItem in event.eventObj:
102  data = ResourcesTable(updateItem)
103  try:
104  self.dbi.insertOnUpdate(data, "id=%s" % data.nodeId)
105  except DBIErr as ex:
106  response.statuses.append(False)
107  errorStr = ">>> Some DBI error in ResourcesManager.onUpdateResourcesData [" + str(ex) + "]"
108  logger.error(LogFormatterEvent(event, [], errorStr))
109  else:
110  self.resourcesRecalculating.addUpdateResources(data)
111  wasUpdate = True
112  response.statuses.append(True)
113  if wasUpdate:
114  self.resourcesRecalculating.recalculate()
115  retEventType = EVENT.UPDATE_RESOURCES_DATA_RESPONSE
116  retEvent = self.eventBuilder.build(retEventType, response)
117  self.reply(event, retEvent)
118  logger.debug(LogFormatterEvent(event, [], ">>> ResourcesManager [UPDATE_RESOURCES_DATA] Handler finish"))
119 
120 
121 
124  def onGetAVGResources(self, event):
125  logger.debug(LogFormatterEvent(event, [], ">>> ResourcesManager [GET_AVG_RESOURCES] Handler start"))
126  if event.eventType != EVENT.GET_AVG_RESOURCES:
127  self.badEventType(">>> Wrong Event type [GET_AVG_RESOURCES] != ", event)
128  resourcesAVG = self.resourcesRecalculating.getResourcesAVG()
129  retEventType = EVENT.GET_AVG_RESOURCES_RESPONSE
130  retEvent = self.eventBuilder.build(retEventType, resourcesAVG)
131  self.reply(event, retEvent)
132  logger.debug(LogFormatterEvent(event, [], ">>> ResourcesManager [GET_AVG_RESOURCES] Handler finish"))
def reply(self, event, reply_event)
wrapper for sending event in reply for event
Class contents ResourcesManager module implementation.
def badEventType(self, msg, event)
eventProcessing method Method contains main error processing for incoming events msg - incomig error ...
Log formatter event, defines the object to format message string.
Definition: LogFormatter.py:16
GeneralResponse event object, represents general state response for multipurpose usage.
def connectionInit(self)
connectionInit method initializes internal inproc connection
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...
Class ResourcesRecalculating, that contains recalcularing algorithm of resource data.
def __init__(self, config, connectionBuilder=None)
constructor initialise all class variable and recieve config as param
Definition: dbi.py:1
Class hides routines of bulding connection objects.
def onUpdateResourcesData(self, event)
onUpdateResourcesData event handler method Processing UPDATE_RESOURCES_DATA incoming request event - ...
def dbInit(self)
dbInit method initializes internal database API
def onGetAVGResources(self, event)
onGetAVGResources event handler method Processing GET_AVG_RESOURCES incoming request event - incoming...