Skip to content

Commit 53298f2

Browse files
committed
honor delete volumes when delete vm requests
Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
1 parent a0bdfcf commit 53298f2

6 files changed

Lines changed: 19 additions & 9 deletions

File tree

engine/schema/src/main/java/com/cloud/storage/dao/VolumeDao.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ public interface VolumeDao extends GenericDao<VolumeVO, Long>, StateDao<Volume.S
4848

4949
List<VolumeVO> findByInstanceAndNotStates(long id, Volume.State...states);
5050

51-
5251
List<VolumeVO> findIncludingRemovedByInstanceAndType(long id, Volume.Type vType);
5352

5453
List<VolumeVO> findNonDestroyedVolumesByInstanceIdAndPoolId(long instanceId, long poolId);

plugins/integrations/veeam-control-service/src/main/java/org/apache/cloudstack/veeam/adapter/ServerAdapter.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -568,7 +568,8 @@ protected GuestOS getGuestOsForInstance(Vm request, boolean isWorkerVm) {
568568
os = guestOSDao.findOneByDisplayName(guestOsName);
569569
}
570570
if (os == null) {
571-
logger.debug("Guest OS could not be identified with ID: {} and name: {} for the VM request", os);
571+
logger.debug("Guest OS could not be identified with ID: {} and name: {} for the VM request",
572+
guestOsId, guestOsName);
572573
}
573574
return os;
574575
}
@@ -1311,7 +1312,7 @@ public Vm updateInstance(String uuid, Vm request) {
13111312
}
13121313

13131314
@ApiAccess(command = DestroyVMCmd.class)
1314-
public VmAction deleteInstance(String uuid, boolean async) {
1315+
public VmAction deleteInstance(String uuid, boolean deleteVolumes, boolean async) {
13151316
UserVmVO vo = userVmDao.findByUuid(uuid);
13161317
if (vo == null) {
13171318
throw new InvalidParameterValueException("VM with ID " + uuid + " not found");
@@ -1324,6 +1325,15 @@ public VmAction deleteInstance(String uuid, boolean async) {
13241325
Map<String, String> params = new HashMap<>();
13251326
params.put(ApiConstants.ID, vo.getUuid());
13261327
params.put(ApiConstants.EXPUNGE, Boolean.TRUE.toString());
1328+
if (deleteVolumes) {
1329+
List<String>volumeIds = volumeDao.findByInstance(vo.getId()).stream()
1330+
.filter(v -> Volume.Type.DATADISK.equals(v.getVolumeType()))
1331+
.map(VolumeVO::getUuid)
1332+
.collect(Collectors.toList());
1333+
if (CollectionUtils.isNotEmpty(volumeIds)) {
1334+
params.put(ApiConstants.VOLUME_IDS, String.join(",", volumeIds));
1335+
}
1336+
}
13271337
if (isAdmin) {
13281338
params.put(ApiConstants.FORCED, Boolean.TRUE.toString());
13291339
}

plugins/integrations/veeam-control-service/src/main/java/org/apache/cloudstack/veeam/api/VmsRouteHandler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,8 +299,9 @@ protected void handleUpdateById(final String id, final HttpServletRequest req, f
299299
protected void handleDeleteById(final String id, final HttpServletRequest req, final HttpServletResponse resp,
300300
final Negotiation.OutFormat outFormat, final VeeamControlServlet io) throws IOException {
301301
boolean async = RouteHandler.isRequestAsync(req);
302+
boolean deleteVolumes = Boolean.FALSE.toString().equals(req.getParameter("detach_only"));
302303
try {
303-
VmAction vm = serverAdapter.deleteInstance(id, async);
304+
VmAction vm = serverAdapter.deleteInstance(id, deleteVolumes, async);
304305
io.getWriter().write(resp, HttpServletResponse.SC_OK, vm, outFormat);
305306
} catch (CloudRuntimeException e) {
306307
io.badRequest(resp, e.getMessage(), outFormat);

plugins/integrations/veeam-control-service/src/main/java/org/apache/cloudstack/veeam/api/dto/OvfXmlUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -821,7 +821,7 @@ private static void updateFromXmlCloudStackMetadataSection(Vm vm, Node metadataS
821821
}
822822
String guestOsName = xpathString(xpath, metadataSection, ".//*[local-name()='GuestOsName']/text()");
823823
if (StringUtils.isNotBlank(guestOsName)) {
824-
vm.setGuestOsId(guestOsName);
824+
vm.setGuestOsName(guestOsName);
825825
}
826826
String instanceType = xpathString(xpath, metadataSection, ".//*[local-name()='Type']/text()");
827827
if (StringUtils.isNotBlank(instanceType)) {

plugins/integrations/veeam-control-service/src/test/java/org/apache/cloudstack/veeam/adapter/ServerAdapterTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -925,7 +925,7 @@ public void testGetInstance_NotFound_Throws() {
925925
@Test(expected = InvalidParameterValueException.class)
926926
public void testDeleteInstance_VmNotFound_Throws() {
927927
when(userVmDao.findByUuid("vm-uuid")).thenReturn(null);
928-
serverAdapter.deleteInstance("vm-uuid", false);
928+
serverAdapter.deleteInstance("vm-uuid", true, false);
929929
}
930930

931931

plugins/integrations/veeam-control-service/src/test/java/org/apache/cloudstack/veeam/api/VmsRouteHandlerTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public void testHandleGetByIdDeleteAndPowerActions() throws Exception {
105105
stopAction.setStatus("stopping");
106106
final VmAction shutdownAction = new VmAction();
107107
shutdownAction.setStatus("shutting_down");
108-
when(handler.serverAdapter.deleteInstance("vm-1", true)).thenReturn(deleteAction);
108+
when(handler.serverAdapter.deleteInstance("vm-1", true, true)).thenReturn(deleteAction);
109109
when(handler.serverAdapter.startInstance("vm-1", false)).thenReturn(startAction);
110110
when(handler.serverAdapter.stopInstance("vm-1", false)).thenReturn(stopAction);
111111
when(handler.serverAdapter.shutdownInstance("vm-1", false)).thenReturn(shutdownAction);
@@ -119,9 +119,9 @@ public void testHandleGetByIdDeleteAndPowerActions() throws Exception {
119119
assertContains(get.body(), "\"id\":\"vm-1\"");
120120

121121
final ResponseCapture delete = newResponse();
122-
handler.handle(newRequest("DELETE", Map.of("async", "true"), null, null), delete.response,
122+
handler.handle(newRequest("DELETE", Map.of("async", "true", "detach_only", "false"), null, null), delete.response,
123123
"/api/vms/vm-1", Negotiation.OutFormat.JSON, newServlet());
124-
verify(handler.serverAdapter).deleteInstance("vm-1", true);
124+
verify(handler.serverAdapter).deleteInstance("vm-1", true, true);
125125
verify(delete.response).setStatus(200);
126126
assertContains(delete.body(), "deleted");
127127

0 commit comments

Comments
 (0)