class KVMFencer extends AdapterBase implements FenceBuilder {

    @Override
    public Boolean fenceOff(VirtualMachine vm, Host host) {
        if (host.getHypervisorType() != HypervisorType.KVM) {
            s_logger.warn("Don't know how to fence non kvm hosts " + host.getHypervisorType());
            return null;
        }

        List<HostVO> hosts = _resourceMgr.listAllHostsInCluster(host.getClusterId());
        FenceCommand fence = new FenceCommand(vm, host);

        int i = 0;
        for (HostVO h : hosts) {
            if (h.getHypervisorType() == HypervisorType.KVM) {
                if (h.getStatus() != Status.Up) {
                    continue;
                }

                i++;

                if (h.getId() == host.getId()) {
                    continue;
                }
                FenceAnswer answer;
                try {
                    answer = (FenceAnswer)_agentMgr.send(h.getId(), fence);
                } catch (AgentUnavailableException e) {
                    s_logger.info("Moving on to the next host because " + h.toString() + " is unavailable");
                    continue;
                } catch (OperationTimedoutException e) {
                    s_logger.info("Moving on to the next host because " + h.toString() + " is unavailable");
                    continue;
                }
                if (answer != null && answer.getResult()) {
                    return true;
                }
            }
        }

        _alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_HOST, host.getDataCenterId(), host.getPodId(),
                            "Unable to fence off host: " + host.getId(),
                            "Fencing off host " + host.getId() + " did not succeed after asking " + i + " hosts. " +
                            "Check Agent logs for more information.");

        s_logger.error("Unable to fence off " + vm.toString() + " on " + host.toString());

        return false;
    }

    public  KVMFencer();

}