From 2d3f7340b67e0f0be792647d2063de2b54bdbce2 Mon Sep 17 00:00:00 2001 From: fuwei Date: Thu, 23 Nov 2023 10:04:30 +0800 Subject: [PATCH] [sugon_sdn]Fix tf port residuals when create vm failed and rollback --- .../zstack/compute/vm/VmAllocateNicFlow.java | 16 ++++++ .../org/zstack/compute/vm/VmInstanceBase.java | 3 -- .../compute/vm/VmPreAllocateNicFlow.java | 51 ------------------- conf/springConfigXml/VmInstanceManager.xml | 7 ++- .../neutronClient/TfPortClient.java | 2 +- .../network/TfPortService.java | 16 +++--- ...mPreAttachL3NetworkExtensionPointImpl.java | 2 +- 7 files changed, 31 insertions(+), 66 deletions(-) delete mode 100644 compute/src/main/java/org/zstack/compute/vm/VmPreAllocateNicFlow.java diff --git a/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicFlow.java index 9938090a3d..ffad880cef 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmAllocateNicFlow.java @@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Configurable; import org.zstack.core.Platform; import org.zstack.core.asyncbatch.While; import org.zstack.core.cloudbus.CloudBus; +import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; import org.zstack.core.db.SQLBatch; @@ -55,12 +56,22 @@ public class VmAllocateNicFlow implements Flow { private VmNicManager nicManager; @Autowired protected VmInstanceManager vmMgr; + @Autowired + protected PluginRegistry pluginRgty; @Override public void run(final FlowTrigger trigger, final Map data) { taskProgress("create nics"); final VmInstanceSpec spec = (VmInstanceSpec) data.get(VmInstanceConstant.Params.VmInstanceSpec.toString()); + List l3Networks = spec.getL3Networks(); + for (VmNicSpec l3Network : l3Networks) { + for (VmPreAttachL3NetworkExtensionPoint ext : pluginRgty.getExtensionList(VmPreAttachL3NetworkExtensionPoint.class)) { + for (L3NetworkInventory l3Inv : l3Network.getL3Invs()) { + ext.vmPreAttachL3Network(spec.getVmInventory(), l3Inv); + } + } + } final Map nicNetworkInfoMap = Optional.ofNullable(data.get(VmInstanceConstant.Params.VmAllocateNicFlow_nicNetworkInfo.toString())) .map(obj -> (Map) obj) @@ -233,6 +244,11 @@ public class VmAllocateNicFlow implements Flow { return; } logger.debug(String.format("%s nic need for delete", destNics.size())); + for (VmNicInventory vmNic : destNics) { + for (VmDetachNicExtensionPoint ext : pluginRgty.getExtensionList(VmDetachNicExtensionPoint.class)) { + ext.afterDetachNic(vmNic); + } + } dbf.removeByPrimaryKeys(destNics.stream().map(VmNicInventory::getUuid).collect(Collectors.toList()), VmNicVO.class); chain.rollback(); return; diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java index aa82c5ad08..e57b7dfcd0 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java @@ -2197,9 +2197,6 @@ public class VmInstanceBase extends AbstractVmInstance { L3NetworkVO l3vo = dbf.findByUuid(l3Uuid, L3NetworkVO.class); final L3NetworkInventory l3 = L3NetworkInventory.valueOf(l3vo); l3s.add(l3); - for (VmPreAttachL3NetworkExtensionPoint ext : pluginRgty.getExtensionList(VmPreAttachL3NetworkExtensionPoint.class)) { - ext.vmPreAttachL3Network(vm, l3); - } } spec.setL3Networks(list(new VmNicSpec(l3s))); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmPreAllocateNicFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmPreAllocateNicFlow.java deleted file mode 100644 index 6ca17d1178..0000000000 --- a/compute/src/main/java/org/zstack/compute/vm/VmPreAllocateNicFlow.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.zstack.compute.vm; - -import org.springframework.beans.factory.annotation.Autowire; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Configurable; -import org.zstack.core.componentloader.PluginRegistry; -import org.zstack.core.db.DatabaseFacade; -import org.zstack.header.core.workflow.Flow; -import org.zstack.header.core.workflow.FlowRollback; -import org.zstack.header.core.workflow.FlowTrigger; -import org.zstack.header.network.l3.L3NetworkInventory; -import org.zstack.header.vm.*; -import org.zstack.utils.Utils; -import org.zstack.utils.logging.CLogger; - -import java.util.List; -import java.util.Map; - -@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) -public class VmPreAllocateNicFlow implements Flow { - private static final CLogger logger = Utils.getLogger(VmPreAllocateNicFlow.class); - @Autowired - protected DatabaseFacade dbf; - @Autowired - protected PluginRegistry pluginRgty; - - @Override - public void run(final FlowTrigger trigger, final Map data) { - final VmInstanceSpec spec = (VmInstanceSpec) data.get(VmInstanceConstant.Params.VmInstanceSpec.toString()); - List l3Networks = spec.getL3Networks(); - for (VmNicSpec l3Network : l3Networks) { - for (VmPreAttachL3NetworkExtensionPoint ext : pluginRgty.getExtensionList(VmPreAttachL3NetworkExtensionPoint.class)) { - for (L3NetworkInventory l3Inv : l3Network.getL3Invs()) { - ext.vmPreAttachL3Network(spec.getVmInventory(), l3Inv); - } - } - } - trigger.next(); - } - - @Override - public void rollback(FlowRollback trigger, Map data) { - final VmInstanceSpec spec = (VmInstanceSpec) data.get(VmInstanceConstant.Params.VmInstanceSpec.toString()); - for (VmNicInventory vmNic : spec.getVmInventory().getVmNics()) { - for (VmDetachNicExtensionPoint ext : pluginRgty.getExtensionList(VmDetachNicExtensionPoint.class)) { - ext.afterDetachNic(vmNic); - } - } - trigger.rollback(); - } -} diff --git a/conf/springConfigXml/VmInstanceManager.xml b/conf/springConfigXml/VmInstanceManager.xml index 950c23244c..ef3d5a7cc9 100755 --- a/conf/springConfigXml/VmInstanceManager.xml +++ b/conf/springConfigXml/VmInstanceManager.xml @@ -34,8 +34,7 @@ org.zstack.compute.vm.VmImageSelectBackupStorageFlow org.zstack.compute.vm.VmAllocateHostAndPrimaryStorageFlow - org.zstack.compute.vm.VmAllocateVolumeFlow - org.zstack.compute.vm.VmPreAllocateNicFlow + org.zstack.compute.vm.VmAllocateVolumeFlow org.zstack.compute.vm.VmAllocateNicFlow org.zstack.compute.vm.VmAllocateNicIpFlow org.zstack.compute.vm.VmAllocateCdRomFlow @@ -88,8 +87,8 @@ org.zstack.compute.vm.VmDestroyOnHypervisorFlow org.zstack.compute.vm.VmReturnHostFlow org.zstack.compute.vm.VmReleaseResourceFlow - org.zstack.compute.vm.VmReturnReleaseNicFlow - org.zstack.compute.vm.VmPostReleaseNicFlow + org.zstack.compute.vm.VmReturnReleaseNicFlow + org.zstack.compute.vm.VmPostReleaseNicFlow org.zstack.compute.vm.VmDeleteVolumeFlow diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/neutronClient/TfPortClient.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/neutronClient/TfPortClient.java index 366a63ac9b..0251d480d6 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/neutronClient/TfPortClient.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/neutronClient/TfPortClient.java @@ -432,7 +432,7 @@ public class TfPortClient { if (CollectionUtils.isNotEmpty(floatingIps)) { for (ObjectReference fip : floatingIps) { FloatingIp fipObj = (FloatingIp) client.findById(FloatingIp.class, fip.getUuid()); - if (fipObj.getAddress().equals(ipAddr)) { + if (fipObj.getAddress() != null && fipObj.getAddress().equals(ipAddr)) { return true; } } diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfPortService.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfPortService.java index 846e0a0bcf..c4767689bd 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfPortService.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfPortService.java @@ -64,9 +64,11 @@ public class TfPortService { String vmName = vm.getName(); try { - boolean availability = tfPortClient.checkTfIpAvailability(customIp, l3.getUuid()); - if (availability){ - customIp = null; + if (customIp != null && !customIp.isEmpty()) { + boolean availability = tfPortClient.checkTfIpAvailability(customIp, l3.getUuid()); + if (availability){ + throw new RuntimeException(String.format("Can not allocate IP[%s] from tf.", customIp)); + } } } catch (IOException e) { throw new RuntimeException(e); @@ -89,9 +91,11 @@ public class TfPortService { String tfPortUuid = StringDSL.transToTfUuid(portUuid); try { - boolean availability = tfPortClient.checkTfIpAvailability(ip, l3.getUuid()); - if (availability){ - ip = null; + if (ip != null && !ip.isEmpty()) { + boolean availability = tfPortClient.checkTfIpAvailability(ip, l3.getUuid()); + if (availability){ + throw new RuntimeException(String.format("Can not allocate IP[%s] from tf.", ip)); + } } } catch (IOException e) { throw new RuntimeException(e); diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/VmPreAttachL3NetworkExtensionPointImpl.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/VmPreAttachL3NetworkExtensionPointImpl.java index c2e8d33aba..ac9bc51ef6 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/VmPreAttachL3NetworkExtensionPointImpl.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/VmPreAttachL3NetworkExtensionPointImpl.java @@ -40,7 +40,7 @@ public class VmPreAttachL3NetworkExtensionPointImpl implements VmPreAttachL3Netw tfPortUuid = StringDSL.transToTfUuid(nicAttach.getUuid()); TfPortResponse port = tfPortService.getTfPort(tfPortUuid); if (port != null) { - tfPortService.updateTfPort(tfPortUuid, vm.getUuid(), null); + tfPortService.updateTfPort(nicAttach.getUuid(), vm.getUuid(), null); return; } } -- Gitee