mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	Handle with VM snapshot events (#4251)
Co-authored-by: Rodrigo <rodrigo@scclouds.com.br>
This commit is contained in:
		
							parent
							
								
									4c936b4690
								
							
						
					
					
						commit
						d676ffa0a0
					
				| @ -997,7 +997,7 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna | |||||||
|         } else if (isSecurityGroupEvent(eventType)) { |         } else if (isSecurityGroupEvent(eventType)) { | ||||||
|             createSecurityGroupEvent(event); |             createSecurityGroupEvent(event); | ||||||
|         } else if (isVmSnapshotEvent(eventType)) { |         } else if (isVmSnapshotEvent(eventType)) { | ||||||
|             createVMSnapshotEvent(event); |             handleVMSnapshotEvent(event); | ||||||
|         } else if (isVmSnapshotOnPrimaryEvent(eventType)) { |         } else if (isVmSnapshotOnPrimaryEvent(eventType)) { | ||||||
|             createVmSnapshotOnPrimaryEvent(event); |             createVmSnapshotOnPrimaryEvent(event); | ||||||
|         } else if (isBackupEvent(eventType)) { |         } else if (isBackupEvent(eventType)) { | ||||||
| @ -1891,17 +1891,41 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private void createVMSnapshotEvent(UsageEventVO event) { |     /** | ||||||
|         Long vmId = event.getResourceId(); |      * Handles Vm Snapshot create and delete events: | ||||||
|         Long volumeId = event.getTemplateId(); |      * <ul> | ||||||
|         Long offeringId = event.getOfferingId(); |      *     <li>EventTypes#EVENT_VM_SNAPSHOT_CREATE</li> | ||||||
|         Long zoneId = event.getZoneId(); |      *     <li>EventTypes#EVENT_VM_SNAPSHOT_DELETE</li> | ||||||
|         Long accountId = event.getAccountId(); |      * </ul> | ||||||
|         //Size could be null for VM snapshot delete events |      * if the event received by this method is neither add nor remove, we ignore it. | ||||||
|         long size = (event.getSize() == null) ? 0 : event.getSize(); |      */ | ||||||
|         Date created = event.getCreateDate(); |     protected void handleVMSnapshotEvent(UsageEventVO event) { | ||||||
|  |         switch (event.getType()) { | ||||||
|  |             case EventTypes.EVENT_VM_SNAPSHOT_CREATE: | ||||||
|  |                 createUsageVMSnapshot(event); | ||||||
|  |                 break; | ||||||
|  |             case EventTypes.EVENT_VM_SNAPSHOT_DELETE: | ||||||
|  |                 deleteUsageVMSnapshot(event); | ||||||
|  |                 break; | ||||||
|  |             default: | ||||||
|  |                 s_logger.debug(String.format("The event [type=%s, zoneId=%s, accountId=%s, resourceName=%s, diskOfferingId=%s, createDate=%s] is neither of type [%s] nor [%s]", | ||||||
|  |                         event.getType(), event.getZoneId(), event.getAccountId(), event.getResourceName(), event.getOfferingId(), event.getCreateDate(), EventTypes.EVENT_VM_SNAPSHOT_CREATE, EventTypes.EVENT_VM_SNAPSHOT_DELETE)); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Creates an entry for the Usage VM Snapshot. | ||||||
|  |      */ | ||||||
|  |     protected void createUsageVMSnapshot(UsageEventVO event) { | ||||||
|  |         long accountId = event.getAccountId(); | ||||||
|         Account acct = _accountDao.findByIdIncludingRemoved(event.getAccountId()); |         Account acct = _accountDao.findByIdIncludingRemoved(event.getAccountId()); | ||||||
|         Long domainId = acct.getDomainId(); |         long domainId = acct.getDomainId(); | ||||||
|  |         Long offeringId = event.getOfferingId(); | ||||||
|  |         long vmId = event.getResourceId(); | ||||||
|  |         long volumeId = event.getTemplateId(); | ||||||
|  |         long zoneId = event.getZoneId(); | ||||||
|  |         Date created = event.getCreateDate(); | ||||||
|  |         long size = (event.getSize() == null) ? 0 : event.getSize(); | ||||||
| 
 | 
 | ||||||
|         UsageEventDetailsVO detailVO = _usageEventDetailsDao.findDetail(event.getId(), UsageEventVO.DynamicParameters.vmSnapshotId.name()); |         UsageEventDetailsVO detailVO = _usageEventDetailsDao.findDetail(event.getId(), UsageEventVO.DynamicParameters.vmSnapshotId.name()); | ||||||
|         Long vmSnapshotId = null; |         Long vmSnapshotId = null; | ||||||
| @ -1909,11 +1933,51 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna | |||||||
|             String snapId = detailVO.getValue(); |             String snapId = detailVO.getValue(); | ||||||
|             vmSnapshotId = Long.valueOf(snapId); |             vmSnapshotId = Long.valueOf(snapId); | ||||||
|         } |         } | ||||||
|  |         s_logger.debug(String.format("Creating usage VM Snapshot for VM id [%s] assigned to account [%s] domain [%s], zone [%s], and created at [%s]", vmId, accountId, domainId, zoneId, | ||||||
|  |                 event.getCreateDate())); | ||||||
|         UsageVMSnapshotVO vsVO = new UsageVMSnapshotVO(volumeId, zoneId, accountId, domainId, vmId, offeringId, size, created, null); |         UsageVMSnapshotVO vsVO = new UsageVMSnapshotVO(volumeId, zoneId, accountId, domainId, vmId, offeringId, size, created, null); | ||||||
|         vsVO.setVmSnapshotId(vmSnapshotId); |         vsVO.setVmSnapshotId(vmSnapshotId); | ||||||
|         _usageVMSnapshotDao.persist(vsVO); |         _usageVMSnapshotDao.persist(vsVO); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * Find and delete, if exists, usage VM Snapshots entries | ||||||
|  |      */ | ||||||
|  |     protected void deleteUsageVMSnapshot(UsageEventVO event) { | ||||||
|  |         long accountId = event.getAccountId(); | ||||||
|  |         Account acct = _accountDao.findByIdIncludingRemoved(event.getAccountId()); | ||||||
|  |         Long domainId = acct.getDomainId(); | ||||||
|  |         Long diskOfferingId = event.getOfferingId(); | ||||||
|  |         long vmId = event.getResourceId(); | ||||||
|  |         long zoneId = event.getZoneId(); | ||||||
|  |         List<UsageVMSnapshotVO> usageVMSnapshots = findUsageVMSnapshots(accountId, zoneId, domainId, vmId, diskOfferingId); | ||||||
|  |         if (CollectionUtils.isEmpty(usageVMSnapshots)){ | ||||||
|  |             s_logger.warn(String.format("No usage entry for VM snapshot for VM id [%s] assigned to account [%s] domain [%s] and zone [%s] was found.", | ||||||
|  |                     vmId, accountId, domainId, zoneId)); | ||||||
|  |         } | ||||||
|  |         if (usageVMSnapshots.size() > 1) { | ||||||
|  |             s_logger.warn(String.format("More than one usage entry for VM snapshot for VM id [%s] assigned to account [%s] domain [%s] and zone [%s]; marking them all as deleted.", vmId, | ||||||
|  |                     accountId, domainId, zoneId)); | ||||||
|  |         } | ||||||
|  |         for (UsageVMSnapshotVO vmSnapshots : usageVMSnapshots) { | ||||||
|  |             s_logger.debug(String.format("Deleting VM Snapshot for VM id [%s] assigned to account [%s] domain [%s] and zone [%s] that was created at [%s].", vmSnapshots.getVmId(), | ||||||
|  |                     vmSnapshots.getAccountId(), vmSnapshots.getDomainId(), vmSnapshots.getZoneId(), vmSnapshots.getCreated())); | ||||||
|  |             vmSnapshots.setProcessed(event.getCreateDate()); | ||||||
|  |             _usageVMSnapshotDao.update(vmSnapshots); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     protected List<UsageVMSnapshotVO> findUsageVMSnapshots(long accountId, long zoneId, long domainId, long vmId, Long diskOfferingId) { | ||||||
|  |         SearchCriteria<UsageVMSnapshotVO> sc = _usageVMSnapshotDao.createSearchCriteria(); | ||||||
|  |         sc.addAnd("zoneId", SearchCriteria.Op.EQ, zoneId); | ||||||
|  |         sc.addAnd("accountId", SearchCriteria.Op.EQ, accountId); | ||||||
|  |         sc.addAnd("domainId", SearchCriteria.Op.EQ, domainId); | ||||||
|  |         sc.addAnd("vmId", SearchCriteria.Op.EQ, vmId); | ||||||
|  |         sc.addAnd("diskOfferingId", SearchCriteria.Op.EQ, diskOfferingId); | ||||||
|  |         sc.addAnd("processed", SearchCriteria.Op.NULL); | ||||||
|  |         return _usageVMSnapshotDao.search(sc, null); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     private void createVmSnapshotOnPrimaryEvent(UsageEventVO event) { |     private void createVmSnapshotOnPrimaryEvent(UsageEventVO event) { | ||||||
|         Long vmId = event.getResourceId(); |         Long vmId = event.getResourceId(); | ||||||
|         String name = event.getResourceName(); |         String name = event.getResourceName(); | ||||||
|  | |||||||
| @ -19,6 +19,8 @@ package com.cloud.usage; | |||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| 
 | 
 | ||||||
|  | import com.cloud.event.dao.UsageEventDetailsDao; | ||||||
|  | import com.cloud.usage.dao.UsageVMSnapshotDao; | ||||||
| import org.junit.Before; | import org.junit.Before; | ||||||
| import org.junit.Test; | import org.junit.Test; | ||||||
| import org.junit.runner.RunWith; | import org.junit.runner.RunWith; | ||||||
| @ -41,9 +43,18 @@ public class UsageManagerImplTest { | |||||||
|     @InjectMocks |     @InjectMocks | ||||||
|     private UsageManagerImpl usageManagerImpl; |     private UsageManagerImpl usageManagerImpl; | ||||||
| 
 | 
 | ||||||
|  |     @Mock | ||||||
|  |     private UsageEventDetailsDao usageEventDetailsDao; | ||||||
|  | 
 | ||||||
|  |     @Mock | ||||||
|  |     private UsageEventVO usageEventVOMock; | ||||||
|  | 
 | ||||||
|     @Mock |     @Mock | ||||||
|     private UsageVPNUserDao usageVPNUserDaoMock; |     private UsageVPNUserDao usageVPNUserDaoMock; | ||||||
| 
 | 
 | ||||||
|  |     @Mock | ||||||
|  |     private UsageVMSnapshotDao usageVMSnapshotDaoMock; | ||||||
|  | 
 | ||||||
|     @Mock |     @Mock | ||||||
|     private AccountDao accountDaoMock; |     private AccountDao accountDaoMock; | ||||||
| 
 | 
 | ||||||
| @ -51,10 +62,10 @@ public class UsageManagerImplTest { | |||||||
|     private UsageVPNUserVO vpnUserMock; |     private UsageVPNUserVO vpnUserMock; | ||||||
| 
 | 
 | ||||||
|     @Mock |     @Mock | ||||||
|     private AccountVO accountMock; |     private UsageVMSnapshotVO vmSnapshotMock; | ||||||
| 
 | 
 | ||||||
|     @Mock |     @Mock | ||||||
|     private UsageEventVO usageEventVOMock; |     private AccountVO accountMock; | ||||||
| 
 | 
 | ||||||
|     private long accountMockId = 1l; |     private long accountMockId = 1l; | ||||||
|     private long acountDomainIdMock = 2l; |     private long acountDomainIdMock = 2l; | ||||||
| @ -164,4 +175,72 @@ public class UsageManagerImplTest { | |||||||
|         Mockito.verify(usageManagerImpl, Mockito.never()).createUsageVpnUser(usageEventVOMock,accountMock); |         Mockito.verify(usageManagerImpl, Mockito.never()).createUsageVpnUser(usageEventVOMock,accountMock); | ||||||
|         Mockito.verify(usageManagerImpl, Mockito.never()).deleteUsageVpnUser(usageEventVOMock, accountMock); |         Mockito.verify(usageManagerImpl, Mockito.never()).deleteUsageVpnUser(usageEventVOMock, accountMock); | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void createUsageVMSnapshotTest() { | ||||||
|  |         Mockito.doReturn(vmSnapshotMock).when(usageVMSnapshotDaoMock).persist(Mockito.any(UsageVMSnapshotVO.class)); | ||||||
|  |         usageManagerImpl.createUsageVMSnapshot(Mockito.mock(UsageEventVO.class)); | ||||||
|  |         Mockito.verify(usageVMSnapshotDaoMock, Mockito.times(1)).persist(Mockito.any(UsageVMSnapshotVO.class)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void deleteUsageVMSnapshotTest() { | ||||||
|  |         List<UsageVMSnapshotVO> vmSnapshotsMock = new ArrayList<UsageVMSnapshotVO>(); | ||||||
|  |         vmSnapshotsMock.add(vmSnapshotMock); | ||||||
|  | 
 | ||||||
|  |         Mockito.doReturn(vmSnapshotsMock).when(usageManagerImpl).findUsageVMSnapshots(Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong()); | ||||||
|  |         Mockito.doNothing().when(usageVMSnapshotDaoMock).update(Mockito.any(UsageVMSnapshotVO.class)); | ||||||
|  | 
 | ||||||
|  |         usageManagerImpl.deleteUsageVMSnapshot(usageEventVOMock); | ||||||
|  | 
 | ||||||
|  |         Mockito.verify(usageVMSnapshotDaoMock, Mockito.times(1)).update(Mockito.any(UsageVMSnapshotVO.class)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void deleteUsageVMSnapshotMultipleSnapshotsFoundTest() { | ||||||
|  |         List<UsageVMSnapshotVO> vmSnapshotsMock = new ArrayList<UsageVMSnapshotVO>(); | ||||||
|  |         vmSnapshotsMock.add(vmSnapshotMock); | ||||||
|  |         vmSnapshotsMock.add(Mockito.mock(UsageVMSnapshotVO.class)); | ||||||
|  |         vmSnapshotsMock.add(Mockito.mock(UsageVMSnapshotVO.class)); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         Mockito.doReturn(vmSnapshotsMock).when(usageManagerImpl).findUsageVMSnapshots(Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong()); | ||||||
|  |         Mockito.doNothing().when(usageVMSnapshotDaoMock).update(Mockito.any(UsageVMSnapshotVO.class)); | ||||||
|  | 
 | ||||||
|  |         usageManagerImpl.deleteUsageVMSnapshot(usageEventVOMock); | ||||||
|  | 
 | ||||||
|  |         Mockito.verify(usageVMSnapshotDaoMock, Mockito.times(3)).update(Mockito.any(UsageVMSnapshotVO.class)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void handleVMSnapshotEventTestCreateVMSnapshot() { | ||||||
|  |         Mockito.when(usageEventVOMock.getType()).thenReturn(EventTypes.EVENT_VM_SNAPSHOT_CREATE); | ||||||
|  |         Mockito.doNothing().when(this.usageManagerImpl).createUsageVMSnapshot(usageEventVOMock); | ||||||
|  | 
 | ||||||
|  |         this.usageManagerImpl.handleVMSnapshotEvent(usageEventVOMock); | ||||||
|  | 
 | ||||||
|  |         Mockito.verify(usageManagerImpl).createUsageVMSnapshot(usageEventVOMock); | ||||||
|  |         Mockito.verify(usageManagerImpl, Mockito.never()).deleteUsageVMSnapshot(usageEventVOMock); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void handleVMSnapshotEventTestDeleteVMSnapshot() { | ||||||
|  |         Mockito.when(usageEventVOMock.getType()).thenReturn(EventTypes.EVENT_VM_SNAPSHOT_DELETE); | ||||||
|  |         Mockito.doNothing().when(this.usageManagerImpl).deleteUsageVMSnapshot(usageEventVOMock); | ||||||
|  | 
 | ||||||
|  |         this.usageManagerImpl.handleVMSnapshotEvent(usageEventVOMock); | ||||||
|  | 
 | ||||||
|  |         Mockito.verify(usageManagerImpl).deleteUsageVMSnapshot(usageEventVOMock); | ||||||
|  |         Mockito.verify(usageManagerImpl, Mockito.never()).createUsageVMSnapshot(usageEventVOMock); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void handleVMSnapshotEventTestEventIsNeitherAddNorRemove() { | ||||||
|  |         Mockito.when(this.usageEventVOMock.getType()).thenReturn("VPN.USER.UPDATE"); | ||||||
|  | 
 | ||||||
|  |         this.usageManagerImpl.handleVMSnapshotEvent(usageEventVOMock); | ||||||
|  | 
 | ||||||
|  |         Mockito.verify(usageManagerImpl, Mockito.never()).createUsageVpnUser(usageEventVOMock,accountMock); | ||||||
|  |         Mockito.verify(usageManagerImpl, Mockito.never()).deleteUsageVpnUser(usageEventVOMock, accountMock); | ||||||
|  |     } | ||||||
| } | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user