From 33122247ace3a1fe53a06025bef19c973cb2f1da Mon Sep 17 00:00:00 2001 From: zhangzujian Date: Thu, 23 Mar 2023 13:54:40 +0800 Subject: [PATCH] fix lsp deletion failure when external-ids:ls is empty --- pkg/ovs/ovn-nb-logical_switch.go | 26 ++++++++++++++++++++++++++ pkg/ovs/ovn-nb-logical_switch_port.go | 6 +----- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/pkg/ovs/ovn-nb-logical_switch.go b/pkg/ovs/ovn-nb-logical_switch.go index 4782bb27799..4b48255cf1f 100644 --- a/pkg/ovs/ovn-nb-logical_switch.go +++ b/pkg/ovs/ovn-nb-logical_switch.go @@ -7,6 +7,7 @@ import ( "github.com/ovn-org/libovsdb/model" "github.com/ovn-org/libovsdb/ovsdb" + "k8s.io/klog/v2" "github.com/kubeovn/kube-ovn/pkg/ovsdb/ovnnb" "github.com/kubeovn/kube-ovn/pkg/util" @@ -237,6 +238,31 @@ func (c *ovnClient) LogicalSwitchUpdatePortOp(lsName string, lspUUID string, op return nil, nil } + if lsName == "" { + lsList, err := c.ListLogicalSwitch(false, func(ls *ovnnb.LogicalSwitch) bool { + return util.ContainsString(ls.Ports, lspUUID) + }) + if err != nil { + klog.Error(err) + return nil, fmt.Errorf("failed to list LS by LSP UUID %s: %v", lspUUID, err) + } + if len(lsList) == 0 { + err = fmt.Errorf("no LS found for LSP %s", lspUUID) + klog.Error(err) + return nil, err + } + if len(lsList) != 1 { + lsNames := make([]string, len(lsList)) + for _, ls := range lsList { + lsNames = append(lsNames, ls.Name) + } + err = fmt.Errorf("multiple LS found for LSP %s: %s", lspUUID, strings.Join(lsNames, ", ")) + klog.Error(err) + return nil, err + } + lsName = lsList[0].Name + } + mutation := func(ls *ovnnb.LogicalSwitch) *model.Mutation { mutation := &model.Mutation{ Field: &ls.Ports, diff --git a/pkg/ovs/ovn-nb-logical_switch_port.go b/pkg/ovs/ovn-nb-logical_switch_port.go index 9742b34686f..0f5ad588b28 100644 --- a/pkg/ovs/ovn-nb-logical_switch_port.go +++ b/pkg/ovs/ovn-nb-logical_switch_port.go @@ -575,12 +575,8 @@ func (c *ovnClient) DeleteLogicalSwitchPortOp(lspName string) ([]ovsdb.Operation return nil, nil } - lsName, ok := lsp.ExternalIDs[logicalSwitchKey] - if !ok { - return nil, fmt.Errorf("no %s exist in lsp's external_ids", logicalSwitchKey) - } - // remove logical switch port from logical switch + lsName := lsp.ExternalIDs[logicalSwitchKey] lspRemoveOp, err := c.LogicalSwitchUpdatePortOp(lsName, lsp.UUID, ovsdb.MutateOperationDelete) if err != nil { return nil, fmt.Errorf("generate operations for removing port %s from logical switch %s: %v", lspName, lsName, err)