From fd4a2bb5553bdf893ffe61cb95eda735ba4d5a45 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Mon, 30 Mar 2026 23:36:17 +0800 Subject: [PATCH] [flatNetwork]: delete namespace and dnsmasq when disabling DHCP without userdata service (ZSTAC-78498) When disabling DHCP service on an L3 network, if userdata service is not also enabled, the namespace and dnsmasq process should be deleted entirely. Previously the code always called flushDhcpConfig which only flushed DHCP config but kept the namespace alive (to avoid breaking shared userdata usage). Now it checks whether userdata is also enabled: if not, it calls deleteNameSpace to clean up dnsmasq and the network namespace completely. --- .../network/service/flat/FlatDhcpBackend.java | 47 ++++++++++++------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java index ecc0c14e2e..44d45cf1ca 100755 --- a/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java +++ b/plugin/flatNetworkProvider/src/main/java/org/zstack/network/service/flat/FlatDhcpBackend.java @@ -57,6 +57,7 @@ import org.zstack.network.service.NetworkServiceManager; import org.zstack.network.service.NetworkServiceProviderLookup; import org.zstack.network.service.flat.IpStatisticConstants.VmType; +import org.zstack.network.service.userdata.UserdataConstant; import org.zstack.network.service.vip.VipVO; import org.zstack.header.network.service.SdnControllerDhcp; import org.zstack.sdnController.SdnControllerManager; @@ -2855,27 +2856,41 @@ public void disableNetworkService(L3NetworkVO l3VO, Completion completion) { return; } - flushDhcpConfig(L3NetworkInventory.valueOf(l3VO), new Completion(completion) { - @Override - public void success() { - Map dhcpServerMap = getExistingDhcpServerIp(l3VO.getUuid(), IPv6Constants.DUAL_STACK); - if (dhcpServerMap.isEmpty()) { + // If userdata service is also enabled on this L3 network, the namespace is shared, + // so only flush DHCP config. Otherwise, delete the namespace and dnsmasq entirely. + String userdataProviderType = new NetworkProviderFinder().getNetworkProviderTypeByNetworkServiceType( + l3VO.getUuid(), UserdataConstant.USERDATA_TYPE_STRING); + boolean userdataEnabled = userdataProviderType != null; + + if (userdataEnabled) { + flushDhcpConfig(L3NetworkInventory.valueOf(l3VO), new Completion(completion) { + @Override + public void success() { + Map dhcpServerMap = getExistingDhcpServerIp(l3VO.getUuid(), IPv6Constants.DUAL_STACK); + if (dhcpServerMap.isEmpty()) { + completion.success(); + return; + } + + for (Map.Entry e : dhcpServerMap.entrySet()) { + deleteDhcpServerIp(l3VO.getUuid(), e.getKey(), e.getValue()); + } + completion.success(); - return; } - for (Map.Entry e : dhcpServerMap.entrySet()) { - deleteDhcpServerIp(l3VO.getUuid(), e.getKey(), e.getValue()); + @Override + public void fail(ErrorCode errorCode) { + completion.fail(errorCode); } - - completion.success(); - } - - @Override - public void fail(ErrorCode errorCode) { - completion.fail(errorCode); + }); + } else { + Map dhcpServerMap = getExistingDhcpServerIp(l3VO.getUuid(), IPv6Constants.DUAL_STACK); + for (Map.Entry e : dhcpServerMap.entrySet()) { + deleteDhcpServerIp(l3VO.getUuid(), e.getKey(), e.getValue()); } - }); + deleteNameSpace(L3NetworkInventory.valueOf(l3VO), completion); + } } private void doArpingOnHost(CheckIpAvailabilityMsg msg, HostInventory host, L2NetworkInventory l2Inv, ReturnValueCompletion> completion) {