From e19620b0aad1abbb61b5046789aa6c406d590f5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=A5=96=E5=BB=BA?= <zhangzujian.7@gmail.com> Date: Tue, 28 Mar 2023 09:53:12 +0800 Subject: [PATCH] fix lrp deletion after upgrade (#2548) --- pkg/ovs/ovn-nb-logical_router.go | 27 +++++++++++++++++++++++++++ pkg/ovs/ovn-nb-logical_router_port.go | 6 +----- pkg/ovs/ovn-nb-logical_switch.go | 6 +++--- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/pkg/ovs/ovn-nb-logical_router.go b/pkg/ovs/ovn-nb-logical_router.go index b367f9299d2..5d5a17e1c72 100644 --- a/pkg/ovs/ovn-nb-logical_router.go +++ b/pkg/ovs/ovn-nb-logical_router.go @@ -3,9 +3,11 @@ package ovs import ( "context" "fmt" + "strings" "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" @@ -155,6 +157,31 @@ func (c *ovnClient) LogicalRouterUpdatePortOp(lrName, lrpUUID string, op ovsdb.M return nil, nil } + if lrName == "" && op == ovsdb.MutateOperationDelete { + lrList, err := c.ListLogicalRouter(false, func(lr *ovnnb.LogicalRouter) bool { + return util.ContainsString(lr.Ports, lrpUUID) + }) + if err != nil { + klog.Error(err) + return nil, fmt.Errorf("failed to list LR by LRP UUID %s: %v", lrpUUID, err) + } + if len(lrList) == 0 { + err = fmt.Errorf("no LR found for LRP %s", lrpUUID) + klog.Error(err) + return nil, err + } + if len(lrList) != 1 { + lrNames := make([]string, len(lrList)) + for i := range lrList { + lrNames[i] = lrList[i].Name + } + err = fmt.Errorf("multiple LR found for LRP %s: %s", lrpUUID, strings.Join(lrNames, ", ")) + klog.Error(err) + return nil, err + } + lrName = lrList[0].Name + } + mutation := func(lr *ovnnb.LogicalRouter) *model.Mutation { mutation := &model.Mutation{ Field: &lr.Ports, diff --git a/pkg/ovs/ovn-nb-logical_router_port.go b/pkg/ovs/ovn-nb-logical_router_port.go index b9c5b589972..5c0550070fd 100644 --- a/pkg/ovs/ovn-nb-logical_router_port.go +++ b/pkg/ovs/ovn-nb-logical_router_port.go @@ -268,12 +268,8 @@ func (c *ovnClient) DeleteLogicalRouterPortOp(lrpName string) ([]ovsdb.Operation return nil, nil } - lrName, ok := lrp.ExternalIDs[logicalRouterKey] - if !ok { - return nil, fmt.Errorf("key %s does not exist in external_ids of lrp %s", logicalRouterKey, lrpName) - } - // remove logical router port from logical router + lrName := lrp.ExternalIDs[logicalRouterKey] lrpRemoveOp, err := c.LogicalRouterUpdatePortOp(lrName, lrp.UUID, ovsdb.MutateOperationDelete) if err != nil { return nil, err diff --git a/pkg/ovs/ovn-nb-logical_switch.go b/pkg/ovs/ovn-nb-logical_switch.go index 4b48255cf1f..57a692e89f3 100644 --- a/pkg/ovs/ovn-nb-logical_switch.go +++ b/pkg/ovs/ovn-nb-logical_switch.go @@ -238,7 +238,7 @@ func (c *ovnClient) LogicalSwitchUpdatePortOp(lsName string, lspUUID string, op return nil, nil } - if lsName == "" { + if lsName == "" && op == ovsdb.MutateOperationDelete { lsList, err := c.ListLogicalSwitch(false, func(ls *ovnnb.LogicalSwitch) bool { return util.ContainsString(ls.Ports, lspUUID) }) @@ -253,8 +253,8 @@ func (c *ovnClient) LogicalSwitchUpdatePortOp(lsName string, lspUUID string, op } if len(lsList) != 1 { lsNames := make([]string, len(lsList)) - for _, ls := range lsList { - lsNames = append(lsNames, ls.Name) + for i := range lsList { + lsNames[i] = lsList[i].Name } err = fmt.Errorf("multiple LS found for LSP %s: %s", lspUUID, strings.Join(lsNames, ", ")) klog.Error(err)