H Hiroki, those calls are for ServiceOfferingVO not for VMInstanceVO. So they are not the same issue but that doesn't mean that we shouldn't those the be counted when deleted either.
On Thu, May 29, 2014 at 12:11 PM, Hiroki Ohashi <hiroki.s...@gmail.com> wrote: > Hi Daan, Rajani > > I looked at a code of master and 4.4 branch. findById is used at line > 3031 of master branch and line 3299 of 4.4 branch, so I think this > leads to an same problem. > > The code snippets of master and 4.4 branch are below. > > [master] server/src/com/cloud/api/ApiResponseHelper.java > > 2987 @Override > 2988 public UsageRecordResponse createUsageResponse(Usage usageRecord) > { > 2989 UsageRecordResponse usageRecResponse = new > UsageRecordResponse(); > 2990 > 2991 Account account = > ApiDBUtils.findAccountById(usageRecord.getAccountId()); > 2992 if (account.getType() == Account.ACCOUNT_TYPE_PROJECT) { > 2993 //find the project > 2994 Project project = > ApiDBUtils.findProjectByProjectAccountId(account.getId()); > 2995 usageRecResponse.setProjectId(project.getUuid()); > 2996 usageRecResponse.setProjectName(project.getName()); > 2997 } else { > 2998 usageRecResponse.setAccountId(account.getUuid()); > 2999 usageRecResponse.setAccountName(account.getAccountName()); > 3000 } > 3001 > 3002 Domain domain = > ApiDBUtils.findDomainById(usageRecord.getDomainId()); > 3003 if (domain != null) { > 3004 usageRecResponse.setDomainId(domain.getUuid()); > 3005 } > 3006 > 3007 if (usageRecord.getZoneId() != null) { > 3008 DataCenter zone = > ApiDBUtils.findZoneById(usageRecord.getZoneId()); > 3009 if (zone != null) { > 3010 usageRecResponse.setZoneId(zone.getUuid()); > 3011 } > 3012 } > 3013 usageRecResponse.setDescription(usageRecord.getDescription()); > 3014 usageRecResponse.setUsage(usageRecord.getUsageDisplay()); > 3015 usageRecResponse.setUsageType(usageRecord.getUsageType()); > 3016 if (usageRecord.getVmInstanceId() != null) { > 3017 VMInstanceVO vm = > _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, > usageRecord.getVmInstanceId()); > 3018 if (vm != null) { > 3019 usageRecResponse.setVirtualMachineId(vm.getUuid()); > 3020 } > 3021 } > 3022 usageRecResponse.setVmName(usageRecord.getVmName()); > 3023 if (usageRecord.getTemplateId() != null) { > 3024 VMTemplateVO template = > ApiDBUtils.findTemplateById(usageRecord.getTemplateId()); > 3025 if (template != null) { > 3026 usageRecResponse.setTemplateId(template.getUuid()); > 3027 } > 3028 } > 3029 > 3030 if (usageRecord.getUsageType() == > UsageTypes.RUNNING_VM || usageRecord.getUsageType() == > UsageTypes.ALLOCATED_VM) { > 3031 ServiceOfferingVO svcOffering = > _entityMgr.findById(ServiceOfferingVO.class, > usageRecord.getOfferingId().toString()); > 3032 //Service Offering Id > 3033 usageRecResponse.setOfferingId(svcOffering.getUuid()); > 3034 //VM Instance ID > 3035 VMInstanceVO vm = > _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, > usageRecord.getUsageId().toString()); > 3036 if (vm != null) { > 3037 usageRecResponse.setUsageId(vm.getUuid()); > 3038 } > 3039 //Hypervisor Type > 3040 usageRecResponse.setType(usageRecord.getType()); > 3041 > > [ACS 4.4] server/src/com/cloud/api/ApiResponseHelper.java > > 3255 @Override > 3256 public UsageRecordResponse createUsageResponse(Usage usageRecord) > { > 3257 UsageRecordResponse usageRecResponse = new > UsageRecordResponse(); > 3258 > 3259 Account account = > ApiDBUtils.findAccountById(usageRecord.getAccountId()); > 3260 if (account.getType() == Account.ACCOUNT_TYPE_PROJECT) { > 3261 //find the project > 3262 Project project = > ApiDBUtils.findProjectByProjectAccountId(account.getId()); > 3263 usageRecResponse.setProjectId(project.getUuid()); > 3264 usageRecResponse.setProjectName(project.getName()); > 3265 } else { > 3266 usageRecResponse.setAccountId(account.getUuid()); > 3267 usageRecResponse.setAccountName(account.getAccountName()); > 3268 } > 3269 > 3270 Domain domain = > ApiDBUtils.findDomainById(usageRecord.getDomainId()); > 3271 if (domain != null) { > 3272 usageRecResponse.setDomainId(domain.getUuid()); > 3273 } > 3274 > 3275 if (usageRecord.getZoneId() != null) { > 3276 DataCenter zone = > ApiDBUtils.findZoneById(usageRecord.getZoneId()); > 3277 if (zone != null) { > 3278 usageRecResponse.setZoneId(zone.getUuid()); > 3279 } > 3280 } > 3281 usageRecResponse.setDescription(usageRecord.getDescription()); > 3282 usageRecResponse.setUsage(usageRecord.getUsageDisplay()); > 3283 usageRecResponse.setUsageType(usageRecord.getUsageType()); > 3284 if (usageRecord.getVmInstanceId() != null) { > 3285 VMInstanceVO vm = > _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, > usageRecord.getVmInstanceId()); > 3286 if (vm != null) { > 3287 usageRecResponse.setVirtualMachineId(vm.getUuid()); > 3288 } > 3289 } > 3290 usageRecResponse.setVmName(usageRecord.getVmName()); > 3291 if (usageRecord.getTemplateId() != null) { > 3292 VMTemplateVO template = > ApiDBUtils.findTemplateById(usageRecord.getTemplateId()); > 3293 if (template != null) { > 3294 usageRecResponse.setTemplateId(template.getUuid()); > 3295 } > 3296 } > 3297 > 3298 if (usageRecord.getUsageType() == > UsageTypes.RUNNING_VM || usageRecord.getUsageType() == > UsageTypes.ALLOCATED_VM) { > 3299 ServiceOfferingVO svcOffering = > _entityMgr.findById(ServiceOfferingVO.class, > usageRecord.getOfferingId().toString()); > 3300 //Service Offering Id > 3301 usageRecResponse.setOfferingId(svcOffering.getUuid()); > 3302 //VM Instance ID > 3303 VMInstanceVO vm = > _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, > usageRecord.getUsageId().toString()); > 3304 if (vm != null) { > 3305 usageRecResponse.setUsageId(vm.getUuid()); > 3306 } > 3307 //Hypervisor Type > 3308 usageRecResponse.setType(usageRecord.getType()); > 3309 > > In addition to this, I'm not sure whether findAccountById, > findProjectByProjectAccountId, findDomainById, findZoneById and > findTemplateById work correctly when resources are destroyed. Does > anyone know these methods are OK? > > > 2014-05-29 18:25 GMT+09:00 sebgoa <run...@gmail.com>: >> >> On May 29, 2014, at 11:20 AM, Rajani Karuturi <rajani.karut...@citrix.com> >> wrote: >> >>> The fix is already in 4.4 >>> >>> commit 3a3457e7132d22f52aa38179d40a6eb9b0b29677 >>> Author: Sam Schmit <sam.sch...@appcore.com> >>> AuthorDate: Fri May 2 13:07:34 2014 -0500 >>> Commit: Daan Hoogland <d...@onecht.net> >>> CommitDate: Tue May 6 17:46:20 2014 +0200 >>> >>> CLOUDSTACK-6472 listUsageRecords: Pull information from removed items as >>> well, fixing NPEs/Null UUIDs with usage API calls. >>> >>> M server/src/com/cloud/api/ApiResponseHelper.java >>> >> >> still need to check if this fix in 4.4 is complete. Hiroki's change was to >> 4.3 branch. I did not check 4.4. >> >>> >>> @sebgoa >>> i think it would be better to include bug id in the commit messages as >>> thats the only way to track all the commits for a defect. >>> >> >> yes my bad, did not take time to look up the bug id. >> >>> >>> ~Rajani >>> >>> >>> >>> On 29-May-2014, at 2:25 pm, Daan Hoogland <daan.hoogl...@gmail.com> wrote: >>> >>>> Hiroki, >>>> >>>> Did you have a look at 4.4 or master as well? tell us when it works, >>>> so we can cherry-pick the fix to later versions. >>>> >>>> On Thu, May 29, 2014 at 10:25 AM, Hiroki Ohashi <hiroki.s...@gmail.com> >>>> wrote: >>>>> sebgoa >>>>> >>>>> >>>>> 2014-05-29 16:52 GMT+09:00 sebgoa <run...@gmail.com>: >>>>>> >>>>>> On May 29, 2014, at 9:26 AM, Hiroki Ohashi <hiroki.s...@gmail.com> wrote: >>>>>> >>>>>>> Dear guys >>>>>>> >>>>>>> I found a bug about listUsageRecords API in 4.3 related to a issue >>>>>>> CLOUDSTACK-6472 and made a patch. Would you review the patch and >>>>>>> correct me if I am wrong? >>>>>>> >>>>>>> Sam Schmit push a commit about NPEs/Null UUIDs at May 5th but I think >>>>>>> his commit is not enough. >>>>>>> >>>>>>> commit e8047e11db7ef2bdc44bbedfdc47e63c55f080c5 >>>>>>> Author: Sam Schmit <sam.sch...@appcore.com> >>>>>>> Date: Mon May 5 16:38:23 2014 -0500 >>>>>>> >>>>>>> CLOUDSTACK-6472 (4.3 specific) listUsageRecords: Pull >>>>>>> information from removed items as well, fixing NPEs/Null UUIDs with >>>>>>> usage API calls. >>>>>>> >>>>>>> Signed-off-by: Sebastien Goasguen <run...@gmail.com> >>>>>>> >>>>>>> When I called listUsageRecords against CloudStack 4.3 management >>>>>>> server that was build at latest 4.3 branch, usage records about >>>>>>> destroyed instances of usage type 1 and 2 lacked 'virtualmachineid' as >>>>>>> below. >>>>>>> >>>>>>> { >>>>>>> "account": "sgcadm", >>>>>>> "accountid": "f9e4e1ca-69fd-4ae3-b70c-15bbcc13406e", >>>>>>> "description": "mycluster-front allocated (ServiceOffering: 13) >>>>>>> (Template: 203)", >>>>>>> "domainid": "84dd635d-fb99-4895-b199-7d777aa144d5", >>>>>>> "enddate": "2014-05-20'T'08:59:59+09:00", >>>>>>> "name": "mycluster-front", >>>>>>> "offeringid": "e5137018-8fca-4e4a-a79e-9e4d1707e079", >>>>>>> "rawusage": "0.223611", >>>>>>> "startdate": "2014-05-19'T'09:00:00+09:00", >>>>>>> "templateid": "1ebdc71e-dcbe-4d3e-82d3-d31897f78d4c", >>>>>>> "type": "KVM", >>>>>>> "usage": "0.223611 Hrs", >>>>>>> "usageid": "09f3d7d6-3c6a-4326-b3d3-fb51506e669d", >>>>>>> "usagetype": 2, >>>>>>> "zoneid": "c2ba1354-0c15-4284-bdba-4f201767362d" >>>>>>> }, >>>>>>> >>>>>>> Hence, it is unable to refer to any destroyed instance id. I patched >>>>>>> createUsageResponse method like this. >>>>>>> >>>>>>> diff --git a/server/src/com/cloud/api/ApiResponseHelper.java >>>>>>> b/server/src/com/cloud/api/ApiResponseHelper.java >>>>>>> index 7718fc1..cbf3914 100755 >>>>>>> --- a/server/src/com/cloud/api/ApiResponseHelper.java >>>>>>> +++ b/server/src/com/cloud/api/ApiResponseHelper.java >>>>>>> @@ -3304,7 +3304,7 @@ public class ApiResponseHelper implements >>>>>>> ResponseGenerator { >>>>>>> usageRecResponse.setUsage(usageRecord.getUsageDisplay()); >>>>>>> usageRecResponse.setUsageType(usageRecord.getUsageType()); >>>>>>> if (usageRecord.getVmInstanceId() != null) { >>>>>>> - VMInstanceVO vm = >>>>>>> _entityMgr.findById(VMInstanceVO.class, >>>>>>> usageRecord.getVmInstanceId()); >>>>>>> + VMInstanceVO vm = >>>>>>> _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, >>>>>>> usageRecord.getVmInstanceId()); >>>>>>> if (vm != null) { >>>>>>> usageRecResponse.setVirtualMachineId(vm.getUuid()); >>>>>>> } >>>>>>> >>>>>> >>>>>> Looks like an omission to me, I went ahead and patched it: >>>>>> >>>>>> commit 24e03bed560feb959a61126b76c2d6971e77092e >>>>>> Author: Sebastien Goasguen <run...@gmail.com> >>>>>> Date: Thu May 29 09:48:46 2014 +0200 >>>>>> >>>>>> Fix usage response, patch by Hiroki Ohashi >>>>>> >>>>>> We can always revert if people don't agree. >>>>>> >>>>>> Can you pull the latest 4.3 and try it. >>>>>> >>>>> >>>>> Thanks! I will try it. >>>>> >>>>>> Thanks for the patch. you can always attach a patch at >>>>>> http://reviews.apache.org >>>>>> and follow the instructions at >>>>>> http://cloudstack.apache.org/developers.html >>>>> >>>>> OK, I will follow the instruction next time. >>>>> >>>>> >>>>>>> After that, listUsageRecords API contains 'virtualmachineid' whether >>>>>>> or not instances are destroyed. Here is a result. >>>>>>> >>>>>>> { >>>>>>> "account": "sgcadm", >>>>>>> "accountid": "f9e4e1ca-69fd-4ae3-b70c-15bbcc13406e", >>>>>>> "description": "mycluster-front allocated (ServiceOffering: 13) >>>>>>> (Template: 203)", >>>>>>> "domainid": "84dd635d-fb99-4895-b199-7d777aa144d5", >>>>>>> "enddate": "2014-05-20'T'08:59:59+09:00", >>>>>>> "name": "mycluster-front", >>>>>>> "offeringid": "e5137018-8fca-4e4a-a79e-9e4d1707e079", >>>>>>> "rawusage": "0.223611", >>>>>>> "startdate": "2014-05-19'T'09:00:00+09:00", >>>>>>> "templateid": "1ebdc71e-dcbe-4d3e-82d3-d31897f78d4c", >>>>>>> "type": "KVM", >>>>>>> "usage": "0.223611 Hrs", >>>>>>> "usageid": "09f3d7d6-3c6a-4326-b3d3-fb51506e669d", >>>>>>> "usagetype": 2, >>>>>>> "virtualmachineid": "09f3d7d6-3c6a-4326-b3d3-fb51506e669d", >>>>>>> "zoneid": "c2ba1354-0c15-4284-bdba-4f201767362d" >>>>>>> }, >>>>>>> >>>>>>> I think this is an expectecd behaviour, so please review and test this >>>>>>> patch. >>>>>>> >>>>>>> >>>>>>> Best Regards >>>>>>> >>>>>>> -- >>>>>>> Hiroki Ohashi >>>>>> >>>>> >>>>> >>>>> Best Regards >>>>> >>>>> -- >>>>> Hiroki Ohashi >>>> >>>> >>>> >>>> -- >>>> Daan >>> >> > > > Best Regards > > -- > Hiroki Ohashi -- Daan