From 61cb4ea0663a737e5a5cb27177c50907f9bad02e Mon Sep 17 00:00:00 2001 From: PrashantBhanage Date: Thu, 25 Jun 2026 13:54:18 +0530 Subject: [PATCH] Refactor: Modularize ApiResponseHelper#createUsageResponse Fixes #11635 - Extracted the 500+ line switch/if-else block into a main dispatcher method `populateUsageTypeSpecificDetails`. - Created 18 individual private helper methods for each specific `UsageType` to improve maintainability and readability. - Introduced a `UsageResourceDetails` container class to safely manage and return `resourceId` and `resourceType` state for tag lookups. - Verified zero business logic changes; strictly structural refactoring. --- .../java/com/cloud/api/ApiResponseHelper.java | 1016 +++++++++-------- 1 file changed, 563 insertions(+), 453 deletions(-) diff --git a/server/src/main/java/com/cloud/api/ApiResponseHelper.java b/server/src/main/java/com/cloud/api/ApiResponseHelper.java index 8c51d992684..f309196442e 100644 --- a/server/src/main/java/com/cloud/api/ApiResponseHelper.java +++ b/server/src/main/java/com/cloud/api/ApiResponseHelper.java @@ -4184,459 +4184,9 @@ public class ApiResponseHelper implements ResponseGenerator, ResourceIdSupport { } } - ResourceTag.ResourceObjectType resourceType = null; - Long resourceId = null; - if (usageRecord.getUsageType() == UsageTypes.RUNNING_VM || usageRecord.getUsageType() == UsageTypes.ALLOCATED_VM) { - ServiceOfferingVO svcOffering = _entityMgr.findByIdIncludingRemoved(ServiceOfferingVO.class, usageRecord.getOfferingId().toString()); - //Service Offering Id - if(svcOffering != null) { - usageRecResponse.setOfferingId(svcOffering.getUuid()); - } - //VM Instance ID - VMInstanceVO vm = null; - if (usageRecord.getUsageId() != null && usageRecord.getUsageId().equals(usageRecord.getVmInstanceId())) { - vm = vmInstance; - } else { - vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getUsageId().toString()); - } - if (vm != null) { - resourceType = ResourceTag.ResourceObjectType.UserVm; - usageRecResponse.setUsageId(vm.getUuid()); - resourceId = vm.getId(); - final GuestOS guestOS = _guestOsDao.findById(vm.getGuestOSId()); - if (guestOS != null) { - usageRecResponse.setOsTypeId(guestOS.getUuid()); - usageRecResponse.setOsDisplayName(guestOS.getDisplayName()); - final GuestOsCategory guestOsCategory = _guestOsCategoryDao.findById(guestOS.getCategoryId()); - if (guestOsCategory != null) { - usageRecResponse.setOsCategoryId(guestOsCategory.getUuid()); - usageRecResponse.setOsCategoryName(guestOsCategory.getName()); - } - } - } - //Hypervisor Type - usageRecResponse.setType(usageRecord.getType()); - //Dynamic compute offerings details - if(usageRecord.getCpuCores() != null) { - usageRecResponse.setCpuNumber(usageRecord.getCpuCores()); - } else if (svcOffering.getCpu() != null){ - usageRecResponse.setCpuNumber(svcOffering.getCpu().longValue()); - } - if(usageRecord.getCpuSpeed() != null) { - usageRecResponse.setCpuSpeed(usageRecord.getCpuSpeed()); - } else if(svcOffering.getSpeed() != null){ - usageRecResponse.setCpuSpeed(svcOffering.getSpeed().longValue()); - } - if(usageRecord.getMemory() != null) { - usageRecResponse.setMemory(usageRecord.getMemory()); - } else if(svcOffering.getRamSize() != null) { - usageRecResponse.setMemory(svcOffering.getRamSize().longValue()); - } - if (!oldFormat) { - final StringBuilder builder = new StringBuilder(); - if (usageRecord.getUsageType() == UsageTypes.RUNNING_VM) { - builder.append("Running VM usage "); - } else if(usageRecord.getUsageType() == UsageTypes.ALLOCATED_VM) { - builder.append("Allocated VM usage "); - } - if (vm != null) { - builder.append("for ").append(vm.getHostName()).append(" (").append(vm.getInstanceName()).append(") (").append(vm.getUuid()).append(") "); - } - if (svcOffering != null) { - builder.append("using service offering ").append(svcOffering.getName()).append(" (").append(svcOffering.getUuid()).append(") "); - } - if (template != null) { - builder.append("and template ").append(template.getName()).append(" (").append(template.getUuid()).append(")"); - } - usageRecResponse.setDescription(builder.toString()); - } - } else if (usageRecord.getUsageType() == UsageTypes.IP_ADDRESS) { - //IP Address ID - IPAddressVO ip = _entityMgr.findByIdIncludingRemoved(IPAddressVO.class, usageRecord.getUsageId().toString()); - if (ip != null) { - Long networkId = ip.getAssociatedWithNetworkId(); - if (networkId == null) { - networkId = ip.getSourceNetworkId(); - } - resourceType = ResourceObjectType.PublicIpAddress; - resourceId = ip.getId(); - usageRecResponse.setUsageId(ip.getUuid()); - } - //isSourceNAT - usageRecResponse.setSourceNat((usageRecord.getType().equals("SourceNat")) ? true : false); - //isSystem - usageRecResponse.setSystem((usageRecord.getSize() == 1) ? true : false); - } else if (usageRecord.getUsageType() == UsageTypes.NETWORK_BYTES_SENT || usageRecord.getUsageType() == UsageTypes.NETWORK_BYTES_RECEIVED) { - //Device Type - resourceType = ResourceObjectType.UserVm; - usageRecResponse.setType(usageRecord.getType()); - VMInstanceVO vm = null; - HostVO host = null; - if (usageRecord.getType().equals("DomainRouter") || usageRecord.getType().equals("UserVm")) { - //Domain Router Id - vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getUsageId().toString()); - if (vm != null) { - resourceId = vm.getId(); - usageRecResponse.setUsageId(vm.getUuid()); - } - } else { - //External Device Host Id - host = _entityMgr.findByIdIncludingRemoved(HostVO.class, usageRecord.getUsageId().toString()); - if (host != null) { - usageRecResponse.setUsageId(host.getUuid()); - } - } - //Network ID - NetworkVO network = null; - if((usageRecord.getNetworkId() != null) && (usageRecord.getNetworkId() != 0)) { - network = _entityMgr.findByIdIncludingRemoved(NetworkVO.class, usageRecord.getNetworkId().toString()); - if (network != null) { - resourceType = ResourceObjectType.Network; - if (network.getTrafficType() == TrafficType.Public) { - VirtualRouter router = ApiDBUtils.findDomainRouterById(usageRecord.getUsageId()); - Vpc vpc = ApiDBUtils.findVpcByIdIncludingRemoved(router.getVpcId()); - usageRecResponse.setVpcId(vpc.getUuid()); - resourceId = vpc.getId(); - } else { - usageRecResponse.setNetworkId(network.getUuid()); - resourceId = network.getId(); - } - usageRecResponse.setResourceName(network.getName()); - } - } - if (!oldFormat) { - final StringBuilder builder = new StringBuilder(); - if (usageRecord.getUsageType() == UsageTypes.NETWORK_BYTES_SENT) { - builder.append("Bytes sent by network "); - } else if (usageRecord.getUsageType() == UsageTypes.NETWORK_BYTES_RECEIVED) { - builder.append("Bytes received by network "); - } - if (network != null) { - if (network.getName() != null) { - builder.append(network.getName()); - } - if (network.getUuid() != null){ - builder.append(" (").append(network.getUuid()).append(") "); - } - builder.append(" " + toHumanReadableSize(usageRecord.getRawUsage().longValue()) + " "); - } - if (vm != null) { - builder.append("using router ").append(vm.getInstanceName()).append(" (").append(vm.getUuid()).append(")"); - } else if (host != null) { - builder.append("using host ").append(host.getName()).append(" (").append(host.getUuid()).append(")"); - } - usageRecResponse.setDescription(builder.toString()); - } - } else if (usageRecord.getUsageType() == UsageTypes.VM_DISK_IO_READ || usageRecord.getUsageType() == UsageTypes.VM_DISK_IO_WRITE - || usageRecord.getUsageType() == UsageTypes.VM_DISK_BYTES_READ || usageRecord.getUsageType() == UsageTypes.VM_DISK_BYTES_WRITE) { - //Device Type - usageRecResponse.setType(usageRecord.getType()); - resourceType = ResourceObjectType.Volume; - //Volume ID - VolumeVO volume = _entityMgr.findByIdIncludingRemoved(VolumeVO.class, usageRecord.getUsageId().toString()); - if (volume != null) { - usageRecResponse.setUsageId(volume.getUuid()); - resourceId = volume.getId(); - } - if (!oldFormat) { - final StringBuilder builder = new StringBuilder(); - if (usageRecord.getUsageType() == UsageTypes.VM_DISK_IO_READ) { - builder.append("Disk I/O read requests"); - } else if (usageRecord.getUsageType() == UsageTypes.VM_DISK_IO_WRITE) { - builder.append("Disk I/O write requests"); - } else if (usageRecord.getUsageType() == UsageTypes.VM_DISK_BYTES_READ) { - builder.append("Disk I/O read bytes"); - } else if (usageRecord.getUsageType() == UsageTypes.VM_DISK_BYTES_WRITE) { - builder.append("Disk I/O write bytes"); - } - if (vmInstance != null) { - builder.append(" for VM ").append(vmInstance.getHostName()).append(" (").append(vmInstance.getUuid()).append(")"); - } - if (volume != null) { - builder.append(" and volume ").append(volume.getName()).append(" (").append(volume.getUuid()).append(")"); - } - if (usageRecord.getRawUsage()!= null){ - builder.append(" " + toHumanReadableSize(usageRecord.getRawUsage().longValue())); - } - usageRecResponse.setDescription(builder.toString()); - } - } else if (usageRecord.getUsageType() == UsageTypes.VOLUME) { - //Volume ID - VolumeVO volume = _entityMgr.findByIdIncludingRemoved(VolumeVO.class, usageRecord.getUsageId().toString()); - resourceType = ResourceObjectType.Volume; - if (volume != null) { - usageRecResponse.setUsageId(volume.getUuid()); - resourceId = volume.getId(); - } - //Volume Size - usageRecResponse.setSize(usageRecord.getSize()); - //Disk Offering Id - DiskOfferingVO diskOff = null; - if (usageRecord.getOfferingId() != null) { - diskOff = _entityMgr.findByIdIncludingRemoved(DiskOfferingVO.class, usageRecord.getOfferingId().toString()); - usageRecResponse.setOfferingId(diskOff.getUuid()); - } - if (!oldFormat) { - final StringBuilder builder = new StringBuilder(); - builder.append("Volume usage "); - if (volume != null) { - builder.append("for ").append(volume.getName()).append(" (").append(volume.getUuid()).append(")"); - } - if (vmInstance != null) { - builder.append(" attached to VM ").append(vmInstance.getHostName()).append(" (").append(vmInstance.getUuid()).append(")"); - } - if (diskOff != null) { - builder.append(" with disk offering ").append(diskOff.getName()).append(" (").append(diskOff.getUuid()).append(")"); - } - if (template != null) { - builder.append(" and template ").append(template.getName()).append(" (").append(template.getUuid()).append(")"); - } - if (usageRecord.getSize() != null) { - builder.append(" and size " + toHumanReadableSize(usageRecord.getSize())); - } - usageRecResponse.setDescription(builder.toString()); - } - } else if (usageRecord.getUsageType() == UsageTypes.TEMPLATE || usageRecord.getUsageType() == UsageTypes.ISO) { - //Template/ISO ID - VMTemplateVO tmpl = _entityMgr.findByIdIncludingRemoved(VMTemplateVO.class, usageRecord.getUsageId().toString()); - if (tmpl != null) { - usageRecResponse.setUsageId(tmpl.getUuid()); - resourceId = tmpl.getId(); - } - //Template/ISO Size - usageRecResponse.setSize(usageRecord.getSize()); - if (usageRecord.getUsageType() == UsageTypes.ISO) { - usageRecResponse.setVirtualSize(usageRecord.getSize()); - resourceType = ResourceObjectType.ISO; - } else { - usageRecResponse.setVirtualSize(usageRecord.getVirtualSize()); - resourceType = ResourceObjectType.Template; - } - if (!oldFormat) { - final StringBuilder builder = new StringBuilder(); - if (usageRecord.getUsageType() == UsageTypes.TEMPLATE) { - builder.append("Template usage"); - } else if (usageRecord.getUsageType() == UsageTypes.ISO) { - builder.append("ISO usage"); - } - if (tmpl != null) { - builder.append(" for ").append(tmpl.getName()).append(" (").append(tmpl.getUuid()).append(") ") - .append("with size ").append(toHumanReadableSize(usageRecord.getSize())).append(" and virtual size ").append(toHumanReadableSize(usageRecord.getVirtualSize())); - } - usageRecResponse.setDescription(builder.toString()); - } - } else if (usageRecord.getUsageType() == UsageTypes.SNAPSHOT) { - //Snapshot ID - SnapshotVO snap = _entityMgr.findByIdIncludingRemoved(SnapshotVO.class, usageRecord.getUsageId().toString()); - resourceType = ResourceObjectType.Snapshot; - if (snap != null) { - usageRecResponse.setUsageId(snap.getUuid()); - resourceId = snap.getId(); - } - //Snapshot Size - usageRecResponse.setSize(usageRecord.getSize()); - if (!oldFormat) { - final StringBuilder builder = new StringBuilder(); - builder.append("Snapshot usage "); - if (snap != null) { - builder.append("for ").append(snap.getName()).append(" (").append(snap.getUuid()).append(") ") - .append("with size ").append(toHumanReadableSize(usageRecord.getSize())); - } - usageRecResponse.setDescription(builder.toString()); - } - } else if (usageRecord.getUsageType() == UsageTypes.LOAD_BALANCER_POLICY) { - //Load Balancer Policy ID - LoadBalancerVO lb = _entityMgr.findByIdIncludingRemoved(LoadBalancerVO.class, usageRecord.getUsageId().toString()); - resourceType = ResourceObjectType.LoadBalancer; - if (lb != null) { - usageRecResponse.setUsageId(lb.getUuid()); - resourceId = lb.getId(); - } - if (!oldFormat) { - final StringBuilder builder = new StringBuilder(); - builder.append("Loadbalancer policy usage "); - if (lb != null) { - builder.append(lb.getName()).append(" (").append(lb.getUuid()).append(")"); - } - usageRecResponse.setDescription(builder.toString()); - } - } else if (usageRecord.getUsageType() == UsageTypes.PORT_FORWARDING_RULE) { - //Port Forwarding Rule ID - PortForwardingRuleVO pf = _entityMgr.findByIdIncludingRemoved(PortForwardingRuleVO.class, usageRecord.getUsageId().toString()); - resourceType = ResourceObjectType.PortForwardingRule; - if (pf != null) { - usageRecResponse.setUsageId(pf.getUuid()); - resourceId = pf.getId(); - } - if (!oldFormat) { - final StringBuilder builder = new StringBuilder(); - builder.append("Port forwarding rule usage"); - if (pf != null) { - builder.append(" (").append(pf.getUuid()).append(")"); - } - usageRecResponse.setDescription(builder.toString()); - } - } else if (usageRecord.getUsageType() == UsageTypes.NETWORK_OFFERING) { - //Network Offering Id - NetworkOfferingVO netOff = _entityMgr.findByIdIncludingRemoved(NetworkOfferingVO.class, usageRecord.getOfferingId().toString()); - usageRecResponse.setOfferingId(netOff.getUuid()); - //is Default - usageRecResponse.setDefault(usageRecord.getUsageId() == 1); - if (!oldFormat) { - final StringBuilder builder = new StringBuilder(); - builder.append("Network offering "); - if (netOff != null) { - builder.append(netOff.getName()).append(" (").append(netOff.getUuid()).append(") usage "); - } - if (vmInstance != null) { - builder.append("for VM ").append(vmInstance.getHostName()).append(" (").append(vmInstance.getUuid()).append(") "); - } - usageRecResponse.setDescription(builder.toString()); - } - } else if (usageRecord.getUsageType() == UsageTypes.VPN_USERS) { - //VPN User ID - VpnUserVO vpnUser = _entityMgr.findByIdIncludingRemoved(VpnUserVO.class, usageRecord.getUsageId().toString()); - if (vpnUser != null) { - usageRecResponse.setUsageId(vpnUser.getUuid()); - } - if (!oldFormat) { - final StringBuilder builder = new StringBuilder(); - builder.append("VPN usage "); - if (vpnUser != null) { - builder.append("for user ").append(vpnUser.getUsername()).append(" (").append(vpnUser.getUuid()).append(")"); - } - usageRecResponse.setDescription(builder.toString()); - } - } else if (usageRecord.getUsageType() == UsageTypes.SECURITY_GROUP) { - //Security Group Id - SecurityGroupVO sg = _entityMgr.findByIdIncludingRemoved(SecurityGroupVO.class, usageRecord.getUsageId().toString()); - resourceType = ResourceObjectType.SecurityGroup; - if (sg != null) { - resourceId = sg.getId(); - usageRecResponse.setUsageId(sg.getUuid()); - } - if (!oldFormat) { - final StringBuilder builder = new StringBuilder(); - builder.append("Security group"); - if (sg != null) { - builder.append(" ").append(sg.getName()).append(" (").append(sg.getUuid()).append(") usage"); - } - if (vmInstance != null) { - builder.append(" for VM ").append(vmInstance.getHostName()).append(" (").append(vmInstance.getUuid()).append(")"); - } - usageRecResponse.setDescription(builder.toString()); - } - } else if (usageRecord.getUsageType() == UsageTypes.BACKUP) { - resourceType = ResourceObjectType.Backup; - final StringBuilder builder = new StringBuilder(); - builder.append("Backup usage"); - if (vmInstance != null) { - resourceId = vmInstance.getId(); - usageRecResponse.setResourceName(vmInstance.getInstanceName()); - usageRecResponse.setUsageId(vmInstance.getUuid()); - builder.append(" for VM ").append(vmInstance.getHostName()) - .append(" (").append(vmInstance.getUuid()).append(")"); - final BackupOffering backupOffering = backupOfferingDao.findByIdIncludingRemoved(usageRecord.getOfferingId()); - if (backupOffering != null) { - builder.append(" and backup offering ").append(backupOffering.getName()) - .append(" (").append(backupOffering.getUuid()).append(", user ad-hoc/scheduled backup allowed: ") - .append(backupOffering.isUserDrivenBackupAllowed()).append(")"); - } - } - builder.append(" with size ").append(toHumanReadableSize(usageRecord.getSize())); - builder.append(" and with virtual size ").append(toHumanReadableSize(usageRecord.getVirtualSize())); - usageRecResponse.setDescription(builder.toString()); - usageRecResponse.setSize(usageRecord.getSize()); - usageRecResponse.setVirtualSize(usageRecord.getVirtualSize()); - } else if (usageRecord.getUsageType() == UsageTypes.VM_SNAPSHOT) { - resourceType = ResourceObjectType.VMSnapshot; - VMSnapshotVO vmSnapshotVO = null; - if (usageRecord.getUsageId() != null) { - vmSnapshotVO = vmSnapshotDao.findByIdIncludingRemoved(usageRecord.getUsageId()); - if (vmSnapshotVO != null) { - resourceId = vmSnapshotVO.getId(); - usageRecResponse.setResourceName(vmSnapshotVO.getDisplayName()); - usageRecResponse.setUsageId(vmSnapshotVO.getUuid()); - } - } - usageRecResponse.setSize(usageRecord.getSize()); - if (usageRecord.getVirtualSize() != null) { - usageRecResponse.setVirtualSize(usageRecord.getVirtualSize()); - } - if (usageRecord.getOfferingId() != null) { - usageRecResponse.setOfferingId(usageRecord.getOfferingId().toString()); - } - if (!oldFormat) { - VolumeVO volume = null; - if (vmSnapshotVO == null && usageRecord.getUsageId() != null) { - volume = _entityMgr.findByIdIncludingRemoved(VolumeVO.class, usageRecord.getUsageId().toString()); - } - - DiskOfferingVO diskOff = null; - if (usageRecord.getOfferingId() != null) { - diskOff = _entityMgr.findByIdIncludingRemoved(DiskOfferingVO.class, usageRecord.getOfferingId()); - } - final StringBuilder builder = new StringBuilder(); - builder.append("VMSnapshot usage"); - if (vmSnapshotVO != null) { - builder.append(" Id: ").append(vmSnapshotVO.getUuid()); - } - if (vmInstance != null) { - builder.append(" for VM ").append(vmInstance.getHostName()).append(" (").append(vmInstance.getUuid()).append(")"); - } - if (volume != null) { - builder.append(" with volume ").append(volume.getName()).append(" (").append(volume.getUuid()).append(")"); - } - if (diskOff != null) { - builder.append(" using disk offering ").append(diskOff.getName()).append(" (").append(diskOff.getUuid()).append(")"); - } - if (usageRecord.getSize() != null){ - builder.append(" and size " + toHumanReadableSize(usageRecord.getSize())); - } - usageRecResponse.setDescription(builder.toString()); - } - } else if (usageRecord.getUsageType() == UsageTypes.VOLUME_SECONDARY) { - VolumeVO volume = _entityMgr.findByIdIncludingRemoved(VolumeVO.class, usageRecord.getUsageId().toString()); - if (!oldFormat) { - final StringBuilder builder = new StringBuilder(); - builder.append("Volume on secondary storage usage"); - if (volume != null) { - builder.append(" for ").append(volume.getName()).append(" (").append(volume.getUuid()).append(") ") - .append("with size ").append(toHumanReadableSize(usageRecord.getSize())); - } - usageRecResponse.setDescription(builder.toString()); - } - } else if (usageRecord.getUsageType() == UsageTypes.VM_SNAPSHOT_ON_PRIMARY) { - resourceType = ResourceObjectType.VMSnapshot; - VMSnapshotVO vmSnapshotVO = null; - if (usageRecord.getUsageId() != null) { - vmSnapshotVO = vmSnapshotDao.findByIdIncludingRemoved(usageRecord.getUsageId()); - if (vmSnapshotVO != null) { - resourceId = vmSnapshotVO.getId(); - usageRecResponse.setResourceName(vmSnapshotVO.getDisplayName()); - usageRecResponse.setUsageId(vmSnapshotVO.getUuid()); - } - } - usageRecResponse.setSize(usageRecord.getVirtualSize()); - if (!oldFormat) { - final StringBuilder builder = new StringBuilder(); - builder.append("VMSnapshot on primary storage usage"); - if (vmSnapshotVO != null) { - builder.append(" Id: ").append(vmSnapshotVO.getUuid()); - } - if (vmInstance != null) { - builder.append(" for VM ").append(vmInstance.getHostName()).append(" (").append(vmInstance.getUuid()).append(") ") - .append("with size ").append(toHumanReadableSize(usageRecord.getVirtualSize())); - } - usageRecResponse.setDescription(builder.toString()); - } - } else if (usageRecord.getUsageType() == UsageTypes.BUCKET) { - BucketVO bucket = _entityMgr.findByIdIncludingRemoved(BucketVO.class, usageRecord.getUsageId().toString()); - usageRecResponse.setUsageId(bucket.getUuid()); - usageRecResponse.setResourceName(bucket.getName()); - } - if(resourceTagResponseMap != null && resourceTagResponseMap.get(resourceId + ":" + resourceType) != null) { - usageRecResponse.setTags(resourceTagResponseMap.get(resourceId + ":" + resourceType)); + UsageResourceDetails resourceDetails = populateUsageTypeSpecificDetails(usageRecord, usageRecResponse, oldFormat, vmInstance, template); + if(resourceTagResponseMap != null && resourceTagResponseMap.get(resourceDetails.resourceId + ":" + resourceDetails.resourceType) != null) { + usageRecResponse.setTags(resourceTagResponseMap.get(resourceDetails.resourceId + ":" + resourceDetails.resourceType)); } if (usageRecord.getRawUsage() != null) { @@ -4654,6 +4204,566 @@ public class ApiResponseHelper implements ResponseGenerator, ResourceIdSupport { return usageRecResponse; } + private UsageResourceDetails populateUsageTypeSpecificDetails(Usage usageRecord, UsageRecordResponse usageRecResponse, boolean oldFormat, + VMInstanceVO vmInstance, VMTemplateVO template) { + if (usageRecord.getUsageType() == UsageTypes.RUNNING_VM || usageRecord.getUsageType() == UsageTypes.ALLOCATED_VM) { + return populateRunningOrAllocatedVmUsageResponse(usageRecord, usageRecResponse, oldFormat, vmInstance, template); + } else if (usageRecord.getUsageType() == UsageTypes.IP_ADDRESS) { + return populateIpAddressUsageResponse(usageRecord, usageRecResponse); + } else if (usageRecord.getUsageType() == UsageTypes.NETWORK_BYTES_SENT || usageRecord.getUsageType() == UsageTypes.NETWORK_BYTES_RECEIVED) { + return populateNetworkBytesUsageResponse(usageRecord, usageRecResponse, oldFormat); + } else if (usageRecord.getUsageType() == UsageTypes.VM_DISK_IO_READ || usageRecord.getUsageType() == UsageTypes.VM_DISK_IO_WRITE + || usageRecord.getUsageType() == UsageTypes.VM_DISK_BYTES_READ || usageRecord.getUsageType() == UsageTypes.VM_DISK_BYTES_WRITE) { + return populateVmDiskUsageResponse(usageRecord, usageRecResponse, oldFormat, vmInstance); + } else if (usageRecord.getUsageType() == UsageTypes.VOLUME) { + return populateVolumeUsageResponse(usageRecord, usageRecResponse, oldFormat, vmInstance, template); + } else if (usageRecord.getUsageType() == UsageTypes.TEMPLATE || usageRecord.getUsageType() == UsageTypes.ISO) { + return populateTemplateOrIsoUsageResponse(usageRecord, usageRecResponse, oldFormat); + } else if (usageRecord.getUsageType() == UsageTypes.SNAPSHOT) { + return populateSnapshotUsageResponse(usageRecord, usageRecResponse, oldFormat); + } else if (usageRecord.getUsageType() == UsageTypes.LOAD_BALANCER_POLICY) { + return populateLoadBalancerPolicyUsageResponse(usageRecord, usageRecResponse, oldFormat); + } else if (usageRecord.getUsageType() == UsageTypes.PORT_FORWARDING_RULE) { + return populatePortForwardingRuleUsageResponse(usageRecord, usageRecResponse, oldFormat); + } else if (usageRecord.getUsageType() == UsageTypes.NETWORK_OFFERING) { + return populateNetworkOfferingUsageResponse(usageRecord, usageRecResponse, oldFormat, vmInstance); + } else if (usageRecord.getUsageType() == UsageTypes.VPN_USERS) { + return populateVpnUsersUsageResponse(usageRecord, usageRecResponse, oldFormat); + } else if (usageRecord.getUsageType() == UsageTypes.SECURITY_GROUP) { + return populateSecurityGroupUsageResponse(usageRecord, usageRecResponse, oldFormat, vmInstance); + } else if (usageRecord.getUsageType() == UsageTypes.BACKUP) { + return populateBackupUsageResponse(usageRecord, usageRecResponse, vmInstance); + } else if (usageRecord.getUsageType() == UsageTypes.VM_SNAPSHOT) { + return populateVmSnapshotUsageResponse(usageRecord, usageRecResponse, oldFormat, vmInstance); + } else if (usageRecord.getUsageType() == UsageTypes.VOLUME_SECONDARY) { + return populateVolumeSecondaryUsageResponse(usageRecord, usageRecResponse, oldFormat); + } else if (usageRecord.getUsageType() == UsageTypes.VM_SNAPSHOT_ON_PRIMARY) { + return populateVmSnapshotOnPrimaryUsageResponse(usageRecord, usageRecResponse, oldFormat, vmInstance); + } else if (usageRecord.getUsageType() == UsageTypes.BUCKET) { + return populateBucketUsageResponse(usageRecord, usageRecResponse); + } + + return new UsageResourceDetails(); + } + + private UsageResourceDetails populateRunningOrAllocatedVmUsageResponse(Usage usageRecord, UsageRecordResponse usageRecResponse, boolean oldFormat, + VMInstanceVO vmInstance, VMTemplateVO template) { + UsageResourceDetails resourceDetails = new UsageResourceDetails(); + ServiceOfferingVO svcOffering = _entityMgr.findByIdIncludingRemoved(ServiceOfferingVO.class, usageRecord.getOfferingId().toString()); + //Service Offering Id + if(svcOffering != null) { + usageRecResponse.setOfferingId(svcOffering.getUuid()); + } + //VM Instance ID + VMInstanceVO vm = null; + if (usageRecord.getUsageId() != null && usageRecord.getUsageId().equals(usageRecord.getVmInstanceId())) { + vm = vmInstance; + } else { + vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getUsageId().toString()); + } + if (vm != null) { + resourceDetails.resourceType = ResourceTag.ResourceObjectType.UserVm; + usageRecResponse.setUsageId(vm.getUuid()); + resourceDetails.resourceId = vm.getId(); + final GuestOS guestOS = _guestOsDao.findById(vm.getGuestOSId()); + if (guestOS != null) { + usageRecResponse.setOsTypeId(guestOS.getUuid()); + usageRecResponse.setOsDisplayName(guestOS.getDisplayName()); + final GuestOsCategory guestOsCategory = _guestOsCategoryDao.findById(guestOS.getCategoryId()); + if (guestOsCategory != null) { + usageRecResponse.setOsCategoryId(guestOsCategory.getUuid()); + usageRecResponse.setOsCategoryName(guestOsCategory.getName()); + } + } + } + //Hypervisor Type + usageRecResponse.setType(usageRecord.getType()); + //Dynamic compute offerings details + if(usageRecord.getCpuCores() != null) { + usageRecResponse.setCpuNumber(usageRecord.getCpuCores()); + } else if (svcOffering.getCpu() != null){ + usageRecResponse.setCpuNumber(svcOffering.getCpu().longValue()); + } + if(usageRecord.getCpuSpeed() != null) { + usageRecResponse.setCpuSpeed(usageRecord.getCpuSpeed()); + } else if(svcOffering.getSpeed() != null){ + usageRecResponse.setCpuSpeed(svcOffering.getSpeed().longValue()); + } + if(usageRecord.getMemory() != null) { + usageRecResponse.setMemory(usageRecord.getMemory()); + } else if(svcOffering.getRamSize() != null) { + usageRecResponse.setMemory(svcOffering.getRamSize().longValue()); + } + if (!oldFormat) { + final StringBuilder builder = new StringBuilder(); + if (usageRecord.getUsageType() == UsageTypes.RUNNING_VM) { + builder.append("Running VM usage "); + } else if(usageRecord.getUsageType() == UsageTypes.ALLOCATED_VM) { + builder.append("Allocated VM usage "); + } + if (vm != null) { + builder.append("for ").append(vm.getHostName()).append(" (").append(vm.getInstanceName()).append(") (").append(vm.getUuid()).append(") "); + } + if (svcOffering != null) { + builder.append("using service offering ").append(svcOffering.getName()).append(" (").append(svcOffering.getUuid()).append(") "); + } + if (template != null) { + builder.append("and template ").append(template.getName()).append(" (").append(template.getUuid()).append(")"); + } + usageRecResponse.setDescription(builder.toString()); + } + return resourceDetails; + } + + private UsageResourceDetails populateIpAddressUsageResponse(Usage usageRecord, UsageRecordResponse usageRecResponse) { + UsageResourceDetails resourceDetails = new UsageResourceDetails(); + //IP Address ID + IPAddressVO ip = _entityMgr.findByIdIncludingRemoved(IPAddressVO.class, usageRecord.getUsageId().toString()); + if (ip != null) { + Long networkId = ip.getAssociatedWithNetworkId(); + if (networkId == null) { + networkId = ip.getSourceNetworkId(); + } + resourceDetails.resourceType = ResourceObjectType.PublicIpAddress; + resourceDetails.resourceId = ip.getId(); + usageRecResponse.setUsageId(ip.getUuid()); + } + //isSourceNAT + usageRecResponse.setSourceNat((usageRecord.getType().equals("SourceNat")) ? true : false); + //isSystem + usageRecResponse.setSystem((usageRecord.getSize() == 1) ? true : false); + return resourceDetails; + } + + private UsageResourceDetails populateNetworkBytesUsageResponse(Usage usageRecord, UsageRecordResponse usageRecResponse, boolean oldFormat) { + UsageResourceDetails resourceDetails = new UsageResourceDetails(); + //Device Type + resourceDetails.resourceType = ResourceObjectType.UserVm; + usageRecResponse.setType(usageRecord.getType()); + VMInstanceVO vm = null; + HostVO host = null; + if (usageRecord.getType().equals("DomainRouter") || usageRecord.getType().equals("UserVm")) { + //Domain Router Id + vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getUsageId().toString()); + if (vm != null) { + resourceDetails.resourceId = vm.getId(); + usageRecResponse.setUsageId(vm.getUuid()); + } + } else { + //External Device Host Id + host = _entityMgr.findByIdIncludingRemoved(HostVO.class, usageRecord.getUsageId().toString()); + if (host != null) { + usageRecResponse.setUsageId(host.getUuid()); + } + } + //Network ID + NetworkVO network = null; + if((usageRecord.getNetworkId() != null) && (usageRecord.getNetworkId() != 0)) { + network = _entityMgr.findByIdIncludingRemoved(NetworkVO.class, usageRecord.getNetworkId().toString()); + if (network != null) { + resourceDetails.resourceType = ResourceObjectType.Network; + if (network.getTrafficType() == TrafficType.Public) { + VirtualRouter router = ApiDBUtils.findDomainRouterById(usageRecord.getUsageId()); + Vpc vpc = ApiDBUtils.findVpcByIdIncludingRemoved(router.getVpcId()); + usageRecResponse.setVpcId(vpc.getUuid()); + resourceDetails.resourceId = vpc.getId(); + } else { + usageRecResponse.setNetworkId(network.getUuid()); + resourceDetails.resourceId = network.getId(); + } + usageRecResponse.setResourceName(network.getName()); + } + } + if (!oldFormat) { + final StringBuilder builder = new StringBuilder(); + if (usageRecord.getUsageType() == UsageTypes.NETWORK_BYTES_SENT) { + builder.append("Bytes sent by network "); + } else if (usageRecord.getUsageType() == UsageTypes.NETWORK_BYTES_RECEIVED) { + builder.append("Bytes received by network "); + } + if (network != null) { + if (network.getName() != null) { + builder.append(network.getName()); + } + if (network.getUuid() != null){ + builder.append(" (").append(network.getUuid()).append(") "); + } + builder.append(" " + toHumanReadableSize(usageRecord.getRawUsage().longValue()) + " "); + } + if (vm != null) { + builder.append("using router ").append(vm.getInstanceName()).append(" (").append(vm.getUuid()).append(")"); + } else if (host != null) { + builder.append("using host ").append(host.getName()).append(" (").append(host.getUuid()).append(")"); + } + usageRecResponse.setDescription(builder.toString()); + } + return resourceDetails; + } + + private UsageResourceDetails populateVmDiskUsageResponse(Usage usageRecord, UsageRecordResponse usageRecResponse, boolean oldFormat, VMInstanceVO vmInstance) { + UsageResourceDetails resourceDetails = new UsageResourceDetails(); + //Device Type + usageRecResponse.setType(usageRecord.getType()); + resourceDetails.resourceType = ResourceObjectType.Volume; + //Volume ID + VolumeVO volume = _entityMgr.findByIdIncludingRemoved(VolumeVO.class, usageRecord.getUsageId().toString()); + if (volume != null) { + usageRecResponse.setUsageId(volume.getUuid()); + resourceDetails.resourceId = volume.getId(); + } + if (!oldFormat) { + final StringBuilder builder = new StringBuilder(); + if (usageRecord.getUsageType() == UsageTypes.VM_DISK_IO_READ) { + builder.append("Disk I/O read requests"); + } else if (usageRecord.getUsageType() == UsageTypes.VM_DISK_IO_WRITE) { + builder.append("Disk I/O write requests"); + } else if (usageRecord.getUsageType() == UsageTypes.VM_DISK_BYTES_READ) { + builder.append("Disk I/O read bytes"); + } else if (usageRecord.getUsageType() == UsageTypes.VM_DISK_BYTES_WRITE) { + builder.append("Disk I/O write bytes"); + } + if (vmInstance != null) { + builder.append(" for VM ").append(vmInstance.getHostName()).append(" (").append(vmInstance.getUuid()).append(")"); + } + if (volume != null) { + builder.append(" and volume ").append(volume.getName()).append(" (").append(volume.getUuid()).append(")"); + } + if (usageRecord.getRawUsage()!= null){ + builder.append(" " + toHumanReadableSize(usageRecord.getRawUsage().longValue())); + } + usageRecResponse.setDescription(builder.toString()); + } + return resourceDetails; + } + + private UsageResourceDetails populateVolumeUsageResponse(Usage usageRecord, UsageRecordResponse usageRecResponse, boolean oldFormat, + VMInstanceVO vmInstance, VMTemplateVO template) { + UsageResourceDetails resourceDetails = new UsageResourceDetails(); + //Volume ID + VolumeVO volume = _entityMgr.findByIdIncludingRemoved(VolumeVO.class, usageRecord.getUsageId().toString()); + resourceDetails.resourceType = ResourceObjectType.Volume; + if (volume != null) { + usageRecResponse.setUsageId(volume.getUuid()); + resourceDetails.resourceId = volume.getId(); + } + //Volume Size + usageRecResponse.setSize(usageRecord.getSize()); + //Disk Offering Id + DiskOfferingVO diskOff = null; + if (usageRecord.getOfferingId() != null) { + diskOff = _entityMgr.findByIdIncludingRemoved(DiskOfferingVO.class, usageRecord.getOfferingId().toString()); + usageRecResponse.setOfferingId(diskOff.getUuid()); + } + if (!oldFormat) { + final StringBuilder builder = new StringBuilder(); + builder.append("Volume usage "); + if (volume != null) { + builder.append("for ").append(volume.getName()).append(" (").append(volume.getUuid()).append(")"); + } + if (vmInstance != null) { + builder.append(" attached to VM ").append(vmInstance.getHostName()).append(" (").append(vmInstance.getUuid()).append(")"); + } + if (diskOff != null) { + builder.append(" with disk offering ").append(diskOff.getName()).append(" (").append(diskOff.getUuid()).append(")"); + } + if (template != null) { + builder.append(" and template ").append(template.getName()).append(" (").append(template.getUuid()).append(")"); + } + if (usageRecord.getSize() != null) { + builder.append(" and size " + toHumanReadableSize(usageRecord.getSize())); + } + usageRecResponse.setDescription(builder.toString()); + } + return resourceDetails; + } + + private UsageResourceDetails populateTemplateOrIsoUsageResponse(Usage usageRecord, UsageRecordResponse usageRecResponse, boolean oldFormat) { + UsageResourceDetails resourceDetails = new UsageResourceDetails(); + //Template/ISO ID + VMTemplateVO tmpl = _entityMgr.findByIdIncludingRemoved(VMTemplateVO.class, usageRecord.getUsageId().toString()); + if (tmpl != null) { + usageRecResponse.setUsageId(tmpl.getUuid()); + resourceDetails.resourceId = tmpl.getId(); + } + //Template/ISO Size + usageRecResponse.setSize(usageRecord.getSize()); + if (usageRecord.getUsageType() == UsageTypes.ISO) { + usageRecResponse.setVirtualSize(usageRecord.getSize()); + resourceDetails.resourceType = ResourceObjectType.ISO; + } else { + usageRecResponse.setVirtualSize(usageRecord.getVirtualSize()); + resourceDetails.resourceType = ResourceObjectType.Template; + } + if (!oldFormat) { + final StringBuilder builder = new StringBuilder(); + if (usageRecord.getUsageType() == UsageTypes.TEMPLATE) { + builder.append("Template usage"); + } else if (usageRecord.getUsageType() == UsageTypes.ISO) { + builder.append("ISO usage"); + } + if (tmpl != null) { + builder.append(" for ").append(tmpl.getName()).append(" (").append(tmpl.getUuid()).append(") ") + .append("with size ").append(toHumanReadableSize(usageRecord.getSize())).append(" and virtual size ").append(toHumanReadableSize(usageRecord.getVirtualSize())); + } + usageRecResponse.setDescription(builder.toString()); + } + return resourceDetails; + } + + private UsageResourceDetails populateSnapshotUsageResponse(Usage usageRecord, UsageRecordResponse usageRecResponse, boolean oldFormat) { + UsageResourceDetails resourceDetails = new UsageResourceDetails(); + //Snapshot ID + SnapshotVO snap = _entityMgr.findByIdIncludingRemoved(SnapshotVO.class, usageRecord.getUsageId().toString()); + resourceDetails.resourceType = ResourceObjectType.Snapshot; + if (snap != null) { + usageRecResponse.setUsageId(snap.getUuid()); + resourceDetails.resourceId = snap.getId(); + } + //Snapshot Size + usageRecResponse.setSize(usageRecord.getSize()); + if (!oldFormat) { + final StringBuilder builder = new StringBuilder(); + builder.append("Snapshot usage "); + if (snap != null) { + builder.append("for ").append(snap.getName()).append(" (").append(snap.getUuid()).append(") ") + .append("with size ").append(toHumanReadableSize(usageRecord.getSize())); + } + usageRecResponse.setDescription(builder.toString()); + } + return resourceDetails; + } + + private UsageResourceDetails populateLoadBalancerPolicyUsageResponse(Usage usageRecord, UsageRecordResponse usageRecResponse, boolean oldFormat) { + UsageResourceDetails resourceDetails = new UsageResourceDetails(); + //Load Balancer Policy ID + LoadBalancerVO lb = _entityMgr.findByIdIncludingRemoved(LoadBalancerVO.class, usageRecord.getUsageId().toString()); + resourceDetails.resourceType = ResourceObjectType.LoadBalancer; + if (lb != null) { + usageRecResponse.setUsageId(lb.getUuid()); + resourceDetails.resourceId = lb.getId(); + } + if (!oldFormat) { + final StringBuilder builder = new StringBuilder(); + builder.append("Loadbalancer policy usage "); + if (lb != null) { + builder.append(lb.getName()).append(" (").append(lb.getUuid()).append(")"); + } + usageRecResponse.setDescription(builder.toString()); + } + return resourceDetails; + } + + private UsageResourceDetails populatePortForwardingRuleUsageResponse(Usage usageRecord, UsageRecordResponse usageRecResponse, boolean oldFormat) { + UsageResourceDetails resourceDetails = new UsageResourceDetails(); + //Port Forwarding Rule ID + PortForwardingRuleVO pf = _entityMgr.findByIdIncludingRemoved(PortForwardingRuleVO.class, usageRecord.getUsageId().toString()); + resourceDetails.resourceType = ResourceObjectType.PortForwardingRule; + if (pf != null) { + usageRecResponse.setUsageId(pf.getUuid()); + resourceDetails.resourceId = pf.getId(); + } + if (!oldFormat) { + final StringBuilder builder = new StringBuilder(); + builder.append("Port forwarding rule usage"); + if (pf != null) { + builder.append(" (").append(pf.getUuid()).append(")"); + } + usageRecResponse.setDescription(builder.toString()); + } + return resourceDetails; + } + + private UsageResourceDetails populateNetworkOfferingUsageResponse(Usage usageRecord, UsageRecordResponse usageRecResponse, boolean oldFormat, VMInstanceVO vmInstance) { + //Network Offering Id + NetworkOfferingVO netOff = _entityMgr.findByIdIncludingRemoved(NetworkOfferingVO.class, usageRecord.getOfferingId().toString()); + usageRecResponse.setOfferingId(netOff.getUuid()); + //is Default + usageRecResponse.setDefault(usageRecord.getUsageId() == 1); + if (!oldFormat) { + final StringBuilder builder = new StringBuilder(); + builder.append("Network offering "); + if (netOff != null) { + builder.append(netOff.getName()).append(" (").append(netOff.getUuid()).append(") usage "); + } + if (vmInstance != null) { + builder.append("for VM ").append(vmInstance.getHostName()).append(" (").append(vmInstance.getUuid()).append(") "); + } + usageRecResponse.setDescription(builder.toString()); + } + return new UsageResourceDetails(); + } + + private UsageResourceDetails populateVpnUsersUsageResponse(Usage usageRecord, UsageRecordResponse usageRecResponse, boolean oldFormat) { + //VPN User ID + VpnUserVO vpnUser = _entityMgr.findByIdIncludingRemoved(VpnUserVO.class, usageRecord.getUsageId().toString()); + if (vpnUser != null) { + usageRecResponse.setUsageId(vpnUser.getUuid()); + } + if (!oldFormat) { + final StringBuilder builder = new StringBuilder(); + builder.append("VPN usage "); + if (vpnUser != null) { + builder.append("for user ").append(vpnUser.getUsername()).append(" (").append(vpnUser.getUuid()).append(")"); + } + usageRecResponse.setDescription(builder.toString()); + } + return new UsageResourceDetails(); + } + + private UsageResourceDetails populateSecurityGroupUsageResponse(Usage usageRecord, UsageRecordResponse usageRecResponse, boolean oldFormat, VMInstanceVO vmInstance) { + UsageResourceDetails resourceDetails = new UsageResourceDetails(); + //Security Group Id + SecurityGroupVO sg = _entityMgr.findByIdIncludingRemoved(SecurityGroupVO.class, usageRecord.getUsageId().toString()); + resourceDetails.resourceType = ResourceObjectType.SecurityGroup; + if (sg != null) { + resourceDetails.resourceId = sg.getId(); + usageRecResponse.setUsageId(sg.getUuid()); + } + if (!oldFormat) { + final StringBuilder builder = new StringBuilder(); + builder.append("Security group"); + if (sg != null) { + builder.append(" ").append(sg.getName()).append(" (").append(sg.getUuid()).append(") usage"); + } + if (vmInstance != null) { + builder.append(" for VM ").append(vmInstance.getHostName()).append(" (").append(vmInstance.getUuid()).append(")"); + } + usageRecResponse.setDescription(builder.toString()); + } + return resourceDetails; + } + + private UsageResourceDetails populateBackupUsageResponse(Usage usageRecord, UsageRecordResponse usageRecResponse, VMInstanceVO vmInstance) { + UsageResourceDetails resourceDetails = new UsageResourceDetails(); + resourceDetails.resourceType = ResourceObjectType.Backup; + final StringBuilder builder = new StringBuilder(); + builder.append("Backup usage"); + if (vmInstance != null) { + resourceDetails.resourceId = vmInstance.getId(); + usageRecResponse.setResourceName(vmInstance.getInstanceName()); + usageRecResponse.setUsageId(vmInstance.getUuid()); + builder.append(" for VM ").append(vmInstance.getHostName()) + .append(" (").append(vmInstance.getUuid()).append(")"); + final BackupOffering backupOffering = backupOfferingDao.findByIdIncludingRemoved(usageRecord.getOfferingId()); + if (backupOffering != null) { + builder.append(" and backup offering ").append(backupOffering.getName()) + .append(" (").append(backupOffering.getUuid()).append(", user ad-hoc/scheduled backup allowed: ") + .append(backupOffering.isUserDrivenBackupAllowed()).append(")"); + } + } + builder.append(" with size ").append(toHumanReadableSize(usageRecord.getSize())); + builder.append(" and with virtual size ").append(toHumanReadableSize(usageRecord.getVirtualSize())); + usageRecResponse.setDescription(builder.toString()); + usageRecResponse.setSize(usageRecord.getSize()); + usageRecResponse.setVirtualSize(usageRecord.getVirtualSize()); + return resourceDetails; + } + + private UsageResourceDetails populateVmSnapshotUsageResponse(Usage usageRecord, UsageRecordResponse usageRecResponse, boolean oldFormat, VMInstanceVO vmInstance) { + UsageResourceDetails resourceDetails = new UsageResourceDetails(); + resourceDetails.resourceType = ResourceObjectType.VMSnapshot; + VMSnapshotVO vmSnapshotVO = null; + if (usageRecord.getUsageId() != null) { + vmSnapshotVO = vmSnapshotDao.findByIdIncludingRemoved(usageRecord.getUsageId()); + if (vmSnapshotVO != null) { + resourceDetails.resourceId = vmSnapshotVO.getId(); + usageRecResponse.setResourceName(vmSnapshotVO.getDisplayName()); + usageRecResponse.setUsageId(vmSnapshotVO.getUuid()); + } + } + usageRecResponse.setSize(usageRecord.getSize()); + if (usageRecord.getVirtualSize() != null) { + usageRecResponse.setVirtualSize(usageRecord.getVirtualSize()); + } + if (usageRecord.getOfferingId() != null) { + usageRecResponse.setOfferingId(usageRecord.getOfferingId().toString()); + } + if (!oldFormat) { + VolumeVO volume = null; + if (vmSnapshotVO == null && usageRecord.getUsageId() != null) { + volume = _entityMgr.findByIdIncludingRemoved(VolumeVO.class, usageRecord.getUsageId().toString()); + } + + DiskOfferingVO diskOff = null; + if (usageRecord.getOfferingId() != null) { + diskOff = _entityMgr.findByIdIncludingRemoved(DiskOfferingVO.class, usageRecord.getOfferingId()); + } + final StringBuilder builder = new StringBuilder(); + builder.append("VMSnapshot usage"); + if (vmSnapshotVO != null) { + builder.append(" Id: ").append(vmSnapshotVO.getUuid()); + } + if (vmInstance != null) { + builder.append(" for VM ").append(vmInstance.getHostName()).append(" (").append(vmInstance.getUuid()).append(")"); + } + if (volume != null) { + builder.append(" with volume ").append(volume.getName()).append(" (").append(volume.getUuid()).append(")"); + } + if (diskOff != null) { + builder.append(" using disk offering ").append(diskOff.getName()).append(" (").append(diskOff.getUuid()).append(")"); + } + if (usageRecord.getSize() != null){ + builder.append(" and size " + toHumanReadableSize(usageRecord.getSize())); + } + usageRecResponse.setDescription(builder.toString()); + } + return resourceDetails; + } + + private UsageResourceDetails populateVolumeSecondaryUsageResponse(Usage usageRecord, UsageRecordResponse usageRecResponse, boolean oldFormat) { + VolumeVO volume = _entityMgr.findByIdIncludingRemoved(VolumeVO.class, usageRecord.getUsageId().toString()); + if (!oldFormat) { + final StringBuilder builder = new StringBuilder(); + builder.append("Volume on secondary storage usage"); + if (volume != null) { + builder.append(" for ").append(volume.getName()).append(" (").append(volume.getUuid()).append(") ") + .append("with size ").append(toHumanReadableSize(usageRecord.getSize())); + } + usageRecResponse.setDescription(builder.toString()); + } + return new UsageResourceDetails(); + } + + private UsageResourceDetails populateVmSnapshotOnPrimaryUsageResponse(Usage usageRecord, UsageRecordResponse usageRecResponse, boolean oldFormat, VMInstanceVO vmInstance) { + UsageResourceDetails resourceDetails = new UsageResourceDetails(); + resourceDetails.resourceType = ResourceObjectType.VMSnapshot; + VMSnapshotVO vmSnapshotVO = null; + if (usageRecord.getUsageId() != null) { + vmSnapshotVO = vmSnapshotDao.findByIdIncludingRemoved(usageRecord.getUsageId()); + if (vmSnapshotVO != null) { + resourceDetails.resourceId = vmSnapshotVO.getId(); + usageRecResponse.setResourceName(vmSnapshotVO.getDisplayName()); + usageRecResponse.setUsageId(vmSnapshotVO.getUuid()); + } + } + usageRecResponse.setSize(usageRecord.getVirtualSize()); + if (!oldFormat) { + final StringBuilder builder = new StringBuilder(); + builder.append("VMSnapshot on primary storage usage"); + if (vmSnapshotVO != null) { + builder.append(" Id: ").append(vmSnapshotVO.getUuid()); + } + if (vmInstance != null) { + builder.append(" for VM ").append(vmInstance.getHostName()).append(" (").append(vmInstance.getUuid()).append(") ") + .append("with size ").append(toHumanReadableSize(usageRecord.getVirtualSize())); + } + usageRecResponse.setDescription(builder.toString()); + } + return resourceDetails; + } + + private UsageResourceDetails populateBucketUsageResponse(Usage usageRecord, UsageRecordResponse usageRecResponse) { + BucketVO bucket = _entityMgr.findByIdIncludingRemoved(BucketVO.class, usageRecord.getUsageId().toString()); + usageRecResponse.setUsageId(bucket.getUuid()); + usageRecResponse.setResourceName(bucket.getName()); + return new UsageResourceDetails(); + } + + private static class UsageResourceDetails { + private ResourceObjectType resourceType; + private Long resourceId; + } + public String getDateStringInternal(Date inputDate) { if (inputDate == null) { return null;