def doInit(additionalVariables):

    ContainerUtils.getLogger(proxy).info("[hadoop_enabler_balancer] Beginning doInit()")

    doInit_common(additionalVariables)        
    
    additionalVariables.add(RuntimeContextVariable("hadoop_enabler_balancer_BALANCER_RECEIVED_REQUESTS", "", 
                                                   RuntimeContextVariable.STRING_TYPE))

    additionalVariables.add(RuntimeContextVariable("hadoop_enabler_balancer_BALANCER_NEW_REQUEST_FLAG", "False", 
                                                   RuntimeContextVariable.STRING_TYPE))

    additionalVariables.add(RuntimeContextVariable("hadoop_enabler_balancer_BALANCER_EXIT_FLAG", "False", 
                                                   RuntimeContextVariable.STRING_TYPE))
    
    """
    Create New Thread objects for processing requests and save for later
    """
    logger = ContainerUtils.getLogger(proxy)
    slstdout = StreamToLogger(logger,"STDOUT")
    slstderr = StreamToLogger(logger,"STDERR")
    lock = threading.Lock()
    processReqThread = processRequestsThread(slstdout, slstderr, lock)
    additionalVariables.add(RuntimeContextVariable("hadoop_enabler_balancer_BALANCER_PROCESS_REQUEST_THREAD", processReqThread, 
                                                   RuntimeContextVariable.OBJECT_TYPE))
    
    checkForReqThread = checkForRequestsThread(slstdout, slstderr, lock)
    additionalVariables.add(RuntimeContextVariable("hadoop_enabler_balancer_BALANCER_CHECKFOR_REQUEST_THREAD", checkForReqThread, 
                                                   RuntimeContextVariable.OBJECT_TYPE))

    proxy.doInit(additionalVariables)
    
    ContainerUtils.getLogger(proxy).info("[hadoop_enabler_balancer] Exiting doInit()")
def getBalancerRequestsFromQueue():
    
    hadoop_home_dir = proxy.getContainer().getRuntimeContext().getVariable('hadoop_enabler_HADOOP_HOME_DIR').getValue()
    commandline = os.path.join(hadoop_home_dir, "bin", "hadoop") + " fs -ls " + balancerqueue_dir            
    #Older versions of hadoop (e.g 1.0.4 and 1.1.2) return 255 if file does not exist.  Newer versions return 1
    output = runCommand(commandline, stdout=PIPE, expectedReturnCodes=[0, 255, 1], suppressOutput=True)

    requests = []
    if (output[0] == 0):
        reqsFileList = output[1].splitlines()
        numOfRequests=0
        for i in range(1, len(reqsFileList)):
            if not reqsFileList[i].startswith("Found"):
                """ Workaround - With 2.0.3-alpha a warning message for missing compression libraries is being printed to STDOUT during ls command """
                if not reqsFileList[i].count("Unable to load native-hadoop library for your platform... using builtin-java classes where applicable") > 0: 
                    ContainerUtils.getLogger(proxy).fine("[hadoop_enabler_balancer] Found request in queue [" + str(reqsFileList[i]) + "]")
                    lineTokens = reqsFileList[i].split()
                    if len(lineTokens) == 8:
                        filepath = lineTokens[7]
                        requests.append(filepath)
                        numOfRequests=numOfRequests+1
                    else:
                        ContainerUtils.getLogger(proxy).warning("[hadoop_enabler_balancer] Ignoring Line " + str(i + 1) +  " of queue listing for " + balancerqueue_dir +
                                                             "Line has unexpected format.  Full listing is:" +
                                                             str(reqsFileList) )
        if numOfRequests > 0:
            ContainerUtils.getLogger(proxy).info("[hadoop_enabler_balancer] "+ str(numOfRequests) +" requests found in [" + str(balancerqueue_dir) + "].")
    elif (output[0] == 255) or (output[0] == 1):
        ContainerUtils.getLogger(proxy).fine("[hadoop_enabler_balancer] No requests found in [" + str(balancerqueue_dir) + "].")
    else:
        ContainerUtils.getLogger(proxy).warning("[hadoop_enabler_balancer] Unexpected return code " + str(output[0]) + 
                                                "while trying to get requests from [" + str(balancerqueue_dir) + "].")        
    return requests
