From b82fddd6296c3556f5e48ea39ab048471f844c1d Mon Sep 17 00:00:00 2001 From: Abhinandan Prateek Date: Fri, 10 Aug 2012 10:28:25 +0530 Subject: [PATCH] bug CS-15919: added details parameter value can be a comma separated list of [all, vm, account, storage_type, disk_offering, min] --- api/src/com/cloud/api/ApiConstants.java | 4 + api/src/com/cloud/api/ResponseGenerator.java | 3 + .../cloud/api/commands/ListVolumesCmd.java | 29 ++- .../src/com/cloud/api/ApiResponseHelper.java | 209 ++++++++++-------- .../xen/discoverer/XcpServerDiscoverer.java | 9 +- 5 files changed, 155 insertions(+), 99 deletions(-) diff --git a/api/src/com/cloud/api/ApiConstants.java b/api/src/com/cloud/api/ApiConstants.java index 7dd885cfe99..a44e70c1d49 100755 --- a/api/src/com/cloud/api/ApiConstants.java +++ b/api/src/com/cloud/api/ApiConstants.java @@ -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; diff --git a/api/src/com/cloud/api/ResponseGenerator.java b/api/src/com/cloud/api/ResponseGenerator.java index d65d155433e..73a306416cf 100755 --- a/api/src/com/cloud/api/ResponseGenerator.java +++ b/api/src/com/cloud/api/ResponseGenerator.java @@ -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 details); InstanceGroupResponse createInstanceGroupResponse(InstanceGroup group); diff --git a/api/src/com/cloud/api/commands/ListVolumesCmd.java b/api/src/com/cloud/api/commands/ListVolumesCmd.java index 454e4183997..094661cd408 100755 --- a/api/src/com/cloud/api/commands/ListVolumesCmd.java +++ b/api/src/com/cloud/api/commands/ListVolumesCmd.java @@ -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 viewDetails; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -96,6 +103,26 @@ public class ListVolumesCmd extends BaseListTaggedResourcesCmd { return zoneId; } + 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), null); + } + } + return dv; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// @@ -117,7 +144,7 @@ public class ListVolumesCmd extends BaseListTaggedResourcesCmd { 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); } diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index 5fdc3dd2be1..b78b989ad32 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -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 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 tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.Volume, volume.getId()); + List tagResponses = new ArrayList(); + 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 tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.Volume, volume.getId()); - List tagResponses = new ArrayList(); - for (ResourceTag tag : tags) { - ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); - tagResponses.add(tagResponse); - } - volResponse.setTags(tagResponses); - - volResponse.setExtractable(isExtractable); volResponse.setObjectName("volume"); return volResponse; } diff --git a/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java b/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java index 8a6c60546d0..7e596320c35 100755 --- a/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java +++ b/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java @@ -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); }