|
24 | 24 | import com.cloud.exception.PermissionDeniedException; |
25 | 25 | import com.cloud.exception.ResourceUnavailableException; |
26 | 26 | import com.cloud.org.Grouping; |
| 27 | +import com.cloud.hypervisor.Hypervisor.HypervisorType; |
27 | 28 | import com.cloud.storage.DataStoreRole; |
| 29 | +import com.cloud.storage.ScopeType; |
28 | 30 | import com.cloud.storage.Snapshot; |
29 | 31 | import com.cloud.storage.Storage.StoragePoolType; |
30 | 32 | import com.cloud.storage.SnapshotPolicyVO; |
|
41 | 43 | import com.cloud.user.ResourceLimitService; |
42 | 44 | import com.cloud.user.User; |
43 | 45 | import com.cloud.user.dao.AccountDao; |
| 46 | +import com.cloud.vm.dao.UserVmDao; |
44 | 47 | import com.cloud.utils.Pair; |
45 | 48 |
|
46 | 49 | import com.cloud.utils.db.SearchBuilder; |
|
56 | 59 | import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotResult; |
57 | 60 | import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotService; |
58 | 61 | import org.apache.cloudstack.framework.async.AsyncCallFuture; |
| 62 | +import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory; |
| 63 | +import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; |
59 | 64 | import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; |
60 | 65 | import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao; |
61 | 66 | import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO; |
@@ -110,6 +115,10 @@ public class SnapshotManagerImplTest { |
110 | 115 | TaggedResourceService taggedResourceService; |
111 | 116 | @Mock |
112 | 117 | PrimaryDataStoreDao primaryDataStoreDao; |
| 118 | + @Mock |
| 119 | + VolumeDataFactory volFactory; |
| 120 | + @Mock |
| 121 | + UserVmDao userVmDao; |
113 | 122 | @InjectMocks |
114 | 123 | SnapshotManagerImpl snapshotManager = new SnapshotManagerImpl(); |
115 | 124 |
|
@@ -669,4 +678,29 @@ public void testRemoveClvmPrimarySnapshotStoreRefIfNeeded_NonClvmPool() { |
669 | 678 | Mockito.verify(snapshotStoreDao, Mockito.never()).removeBySnapshotStore( |
670 | 679 | Mockito.anyLong(), Mockito.anyLong(), Mockito.any()); |
671 | 680 | } |
| 681 | + |
| 682 | + @Test(expected = InvalidParameterValueException.class) |
| 683 | + public void testAllocSnapshotRejectsDuplicateNameForVolume() throws Exception { |
| 684 | + long volumeId = 1L; |
| 685 | + CallContext.register(Mockito.mock(User.class), Mockito.mock(Account.class)); |
| 686 | + |
| 687 | + VolumeInfo volume = Mockito.mock(VolumeInfo.class); |
| 688 | + Mockito.when(volFactory.getVolume(volumeId)).thenReturn(volume); |
| 689 | + DataStore dataStore = Mockito.mock(DataStore.class); |
| 690 | + Mockito.when(volume.getDataStore()).thenReturn(dataStore); |
| 691 | + Mockito.when(dataStore.getId()).thenReturn(10L); |
| 692 | + StoragePoolVO pool = Mockito.mock(StoragePoolVO.class); |
| 693 | + Mockito.when(primaryDataStoreDao.findById(10L)).thenReturn(pool); |
| 694 | + Mockito.when(pool.getScope()).thenReturn(ScopeType.ZONE); |
| 695 | + Mockito.when(pool.getHypervisor()).thenReturn(HypervisorType.None); |
| 696 | + Mockito.when(volume.getInstanceId()).thenReturn(null); |
| 697 | + Mockito.when(volume.getAccountId()).thenReturn(2L); |
| 698 | + |
| 699 | + SnapshotVO existing = Mockito.mock(SnapshotVO.class); |
| 700 | + Mockito.when(existing.getName()).thenReturn("dup"); |
| 701 | + Mockito.when(snapshotDao.listByStatusNotIn(volumeId, Snapshot.State.Destroyed, Snapshot.State.Error)) |
| 702 | + .thenReturn(List.of(existing)); |
| 703 | + |
| 704 | + snapshotManager.allocSnapshot(volumeId, Snapshot.MANUAL_POLICY_ID, "dup", null); |
| 705 | + } |
672 | 706 | } |
0 commit comments