mirror of https://github.com/apache/cloudstack.git
Merge be8423c54c into 5893ba5a8c
This commit is contained in:
commit
f98632a1d2
|
|
@ -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(),
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue