
- Subscribe to RSS Feed
- Mark as New
- Mark as Read
- Bookmark
- Subscribe
- Printer Friendly Page
- Report Inappropriate Content
02-15-2017 03:12 PM - edited 03-01-2019 06:45 AM
Here are 4 different UCSD roll back examples:
SSH with Rollback
The custom task is called the following:
Custom_SSH_Command_Task_v1
In the code this line of code is needed (note the word custom in front of the task name):
var undoHandler = "custom_Custom_SSH_Command_Task_v1";
The custom task is using the following input variables:
host
port
login
password
delaySeconds
checkExitCode
commands
undoCommands
In the code the variables to keep track off/register are:
undoConfig.host = input.host;
undoConfig.port = input.port;
undoConfig.login = input.login;
undoConfig.password = input.password;
undoConfig.delaySeconds = input.delaySeconds;
undoConfig.checkExitCode = "no";
undoConfig.commands = input.undoCommands; // Denote the trickery here
undoConfig.undoCommands = "";
The ssh code:
importPackage(com.cloupia.lib.util.ssh);
importPackage(java.lang);
input.host
input.port
input.login
input.password
input.delaySeconds
input.commands
input.checkExitCode
// output.LAST_EXIT_CODE
// output.EXIT_CODES (comma seperated)
// output.STD_OUT
// output.STD_ERR
function registerUndoTask()
{
if (input.undoCommands === null || input.undoCommands.length() === 0)
{
return;
}
// register undo task
var undoHandler = "custom_Custom_SSH_Command_Task_v1";
var undoContext = ctxt.createInnerTaskContext(undoHandler);
var undoConfig = undoContext.getConfigObject();
undoConfig.host = input.host;
undoConfig.port = input.port;
undoConfig.login = input.login;
undoConfig.password = input.password;
undoConfig.delaySeconds = input.delaySeconds;
undoConfig.checkExitCode = "no";
undoConfig.commands = input.undoCommands;
undoConfig.undoCommands = "";
ctxt.getChangeTracker().undoableResourceModified("SSH-Commands-Undo",
"Commands on Host "+input.host,
"SSH Commands on Host: "+input.host,
"SSH Commands on Host: "+input.host,
undoHandler,
undoConfig);
}
if ( (input.commands === null) || (input.commands.trim().length() === 0) )
{
ctxt.setFailed("No commands to execute");
ctxt.exit();
}
function openSSH()
{
// public SSHClient(String host, int port, String userName, String password)
var ssh = new SSHClient(input.host, Integer.parseInt(input.port), input.login, input.password);
ssh.connect();
return ssh;
}
var delay = Integer.parseInt(input.delaySeconds);
var lines = input.commands.split("\n");
var stdout = new StringBuffer();
var stderr = new StringBuffer();
var exitCodes = "";
var exitCode = 0;
var check = false;
if (input.checkExitCode !== null & input.checkExitCode.equalsIgnoreCase("yes"))
{
check = true;
}
var ssh;
try
{
logger.addDebug("Connecting to host: "+input.host);
ssh = openSSH();
logger.addDebug("Connected to host: "+input.host);
for (var i=0;i<lines.length; i++)
{
if (delay > 0)
{
Thread.sleep(1000 * delay);
}
var line = lines[i].trim();
//logger.addDebug("Executing command: "+line);
var out = ssh.executeCommand(line);
logger.addDebug("Command completed with exit Code: "+out.getExitCode());
exitCode = out.getExitCode();
stdout.append(out.getStdOut());
stderr.append(out.getStdErr());
exitCodes = exitCodes + "," + exitCode;
logger.addDebug(out.getStdOut());
var errMsg = out.getStdErr();
if (errMsg.length() > 0)
{
logger.addWarning(errMsg);
}
if (check === true)
{
if (exitCode !== 0)
{
ctxt.setFailed("Command failed with exitCode "+exitCode);
ctxt.exit();
}
}
}
} finally {
if (ssh !== null)
{
try {
ssh.disconnect();
} catch(ee3){}
registerUndoTask();
}
}
output.EXIT_CODE = exitCode;
output.EXIT_CODES = exitCodes;
//output.STD_OUT = stdout.toString();
output.STD_OUT = parseInt(stdout.toString());
output.STD_ERR = stderr.toString();
ctxt.updateInput("ReturnCode1", output.STD_OUT);
Delete System Policy / Delete Primary Deploy Policy Task / Roll back from a different task initiated
Here is the task that is going to be called when roll back is initiated from a different task.
The Delete System Policy Task:
importPackage(com.cloupia.model.cIM);
importPackage(java.util);
importPackage(java.lang);
importPackage(java.io);
importPackage(com.cloupia.lib.util);
importPackage(com.cloupia.model.cIM);
importPackage(com.cloupia.service.cIM.inframgr);
importPackage(org.apache.commons.httpclient);
importPackage(org.apache.commons.httpclient.cookie);
importPackage(org.apache.commons.httpclient.methods);
importPackage(org.apache.commons.httpclient.auth);
importPackage(com.cloupia.model.cEvent.notify);
importPackage(com.cloupia.lib.util.mail);
importPackage(com.cloupia.fw.objstore);
importPackage(com.cloupia.lib.util.managedreports);
logger.addInfo("------------------- Delete Primary Deploy Policy---------------------------------");
var sysPolicy = InfraPersistenceUtil.getPrivateCloudSystemProfile(vdcTempPrimaryDeployPolicyNameClone);
if(sysPolicy != null){
var policyId = sysPolicy.getPolicyId();
InfraPersistenceUtil.deletePrivateCloudSystemProfile(policyId);
logger.addInfo("vdcTempPrimaryDeployPolicyNameClone Policy deleted successfully"+vdcTempPrimaryDeployPolicyNameClone);
}else{
logger.addError("vdcTempPrimaryDeployPolicyNameClone Policy not found : "+vdcTempPrimaryDeployPolicyNameClone);
}
The Rollback is created in a different task:
The task that is registered is a custom task and its name is:
Delete System Policy
In the code this is needed:
var undoHandler = "custom_Delete System Policy";
The variable to keep track of in the Delete System Policy is:
SystemPolicyName
In the code this is needed:
undoConfig.SystemPolicyName = syspoltmp;
function registerUndoTask()
{
// register undo task
var undoHandler = "custom_Delete System Policy";
var undoContext = ctxt.createInnerTaskContext(undoHandler);
var undoConfig = undoContext.getConfigObject();
undoConfig.SystemPolicyName = syspoltmp;
logger.addInfo("Registering syspoltmp var: "+syspoltmp);
ctxt.getChangeTracker().undoableResourceModified("DeleteSystemPolicy-Commands-Undo",
"DeleteSystemPolicy "+syspoltmp,
"DeleteSystemPolicy: "+syspoltmp,
"DeleteSystemPolicy: "+syspoltmp,
undoHandler,
undoConfig);
}
Rollback VM Ware Inventory Execution
The interesting part about this task is that it is empty and only registers the roll back at execution time.
It registers a built in task in this case.
The out of the box task is called:
Collect Inventory
In the code this is needed:
var undoHandler = "Collect Inventory";
The input variable to the out of the box task is
vmwareAccounts
In the code this is needed:
undoConfig.vmwareAccounts = vmware_accounts;
Clone task to see exact spelling of variables as shown here:
The custom Task Code:
importPackage(java.util);
importPackage(java.lang);
var vmware_accounts = input.VMware_Account;
//-------Register Rollback------->>
function registerUndoTask(vmware_accounts) {
var undoHandler = "Collect Inventory";
var undoContext = ctxt.createInnerTaskContext(undoHandler);
undoConfig = undoContext.getConfigObject();
undoConfig.vmwareAccounts = vmware_accounts;
ctxt.getChangeTracker().undoableResourceModified("Rollback Inventory", "rollback", "Rollback Inventory", "rollback", undoHandler,undoConfig);
}
registerUndoTask(vmware_accounts);
PowerShell Empty Task for Forward on Rollback Execution Occurs
importPackage(java.util);
importPackage(java.lang);
importPackage(com.cloupia.model.cIM);
importPackage(java.io);
importPackage(com.cloupia.lib.util);
importPackage(com.cloupia.model.cIM);
importPackage(com.cloupia.service.cIM.inframgr);
importPackage(org.apache.commons.httpclient);
importPackage(org.apache.commons.httpclient.cookie);
importPackage(org.apache.commons.httpclient.methods);
importPackage(org.apache.commons.httpclient.auth);
importPackage(com.cloupia.model.cEvent.notify);
importPackage(com.cloupia.lib.util.mail);
importPackage(com.cloupia.fw.objstore);
importPackage(com.cloupia.lib.util.managedreports);
function registerUndoTask()
{
if (input.rollbackCommand === null || input.rollbackCommand.length() === 0)
{
return;
}
// register undo task
var undoHandler = "Execute PowerShell Command";
var undoContext = ctxt.createInnerTaskContext(undoHandler);
var undoConfig = undoContext.getConfigObject();
undoConfig.label = input.label;
undoConfig.psAgent = input.psAgent;
undoConfig.targetIPAddress = input.targetIPAddress;
undoConfig.targetUserID = input.targetUserID;
undoConfig.targetPassword = input.targetPassword;
undoConfig.targetDomain = input.targetDomain;
undoConfig.targetCommand = input.rollbackCommand;
undoConfig.rollbackCommand = "";
undoConfig.outputFormat = input.outputFormat;
undoConfig.depth = input.depth;
undoConfig.maxWaitTimeMinutes =input.maxWaitTimeMinutes;
ctxt.getChangeTracker().undoableResourceModified("PowerShell-Rollback",
"Host 1: "+input.targetIPAddress,
"Host 2: "+input.targetIPAddress,
"Host 3: "+input.targetIPAddress,
undoHandler,
undoConfig);
}
registerUndoTask();
'

- Mark as Read
- Mark as New
- Bookmark
- Permalink
- Report Inappropriate Content
Hi Orf,
I would like to know if can rollback configurations done through multiple custom tasks at a time.
ex: I have a workflow-1 and it has multiple custom tasks ctask-1, ctask-2, .. (each task has a different configuration to push to APIC), so in this case can I have a single rollback where I can remove all the configurations made by each custom task.

- Mark as Read
- Mark as New
- Bookmark
- Permalink
- Report Inappropriate Content
Yes – you can – the task would do nothing on execute and only do something on rollback.
Only problem is then your workflow looks like this
Workflow
Task 1
Task 2
Task3
Task4 (empty only do something on rollback – roll back task 1,2,3)
So what happens when this workflow only does Task1 and Task2 the roll back would attempt to do roll back all 3 and error out..
Not good