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 <[email protected]>
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 <[email protected]>
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());
}
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