|
38 | 38 | import static org.mockito.Mockito.when; |
39 | 39 |
|
40 | 40 | import java.lang.reflect.Field; |
| 41 | +import java.lang.reflect.Method; |
41 | 42 | import java.util.ArrayList; |
42 | 43 | import java.util.Arrays; |
43 | 44 | import java.util.Collections; |
|
60 | 61 | import com.cloud.network.Network; |
61 | 62 | import com.cloud.network.NetworkModel; |
62 | 63 | import com.cloud.resource.ResourceManager; |
| 64 | +import com.cloud.storage.ClvmLockManager; |
63 | 65 | import org.apache.cloudstack.api.ApiConstants; |
64 | 66 | import org.apache.cloudstack.context.CallContext; |
65 | 67 | import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator; |
@@ -1954,4 +1956,202 @@ public void testUnmanageSuccessKvm() throws Exception { |
1954 | 1956 | } |
1955 | 1957 | } |
1956 | 1958 |
|
| 1959 | + @Test |
| 1960 | + public void testUpdateClvmLockHostForVmVolumes_WithClvmVolumes() throws Exception { |
| 1961 | + long vmId = 100L; |
| 1962 | + long destHostId = 2L; |
| 1963 | + long poolId = 10L; |
| 1964 | + |
| 1965 | + VolumeVO clvmVolume1 = mock(VolumeVO.class); |
| 1966 | + VolumeVO clvmVolume2 = mock(VolumeVO.class); |
| 1967 | + |
| 1968 | + when(clvmVolume1.getId()).thenReturn(1L); |
| 1969 | + when(clvmVolume1.getPoolId()).thenReturn(poolId); |
| 1970 | + when(clvmVolume2.getId()).thenReturn(2L); |
| 1971 | + when(clvmVolume2.getPoolId()).thenReturn(poolId); |
| 1972 | + |
| 1973 | + StoragePoolVO clvmPool = mock(StoragePoolVO.class); |
| 1974 | + when(clvmPool.getPoolType()).thenReturn(Storage.StoragePoolType.CLVM); |
| 1975 | + |
| 1976 | + when(volumeDaoMock.findByInstance(vmId)).thenReturn(Arrays.asList(clvmVolume1, clvmVolume2)); |
| 1977 | + when(storagePoolDaoMock.findById(poolId)).thenReturn(clvmPool); |
| 1978 | + |
| 1979 | + ClvmLockManager clvmLockManagerMock = mock(ClvmLockManager.class); |
| 1980 | + ReflectionTestUtils.setField(virtualMachineManagerImpl, "clvmLockManager", clvmLockManagerMock); |
| 1981 | + |
| 1982 | + Method method = VirtualMachineManagerImpl.class.getDeclaredMethod( |
| 1983 | + "updateClvmLockHostForVmVolumes", long.class, long.class); |
| 1984 | + method.setAccessible(true); |
| 1985 | + method.invoke(virtualMachineManagerImpl, vmId, destHostId); |
| 1986 | + |
| 1987 | + verify(clvmLockManagerMock, times(1)).setClvmLockHostId(1L, destHostId); |
| 1988 | + verify(clvmLockManagerMock, times(1)).setClvmLockHostId(2L, destHostId); |
| 1989 | + } |
| 1990 | + |
| 1991 | + @Test |
| 1992 | + public void testUpdateClvmLockHostForVmVolumes_WithNonClvmVolumes() throws Exception { |
| 1993 | + long vmId = 100L; |
| 1994 | + long destHostId = 2L; |
| 1995 | + long poolId = 10L; |
| 1996 | + |
| 1997 | + VolumeVO nfsVolume = mock(VolumeVO.class); |
| 1998 | + when(nfsVolume.getPoolId()).thenReturn(poolId); |
| 1999 | + |
| 2000 | + StoragePoolVO nfsPool = mock(StoragePoolVO.class); |
| 2001 | + when(nfsPool.getPoolType()).thenReturn(Storage.StoragePoolType.NetworkFilesystem); |
| 2002 | + |
| 2003 | + when(volumeDaoMock.findByInstance(vmId)).thenReturn(Arrays.asList(nfsVolume)); |
| 2004 | + when(storagePoolDaoMock.findById(poolId)).thenReturn(nfsPool); |
| 2005 | + |
| 2006 | + ClvmLockManager clvmLockManagerMock = mock(ClvmLockManager.class); |
| 2007 | + ReflectionTestUtils.setField(virtualMachineManagerImpl, "clvmLockManager", clvmLockManagerMock); |
| 2008 | + |
| 2009 | + Method method = VirtualMachineManagerImpl.class.getDeclaredMethod( |
| 2010 | + "updateClvmLockHostForVmVolumes", long.class, long.class); |
| 2011 | + method.setAccessible(true); |
| 2012 | + method.invoke(virtualMachineManagerImpl, vmId, destHostId); |
| 2013 | + |
| 2014 | + verify(clvmLockManagerMock, never()).setClvmLockHostId(anyLong(), anyLong()); |
| 2015 | + } |
| 2016 | + |
| 2017 | + @Test |
| 2018 | + public void testUpdateClvmLockHostForVmVolumes_WithMixedVolumes() throws Exception { |
| 2019 | + long vmId = 100L; |
| 2020 | + long destHostId = 2L; |
| 2021 | + long clvmPoolId = 10L; |
| 2022 | + long nfsPoolId = 20L; |
| 2023 | + |
| 2024 | + VolumeVO clvmVolume = mock(VolumeVO.class); |
| 2025 | + VolumeVO nfsVolume = mock(VolumeVO.class); |
| 2026 | + |
| 2027 | + when(clvmVolume.getId()).thenReturn(1L); |
| 2028 | + when(clvmVolume.getPoolId()).thenReturn(clvmPoolId); |
| 2029 | + when(nfsVolume.getPoolId()).thenReturn(nfsPoolId); |
| 2030 | + |
| 2031 | + StoragePoolVO clvmPool = mock(StoragePoolVO.class); |
| 2032 | + when(clvmPool.getPoolType()).thenReturn(Storage.StoragePoolType.CLVM); |
| 2033 | + |
| 2034 | + StoragePoolVO nfsPool = mock(StoragePoolVO.class); |
| 2035 | + when(nfsPool.getPoolType()).thenReturn(Storage.StoragePoolType.NetworkFilesystem); |
| 2036 | + |
| 2037 | + when(volumeDaoMock.findByInstance(vmId)).thenReturn(Arrays.asList(clvmVolume, nfsVolume)); |
| 2038 | + when(storagePoolDaoMock.findById(clvmPoolId)).thenReturn(clvmPool); |
| 2039 | + when(storagePoolDaoMock.findById(nfsPoolId)).thenReturn(nfsPool); |
| 2040 | + |
| 2041 | + ClvmLockManager clvmLockManagerMock = mock(ClvmLockManager.class); |
| 2042 | + ReflectionTestUtils.setField(virtualMachineManagerImpl, "clvmLockManager", clvmLockManagerMock); |
| 2043 | + |
| 2044 | + Method method = VirtualMachineManagerImpl.class.getDeclaredMethod( |
| 2045 | + "updateClvmLockHostForVmVolumes", long.class, long.class); |
| 2046 | + method.setAccessible(true); |
| 2047 | + method.invoke(virtualMachineManagerImpl, vmId, destHostId); |
| 2048 | + |
| 2049 | + verify(clvmLockManagerMock, times(1)).setClvmLockHostId(1L, destHostId); |
| 2050 | + verify(clvmLockManagerMock, never()).setClvmLockHostId(2L, destHostId); |
| 2051 | + } |
| 2052 | + |
| 2053 | + @Test |
| 2054 | + public void testUpdateClvmLockHostForVmVolumes_WithNoVolumes() throws Exception { |
| 2055 | + long vmId = 100L; |
| 2056 | + long destHostId = 2L; |
| 2057 | + |
| 2058 | + when(volumeDaoMock.findByInstance(vmId)).thenReturn(Collections.emptyList()); |
| 2059 | + |
| 2060 | + ClvmLockManager clvmLockManagerMock = mock(ClvmLockManager.class); |
| 2061 | + ReflectionTestUtils.setField(virtualMachineManagerImpl, "clvmLockManager", clvmLockManagerMock); |
| 2062 | + |
| 2063 | + Method method = VirtualMachineManagerImpl.class.getDeclaredMethod( |
| 2064 | + "updateClvmLockHostForVmVolumes", long.class, long.class); |
| 2065 | + method.setAccessible(true); |
| 2066 | + method.invoke(virtualMachineManagerImpl, vmId, destHostId); |
| 2067 | + |
| 2068 | + verify(clvmLockManagerMock, never()).setClvmLockHostId(anyLong(), anyLong()); |
| 2069 | + } |
| 2070 | + |
| 2071 | + @Test |
| 2072 | + public void testUpdateClvmLockHostForVmVolumes_WithNullPoolId() throws Exception { |
| 2073 | + long vmId = 100L; |
| 2074 | + long destHostId = 2L; |
| 2075 | + |
| 2076 | + VolumeVO volumeWithoutPool = mock(VolumeVO.class); |
| 2077 | + when(volumeWithoutPool.getPoolId()).thenReturn(null); |
| 2078 | + |
| 2079 | + when(volumeDaoMock.findByInstance(vmId)).thenReturn(Arrays.asList(volumeWithoutPool)); |
| 2080 | + |
| 2081 | + ClvmLockManager clvmLockManagerMock = mock(ClvmLockManager.class); |
| 2082 | + ReflectionTestUtils.setField(virtualMachineManagerImpl, "clvmLockManager", clvmLockManagerMock); |
| 2083 | + |
| 2084 | + Method method = VirtualMachineManagerImpl.class.getDeclaredMethod( |
| 2085 | + "updateClvmLockHostForVmVolumes", long.class, long.class); |
| 2086 | + method.setAccessible(true); |
| 2087 | + method.invoke(virtualMachineManagerImpl, vmId, destHostId); |
| 2088 | + |
| 2089 | + verify(storagePoolDaoMock, never()).findById(anyLong()); |
| 2090 | + verify(clvmLockManagerMock, never()).setClvmLockHostId(anyLong(), anyLong()); |
| 2091 | + } |
| 2092 | + |
| 2093 | + @Test |
| 2094 | + public void testUpdateClvmLockHostForVmVolumes_WithNullPool() throws Exception { |
| 2095 | + long vmId = 100L; |
| 2096 | + long destHostId = 2L; |
| 2097 | + long poolId = 10L; |
| 2098 | + |
| 2099 | + VolumeVO volume = mock(VolumeVO.class); |
| 2100 | + when(volume.getPoolId()).thenReturn(poolId); |
| 2101 | + |
| 2102 | + when(volumeDaoMock.findByInstance(vmId)).thenReturn(Arrays.asList(volume)); |
| 2103 | + when(storagePoolDaoMock.findById(poolId)).thenReturn(null); |
| 2104 | + |
| 2105 | + ClvmLockManager clvmLockManagerMock = mock(ClvmLockManager.class); |
| 2106 | + ReflectionTestUtils.setField(virtualMachineManagerImpl, "clvmLockManager", clvmLockManagerMock); |
| 2107 | + |
| 2108 | + Method method = VirtualMachineManagerImpl.class.getDeclaredMethod( |
| 2109 | + "updateClvmLockHostForVmVolumes", long.class, long.class); |
| 2110 | + method.setAccessible(true); |
| 2111 | + method.invoke(virtualMachineManagerImpl, vmId, destHostId); |
| 2112 | + |
| 2113 | + verify(clvmLockManagerMock, never()).setClvmLockHostId(anyLong(), anyLong()); |
| 2114 | + } |
| 2115 | + |
| 2116 | + @Test |
| 2117 | + public void testUpdateClvmLockHostForVmVolumes_MultipleClvmPools() throws Exception { |
| 2118 | + long vmId = 100L; |
| 2119 | + long destHostId = 2L; |
| 2120 | + long pool1Id = 10L; |
| 2121 | + long pool2Id = 20L; |
| 2122 | + |
| 2123 | + VolumeVO volume1 = mock(VolumeVO.class); |
| 2124 | + VolumeVO volume2 = mock(VolumeVO.class); |
| 2125 | + VolumeVO volume3 = mock(VolumeVO.class); |
| 2126 | + |
| 2127 | + when(volume1.getId()).thenReturn(1L); |
| 2128 | + when(volume1.getPoolId()).thenReturn(pool1Id); |
| 2129 | + when(volume2.getId()).thenReturn(2L); |
| 2130 | + when(volume2.getPoolId()).thenReturn(pool2Id); |
| 2131 | + when(volume3.getId()).thenReturn(3L); |
| 2132 | + when(volume3.getPoolId()).thenReturn(pool1Id); |
| 2133 | + |
| 2134 | + StoragePoolVO clvmPool1 = mock(StoragePoolVO.class); |
| 2135 | + when(clvmPool1.getPoolType()).thenReturn(Storage.StoragePoolType.CLVM); |
| 2136 | + |
| 2137 | + StoragePoolVO clvmPool2 = mock(StoragePoolVO.class); |
| 2138 | + when(clvmPool2.getPoolType()).thenReturn(Storage.StoragePoolType.CLVM); |
| 2139 | + |
| 2140 | + when(volumeDaoMock.findByInstance(vmId)).thenReturn(Arrays.asList(volume1, volume2, volume3)); |
| 2141 | + when(storagePoolDaoMock.findById(pool1Id)).thenReturn(clvmPool1); |
| 2142 | + when(storagePoolDaoMock.findById(pool2Id)).thenReturn(clvmPool2); |
| 2143 | + |
| 2144 | + ClvmLockManager clvmLockManagerMock = mock(ClvmLockManager.class); |
| 2145 | + ReflectionTestUtils.setField(virtualMachineManagerImpl, "clvmLockManager", clvmLockManagerMock); |
| 2146 | + |
| 2147 | + Method method = VirtualMachineManagerImpl.class.getDeclaredMethod( |
| 2148 | + "updateClvmLockHostForVmVolumes", long.class, long.class); |
| 2149 | + method.setAccessible(true); |
| 2150 | + method.invoke(virtualMachineManagerImpl, vmId, destHostId); |
| 2151 | + |
| 2152 | + verify(clvmLockManagerMock, times(1)).setClvmLockHostId(1L, destHostId); |
| 2153 | + verify(clvmLockManagerMock, times(1)).setClvmLockHostId(2L, destHostId); |
| 2154 | + verify(clvmLockManagerMock, times(1)).setClvmLockHostId(3L, destHostId); |
| 2155 | + } |
| 2156 | + |
1957 | 2157 | } |
0 commit comments