diff --git a/api/src/com/cloud/agent/api/StartAnswer.java b/api/src/com/cloud/agent/api/StartAnswer.java index 97232f6927c..293cbc49776 100644 --- a/api/src/com/cloud/agent/api/StartAnswer.java +++ b/api/src/com/cloud/agent/api/StartAnswer.java @@ -25,6 +25,7 @@ import com.cloud.agent.api.to.VirtualMachineTO; public class StartAnswer extends Answer { VirtualMachineTO vm; + String host_guid; protected StartAnswer() { } @@ -42,9 +43,20 @@ public class StartAnswer extends Answer { public StartAnswer(StartCommand cmd) { super(cmd, true, null); this.vm = cmd.getVirtualMachine(); + this.host_guid = null; + } + + public StartAnswer(StartCommand cmd, String msg, String guid) { + super(cmd, true, msg); + this.vm = cmd.getVirtualMachine(); + this.host_guid = guid; } public VirtualMachineTO getVirtualMachine() { return vm; } + + public String getHost_guid() { + return host_guid; + } } diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index e3f88fa6980..fd74450b7da 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -1034,13 +1034,17 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe State state = State.Stopped; VM vm = null; try { - Set vms = VM.getByNameLabel(conn, vmName); if ( vms != null ) { for ( VM v : vms ) { VM.Record vRec = v.getRecord(conn); if ( vRec.powerState == VmPowerState.HALTED ) { v.destroy(conn); + } else if ( vRec.powerState == VmPowerState.RUNNING ) { + String host = vRec.residentOn.getUuid(conn); + String msg = "VM " + vmName + " is runing on host " + host; + s_logger.debug(msg); + return new StartAnswer(cmd, msg, host); } else { String msg = "There is already a VM having the same name " + vmName + " vm record " + vRec.toString(); s_logger.warn(msg); diff --git a/server/src/com/cloud/host/dao/HostDao.java b/server/src/com/cloud/host/dao/HostDao.java index 3d69b3cf2d9..882b035cbdc 100755 --- a/server/src/com/cloud/host/dao/HostDao.java +++ b/server/src/com/cloud/host/dao/HostDao.java @@ -88,12 +88,7 @@ public interface HostDao extends GenericDao { HostVO findByStorageIpAddressInDataCenter(long dcId, String privateIpAddress); HostVO findByPrivateIpAddressInDataCenter(long dcId, String privateIpAddress); - /** - * find a host by its mac address - * @param macAddress - * @return HostVO or null if not found. - */ - public HostVO findByGuid(String macAddress); + public HostVO findByGuid(String guid); public HostVO findByName(String name); diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index 693b2d3efed..163071ec6e7 100755 --- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -720,8 +720,16 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene _agentMgr.send(destHostId, cmds); _workDao.updateStep(work, Step.Started); - Answer startAnswer = cmds.getAnswer(StartAnswer.class); + StartAnswer startAnswer = cmds.getAnswer(StartAnswer.class); if (startAnswer != null && startAnswer.getResult()) { + String host_guid = startAnswer.getHost_guid(); + if( host_guid != null ) { + HostVO finalHost = _hostDao.findByGuid(host_guid); + if ( finalHost == null ) { + throw new CloudRuntimeException("Host Guid " + host_guid + " doesn't exist in DB, something wrong here"); + } + destHostId = finalHost.getId(); + } if (vmGuru.finalizeStart(vmProfile, destHostId, cmds, ctx)) { if (!changeState(vm, Event.OperationSucceeded, destHostId, work, Step.Done)) { throw new ConcurrentOperationException("Unable to transition to a new state.");