bug CS-13742:details parameter addded to listVolume; values[all, vm, account, storage_type, disk_offering, min]

reviewed-by: abhi
This commit is contained in:
Abhinandan Prateek 2012-07-11 11:17:16 +05:30
parent 1a91652ffb
commit 8bed4e5d9e
4 changed files with 134 additions and 78 deletions

View File

@ -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;
}
}

View File

@ -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<VolumeDetails> details);
InstanceGroupResponse createInstanceGroupResponse(InstanceGroup group);
StoragePoolResponse createStoragePoolResponse(StoragePool pool);

View File

@ -15,28 +15,32 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
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<String> viewDetails;
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
@ -115,13 +124,34 @@ public class ListVolumesCmd extends BaseListCmd {
return recursive;
}
public EnumSet<VolumeDetails> getDetails() throws InvalidParameterValueException {
EnumSet<VolumeDetails> dv;
if (viewDetails==null || viewDetails.size() <=0){
dv = EnumSet.of(VolumeDetails.all);
}
else {
try {
ArrayList<VolumeDetails> dc = new ArrayList<VolumeDetails>();
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<VolumeResponse> response = new ListResponse<VolumeResponse>();
List<VolumeResponse> volResponses = new ArrayList<VolumeResponse>();
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);
}
}
}
}

View File

@ -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<VolumeDetails> 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;
}