Skip to content

Commit 6726387

Browse files
committed
when destroy the vms, delete the tags from virtual router
1 parent 6323aac commit 6726387

3 files changed

Lines changed: 90 additions & 0 deletions

File tree

server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
import javax.inject.Inject;
4040
import javax.naming.ConfigurationException;
4141

42+
import com.cloud.server.ResourceTag;
43+
import com.cloud.server.TaggedResourceService;
4244
import org.apache.cloudstack.acl.ControlledEntity.ACLType;
4345
import org.apache.cloudstack.acl.SecurityChecker.AccessType;
4446
import org.apache.cloudstack.affinity.AffinityGroupService;
@@ -472,6 +474,8 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
472474
private TemplateApiService _tmplService;
473475
@Inject
474476
private ConfigurationDao _configDao;
477+
@Inject
478+
private TaggedResourceService _taggedResourceService;
475479

476480
private ScheduledExecutorService _executor = null;
477481
private ScheduledExecutorService _vmIpFetchExecutor = null;
@@ -2818,6 +2822,28 @@ public UserVm destroyVm(DestroyVMCmd cmd) throws ResourceUnavailableException, C
28182822
return destroyedVm;
28192823
}
28202824

2825+
protected Boolean removeTagsFromVm(long vmId) {
2826+
UserVmVO vm = _vmDao.findById(vmId);
2827+
Long resourceId = _taggedResourceService.getResourceId(vm.getUuid(), ResourceTag.ResourceObjectType.UserVm);
2828+
List<? extends ResourceTag> resourceTags = _taggedResourceService.listByResourceTypeAndId(ResourceTag.ResourceObjectType.UserVm, resourceId);
2829+
if (resourceTags.size() > 0) {
2830+
List<String> resourceIds = Arrays.asList(vm.getUuid());
2831+
Map<String, String> tags = new HashMap<>();
2832+
return _taggedResourceService.deleteTags(resourceIds, ResourceTag.ResourceObjectType.UserVm, tags);
2833+
} else {
2834+
return false;
2835+
}
2836+
2837+
}
2838+
2839+
public void setTaggedResourceService(TaggedResourceService taggedResourceServiceMock) {
2840+
_taggedResourceService = taggedResourceServiceMock;
2841+
}
2842+
2843+
public void setVmDao(UserVmDao userVmMock) {
2844+
_vmDao = userVmMock;
2845+
}
2846+
28212847
private List<VolumeVO> getVolumesFromIds(DestroyVMCmd cmd) {
28222848
List<VolumeVO> volumes = new ArrayList<>();
28232849
if (cmd.getVolumeIds() != null) {
@@ -4601,17 +4627,23 @@ public UserVm destroyVm(long vmId, boolean expunge) throws ResourceUnavailableEx
46014627
}
46024628

46034629
boolean status;
4630+
boolean resultRemovedTags;
46044631
State vmState = vm.getState();
46054632

46064633
try {
46074634
VirtualMachineEntity vmEntity = _orchSrvc.getVirtualMachine(vm.getUuid());
46084635
status = vmEntity.destroy(Long.toString(userId), expunge);
4636+
resultRemovedTags = removeTagsFromVm(vmId);
46094637
} catch (CloudException e) {
46104638
CloudRuntimeException ex = new CloudRuntimeException("Unable to destroy with specified vmId", e);
46114639
ex.addProxyObject(vm.getUuid(), "vmId");
46124640
throw ex;
46134641
}
46144642

4643+
if (!resultRemovedTags) {
4644+
s_logger.error("Error to delete tags or tags not exists, for the vm with id " + vmId);
4645+
}
4646+
46154647
if (status) {
46164648
// Mark the account's volumes as destroyed
46174649
List<VolumeVO> volumes = _volsDao.findByInstance(vmId);

server/src/test/java/com/cloud/user/AccountManagerImplVolumeDeleteEventTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import java.util.List;
3434
import java.util.Map;
3535

36+
import com.cloud.tags.TaggedResourceManagerImpl;
37+
import com.cloud.vm.dao.UserVmDao;
3638
import org.apache.cloudstack.acl.ControlledEntity;
3739
import org.apache.cloudstack.acl.SecurityChecker.AccessType;
3840
import org.apache.cloudstack.engine.cloud.entity.api.VirtualMachineEntity;
@@ -68,6 +70,9 @@ public class AccountManagerImplVolumeDeleteEventTest extends AccountManagetImplT
6870
UserVmManagerImpl _vmMgr;
6971
Map<String, Object> oldFields = new HashMap<>();
7072
UserVmVO vm = mock(UserVmVO.class);
73+
TaggedResourceManagerImpl taggedResourceManagerMock = mock(TaggedResourceManagerImpl.class);
74+
75+
7176

7277
// Configures the static fields of the UsageEventUtils class, Storing the
7378
// previous values to be restored during the cleanup phase, to avoid
@@ -138,6 +143,9 @@ protected void defineMocksBehavior() throws AgentUnavailableException, Concurren
138143
when(_serviceOfferingDao.findByIdIncludingRemoved(anyLong(), anyLong())).thenReturn(offering);
139144

140145
when(_domainMgr.getDomain(anyLong())).thenReturn(domain);
146+
Mockito.when(vm.getUuid()).thenReturn("1l");
147+
_vmMgr.setTaggedResourceService(taggedResourceManagerMock);
148+
141149

142150
Mockito.doReturn(true).when(_vmMgr).expunge(any(UserVmVO.class), anyLong(), any(Account.class));
143151

server/src/test/java/com/cloud/vm/UserVmManagerImplTest.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,14 @@
1717
package com.cloud.vm;
1818

1919
import java.util.ArrayList;
20+
import java.util.Arrays;
2021
import java.util.HashMap;
22+
import java.util.List;
23+
import java.util.Map;
2124

25+
import com.cloud.server.ResourceTag;
26+
import com.cloud.tags.ResourceTagVO;
27+
import com.cloud.tags.TaggedResourceManagerImpl;
2228
import org.apache.cloudstack.api.BaseCmd.HTTPMethod;
2329
import org.apache.cloudstack.api.command.user.vm.UpdateVMCmd;
2430
import org.apache.cloudstack.context.CallContext;
@@ -76,6 +82,9 @@ public class UserVmManagerImplTest {
7682
@Mock
7783
private NetworkModel networkModel;
7884

85+
@Mock
86+
private TaggedResourceManagerImpl taggedResourceManagerMock;
87+
7988
private long vmId = 1l;
8089

8190
@Before
@@ -276,4 +285,45 @@ private void configureValidateOrReplaceMacAddressTest(int times, String macAddre
276285
Mockito.verify(networkModel, Mockito.times(times)).getNextAvailableMacAddressInNetwork(Mockito.anyLong());
277286
Assert.assertEquals(expectedMacAddress, returnedMacAddress);
278287
}
288+
289+
@Test
290+
public void validateRemoveTagsWhenExists() {
291+
292+
List<ResourceTag> resourceTags = Arrays.asList(new ResourceTagVO("test", "test", 1l, 2l,
293+
2l, ResourceTag.ResourceObjectType.UserVm, "", "test"));
294+
295+
Map<String, String> tags = new HashMap<>();
296+
List<String> resourceIds = Arrays.asList("123");
297+
298+
userVmManagerImpl.setVmDao(userVmDao);
299+
userVmManagerImpl.setTaggedResourceService(taggedResourceManagerMock);
300+
301+
Mockito.when(taggedResourceManagerMock.getUuid("123", ResourceTag.ResourceObjectType.UserVm)).thenReturn("123");
302+
Mockito.when(taggedResourceManagerMock.deleteTags(resourceIds, ResourceTag.ResourceObjectType.UserVm, tags)).thenReturn(true);
303+
Mockito.<List<? extends ResourceTag>>when(taggedResourceManagerMock.listByResourceTypeAndId(ResourceTag.ResourceObjectType.UserVm, 0)).thenReturn(resourceTags);
304+
305+
306+
Mockito.when(userVmVoMock.getUuid()).thenReturn("123");
307+
Mockito.when(userVmDao.findById(Mockito.eq(vmId))).thenReturn(userVmVoMock);
308+
309+
Boolean result = userVmManagerImpl.removeTagsFromVm(1l);
310+
Assert.assertTrue(result);
311+
}
312+
313+
314+
@Test
315+
public void validateWhenRemoveTagsNoExists() {
316+
317+
List<ResourceTag> resourceTags = Arrays.asList();
318+
319+
userVmManagerImpl.setVmDao(userVmDao);
320+
userVmManagerImpl.setTaggedResourceService(taggedResourceManagerMock);
321+
322+
Mockito.<List<? extends ResourceTag>>when(taggedResourceManagerMock.listByResourceTypeAndId(ResourceTag.ResourceObjectType.UserVm, 123)).thenReturn(resourceTags);
323+
Mockito.when(userVmVoMock.getUuid()).thenReturn("123");
324+
Mockito.when(userVmDao.findById(Mockito.eq(vmId))).thenReturn(userVmVoMock);
325+
326+
Boolean result = userVmManagerImpl.removeTagsFromVm(1l);
327+
Assert.assertFalse(result);
328+
}
279329
}

0 commit comments

Comments
 (0)