From 5490577469ad18770c5525138490d28347b37383 Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Wed, 17 Nov 2010 15:50:34 -0800 Subject: [PATCH] 1) Remove forwarding between eth1 and eth2 as it does not solve the problem of asymmetic routing 2) correct Eclipse project settings 3) If VM is hosted by vmware hypervisor, give the previous host preference to start on to fit VMware's VM-centric model --- console-proxy/.classpath | 18 +++++++++--------- console-viewer/.classpath | 14 +++++++------- .../agent/api/storage/DestroyCommand.java | 9 ++++++++- .../debian/config/etc/iptables/iptables-router | 2 -- .../com/cloud/storage/StorageManagerImpl.java | 6 +++--- server/src/com/cloud/vm/UserVmManagerImpl.java | 13 +++++++++---- 6 files changed, 36 insertions(+), 26 deletions(-) diff --git a/console-proxy/.classpath b/console-proxy/.classpath index 5a34eae6642..0b57db8ad5a 100644 --- a/console-proxy/.classpath +++ b/console-proxy/.classpath @@ -1,9 +1,9 @@ - - - - - - - - - + + + + + + + + + diff --git a/console-viewer/.classpath b/console-viewer/.classpath index e8a8d8c0a84..19542e73fc0 100644 --- a/console-viewer/.classpath +++ b/console-viewer/.classpath @@ -1,7 +1,7 @@ - - - - - - - + + + + + + + diff --git a/core/src/com/cloud/agent/api/storage/DestroyCommand.java b/core/src/com/cloud/agent/api/storage/DestroyCommand.java index 8e0dbf497fe..e7cdaec433f 100755 --- a/core/src/com/cloud/agent/api/storage/DestroyCommand.java +++ b/core/src/com/cloud/agent/api/storage/DestroyCommand.java @@ -24,13 +24,16 @@ import com.cloud.storage.VMTemplateStoragePoolVO; import com.cloud.storage.VolumeVO; public class DestroyCommand extends StorageCommand { + // in VMware, things are designed around VM instead of volume, we need it the volume VM context if the volume is attached + String vmName; VolumeTO volume; protected DestroyCommand() { } - public DestroyCommand(StoragePoolVO pool, VolumeVO volume) { + public DestroyCommand(StoragePoolVO pool, VolumeVO volume, String vmName) { this.volume = new VolumeTO(volume, pool); + this.vmName = vmName; } public DestroyCommand(StoragePoolVO pool, VMTemplateStoragePoolVO templatePoolRef) { @@ -40,6 +43,10 @@ public class DestroyCommand extends StorageCommand { public VolumeTO getVolume() { return volume; } + + public String getVmName() { + return vmName; + } @Override public boolean executeInSequence() { diff --git a/patches/systemvm/debian/config/etc/iptables/iptables-router b/patches/systemvm/debian/config/etc/iptables/iptables-router index 3cd069a04c0..3bc7b50f74a 100644 --- a/patches/systemvm/debian/config/etc/iptables/iptables-router +++ b/patches/systemvm/debian/config/etc/iptables/iptables-router @@ -19,8 +19,6 @@ COMMIT -A INPUT -i eth0 -p tcp -m state --state NEW --dport 80 -j ACCEPT -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i eth0 -o eth2 -j ACCEPT --A FORWARD -i eth1 -o eth2 -j ACCEPT -A FORWARD -i eth2 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT --A FORWARD -i eth2 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT COMMIT diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 856eb88c252..e05b61b51bf 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -1032,7 +1032,7 @@ public class StorageManagerImpl implements StorageManager { if (poolId != null && volumePath != null && !volumePath.trim().isEmpty()) { Answer answer = null; StoragePoolVO pool = _storagePoolDao.findById(poolId); - final DestroyCommand cmd = new DestroyCommand(pool, vol); + final DestroyCommand cmd = new DestroyCommand(pool, vol, vm.getInstanceName()); boolean removed = false; List poolhosts = _storagePoolHostDao.listByPoolId(poolId); for (StoragePoolHostVO poolhost : poolhosts) { @@ -1645,7 +1645,7 @@ public class StorageManagerImpl implements StorageManager { String destPrimaryStorageVolumeFolder = cvAnswer.getVolumeFolder(); // Delete the volume on the source storage pool - final DestroyCommand cmd = new DestroyCommand(srcPool, volume); + final DestroyCommand cmd = new DestroyCommand(srcPool, volume, null); Answer destroyAnswer = _agentMgr.easySend(sourceHostId, cmd); if (destroyAnswer == null || !destroyAnswer.getResult()) { @@ -2143,7 +2143,7 @@ public class StorageManagerImpl implements StorageManager { Long poolId = vol.getPoolId(); Answer answer = null; StoragePoolVO pool = _storagePoolDao.findById(poolId); - final DestroyCommand cmd = new DestroyCommand(pool, vol); + final DestroyCommand cmd = new DestroyCommand(pool, vol, null); answer = sendToPool(pool, cmd); if (answer != null && answer.getResult()) { s_logger.debug("Destroyed " + vol); diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 6deda9983ed..63a09c3daf6 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -891,8 +891,16 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM } HashSet avoid = new HashSet(); + + HostVO host = null; + if(vm.getLastHostId() != null) { + host = _hostDao.findById(vm.getLastHostId()); + if(host == null || host.getStatus() != com.cloud.host.Status.Up || host.getHypervisorType() != HypervisorType.VmWare) + host = null; + } - HostVO host = (HostVO) _agentMgr.findHost(Host.Type.Routing, dc, pod, sp, offering, template, vm, null, avoid); + if(host == null) + host = (HostVO) _agentMgr.findHost(Host.Type.Routing, dc, pod, sp, offering, template, vm, null, avoid); if (host == null) { String description = "Unable to find any host for " + vm.toString(); @@ -902,7 +910,6 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM _eventDao.persist(event); return null; } - if (!_vmDao.updateIf(vm, Event.StartRequested, host.getId())) { String description = "Unable to start VM " + vm.toString() + " because the state is not correct."; @@ -3831,7 +3838,6 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM } long eventId = EventUtils.saveScheduledEvent(userId, vmInstance.getAccountId(), EventTypes.EVENT_VM_STOP, "stopping Vm with Id: "+id); - userId = accountAndUserValidation(id, caller, userId, vmInstance); UserVO user = _userDao.findById(userId); @@ -3911,5 +3917,4 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM throw new CloudRuntimeException("Failed to destroy vm with id " + vmId); } } - }