mirror of https://github.com/apache/cloudstack.git
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:
parent
1a91652ffb
commit
8bed4e5d9e
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue