From 8bed4e5d9ebade04d03f16a7f3cc47300135d3fe Mon Sep 17 00:00:00 2001 From: Abhinandan Prateek Date: Wed, 11 Jul 2012 11:17:16 +0530 Subject: [PATCH] bug CS-13742:details parameter addded to listVolume; values[all, vm, account, storage_type, disk_offering, min] reviewed-by: abhi --- api/src/com/cloud/api/ApiConstants.java | 6 + api/src/com/cloud/api/ResponseGenerator.java | 6 +- .../cloud/api/commands/ListVolumesCmd.java | 56 +++++-- .../src/com/cloud/api/ApiResponseHelper.java | 144 ++++++++++-------- 4 files changed, 134 insertions(+), 78 deletions(-) diff --git a/api/src/com/cloud/api/ApiConstants.java b/api/src/com/cloud/api/ApiConstants.java index 09bae98f492..95ab60f1f44 100755 --- a/api/src/com/cloud/api/ApiConstants.java +++ b/api/src/com/cloud/api/ApiConstants.java @@ -254,4 +254,10 @@ public class ApiConstants { public static final String KEYBOARD="keyboard"; public static final String OPEN_FIREWALL="openfirewall"; public static final String TEMPLATE_TAG = "templatetag"; + + public enum VolumeDetails { + all, vm, account, storage_type, disk_offering, min; + } + + } diff --git a/api/src/com/cloud/api/ResponseGenerator.java b/api/src/com/cloud/api/ResponseGenerator.java index 4691e5ff67c..4e8910345fd 100755 --- a/api/src/com/cloud/api/ResponseGenerator.java +++ b/api/src/com/cloud/api/ResponseGenerator.java @@ -18,8 +18,10 @@ package com.cloud.api; import java.text.DecimalFormat; +import java.util.EnumSet; import java.util.List; +import com.cloud.api.ApiConstants.VolumeDetails; import com.cloud.api.commands.QueryAsyncJobResultCmd; import com.cloud.api.response.AccountResponse; import com.cloud.api.response.AsyncJobResponse; @@ -140,7 +142,9 @@ public interface ResponseGenerator { ZoneResponse createZoneResponse(DataCenter dataCenter); VolumeResponse createVolumeResponse(Volume volume); - + + VolumeResponse createVolumeResponse(Volume volume, EnumSet details); + InstanceGroupResponse createInstanceGroupResponse(InstanceGroup group); StoragePoolResponse createStoragePoolResponse(StoragePool pool); diff --git a/api/src/com/cloud/api/commands/ListVolumesCmd.java b/api/src/com/cloud/api/commands/ListVolumesCmd.java index fbd6bd9a6ee..0f6975a3c5e 100755 --- a/api/src/com/cloud/api/commands/ListVolumesCmd.java +++ b/api/src/com/cloud/api/commands/ListVolumesCmd.java @@ -15,28 +15,32 @@ * along with this program. If not, see . * */ -package com.cloud.api.commands; - +package com.cloud.api.commands; + import java.util.ArrayList; +import java.util.EnumSet; import java.util.List; import org.apache.log4j.Logger; import com.cloud.api.ApiConstants; +import com.cloud.api.ApiConstants.VolumeDetails; import com.cloud.api.BaseListCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; +import com.cloud.api.BaseCmd.CommandType; import com.cloud.api.response.ListResponse; import com.cloud.api.response.VolumeResponse; import com.cloud.async.AsyncJob; +import com.cloud.exception.InvalidParameterValueException; import com.cloud.storage.Volume; -@Implementation(description="Lists all volumes.", responseObject=VolumeResponse.class) -public class ListVolumesCmd extends BaseListCmd { - public static final Logger s_logger = Logger.getLogger(ListVolumesCmd.class.getName()); - - private static final String s_name = "listvolumesresponse"; - +@Implementation(description="Lists all volumes.", responseObject=VolumeResponse.class) +public class ListVolumesCmd extends BaseListCmd { + public static final Logger s_logger = Logger.getLogger(ListVolumesCmd.class.getName()); + + private static final String s_name = "listvolumesresponse"; + ///////////////////////////////////////////////////// //////////////// API parameters ///////////////////// ///////////////////////////////////////////////////// @@ -71,6 +75,11 @@ public class ListVolumesCmd extends BaseListCmd { @Parameter(name=ApiConstants.IS_RECURSIVE, type=CommandType.BOOLEAN, description="defaults to false, but if true, lists all volumes from the parent specified by the domain id till leaves.") private Boolean recursive; + @Parameter(name=ApiConstants.DETAILS, type=CommandType.LIST, collectionType=CommandType.STRING, description="comma separated list of host details requested, " + + "value can be a comma separated list of [all, vm, account, storage_type, disk_offering, min]. If no parameter is passed in, the details will be defaulted to all" ) + private List viewDetails; + + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -115,13 +124,34 @@ public class ListVolumesCmd extends BaseListCmd { return recursive; } + public EnumSet getDetails() throws InvalidParameterValueException { + EnumSet dv; + if (viewDetails==null || viewDetails.size() <=0){ + dv = EnumSet.of(VolumeDetails.all); + } + else { + try { + ArrayList dc = new ArrayList(); + for (String detail: viewDetails){ + dc.add(VolumeDetails.valueOf(detail)); + } + dv = EnumSet.copyOf(dc); + } + catch (IllegalArgumentException e){ + throw new InvalidParameterValueException("The details parameter contains a non permitted value. The allowed values are " + EnumSet.allOf(VolumeDetails.class)); + } + } + return dv; + } + + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// @Override - public String getCommandName() { - return s_name; + public String getCommandName() { + return s_name; } @Override @@ -136,7 +166,7 @@ public class ListVolumesCmd extends BaseListCmd { ListResponse response = new ListResponse(); List volResponses = new ArrayList(); for (Volume volume : volumes) { - VolumeResponse volResponse = _responseGenerator.createVolumeResponse(volume); + VolumeResponse volResponse = _responseGenerator.createVolumeResponse(volume, getDetails()); volResponse.setObjectName("volume"); volResponses.add(volResponse); } @@ -144,5 +174,5 @@ public class ListVolumesCmd extends BaseListCmd { response.setResponses(volResponses); response.setResponseName(getCommandName()); this.setResponseObject(response); - } -} + } +} diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index 4d3b45f8dac..e87929e96f8 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -20,6 +20,7 @@ package com.cloud.api; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Date; +import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.Hashtable; @@ -31,6 +32,7 @@ import java.util.StringTokenizer; import org.apache.log4j.Logger; +import com.cloud.api.ApiConstants.VolumeDetails; import com.cloud.api.commands.QueryAsyncJobResultCmd; import com.cloud.api.response.AccountResponse; import com.cloud.api.response.ApiResponseSerializer; @@ -925,9 +927,15 @@ public class ApiResponseHelper implements ResponseGenerator { zoneResponse.setObjectName("zone"); return zoneResponse; } + @Override public VolumeResponse createVolumeResponse(Volume volume) { + return createVolumeResponse(volume, EnumSet.of(VolumeDetails.all)); + } + + @Override + public VolumeResponse createVolumeResponse(Volume volume, EnumSet details) { VolumeResponse volResponse = new VolumeResponse(); volResponse.setId(volume.getId()); @@ -938,88 +946,96 @@ public class ApiResponseHelper implements ResponseGenerator { } 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 && volume.getState() != Volume.State.Destroy) { - VMInstanceVO vm = ApiDBUtils.findVMInstanceById(instanceId); - if(vm != null){ - volResponse.setVirtualMachineId(vm.getId()); - volResponse.setVirtualMachineName(vm.getHostName()); - UserVm userVm = ApiDBUtils.findUserVmById(vm.getId()); - if (userVm != null) { - volResponse.setVirtualMachineDisplayName(userVm.getDisplayName()); - volResponse.setVirtualMachineState(vm.getState().toString()); - } else { - s_logger.error("User Vm with Id: "+instanceId+" does not exist for volume "+volume.getId()); - } - } else { - s_logger.error("Vm with Id: "+instanceId+" does not exist for volume "+volume.getId()); - } - } - // Show the virtual size of the volume volResponse.setSize(volume.getSize()); - volResponse.setCreated(volume.getCreated()); volResponse.setState(volume.getState().toString()); + volResponse.setAttached(volume.getAttached()); + volResponse.setDestroyed(volume.getState() == Volume.State.Destroy); - 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()) ? ServiceOffering.StorageType.shared.toString() : ServiceOffering.StorageType.local.toString(); - } - } 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); if (volume.getVolumeType().equals(Volume.Type.ROOT)) { volResponse.setServiceOfferingId(volume.getDiskOfferingId()); } else { volResponse.setDiskOfferingId(volume.getDiskOfferingId()); } - - DiskOfferingVO diskOffering = ApiDBUtils.findDiskOfferingById(volume.getDiskOfferingId()); - if (volume.getVolumeType().equals(Volume.Type.ROOT)) { - volResponse.setServiceOfferingName(diskOffering.getName()); - volResponse.setServiceOfferingDisplayText(diskOffering.getDisplayText()); - } else { - volResponse.setDiskOfferingName(diskOffering.getName()); - volResponse.setDiskOfferingDisplayText(diskOffering.getDisplayText()); + + if (details.contains(VolumeDetails.vm) || details.contains(VolumeDetails.all)){ + volResponse.setZoneName(ApiDBUtils.findZoneById(volume.getDataCenterId()).getName()); + Long instanceId = volume.getInstanceId(); + if (instanceId != null && volume.getState() != Volume.State.Destroy) { + VMInstanceVO vm = ApiDBUtils.findVMInstanceById(instanceId); + if(vm != null){ + volResponse.setVirtualMachineId(vm.getId()); + volResponse.setVirtualMachineName(vm.getHostName()); + UserVm userVm = ApiDBUtils.findUserVmById(vm.getId()); + if (userVm != null) { + volResponse.setVirtualMachineDisplayName(userVm.getDisplayName()); + volResponse.setVirtualMachineState(vm.getState().toString()); + } else { + s_logger.error("User Vm with Id: "+instanceId+" does not exist for volume "+volume.getId()); + } + } else { + s_logger.error("Vm with Id: "+instanceId+" does not exist for volume "+volume.getId()); + } + } + volResponse.setHypervisor(ApiDBUtils.getVolumeHyperType(volume.getId()).toString()); } - Long poolId = volume.getPoolId(); - String poolName = (poolId == null) ? "none" : ApiDBUtils.findStoragePoolById(poolId).getName(); - volResponse.setStoragePoolName(poolName); + if (details.contains(VolumeDetails.account) || details.contains(VolumeDetails.all)){ + Account accountTemp = ApiDBUtils.findAccountById(volume.getAccountId()); + if (accountTemp != null) { + volResponse.setAccountName(accountTemp.getAccountName()); + volResponse.setDomainId(accountTemp.getDomainId()); + volResponse.setDomainName(ApiDBUtils.findDomainById(accountTemp.getDomainId()).getName()); + } + } + + if (details.contains(VolumeDetails.storage_type) || details.contains(VolumeDetails.all)){ + 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()) ? ServiceOffering.StorageType.shared.toString() : ServiceOffering.StorageType.local.toString(); + } + } 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); + + Long poolId = volume.getPoolId(); + String poolName = (poolId == null) ? "none" : ApiDBUtils.findStoragePoolById(poolId).getName(); + volResponse.setStoragePoolName(poolName); + } + + if (details.contains(VolumeDetails.disk_offering) || details.contains(VolumeDetails.all)){ + DiskOfferingVO diskOffering = ApiDBUtils.findDiskOfferingById(volume.getDiskOfferingId()); + if (volume.getVolumeType().equals(Volume.Type.ROOT)) { + volResponse.setServiceOfferingName(diskOffering.getName()); + volResponse.setServiceOfferingDisplayText(diskOffering.getDisplayText()); + } else { + volResponse.setDiskOfferingName(diskOffering.getName()); + volResponse.setDiskOfferingDisplayText(diskOffering.getDisplayText()); + } + VMTemplateVO template = ApiDBUtils.findTemplateById(volume.getTemplateId()); + boolean isExtractable = template != null && template.isExtractable() && !(template.getTemplateType() == TemplateType.SYSTEM); + volResponse.setExtractable(isExtractable); + } + + // volResponse.setSourceId(volume.getSourceId()); // if (volume.getSourceType() != null) { // volResponse.setSourceType(volume.getSourceType().toString()); // } - volResponse.setHypervisor(ApiDBUtils.getVolumeHyperType(volume.getId()).toString()); - volResponse.setAttached(volume.getAttached()); - volResponse.setDestroyed(volume.getState() == Volume.State.Destroy); - VMTemplateVO template = ApiDBUtils.findTemplateById(volume.getTemplateId()); - boolean isExtractable = template != null && template.isExtractable() && !(template.getTemplateType() == TemplateType.SYSTEM); - volResponse.setExtractable(isExtractable); + volResponse.setObjectName("volume"); return volResponse; }