diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index 8928a640d15..13252446e71 100644 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -23,6 +23,8 @@ import java.util.Iterator; import java.util.List; import java.util.Set; +import org.apache.log4j.Logger; + import com.cloud.api.response.AccountResponse; import com.cloud.api.response.ConfigurationResponse; import com.cloud.api.response.DiskOfferingResponse; @@ -40,6 +42,7 @@ import com.cloud.api.response.SystemVmResponse; import com.cloud.api.response.UserResponse; import com.cloud.api.response.UserVmResponse; import com.cloud.api.response.VlanIpRangeResponse; +import com.cloud.api.response.VolumeResponse; import com.cloud.api.response.ZoneResponse; import com.cloud.async.AsyncJobVO; import com.cloud.configuration.ConfigurationVO; @@ -51,6 +54,7 @@ import com.cloud.dc.HostPodVO; import com.cloud.dc.Vlan.VlanType; import com.cloud.dc.VlanVO; import com.cloud.domain.DomainVO; +import com.cloud.exception.InvalidParameterValueException; import com.cloud.host.Host; import com.cloud.host.HostStats; import com.cloud.host.HostVO; @@ -68,6 +72,7 @@ import com.cloud.storage.Snapshot.SnapshotType; import com.cloud.storage.SnapshotPolicyVO; import com.cloud.storage.StoragePoolVO; import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.Volume; import com.cloud.storage.VolumeVO; import com.cloud.test.PodZoneConfig; import com.cloud.user.Account; @@ -87,6 +92,8 @@ import com.cloud.vm.VmStats; public class ApiResponseHelper { + public static final Logger s_logger = Logger.getLogger(ApiResponseHelper.class.getName()); + public static UserResponse createUserResponse (UserAccount user) { UserResponse userResponse = new UserResponse(); userResponse.setAccountName(user.getAccountName()); @@ -761,6 +768,86 @@ public class ApiResponseHelper { return zoneResponse; } + public static VolumeResponse createVolumeResponse (VolumeVO volume) { + VolumeResponse volResponse = new VolumeResponse(); + volResponse.setId(volume.getId()); + + AsyncJobVO asyncJob = ApiDBUtils.findInstancePendingAsyncJob("volume", volume.getId()); + if (asyncJob != null) { + volResponse.setJobId(asyncJob.getId()); + volResponse.setJobStatus(asyncJob.getStatus()); + } + + if (volume.getName() != null) { + volResponse.setName(volume.getName()); + } else { + volResponse.setName(""); + } + + volResponse.setZoneId(volume.getDataCenterId()); + volResponse.setZoneName(ApiDBUtils.findZoneById(volume.getDataCenterId()).getName()); + + volResponse.setVolumeType(volume.getVolumeType().toString()); + volResponse.setDeviceId(volume.getDeviceId()); + + Long instanceId = volume.getInstanceId(); + if (instanceId != null) { + VMInstanceVO vm = ApiDBUtils.findVMInstanceById(instanceId); + volResponse.setVirtualMachineId(vm.getId()); + volResponse.setVirtualMachineName(vm.getName()); + volResponse.setVirtualMachineDisplayName(vm.getName()); + volResponse.setVirtualMachineState(vm.getState().toString()); + } + + // Show the virtual size of the volume + volResponse.setSize(volume.getSize()); + + volResponse.setCreated(volume.getCreated()); + volResponse.setState(volume.getStatus().toString()); + + Account accountTemp = ApiDBUtils.findAccountById(volume.getAccountId()); + if (accountTemp != null) { + volResponse.setAccountName(accountTemp.getAccountName()); + volResponse.setDomainId(accountTemp.getDomainId()); + volResponse.setDomainName(ApiDBUtils.findDomainById(accountTemp.getDomainId()).getName()); + } + + String storageType; + try { + if(volume.getPoolId() == null){ + if (volume.getState() == Volume.State.Allocated) { + /*set it as shared, so the UI can attach it to VM*/ + storageType = "shared"; + } else { + storageType = "unknown"; + } + } else { + storageType = ApiDBUtils.volumeIsOnSharedStorage(volume.getId()) ? "shared" : "local"; + } + } catch (InvalidParameterValueException e) { + s_logger.error(e.getMessage(), e); + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Volume " + volume.getName() + " does not have a valid ID"); + } + + volResponse.setStorageType(storageType); + volResponse.setDiskOfferingId(volume.getDiskOfferingId()); + + DiskOfferingVO diskOffering = ApiDBUtils.findDiskOfferingById(volume.getDiskOfferingId()); + volResponse.setDiskOfferingName(diskOffering.getName()); + volResponse.setDiskOfferingDisplayText(diskOffering.getDisplayText()); + + Long poolId = volume.getPoolId(); + String poolName = (poolId == null) ? "none" : ApiDBUtils.findStoragePoolById(poolId).getName(); + volResponse.setStoragePoolName(poolName); + volResponse.setSourceId(volume.getSourceId()); + if (volume.getSourceType() != null) { + volResponse.setSourceType(volume.getSourceType().toString()); + } + volResponse.setHypervisor(ApiDBUtils.getVolumeHyperType(volume.getId()).toString()); + volResponse.setAttached(volume.getAttached()); + + return volResponse; + } } diff --git a/server/src/com/cloud/api/commands/AttachVolumeCmd.java b/server/src/com/cloud/api/commands/AttachVolumeCmd.java index d71fb7b3a81..eaaf17f3381 100755 --- a/server/src/com/cloud/api/commands/AttachVolumeCmd.java +++ b/server/src/com/cloud/api/commands/AttachVolumeCmd.java @@ -22,6 +22,7 @@ import org.apache.log4j.Logger; import com.cloud.api.ApiConstants; import com.cloud.api.ApiDBUtils; +import com.cloud.api.ApiResponseHelper; import com.cloud.api.BaseAsyncCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; @@ -29,7 +30,6 @@ import com.cloud.api.response.VolumeResponse; import com.cloud.event.EventTypes; import com.cloud.storage.VolumeVO; import com.cloud.user.Account; -import com.cloud.uservm.UserVm; import com.cloud.vm.UserVmManager; @Implementation(method="attachVolumeToVM", manager=UserVmManager.class, description="Attaches a disk volume to a virtual machine.") @@ -106,22 +106,11 @@ public class AttachVolumeCmd extends BaseAsyncCmd { return "attaching volume: " + getId() + " to vm: " + getVirtualMachineId(); } - @Override @SuppressWarnings("unchecked") - public VolumeResponse getResponse() { - VolumeVO volume = ApiDBUtils.findVolumeById(id); - VolumeResponse response = new VolumeResponse(); - UserVm instance = ApiDBUtils.findUserVmById(volume.getInstanceId()); - response.setVirtualMachineName(instance.getName()); - response.setVirtualMachineDisplayName(instance.getDisplayName()); - response.setVirtualMachineId(instance.getId()); - response.setVirtualMachineState(instance.getState().toString()); - response.setStorageType("shared"); // NOTE: You can never attach a local disk volume but if that changes, we need to change this - response.setId(volume.getId()); - response.setName(volume.getName()); - response.setVolumeType(volume.getVolumeType().toString()); - response.setResponseName(getName()); - if(volume.getDeviceId() != null) - response.setDeviceId(volume.getDeviceId()); - return response; - } + @Override @SuppressWarnings("unchecked") + public VolumeResponse getResponse() { + VolumeVO volume = (VolumeVO)getResponseObject(); + VolumeResponse response = ApiResponseHelper.createVolumeResponse(volume); + response.setResponseName(getName()); + return response; + } } diff --git a/server/src/com/cloud/api/commands/CreateVolumeCmd.java b/server/src/com/cloud/api/commands/CreateVolumeCmd.java index 57b776d12ab..c81abb9761f 100644 --- a/server/src/com/cloud/api/commands/CreateVolumeCmd.java +++ b/server/src/com/cloud/api/commands/CreateVolumeCmd.java @@ -22,12 +22,12 @@ import org.apache.log4j.Logger; import com.cloud.api.ApiConstants; import com.cloud.api.ApiDBUtils; +import com.cloud.api.ApiResponseHelper; import com.cloud.api.BaseAsyncCreateCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.response.VolumeResponse; import com.cloud.event.EventTypes; -import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.StorageManager; import com.cloud.storage.VolumeVO; import com.cloud.user.Account; @@ -143,35 +143,9 @@ public class CreateVolumeCmd extends BaseAsyncCreateCmd { @Override @SuppressWarnings("unchecked") public VolumeResponse getResponse() { VolumeVO volume = (VolumeVO)getResponseObject(); - - VolumeResponse response = new VolumeResponse(); - response.setId(volume.getId()); - response.setName(volume.getName()); - response.setVolumeType(volume.getVolumeType().toString()); - response.setSize(volume.getSize()); - response.setCreated(volume.getCreated()); - response.setState(volume.getStatus().toString()); - response.setAccountName(ApiDBUtils.findAccountById(volume.getAccountId()).getAccountName()); - response.setDomainId(volume.getDomainId()); - response.setDiskOfferingId(volume.getDiskOfferingId()); - - DiskOfferingVO diskOffering = ApiDBUtils.findDiskOfferingById(volume.getDiskOfferingId()); - response.setDiskOfferingName(diskOffering.getName()); - response.setDiskOfferingDisplayText(diskOffering.getDisplayText()); - - response.setDomainName(ApiDBUtils.findDomainById(volume.getDomainId()).getName()); - response.setStorageType("shared"); // NOTE: You can never create a local disk volume but if that changes, we need to change this - if (volume.getPoolId() != null) { - response.setStoragePoolName(ApiDBUtils.findStoragePoolById(volume.getPoolId()).getName()); - } - - // if the volume was created from a snapshot, snapshotId will be set so we pass it back in the response - response.setSnapshotId(getSnapshotId()); - response.setZoneId(volume.getDataCenterId()); - response.setZoneName(ApiDBUtils.findZoneById(volume.getDataCenterId()).getName()); - if(volume.getDeviceId() != null){ - response.setDeviceId(volume.getDeviceId()); - } + VolumeResponse response = ApiResponseHelper.createVolumeResponse(volume); + //FIXME - have to be moved to ApiResponseHelper + response.setSnapshotId(getSnapshotId()); // if the volume was created from a snapshot, snapshotId will be set so we pass it back in the response response.setResponseName(getName()); return response; } diff --git a/server/src/com/cloud/api/commands/DetachVolumeCmd.java b/server/src/com/cloud/api/commands/DetachVolumeCmd.java index 7e013467374..15c70d6e119 100755 --- a/server/src/com/cloud/api/commands/DetachVolumeCmd.java +++ b/server/src/com/cloud/api/commands/DetachVolumeCmd.java @@ -21,6 +21,7 @@ import org.apache.log4j.Logger; import com.cloud.api.ApiConstants; import com.cloud.api.ApiDBUtils; +import com.cloud.api.ApiResponseHelper; import com.cloud.api.BaseAsyncCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; @@ -115,11 +116,11 @@ public class DetachVolumeCmd extends BaseAsyncCmd { return "detaching volume" + sb.toString(); } - @Override @SuppressWarnings("unchecked") - public VolumeResponse getResponse() { - VolumeResponse response = (VolumeResponse)getResponseObject(); - if(deviceId!=null) - response.setDeviceId(deviceId); + @Override @SuppressWarnings("unchecked") + public VolumeResponse getResponse() { + VolumeVO volume = (VolumeVO)getResponseObject(); + VolumeResponse response = ApiResponseHelper.createVolumeResponse(volume); + response.setResponseName(getName()); return response; - } + } } \ No newline at end of file diff --git a/server/src/com/cloud/api/commands/ListVolumesCmd.java b/server/src/com/cloud/api/commands/ListVolumesCmd.java index a5e17981111..e0aa11f2bea 100755 --- a/server/src/com/cloud/api/commands/ListVolumesCmd.java +++ b/server/src/com/cloud/api/commands/ListVolumesCmd.java @@ -23,21 +23,13 @@ import java.util.List; import org.apache.log4j.Logger; import com.cloud.api.ApiConstants; -import com.cloud.api.ApiDBUtils; -import com.cloud.api.BaseCmd; +import com.cloud.api.ApiResponseHelper; import com.cloud.api.BaseListCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; -import com.cloud.api.ServerApiException; import com.cloud.api.response.ListResponse; import com.cloud.api.response.VolumeResponse; -import com.cloud.async.AsyncJobVO; -import com.cloud.exception.InvalidParameterValueException; -import com.cloud.storage.DiskOfferingVO; -import com.cloud.storage.Volume; import com.cloud.storage.VolumeVO; -import com.cloud.user.Account; -import com.cloud.vm.VMInstanceVO; @Implementation(method="searchForVolumes", description="Lists all volumes.") public class ListVolumesCmd extends BaseListCmd { @@ -132,83 +124,7 @@ public class ListVolumesCmd extends BaseListCmd { ListResponse response = new ListResponse(); List volResponses = new ArrayList(); for (VolumeVO volume : volumes) { - VolumeResponse volResponse = new VolumeResponse(); - volResponse.setId(volume.getId()); - - AsyncJobVO asyncJob = ApiDBUtils.findInstancePendingAsyncJob("volume", volume.getId()); - if (asyncJob != null) { - volResponse.setJobId(asyncJob.getId()); - volResponse.setJobStatus(asyncJob.getStatus()); - } - - if (volume.getName() != null) { - volResponse.setName(volume.getName()); - } else { - volResponse.setName(""); - } - - volResponse.setZoneId(volume.getDataCenterId()); - volResponse.setZoneName(ApiDBUtils.findZoneById(volume.getDataCenterId()).getName()); - - volResponse.setVolumeType(volume.getVolumeType().toString()); - volResponse.setDeviceId(volume.getDeviceId()); - - Long instanceId = volume.getInstanceId(); - if (instanceId != null) { - VMInstanceVO vm = ApiDBUtils.findVMInstanceById(instanceId); - volResponse.setVirtualMachineId(vm.getId()); - volResponse.setVirtualMachineName(vm.getName()); - volResponse.setVirtualMachineDisplayName(vm.getName()); - volResponse.setVirtualMachineState(vm.getState().toString()); - } - - // Show the virtual size of the volume - volResponse.setSize(volume.getSize()); - - volResponse.setCreated(volume.getCreated()); - volResponse.setState(volume.getStatus().toString()); - - Account accountTemp = ApiDBUtils.findAccountById(volume.getAccountId()); - if (accountTemp != null) { - volResponse.setAccountName(accountTemp.getAccountName()); - volResponse.setDomainId(accountTemp.getDomainId()); - volResponse.setDomainName(ApiDBUtils.findDomainById(accountTemp.getDomainId()).getName()); - } - - String storageType; - try { - if(volume.getPoolId() == null){ - if (volume.getState() == Volume.State.Allocated) { - /*set it as shared, so the UI can attach it to VM*/ - storageType = "shared"; - } else { - storageType = "unknown"; - } - } else { - storageType = ApiDBUtils.volumeIsOnSharedStorage(volume.getId()) ? "shared" : "local"; - } - } catch (InvalidParameterValueException e) { - s_logger.error(e.getMessage(), e); - throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Volume " + volume.getName() + " does not have a valid ID"); - } - - volResponse.setStorageType(storageType); - volResponse.setDiskOfferingId(volume.getDiskOfferingId()); - - DiskOfferingVO diskOffering = ApiDBUtils.findDiskOfferingById(volume.getDiskOfferingId()); - volResponse.setDiskOfferingName(diskOffering.getName()); - volResponse.setDiskOfferingDisplayText(diskOffering.getDisplayText()); - - Long poolId = volume.getPoolId(); - String poolName = (poolId == null) ? "none" : ApiDBUtils.findStoragePoolById(poolId).getName(); - volResponse.setStoragePoolName(poolName); - volResponse.setSourceId(volume.getSourceId()); - if (volume.getSourceType() != null) { - volResponse.setSourceType(volume.getSourceType().toString()); - } - volResponse.setHypervisor(ApiDBUtils.getVolumeHyperType(volume.getId()).toString()); - volResponse.setAttached(volume.getAttached()); - + VolumeResponse volResponse = ApiResponseHelper.createVolumeResponse(volume); volResponse.setResponseName("volume"); volResponses.add(volResponse); } diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 71ef64cdc1a..832beea92d9 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -79,7 +79,6 @@ import com.cloud.api.commands.StartVMCmd; import com.cloud.api.commands.StopVMCmd; import com.cloud.api.commands.UpdateVMCmd; import com.cloud.api.commands.UpgradeVMCmd; -import com.cloud.api.response.VolumeResponse; import com.cloud.async.AsyncJobExecutor; import com.cloud.async.AsyncJobManager; import com.cloud.async.AsyncJobResult; @@ -357,7 +356,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM } @Override - public void attachVolumeToVM(AttachVolumeCmd command) { + public Volume attachVolumeToVM(AttachVolumeCmd command) { Long vmId = command.getVirtualMachineId(); Long volumeId = command.getId(); Long deviceId = command.getDeviceId(); @@ -584,6 +583,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM event.setDescription("Volume: " +volume.getName()+ " successfully attached to VM: "+vm.getName()); event.setLevel(EventVO.LEVEL_INFO); _eventDao.persist(event); + return _volsDao.findById(volumeId); } else { if (answer != null) { String details = answer.getDetails(); @@ -595,7 +595,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM } @Override - public VolumeResponse detachVolumeFromVM(DetachVolumeCmd cmmd) { + public Volume detachVolumeFromVM(DetachVolumeCmd cmmd) { Account account = UserContext.current().getAccount(); if ((cmmd.getId() == null && cmmd.getDeviceId() == null && cmmd.getVirtualMachineId() == null) || (cmmd.getId() != null && (cmmd.getDeviceId() != null || cmmd.getVirtualMachineId() != null)) || @@ -710,20 +710,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM event.setLevel(EventVO.LEVEL_INFO); _eventDao.persist(event); - // Prepare the response object - VolumeResponse response = new VolumeResponse(); - response.setVirtualMachineName(vm.getName()); - response.setVirtualMachineDisplayName(vm.getDisplayName()); - response.setVirtualMachineId(vm.getId()); - response.setVirtualMachineState(vm.getState().toString()); - response.setStorageType("shared"); // NOTE: You can never attach a local disk volume but if that changes, we need to change this - response.setId(volume.getId()); - response.setName(volume.getName()); - response.setVolumeType(volume.getVolumeType().toString()); - response.setResponseName(cmmd.getName()); - if(volume.getDeviceId() != null) - response.setDeviceId(volume.getDeviceId()); - return response; + return _volsDao.findById(volumeId); } else { if (answer != null) { diff --git a/server/src/com/cloud/vm/UserVmService.java b/server/src/com/cloud/vm/UserVmService.java index 8332264a990..4dcba157fea 100755 --- a/server/src/com/cloud/vm/UserVmService.java +++ b/server/src/com/cloud/vm/UserVmService.java @@ -31,7 +31,6 @@ import com.cloud.api.commands.StartVMCmd; import com.cloud.api.commands.StopVMCmd; import com.cloud.api.commands.UpdateVMCmd; import com.cloud.api.commands.UpgradeVMCmd; -import com.cloud.api.response.VolumeResponse; import com.cloud.async.executor.OperationResponse; import com.cloud.async.executor.RebootVMExecutor; import com.cloud.async.executor.VMOperationParam; @@ -43,6 +42,7 @@ import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.exception.StorageUnavailableException; import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.Volume; import com.cloud.uservm.UserVm; import com.cloud.utils.component.Manager; import com.cloud.utils.exception.ExecutionException; @@ -65,17 +65,18 @@ public interface UserVmService extends Manager { /** * Attaches the specified volume to the specified VM * @param cmd - the command specifying volumeId and vmId + * @return the Volume object if attach worked successfully. * @throws InvalidParameterValueException, PermissionDeniedException */ - void attachVolumeToVM(AttachVolumeCmd cmd); + Volume attachVolumeToVM(AttachVolumeCmd cmd); /** * Detaches the specified volume from the VM it is currently attached to. * @param cmd - the command specifying volumeId - * @return the VolumeResponse object if detach worked successfully. + * @return the Volume object if detach worked successfully. * @throws InvalidParameterValueException */ - VolumeResponse detachVolumeFromVM(DetachVolumeCmd cmmd); + Volume detachVolumeFromVM(DetachVolumeCmd cmmd); UserVm startVirtualMachine(StartVMCmd cmd) throws StorageUnavailableException, ExecutionException, ConcurrentOperationException; UserVm stopVirtualMachine(StopVMCmd cmd);