Quantcast
Channel: WebSphere Blog by Steve Robinson » MBean
Viewing all articles
Browse latest Browse all 4

WebSphere Jython to set JVM properties – WebSphere Jython Example – Class

$
0
0

 Ths class below was created to manage JVMs. To create, update or delete JVM properties, and add custom props. It is designed using an OO approach and imlpements Log4J for logging.

 

#Import Java logging - Assumes class in in WAS class path ie wsadmin.properties for DMGR profile.
from org.apache.log4j import Logger
from org.apache.log4j import PropertyConfigurator
#Global logger variable - local to this script
global logger
#######################################################################################################
# CLASS: This class provides the ability to create/modify JVM parameters.
#######################################################################################################
#We work on the premis that this class is pushing the config to a specifc names server at any one time.
class JVM:
   
    __beanId = None
    __beanObjectId = None
    __cellName = None
    __scope = None
    __clusterName = None
    __nodeName = None
    __serverName = None
    __simulateMode = "false"
    __modifyOnCreateMode = "false"  #If true will modify a during create if variable already exists
   
    #Instance Variables
  
    __serverName  = None                    #- The name of the Server whose process definition is modified. If there is only one server in the entire configuration, then this parameter is optional.
    __nodeName = None                       #- The name of the node. This is only needed for the server scopes that do not have a unique name across nodes.
    __classpath = None                      #- The standard class path in which the Java virtual machine code looks for classes.
    __bootClasspath = None                  #- Bootstrap classes and resources for JVM code. This option is only available for JVM instructions that support bootstrap classes and resources. You can separate multiple paths by a colon (:) or semi-colon (;), depending on operating system of the node.
    __verboseModeClass = None               #- Specifies whether to use verbose debug output for class loading. The default is not to enable verbose class loading.
    __verboseModeGarbageCollection = None   #- Specifies whether to use verbose debug output for garbage collection. The default is not to enable verbose garbage collection
    __verboseModeJNI = None                 #- Specifies whether to use verbose debug output for native method invocation. The default is not to enable verbose Java Native Interface (JNI) activity.
    __initialHeapSize = None                #- Specifies the initial heap size available to the JVM code, in megabytes.
    __maximumHeapSize = None                #- Specifies the maximum heap size available to the JVM code, in megabytes.
    __runHProf = None                       #- This setting applies to base WebSphere Application Server only. It specifies whether to use HProf profiler support. To use another profiler, specify the custom profiler settings using the HProf Arguments setting. The default is not to enable HProf profiler support.
    __hprofArguments = None                 #- This setting applies to base WebSphere Application Server only. It specifies command-line profiler arguments to pass to the JVM code that starts the application server process. You can specify arguments when HProf profiler support is enabled.
    __debugMode = None                      #- Specifies whether to run the JVM in debug mode. The default is not to enable debug mode support.
    __debugArgs = None                      #- Specifies command-line debug arguments to pass to the JVM code that starts the application server process. You can specify arguments when Debug Mode is enabled.
    __genericJvmArguments = None            #- Specifies command line arguments to pass to the Java virtual machine code that starts the application server process.
    __internalClassAccessMode = None        #- Specifies the internal Class Access Mode for the JVM.  <ALLOW | RESTRICT>
    __executableJarFileName = None          #- Specifies a full path name for an executable JAR file that the JVM code uses.
    __disableJIT = None                     #- Specifies whether to disable the just in time (JIT) compiler option of the JVM code.
    __osName = None                         #- Specifies JVM settings for a given operating system. When started, the process uses the JVM settings for the operating system of the node.

  
    #-------------------------------------------------------------------------------------
    #Constructor
    #-------------------------------------------------------------------------------------
    def __init__(self,*args) :
        #ensure we know we are using a global var.
        global logger
        #PropertyConfigurator.configure('/root/scripts/wmqManager/log4j.properties')
        PropertyConfigurator.configure('c:/scripts/jvmManager/log4j.properties')
        logger = Logger.getLogger("JVM Manager")
        #use the config data in the properties file
        logger.info("Instantiated a JVM Manager Object")
        logger.debug("EXIT: __init__()")
    #endDef
  
    #-------------------------------------------------------------------------------------
    #Class Setter Methods ...
    #-------------------------------------------------------------------------------------
    def nodeName(self, valueString):
        logger.debug("SETTER: nodeName")
        self.__nodeName = valueString;
    #endDef
   
    def serverName(self, valueString):
        logger.debug("SETTER: serverName")
        self.__serverName = valueString;
    #endDef
   
    def classpath(self, pathString):
        logger.debug("SETTER: classpath")
        self.__classpath = pathString;
    #endDef
  
    def bootClasspath(self, pathString):
        logger.debug("SETTER: bootClasspath")
        self.__bootClasspath = pathString;
    #endDef
     
    def verboseModeClass(self, state):
        logger.debug("SETTER: verboseModeClass")
        self.__verboseModeClass = state;
    #endDef

    def verboseModeGarbageCollection(self, state):
        logger.debug("SETTER: verboseModeGarbageCollection")
        self.__verboseModeGarbageCollection = state;
    #endDef

    def verboseModeJNI(self, state):
        logger.debug("SETTER: verboseModeJNI")
        self.__verboseModeJNI = state;
    #endDef

    def initialHeapSize(self, size):
        logger.debug("SETTER: initialHeapSize")
        self.__initialHeapSize = size;
    #endDef
 
    def maximumHeapSize(self, size):
        logger.debug("SETTER: maximumHeapSize")
        self.__maximumHeapSize = size;
    #endDef

    def runHProf(self, state):
        logger.debug("SETTER: runHProf")
        self.__runHProf = state;
    #endDef
  
    def hprofArguments(self, argString):
        logger.debug("SETTER: hprofArguments")
        self.__hprofArguments = argString;
    #endDef
  
    def debugMode(self, state):
        logger.debug("SETTER: debugMode")
        self.__debugMode = state;
    #endDef

    def debugArgs(self, argString):
        logger.debug("SETTER: debugArgs")
        self.__debugArgs = argString;
    #endDef

    def genericJvmArguments(self, argString):
        logger.debug("SETTER: genericJvmArguments")
        self.__genericJvmArguments = argString;
    #endDef
  
    def internalClassAccessMode(self, state):
        logger.debug("SETTER: internalClassAccessMode")
        self.__internalClassAccessMode = argString;
    #endDef
   
    def executableJarFileName(self, fileNameString):
        logger.debug("SETTER: executableJarFileName")
        self.__executableJarFileName = fileNameString;
    #endDef
   
    def disableJIT(self, state):
        logger.debug("SETTER: disableJIT")
        self._disableJIT = state;
    #endDef
   
   #-------------------------------------------------------------------------------------
    #Class Getter Methods for resource object...
    #-------------------------------------------------------------------------------------
    def getServerName(self) :
        logger.debug("GETTER: getServerName")
        return self.__serverName
    #endDef
   
   
    #-------------------------------------------------------------------------------------
    #Scope Methods...
    #-------------------------------------------------------------------------------------
    def setCellScope(self, cellName) :
        logger.debug( "SETTER: setCellScope")
        self.__scope = "cell";
        self.__cellName = cellName;
    #endDef

    def setNodeScope(self, nodeName) :
        logger.debug( "SETTER: setNodeScope")
        self.__scope = "node";
        self.__nodeName = nodeName;
    #endDef

    def setClusterScope(self, clusterName) :
        logger.debug( "SETTER: setClusterScope")
        self.__scope = "cluster";
        logger.debug("self.__scope=" + self.__scope)
        self.__clusterName = clusterName;
        logger.debug("self.__clusterName=" + self.__clusterName)
       
    #endDef

    def setServerScope(self, nodeName, serverName) :
        logger.debug( "SETTER: setServerScope")
        self.__scope = "server";
        self.__nodeName = nodeName;
        self.__serverName = serverName;
    #endDef

    #-------------------------------------------------------------------------------------
    #Decision tree Methods...
    #-------------------------------------------------------------------------------------
    def setModifyOnCreateMode(self, booleanString) :
        logger.debug( "SETTER: setModifyOnCreateMode")
        if ((booleanString == "") or (booleanString == None)) :
            self.__modifyOnCreateMode = "false";
        else :
            self.__modifyOnCreateMode = "true";
        #endIf
       
    #endDef   
   
    def setSimulateMode(self, booleanString) :
        logger.debug( "SETTER: setSimulateMode")
        if ((booleanString == "") or (booleanString == None)) :
            self.__simulateMode = "false";
        else :
            self.__simulateMode = "true";
        #endIf
    #endDef
    #-------------------------------------------------------------------------------------
    #getAttribute Method...
    #-------------------------------------------------------------------------------------
    def getAttributes(self):
        logger.debug("ENTER: getAttributes()")
        attrib = ""
        if(self.__serverName) == "":
            print "ERROR: No Server Name"
            sys.exit(0)
        if self.__nodeName == None:
            print "ERROR: No Node Name"
            sys.exit(0)
        if(self.__nodeName) != None:
            attrib = attrib + '-nodeName ' + self.__nodeName
        if(self.__serverName) != None:
            attrib = attrib + ' -serverName ' + self.__serverName
        if self.__verboseModeClass != None:
            attrib = attrib + ' -verboseModeClass ' + self.__verboseModeClass
        if self.__verboseModeGarbageCollection != None:
            attrib = attrib + ' -verboseModeGarbageCollection ' + self.__verboseModeGarbageCollection
        if self.__verboseModeJNI != None:
            attrib = attrib + ' -verboseModeJNI ' + self.__verboseModeJNI
        if self.__initialHeapSize != None:
            attrib = attrib + ' -initialHeapSize ' + self.__initialHeapSize
        if self.__maximumHeapSize != None:
            attrib = attrib + ' -maximumHeapSize ' + self.__maximumHeapSize
        if self.__runHProf != None:
            attrib = attrib + ' -runHProf ' + self.__runHProf
        if self.__hprofArguments != None:
            attrib = attrib + ' -hprofArguments ' + self.__hprofArguments
        if self.__debugMode != None:
            attrib = attrib + ' -debugMode ' + self.__debugMode
        if self.__debugArgs != None:
            attrib = attrib + ' -debugArgs ' + self.__debugArgs
        if self.__genericJvmArguments != None:
            attrib = attrib + ' -genericJvmArguments ' + '"' + self.__genericJvmArguments + '"'
        if self.__executableJarFileName != None:
            attrib = attrib + ' -executableJarFileName ' + self.__executableJarFileName
        if self.__internalClassAccessMode != None:
            attrib = attrib + ' -internalClassAccessMode ' + self.__internalClassAccessMode
        if self.__disableJIT != None:
            attrib = attrib + ' -disableJIT ' + self.__disableJIT
        if self.__osName != None:
            attrib = attrib + ' -osName ' + self.__osName
        return "[" + attrib + "]"
        logger.debug("EXIT: getAttributes()")
    #endDef
   
    #Helper for converting string to list
    def wsadminToList(self,inStr):
        inStr = inStr.rstrip();
        outList=[]
        if (len(inStr)>0 and inStr[0]=='[' and inStr[-1]==']'):
            tmpList = inStr[1:-1].split(" ")
        else:
            tmpList = inStr.split("\n")  #splits for Windows or Linux
        for item in tmpList:
            item = item.rstrip();        #removes any Windows "\r"
            if (len(item)>0):
                outList.append(item)
        return outList
        #endDef
