Skip to content

Commit ac9a2e0

Browse files
committed
add tests
1 parent a923bdb commit ac9a2e0

File tree

2 files changed

+271
-0
lines changed

2 files changed

+271
-0
lines changed

engine/storage/datamotion/src/test/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategyTest.java

Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,18 @@
2828
import static org.mockito.Mockito.never;
2929
import static org.mockito.Mockito.any;
3030

31+
import com.cloud.storage.ClvmLockManager;
3132
import com.cloud.storage.Storage;
3233
import com.cloud.storage.StorageManager;
3334
import com.cloud.storage.StoragePool;
3435
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
3536
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
3637
import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
38+
import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
3739
import org.apache.cloudstack.engine.subsystem.api.storage.HostScope;
40+
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
3841
import org.apache.cloudstack.engine.subsystem.api.storage.StorageCacheManager;
42+
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
3943
import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
4044
import org.apache.cloudstack.framework.config.ConfigKey;
4145
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
@@ -288,4 +292,210 @@ public void testCanBypassSecondaryStorageWithClusterWideNFSAndZoneWideNFSPoolsIn
288292
canBypassSecondaryStorage = (boolean) method.invoke(strategy, destVolumeInfo, srcVolumeInfo);
289293
Assert.assertTrue(canBypassSecondaryStorage);
290294
}
295+
296+
@Test
297+
public void testUpdateLockHostForVolume_CLVMPool_SetsLockHost() throws Exception {
298+
Method method = AncientDataMotionStrategy.class.getDeclaredMethod(
299+
"updateLockHostForVolume",
300+
EndPoint.class,
301+
DataObject.class);
302+
method.setAccessible(true);
303+
304+
EndPoint endPoint = Mockito.mock(EndPoint.class);
305+
VolumeInfo volumeInfo = Mockito.mock(VolumeInfo.class);
306+
DataStore dataStore = Mockito.mock(DataStore.class, Mockito.withSettings().extraInterfaces(StoragePool.class));
307+
ClvmLockManager clvmLockManager = Mockito.mock(ClvmLockManager.class);
308+
309+
Field clvmLockManagerField = AncientDataMotionStrategy.class.getDeclaredField("clvmLockManager");
310+
clvmLockManagerField.setAccessible(true);
311+
clvmLockManagerField.set(strategy, clvmLockManager);
312+
313+
Long hostId = 123L;
314+
Long volumeId = 456L;
315+
String volumeUuid = "test-volume-uuid";
316+
317+
Mockito.when(endPoint.getId()).thenReturn(hostId);
318+
Mockito.when(volumeInfo.getDataStore()).thenReturn(dataStore);
319+
Mockito.when(volumeInfo.getId()).thenReturn(volumeId);
320+
Mockito.when(volumeInfo.getUuid()).thenReturn(volumeUuid);
321+
Mockito.when(((StoragePool) dataStore).getPoolType()).thenReturn(Storage.StoragePoolType.CLVM);
322+
Mockito.when(clvmLockManager.getClvmLockHostId(volumeId, volumeUuid)).thenReturn(null);
323+
324+
method.invoke(strategy, endPoint, volumeInfo);
325+
326+
Mockito.verify(clvmLockManager).setClvmLockHostId(volumeId, hostId);
327+
}
328+
329+
@Test
330+
public void testUpdateLockHostForVolume_CLVM_NG_Pool_SetsLockHost() throws Exception {
331+
Method method = AncientDataMotionStrategy.class.getDeclaredMethod(
332+
"updateLockHostForVolume",
333+
EndPoint.class,
334+
DataObject.class);
335+
method.setAccessible(true);
336+
337+
EndPoint endPoint = Mockito.mock(EndPoint.class);
338+
VolumeInfo volumeInfo = Mockito.mock(VolumeInfo.class);
339+
DataStore dataStore = Mockito.mock(DataStore.class, Mockito.withSettings().extraInterfaces(StoragePool.class));
340+
ClvmLockManager clvmLockManager = Mockito.mock(ClvmLockManager.class);
341+
342+
Field clvmLockManagerField = AncientDataMotionStrategy.class.getDeclaredField("clvmLockManager");
343+
clvmLockManagerField.setAccessible(true);
344+
clvmLockManagerField.set(strategy, clvmLockManager);
345+
346+
Long hostId = 789L;
347+
Long volumeId = 101L;
348+
String volumeUuid = "test-clvm-ng-volume-uuid";
349+
350+
Mockito.when(endPoint.getId()).thenReturn(hostId);
351+
Mockito.when(volumeInfo.getDataStore()).thenReturn(dataStore);
352+
Mockito.when(volumeInfo.getId()).thenReturn(volumeId);
353+
Mockito.when(volumeInfo.getUuid()).thenReturn(volumeUuid);
354+
Mockito.when(((StoragePool) dataStore).getPoolType()).thenReturn(Storage.StoragePoolType.CLVM_NG);
355+
Mockito.when(clvmLockManager.getClvmLockHostId(volumeId, volumeUuid)).thenReturn(null);
356+
357+
try {
358+
method.invoke(strategy, endPoint, volumeInfo);
359+
} catch (InvocationTargetException e) {
360+
e.getCause().printStackTrace();
361+
throw e;
362+
}
363+
364+
Mockito.verify(clvmLockManager).setClvmLockHostId(volumeId, hostId);
365+
}
366+
367+
@Test
368+
public void testUpdateLockHostForVolume_NonCLVMPool_DoesNotSetLockHost() throws Exception {
369+
Method method = AncientDataMotionStrategy.class.getDeclaredMethod(
370+
"updateLockHostForVolume",
371+
EndPoint.class,
372+
DataObject.class);
373+
method.setAccessible(true);
374+
375+
EndPoint endPoint = Mockito.mock(EndPoint.class);
376+
VolumeInfo volumeInfo = Mockito.mock(VolumeInfo.class);
377+
// Create mock that implements both DataStore and StoragePool interfaces
378+
DataStore dataStore = Mockito.mock(DataStore.class, Mockito.withSettings().extraInterfaces(StoragePool.class));
379+
ClvmLockManager clvmLockManager = Mockito.mock(ClvmLockManager.class);
380+
381+
Field clvmLockManagerField = AncientDataMotionStrategy.class.getDeclaredField("clvmLockManager");
382+
clvmLockManagerField.setAccessible(true);
383+
clvmLockManagerField.set(strategy, clvmLockManager);
384+
385+
Mockito.when(volumeInfo.getDataStore()).thenReturn(dataStore);
386+
Mockito.when(((StoragePool) dataStore).getPoolType()).thenReturn(Storage.StoragePoolType.NetworkFilesystem);
387+
388+
method.invoke(strategy, endPoint, volumeInfo);
389+
390+
Mockito.verify(clvmLockManager, never()).setClvmLockHostId(any(Long.class), any(Long.class));
391+
Mockito.verify(clvmLockManager, never()).getClvmLockHostId(any(Long.class), any(String.class));
392+
}
393+
394+
@Test
395+
public void testUpdateLockHostForVolume_ExistingLockHost_DoesNotOverwrite() throws Exception {
396+
Method method = AncientDataMotionStrategy.class.getDeclaredMethod(
397+
"updateLockHostForVolume",
398+
EndPoint.class,
399+
DataObject.class);
400+
method.setAccessible(true);
401+
402+
EndPoint endPoint = Mockito.mock(EndPoint.class);
403+
VolumeInfo volumeInfo = Mockito.mock(VolumeInfo.class);
404+
DataStore dataStore = Mockito.mock(DataStore.class, Mockito.withSettings().extraInterfaces(StoragePool.class));
405+
ClvmLockManager clvmLockManager = Mockito.mock(ClvmLockManager.class);
406+
407+
Field clvmLockManagerField = AncientDataMotionStrategy.class.getDeclaredField("clvmLockManager");
408+
clvmLockManagerField.setAccessible(true);
409+
clvmLockManagerField.set(strategy, clvmLockManager);
410+
411+
Long hostId = 555L;
412+
Long existingHostId = 666L;
413+
Long volumeId = 777L;
414+
String volumeUuid = "existing-lock-volume-uuid";
415+
416+
Mockito.when(endPoint.getId()).thenReturn(hostId);
417+
Mockito.when(volumeInfo.getDataStore()).thenReturn(dataStore);
418+
Mockito.when(volumeInfo.getId()).thenReturn(volumeId);
419+
Mockito.when(volumeInfo.getUuid()).thenReturn(volumeUuid);
420+
Mockito.when(((StoragePool) dataStore).getPoolType()).thenReturn(Storage.StoragePoolType.CLVM);
421+
Mockito.when(clvmLockManager.getClvmLockHostId(volumeId, volumeUuid)).thenReturn(existingHostId);
422+
423+
method.invoke(strategy, endPoint, volumeInfo);
424+
425+
Mockito.verify(clvmLockManager, never()).setClvmLockHostId(any(Long.class), any(Long.class));
426+
Mockito.verify(clvmLockManager).getClvmLockHostId(volumeId, volumeUuid);
427+
}
428+
429+
@Test
430+
public void testUpdateLockHostForVolume_NullEndPoint_DoesNotSetLockHost() throws Exception {
431+
Method method = AncientDataMotionStrategy.class.getDeclaredMethod(
432+
"updateLockHostForVolume",
433+
EndPoint.class,
434+
DataObject.class);
435+
method.setAccessible(true);
436+
437+
VolumeInfo volumeInfo =
438+
Mockito.mock(VolumeInfo.class);
439+
ClvmLockManager clvmLockManager =
440+
Mockito.mock(ClvmLockManager.class);
441+
442+
Field clvmLockManagerField = AncientDataMotionStrategy.class.getDeclaredField("clvmLockManager");
443+
clvmLockManagerField.setAccessible(true);
444+
clvmLockManagerField.set(strategy, clvmLockManager);
445+
446+
method.invoke(strategy, null, volumeInfo);
447+
448+
Mockito.verify(clvmLockManager, never()).setClvmLockHostId(any(Long.class), any(Long.class));
449+
Mockito.verify(clvmLockManager, never()).getClvmLockHostId(any(Long.class), any(String.class));
450+
}
451+
452+
@Test
453+
public void testUpdateLockHostForVolume_NonVolumeDataObject_DoesNotSetLockHost() throws Exception {
454+
Method method = AncientDataMotionStrategy.class.getDeclaredMethod(
455+
"updateLockHostForVolume",
456+
EndPoint.class,
457+
DataObject.class);
458+
method.setAccessible(true);
459+
460+
EndPoint endPoint =
461+
Mockito.mock(EndPoint.class);
462+
SnapshotInfo snapshotInfo =
463+
Mockito.mock(SnapshotInfo.class);
464+
ClvmLockManager clvmLockManager =
465+
Mockito.mock(ClvmLockManager.class);
466+
467+
Field clvmLockManagerField = AncientDataMotionStrategy.class.getDeclaredField("clvmLockManager");
468+
clvmLockManagerField.setAccessible(true);
469+
clvmLockManagerField.set(strategy, clvmLockManager);
470+
471+
method.invoke(strategy, endPoint, snapshotInfo);
472+
473+
Mockito.verify(clvmLockManager, never()).setClvmLockHostId(any(Long.class), any(Long.class));
474+
Mockito.verify(clvmLockManager, never()).getClvmLockHostId(any(Long.class), any(String.class));
475+
}
476+
477+
@Test
478+
public void testUpdateLockHostForVolume_NullPool_DoesNotSetLockHost() throws Exception {
479+
Method method = AncientDataMotionStrategy.class.getDeclaredMethod(
480+
"updateLockHostForVolume",
481+
EndPoint.class,
482+
DataObject.class);
483+
method.setAccessible(true);
484+
485+
EndPoint endPoint =
486+
Mockito.mock(EndPoint.class);
487+
VolumeInfo volumeInfo =
488+
Mockito.mock(VolumeInfo.class);
489+
ClvmLockManager clvmLockManager =
490+
Mockito.mock(ClvmLockManager.class);
491+
492+
Field clvmLockManagerField = AncientDataMotionStrategy.class.getDeclaredField("clvmLockManager");
493+
clvmLockManagerField.setAccessible(true);
494+
clvmLockManagerField.set(strategy, clvmLockManager);
495+
496+
method.invoke(strategy, endPoint, volumeInfo);
497+
498+
Mockito.verify(clvmLockManager, never()).setClvmLockHostId(any(Long.class), any(Long.class));
499+
Mockito.verify(clvmLockManager, never()).getClvmLockHostId(any(Long.class), any(String.class));
500+
}
291501
}

plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptorTest.java

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,4 +582,65 @@ public void testCreateClvmNgDiskWithBacking_QemuImgFailure() throws Throwable {
582582
throw e.getCause();
583583
}
584584
}
585+
586+
@Test(expected = CloudRuntimeException.class)
587+
public void testGetPhysicalDiskViaDirectBlockDevice_VolumeNotFound() throws Throwable {
588+
String volumeUuid = UUID.randomUUID().toString();
589+
String vgName = "testvg";
590+
591+
Mockito.when(mockPool.getLocalPath()).thenReturn(vgName);
592+
593+
mockScriptConstruction = Mockito.mockConstruction(Script.class,
594+
(mock, context) -> {
595+
when(mock.execute()).thenReturn(" Volume not found");
596+
});
597+
598+
Method method = LibvirtStorageAdaptor.class.getDeclaredMethod(
599+
"getPhysicalDiskViaDirectBlockDevice",
600+
String.class, KVMStoragePool.class);
601+
method.setAccessible(true);
602+
603+
try {
604+
method.invoke(libvirtStorageAdaptor, volumeUuid, mockPool);
605+
} catch (java.lang.reflect.InvocationTargetException e) {
606+
throw e.getCause();
607+
}
608+
}
609+
610+
@Test(expected = CloudRuntimeException.class)
611+
public void testGetPhysicalDiskViaDirectBlockDevice_NullPoolPath() throws Throwable {
612+
String volumeUuid = UUID.randomUUID().toString();
613+
614+
Mockito.when(mockPool.getLocalPath()).thenReturn(null);
615+
616+
Method method = LibvirtStorageAdaptor.class.getDeclaredMethod(
617+
"getPhysicalDiskViaDirectBlockDevice",
618+
String.class, KVMStoragePool.class);
619+
method.setAccessible(true);
620+
621+
try {
622+
method.invoke(libvirtStorageAdaptor, volumeUuid, mockPool);
623+
} catch (java.lang.reflect.InvocationTargetException e) {
624+
throw e.getCause();
625+
}
626+
}
627+
628+
@Test(expected = CloudRuntimeException.class)
629+
public void testGetPhysicalDiskViaDirectBlockDevice_EmptyPoolPath() throws Throwable {
630+
String volumeUuid = UUID.randomUUID().toString();
631+
632+
Mockito.when(mockPool.getLocalPath()).thenReturn("");
633+
634+
Method method = LibvirtStorageAdaptor.class.getDeclaredMethod(
635+
"getPhysicalDiskViaDirectBlockDevice",
636+
String.class, KVMStoragePool.class);
637+
method.setAccessible(true);
638+
639+
try {
640+
method.invoke(libvirtStorageAdaptor, volumeUuid, mockPool);
641+
} catch (java.lang.reflect.InvocationTargetException e) {
642+
throw e.getCause();
643+
}
644+
}
585645
}
646+

0 commit comments

Comments
 (0)