def getStatistic(name):

    ContainerUtils.getLogger(proxy).fine("[hadoop_enabler_balancer] Beginning getStatistic()")

    return (getStatistic_common(name))
        
    ContainerUtils.getLogger(proxy).fine("[hadoop_enabler_balancer] Exiting getStatistic()")
def createEnvironmentScript():
    
    hadoop_bin_dir = proxy.getContainer().getRuntimeContext().getVariable('hadoop_enabler_HADOOP_BIN_DIR').getValue()
    
    if ContainerUtils.isWindows():
        environmentFilename = os.path.join(hadoop_bin_dir, "hadoop_enabler_ENVIRONMENT.bat")
    else:
        environmentFilename = os.path.join(hadoop_bin_dir, "hadoop_enabler_ENVIRONMENT.sh")
        
    environmentFile = open(environmentFilename, 'w')
    print>>environmentFile, "###################################################"
    print>>environmentFile, "# Generated by Hodoop Enabler"
    print>>environmentFile, "#     " + str(datetime.datetime.now())
    print>>environmentFile, "#"
    print>>environmentFile, "# This file sets all the ENVIRONMENT type runtimecontext"
    print>>environmentFile, "# variables defined by this enabler."
    print>>environmentFile, "#"
    print>>environmentFile, "###################################################"

    runtimeContext = proxy.getContainer().getRuntimeContext()
    for i in range (0, (runtimeContext.getVariableCount() - 1)):
          variable = runtimeContext.getVariable(i)
          ContainerUtils.getLogger(proxy).fine("[hadoop_enabler_common] " + str(variable.getName()) + " has type [" + str(variable.getTypeInt()) + "]")
          if  (variable.getTypeInt() == RuntimeContextVariable.ENVIRONMENT_TYPE):
              print>>environmentFile, variable.getName() + "=" + str(variable.getValue())   
    
    environmentFile.close()
def stopBalancer():
    ContainerUtils.getLogger(proxy).info("[hadoop_enabler_balancer] Stopping existing Balancer if any")
    hadoop_bin_dir = proxy.getContainer().getRuntimeContext().getVariable('hadoop_enabler_HADOOP_BIN_DIR').getValue()
    #runCommand("sh " + os.path.join(hadoop_bin_dir, "stop-balancer.sh"))
    """ Wordaround: version 0.23.7 returns 1 when successful """
    if getHadoopVersion().startswith("0.23"):
        runCommand(getScript("stop-balancer.sh"), expectedReturnCodes=[1])
    else:
        runCommand(getScript("stop-balancer.sh"))
def moveContentFiles():
    
    hadoop_home_dir = proxy.getContainer().getRuntimeContext().getVariable('hadoop_enabler_HADOOP_HOME_DIR').getValue()
    work_dir = proxy.getContainer().getRuntimeContext().getVariable('CONTAINER_WORK_DIR').getValue()
    
    if ContainerUtils.isWindows():
        pass
    else:
        ContainerUtils.getLogger(proxy).info("[hadoop_enabler_common] Copying enabler content files to version-specific sub-directory.")       
        runCommand("cp -rv " + work_dir + "/hadoop-content/* " + hadoop_home_dir, shell=True)
def getStatistic_common(name):

    memoryBean = ManagementFactory.getMemoryMXBean()

    if name == "enabler_HEAP_MEMORY_USAGE":
        bytes = memoryBean.getHeapMemoryUsage().getUsed()
        return bytes / 1024 / 1024 # convert to MiB
    elif name == "enabler_NON_HEAP_MEMORY_USAGE":
        bytes = memoryBean.getNonHeapMemoryUsage().getUsed()
        return bytes / 1024 / 1024 # convert to MiB
    
    elif name == "enabler_DATANODE_DECOMMISION_REQUESTS":
        
        hadoop_home_dir = proxy.getContainer().getRuntimeContext().getVariable('hadoop_enabler_HADOOP_HOME_DIR').getValue()        

        if ContainerUtils.isWindows():
            raise Exception("[hadoop_enabler_common] Windows not yet implemented in by this enabler.")
        else:
            commandline = "sh " + os.path.join(hadoop_home_dir, "bin", "hadoop") + " fs -count " + decommissionqueue_dir
            
        output = runCommand(commandline, expectedReturnCodes=[0, 255], suppressOutput=True)
        if (output[0] == 0): 
            stdout = str(output[1])
            count = int(stdout.split()[1])
            return int(count)
        elif (output[0] == 255):
            # Decommission request directory doesn't exist.  Not expected to exist until the some datanode posts the first request  
            return int(0)    
        else:
            ContainerUtils.getLogger(proxy).warning("[hadoop_enabler_common] Unexpected return code [" + str(output[0]) + 
                                                    "] while attempting to retrieve statistic enabler_DATANODE_DECOMMISION_REQUESTS statistic.  Assuming 0.")
            print output
            return int(0)
        
    elif name.startswith('enabler_DISK_'):

        tmpdir = proxy.getContainer().getRuntimeContext().getVariable('hadoop_enabler_TMP_DIR').getValue()    
        
        if name == "enabler_DISK_SPACE_FREE":
            blocks = int(getStatistic_disk(tmpdir)[0])
            return blocks / 1024 / 1024 # convert 1024-byte blocks to GiB
            #return available
        elif name == "enabler_DISK_SPACE_USED":
            blocks = int(getStatistic_disk(tmpdir)[1])
            return blocks / 1024 / 1024  # convert 1024-byte blocks to GiB
            #return used
        elif name == "enabler_DISK_SPACE_USED_PERCENT":
            return getStatistic_disk(tmpdir)[2]
            #return int(percent[:-1])
        else:
            raise Exception("[hadoop_enabler_common] Unsupported statistic type requested [" + str(name) + "]")

    else:
        raise Exception("[hadoop_enabler_common] Unsupported statistic type requested [" + str(name) + "]")
def isContainerRunning():

    processRequetsThread = proxy.getContainer().getRuntimeContext().getVariable('hadoop_enabler_balancer_BALANCER_PROCESS_REQUEST_THREAD').getValue()
    checkForRequetsThread = proxy.getContainer().getRuntimeContext().getVariable('hadoop_enabler_balancer_BALANCER_CHECKFOR_REQUEST_THREAD').getValue()

    status = processRequetsThread.isAlive() and checkForRequetsThread.isAlive()

    if status == True:
        pass
    else:
        ContainerUtils.getLogger(proxy).info("[hadoop_enabler_balancer.isContainerRunning()]  Return status is: " + str(status))

    return status
Beispiel #9
0
def isContainerRunning():
    port = runtimeContext.getVariable('MYSQL_PORT').getValue() 
    basedir = runtimeContext.getVariable('MYSQL_BASE_DIR').getValue()
    user = runtimeContext.getVariable('MYSQL_USER').getValue()
    pw = runtimeContext.getVariable('MYSQL_PW').getValue() 
    bindir = os.path.join(basedir, "bin")
    host = socket.gethostname()
    status = call([os.path.join(bindir, "mysqladmin"), "--port=" + port, "-h", host, "--user="******"--password="******"ping"])
    ContainerUtils.getLogger(proxy).info("mysqladmin ping returns " + str(status))
    if status == 0:
        return True
    else:
        return False
def changePermissions():

    hadoop_bin_dir = proxy.getContainer().getRuntimeContext().getVariable('hadoop_enabler_HADOOP_BIN_DIR').getValue()
    hadoop_sbin_dir = proxy.getContainer().getRuntimeContext().getVariable('hadoop_enabler_HADOOP_SBIN_DIR').getValue()
    java_home_dir = proxy.getContainer().getRuntimeContext().getVariable('GRIDLIB_JAVA_HOME').getValue()
    
    if ContainerUtils.isWindows():
        pass
    else:
        ContainerUtils.getLogger(proxy).info("[hadoop_enabler_common] Changing file permissions on directory " + hadoop_bin_dir)       
        commandline = "chmod -Rv u+x " + hadoop_bin_dir
        runCommand(commandline)
        
        ContainerUtils.getLogger(proxy).info("[hadoop_enabler_common] Changing file permissions on directory " + hadoop_sbin_dir)       
        commandline = "chmod -Rv u+x " + hadoop_sbin_dir
        runCommand(commandline)
        
        java_bin_dir = os.path.join(java_home_dir, "bin")
        ContainerUtils.getLogger(proxy).info("[hadoop_enabler_common] Changing file permissions on directory " + java_bin_dir)       
        commandline = "chmod -Rv u+x " + java_bin_dir
        runCommand(commandline)
        
        java_jrebin_dir = os.path.join(java_home_dir, "jre", "bin")
        ContainerUtils.getLogger(proxy).info("[hadoop_enabler_common] Changing file permissions on directory " + java_jrebin_dir)       
        commandline = "chmod -Rv u+x " + java_jrebin_dir
        runCommand(commandline)
def runCommand(commandline, stdin=None, stdout=None, expectedReturnCodes=None, suppressOutput=None, shell=None):

    if (expectedReturnCodes == None): expectedReturnCodes = [0]
    if (suppressOutput == None): suppressOutput = False
    if (shell == None): shell = False
    stderr = None
    if (suppressOutput):
        stdout=PIPE
        stderr=PIPE
    else: 
        ContainerUtils.getLogger(proxy).info("[hadoop_enabler_common] Running command [" + commandline + "]")
            
    if shell:
        args = commandline
    else:
        args = shlex.split(commandline)

    os.unsetenv("LD_LIBRARY_PATH")
    os.unsetenv("LD_PRELOAD")

    if stdin == None:
        p = Popen(args, stdout=stdout, stdin=None, stderr=stderr, shell=shell)
        output = p.communicate()        
    else:
        p = Popen(args, stdout=stdout, stdin=PIPE, stderr=stderr, shell=shell)
        output = p.communicate(input=stdin)
    
    outputlist = [p.returncode]

    for item in output:
        outputlist.append(item)

    if (outputlist[0] in expectedReturnCodes ):
        if not (suppressOutput):
            ContainerUtils.getLogger(proxy).info("[hadoop_enabler_common] Command return code was [" + str(outputlist[0]) + "]")
            printStdoutPipe(stdout, outputlist)
    else:
        
        ContainerUtils.getLogger(proxy).severe("[hadoop_enabler_common] Return code " + str(outputlist[0]) + 
                                               " was not in list of expected return codes" + str(expectedReturnCodes))
        if (suppressOutput):
            ContainerUtils.getLogger(proxy).severe("[hadoop_enabler_common] Command was [" + commandline + "]")

        printStdoutPipe(stdout, outputlist)

    ContainerUtils.getLogger(proxy).finer("[hadoop_enabler_common] exiting runCommand(). Returning outputlist:" + (str(outputlist)))
    return outputlist
def killOrphans():     
    ContainerUtils.getLogger(proxy).info("[hadoop_enabler_common] Killing any orphaned process on this engine remaining from a previous execution")
    
    hadoop_home_dir = proxy.getContainer().getRuntimeContext().getVariable('hadoop_enabler_HADOOP_HOME_DIR').getValue()

    if ContainerUtils.isWindows():
        raise Exception("[hadoop_enabler_common] Windows not yet implemented in by this enabler.")
    else:
        commandline = "ps x"
    output = runCommand(commandline, expectedReturnCodes=[0, 255], stdout=PIPE, suppressOutput=True)

    for line in output[1].splitlines():
        if hadoop_home_dir in line:
            if "java" in line:
                ContainerUtils.getLogger(proxy).info("[hadoop_enabler_common] Issuing Kill command for orphaned process [" + str(line) + "]")
                pid = int(line.split(None, 1)[0])
                os.kill(pid, signal.SIGKILL)
def doShutdown():

    ContainerUtils.getLogger(proxy).info("[hadoop_enabler_balancer] Beginning doShutdown()")

    proxy.getContainer().getRuntimeContext().getVariable('hadoop_enabler_balancer_BALANCER_EXIT_FLAG').setValue("True")
    
    stopBalancer()
    
    processRequetsThread = proxy.getContainer().getRuntimeContext().getVariable('hadoop_enabler_balancer_BALANCER_PROCESS_REQUEST_THREAD').getValue()
    if processRequetsThread.isAlive():
        ContainerUtils.getLogger(proxy).info("[hadoop_enabler_balancer] Waiting for Processing thread to exit.")
        processRequetsThread.join()

    checkForReqThread = proxy.getContainer().getRuntimeContext().getVariable('hadoop_enabler_balancer_BALANCER_CHECKFOR_REQUEST_THREAD').getValue()
    if checkForReqThread.isAlive():
        ContainerUtils.getLogger(proxy).info("[hadoop_enabler_balancer] Waiting for Queue monitor thread to exit.")
        checkForReqThread.join()
    
    ContainerUtils.getLogger(proxy).info("[hadoop_enabler_balancer] Exiting doShutdown()")
