Skip to content

Commit f086bec

Browse files
committed
Fix datadisks not removed
1 parent 1396b91 commit f086bec

File tree

2 files changed

+70
-4
lines changed

2 files changed

+70
-4
lines changed

server/src/main/java/com/cloud/resource/ResourceManagerImpl.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838

3939
import com.cloud.exception.StorageConflictException;
4040
import com.cloud.exception.StorageUnavailableException;
41+
import com.cloud.storage.Volume;
4142
import com.cloud.storage.VolumeVO;
4243
import com.cloud.storage.dao.VolumeDao;
4344
import org.apache.cloudstack.annotation.AnnotationService;
@@ -1016,10 +1017,24 @@ public void doInTransactionWithoutResult(final TransactionStatus status) {
10161017
return true;
10171018
}
10181019

1019-
private void destroyLocalStoragePoolVolumes(long poolId) {
1020-
List<VolumeVO> volumes = volumeDao.findByPoolId(poolId);
1021-
for (VolumeVO volume : volumes) {
1022-
volumeDao.updateAndRemoveVolume(volume);
1020+
private void addVolumesToList(List<VolumeVO> volumes, List<VolumeVO> volumesToAdd) {
1021+
if (CollectionUtils.isNotEmpty(volumesToAdd)) {
1022+
volumes.addAll(volumesToAdd);
1023+
}
1024+
}
1025+
1026+
protected void destroyLocalStoragePoolVolumes(long poolId) {
1027+
List<VolumeVO> rootDisks = volumeDao.findByPoolId(poolId);
1028+
List<VolumeVO> dataVolumes = volumeDao.findByPoolId(poolId, Volume.Type.DATADISK);
1029+
1030+
List<VolumeVO> volumes = new ArrayList<>();
1031+
addVolumesToList(volumes, rootDisks);
1032+
addVolumesToList(volumes, dataVolumes);
1033+
1034+
if (CollectionUtils.isNotEmpty(volumes)) {
1035+
for (VolumeVO volume : volumes) {
1036+
volumeDao.updateAndRemoveVolume(volume);
1037+
}
10231038
}
10241039
}
10251040

server/src/test/java/com/cloud/resource/ResourceManagerImplTest.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,13 @@
3434

3535
import java.util.ArrayList;
3636
import java.util.Arrays;
37+
import java.util.Collections;
3738
import java.util.List;
3839
import java.util.UUID;
3940

41+
import com.cloud.storage.Volume;
42+
import com.cloud.storage.VolumeVO;
43+
import com.cloud.storage.dao.VolumeDao;
4044
import org.apache.cloudstack.api.command.admin.host.CancelHostAsDegradedCmd;
4145
import org.apache.cloudstack.api.command.admin.host.DeclareHostAsDegradedCmd;
4246
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
@@ -98,6 +102,8 @@ public class ResourceManagerImplTest {
98102
private VMInstanceDao vmInstanceDao;
99103
@Mock
100104
private ConfigurationDao configurationDao;
105+
@Mock
106+
private VolumeDao volumeDao;
101107

102108
@Spy
103109
@InjectMocks
@@ -119,6 +125,13 @@ public class ResourceManagerImplTest {
119125
@Mock
120126
private GetVncPortCommand getVncPortCommandVm2;
121127

128+
@Mock
129+
private VolumeVO rootDisk1;
130+
@Mock
131+
private VolumeVO rootDisk2;
132+
@Mock
133+
private VolumeVO dataDisk;
134+
122135
@Mock
123136
private Connection sshConnection;
124137

@@ -138,6 +151,10 @@ public class ResourceManagerImplTest {
138151
private static String vm2VncAddress = "10.2.2.2";
139152
private static int vm2VncPort = 5901;
140153

154+
private static long poolId = 1L;
155+
private List<VolumeVO> rootDisks;
156+
private List<VolumeVO> dataDisks;
157+
141158
@Before
142159
public void setup() throws Exception {
143160
MockitoAnnotations.initMocks(this);
@@ -179,6 +196,11 @@ public void setup() throws Exception {
179196
willReturn(new SSHCmdHelper.SSHCmdResult(0,"",""));
180197

181198
when(configurationDao.getValue(ResourceManager.KvmSshToAgentEnabled.key())).thenReturn("true");
199+
200+
rootDisks = Arrays.asList(rootDisk1, rootDisk2);
201+
dataDisks = Collections.singletonList(dataDisk);
202+
when(volumeDao.findByPoolId(poolId)).thenReturn(rootDisks);
203+
when(volumeDao.findByPoolId(poolId, Volume.Type.DATADISK)).thenReturn(dataDisks);
182204
}
183205

184206
@Test
@@ -527,4 +549,33 @@ private HostVO createDummyHost(Status hostStatus) {
527549
return new HostVO(1L, "host01", Host.Type.Routing, "192.168.1.1", "255.255.255.0", null, null, null, null, null, null, null, null, null, null, UUID.randomUUID().toString(),
528550
hostStatus, "1.0", null, null, 1L, null, 0, 0, null, 0, null);
529551
}
552+
553+
@Test
554+
public void testDestroyLocalStoragePoolVolumesBothRootDisksAndDataDisks() {
555+
resourceManager.destroyLocalStoragePoolVolumes(poolId);
556+
verify(volumeDao, times(rootDisks.size() + dataDisks.size()))
557+
.updateAndRemoveVolume(any(VolumeVO.class));
558+
}
559+
560+
@Test
561+
public void testDestroyLocalStoragePoolVolumesOnlyRootDisks() {
562+
when(volumeDao.findByPoolId(poolId, Volume.Type.DATADISK)).thenReturn(null);
563+
resourceManager.destroyLocalStoragePoolVolumes(poolId);
564+
verify(volumeDao, times(rootDisks.size())).updateAndRemoveVolume(any(VolumeVO.class));
565+
}
566+
567+
@Test
568+
public void testDestroyLocalStoragePoolVolumesOnlyDataDisks() {
569+
when(volumeDao.findByPoolId(poolId)).thenReturn(null);
570+
resourceManager.destroyLocalStoragePoolVolumes(poolId);
571+
verify(volumeDao, times(dataDisks.size())).updateAndRemoveVolume(any(VolumeVO.class));
572+
}
573+
574+
@Test
575+
public void testDestroyLocalStoragePoolVolumesNoDisks() {
576+
when(volumeDao.findByPoolId(poolId)).thenReturn(null);
577+
when(volumeDao.findByPoolId(poolId, Volume.Type.DATADISK)).thenReturn(null);
578+
resourceManager.destroyLocalStoragePoolVolumes(poolId);
579+
verify(volumeDao, never()).updateAndRemoveVolume(any(VolumeVO.class));
580+
}
530581
}

0 commit comments

Comments
 (0)