@@ -898,6 +898,91 @@ public void testBackupSyncTask() {
898898 }
899899 }
900900
901+ private void verifyBackupUsageMetricPublished (MockedStatic <UsageEventUtils > usageEventUtilsMocked , int times , Long size , Long protectedSize ) {
902+ usageEventUtilsMocked .verify (() -> UsageEventUtils .publishUsageEvent (Mockito .eq (EventTypes .EVENT_VM_BACKUP_USAGE_METRIC ), Mockito .anyLong (),
903+ Mockito .anyLong (), Mockito .anyLong (), Mockito .any (), Mockito .anyLong (), Mockito .any (), Mockito .eq (size ), Mockito .eq (protectedSize ),
904+ Mockito .any (), Mockito .any ()), times (times ));
905+ }
906+
907+ @ Test
908+ public void updateBackupUsageRecordsPublishesMetricOnlyWhenItChanges () {
909+ Long dataCenterId = 1L ;
910+ Long vmId = 2L ;
911+ Long offeringId = 3L ;
912+
913+ DataCenterVO dataCenter = mock (DataCenterVO .class );
914+ when (dataCenter .getId ()).thenReturn (dataCenterId );
915+ VMInstanceVO vm = mock (VMInstanceVO .class );
916+ when (vm .getId ()).thenReturn (vmId );
917+ when (backupDao .listVmIdsWithBackupsInZone (dataCenterId )).thenReturn (List .of (vmId ));
918+ when (vmInstanceDao .listByIdsIncludingRemoved (List .of (vmId ))).thenReturn (List .of (vm ));
919+ when (vmInstanceDao .listByZoneAndBackupOffering (dataCenterId , null )).thenReturn (List .of (vm ));
920+
921+ BackupVO backup = new BackupVO ();
922+ backup .setBackupOfferingId (offeringId );
923+ backup .setSize (100L );
924+ backup .setProtectedSize (1000L );
925+ when (backupDao .listByVmId (null , vmId )).thenReturn (List .of (backup ));
926+
927+ BackupManagerImpl .BackupSyncTask backupSyncTask = backupManager .new BackupSyncTask (backupManager );
928+ BackupProvider backupProvider = mock (BackupProvider .class );
929+ try (MockedStatic <UsageEventUtils > usageEventUtilsMocked = Mockito .mockStatic (UsageEventUtils .class )) {
930+ backupSyncTask .updateBackupUsageRecords (backupProvider , dataCenter );
931+ backupSyncTask .updateBackupUsageRecords (backupProvider , dataCenter );
932+ verifyBackupUsageMetricPublished (usageEventUtilsMocked , 1 , 100L , 1000L );
933+
934+ backup .setSize (200L );
935+ backupSyncTask .updateBackupUsageRecords (backupProvider , dataCenter );
936+ backupSyncTask .updateBackupUsageRecords (backupProvider , dataCenter );
937+ verifyBackupUsageMetricPublished (usageEventUtilsMocked , 1 , 200L , 1000L );
938+
939+ // A VM that is no longer reported is forgotten, so it is published again if it comes back.
940+ when (backupDao .listVmIdsWithBackupsInZone (dataCenterId )).thenReturn (List .of ());
941+ when (vmInstanceDao .listByZoneAndBackupOffering (dataCenterId , null )).thenReturn (List .of ());
942+ backupSyncTask .updateBackupUsageRecords (backupProvider , dataCenter );
943+ when (backupDao .listVmIdsWithBackupsInZone (dataCenterId )).thenReturn (List .of (vmId ));
944+ when (vmInstanceDao .listByZoneAndBackupOffering (dataCenterId , null )).thenReturn (List .of (vm ));
945+ backupSyncTask .updateBackupUsageRecords (backupProvider , dataCenter );
946+ verifyBackupUsageMetricPublished (usageEventUtilsMocked , 2 , 200L , 1000L );
947+ }
948+ }
949+
950+ @ Test
951+ public void updateBackupUsageRecordsReportsCurrentOfferingWithoutBackups () {
952+ Long dataCenterId = 1L ;
953+ Long vmId = 2L ;
954+ Long oldOfferingId = 3L ;
955+ Long currentOfferingId = 4L ;
956+
957+ DataCenterVO dataCenter = mock (DataCenterVO .class );
958+ when (dataCenter .getId ()).thenReturn (dataCenterId );
959+ VMInstanceVO vm = mock (VMInstanceVO .class );
960+ when (vm .getId ()).thenReturn (vmId );
961+ when (vm .getBackupOfferingId ()).thenReturn (currentOfferingId );
962+ when (backupDao .listVmIdsWithBackupsInZone (dataCenterId )).thenReturn (List .of (vmId ));
963+ when (vmInstanceDao .listByIdsIncludingRemoved (List .of (vmId ))).thenReturn (List .of (vm ));
964+ when (vmInstanceDao .listByZoneAndBackupOffering (dataCenterId , null )).thenReturn (List .of (vm ));
965+
966+ // Backups kept from an offering the VM had before; none for its current offering.
967+ BackupVO oldBackup = new BackupVO ();
968+ oldBackup .setBackupOfferingId (oldOfferingId );
969+ oldBackup .setSize (100L );
970+ oldBackup .setProtectedSize (1000L );
971+ when (backupDao .listByVmId (null , vmId )).thenReturn (List .of (oldBackup ));
972+
973+ BackupManagerImpl .BackupSyncTask backupSyncTask = backupManager .new BackupSyncTask (backupManager );
974+ try (MockedStatic <UsageEventUtils > usageEventUtilsMocked = Mockito .mockStatic (UsageEventUtils .class )) {
975+ backupSyncTask .updateBackupUsageRecords (mock (BackupProvider .class ), dataCenter );
976+
977+ usageEventUtilsMocked .verify (() -> UsageEventUtils .publishUsageEvent (Mockito .eq (EventTypes .EVENT_VM_BACKUP_USAGE_METRIC ), Mockito .anyLong (),
978+ Mockito .anyLong (), Mockito .eq (vmId ), Mockito .any (), Mockito .eq (currentOfferingId ), Mockito .any (), Mockito .eq (0L ), Mockito .eq (0L ),
979+ Mockito .any (), Mockito .any ()));
980+ usageEventUtilsMocked .verify (() -> UsageEventUtils .publishUsageEvent (Mockito .eq (EventTypes .EVENT_VM_BACKUP_USAGE_METRIC ), Mockito .anyLong (),
981+ Mockito .anyLong (), Mockito .eq (vmId ), Mockito .any (), Mockito .eq (oldOfferingId ), Mockito .any (), Mockito .eq (100L ), Mockito .eq (1000L ),
982+ Mockito .any (), Mockito .any ()));
983+ }
984+ }
985+
901986 @ Test
902987 public void checkCallerAccessToBackupScheduleVmTestExecuteAccessCheckMethods () {
903988 long vmId = 1L ;
0 commit comments