#endDef

    #-------------------------------------------------------------------------------------
    #Modify Method...
    #-------------------------------------------------------------------------------------
    def modify(self):
        logger.debug("ENTER: modify()")
        logger.debug( "Modifying the following JVM attributes: " + self.getAttributes())
        #Apply the JVM Settings
        AdminTask.setJVMProperties(self.getAttributes())
        #this is an example of how to call the set JVMProperties.
        #AdminTask.setJVMProperties('[-nodeName node01 -serverName server1 -verboseModeClass true]')
        #save
        logger.debug("Saving configuration after setting new attributes to JVM (" + self.__nodeName + ":" + self.__serverName + ")")
        AdminConfig.save()
        logger.debug("Modify - COMPLETED SUCCESSFULLY")
        logger.debug("EXIT: modify()")
    #endDef
   
   
   
    #-------------------------------------------------------------------------------------
    #propExists Method...
    #-------------------------------------------------------------------------------------
    def propExists(self, existingName):
        logger.debug("ENTER: propExists()")
        returnVal = 0
       
        if((self.__cellName == "") or (self.__cellName == None)) :
            self.__cellName = AdminControl.getCell()
            logger.warn("setCellName method was not called, assuming current cell")
        #endIf
       
        if( (self.__nodeName == None) or (self.__nodeName=="") ):
            logger.error("self.__serverName property not set!")
        #end
       
        nodeId = AdminConfig.getid("/Node:" + self.__nodeName + "/")
        logger.debug("nodeId = " + nodeId)
       
       
        if( (self.__serverName == None) or (self.__serverName=="") ):
            logger.error("self.__serverName property not set!")
        #end
       
        serverId = AdminConfig.getid("/Node:" + self.__nodeName + "/Server:" + self.__serverName + "/")
        if(serverId == "" or serverId == None) :
            logger.debug("Server beanid not located, check server name. EXIT: propExists")
            return
        #endIf

        logger.debug("serverId = " + serverId)
        name = AdminConfig.showAttribute(serverId, "name")
        logger.debug("name=" + name)
       
       
        jvmProps = AdminConfig.getid("/Cell:"+self.__cellName+"/Node:"+self.__nodeName+"/Server:"+self.__serverName+"/JavaProcessDef:/JavaVirtualMachine:/Property:/" )
        logger.debug("jvmProps=" + str(jvmProps))
        jvmProps = jvmProps.splitlines()
        logger.debug("jvmProps=" + str(jvmProps))

        for jvmProp in jvmProps:
            logger.debug("jvmprop=" + jvmProp)
            name = AdminConfig.showAttribute(jvmProp, "name" )
            logger.debug("name=" + name)
            if(existingName==name):
                logger.debug("Property [" + name + "] already exists!")
                value = AdminConfig.showAttribute(jvmProp, "value" )
                logger.debug("value=" + value)
                returnVal = 1
                break
            #endIf
        #endFor
       
        logger.debug("returnVal=" + str(returnVal))
        logger.debug("EXIT: propExists()")
        return returnVal
     
    #endDef
   
   
   
      #-------------------------------------------------------------------------------------
    #propExists Method...
    #-------------------------------------------------------------------------------------
    def removeCustomProp(self, existingName):
        logger.debug("ENTER: removeCustomProp()")
        found = 0
       
        if((self.__cellName == "") or (self.__cellName == None)) :
            self.__cellName = AdminControl.getCell()
            logger.warn("setCellName method was not called, assuming current cell")
        #endIf
       
        if( (self.__nodeName == None) or (self.__nodeName=="") ):
            logger.error("self.__serverName property not set!")
        #end
       
        nodeId = AdminConfig.getid("/Node:" + self.__nodeName + "/")
        logger.debug("nodeId = " + nodeId)
       
       
        if( (self.__serverName == None) or (self.__serverName=="") ):
            logger.error("self.__serverName property not set!")
        #end
       
        serverId = AdminConfig.getid("/Node:" + self.__nodeName + "/Server:" + self.__serverName + "/")
        if(serverId == "" or serverId == None) :
            logger.debug("Server beanid not located, check server name. EXIT: propExists")
            return
        #endIf

        logger.debug("serverId = " + serverId)
        name = AdminConfig.showAttribute(serverId, "name")
        logger.debug("name=" + name)
       
       
        jvmProps = AdminConfig.getid("/Cell:"+self.__cellName+"/Node:"+self.__nodeName+"/Server:"+self.__serverName+"/JavaProcessDef:/JavaVirtualMachine:/Property:/" )
        logger.debug("jvmProps=" + str(jvmProps))
        jvmProps = jvmProps.splitlines()
        logger.debug("jvmProps=" + str(jvmProps))

        for jvmProp in jvmProps:
            logger.debug("jvmprop=" + jvmProp)
            name = AdminConfig.showAttribute(jvmProp, "name" )
            logger.debug("name=" + name)
            if(existingName==name):
                logger.debug("Property [" + name + "] exists!")
                value = AdminConfig.showAttribute(jvmProp, "value" )
                logger.debug("value=" + value)
                found = 1
                break
            #endIf
        #endFor
       
        if(found==1) :
            logger.info( "Removing property...")
            AdminConfig.remove(jvmProp)
             #Save if set to do so
            if( self.__simulateMode=="true" ) :
                logger.warn( "Simuation mode = " + self.__simulateMode + ", save inhibited")
            else :
                logger.info( "remove: Saving configuration after adding new property")
                AdminConfig.save()
            #end If
        else :
            logger.warn( "Property [" +  name + "] on server [" + self.__serverName + "] was not located. No remove action was performed!")
            #endIf
        #endIf

        logger.debug("EXIT: removeCustomProp()")
     
    #endDef
   
   
    #-------------------------------------------------------------------------------------
    #ListCustomProps Method...
    #-------------------------------------------------------------------------------------
    def listCustomProps(self):
        logger.debug("ENTER: listCustomProps()")
       
        if((self.__cellName == "") or (self.__cellName == None)) :
            self.__cellName = AdminControl.getCell()
            logger.warn("setCellName method was not called, assuming current cell")
        #endIf
       
        if( (self.__nodeName == None) or (self.__nodeName=="") ):
            logger.error("self.__serverName property not set!")
        #end
       
        nodeId = AdminConfig.getid("/Node:" + self.__nodeName + "/")
        logger.debug("nodeId = " + nodeId)
       
       
        if( (self.__serverName == None) or (self.__serverName=="") ):
            logger.error("self.__serverName property not set!")
        #end
       
        serverId = AdminConfig.getid("/Node:" + self.__nodeName + "/Server:" + self.__serverName + "/")
        if(serverId == "" or serverId == None) :
            logger.debug("Server beanid not located, check server name. EXIT: listCustomProps")
            return
        #endIf

        logger.debug("serverId = " + serverId)
        name = AdminConfig.showAttribute(serverId, "name")
        logger.debug("name=" + name)
       
       
        jvmProps = AdminConfig.getid("/Cell:"+self.__cellName+"/Node:"+self.__nodeName+"/Server:"+self.__serverName+"/JavaProcessDef:/JavaVirtualMachine:/Property:/" )
        #On closer examination, you can't really see in a print statement unless in interactive console, but the fact is that the elements are separated by newline characters ("\r\n") and the entire result is surrounded by single quotation marks.
        #Thus, wsadmin is actually returning a Jython string see type output immediately below.
        logger.debug( type(jvmProps))
        logger.debug("jvmProps=" + str(jvmProps))
       
        #To get the elements ie an array (known as a Jython list), you first have to remove the line separators and convert the string to a Jython list. You use the splitlines() function to turn the results into a list
        jvmProps = jvmProps.splitlines()
        logger.debug( type(jvmProps))
        logger.debug("jvmProps=" + str(jvmProps))
       
        #Method one : Get properties from the property list inside a JavaVirtualMachine mbean object
        for jvmProp in jvmProps:
            logger.debug("jvmprop=" + jvmProp)
            name = AdminConfig.showAttribute(jvmProp, "name" )
            logger.debug("name=" + name)
            value = AdminConfig.showAttribute(jvmProp, "value" )
            logger.debug("value=" + value)
        #endFor
       
        #Method two : Iterate the JVM properties from a given JJavaVirtualMachine mbean object. This option is more confusing, but valid.
        jvmId = AdminConfig.list("JavaVirtualMachine", serverId)
        logger.debug("jvmId=" + jvmId)
       
        #In this example we see that by returning attrbites we do not have a comma delimited list, rather a " " (space) delimted list and thus the code has to be different. In this case use the old nugget of wsadminToList function.
        jvmProps = AdminConfig.showAttribute(jvmId, "systemProperties")
        jvmProps = self.wsadminToList(jvmProps)
        logger.debug("jvmProps=" + str(jvmProps))
        #Iterate and display properties
        for jvmProp in jvmProps:
            logger.debug("jvmProp=" + jvmProp)
            name = AdminConfig.showAttribute(jvmProp, "name")
            logger.debug("name=" + name)
            value = AdminConfig.showAttribute(jvmProp, "value")
            logger.debug("value=" + value)
        #endFor
       
        logger.debug("listCustomProps - COMPLETED SUCCESSFULLY")
        logger.debug("EXIT: listCustomProps()")
    #endDef
   
   
    #-------------------------------------------------------------------------------------
    #createCustomProp Method...
    #-------------------------------------------------------------------------------------
    def createCustomProp(self, name, value, description):
        logger.debug("ENTER: createCustomProp()")
       
        if (name == "" or name == None) :
            logger.error("name property not set! name required to add a property")
            logger.debug( "EXIT: createCustomProp()")
            return
        #endIf
       
        if (value == "" or value == None) :
            logger.error("value property not set! value required to add a property")
            logger.debug( "EXIT: createCustomProp()")
            return
        #endIf
       
        if((self.__cellName == "") or (self.__cellName == None)) :
            self.__cellName = AdminControl.getCell()
            logger.warn("setCellName method was not called, assuming current cell")
        #endIf
       
        if( (self.__nodeName == None) or (self.__nodeName=="") ):
            logger.error("self.__serverName property not set!")
        #end
       
        nodeId = AdminConfig.getid("/Node:" + self.__nodeName + "/")
        logger.debug("nodeId = " + nodeId)
       
       
        if( (self.__serverName == None) or (self.__serverName=="") ):
            logger.error("self.__serverName property not set!")
        #end
       
        jvmId = AdminConfig.getid("/Cell:"+self.__cellName+"/Node:"+self.__nodeName+"/Server:"+self.__serverName+"/JavaProcessDef:/JavaVirtualMachine:/" )
        logger.debug("jvmId = " + jvmId)
        if(jvmId == "" or jvmId == None) :
            logger.debug("Server (jvm) beanid not located, check server name. EXIT: createCustomProp")
            return
        #endIf
       
        #Create the attributes for our new property to be added to the JMVs custom props
        attrib = ""
        if(name != "" and name !=None):
            logger.debug("Apppending attribute... ")
            attrib += '[' + "name " + '"' + name + '"' + ']'
            logger.debug(attrib)
        #endIf
       
        if(value != "" and value != None):
            logger.debug("Apppending attribute... ")
            attrib += '[' + "value " + '"' + value + '"' + ']'
            logger.debug(attrib)
        #endIf
       
        if(description != "" and description != None):
            logger.debug("Apppending attribute... ")
            attrib += '[' + "description " + '"' + description + '"' + ']'
            logger.debug(attrib)
        #endIf
       
       
        logger.debug("Attributes: " +  attrib)
        attrib =  "[" + attrib + "]"
       
        if(self.propExists(name)==0) :
            AdminConfig.create('Property', jvmId, attrib)
             #Save if set to do so
            if( self.__simulateMode=="true" ) :
                logger.warn( "Simuation mode = " + self.__simulateMode + ", save inhibited")
            else :
                logger.info( "create: Saving configuration after adding new property")
                AdminConfig.save()
            #end If
        else :
            if( self.__modifyOnCreateMode=="true" ) :
                logger.warn( "Modifying existing entry...")
                self.modifyCustomProp(name, value, description)
            #endIf
        #endIf
           
        '''
        jvmId = (cells/myCell01/nodes/myNode01/servers/Server1|server.xml#JavaVitualMachine_1343632560875)
        AdminConfig.create('Property', '(cells/myCell01/nodes/myNode01/servers/Server1|server.xml#JavaVirtualMachine_1343632560875)',
       
        '[       
        [validationExpression ""]
        [name "test"]
        [description ""]
        [value "value"]
        [required "false"]
        ]')
        '''      

        logger.debug("createCustomProp - COMPLETED SUCCESSFULLY")
        logger.debug("EXIT: createCustomProps()")
    #endDef
   
   
    #-------------------------------------------------------------------------------------
    #modifyCustomProp Method...
    #-------------------------------------------------------------------------------------
    def modifyCustomProp(self, name, value, description):
        logger.debug("ENTER: modifyCustomProp()")
       
        if (name == "" or name == None) :
            logger.error("name property not set! name required to add a property")
            logger.debug( "EXIT: modifyCustomProp()")
            return
        #endIf
       
        if (value == "" or value == None) :
            logger.error("value property not set! value required to add a property")
            logger.debug( "EXIT: modifyCustomProp()")
            return
        #endIf
       
        if((self.__cellName == "") or (self.__cellName == None)) :
            self.__cellName = AdminControl.getCell()
            logger.warn("setCellName method was not called, assuming current cell")
        #endIf
       
        if( (self.__nodeName == None) or (self.__nodeName=="") ):
            logger.error("self.__serverName property not set!")
        #end
       
        nodeId = AdminConfig.getid("/Node:" + self.__nodeName + "/")
        logger.debug("nodeId = " + nodeId)
       
       
        if( (self.__serverName == None) or (self.__serverName=="") ):
            logger.error("self.__serverName property not set!")
        #end
       
        jvmProps = AdminConfig.getid("/Cell:"+self.__cellName+"/Node:"+self.__nodeName+"/Server:"+self.__serverName+"/JavaProcessDef:/JavaVirtualMachine:/Property:/" )
        logger.debug("jvmProps=" + str(jvmProps))
        if(jvmProps == "" or jvmProps == None) :
            logger.warn("JVM propeties not located, check server name. EXIT: modifyCustomProp")
            return
        #endIf
       
        jvmProps = jvmProps.splitlines()
        logger.debug("jvmProps=" + str(jvmProps))
       
        found=0
        for jvmProp in jvmProps:
            logger.debug("jvmprop=" + jvmProp)
            existingName = AdminConfig.showAttribute(jvmProp, "name" )
            logger.debug("existingName=" + existingName)
            if(existingName==name):
                logger.debug("Property [" + existingName + "] already exists!")
                existingValue = AdminConfig.showAttribute(jvmProp, "value" )
                logger.debug("existingValue=" + existingValue)
                found = 1
                break
            #endIf
        #endFor
       
        #If we can locate the existing propertym then modify it
        if(found==1) :
            logger.debug("Modifying existing property [" + existingName + "] ...")
            logger.debug("Building required attributes ...")
            #Create the attributes for our new property to be added to the JMVs custom props
            attrib = ""
            if(name != "" and name !=None):
                logger.debug("Apppending attribute... ")
                attrib += '[' + "name " + '"' + name + '"' + ']'
                logger.debug(attrib)
            #endIf
           
            if(value != "" and value != None):
                logger.debug("Apppending attribute... ")
                attrib += '[' + "value " + '"' + value + '"' + ']'
                logger.debug(attrib)
            #endIf
           
            if(description != "" and description != None):
                logger.debug("Apppending attribute... ")
                attrib += '[' + "description " + '"' + description + '"' + ']'
                logger.debug(attrib)
            #endIf
           
           
            logger.debug("Attributes: " +  attrib)
            attrib =  "[" + attrib + "]"
           
            AdminConfig.modify( jvmProp, attrib)
           
           
            #Save if set to do so
            if( self.__simulateMode=="true" ) :
                logger.warn( "Simuation mode = " + self.__simluateMode + ", save inhibited")
            else :
                logger.info( "modify: Saving configuration after modifying existing property")
                AdminConfig.save()
                logger.debug("modifyCustomProp - COMPLETED SUCCESSFULLY")
            #end If
        else:
            logger.warn("No modifications made due to no matching property found")
        #endIf
 
        logger.debug("EXIT: modifyCustomProp()")
    #endDef
 
 logger.debug( "*** Completed Loading Class JVM")
