1717package com .cloud .storage ;
1818
1919import static org .junit .Assert .assertEquals ;
20+ import static org .junit .Assert .fail ;
2021import static org .mockito .Matchers .any ;
2122import static org .mockito .Matchers .anyLong ;
2223import static org .mockito .Matchers .anyObject ;
4041import org .apache .cloudstack .acl .SecurityChecker .AccessType ;
4142import org .apache .cloudstack .api .command .user .volume .CreateVolumeCmd ;
4243import org .apache .cloudstack .api .command .user .volume .DetachVolumeCmd ;
44+ import org .apache .cloudstack .api .command .user .volume .MigrateVolumeCmd ;
4345import org .apache .cloudstack .context .CallContext ;
4446import org .apache .cloudstack .engine .subsystem .api .storage .DataStore ;
47+ import org .apache .cloudstack .engine .subsystem .api .storage .DataStoreManager ;
48+ import org .apache .cloudstack .engine .subsystem .api .storage .PrimaryDataStore ;
4549import org .apache .cloudstack .engine .subsystem .api .storage .SnapshotInfo ;
4650import org .apache .cloudstack .engine .subsystem .api .storage .VolumeDataFactory ;
4751import org .apache .cloudstack .engine .subsystem .api .storage .VolumeInfo ;
5256import org .apache .cloudstack .framework .jobs .AsyncJobManager ;
5357import org .apache .cloudstack .framework .jobs .dao .AsyncJobJoinMapDao ;
5458import org .apache .cloudstack .framework .jobs .impl .AsyncJobVO ;
59+ import org .apache .cloudstack .snapshot .SnapshotHelper ;
5560import org .apache .cloudstack .storage .datastore .db .ImageStoreDao ;
5661import org .apache .cloudstack .storage .datastore .db .ImageStoreVO ;
5762import org .apache .cloudstack .storage .datastore .db .PrimaryDataStoreDao ;
114119import com .cloud .user .User ;
115120import com .cloud .user .UserVO ;
116121import com .cloud .user .dao .AccountDao ;
122+ import com .cloud .utils .exception .CloudRuntimeException ;
117123import com .cloud .utils .db .TransactionLegacy ;
118124import com .cloud .utils .fsm .NoTransitionException ;
119125import com .cloud .vm .UserVmManager ;
@@ -169,6 +175,8 @@ public class VolumeApiServiceImplTest {
169175 @ Mock
170176 private CreateVolumeCmd createVol ;
171177 @ Mock
178+ private MigrateVolumeCmd migrateVolumeCmd ;
179+ @ Mock
172180 private UserVmManager userVmManager ;
173181 @ Mock
174182 private DataCenterDao _dcDao ;
@@ -188,6 +196,10 @@ public class VolumeApiServiceImplTest {
188196 private ServiceOfferingDao serviceOfferingDao ;
189197 @ Mock
190198 private DiskOfferingDao _diskOfferingDao ;
199+ @ Mock
200+ private DataStoreManager dataStoreMgr ;
201+ @ Mock
202+ private SnapshotHelper snapshotHelper ;
191203
192204 private DetachVolumeCmd detachCmd = new DetachVolumeCmd ();
193205 private Class <?> _detachCmdClass = detachCmd .getClass ();
@@ -218,6 +230,9 @@ public class VolumeApiServiceImplTest {
218230 @ Mock
219231 private ProjectManager projectManagerMock ;
220232
233+ @ Mock
234+ private StorageManager storageMgr ;
235+
221236 private long accountMockId = 456l ;
222237 private long volumeMockId = 12313l ;
223238 private long vmInstanceMockId = 1123l ;
@@ -1579,4 +1594,41 @@ public void testIsSendCommandForVmVolumeAttachDetachKVMHost() {
15791594 Mockito .when (host .getHypervisorType ()).thenReturn (HypervisorType .KVM );
15801595 Assert .assertFalse (volumeApiServiceImpl .isSendCommandForVmVolumeAttachDetach (host , Mockito .mock (StoragePoolVO .class )));
15811596 }
1597+
1598+ // Below test covers both allowing encrypted volume migration for PowerFlex storage and expect error on storagepool compatibility
1599+ @ Test
1600+ public void testStoragePoolCompatibilityAndAllowEncryptedVolumeMigrationForPowerFlexStorage () {
1601+ try {
1602+ Mockito .when (migrateVolumeCmd .getVolumeId ()).thenReturn (1L );
1603+ Mockito .when (migrateVolumeCmd .getStoragePoolId ()).thenReturn (2L );
1604+ VolumeVO vol = Mockito .mock (VolumeVO .class );
1605+ Mockito .when (volumeDaoMock .findById (1L )).thenReturn (vol );
1606+ Mockito .when (volumeDaoMock .getHypervisorType (1L )).thenReturn (HypervisorType .KVM );
1607+ Mockito .when (vol .getState ()).thenReturn (Volume .State .Ready );
1608+ Mockito .when (vol .getPoolId ()).thenReturn (1L );
1609+ Mockito .when (vol .getInstanceId ()).thenReturn (null );
1610+ Mockito .when (vol .getDiskOfferingId ()).thenReturn (1L );
1611+ DiskOfferingVO diskOffering = Mockito .mock (DiskOfferingVO .class );
1612+ Mockito .when (_diskOfferingDao .findById (1L )).thenReturn (diskOffering );
1613+
1614+ StoragePoolVO srcStoragePoolVOMock = Mockito .mock (StoragePoolVO .class );
1615+ StoragePool destPool = Mockito .mock (StoragePool .class );
1616+ PrimaryDataStore dataStore = Mockito .mock (PrimaryDataStore .class );
1617+
1618+ Mockito .when (vol .getPassphraseId ()).thenReturn (1L );
1619+ Mockito .when (primaryDataStoreDaoMock .findById (1L )).thenReturn (srcStoragePoolVOMock );
1620+ Mockito .when (srcStoragePoolVOMock .getPoolType ()).thenReturn (Storage .StoragePoolType .PowerFlex );
1621+ Mockito .when (dataStoreMgr .getDataStore (2L , DataStoreRole .Primary )).thenReturn ( dataStore );
1622+ Mockito .doNothing ().when (snapshotHelper ).checkKvmVolumeSnapshotsOnlyInPrimaryStorage (vol , HypervisorType .KVM );
1623+ Mockito .when (destPool .getUuid ()).thenReturn ("bd525970-3d2a-4230-880d-261892129ef3" );
1624+
1625+ Mockito .when (storageMgr .storagePoolCompatibleWithVolumePool (destPool , vol )).thenReturn (false );
1626+
1627+ volumeApiServiceImpl .migrateVolume (migrateVolumeCmd );
1628+ } catch (InvalidParameterValueException e ) {
1629+ fail ("Unexpected InvalidParameterValueException was thrown" );
1630+ } catch (CloudRuntimeException e ) {
1631+ // test passed
1632+ }
1633+ }
15821634}
0 commit comments