From cd6b872f8d01c39c9230b7225c7c3905dbf206d7 Mon Sep 17 00:00:00 2001 From: frank Date: Thu, 13 Oct 2011 14:44:58 -0700 Subject: [PATCH] Bug 11670 - OVM - HA failed when host is disconnected from network status 11670: resolved fixed --- client/tomcatconf/components.xml.in | 1 + .../com/cloud/ovm/hypervisor/OvmFencer.java | 109 ++++++++++++++++++ .../src/com/cloud/vm/UserVmManagerImpl.java | 2 +- 3 files changed, 111 insertions(+), 1 deletion(-) create mode 100755 ovm/src/com/cloud/ovm/hypervisor/OvmFencer.java diff --git a/client/tomcatconf/components.xml.in b/client/tomcatconf/components.xml.in index 5e536df7cdf..c6307bfac6e 100755 --- a/client/tomcatconf/components.xml.in +++ b/client/tomcatconf/components.xml.in @@ -79,6 +79,7 @@ + diff --git a/ovm/src/com/cloud/ovm/hypervisor/OvmFencer.java b/ovm/src/com/cloud/ovm/hypervisor/OvmFencer.java new file mode 100755 index 00000000000..89a3f7cdd13 --- /dev/null +++ b/ovm/src/com/cloud/ovm/hypervisor/OvmFencer.java @@ -0,0 +1,109 @@ +package com.cloud.ovm.hypervisor; + +import java.util.List; +import java.util.Map; + +import javax.ejb.Local; +import javax.naming.ConfigurationException; + +import org.apache.log4j.Logger; + +import com.cloud.agent.AgentManager; +import com.cloud.agent.api.FenceAnswer; +import com.cloud.agent.api.FenceCommand; +import com.cloud.exception.AgentUnavailableException; +import com.cloud.exception.OperationTimedoutException; +import com.cloud.ha.FenceBuilder; +import com.cloud.host.HostVO; +import com.cloud.host.Status; +import com.cloud.host.dao.HostDao; +import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.utils.component.Inject; +import com.cloud.vm.VMInstanceVO; + +@Local(value=FenceBuilder.class) +public class OvmFencer implements FenceBuilder { + private static final Logger s_logger = Logger.getLogger(OvmFencer.class); + String _name; + @Inject HostDao _hostDao; + @Inject AgentManager _agentMgr; + + @Override + public boolean configure(String name, Map params) throws ConfigurationException { + _name = name; + return true; + } + + @Override + public String getName() { + // TODO Auto-generated method stub + return _name; + } + + @Override + public boolean start() { + // TODO Auto-generated method stub + return true; + } + + @Override + public boolean stop() { + // TODO Auto-generated method stub + return true; + } + + public OvmFencer() { + super(); + } + + @Override + public Boolean fenceOff(VMInstanceVO vm, HostVO host) { + if (host.getHypervisorType() != HypervisorType.Ovm) { + s_logger.debug("Don't know how to fence non Ovm hosts " + host.getHypervisorType()); + return null; + } + + List hosts = _hostDao.listByCluster(host.getClusterId()); + FenceCommand fence = new FenceCommand(vm, host); + + for (HostVO h : hosts) { + if (h.getHypervisorType() != HypervisorType.Ovm) { + continue; + } + + if( h.getStatus() != Status.Up ) { + continue; + } + + if( h.getId() == host.getId() ) { + continue; + } + + FenceAnswer answer; + try { + answer = (FenceAnswer)_agentMgr.send(h.getId(), fence); + } catch (AgentUnavailableException e) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Moving on to the next host because " + h.toString() + " is unavailable"); + } + continue; + } catch (OperationTimedoutException e) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Moving on to the next host because " + h.toString() + " is unavailable"); + } + continue; + } + + if (answer != null && answer.getResult()) { + return true; + } + } + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Unable to fence off " + vm.toString() + " on " + host.toString()); + } + + return false; + } + +} diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 81bbbf00f0f..9ecc71a95ea 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -3210,7 +3210,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } throw new InvalidParameterValueException("VM is not Running, unable to migrate the vm " + vm); } - if (!vm.getHypervisorType().equals(HypervisorType.XenServer) && !vm.getHypervisorType().equals(HypervisorType.VMware) && !vm.getHypervisorType().equals(HypervisorType.KVM)) { + if (!vm.getHypervisorType().equals(HypervisorType.XenServer) && !vm.getHypervisorType().equals(HypervisorType.VMware) && !vm.getHypervisorType().equals(HypervisorType.KVM) && !vm.getHypervisorType().equals(HypervisorType.Ovm)) { if (s_logger.isDebugEnabled()) { s_logger.debug(vm + " is not XenServer/VMware/KVM, cannot migrate this VM."); }