Example #1
0
""" Ockle PDU and servers manager
A server node is a server with outlets,
or a service with the list of outlets to its servers that run it

Created on Mar 14, 2012

@author: Guy Sheffer <guy.sheffer at mail.huji.ac.il>
"""
import time
from common.common import OpState
from common.common import loadConfig
from outlets.OutletTemplate import OutletOpState
from testers.TemplateTester import TesterOpState
from controllers.ControllerTemplate import ControllerOpState

config,ETC_DIR = loadConfig()

MAX_STARTUP_TIME = 60
MAX_ATTEMPTS = 3
try:
    MAX_STARTUP_TIME = config.get('servers', 'MAX_STARTUP_TIME')
    MAX_ATTEMPTS = int(config.get('servers', 'MAX_ATTEMPTS'))
except:
    pass

class ServerNodeOpState(OpState):
    INIT="Did not initiate yet"# Did not start yet

class ServerNode():
    ''' This class represents a PC in the network
    '''
 def buildNetwork(self,config_path):
     config,ETC_DIR = loadConfig()
     
     self.servers=ServerNetwork()
     
     #build servers
     SERVER_DIR = config.get('main', 'SERVER_DIR')
     serverConfigPath = os.path.join(ETC_DIR,SERVER_DIR)
     self.mainDaemon.debug("Loading:"+str(serverConfigPath))
     serverConfigFileList = os.listdir(serverConfigPath)
     for serverConfigFile in serverConfigFileList:
         serverConfigFile = os.path.join(serverConfigPath,serverConfigFile)
         serverConfig = SafeConfigParser()
         serverConfig.read(serverConfigFile)
         #server = serverConfig.get('server', 'name')
         server = self._getNameFromFilePath(serverConfigFile)
         
         def buildServerObj(objNames,builderCallback):
             ''' Parse the serverObj field
             
             :param objNames: the name of the field we are parsing
             :param builderCallback: The function that takes the server config and name, building the object
             :return: A list of the server objects 
             '''
             #Handle a list or single string outlet
             try:
                 outlets = serverConfig.get('server', objNames)
             except NoOptionError:
                 outlets = "[]" 
                 
             if outlets.startswith("["):
                 outlets = json.loads(outlets)
             else:
                 outlets=[outlets]
             outletList=[]
             for outlet in outlets:
                 outletList.append(builderCallback(serverConfig,outlet,serverConfigPath))
             return outletList
         
         outletList = buildServerObj('outlets',self.__makeOutlet)
         testerList = buildServerObj('tests',self.__makeTester)
         controlList = buildServerObj('controls',self.__makeControl)
         
                     
         #Make the server with the outlets and testers
         self.servers.addServer(ServerNode(server,outletList,testerList,controlList))
     
     #add dependencies to our server forest
     for serverConfigFile in serverConfigFileList:
         serverConfigFile = os.path.join(serverConfigPath,serverConfigFile)
         serverConfig = SafeConfigParser()
         serverConfig.read(serverConfigFile)
         
         #server = serverConfig.get('server', 'name')
         server = self._getNameFromFilePath(serverConfigFile)
         
         #sanitize input
         if serverConfig.get("server","dependencies") != "":    
             dependencies = json.loads(serverConfig.get("server","dependencies"))
         else:
             dependencies=[]
         
         for dependency in dependencies:
             try:
                 self.servers.addDependency(server, dependency)
             except DependencyException as e:
                 if DependencyException:
                     self.mainDaemon.debug(e.msg +":" + str(e.list))
                 raise e
     return self.servers