This commit is contained in:
Surya Srinivasan 2026-05-12 07:07:35 +00:00 committed by GitHub
commit f98632a1d2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 66 additions and 0 deletions

View File

@ -1133,6 +1133,26 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
Long templateId = event.getTemplateId();
String hypervisorType = event.getResourceType();
SearchCriteria<UsageVMInstanceVO> runningSc =
_usageInstanceDao.createSearchCriteria();
runningSc.addAnd("vmInstanceId", SearchCriteria.Op.EQ, vmId);
runningSc.addAnd("usageType", SearchCriteria.Op.EQ, UsageTypes.RUNNING_VM);
runningSc.addAnd("endDate", SearchCriteria.Op.NULL);
List<UsageVMInstanceVO> existingRunning =
_usageInstanceDao.search(runningSc, null);
if (existingRunning != null && !existingRunning.isEmpty()) {
logger.warn(String.format(
"Duplicate VM.START event detected for VM [%d] at [%s], skipping helper record creation.",
vmId, event.getCreateDate()));
return;
}
// add this VM to the usage helper table
UsageVMInstanceVO usageInstanceNew =
new UsageVMInstanceVO(UsageTypes.RUNNING_VM, zoneId, event.getAccountId(), vmId, vmName, soId, templateId, hypervisorType, event.getCreateDate(),

View File

@ -36,6 +36,15 @@ import com.cloud.user.AccountVO;
import com.cloud.user.dao.AccountDao;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.Date;
import com.cloud.usage.dao.UsageVMInstanceDao;
import com.cloud.utils.db.SearchCriteria;
import org.springframework.test.util.ReflectionTestUtils;
@RunWith(MockitoJUnitRunner.class)
public class UsageManagerImplTest {
@ -243,4 +252,41 @@ public class UsageManagerImplTest {
Mockito.verify(usageManagerImpl, Mockito.never()).createUsageVpnUser(usageEventVOMock,accountMock);
Mockito.verify(usageManagerImpl, Mockito.never()).deleteUsageVpnUser(usageEventVOMock, accountMock);
}
@Test
public void testDuplicateVmStartDoesNotCreateNewRunningUsage() {
UsageVMInstanceDao usageInstanceDao = Mockito.mock(UsageVMInstanceDao.class);
ReflectionTestUtils.setField(usageManagerImpl, "_usageInstanceDao", usageInstanceDao);
Mockito.doNothing()
.when(usageEventDetailsDao)
.persist(Mockito.any());
long vmId = 100L;
UsageEventVO event = Mockito.mock(UsageEventVO.class);
Mockito.when(event.getType()).thenReturn(EventTypes.EVENT_VM_START);
Mockito.when(event.getResourceId()).thenReturn(vmId);
Mockito.when(event.getZoneId()).thenReturn(1L);
Mockito.when(event.getAccountId()).thenReturn(1L);
Mockito.when(event.getCreateDate()).thenReturn(new Date());
UsageVMInstanceVO existing = Mockito.mock(UsageVMInstanceVO.class);
List<UsageVMInstanceVO> existingList = List.of(existing);
SearchCriteria<UsageVMInstanceVO> sc = Mockito.mock(SearchCriteria.class);
Mockito.when(usageInstanceDao.createSearchCriteria()).thenReturn(sc);
Mockito.when(usageInstanceDao.search(Mockito.any(), Mockito.isNull()))
.thenReturn(existingList);
usageManagerImpl.handleEvent(event);
Mockito.verify(usageInstanceDao, Mockito.never())
.persist(Mockito.any(UsageVMInstanceVO.class));
}
}