def deleteHDFSFile(file): 

    hadoop_bin_dir = proxy.getContainer().getRuntimeContext().getVariable('hadoop_enabler_HADOOP_BIN_DIR').getValue()        

    commandline = os.path.join(hadoop_bin_dir, "hadoop") + " fs -rm " + str(file)
    output = runCommand(commandline, expectedReturnCodes=[0, 255])

    if (output[0] == 0):
        ContainerUtils.getLogger(proxy).info("[hadoop_enabler_common] Successfully deleted [" + str(file) + "]")            
    elif (output[0] == 255):
        ContainerUtils.getLogger(proxy).warning("[hadoop_enabler_common] File already deleted [" + str(file) + "]. Continuing Processing")
    else:            
        ContainerUtils.getLogger(proxy).severe("[hadoop_enabler_common] Unexpected return code [" + str(output[0]) + "] when attempting to delete.]")
def rcvTrue(rcv):
    
    ContainerUtils.getLogger(proxy).finer("[hadoop_enabler_common] checking runtimecontext variable [" + str(rcv) + "]")
    
    rcvvalue = proxy.getContainer().getRuntimeContext().getVariable(rcv).getValue()
    ContainerUtils.getLogger(proxy).finest("[hadoop_enabler_common] value is [" + str(rcvvalue) + "].")
    if (str(rcvvalue).lower() in ("yes", "y", "true",  "t", "1")): 
        result = True
    elif (str(rcvvalue).lower() in ("no",  "n", "false", "f", "0")): 
        result = False
    else:
        raise Exception("[hadoop_enabler_common] Invalid value for boolean conversion: [" + str(rcvvalue) + "]")
    ContainerUtils.getLogger(proxy).finer("[hadoop_enabler_common] Exiting Checking enabler flag. Result is [" + str(result) + "]")
    return result
    def run(self):
        ContainerUtils.getLogger(proxy).info("[hadoop_enabler_balancer] Starting checkForRequestsThread.run()")

        """
        Redirect stdout and stderr for this thread. 
        """
        sys.stdout = self.slstdout
        sys.stderr = self.slstderr
 
        try:
            checkForRequests(self.lock)
        except:
            ContainerUtils.getLogger(proxy).severe("[hadoop_enabler_balancer] Unexpected error from checkForRequests thread")
            traceback.print_exc()
        ContainerUtils.getLogger(proxy).info("[hadoop_enabler_balancer] Exiting checkForRequestsThread.run()")
def checkForRequests(lock):

    pollperiod = getContainerRunningConditionPollPeriod()/1000

    while not rcvTrue('hadoop_enabler_balancer_BALANCER_EXIT_FLAG'):

        lock.acquire()
        receivedReqs = getBalancerReceivedRequests()
        currentReqs = getBalancerRequestsFromQueue()
            
        ContainerUtils.getLogger(proxy).fine("[hadoop_enabler_balancer] Current request list [" + str(currentReqs) +  "].")
        ContainerUtils.getLogger(proxy).fine("[hadoop_enabler_balancer] Previous request.list [" + str(receivedReqs) +  "].")
        if receivedReqs != currentReqs: 
            ContainerUtils.getLogger(proxy).info("[hadoop_enabler_balancer] Balancer Requests have changed since last checked.")
            proxy.getContainer().getRuntimeContext().getVariable('hadoop_enabler_balancer_BALANCER_NEW_REQUEST_FLAG').setValue("True")
            setBalancerReceivedRequests(currentReqs)
            stopBalancer()

        lock.release()

        time.sleep(pollperiod)
