From d3e323b9ecba8bbcb14d4719d68ffcb5121f9749 Mon Sep 17 00:00:00 2001 From: abhishek Date: Thu, 2 Sep 2010 19:10:13 -0700 Subject: [PATCH] bug 5927: incremental checkin --- .../com/cloud/server/ManagementServer.java | 1 + .../cloud/api/commands/DetachVolumeCmd.java | 16 ++++++++++++--- .../async/executor/VolumeOperationParam.java | 6 +++--- .../cloud/server/ManagementServerImpl.java | 20 ++++++++++++++++++- .../src/com/cloud/vm/UserVmManagerImpl.java | 2 +- 5 files changed, 37 insertions(+), 8 deletions(-) diff --git a/core/src/com/cloud/server/ManagementServer.java b/core/src/com/cloud/server/ManagementServer.java index 9bfaf1cddae..12ae65f682a 100644 --- a/core/src/com/cloud/server/ManagementServer.java +++ b/core/src/com/cloud/server/ManagementServer.java @@ -2189,4 +2189,5 @@ public interface ManagementServer { Map listCapabilities(); GuestOSCategoryVO getGuestOsCategory(Long guestOsId); + VolumeVO findVolumeByInstanceAndDeviceId(long instanceId, long deviceId); } diff --git a/server/src/com/cloud/api/commands/DetachVolumeCmd.java b/server/src/com/cloud/api/commands/DetachVolumeCmd.java index c4a8bd0920a..a5ddaeec23e 100644 --- a/server/src/com/cloud/api/commands/DetachVolumeCmd.java +++ b/server/src/com/cloud/api/commands/DetachVolumeCmd.java @@ -60,6 +60,7 @@ public class DetachVolumeCmd extends BaseCmd { Long volumeId = (Long) params.get(BaseCmd.Properties.ID.getName()); Long deviceId = (Long) params.get(BaseCmd.Properties.DEVICE_ID.getName()); Long instanceId = (Long) params.get(BaseCmd.Properties.VIRTUAL_MACHINE_ID.getName()); + VolumeVO volume = null; if((volumeId==null && (deviceId==null && instanceId==null)) || (volumeId!=null && (deviceId!=null || instanceId!=null)) || (volumeId==null && (deviceId==null || instanceId==null))) { @@ -85,9 +86,18 @@ public class DetachVolumeCmd extends BaseCmd { } // Check that the volume ID is valid - VolumeVO volume = getManagementServer().findVolumeById(volumeId); - if (volume == null) - throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to find volume with ID: " + volumeId); + if(volumeId != 0) + { + volume = getManagementServer().findVolumeById(volumeId); + if (volume == null) + throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to find volume with ID: " + volumeId); + } + else + { + volume = getManagementServer().findVolumeByInstanceAndDeviceId(instanceId, deviceId); + if (volume == null) + throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to find volume with ID: " + volumeId); + } // If the account is not an admin, check that the volume is owned by the account that was passed in if (!isAdmin) { diff --git a/server/src/com/cloud/async/executor/VolumeOperationParam.java b/server/src/com/cloud/async/executor/VolumeOperationParam.java index 3fd1e0f50b9..b59ddd51f2f 100644 --- a/server/src/com/cloud/async/executor/VolumeOperationParam.java +++ b/server/src/com/cloud/async/executor/VolumeOperationParam.java @@ -40,7 +40,7 @@ public class VolumeOperationParam { // Used for Attach, Detach, and Delete private long volumeId; private long eventId; - private long deviceId; + private Long deviceId; public VolumeOperationParam() { } @@ -117,11 +117,11 @@ public class VolumeOperationParam { return eventId; } - public void setDeviceId(long deviceId) { + public void setDeviceId(Long deviceId) { this.deviceId = deviceId; } - public long getDeviceId() { + public Long getDeviceId() { return deviceId; } diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index a86b44987c7..8284d0c05f4 100644 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -1991,7 +1991,11 @@ public class ManagementServerImpl implements ManagementServer { @Override public long detachVolumeFromVMAsync(long volumeId, long deviceId, long instanceId) throws InvalidParameterValueException { - VolumeVO volume = _volumeDao.findById(volumeId); + VolumeVO volume = null; + if(volumeId!=0) + volume = _volumeDao.findById(volumeId); + else + volume = _volumeDao.findByInstanceAndDeviceId(instanceId, deviceId).get(0); // Check that the volume is a data volume if (volume.getVolumeType() != VolumeType.DATADISK) { @@ -5559,6 +5563,20 @@ public class ManagementServerImpl implements ManagementServer { return null; } } + + @Override + public VolumeVO findVolumeByInstanceAndDeviceId(long instanceId, long deviceId) + { + VolumeVO volume = _volumeDao.findByInstanceAndDeviceId(instanceId, deviceId).get(0); + if (volume != null && !volume.getDestroyed() && volume.getRemoved() == null) + { + return volume; + } + else + { + return null; + } + } @Override diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 1fa47d211b5..c183ba9eceb 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -432,7 +432,7 @@ public class UserVmManagerImpl implements UserVmManager { Long vmId = null; - if(instanceId!=0) + if(instanceId==0) { vmId = volume.getInstanceId(); }