Skip to content

Commit 62b7d8e

Browse files
committed
when destroy the vms, delete the tags from virtual router (squash commits)
1 parent 6323aac commit 62b7d8e

4 files changed

Lines changed: 76 additions & 0 deletions

File tree

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

Lines changed: 15 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,16 @@ public UserVm destroyVm(DestroyVMCmd cmd) throws ResourceUnavailableException, C
28182822
return destroyedVm;
28192823
}
28202824

2825+
protected void 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+
_taggedResourceService.deleteTags(resourceIds, ResourceTag.ResourceObjectType.UserVm, null);
2832+
}
2833+
}
2834+
28212835
private List<VolumeVO> getVolumesFromIds(DestroyVMCmd cmd) {
28222836
List<VolumeVO> volumes = new ArrayList<>();
28232837
if (cmd.getVolumeIds() != null) {
@@ -4606,6 +4620,7 @@ public UserVm destroyVm(long vmId, boolean expunge) throws ResourceUnavailableEx
46064620
try {
46074621
VirtualMachineEntity vmEntity = _orchSrvc.getVirtualMachine(vm.getUuid());
46084622
status = vmEntity.destroy(Long.toString(userId), expunge);
4623+
removeTagsFromVm(vmId);
46094624
} catch (CloudException e) {
46104625
CloudRuntimeException ex = new CloudRuntimeException("Unable to destroy with specified vmId", e);
46114626
ex.addProxyObject(vm.getUuid(), "vmId");

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

Lines changed: 7 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.server.ResourceTag;
37+
import com.cloud.tags.TaggedResourceManagerImpl;
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,8 @@ public class AccountManagerImplVolumeDeleteEventTest extends AccountManagetImplT
6870
UserVmManagerImpl _vmMgr;
6971
Map<String, Object> oldFields = new HashMap<>();
7072
UserVmVO vm = mock(UserVmVO.class);
73+
TaggedResourceManagerImpl taggedResourceManager = mock(TaggedResourceManagerImpl.class);
74+
7175

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

140144
when(_domainMgr.getDomain(anyLong())).thenReturn(domain);
145+
Mockito.when(vm.getUuid()).thenReturn("1l");
146+
Mockito.when(taggedResourceManager.getResourceId("123", ResourceTag.ResourceObjectType.UserVm)).thenReturn(Long.valueOf(123));
147+
141148

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

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ public class AccountManagetImplTestBase {
198198
@Mock
199199
UsageEventDao _usageEventDao;
200200

201+
201202
@Before
202203
public void setup() {
203204
accountManagerImpl.setUserAuthenticators(Arrays.asList(userAuthenticator));

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

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,22 @@
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;
2123

24+
import com.cloud.server.ResourceTag;
25+
import com.cloud.tags.ResourceTagVO;
26+
import com.cloud.tags.TaggedResourceManagerImpl;
27+
import com.cloud.tags.dao.ResourceTagDao;
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;
2531
import org.junit.Assert;
2632
import org.junit.Before;
2733
import org.junit.Test;
2834
import org.junit.runner.RunWith;
35+
2936
import org.mockito.BDDMockito;
3037
import org.mockito.InjectMocks;
3138
import org.mockito.Mock;
@@ -76,6 +83,13 @@ public class UserVmManagerImplTest {
7683
@Mock
7784
private NetworkModel networkModel;
7885

86+
@Mock
87+
private TaggedResourceManagerImpl taggedResourceManagerMock;
88+
89+
@Mock
90+
private ResourceTagDao resourceTagDaoMock;
91+
92+
7993
private long vmId = 1l;
8094

8195
@Before
@@ -276,4 +290,43 @@ private void configureValidateOrReplaceMacAddressTest(int times, String macAddre
276290
Mockito.verify(networkModel, Mockito.times(times)).getNextAvailableMacAddressInNetwork(Mockito.anyLong());
277291
Assert.assertEquals(expectedMacAddress, returnedMacAddress);
278292
}
293+
294+
@Test
295+
public void validateRemoveTagsWhenExists() {
296+
297+
List<ResourceTag> resourceTags = Arrays.asList(new ResourceTagVO("test", "test", 1l, 2l,
298+
Long.valueOf(123), ResourceTag.ResourceObjectType.UserVm, "", "test"));
299+
300+
List<String> resourceIds = Arrays.asList("123");
301+
302+
Mockito.when(taggedResourceManagerMock.getUuid("123", ResourceTag.ResourceObjectType.UserVm)).thenReturn("123");
303+
Mockito.when(taggedResourceManagerMock.getResourceId("123", ResourceTag.ResourceObjectType.UserVm)).thenReturn(Long.valueOf(123));
304+
305+
Mockito.<List<? extends ResourceTag>>when(taggedResourceManagerMock.listByResourceTypeAndId(ResourceTag.ResourceObjectType.UserVm, Long.valueOf(123))).thenReturn(resourceTags);
306+
Mockito.when(taggedResourceManagerMock.deleteTags(resourceIds, ResourceTag.ResourceObjectType.UserVm, null)).thenReturn(true);
307+
308+
Mockito.when(userVmDao.findById(123l)).thenReturn(userVmVoMock);
309+
Mockito.when(userVmVoMock.getUuid()).thenReturn("123");
310+
311+
312+
userVmManagerImpl.removeTagsFromVm(Long.valueOf(123));
313+
Assert.assertTrue(taggedResourceManagerMock.deleteTags(resourceIds, ResourceTag.ResourceObjectType.UserVm, null));
314+
}
315+
316+
317+
@Test
318+
public void validateWhenRemoveTagsNoExists() {
319+
320+
List<ResourceTag> resourceTags = Arrays.asList();
321+
322+
Mockito.when(taggedResourceManagerMock.getResourceId("1l", ResourceTag.ResourceObjectType.UserVm)).thenReturn(1l);
323+
Mockito.<List<? extends ResourceTag>>when(taggedResourceManagerMock.listByResourceTypeAndId(ResourceTag.ResourceObjectType.UserVm, 1l)).thenReturn(resourceTags);
324+
325+
Mockito.when(userVmVoMock.getUuid()).thenReturn("1l");
326+
327+
Mockito.when(userVmDao.findById(Mockito.eq(vmId))).thenReturn(userVmVoMock);
328+
329+
userVmManagerImpl.removeTagsFromVm(1l);
330+
Assert.assertEquals(0, taggedResourceManagerMock.listByResourceTypeAndId(ResourceTag.ResourceObjectType.UserVm, 1l).size());
331+
}
279332
}

0 commit comments

Comments
 (0)