How to clone weblogic server in WLST (offline-mode)?

5.3k views Asked by At

We have a custom weblogic template which has admin server (obviously) and a cluster with 2 managed servers deployed to the same machine. We use that template for our development environments. But now when we move on to performance testing environments, we need to introduce more machines.

It's easy to create a new machine in WLST (offline or online mode). But how do I clone a server (as all of the settings, except weblogic.Name and target machine are the same) in WLST?

It seems to be possible in WebLogic Administration Console, but we need to automate that.

2

There are 2 answers

0
Andrey Adamovich On BEST ANSWER

I ended up doing defining the following functions:

def createServer(wls, name):
  wls.cd("/")
  wls.create(name, 'Server')    


######################################################################
# Checks if given bean exists
######################################################################
def beanExists(wls, path, name):
  print "Checking if bean: '" + name + "' exists in path: '" + path + "'"
  wls.cd(path)
  wls.setShowLSResult(0)  
  beans = wls.ls('c', 'false', 'c')
  wls.setShowLSResult(1)  
  if (beans.find(name) != -1):
    print "Exists"  
    return 1
  else:
    print "Doesn't exist"  
    return 0


######################################################################
# Copy bean properties in offline mode.
######################################################################
def copyProperties(wls, originalBeanName, originalBeanPath, newBeanName, newBeanPath, ignoredProperties):

  wls.getCommandExceptionHandler().setMode(1)
  wls.getRuntimeEnv().set('exitonerror', 'true')

  srcPath = originalBeanPath + "/" + originalBeanName
  targetPath =  newBeanPath + "/" + newBeanName

  print "Coping properties from '" + srcPath + "' to '" + targetPath + "'"  
  wls.cd(srcPath)

  wls.setShowLSResult(0)
  attributes = wls.ls('a', 'true', 'a')
  children = wls.ls('c', 'true', 'c')
  wls.setShowLSResult(1)

  # Copy attributes.
  wls.cd(targetPath)
  for entry in attributes.entrySet(): 
    k = entry.key
    v = entry.value  
    if not(k in ignoredProperties) and not(v is None) and not(v == ''):
      print "Setting property '" + str(k) + "' = '" + str(v) + "' on '" + targetPath + "'"
      if isinstance(v, StringType):
        wls.set(k, v.replace(originalBeanName, newBeanName))
      else:
        wls.set(k, v)

  # Copy child bean values.
  for k in children:
    if not(k in ignoredProperties):
      srcBN = srcPath + "/" + k    
      targetBN = targetPath + "/" + k
      print "Coping bean '" + srcBN + "/" + originalBeanName + "'"
      print "Detected bean type as '" + k + "'"
      if beanExists(wls, srcBN, "NO_NAME_0"):      
        print "Changing to NO_NAME_0"
        originalBeanName = "NO_NAME_0"
        newBeanName = "NO_NAME_0"        
      wls.cd(targetPath)        
      wls.create(newBeanName, k)  
      copyProperties(wls, originalBeanName, srcBN, newBeanName, targetBN, ignoredProperties)

After that just call:

createServer(WLS, 'ServiceServer3')
copyProperties(WLS, 'ServiceServer1', '/Servers', 'ServiceServer3', '/Servers', ['SSL'])

UPDATE: I wrote more about it in my blog: http://blog.aestasit.com/cloning-objects-in-wlst-offline/. Also the script was tested on WebLogic 11g.

0
Musannif Zahir On

I'm not sure about the newest version of WLST but the older releases don't have a single command for it since clone is on the console side - It's not a functionality that can be invoked on an MBean.

You could write a script that takes a serverName as a parameter, traverses through all resources and then creates your new server. Alternatively, Oracle's OEM could be used as well. Hope that helps.