def processRequests(lock):
    
    pollperiod = getContainerRunningConditionPollPeriod()/1000
    
    while not rcvTrue('hadoop_enabler_balancer_BALANCER_EXIT_FLAG'):
        
        timer = threading.Timer(pollperiod, retryTimerElapsed)
        timer.start()
            
        lock.acquire()
        if rcvTrue("hadoop_enabler_balancer_BALANCER_NEW_REQUEST_FLAG"):

            ContainerUtils.getLogger(proxy).info("[hadoop_enabler_balancer] Beginning processing of new requests")

            receivedReqs = getBalancerReceivedRequests()
            local_receivedReqs = list(receivedReqs)

            proxy.getContainer().getRuntimeContext().getVariable('hadoop_enabler_balancer_BALANCER_NEW_REQUEST_FLAG').setValue("False")

            lock.release()
            runBalancer()
            lock.acquire()
            
            if not rcvTrue("hadoop_enabler_balancer_BALANCER_NEW_REQUEST_FLAG"):
                ContainerUtils.getLogger(proxy).info("[hadoop_enabler_balancer] Deleting processed requests")
                for request in local_receivedReqs:            
                    deleteHDFSFile(request)
                setBalancerReceivedRequests([])
                    
        lock.release()

        if (rcvTrue("hadoop_enabler_balancer_BALANCER_NEW_REQUEST_FLAG") or rcvTrue("hadoop_enabler_balancer_BALANCER_EXIT_FLAG")):
            if timer.isAlive():
                ContainerUtils.getLogger(proxy).info("[hadoop_enabler_balancer] Terminating retry timer early")
                timer.cancel()
        else:
            timer.join()
def doStart():
    
    ContainerUtils.getLogger(proxy).info("[hadoop_enabler_balancer] Beginning doStart()")
    
    hadoop_home_dir = proxy.getContainer().getRuntimeContext().getVariable('hadoop_enabler_HADOOP_HOME_DIR').getValue()
    
    doStart_common()                 

    processRequetsThread = proxy.getContainer().getRuntimeContext().getVariable('hadoop_enabler_balancer_BALANCER_PROCESS_REQUEST_THREAD').getValue()
    processRequetsThread.start()
    
    startupdelay = 0
    if (True):   #TODO  Base decision to delay on whether Namenode just started or has been running for a while 
        ContainerUtils.getLogger(proxy).info("[hadoop_enabler_balancer] Hadoop cluster is just starting.  Waiting [" + str(startupdelay) + 
                                             "] seconds before processing any balancer requests so more datanodes can join.")
    else:
        startupdelay = 0
        
    time.sleep(startupdelay)
    
    checkForReqThread = proxy.getContainer().getRuntimeContext().getVariable('hadoop_enabler_balancer_BALANCER_CHECKFOR_REQUEST_THREAD').getValue()
    checkForReqThread.start()
    
    ContainerUtils.getLogger(proxy).info("[hadoop_enabler_balancer] Exiting doStart()")
def hasContainerStarted():
    status = True    
    ContainerUtils.getLogger(proxy).info("[hadoop_enabler_balancer - hasContainerStarted()]  Return status is: " + str(status))
    return status
def getContainerRunningConditionPollPeriod():
    pollperiod = proxy.getContainer().getRuntimeContext().getVariable('hadoop_enabler_ENABLER_RUNNING_POLLPERIOD').getValue()
    ContainerUtils.getLogger(proxy).info("[hadoop_enabler_common] Will verify enabler is running every " + str(pollperiod) + " seconds.")
    return float(pollperiod) * 1000
def retryTimerElapsed():
    ContainerUtils.getLogger(proxy).fine("[hadoop_enabler_balancer] Minimum poll-period timer elapsed.")
def printStdoutPipe(stdout, outputlist):

    if (stdout == PIPE):
        ContainerUtils.getLogger(proxy).info("[hadoop_enabler_common] Command STDOUT:")
        print outputlist[1]
                      "dfs.datanode.address",
                      "dfs.datanode.http.address",
                      "dfs.datanode.ipc.address",
                      "dfs.hosts.exclude",
                      "dfs.name.dir",
                      "dfs.data.dir",
                      "mapred.job.tracker",
                      "mapred.job.tracker.http.address",
                      "mapred.task.tracker.http.address"
                      ]

try: proxy
except NameError:    
    globals()['proxy'] = inspect.currentframe().f_back.f_globals['proxy']
else: pass
logger = ContainerUtils.getLogger(proxy)