#endClass

 
###################################################################################################
 

jvm = JVM()
jvm.setModifyOnCreateMode("true")
jvm.nodeName("myNode01")
jvm.serverName("Server1")
jvm.verboseModeClass("true")
jvm.verboseModeGarbageCollection("false")
jvm.verboseModeJNI("true")
jvm.initialHeapSize("512")
jvm.maximumHeapSize("1024")

#Create a String of generic JVM Args, this should really use a find/replce to chnge params for each server/node
gJvmArgs = "-Xbootclasspath/p:${ITCAMDCHOME}/toolkit/lib/bcm-bootstrap.jar"
gJvmArgs = gJvmArgs + " -agentlib:am_ibm_16=/opt/IBM/ITM/aix533/yn/wasdc/7.1.0.2.5/runtime/was70.P2PPA01_mgaMnode.p2ppaapp1/"
gJvmArgs = gJvmArgs + " -Xdump:heap:none"
gJvmArgs = gJvmArgs + " -verbosegc"
gJvmArgs = gJvmArgs + " -Xdump:heap:events=gpf+user,range=1..0,file=/var/was/heapdump/myServer_heapdump.%Y%m%d.%H%M%S.%pid.phd,request=exclusive+prepwalk"
gJvmArgs = gJvmArgs + " -Xdump:heap:events=systhrow,filter=java/lang/OutOfMemoryError,range=1..1,file=/var/was/heapdump/myServer_heapdump.%Y%m%d.%H%M%S.%pid.phd,request=exclusive+prepwalk"
gJvmArgs = gJvmArgs + " -Xdump:java:file=/var/was/heapdump/myServer_javacore.%Y%m%d.%H%M%S.%pid.txt"
gJvmArgs = gJvmArgs + " -Xdump:snap:file=/var/was/heapdump/myServer_snapdump.%Y%m%d.%H%M%S.%pid.trc"
gJvmArgs = gJvmArgs + " -Xdump:tool:events=gpf+abort,range=1..0,exec=USER_GENERATED=NO;/var/was/scripts/dumphandler.sh,priority=999"
gJvmArgs = gJvmArgs + " -Xdump:tool:events=user,range=1..0,exec=USER_GENERATED=YES;/var/was/scripts/dumphandler.sh,priority=999"
gJvmArgs = gJvmArgs + " -Xdump:tool:events=systhrow,filter=java/lang/OutOfMem*,range=1..0,exec=USER_GENERATED=NO;/var/wascripts/dumphandler.sh,priority=999"
gJvmArgs = gJvmArgs + " -Xdump:what"
gJvmArgs = gJvmArgs + " -Xnocompactgc"

