mirror of https://github.com/apache/cloudstack.git
bug CS-15919: added details parameter value can be a comma separated list of [all, vm, account, storage_type, disk_offering, min]
This commit is contained in:
parent
9fc16802c7
commit
b82fddd629
|
|
@ -409,6 +409,10 @@ public class ApiConstants {
|
|||
public enum VMDetails {
|
||||
all, group, nics, stats, secgrp, tmpl, servoff, iso, volume, min;
|
||||
}
|
||||
|
||||
public enum VolumeDetails {
|
||||
all, vm, account, storage_type, disk_offering, min;
|
||||
}
|
||||
|
||||
public enum LDAPParams {
|
||||
hostname, port, usessl, queryfilter, searchbase, dn, passwd, truststore, truststorepass;
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ import java.util.List;
|
|||
|
||||
import com.cloud.api.ApiConstants.HostDetails;
|
||||
import com.cloud.api.ApiConstants.VMDetails;
|
||||
import com.cloud.api.ApiConstants.VolumeDetails;
|
||||
import com.cloud.api.commands.QueryAsyncJobResultCmd;
|
||||
import com.cloud.api.response.AccountResponse;
|
||||
import com.cloud.api.response.AsyncJobResponse;
|
||||
|
|
@ -198,6 +199,8 @@ public interface ResponseGenerator {
|
|||
ZoneResponse createZoneResponse(DataCenter dataCenter, Boolean showCapacities);
|
||||
|
||||
VolumeResponse createVolumeResponse(Volume volume);
|
||||
|
||||
VolumeResponse createVolumeResponse(Volume volume, EnumSet<VolumeDetails> details);
|
||||
|
||||
InstanceGroupResponse createInstanceGroupResponse(InstanceGroup group);
|
||||
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
package com.cloud.api.commands;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.EnumSet;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
|
|
@ -24,7 +25,9 @@ import com.cloud.api.Implementation;
|
|||
import com.cloud.api.Parameter;
|
||||
import com.cloud.api.response.ListResponse;
|
||||
import com.cloud.api.response.VolumeResponse;
|
||||
import com.cloud.api.ApiConstants.VolumeDetails;
|
||||
import com.cloud.async.AsyncJob;
|
||||
import com.cloud.exception.InvalidParameterValueException;
|
||||
import com.cloud.storage.Volume;
|
||||
|
||||
@Implementation(description="Lists all volumes.", responseObject=VolumeResponse.class)
|
||||
|
|
@ -63,6 +66,10 @@ public class ListVolumesCmd extends BaseListTaggedResourcesCmd {
|
|||
@Parameter(name=ApiConstants.ZONE_ID, type=CommandType.LONG, description="the ID of the availability zone")
|
||||
private Long zoneId;
|
||||
|
||||
@Parameter(name=ApiConstants.DETAILS, type=CommandType.LIST, collectionType=CommandType.STRING, description="comma separated list of volume 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 ///////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
@ -96,6 +103,26 @@ public class ListVolumesCmd extends BaseListTaggedResourcesCmd {
|
|||
return zoneId;
|
||||
}
|
||||
|
||||
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), null);
|
||||
}
|
||||
}
|
||||
return dv;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////// API Implementation///////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
@ -117,7 +144,7 @@ public class ListVolumesCmd extends BaseListTaggedResourcesCmd {
|
|||
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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ import com.cloud.acl.ControlledEntity;
|
|||
import com.cloud.acl.ControlledEntity.ACLType;
|
||||
import com.cloud.api.ApiConstants.HostDetails;
|
||||
import com.cloud.api.ApiConstants.VMDetails;
|
||||
import com.cloud.api.ApiConstants.VolumeDetails;
|
||||
import com.cloud.api.commands.QueryAsyncJobResultCmd;
|
||||
import com.cloud.api.response.AccountResponse;
|
||||
import com.cloud.api.response.ApiResponseSerializer;
|
||||
|
|
@ -1045,8 +1046,14 @@ public class ApiResponseHelper implements ResponseGenerator {
|
|||
return capacityResponses;
|
||||
}
|
||||
|
||||
|
||||
@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());
|
||||
|
||||
|
|
@ -1057,124 +1064,134 @@ 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) {
|
||||
if (userVm.getDisplayName() != null) {
|
||||
volResponse.setVirtualMachineDisplayName(userVm.getDisplayName());
|
||||
} else {
|
||||
volResponse.setVirtualMachineDisplayName(userVm.getHostName());
|
||||
}
|
||||
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());
|
||||
if(volume.getState() == Volume.State.UploadOp){
|
||||
com.cloud.storage.VolumeHostVO volumeHostRef = ApiDBUtils.findVolumeHostRef(volume.getId(), volume.getDataCenterId());
|
||||
volResponse.setSize(volumeHostRef.getSize());
|
||||
volResponse.setCreated(volumeHostRef.getCreated());
|
||||
Account caller = UserContext.current().getCaller();
|
||||
if (caller.getType() == Account.ACCOUNT_TYPE_ADMIN || caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN)
|
||||
volResponse.setHypervisor(ApiDBUtils.getHypervisorTypeFromFormat(volumeHostRef.getFormat()).toString());
|
||||
if (volumeHostRef.getDownloadState() != Status.DOWNLOADED) {
|
||||
String volumeStatus = "Processing";
|
||||
if (volumeHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOAD_IN_PROGRESS) {
|
||||
if (volumeHostRef.getDownloadPercent() == 100) {
|
||||
volumeStatus = "Checking Volume";
|
||||
} else {
|
||||
volumeStatus = volumeHostRef.getDownloadPercent() + "% Uploaded";
|
||||
}
|
||||
volResponse.setState("Uploading");
|
||||
} else {
|
||||
volumeStatus = volumeHostRef.getErrorString();
|
||||
if(volumeHostRef.getDownloadState() == VMTemplateHostVO.Status.NOT_DOWNLOADED){
|
||||
volResponse.setState("UploadNotStarted");
|
||||
}else {
|
||||
volResponse.setState("UploadError");
|
||||
}
|
||||
}
|
||||
volResponse.setStatus(volumeStatus);
|
||||
} else if (volumeHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOADED) {
|
||||
volResponse.setStatus("Upload Complete");
|
||||
volResponse.setState("Uploaded");
|
||||
} else {
|
||||
volResponse.setStatus("Successfully Installed");
|
||||
}
|
||||
volResponse.setAttached(volume.getAttached());
|
||||
volResponse.setDestroyed(volume.getState() == Volume.State.Destroy);
|
||||
|
||||
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) {
|
||||
if (userVm.getDisplayName() != null) {
|
||||
volResponse.setVirtualMachineDisplayName(userVm.getDisplayName());
|
||||
} else {
|
||||
volResponse.setVirtualMachineDisplayName(userVm.getHostName());
|
||||
}
|
||||
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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
populateOwner(volResponse, volume);
|
||||
if (details.contains(VolumeDetails.all)){
|
||||
if(volume.getState() == Volume.State.UploadOp){
|
||||
com.cloud.storage.VolumeHostVO volumeHostRef = ApiDBUtils.findVolumeHostRef(volume.getId(), volume.getDataCenterId());
|
||||
volResponse.setSize(volumeHostRef.getSize());
|
||||
volResponse.setCreated(volumeHostRef.getCreated());
|
||||
Account caller = UserContext.current().getCaller();
|
||||
if (caller.getType() == Account.ACCOUNT_TYPE_ADMIN || caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN)
|
||||
volResponse.setHypervisor(ApiDBUtils.getHypervisorTypeFromFormat(volumeHostRef.getFormat()).toString());
|
||||
if (volumeHostRef.getDownloadState() != Status.DOWNLOADED) {
|
||||
String volumeStatus = "Processing";
|
||||
if (volumeHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOAD_IN_PROGRESS) {
|
||||
if (volumeHostRef.getDownloadPercent() == 100) {
|
||||
volumeStatus = "Checking Volume";
|
||||
} else {
|
||||
volumeStatus = volumeHostRef.getDownloadPercent() + "% Uploaded";
|
||||
}
|
||||
volResponse.setState("Uploading");
|
||||
} else {
|
||||
volumeStatus = volumeHostRef.getErrorString();
|
||||
if(volumeHostRef.getDownloadState() == VMTemplateHostVO.Status.NOT_DOWNLOADED){
|
||||
volResponse.setState("UploadNotStarted");
|
||||
}else {
|
||||
volResponse.setState("UploadError");
|
||||
}
|
||||
}
|
||||
volResponse.setStatus(volumeStatus);
|
||||
} else if (volumeHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOADED) {
|
||||
volResponse.setStatus("Upload Complete");
|
||||
volResponse.setState("Uploaded");
|
||||
} else {
|
||||
volResponse.setStatus("Successfully Installed");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (details.contains(VolumeDetails.account) || details.contains(VolumeDetails.all)){
|
||||
populateOwner(volResponse, volume);
|
||||
}
|
||||
|
||||
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.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());
|
||||
}
|
||||
volResponse.setStorageType(diskOffering.getUseLocalStorage() ? ServiceOffering.StorageType.local.toString() : ServiceOffering.StorageType.shared.toString());
|
||||
}
|
||||
|
||||
if (details.contains(VolumeDetails.storage_type) || details.contains(VolumeDetails.all)){
|
||||
Long poolId = volume.getPoolId();
|
||||
String poolName = (poolId == null) ? "none" : ApiDBUtils.findStoragePoolById(poolId).getName();
|
||||
volResponse.setStoragePoolName(poolName);
|
||||
}
|
||||
volResponse.setStorageType(diskOffering.getUseLocalStorage() ? ServiceOffering.StorageType.local.toString() : ServiceOffering.StorageType.shared.toString());
|
||||
|
||||
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());
|
||||
// }
|
||||
|
||||
// return hypervisor for ROOT and Resource domain only
|
||||
Account caller = UserContext.current().getCaller();
|
||||
if ((caller.getType() == Account.ACCOUNT_TYPE_ADMIN || caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) && volume.getState() != Volume.State.UploadOp) {
|
||||
volResponse.setHypervisor(ApiDBUtils.getVolumeHyperType(volume.getId()).toString());
|
||||
if (details.contains(VolumeDetails.all)){
|
||||
// return hypervisor for ROOT and Resource domain only
|
||||
Account caller = UserContext.current().getCaller();
|
||||
if ((caller.getType() == Account.ACCOUNT_TYPE_ADMIN || caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) && volume.getState() != Volume.State.UploadOp) {
|
||||
volResponse.setHypervisor(ApiDBUtils.getVolumeHyperType(volume.getId()).toString());
|
||||
}
|
||||
|
||||
boolean isExtractable = true;
|
||||
if (volume.getVolumeType() != Volume.Type.DATADISK) { // Datadisk dont have any template dependence.
|
||||
VMTemplateVO template = ApiDBUtils.findTemplateById(volume.getTemplateId());
|
||||
if (template != null) { // For ISO based volumes template = null and we allow extraction of all ISO based
|
||||
// volumes
|
||||
isExtractable = template.isExtractable() && template.getTemplateType() != Storage.TemplateType.SYSTEM;
|
||||
}
|
||||
}
|
||||
volResponse.setExtractable(isExtractable);
|
||||
|
||||
//set tag information
|
||||
List<? extends ResourceTag> tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.Volume, volume.getId());
|
||||
List<ResourceTagResponse> tagResponses = new ArrayList<ResourceTagResponse>();
|
||||
for (ResourceTag tag : tags) {
|
||||
ResourceTagResponse tagResponse = createResourceTagResponse(tag, true);
|
||||
tagResponses.add(tagResponse);
|
||||
}
|
||||
volResponse.setTags(tagResponses);
|
||||
}
|
||||
|
||||
volResponse.setAttached(volume.getAttached());
|
||||
volResponse.setDestroyed(volume.getState() == Volume.State.Destroy);
|
||||
boolean isExtractable = true;
|
||||
if (volume.getVolumeType() != Volume.Type.DATADISK) { // Datadisk dont have any template dependence.
|
||||
VMTemplateVO template = ApiDBUtils.findTemplateById(volume.getTemplateId());
|
||||
if (template != null) { // For ISO based volumes template = null and we allow extraction of all ISO based
|
||||
// volumes
|
||||
isExtractable = template.isExtractable() && template.getTemplateType() != Storage.TemplateType.SYSTEM;
|
||||
}
|
||||
}
|
||||
|
||||
//set tag information
|
||||
List<? extends ResourceTag> tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.Volume, volume.getId());
|
||||
List<ResourceTagResponse> tagResponses = new ArrayList<ResourceTagResponse>();
|
||||
for (ResourceTag tag : tags) {
|
||||
ResourceTagResponse tagResponse = createResourceTagResponse(tag, true);
|
||||
tagResponses.add(tagResponse);
|
||||
}
|
||||
volResponse.setTags(tagResponses);
|
||||
|
||||
volResponse.setExtractable(isExtractable);
|
||||
volResponse.setObjectName("volume");
|
||||
return volResponse;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -415,6 +415,9 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
|
|||
if (prodBrand.equals("XenServer") && prodVersion.equals("6.0.2"))
|
||||
return new XenServer602Resource();
|
||||
|
||||
if (prodBrand.equals("XenServer") && prodVersion.equals("6.0.9"))
|
||||
return new XenServer602Resource();
|
||||
|
||||
if(prodBrand.equals("XenServer") && prodVersion.equals("5.6.100")) {
|
||||
String prodVersionTextShort = record.softwareVersion.get("product_version_text_short").trim();
|
||||
if("5.6 SP2".equals(prodVersionTextShort)) {
|
||||
|
|
@ -424,7 +427,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
|
|||
}
|
||||
}
|
||||
|
||||
String msg = "Only support XCP 1.0.0, 1.1.0, 1.5 beta; XenServer 5.6, XenServer 5.6 FP1, XenServer 5.6 SP2, Xenserver 6.0, 6.0.2 but this one is " + prodBrand + " " + prodVersion;
|
||||
String msg = "Only support XCP 1.0.0, 1.1.0, 1.5 beta; XenServer 5.6, XenServer 5.6 FP1, XenServer 5.6 SP2, Xenserver 6.0, 6.0.2, 6.0.9 but this one is " + prodBrand + " " + prodVersion;
|
||||
_alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, dcId, podId, msg, msg);
|
||||
s_logger.debug(msg);
|
||||
throw new RuntimeException(msg);
|
||||
|
|
@ -560,6 +563,8 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
|
|||
resource = XenServer600Resource.class.getName();
|
||||
} else if (prodBrand.equals("XenServer") && prodVersion.equals("6.0.2")) {
|
||||
resource = XenServer602Resource.class.getName();
|
||||
} else if (prodBrand.equals("XenServer") && prodVersion.equals("6.0.9")) {
|
||||
resource = XenServer602Resource.class.getName();
|
||||
} else if(prodBrand.equals("XenServer") && prodVersion.equals("5.6.100")) {
|
||||
String prodVersionTextShort = details.get("product_version_text_short").trim();
|
||||
if("5.6 SP2".equals(prodVersionTextShort)) {
|
||||
|
|
@ -569,7 +574,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
|
|||
}
|
||||
}
|
||||
if( resource == null ){
|
||||
String msg = "Only support XCP 1.0.0, 1.1.0, 1.5 beta; XenServer 5.6, 5.6 FP1, 5.6 SP2 and Xenserver 6.0 , 6.0.2 but this one is " + prodBrand + " " + prodVersion;
|
||||
String msg = "Only support XCP 1.0.0, 1.1.0, 1.5 beta; XenServer 5.6, 5.6 FP1, 5.6 SP2 and Xenserver 6.0 , 6.0.2, 6.0.9 but this one is " + prodBrand + " " + prodVersion;
|
||||
s_logger.debug(msg);
|
||||
throw new RuntimeException(msg);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue