""" 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