@Override
  public Answer execute(
      final CheckNetworkCommand command, final CitrixResourceBase citrixResourceBase) {
    if (s_logger.isDebugEnabled()) {
      s_logger.debug("Checking if network name setup is done on the resource");
    }

    final List<PhysicalNetworkSetupInfo> infoList = command.getPhysicalNetworkInfoList();

    try {
      boolean errorout = false;
      String msg = "";
      for (final PhysicalNetworkSetupInfo info : infoList) {
        if (!citrixResourceBase.isNetworkSetupByName(info.getGuestNetworkName())) {
          msg =
              "For Physical Network id:"
                  + info.getPhysicalNetworkId()
                  + ", Guest Network is not configured on the backend by name "
                  + info.getGuestNetworkName();
          errorout = true;
          break;
        }
        if (!citrixResourceBase.isNetworkSetupByName(info.getPrivateNetworkName())) {
          msg =
              "For Physical Network id:"
                  + info.getPhysicalNetworkId()
                  + ", Private Network is not configured on the backend by name "
                  + info.getPrivateNetworkName();
          errorout = true;
          break;
        }
        if (!citrixResourceBase.isNetworkSetupByName(info.getPublicNetworkName())) {
          msg =
              "For Physical Network id:"
                  + info.getPhysicalNetworkId()
                  + ", Public Network is not configured on the backend by name "
                  + info.getPublicNetworkName();
          errorout = true;
          break;
        }
        /*if(!isNetworkSetupByName(info.getStorageNetworkName())){
            msg = "For Physical Network id:"+ info.getPhysicalNetworkId() + ", Storage Network is not configured on the backend by name " + info.getStorageNetworkName();
            errorout = true;
            break;
        }*/
      }
      if (errorout) {
        s_logger.error(msg);
        return new CheckNetworkAnswer(command, false, msg);
      } else {
        return new CheckNetworkAnswer(command, true, "Network Setup check by names is done");
      }

    } catch (final XenAPIException e) {
      final String msg =
          "CheckNetworkCommand failed with XenAPIException:"
              + e.toString()
              + " host:"
              + citrixResourceBase.getHost().getUuid();
      s_logger.warn(msg, e);
      return new CheckNetworkAnswer(command, false, msg);
    } catch (final Exception e) {
      final String msg =
          "CheckNetworkCommand failed with Exception:"
              + e.getMessage()
              + " host:"
              + citrixResourceBase.getHost().getUuid();
      s_logger.warn(msg, e);
      return new CheckNetworkAnswer(command, false, msg);
    }
  }
  @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);
    }
  }