Skip to content

Commit 080f171

Browse files
authored
NSX: Cleanup NSX resources during k8s cluster cleanup (#8528)
1 parent 2aee0fb commit 080f171

File tree

7 files changed

+66
-16
lines changed

7 files changed

+66
-16
lines changed

api/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterHelper.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,5 @@
2222
public interface KubernetesClusterHelper extends Adapter {
2323

2424
ControlledEntity findByUuid(String uuid);
25+
ControlledEntity findByVmId(long vmId);
2526
}

plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterHelperImpl.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,25 +17,38 @@
1717
package com.cloud.kubernetes.cluster;
1818

1919
import com.cloud.kubernetes.cluster.dao.KubernetesClusterDao;
20+
import com.cloud.kubernetes.cluster.dao.KubernetesClusterVmMapDao;
2021
import com.cloud.utils.component.AdapterBase;
2122
import org.apache.cloudstack.acl.ControlledEntity;
2223
import org.apache.cloudstack.framework.config.ConfigKey;
2324
import org.apache.cloudstack.framework.config.Configurable;
2425
import org.springframework.stereotype.Component;
2526

2627
import javax.inject.Inject;
28+
import java.util.Objects;
2729

2830
@Component
2931
public class KubernetesClusterHelperImpl extends AdapterBase implements KubernetesClusterHelper, Configurable {
3032

3133
@Inject
3234
private KubernetesClusterDao kubernetesClusterDao;
35+
@Inject
36+
private KubernetesClusterVmMapDao kubernetesClusterVmMapDao;
3337

3438
@Override
3539
public ControlledEntity findByUuid(String uuid) {
3640
return kubernetesClusterDao.findByUuid(uuid);
3741
}
3842

43+
@Override
44+
public ControlledEntity findByVmId(long vmId) {
45+
KubernetesClusterVmMapVO clusterVmMapVO = kubernetesClusterVmMapDao.getClusterMapFromVmId(vmId);
46+
if (Objects.isNull(clusterVmMapVO)) {
47+
return null;
48+
}
49+
return kubernetesClusterDao.findById(clusterVmMapVO.getClusterId());
50+
}
51+
3952
@Override
4053
public String getConfigComponentName() {
4154
return KubernetesClusterHelper.class.getSimpleName();

plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/dao/KubernetesClusterVmMapDao.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323

2424
public interface KubernetesClusterVmMapDao extends GenericDao<KubernetesClusterVmMapVO, Long> {
2525
public List<KubernetesClusterVmMapVO> listByClusterId(long clusterId);
26+
27+
public KubernetesClusterVmMapVO getClusterMapFromVmId(long vmId);
2628
public List<KubernetesClusterVmMapVO> listByClusterIdAndVmIdsIn(long clusterId, List<Long> vmIds);
2729

2830
int removeByClusterIdAndVmIdsIn(long clusterId, List<Long> vmIds);

plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/dao/KubernetesClusterVmMapDaoImpl.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,17 @@
3131
public class KubernetesClusterVmMapDaoImpl extends GenericDaoBase<KubernetesClusterVmMapVO, Long> implements KubernetesClusterVmMapDao {
3232

3333
private final SearchBuilder<KubernetesClusterVmMapVO> clusterIdSearch;
34+
private final SearchBuilder<KubernetesClusterVmMapVO> vmIdSearch;
3435

3536
public KubernetesClusterVmMapDaoImpl() {
3637
clusterIdSearch = createSearchBuilder();
3738
clusterIdSearch.and("clusterId", clusterIdSearch.entity().getClusterId(), SearchCriteria.Op.EQ);
3839
clusterIdSearch.and("vmIdsIN", clusterIdSearch.entity().getVmId(), SearchCriteria.Op.IN);
3940
clusterIdSearch.done();
41+
42+
vmIdSearch = createSearchBuilder();
43+
vmIdSearch.and("vmId", vmIdSearch.entity().getVmId(), SearchCriteria.Op.EQ);
44+
vmIdSearch.done();
4045
}
4146

4247
@Override
@@ -47,6 +52,13 @@ public List<KubernetesClusterVmMapVO> listByClusterId(long clusterId) {
4752
return listBy(sc, filter);
4853
}
4954

55+
@Override
56+
public KubernetesClusterVmMapVO getClusterMapFromVmId(long vmId) {
57+
SearchCriteria<KubernetesClusterVmMapVO> sc = vmIdSearch.create();
58+
sc.setParameters("vmId", vmId);
59+
return findOneBy(sc);
60+
}
61+
5062
@Override
5163
public List<KubernetesClusterVmMapVO> listByClusterIdAndVmIdsIn(long clusterId, List<Long> vmIds) {
5264
SearchCriteria<KubernetesClusterVmMapVO> sc = clusterIdSearch.create();

plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxElement.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -505,10 +505,12 @@ public boolean applyPFRules(Network network, List<PortForwardingRule> rules) thr
505505
if (!canHandle(network, Network.Service.PortForwarding)) {
506506
return false;
507507
}
508+
boolean result = true;
508509
for (PortForwardingRule rule : rules) {
509510
IPAddressVO publicIp = ApiDBUtils.findIpAddressById(rule.getSourceIpAddressId());
510511
UserVm vm = ApiDBUtils.findUserVmById(rule.getVirtualMachineId());
511-
if (vm == null || networkModel.getNicInNetwork(vm.getId(), network.getId()) == null) {
512+
if ((vm == null && (rule.getState() != FirewallRule.State.Revoke)) ||
513+
(vm != null && networkModel.getNicInNetwork(vm.getId(), network.getId()) == null)) {
512514
continue;
513515
}
514516
NsxOpObject nsxObject = getNsxOpObject(network);
@@ -523,21 +525,21 @@ public boolean applyPFRules(Network network, List<PortForwardingRule> rules) thr
523525
.setNetworkResourceId(nsxObject.getNetworkResourceId())
524526
.setNetworkResourceName(nsxObject.getNetworkResourceName())
525527
.setVpcResource(nsxObject.isVpcResource())
526-
.setVmId(vm.getId())
527-
.setVmIp(vm.getPrivateIpAddress())
528+
.setVmId(Objects.nonNull(vm) ? vm.getId() : 0)
529+
.setVmIp(Objects.nonNull(vm) ? vm.getPrivateIpAddress() : null)
528530
.setPublicIp(publicIp.getAddress().addr())
529531
.setPrivatePort(privatePort)
530532
.setPublicPort(publicPort)
531533
.setRuleId(rule.getId())
532534
.setProtocol(rule.getProtocol().toUpperCase(Locale.ROOT))
533535
.build();
534536
if (rule.getState() == FirewallRule.State.Add) {
535-
return nsxService.createPortForwardRule(networkRule);
537+
result &= nsxService.createPortForwardRule(networkRule);
536538
} else if (rule.getState() == FirewallRule.State.Revoke) {
537-
return nsxService.deletePortForwardRule(networkRule);
539+
result &= nsxService.deletePortForwardRule(networkRule);
538540
}
539541
}
540-
return true;
542+
return result;
541543
}
542544

543545
public Pair<VpcVO, NetworkVO> getVpcOrNetwork(Long vpcId, long networkId) {
@@ -613,6 +615,7 @@ private NsxOpObject getNsxOpObject(Network network) {
613615

614616
@Override
615617
public boolean applyLBRules(Network network, List<LoadBalancingRule> rules) throws ResourceUnavailableException {
618+
boolean result = true;
616619
for (LoadBalancingRule loadBalancingRule : rules) {
617620
if (loadBalancingRule.getState() == FirewallRule.State.Active) {
618621
continue;
@@ -638,12 +641,12 @@ public boolean applyLBRules(Network network, List<LoadBalancingRule> rules) thro
638641
.setAlgorithm(loadBalancingRule.getAlgorithm())
639642
.build();
640643
if (loadBalancingRule.getState() == FirewallRule.State.Add) {
641-
return nsxService.createLbRule(networkRule);
644+
result &= nsxService.createLbRule(networkRule);
642645
} else if (loadBalancingRule.getState() == FirewallRule.State.Revoke) {
643-
return nsxService.deleteLbRule(networkRule);
646+
result &= nsxService.deleteLbRule(networkRule);
644647
}
645648
}
646-
return true;
649+
return result;
647650
}
648651

649652
@Override

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

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@
5151
import javax.xml.parsers.DocumentBuilder;
5252
import javax.xml.parsers.ParserConfigurationException;
5353

54+
import com.cloud.kubernetes.cluster.KubernetesClusterHelper;
55+
import com.cloud.network.dao.NsxProviderDao;
56+
import com.cloud.network.element.NsxProviderVO;
5457
import org.apache.cloudstack.acl.ControlledEntity;
5558
import org.apache.cloudstack.acl.ControlledEntity.ACLType;
5659
import org.apache.cloudstack.acl.SecurityChecker.AccessType;
@@ -589,6 +592,8 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
589592

590593
@Inject
591594
VMScheduleManager vmScheduleManager;
595+
@Inject
596+
NsxProviderDao nsxProviderDao;
592597

593598
private ScheduledExecutorService _executor = null;
594599
private ScheduledExecutorService _vmIpFetchExecutor = null;
@@ -597,6 +602,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
597602
private boolean _dailyOrHourly = false;
598603
private int capacityReleaseInterval;
599604
private ExecutorService _vmIpFetchThreadExecutor;
605+
private List<KubernetesClusterHelper> kubernetesClusterHelpers;
600606

601607

602608
private String _instance;
@@ -610,6 +616,14 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
610616
private static final int NUM_OF_2K_BLOCKS = 512;
611617
private static final int MAX_HTTP_POST_LENGTH = NUM_OF_2K_BLOCKS * MAX_USER_DATA_LENGTH_BYTES;
612618

619+
public List<KubernetesClusterHelper> getKubernetesClusterHelpers() {
620+
return kubernetesClusterHelpers;
621+
}
622+
623+
public void setKubernetesClusterHelpers(final List<KubernetesClusterHelper> kubernetesClusterHelpers) {
624+
this.kubernetesClusterHelpers = kubernetesClusterHelpers;
625+
}
626+
613627
@Inject
614628
private OrchestrationService _orchSrvc;
615629

@@ -2528,11 +2542,15 @@ private boolean cleanupVmResources(long vmId) {
25282542
}
25292543

25302544
// cleanup port forwarding rules
2531-
if (_rulesMgr.revokePortForwardingRulesForVm(vmId)) {
2532-
s_logger.debug("Port forwarding rules are removed successfully as a part of vm id=" + vmId + " expunge");
2533-
} else {
2534-
success = false;
2535-
s_logger.warn("Fail to remove port forwarding rules as a part of vm id=" + vmId + " expunge");
2545+
VMInstanceVO vmInstanceVO = _vmInstanceDao.findById(vmId);
2546+
NsxProviderVO nsx = nsxProviderDao.findByZoneId(vmInstanceVO.getDataCenterId());
2547+
if (Objects.isNull(nsx) || Objects.isNull(kubernetesClusterHelpers.get(0).findByVmId(vmId))) {
2548+
if (_rulesMgr.revokePortForwardingRulesForVm(vmId)) {
2549+
s_logger.debug("Port forwarding rules are removed successfully as a part of vm id=" + vmId + " expunge");
2550+
} else {
2551+
success = false;
2552+
s_logger.warn("Fail to remove port forwarding rules as a part of vm id=" + vmId + " expunge");
2553+
}
25362554
}
25372555

25382556
// cleanup load balancer rules

server/src/main/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,9 @@
106106

107107
<bean id="configurationServerImpl" class="com.cloud.server.ConfigurationServerImpl" />
108108

109-
110-
<bean id="userVmManagerImpl" class="com.cloud.vm.UserVmManagerImpl" />
109+
<bean id="userVmManagerImpl" class="com.cloud.vm.UserVmManagerImpl">
110+
<property name="kubernetesClusterHelpers" value="#{kubernetesClusterHelperRegistry.registered}" />
111+
</bean>
111112

112113
<bean id="consoleProxyManagerImpl" class="com.cloud.consoleproxy.ConsoleProxyManagerImpl">
113114
<property name="consoleProxyAllocators"

0 commit comments

Comments
 (0)