private CommandContext createAddVmStepContext(String currentVmName) {
    CommandContext commandCtx = null;

    try {
      Map<String, String> values = new HashMap<>();
      values.put(VdcObjectType.VM.name().toLowerCase(), currentVmName);
      Step addVmStep =
          ExecutionHandler.addSubStep(
              getExecutionContext(),
              getExecutionContext().getJob().getStep(StepEnum.EXECUTING),
              StepEnum.ADD_VM_TO_POOL,
              ExecutionMessageDirector.resolveStepMessage(StepEnum.ADD_VM_TO_POOL, values));
      ExecutionContext ctx = new ExecutionContext();
      ctx.setStep(addVmStep);
      ctx.setMonitored(true);
      commandCtx = cloneContextAndDetachFromParent().withExecutionContext(ctx);
    } catch (RuntimeException e) {
      log.error(
          "Failed to create command context of adding VM '{}' to Pool '{}': {}",
          currentVmName,
          getParameters().getVmPool().getName(),
          e.getMessage());
      log.debug("Exception", e);
    }
    return commandCtx;
  }
 protected CommandContext createMigrateVmContext(ExecutionContext parentContext, VM vm) {
   ExecutionContext ctx = new ExecutionContext();
   try {
     Map<String, String> values = new HashMap<>();
     values.put(VdcObjectType.VM.name().toLowerCase(), vm.getName());
     values.put(VdcObjectType.VDS.name().toLowerCase(), vm.getRunOnVdsName());
     Step step =
         ExecutionHandler.addSubStep(
             getExecutionContext(),
             parentContext.getJob().getStep(StepEnum.EXECUTING),
             StepEnum.MIGRATE_VM,
             ExecutionMessageDirector.resolveStepMessage(StepEnum.MIGRATE_VM, values));
     ctx.setJob(parentContext.getJob());
     ctx.setStep(step);
     ctx.setMonitored(true);
   } catch (RuntimeException e) {
     log.error("Failed to create ExecutionContext for MigrateVmCommand", e);
   }
   return cloneContextAndDetachFromParent().withExecutionContext(ctx);
 }