def getDynamicGridlibDependencies():
    logger.info("[hadoop_enabler_common] Beginning getDynamicGridlibDependencies()")

    hadoopVersion = getHadoopVersion()
    logger.info("[hadoop_enabler_common] Hadoop Distribution version is [" + str(hadoopVersion) +"]")    

    defaultDomainGridlib = GridlibInfo()
    defaultDomainGridlib.name = "default-domain-type"
    
    logger.info("[hadoop_enabler_common] Adding Hadoop distribution dependency")
    gridlib = GridlibInfo()
    gridlib.name = "hadoop-distribution"
    gridlib.version = str(hadoopVersion)
    
def doInitHadoopProps(userProp_RCVname, userPropFile_RCVname, additionalVariables):

    ContainerUtils.getLogger(proxy).info("[hadoop_enabler] Checking for user property file to augment [" + str(userProp_RCVname) + "].")
    
    userPropsRCV = proxy.getContainer().getRuntimeContext().getVariable(userProp_RCVname)
    userPropsPredefined = False
    if (userPropsRCV == None):
        userProps = ""         
    else:
        userPropsPredefined = True
        userProps =  userPropsRCV.getValue()
        ContainerUtils.getLogger(proxy).info("[hadoop_enabler] User properties variable ${" + userProp_RCVname + 
                                                "} is was imported or pre-defined on component.  Starting value is [" + str(userProps) + "].")

    userPropFile = proxy.getContainer().getRuntimeContext().getVariable(userPropFile_RCVname).getValue()

    if (userPropFile != "") and os.path.isfile(userPropFile):
        ContainerUtils.getLogger(proxy).info("[hadoop_enabler] User property file found [" + str(userPropFile) + "].")
        xmldoc = minidom.parse(userPropFile)
        propertylist = xmldoc.getElementsByTagName('property')
    
        if propertylist == None or len(propertylist) == 0:
            ContainerUtils.getLogger(proxy).warning("[hadoop_enabler] No property elements found in user property file.")
        else:
            for element in propertylist:
                nameElements = element.getElementsByTagName("name")
                name = getNodeText(nameElements[0])
    
                isReserved = False                
                for reservedproperty in reservedproperties:
                    if reservedproperty.count(name) > 0:
                       isReserved = True
                       break
                
                if isReserved:
                    ContainerUtils.getLogger(proxy).warning("[hadoop_enabler] The property [" + str(name) + "] is managed by the Hadoop Enabler.  Will ignore user supplied value.")
                else:    
                    ContainerUtils.getLogger(proxy).info("[hadoop_enabler] Applying user property [" + str(element.toxml()) + "].")
                    userProps = userProps + element.toxml()
    
    if userPropsPredefined:
        proxy.getContainer().getRuntimeContext().getVariable(userProp_RCVname).setValue(userProps)
    else:
        additionalVariables.add(RuntimeContextVariable(userProp_RCVname, userProps, RuntimeContextVariable.STRING_TYPE,"User Supplied Hadoop properties" , False, RuntimeContextVariable.NO_INCREMENT))
from com.datasynapse.fabric.admin.info import AllocationInfo
from com.datasynapse.fabric.util import GridlibUtils, ContainerUtils
from com.datasynapse.fabric.common import RuntimeContextVariable, ActivationInfo
from com.datasynapse.fabric.admin.info import ComponentAllocationInfo
from subprocess import PIPE
import os
import time
import socket
import sys
import threading
import logging

sys.path.append(proxy.getContainer().getScript(0).getFile().getParentFile().getAbsolutePath())
ContainerUtils.getLogger(proxy).info("sys.path modified: " + str(sys.path) )
from hadoop_enabler_common import *

def doInit(additionalVariables):

    ContainerUtils.getLogger(proxy).info("[hadoop_enabler_balancer] Beginning doInit()")

    doInit_common(additionalVariables)        
    
    additionalVariables.add(RuntimeContextVariable("hadoop_enabler_balancer_BALANCER_RECEIVED_REQUESTS", "", 
                                                   RuntimeContextVariable.STRING_TYPE))

    additionalVariables.add(RuntimeContextVariable("hadoop_enabler_balancer_BALANCER_NEW_REQUEST_FLAG", "False", 
                                                   RuntimeContextVariable.STRING_TYPE))

    additionalVariables.add(RuntimeContextVariable("hadoop_enabler_balancer_BALANCER_EXIT_FLAG", "False", 
                                                   RuntimeContextVariable.STRING_TYPE))