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)