@Override
  public Answer execute(final ScaleVmCommand command, final CitrixResourceBase citrixResourceBase) {
    final VirtualMachineTO vmSpec = command.getVirtualMachine();
    final String vmName = vmSpec.getName();
    try {
      final Connection conn = citrixResourceBase.getConnection();
      final Set<VM> vms = VM.getByNameLabel(conn, vmName);
      final Host host = Host.getByUuid(conn, citrixResourceBase.getHost().getUuid());

      // If DMC is not enable then don't execute this command.
      if (!citrixResourceBase.isDmcEnabled(conn, host)) {
        throw new CloudRuntimeException(
            "Unable to scale the vm: "
                + vmName
                + " as DMC - Dynamic memory control is not enabled for the XenServer:"
                + citrixResourceBase.getHost().getUuid()
                + " ,check your license and hypervisor version.");
      }

      if (vms == null || vms.size() == 0) {
        s_logger.info(
            "No running VM "
                + vmName
                + " exists on XenServer"
                + citrixResourceBase.getHost().getUuid());
        return new ScaleVmAnswer(command, false, "VM does not exist");
      }

      // stop vm which is running on this host or is in halted state
      final Iterator<VM> iter = vms.iterator();
      while (iter.hasNext()) {
        final VM vm = iter.next();
        final VM.Record vmr = vm.getRecord(conn);

        if (vmr.powerState == VmPowerState.HALTED
            || vmr.powerState == VmPowerState.RUNNING
                && !citrixResourceBase.isRefNull(vmr.residentOn)
                && !vmr.residentOn.getUuid(conn).equals(citrixResourceBase.getHost().getUuid())) {
          iter.remove();
        }
      }

      for (final VM vm : vms) {
        vm.getRecord(conn);
        try {
          citrixResourceBase.scaleVM(conn, vm, vmSpec, host);
        } catch (final Exception e) {
          final String msg =
              "Catch exception "
                  + e.getClass().getName()
                  + " when scaling VM:"
                  + vmName
                  + " due to "
                  + e.toString();
          s_logger.debug(msg);
          return new ScaleVmAnswer(command, false, msg);
        }
      }
      final String msg = "scaling VM " + vmName + " is successful on host " + host;
      s_logger.debug(msg);
      return new ScaleVmAnswer(command, true, msg);

    } catch (final XenAPIException e) {
      final String msg = "Upgrade Vm " + vmName + " fail due to " + e.toString();
      s_logger.warn(msg, e);
      return new ScaleVmAnswer(command, false, msg);
    } catch (final XmlRpcException e) {
      final String msg = "Upgrade Vm " + vmName + " fail due to " + e.getMessage();
      s_logger.warn(msg, e);
      return new ScaleVmAnswer(command, false, msg);
    } catch (final Exception e) {
      final String msg = "Unable to upgrade " + vmName + " due to " + e.getMessage();
      s_logger.warn(msg, e);
      return new ScaleVmAnswer(command, false, msg);
    }
  }
  public Connection connect(
      String hostUuid,
      String poolUuid,
      String ipAddress,
      String username,
      Queue<String> password,
      int wait) {
    XenServerConnection mConn = null;
    Connection sConn = null;
    String masterIp = null;
    if (hostUuid == null
        || poolUuid == null
        || ipAddress == null
        || username == null
        || password == null) {
      String msg =
          "Connect some parameter are null hostUuid:"
              + hostUuid
              + " ,poolUuid:"
              + poolUuid
              + " ,ipAddress:"
              + ipAddress;
      s_logger.debug(msg);
      throw new CloudRuntimeException(msg);
    }
    Host host = null;
    synchronized (poolUuid.intern()) {
      // Let's see if it is an existing connection.
      mConn = getConnect(poolUuid);
      if (mConn != null) {
        try {
          host = Host.getByUuid(mConn, hostUuid);
        } catch (Types.SessionInvalid e) {
          s_logger.debug(
              "Session thgrough ip "
                  + mConn.getIp()
                  + " is invalid for pool("
                  + poolUuid
                  + ") due to "
                  + e.toString());
          try {
            loginWithPassword(
                mConn, mConn.getUsername(), mConn.getPassword(), APIVersion.latest().toString());
          } catch (Exception e1) {
            if (s_logger.isDebugEnabled()) {
              s_logger.debug(
                  "connect through IP("
                      + mConn.getIp()
                      + " for pool("
                      + poolUuid
                      + ") is broken due to "
                      + e.toString());
            }
            removeConnect(poolUuid);
            mConn = null;
          }
        } catch (UuidInvalid e) {
          String msg =
              "Host("
                  + hostUuid
                  + ") doesn't belong to pool("
                  + poolUuid
                  + "), please execute 'xe pool-join master-address="
                  + mConn.getIp()
                  + " master-username="******"connect through IP("
                    + mConn.getIp()
                    + " for pool("
                    + poolUuid
                    + ") is broken due to "
                    + e.toString());
          }
          removeConnect(poolUuid);
          mConn = null;
        }
      }

      if (mConn == null) {
        try {
          try {
            if (s_logger.isDebugEnabled()) {
              s_logger.debug("Logging on as the slave to " + ipAddress);
            }
            sConn = new Connection(getURL(ipAddress), 5);
            slaveLocalLoginWithPassword(sConn, username, password);
          } catch (Exception e) {
            String msg =
                "Unable to create slave connection to host("
                    + hostUuid
                    + ") due to "
                    + e.toString();
            if (s_logger.isDebugEnabled()) {
              s_logger.debug(msg);
            }
            throw new CloudRuntimeException(msg, e);
          }
          Pool.Record pr = null;
          try {
            pr = getPoolRecord(sConn);
          } catch (Exception e) {
            PoolEmergencyTransitionToMaster(ipAddress, username, password);
            mConn =
                new XenServerConnection(
                    getURL(ipAddress), ipAddress, username, password, _retries, _interval, wait);
            try {
              loginWithPassword(mConn, username, password, APIVersion.latest().toString());
              pr = getPoolRecord(mConn);
            } catch (Exception e1) {
              String msg =
                  "Unable to create master connection to host("
                      + hostUuid
                      + ") after transition it to master, due to "
                      + e1.toString();
              if (s_logger.isDebugEnabled()) {
                s_logger.debug(msg);
              }
              throw new CloudRuntimeException(msg, e1);
            }
            if (!pr.uuid.equals(poolUuid)) {
              String msg =
                  "host("
                      + hostUuid
                      + ") should be in pool("
                      + poolUuid
                      + "), but it is actually in pool("
                      + pr.uuid
                      + ")";
              if (s_logger.isDebugEnabled()) {
                s_logger.debug(msg);
              }
              throw new CloudRuntimeException(msg);
            } else {
              if (s_managePool) {
                ensurePoolIntegrity(mConn, ipAddress, username, password, wait);
              }
              addConnect(poolUuid, mConn);
              return mConn;
            }
          }
          if (!pr.uuid.equals(poolUuid)) {
            String msg =
                "host("
                    + hostUuid
                    + ") should be in pool("
                    + poolUuid
                    + "), but it is actually in pool("
                    + pr.uuid
                    + ")";
            if (s_logger.isDebugEnabled()) {
              s_logger.debug(msg);
            }
            throw new CloudRuntimeException(msg);
          }
          try {
            masterIp = pr.master.getAddress(sConn);
            mConn =
                new XenServerConnection(
                    getURL(masterIp), masterIp, username, password, _retries, _interval, wait);
            loginWithPassword(mConn, username, password, APIVersion.latest().toString());
            addConnect(poolUuid, mConn);
            return mConn;
          } catch (Exception e) {
            String msg = "Unable to logon in " + masterIp + " as master in pool(" + poolUuid + ")";
            if (s_logger.isDebugEnabled()) {
              s_logger.debug(msg);
            }
            throw new CloudRuntimeException(msg);
          }
        } finally {
          localLogout(sConn);
          sConn = null;
        }
      }
    }

    if (mConn != null) {
      if (s_managePool) {
        try {
          Map<String, String> args = new HashMap<String, String>();
          host.callPlugin(mConn, "echo", "main", args);
        } catch (Types.SessionInvalid e) {
          if (s_logger.isDebugEnabled()) {
            String msg =
                "Catch Exception: "
                    + e.getClass().getName()
                    + " Can't connect host "
                    + ipAddress
                    + " due to "
                    + e.toString();
            s_logger.debug(msg);
          }
          PoolEmergencyResetMaster(
              ipAddress, mConn.getIp(), mConn.getUsername(), mConn.getPassword());
        } catch (Types.CannotContactHost e) {
          if (s_logger.isDebugEnabled()) {
            String msg =
                "Catch Exception: "
                    + e.getClass().getName()
                    + " Can't connect host "
                    + ipAddress
                    + " due to "
                    + e.toString();
            s_logger.debug(msg);
          }
          PoolEmergencyResetMaster(
              ipAddress, mConn.getIp(), mConn.getUsername(), mConn.getPassword());
        } catch (Types.HostOffline e) {
          if (s_logger.isDebugEnabled()) {
            String msg =
                "Catch Exception: "
                    + e.getClass().getName()
                    + " Host is offline "
                    + ipAddress
                    + " due to "
                    + e.toString();
            s_logger.debug(msg);
          }
          PoolEmergencyResetMaster(
              ipAddress, mConn.getIp(), mConn.getUsername(), mConn.getPassword());
        } catch (Types.HostNotLive e) {
          String msg =
              "Catch Exception: "
                  + e.getClass().getName()
                  + " Host Not Live "
                  + ipAddress
                  + " due to "
                  + e.toString();
          if (s_logger.isDebugEnabled()) {
            s_logger.debug(msg);
          }
          PoolEmergencyResetMaster(
              ipAddress, mConn.getIp(), mConn.getUsername(), mConn.getPassword());
        } catch (Exception e) {
          String msg = "Echo test failed on host " + hostUuid + " IP " + ipAddress;
          s_logger.warn(msg, e);
          throw new CloudRuntimeException(msg, e);
        }
      }
    }
    return mConn;
  }