jvm.genericJvmArguments(gJvmArgs)
#Do the actual modify + Save
jvm.modify()

#Create requires that serverName is set above.
jvm.createCustomProp("service.component.log.location","/var/log/was/" + jvm.getServerName(), "")
#jvm.modifyCustomProp("service.component.log.location","/var/log/was/" + jvm.getServerName(), "")
#jvm.removeCustomProp("service.component.log.location")
#jvm.listCustomProps()
#=============== HELP =====================
'''
 
#Note that the example uses Jython list ie keyword, where as I use value/key pair by named paramater value.
AdminConfig.modify('(cells/LW621LX6026649Cell01/nodes/LW621LX6026649Node02/servers/Server01|server.xml#JavaVirtualMachine_1334828235093)',
'[[debugArgs "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=7777"] [classpath ""] [initialHeapSize "512"] [runHProf "false"]
[genericJvmArguments "-verbosegc"] [hprofArguments ""] [osName "windows"] [bootClasspath ""] [verboseModeJNI "true"] [maximumHeapSize "1024"]
 [disableJIT "false"] [executableJarFileName ""] [verboseModeGarbageCollection "false"] [debugMode "false"] [verboseModeClass "true"]]') 
 
'''

'''
#print AdminTask.help('setJVMProperties')

WASX8006I: Detailed help for command: setJVMProperties

Description: Set Java virtual machine (JVM) configuration for the application server.

Target object: template or server object name.

Arguments:
  serverName - The name of the Server whose process definition is modified. If there is only one server in the entire configuration, then this parameter is optional.
  nodeName - The name of the node. This is only needed for the server scopes that do not have a unique name across nodes.
  processType - The process type of the server.  This is for zOS only.
  classpath - The standard class path in which the Java virtual machine code looks for classes.
  bootClasspath - Bootstrap classes and resources for JVM code. This option is only available for JVM instructions that support bootstrap classes and resources. You can separate multiple paths by a colon (:) or semi-colon (;), depending on operating system of the node.
  verboseModeClass - Specifies whether to use verbose debug output for class loading. The default is not to enable verbose class loading.
  verboseModeGarbageCollection - Specifies whether to use verbose debug output for garbage collection. The default is not to enable verbose garbage collection
  verboseModeJNI - Specifies whether to use verbose debug output for native method invocation. The default is not to enable verbose Java Native Interface (JNI) activity.
  initialHeapSize - Specifies the initial heap size available to the JVM code, in megabytes.
  maximumHeapSize - Specifies the maximum heap size available to the JVM code, in megabytes.
  runHProf - This setting applies to base WebSphere Application Server only. It specifies whether to use HProf profiler support. To use another profiler, specify the custom profiler settings using the HProf Arguments setting. The default is not to enable HProf profiler support.
  hprofArguments - This setting applies to base WebSphere Application Server only. It specifies command-line profiler arguments to pass to the JVM code that starts the application server process. You can specify arguments when HProf profiler support is enabled.
  debugMode - Specifies whether to run the JVM in debug mode. The default is not to enable debug mode support.
  debugArgs - Specifies command-line debug arguments to pass to the JVM code that starts the application server process. You can specify arguments when Debug Mode is enabled.
  genericJvmArguments - Specifies command line arguments to pass to the Java virtual machine code that starts the application server process.
  internalClassAccessMode - Specifies the internal Class Access Mode for the JVM.  <ALLOW | RESTRICT>
  executableJarFileName - Specifies a full path name for an executable JAR file that the JVM code uses.
  disableJIT - Specifies whether to disable the just in time (JIT) compiler option of the JVM code.
  osName - Specifies JVM settings for a given operating system. When started, the process uses the JVM settings for the operating system of the node.

Steps:
  None
'''
'''
Creating a new JVM custom property
AdminConfig.create('Property', '(cells/myCell01/nodes/myNode01/servers/Server1|server.xml#JavaVirtualMachine_1343632560875)', '[[validationExpression ""] [name "test"] [description ""] [value "value"] [required "false"]]')

Modifying an existing JVM property
AdminConfig.modify('(cells/myCell01/nodes/myNode01/servers/Server1|server.xml#Property_1343632560885)', '[[validationExpression ""] [name "com.ibm.security.jgss.debug"] [description ""] [value "off"] [required "false"]]')
'''


Viewing all articles
Browse latest Browse all 4

Trending Articles