diff --git a/go.mod b/go.mod index 6ce9c523fe3..67de53476a1 100644 --- a/go.mod +++ b/go.mod @@ -15,6 +15,7 @@ require ( github.com/emicklei/go-restful/v3 v3.11.2 github.com/evanphx/json-patch/v5 v5.9.0 github.com/go-logr/stdr v1.2.2 + github.com/google/uuid v1.6.0 github.com/greenpau/ovsdb v1.0.3 github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.4.0 github.com/k8snetworkplumbingwg/sriovnet v1.2.0 @@ -35,7 +36,6 @@ require ( github.com/stretchr/testify v1.8.4 github.com/vishvananda/netlink v1.2.1-beta.2 go.uber.org/mock v0.4.0 - golang.org/x/exp v0.0.0-20240213143201-ec583247a57a golang.org/x/mod v0.15.0 golang.org/x/sys v0.17.0 golang.org/x/time v0.5.0 @@ -136,7 +136,6 @@ require ( github.com/google/pprof v0.0.0-20231205033806-a5a03c77bf08 // indirect github.com/google/s2a-go v0.1.7 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect - github.com/google/uuid v1.5.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/gopherjs/gopherjs v1.17.2 // indirect @@ -234,6 +233,7 @@ require ( go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.26.0 // indirect golang.org/x/crypto v0.19.0 // indirect + golang.org/x/exp v0.0.0-20240213143201-ec583247a57a // indirect golang.org/x/net v0.21.0 // indirect golang.org/x/oauth2 v0.17.0 // indirect golang.org/x/sync v0.6.0 // indirect @@ -288,7 +288,7 @@ replace ( github.com/greenpau/ovsdb => github.com/kubeovn/ovsdb v0.0.0-20221213053943-9372db56919f github.com/mdlayher/arp => github.com/kubeovn/arp v0.0.0-20230101053045-8a0772d9c34c github.com/openshift/client-go => github.com/openshift/client-go v0.0.1 - github.com/ovn-org/libovsdb => github.com/kubeovn/libovsdb v0.0.0-20231209085152-808225c763d2 + github.com/ovn-org/libovsdb => github.com/kubeovn/libovsdb v0.0.0-20240218023647-f0bc3ce57fcd github.com/vishvananda/netlink => github.com/kubeovn/netlink v0.0.0-20231209083855-5aa6b7ec69db k8s.io/api => k8s.io/api v0.28.7 k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.28.7 diff --git a/go.sum b/go.sum index f228580b308..8771a9f2e02 100644 --- a/go.sum +++ b/go.sum @@ -1277,8 +1277,8 @@ github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= -github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= @@ -1502,8 +1502,8 @@ github.com/kubeovn/gonetworkmanager/v2 v2.0.0-20230905082151-e28c4d73a589 h1:y9e github.com/kubeovn/gonetworkmanager/v2 v2.0.0-20230905082151-e28c4d73a589/go.mod h1:49upX+/hUyppWIqu58cumojyIwXdkA8k6reA/mQlKuI= github.com/kubeovn/kubevirt-client-go v0.0.0-20230824060608-c0b4509b6928 h1:ASa4j2h2jUstenFf64HfASHJLXHCKDRWsE4/2ZrxypE= github.com/kubeovn/kubevirt-client-go v0.0.0-20230824060608-c0b4509b6928/go.mod h1:Zi7yR8JrLttxQvCLhl2qgLRejwMMUXvP0JcYnCGCm1k= -github.com/kubeovn/libovsdb v0.0.0-20231209085152-808225c763d2 h1:QLulBZARt5l74SWxT+TSyFd2ERAfSZjnbVqP/+DkYSQ= -github.com/kubeovn/libovsdb v0.0.0-20231209085152-808225c763d2/go.mod h1:u3l/31rCmkSHkbDyOl6MDLrsezMm9zm1T10f1v64dhk= +github.com/kubeovn/libovsdb v0.0.0-20240218023647-f0bc3ce57fcd h1:GhgvSBFKEkVNgDq8IslC04NVuoznreZH/Imz/cr6bhs= +github.com/kubeovn/libovsdb v0.0.0-20240218023647-f0bc3ce57fcd/go.mod h1:pTnlGt1JZrncr6pJn/Fhnp3FFTMQRaTVxiSKBLVGa5s= github.com/kubeovn/netlink v0.0.0-20231209083855-5aa6b7ec69db h1:ZAJlnKa9PmbtwPV4v7d3WceMGcP86ibk9k5PMMjoOkg= github.com/kubeovn/netlink v0.0.0-20231209083855-5aa6b7ec69db/go.mod h1:0QQVM/KWyMo/++lyr/YrAF8n7iUvPViPFt8w4Ggb9yI= github.com/kubeovn/ovsdb v0.0.0-20221213053943-9372db56919f h1:nm0ZlQesCje/A5D0LyWfaSUM8/0ro9PVpwd8hVbLBeM= diff --git a/pkg/ovs/ovn-nb-acl_test.go b/pkg/ovs/ovn-nb-acl_test.go index 86434ab9f7a..b1f5b03deb7 100644 --- a/pkg/ovs/ovn-nb-acl_test.go +++ b/pkg/ovs/ovn-nb-acl_test.go @@ -1420,7 +1420,13 @@ func (suite *OvnClientTestSuite) testGetACL() { priority := "2000" match := "ip4.dst == 100.64.0.0/16" - err := ovnClient.CreateBareACL(pgName, ovnnb.ACLDirectionToLport, priority, match, ovnnb.ACLActionAllowRelated) + err := ovnClient.CreatePortGroup(pgName, nil) + require.NoError(t, err) + + acl, err := ovnClient.newACL(pgName, ovnnb.ACLDirectionToLport, priority, match, ovnnb.ACLActionAllowRelated) + require.NoError(t, err) + + err = ovnClient.CreateAcls(pgName, portGroupKey, acl) require.NoError(t, err) t.Run("direction, priority and match are same", func(t *testing.T) { @@ -1469,18 +1475,27 @@ func (suite *OvnClientTestSuite) testListAcls() { pgName := "test-list-acl-pg" basePort := 50000 + err := ovnClient.CreatePortGroup(pgName, nil) + require.NoError(t, err) + matchPrefix := "outport == @ovn.sg.test_list_acl_pg && ip" // create two to-lport acl for i := 0; i < 2; i++ { match := fmt.Sprintf("%s && tcp.dst == %d", matchPrefix, basePort+i) - err := ovnClient.CreateBareACL(pgName, ovnnb.ACLDirectionToLport, "9999", match, ovnnb.ACLActionAllowRelated) + acl, err := ovnClient.newACL(pgName, ovnnb.ACLDirectionToLport, "9999", match, ovnnb.ACLActionAllowRelated) + require.NoError(t, err) + + err = ovnClient.CreateAcls(pgName, portGroupKey, acl) require.NoError(t, err) } // create two from-lport acl for i := 0; i < 3; i++ { match := fmt.Sprintf("%s && tcp.dst == %d", matchPrefix, basePort+i) - err := ovnClient.CreateBareACL(pgName, ovnnb.ACLDirectionFromLport, "9999", match, ovnnb.ACLActionAllowRelated) + acl, err := ovnClient.newACL(pgName, ovnnb.ACLDirectionFromLport, "9999", match, ovnnb.ACLActionAllowRelated) + require.NoError(t, err) + + err = ovnClient.CreateAcls(pgName, portGroupKey, acl) require.NoError(t, err) } diff --git a/pkg/ovs/ovn-nb-bfd_test.go b/pkg/ovs/ovn-nb-bfd_test.go index ef2eb9437bd..441af1b101d 100644 --- a/pkg/ovs/ovn-nb-bfd_test.go +++ b/pkg/ovs/ovn-nb-bfd_test.go @@ -81,7 +81,7 @@ func (suite *OvnClientTestSuite) testDeleteBFD() { t.Parallel() ovnClient := suite.ovnClient - lrpName := "test-list-bfd" + lrpName := "test-del-bfd" dstIP1 := "192.168.124.4" dstIP2 := "192.168.124.5" minRx1, minTx1, detectMult1 := 101, 102, 19 diff --git a/pkg/ovs/ovn-nb-gateway_chassis.go b/pkg/ovs/ovn-nb-gateway_chassis.go index 2bdb2c7b694..20c9bc1db3d 100644 --- a/pkg/ovs/ovn-nb-gateway_chassis.go +++ b/pkg/ovs/ovn-nb-gateway_chassis.go @@ -53,22 +53,33 @@ func (c *OVNNbClient) DeleteGatewayChassises(lrpName string, chassises []string) return nil } - ops := make([]ovsdb.Operation, 0, len(chassises)) + lrp, err := c.GetLogicalRouterPort(lrpName, false) + if err != nil { + klog.Error(err) + return err + } + ops := make([]ovsdb.Operation, 0, len(chassises)*2) for _, chassisName := range chassises { gwChassisName := lrpName + "-" + chassisName - op, err := c.DeleteGatewayChassisOp(gwChassisName) + uuid, delOps, err := c.DeleteGatewayChassisOp(gwChassisName) if err != nil { klog.Error(err) return nil } - // ignore non-existent object - if len(op) == 0 { - continue + mutateOps, err := c.Where(lrp).Mutate(lrp, model.Mutation{ + Field: &lrp.GatewayChassis, + Value: []string{uuid}, + Mutator: ovsdb.MutateOperationDelete, + }) + if err != nil { + klog.Error(err) + return nil } - ops = append(ops, op...) + ops = append(ops, mutateOps...) + ops = append(ops, delOps...) } if err := c.Transact("gateway-chassises-delete", ops); err != nil { @@ -203,23 +214,22 @@ func (c *OVNNbClient) CreateGatewayChassisesOp(lrpName string, chassises []strin } // DeleteGatewayChassisOp create operation which delete gateway chassis -func (c *OVNNbClient) DeleteGatewayChassisOp(chassisName string) ([]ovsdb.Operation, error) { +func (c *OVNNbClient) DeleteGatewayChassisOp(chassisName string) (uuid string, ops []ovsdb.Operation, err error) { gwChassis, err := c.GetGatewayChassis(chassisName, true) if err != nil { klog.Error(err) - return nil, err + return "", nil, err } // not found, skip if gwChassis == nil { - return nil, nil + return "", nil, nil } - op, err := c.Where(gwChassis).Delete() - if err != nil { + if ops, err = c.Where(gwChassis).Delete(); err != nil { klog.Error(err) - return nil, err + return "", nil, err } - return op, nil + return gwChassis.UUID, ops, nil } diff --git a/pkg/ovs/ovn-nb-gateway_chassis_test.go b/pkg/ovs/ovn-nb-gateway_chassis_test.go index c119e5fd226..42d48f213b7 100644 --- a/pkg/ovs/ovn-nb-gateway_chassis_test.go +++ b/pkg/ovs/ovn-nb-gateway_chassis_test.go @@ -4,9 +4,7 @@ import ( "github.com/ovn-org/libovsdb/ovsdb" "github.com/stretchr/testify/require" - ovsclient "github.com/kubeovn/kube-ovn/pkg/ovsdb/client" "github.com/kubeovn/kube-ovn/pkg/ovsdb/ovnnb" - "github.com/kubeovn/kube-ovn/pkg/util" ) func (suite *OvnClientTestSuite) testCreateGatewayChassises() { @@ -14,29 +12,29 @@ func (suite *OvnClientTestSuite) testCreateGatewayChassises() { t.Parallel() ovnClient := suite.ovnClient + lrName := "test-create-gateway-chassises-lr" + lrpName := "test-create-gateway-chassises-lrp" chassises := []string{"c7efec70-9519-4b03-8b67-057f2a95e5c7", "4a0891b6-fe81-4986-a367-aad0ea7ca9f3", "dcc2eda3-b3ea-4d53-afe0-7b6eaf7917ba"} - lrp := &ovnnb.LogicalRouterPort{ - UUID: ovsclient.NamedUUID(), - Name: "test-create-gateway-chassises", - ExternalIDs: map[string]string{ - "vendor": util.CniTypeName, - }, - } + err := ovnClient.CreateLogicalRouter(lrName) + require.NoError(t, err) - err := createLogicalRouterPort(ovnClient, lrp) + err = ovnClient.CreateLogicalRouterPort(lrName, lrpName, "00:11:22:37:af:62", []string{"fd00::c0a8:1001/120"}) require.NoError(t, err) - err = ovnClient.CreateGatewayChassises(lrp.Name, chassises...) + err = ovnClient.CreateGatewayChassises(lrpName, chassises...) require.NoError(t, err) - lrp, err = ovnClient.GetLogicalRouterPort(lrp.Name, false) + lrp, err := ovnClient.GetLogicalRouterPort(lrpName, false) require.NoError(t, err) + require.NotNil(t, lrp) + require.Len(t, lrp.GatewayChassis, len(chassises)) for i, chassisName := range chassises { gwChassisName := lrp.Name + "-" + chassisName gwChassis, err := ovnClient.GetGatewayChassis(gwChassisName, false) require.NoError(t, err) + require.NotNil(t, gwChassis) require.Equal(t, gwChassisName, gwChassis.Name) require.Equal(t, chassisName, gwChassis.ChassisName) require.Equal(t, 100-i, gwChassis.Priority) @@ -49,18 +47,14 @@ func (suite *OvnClientTestSuite) testDeleteGatewayChassises() { t.Parallel() ovnClient := suite.ovnClient + lrName := "test-gateway-chassis-del-lr" lrpName := "test-gateway-chassis-del-lrp" chassises := []string{"ea8368a0-28cd-4549-9da5-a7ea67262619", "b25ffb94-8b32-4c7e-b5b0-0f343bf6bdd8", "62265268-8af7-4b36-a550-ab5ad38375e3"} - lrp := &ovnnb.LogicalRouterPort{ - UUID: ovsclient.NamedUUID(), - Name: lrpName, - ExternalIDs: map[string]string{ - "vendor": util.CniTypeName, - }, - } + err := ovnClient.CreateLogicalRouter(lrName) + require.NoError(t, err) - err := createLogicalRouterPort(ovnClient, lrp) + err = ovnClient.CreateLogicalRouterPort(lrName, lrpName, "00:11:22:37:af:62", []string{"fd00::c0a8:1001/120"}) require.NoError(t, err) err = ovnClient.CreateGatewayChassises(lrpName, chassises...) @@ -69,6 +63,11 @@ func (suite *OvnClientTestSuite) testDeleteGatewayChassises() { err = ovnClient.DeleteGatewayChassises(lrpName, append(chassises, "73bbe5d4-2b9b-47d0-aba8-94e86941881a")) require.NoError(t, err) + lrp, err := ovnClient.GetLogicalRouterPort(lrpName, false) + require.NoError(t, err) + require.NotNil(t, lrp) + require.Len(t, lrp.GatewayChassis, 0) + for _, chassisName := range chassises { gwChassisName := lrpName + "-" + chassisName _, err := ovnClient.GetGatewayChassis(gwChassisName, false) @@ -81,19 +80,15 @@ func (suite *OvnClientTestSuite) testDeleteGatewayChassisOp() { t.Parallel() ovnClient := suite.ovnClient + lrName := "test-gateway-chassis-del-op-lr" lrpName := "test-gateway-chassis-del-op-lrp" chassis := "6c322ce8-02b7-42b3-925b-ae24020272a9" gwChassisName := lrpName + "-" + chassis - lrp := &ovnnb.LogicalRouterPort{ - UUID: ovsclient.NamedUUID(), - Name: lrpName, - ExternalIDs: map[string]string{ - "vendor": util.CniTypeName, - }, - } + err := ovnClient.CreateLogicalRouter(lrName) + require.NoError(t, err) - err := createLogicalRouterPort(ovnClient, lrp) + err = ovnClient.CreateLogicalRouterPort(lrName, lrpName, "00:11:22:37:af:62", []string{"fd00::c0a8:1001/120"}) require.NoError(t, err) err = ovnClient.CreateGatewayChassises(lrpName, chassis) @@ -102,18 +97,19 @@ func (suite *OvnClientTestSuite) testDeleteGatewayChassisOp() { gwChassis, err := ovnClient.GetGatewayChassis(gwChassisName, false) require.NoError(t, err) - ops, err := ovnClient.DeleteGatewayChassisOp(gwChassisName) + uuid, ops, err := ovnClient.DeleteGatewayChassisOp(gwChassisName) require.NoError(t, err) + require.Equal(t, gwChassis.UUID, uuid) require.Len(t, ops, 1) require.Equal(t, ovsdb.Operation{ - Op: "delete", - Table: "Gateway_Chassis", + Op: ovsdb.OperationDelete, + Table: ovnnb.GatewayChassisTable, Where: []ovsdb.Condition{ { Column: "_uuid", - Function: "==", + Function: ovsdb.ConditionEqual, Value: ovsdb.UUID{ GoUUID: gwChassis.UUID, }, diff --git a/pkg/ovs/ovn-nb-load_balancer.go b/pkg/ovs/ovn-nb-load_balancer.go index 134b8b49306..371d7856894 100644 --- a/pkg/ovs/ovn-nb-load_balancer.go +++ b/pkg/ovs/ovn-nb-load_balancer.go @@ -558,7 +558,7 @@ func (c *OVNNbClient) LoadBalancerDeleteHealthCheck(lbName, uuid string) error { if len(ops) == 0 { return nil } - if err = c.Transact("lb-del", ops); err != nil { + if err = c.Transact("lb-hc-del", ops); err != nil { return fmt.Errorf("failed to delete health check %s from load balancers %s: %v", uuid, lbName, err) } } diff --git a/pkg/ovs/ovn-nb-load_balancer_health_check.go b/pkg/ovs/ovn-nb-load_balancer_health_check.go index a137ddbc9d3..f9ae929c335 100644 --- a/pkg/ovs/ovn-nb-load_balancer_health_check.go +++ b/pkg/ovs/ovn-nb-load_balancer_health_check.go @@ -3,8 +3,7 @@ package ovs import ( "context" "fmt" - - "golang.org/x/exp/slices" + "slices" "github.com/ovn-org/libovsdb/model" "github.com/ovn-org/libovsdb/ovsdb" @@ -129,12 +128,7 @@ func (c *OVNNbClient) UpdateLoadBalancerHealthCheck(lbhc *ovnnb.LoadBalancerHeal // DeleteLoadBalancerHealthChecks delete several lb health checks once func (c *OVNNbClient) DeleteLoadBalancerHealthChecks(filter func(lb *ovnnb.LoadBalancerHealthCheck) bool) error { - var ( - op []ovsdb.Operation - err error - ) - - op, err = c.ovsDbClient.WhereCache( + op, err := c.ovsDbClient.WhereCache( func(lbhc *ovnnb.LoadBalancerHealthCheck) bool { if filter != nil { return filter(lbhc) @@ -178,12 +172,8 @@ func (c *OVNNbClient) GetLoadBalancerHealthCheck(lbName, vipEndpoint string, ign ctx, cancel := context.WithTimeout(context.Background(), c.Timeout) defer cancel() - var ( - lb *ovnnb.LoadBalancer - err error - ) - - if lb, err = c.GetLoadBalancer(lbName, false); err != nil { + lb, err := c.GetLoadBalancer(lbName, false) + if err != nil { klog.Errorf("failed to get lb %s: %v", lbName, err) return nil, nil, err } @@ -263,12 +253,7 @@ func (c *OVNNbClient) LoadBalancerHealthCheckExists(lbName, vipEndpoint string) // DeleteLoadBalancerHealthCheckOp delete operation which delete lb health check func (c *OVNNbClient) DeleteLoadBalancerHealthCheckOp(lbName, vip string) ([]ovsdb.Operation, error) { - var ( - lbhc *ovnnb.LoadBalancerHealthCheck - err error - ) - - _, lbhc, err = c.GetLoadBalancerHealthCheck(lbName, vip, true) + lb, lbhc, err := c.GetLoadBalancerHealthCheck(lbName, vip, true) if err != nil { klog.Errorf("failed to get lb health check: %v", err) return nil, err @@ -278,11 +263,20 @@ func (c *OVNNbClient) DeleteLoadBalancerHealthCheckOp(lbName, vip string) ([]ovs return nil, nil } - var op []ovsdb.Operation - if op, err = c.Where(lbhc).Delete(); err != nil { + mutateOps, err := c.Where(lb).Mutate(lb, model.Mutation{ + Field: &lb.HealthCheck, + Value: []string{lbhc.UUID}, + Mutator: ovsdb.MutateOperationDelete, + }) + if err != nil { + klog.Errorf("failed to generate operations for deleting lb health check: %v", err) + return nil, err + } + deleteOps, err := c.Where(lbhc).Delete() + if err != nil { klog.Errorf("failed to generate operations for deleting lb health check: %v", err) return nil, err } - return op, nil + return append(mutateOps, deleteOps...), nil } diff --git a/pkg/ovs/ovn-nb-load_balancer_health_check_test.go b/pkg/ovs/ovn-nb-load_balancer_health_check_test.go index 7348e0fa7f0..d8e2dbe4e72 100644 --- a/pkg/ovs/ovn-nb-load_balancer_health_check_test.go +++ b/pkg/ovs/ovn-nb-load_balancer_health_check_test.go @@ -2,6 +2,7 @@ package ovs import ( "fmt" + "slices" "strings" "testing" @@ -9,7 +10,6 @@ import ( "github.com/stretchr/testify/require" "github.com/kubeovn/kube-ovn/pkg/ovsdb/ovnnb" - "github.com/kubeovn/kube-ovn/pkg/util" ) func (suite *OvnClientTestSuite) testAddLoadBalancerHealthCheck() { @@ -115,7 +115,7 @@ func (suite *OvnClientTestSuite) testDeleteLoadBalancerHealthChecks() { var ( ovnClient = suite.ovnClient lbNamePrefix = "test-del-lb-hcs" - vipFormat = "1.1.1.%d:80" + vipFormat = "5.5.5.%d:80" lbhc *ovnnb.LoadBalancerHealthCheck vips []string lbName, vip string @@ -136,13 +136,16 @@ func (suite *OvnClientTestSuite) testDeleteLoadBalancerHealthChecks() { _, lbhc, err = ovnClient.GetLoadBalancerHealthCheck(lbName, vip, false) require.NoError(t, err) - + require.NotNil(t, lbhc) require.Equal(t, vip, lbhc.Vip) + + err = ovnClient.LoadBalancerDeleteHealthCheck(lbName, lbhc.UUID) + require.NoError(t, err) } err = ovnClient.DeleteLoadBalancerHealthChecks( func(lbhc *ovnnb.LoadBalancerHealthCheck) bool { - return util.ContainsString(vips, lbhc.Vip) + return slices.Contains(vips, lbhc.Vip) }, ) require.NoError(t, err) @@ -165,7 +168,6 @@ func (suite *OvnClientTestSuite) testGetLoadBalancerHealthCheck() { lbName = "test-get-lb-hc" vip = "1.1.1.22:80" vipNonExistent = "1.1.1.33:80" - lbhc *ovnnb.LoadBalancerHealthCheck err error ) @@ -178,7 +180,7 @@ func (suite *OvnClientTestSuite) testGetLoadBalancerHealthCheck() { t.Run("should return no err when found load balancer health check", func(t *testing.T) { t.Parallel() - _, lbhc, err = ovnClient.GetLoadBalancerHealthCheck(lbName, vip, false) + _, lbhc, err := ovnClient.GetLoadBalancerHealthCheck(lbName, vip, false) require.NoError(t, err) require.Equal(t, vip, lbhc.Vip) require.NotEmpty(t, lbhc.UUID) @@ -188,7 +190,7 @@ func (suite *OvnClientTestSuite) testGetLoadBalancerHealthCheck() { t.Run("should return err when not found load balancer health check", func(t *testing.T) { t.Parallel() - _, _, err = ovnClient.GetLoadBalancerHealthCheck(lbName, vipNonExistent, false) + _, _, err := ovnClient.GetLoadBalancerHealthCheck(lbName, vipNonExistent, false) require.Error(t, err) }, ) @@ -196,7 +198,7 @@ func (suite *OvnClientTestSuite) testGetLoadBalancerHealthCheck() { t.Run("no err when not found load balancer health check and ignoreNotFound is true", func(t *testing.T) { t.Parallel() - _, _, err = ovnClient.GetLoadBalancerHealthCheck(lbName, vipNonExistent, true) + _, _, err := ovnClient.GetLoadBalancerHealthCheck(lbName, vipNonExistent, true) require.NoError(t, err) }, ) @@ -207,13 +209,12 @@ func (suite *OvnClientTestSuite) testListLoadBalancerHealthChecks() { t.Parallel() var ( - ovnClient = suite.ovnClient - lbNamePrefix = "test-list-lb-hcs" - vipFormat = "1.1.1.%d:80" - vips, newVips []string - lbhcs []ovnnb.LoadBalancerHealthCheck - lbName, vip string - err error + ovnClient = suite.ovnClient + lbNamePrefix = "test-list-lb-hcs" + vipFormat = "6.6.6.%d:80" + vips []string + lbName, vip string + err error ) vips = make([]string, 0, 5) @@ -234,11 +235,11 @@ func (suite *OvnClientTestSuite) testListLoadBalancerHealthChecks() { func(t *testing.T) { t.Parallel() - lbhcs, err = ovnClient.ListLoadBalancerHealthChecks(nil) + lbhcs, err := ovnClient.ListLoadBalancerHealthChecks(nil) require.NoError(t, err) require.NotEmpty(t, lbhcs) - newVips = make([]string, 0, 5) + newVips := make([]string, 0, 5) for _, lbhc := range lbhcs { newVips = append(newVips, lbhc.Vip) } @@ -255,17 +256,17 @@ func (suite *OvnClientTestSuite) testListLoadBalancerHealthChecks() { func(t *testing.T) { t.Parallel() - lbhcs, err = ovnClient.ListLoadBalancerHealthChecks( + lbhcs, err := ovnClient.ListLoadBalancerHealthChecks( func(lbhc *ovnnb.LoadBalancerHealthCheck) bool { - return strings.Contains(lbhc.Vip, "1.1.1") + return strings.Contains(lbhc.Vip, "6.6.6.") }, ) require.NoError(t, err) require.NotEmpty(t, lbhcs) - newVips = make([]string, 0, 5) + newVips := make([]string, 0, 5) for _, lbhc := range lbhcs { - if !strings.Contains(lbhc.Vip, "1.1.1.10") { + if !strings.Contains(lbhc.Vip, "6.6.6.10") { continue } newVips = append(newVips, lbhc.Vip) @@ -287,14 +288,17 @@ func (suite *OvnClientTestSuite) testDeleteLoadBalancerHealthCheckOp() { vip = "1.1.1.44:80" vipNonExistent = "1.1.1.55:80" lbhc *ovnnb.LoadBalancerHealthCheck - ops []ovsdb.Operation err error ) err = ovnClient.CreateLoadBalancer(lbName, "tcp", "ip_dst") require.NoError(t, err) - err = ovnClient.AddLoadBalancerHealthCheck(lbName, vip, map[string]string{}) + lb, err := ovnClient.GetLoadBalancer(lbName, false) + require.NoError(t, err) + require.NotNil(t, lb) + + err = ovnClient.AddLoadBalancerHealthCheck(lbName, vip, nil) require.NoError(t, err) _, lbhc, err = ovnClient.GetLoadBalancerHealthCheck(lbName, vip, false) @@ -304,24 +308,53 @@ func (suite *OvnClientTestSuite) testDeleteLoadBalancerHealthCheckOp() { func(t *testing.T) { t.Parallel() - ops, err = ovnClient.DeleteLoadBalancerHealthCheckOp(lbName, vip) + ops, err := ovnClient.DeleteLoadBalancerHealthCheckOp(lbName, vip) require.NoError(t, err) - require.Len(t, ops, 1) - - require.Equal(t, - ovsdb.Operation{ - Op: "delete", - Table: "Load_Balancer_Health_Check", - Where: []ovsdb.Condition{ - { - Column: "_uuid", - Function: "==", - Value: ovsdb.UUID{ - GoUUID: lbhc.UUID, + require.Len(t, ops, 2) + + require.ElementsMatch(t, ops, + []ovsdb.Operation{ + { + Op: ovsdb.OperationMutate, + Table: ovnnb.LoadBalancerTable, + Where: []ovsdb.Condition{ + { + Column: "_uuid", + Function: ovsdb.ConditionEqual, + Value: ovsdb.UUID{ + GoUUID: lb.UUID, + }, + }, + }, + Mutations: []ovsdb.Mutation{ + { + Column: "health_check", + Mutator: ovsdb.MutateOperationDelete, + Value: ovsdb.OvsSet{ + GoSet: []interface{}{ + ovsdb.UUID{ + GoUUID: lbhc.UUID, + }, + }, + }, }, }, }, - }, ops[0]) + { + Op: ovsdb.OperationDelete, + Table: ovnnb.LoadBalancerHealthCheckTable, + Where: []ovsdb.Condition{ + { + Column: "_uuid", + Function: ovsdb.ConditionEqual, + Value: ovsdb.UUID{ + GoUUID: lbhc.UUID, + }, + }, + }, + }, + }, + ) }, ) @@ -329,7 +362,7 @@ func (suite *OvnClientTestSuite) testDeleteLoadBalancerHealthCheckOp() { func(t *testing.T) { t.Parallel() - ops, err = ovnClient.DeleteLoadBalancerHealthCheckOp(lbName, vipNonExistent) + ops, err := ovnClient.DeleteLoadBalancerHealthCheckOp(lbName, vipNonExistent) require.NoError(t, err) require.Len(t, ops, 0) }, diff --git a/pkg/ovs/ovn-nb-load_balancer_test.go b/pkg/ovs/ovn-nb-load_balancer_test.go index 458a65384e8..0479689993f 100644 --- a/pkg/ovs/ovn-nb-load_balancer_test.go +++ b/pkg/ovs/ovn-nb-load_balancer_test.go @@ -262,12 +262,12 @@ func (suite *OvnClientTestSuite) testDeleteLoadBalancerOp() { require.Equal(t, ovsdb.Operation{ - Op: "delete", - Table: "Load_Balancer", + Op: ovsdb.OperationDelete, + Table: ovnnb.LoadBalancerTable, Where: []ovsdb.Condition{ { Column: "_uuid", - Function: "==", + Function: ovsdb.ConditionEqual, Value: ovsdb.UUID{ GoUUID: lb.UUID, }, diff --git a/pkg/ovs/ovn-nb-logical_router_port_test.go b/pkg/ovs/ovn-nb-logical_router_port_test.go index 9ca56eac130..87d3f0382ff 100644 --- a/pkg/ovs/ovn-nb-logical_router_port_test.go +++ b/pkg/ovs/ovn-nb-logical_router_port_test.go @@ -25,15 +25,6 @@ func newLogicalRouterPort(lrName, lrpName, mac string, networks []string) *ovnnb } } -func createLogicalRouterPort(c *OVNNbClient, lrp *ovnnb.LogicalRouterPort) error { - op, err := c.Create(lrp) - if err != nil { - return fmt.Errorf("generate operations for creating logical router port %s: %v", lrp.Name, err) - } - - return c.Transact("lrp-create", op) -} - func (suite *OvnClientTestSuite) testCreatePeerRouterPort() { t := suite.T() t.Parallel() @@ -502,44 +493,40 @@ func (suite *OvnClientTestSuite) testLogicalRouterPortOp() { t.Parallel() ovnClient := suite.ovnClient - lrpName := "test-op-lrp" + lrName := "test-op-lrp-lr" + lrpName := "test-op-lrp-lrp" - lrp := &ovnnb.LogicalRouterPort{ - UUID: ovsclient.NamedUUID(), - Name: lrpName, - ExternalIDs: map[string]string{ - "vendor": util.CniTypeName, - }, - } + err := ovnClient.CreateLogicalRouter(lrName) + require.NoError(t, err) - err := createLogicalRouterPort(ovnClient, lrp) + err = ovnClient.CreateLogicalRouterPort(lrName, lrpName, util.GenerateMac(), []string{"172.177.19.1/24"}) require.NoError(t, err) - gwChassisUUID := ovsclient.NamedUUID() + lrp, err := ovnClient.GetLogicalRouterPort(lrpName, false) + require.NoError(t, err) + require.NotNil(t, lrp) + require.ElementsMatch(t, lrp.Networks, []string{"172.177.19.1/24"}) mutation := func(lrp *ovnnb.LogicalRouterPort) *model.Mutation { - mutation := &model.Mutation{ - Field: &lrp.GatewayChassis, - Value: []string{gwChassisUUID}, + return &model.Mutation{ + Field: &lrp.Networks, + Value: []string{"172.177.29.1/24", "172.177.39.1/24"}, Mutator: ovsdb.MutateOperationInsert, } - - return mutation } ops, err := ovnClient.LogicalRouterPortOp(lrpName, mutation) require.NoError(t, err) - + require.Len(t, ops, 1) require.Len(t, ops[0].Mutations, 1) require.Equal(t, []ovsdb.Mutation{ { - Column: "gateway_chassis", + Column: "networks", Mutator: ovsdb.MutateOperationInsert, Value: ovsdb.OvsSet{ GoSet: []interface{}{ - ovsdb.UUID{ - GoUUID: gwChassisUUID, - }, + "172.177.29.1/24", + "172.177.39.1/24", }, }, }, diff --git a/pkg/ovs/ovn-nb-logical_router_test.go b/pkg/ovs/ovn-nb-logical_router_test.go index 4d49dbb44f6..d4a01e075bf 100644 --- a/pkg/ovs/ovn-nb-logical_router_test.go +++ b/pkg/ovs/ovn-nb-logical_router_test.go @@ -47,7 +47,6 @@ func (suite *OvnClientTestSuite) testUpdateLogicalRouter() { ovnClient := suite.ovnClient lrName := "test-update-lr" - policies := []string{ovsclient.NamedUUID(), ovsclient.NamedUUID()} err := ovnClient.CreateLogicalRouter(lrName) require.NoError(t, err) @@ -55,26 +54,25 @@ func (suite *OvnClientTestSuite) testUpdateLogicalRouter() { lr, err := ovnClient.GetLogicalRouter(lrName, false) require.NoError(t, err) - t.Run("update policy", func(t *testing.T) { - lr.Policies = policies - + t.Run("update external-ids", func(t *testing.T) { + lr.ExternalIDs = map[string]string{"foo": "bar"} err = ovnClient.UpdateLogicalRouter(lr) require.NoError(t, err) lr, err := ovnClient.GetLogicalRouter(lrName, false) require.NoError(t, err) - require.ElementsMatch(t, lr.Policies, policies) + require.Equal(t, map[string]string{"foo": "bar"}, lr.ExternalIDs) }) - t.Run("clear policy", func(t *testing.T) { - lr.Policies = nil + t.Run("clear external-ids", func(t *testing.T) { + lr.ExternalIDs = nil - err = ovnClient.UpdateLogicalRouter(lr, &lr.Policies) + err = ovnClient.UpdateLogicalRouter(lr, &lr.ExternalIDs) require.NoError(t, err) lr, err := ovnClient.GetLogicalRouter(lrName, false) require.NoError(t, err) - require.Empty(t, lr.Policies) + require.Empty(t, lr.ExternalIDs) }) } diff --git a/pkg/ovs/ovn-nb-logical_switch.go b/pkg/ovs/ovn-nb-logical_switch.go index 5047645623f..b48f58a4a6d 100644 --- a/pkg/ovs/ovn-nb-logical_switch.go +++ b/pkg/ovs/ovn-nb-logical_switch.go @@ -121,12 +121,16 @@ func (c *OVNNbClient) LogicalSwitchAddPort(lsName, lspName string) error { // LogicalSwitchDelPort del port from logical switch func (c *OVNNbClient) LogicalSwitchDelPort(lsName, lspName string) error { - lsp, err := c.GetLogicalSwitchPort(lspName, false) + lsp, err := c.GetLogicalSwitchPort(lspName, true) if err != nil { klog.Error(err) return fmt.Errorf("get logical switch port %s when logical switch del port: %v", lspName, err) } + if lsp == nil { + return nil + } + ops, err := c.LogicalSwitchUpdatePortOp(lsName, lsp.UUID, ovsdb.MutateOperationDelete) if err != nil { klog.Error(err) diff --git a/pkg/ovs/ovn-nb-logical_switch_port.go b/pkg/ovs/ovn-nb-logical_switch_port.go index 5f8eb53539a..814229973de 100644 --- a/pkg/ovs/ovn-nb-logical_switch_port.go +++ b/pkg/ovs/ovn-nb-logical_switch_port.go @@ -31,14 +31,14 @@ func buildLogicalSwitchPort(lspName, ip, mac, podName, namespace string, portSec addresses = append(addresses, ipList...) // addresses is the first element of addresses - lsp.Addresses = []string{strings.Join(addresses, " ")} + lsp.Addresses = []string{strings.TrimSpace(strings.Join(addresses, " "))} if portSecurity { if len(vips) != 0 { addresses = append(addresses, vipList...) } // addresses is the first element of port_security - lsp.PortSecurity = []string{strings.Join(addresses, " ")} + lsp.PortSecurity = []string{strings.TrimSpace(strings.Join(addresses, " "))} // set security groups if len(securityGroups) != 0 { @@ -252,7 +252,7 @@ func (c *OVNNbClient) CreateBareLogicalSwitchPort(lsName, lspName, ip, mac strin lsp := &ovnnb.LogicalSwitchPort{ UUID: ovsclient.NamedUUID(), Name: lspName, - Addresses: []string{strings.Join(addresses, " ")}, // addresses is the first element of addresses + Addresses: []string{strings.TrimSpace(strings.Join(addresses, " "))}, // addresses is the first element of addresses } ops, err := c.CreateLogicalSwitchPortOp(lsp, lsName) @@ -372,7 +372,7 @@ func (c *OVNNbClient) SetLogicalSwitchPortSecurity(portSecurity bool, lspName, m } // addresses is the first element of port_security - lsp.PortSecurity = []string{strings.Join(addresses, " ")} + lsp.PortSecurity = []string{strings.TrimSpace(strings.Join(addresses, " "))} } if vips != "" { @@ -494,7 +494,7 @@ func (c *OVNNbClient) SetLogicalSwitchPortsSecurityGroup(sgName, op string) erro return nil } -// EnablePortLayer2forward set logical switch port addresses as 'unknown' +// EnablePortLayer2forward adds "unknown" to logical switch port's addresses func (c *OVNNbClient) EnablePortLayer2forward(lspName string) error { lsp, err := c.GetLogicalSwitchPort(lspName, false) if err != nil { @@ -502,8 +502,11 @@ func (c *OVNNbClient) EnablePortLayer2forward(lspName string) error { return fmt.Errorf("get logical switch port %s: %v", lspName, err) } - lsp.Addresses = []string{"unknown"} + if util.ContainsString(lsp.Addresses, "unknown") { + return nil + } + lsp.Addresses = append(lsp.Addresses, "unknown") if err := c.UpdateLogicalSwitchPort(lsp, &lsp.Addresses); err != nil { return fmt.Errorf("set logical switch port %s addressed=unknown: %v", lspName, err) } @@ -561,6 +564,15 @@ func (c *OVNNbClient) UpdateLogicalSwitchPort(lsp *ovnnb.LogicalSwitchPort, fiel // DeleteLogicalSwitchPort delete logical switch port in ovn func (c *OVNNbClient) DeleteLogicalSwitchPort(lspName string) error { + lsp, err := c.GetLogicalSwitchPort(lspName, true) + if err != nil { + klog.Error(err) + return err + } + if lsp == nil { + return nil + } + ops, err := c.DeleteLogicalSwitchPortOp(lspName) if err != nil { klog.Error(err) diff --git a/pkg/ovs/ovn-nb-logical_switch_port_test.go b/pkg/ovs/ovn-nb-logical_switch_port_test.go index 25d13dc2e40..68b1efa7bdd 100644 --- a/pkg/ovs/ovn-nb-logical_switch_port_test.go +++ b/pkg/ovs/ovn-nb-logical_switch_port_test.go @@ -6,7 +6,6 @@ import ( "testing" "github.com/ovn-org/libovsdb/ovsdb" - "github.com/scylladb/go-set/strset" "github.com/stretchr/testify/require" ovsclient "github.com/kubeovn/kube-ovn/pkg/ovsdb/client" @@ -14,44 +13,40 @@ import ( "github.com/kubeovn/kube-ovn/pkg/util" ) -func createLogicalSwitchPort(c *OVNNbClient, lsp *ovnnb.LogicalSwitchPort) error { - if lsp == nil { - return fmt.Errorf("logical_switch_port is nil") - } - - op, err := c.Create(lsp) - if err != nil { - return fmt.Errorf("generate operations for creating logical switch port %s: %v", lsp.Name, err) - } - - return c.Transact("lsp-create", op) -} - func (suite *OvnClientTestSuite) testCreateLogicalSwitchPort() { t := suite.T() t.Parallel() ovnClient := suite.ovnClient - lsName := "test-create-port-ls" + lsName := "test-create-lsp-ls" ips := "10.244.0.37,fc00::af4:25" mac := "00:00:00:AB:B4:65" vips := "10.244.0.110,10.244.0.112" - podName := "test-vm-pod" - podNamespace := "test-ns" - dhcpOptions := &DHCPOptionsUUIDs{ - DHCPv4OptionsUUID: "73459f83-6189-4c57-837c-4102fa293332", - DHCPv6OptionsUUID: "d0201b01-1ef4-4eaf-9d96-8fe845e76c93", - } + podName := "test-create-lsp-pod" + podNamespace := "test-create-lsp-ns" err := ovnClient.CreateBareLogicalSwitch(lsName) require.NoError(t, err) + err = ovnClient.CreateDHCPOptions(lsName, "10.244.0.0/16", "") + require.NoError(t, err) + err = ovnClient.CreateDHCPOptions(lsName, "fc00::/64", "") + require.NoError(t, err) + dhcpOptions, err := ovnClient.ListDHCPOptions(true, map[string]string{logicalSwitchKey: lsName}) + require.NoError(t, err) + require.Len(t, dhcpOptions, 2) + + dhcpUUIDs := &DHCPOptionsUUIDs{ + DHCPv4OptionsUUID: dhcpOptions[0].UUID, + DHCPv6OptionsUUID: dhcpOptions[1].UUID, + } + t.Run("create logical switch port", func(t *testing.T) { - lspName := "test-create-port-lsp" + lspName := "test-create-lsp-lsp" sgs := "sg,sg1" vpcName := "test-vpc" - err = ovnClient.CreateLogicalSwitchPort(lsName, lspName, ips, mac, podName, podNamespace, true, sgs, vips, true, dhcpOptions, vpcName) + err = ovnClient.CreateLogicalSwitchPort(lsName, lspName, ips, mac, podName, podNamespace, true, sgs, vips, true, dhcpUUIDs, vpcName) require.NoError(t, err) lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) @@ -69,16 +64,16 @@ func (suite *OvnClientTestSuite) testCreateLogicalSwitchPort() { "ls": lsName, "vendor": util.CniTypeName, }, lsp.ExternalIDs) - require.Equal(t, dhcpOptions.DHCPv4OptionsUUID, *lsp.Dhcpv4Options) - require.Equal(t, dhcpOptions.DHCPv6OptionsUUID, *lsp.Dhcpv6Options) + require.Equal(t, dhcpUUIDs.DHCPv4OptionsUUID, *lsp.Dhcpv4Options) + require.Equal(t, dhcpUUIDs.DHCPv6OptionsUUID, *lsp.Dhcpv6Options) }) t.Run("create logical switch port without vips", func(t *testing.T) { - lspName := "test-create-port-lsp-no-vip" + lspName := "test-create-lsp-lsp-no-vip" sgs := "sg,sg1" vpcName := "test-vpc" - err = ovnClient.CreateLogicalSwitchPort(lsName, lspName, ips, mac, podName, podNamespace, true, sgs, "", true, dhcpOptions, vpcName) + err = ovnClient.CreateLogicalSwitchPort(lsName, lspName, ips, mac, podName, podNamespace, true, sgs, "", true, dhcpUUIDs, vpcName) require.NoError(t, err) lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) @@ -94,16 +89,16 @@ func (suite *OvnClientTestSuite) testCreateLogicalSwitchPort() { "ls": lsName, "vendor": util.CniTypeName, }, lsp.ExternalIDs) - require.Equal(t, dhcpOptions.DHCPv4OptionsUUID, *lsp.Dhcpv4Options) - require.Equal(t, dhcpOptions.DHCPv6OptionsUUID, *lsp.Dhcpv6Options) + require.Equal(t, dhcpUUIDs.DHCPv4OptionsUUID, *lsp.Dhcpv4Options) + require.Equal(t, dhcpUUIDs.DHCPv6OptionsUUID, *lsp.Dhcpv6Options) }) t.Run("create logical switch port with default-securitygroup", func(t *testing.T) { - lspName := "test-create-port-lsp-default-securitygroup" + lspName := "test-create-lsp-lsp-default-sg" sgs := "sg,sg1,default-securitygroup" vpcName := "test-vpc" - err = ovnClient.CreateLogicalSwitchPort(lsName, lspName, ips, mac, podName, podNamespace, true, sgs, vips, true, dhcpOptions, vpcName) + err = ovnClient.CreateLogicalSwitchPort(lsName, lspName, ips, mac, podName, podNamespace, true, sgs, vips, true, dhcpUUIDs, vpcName) require.NoError(t, err) lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) @@ -121,16 +116,16 @@ func (suite *OvnClientTestSuite) testCreateLogicalSwitchPort() { "vips": vips, "attach-vips": "true", }, lsp.ExternalIDs) - require.Equal(t, dhcpOptions.DHCPv4OptionsUUID, *lsp.Dhcpv4Options) - require.Equal(t, dhcpOptions.DHCPv6OptionsUUID, *lsp.Dhcpv6Options) + require.Equal(t, dhcpUUIDs.DHCPv4OptionsUUID, *lsp.Dhcpv4Options) + require.Equal(t, dhcpUUIDs.DHCPv6OptionsUUID, *lsp.Dhcpv6Options) }) t.Run("create logical switch port with default vpc", func(t *testing.T) { - lspName := "test-create-port-lsp-default-vpc" + lspName := "test-create-lsp-lsp-default-vpc" sgs := "sg,sg1" vpcName := "ovn-cluster" - err = ovnClient.CreateLogicalSwitchPort(lsName, lspName, ips, mac, podName, podNamespace, true, sgs, vips, true, dhcpOptions, vpcName) + err = ovnClient.CreateLogicalSwitchPort(lsName, lspName, ips, mac, podName, podNamespace, true, sgs, vips, true, dhcpUUIDs, vpcName) require.NoError(t, err) lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) @@ -147,16 +142,16 @@ func (suite *OvnClientTestSuite) testCreateLogicalSwitchPort() { "vips": vips, "attach-vips": "true", }, lsp.ExternalIDs) - require.Equal(t, dhcpOptions.DHCPv4OptionsUUID, *lsp.Dhcpv4Options) - require.Equal(t, dhcpOptions.DHCPv6OptionsUUID, *lsp.Dhcpv6Options) + require.Equal(t, dhcpUUIDs.DHCPv4OptionsUUID, *lsp.Dhcpv4Options) + require.Equal(t, dhcpUUIDs.DHCPv6OptionsUUID, *lsp.Dhcpv6Options) }) t.Run("create logical switch port with portSecurity=false", func(t *testing.T) { - lspName := "test-create-port-lsp-no-portSecurity" + lspName := "test-create-lsp-lsp-no-port-security" sgs := "sg,sg1" vpcName := "test-vpc" - err = ovnClient.CreateLogicalSwitchPort(lsName, lspName, ips, mac, podName, podNamespace, false, sgs, vips, true, dhcpOptions, vpcName) + err = ovnClient.CreateLogicalSwitchPort(lsName, lspName, ips, mac, podName, podNamespace, false, sgs, vips, true, dhcpUUIDs, vpcName) require.NoError(t, err) lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) @@ -170,12 +165,12 @@ func (suite *OvnClientTestSuite) testCreateLogicalSwitchPort() { "vips": vips, "attach-vips": "true", }, lsp.ExternalIDs) - require.Equal(t, dhcpOptions.DHCPv4OptionsUUID, *lsp.Dhcpv4Options) - require.Equal(t, dhcpOptions.DHCPv6OptionsUUID, *lsp.Dhcpv6Options) + require.Equal(t, dhcpUUIDs.DHCPv4OptionsUUID, *lsp.Dhcpv4Options) + require.Equal(t, dhcpUUIDs.DHCPv6OptionsUUID, *lsp.Dhcpv6Options) }) t.Run("create logical switch port without dhcp options", func(t *testing.T) { - lspName := "test-create-port-lsp-no-dhcp-options" + lspName := "test-create-lsp-lsp-no-dhcp-options" sgs := "sg,sg1" vpcName := "test-vpc" @@ -208,7 +203,7 @@ func (suite *OvnClientTestSuite) testCreateLocalnetLogicalSwitchPort() { ovnClient := suite.ovnClient lspName := "test-create-localnet-port-lsp" - lsName := "test-create-localnet-port-port-ls" + lsName := "test-create-localnet-port-ls" provider := "external" err := ovnClient.CreateBareLogicalSwitch(lsName) @@ -350,12 +345,12 @@ func (suite *OvnClientTestSuite) testSetLogicalSwitchPortArpProxy() { t.Parallel() ovnClient := suite.ovnClient - lsName := "test-create-port-ls" + lsName := "test-set-lsp-arp-proxy-ls" ips := "10.244.0.37,fc00::af4:25" mac := "00:00:00:AB:B4:65" podNamespace := "test-ns" vpcName := "test-vpc" - lspName := "test-update-port-arp-proxy-lsp" + lspName := "test-set-lsp-arp-proxy-lsp" err := ovnClient.CreateBareLogicalSwitch(lsName) require.NoError(t, err) @@ -391,23 +386,17 @@ func (suite *OvnClientTestSuite) testSetLogicalSwitchPortSecurity() { lsName := "test-update-port-security-ls" lspName := "test-update-port-security-lsp" - lsp := &ovnnb.LogicalSwitchPort{ - UUID: ovsclient.NamedUUID(), - Name: lspName, - ExternalIDs: map[string]string{ - "vendor": util.CniTypeName, - logicalSwitchKey: lsName, - }, - } + err := ovnClient.CreateBareLogicalSwitch(lsName) + require.NoError(t, err) - err := createLogicalSwitchPort(ovnClient, lsp) + err = ovnClient.CreateBareLogicalSwitchPort(lsName, lspName, "unknown", "") require.NoError(t, err) t.Run("update port_security and external_ids", func(t *testing.T) { err = ovnClient.SetLogicalSwitchPortSecurity(true, lspName, "00:00:00:AB:B4:65", "10.244.0.37,fc00::af4:25", "10.244.100.10,10.244.100.11") require.NoError(t, err) - lsp, err = ovnClient.GetLogicalSwitchPort(lspName, false) + lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) require.NoError(t, err) require.ElementsMatch(t, []string{"00:00:00:AB:B4:65 10.244.0.37 fc00::af4:25 10.244.100.10 10.244.100.11"}, lsp.PortSecurity) require.Equal(t, map[string]string{ @@ -422,8 +411,9 @@ func (suite *OvnClientTestSuite) testSetLogicalSwitchPortSecurity() { err = ovnClient.SetLogicalSwitchPortSecurity(false, lspName, "00:00:00:AB:B4:65", "10.244.0.37,fc00::af4:25", "") require.NoError(t, err) - lsp, err = ovnClient.GetLogicalSwitchPort(lspName, false) + lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) require.NoError(t, err) + require.NotNil(t, lsp) require.Empty(t, lsp.PortSecurity) require.Equal(t, map[string]string{ "vendor": util.CniTypeName, @@ -434,23 +424,21 @@ func (suite *OvnClientTestSuite) testSetLogicalSwitchPortSecurity() { t.Run("update port_security and external_ids when lsp.ExternalIDs is nil and vips is not nil", func(t *testing.T) { lspName := "test-update-port-security-lsp-nil-eid" - lsp := &ovnnb.LogicalSwitchPort{ - UUID: ovsclient.NamedUUID(), - Name: lspName, - } - - err := createLogicalSwitchPort(ovnClient, lsp) + err = ovnClient.CreateBareLogicalSwitchPort(lsName, lspName, "unknown", "") require.NoError(t, err) err = ovnClient.SetLogicalSwitchPortSecurity(true, lspName, "00:00:00:AB:B4:65", "10.244.0.37,fc00::af4:25", "10.244.100.10,10.244.100.11") require.NoError(t, err) - lsp, err = ovnClient.GetLogicalSwitchPort(lspName, false) + lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) require.NoError(t, err) + require.NotNil(t, lsp) require.ElementsMatch(t, []string{"00:00:00:AB:B4:65 10.244.0.37 fc00::af4:25 10.244.100.10 10.244.100.11"}, lsp.PortSecurity) require.Equal(t, map[string]string{ - "vips": "10.244.100.10,10.244.100.11", - "attach-vips": "true", + "vendor": util.CniTypeName, + logicalSwitchKey: lsName, + "vips": "10.244.100.10,10.244.100.11", + "attach-vips": "true", }, lsp.ExternalIDs) }) } @@ -460,38 +448,40 @@ func (suite *OvnClientTestSuite) testSetSetLogicalSwitchPortExternalIDs() { t.Parallel() ovnClient := suite.ovnClient - lspName := "test-set-port-ext-id-lsp" + lsName := "test-set-lsp-ext-id-ls" + lspName := "test-set-lsp-ext-id-lsp" - lsp := &ovnnb.LogicalSwitchPort{ - UUID: ovsclient.NamedUUID(), - Name: lspName, - ExternalIDs: map[string]string{ - "vendor": util.CniTypeName, - }, - } + err := ovnClient.CreateBareLogicalSwitch(lsName) + require.NoError(t, err) - err := createLogicalSwitchPort(ovnClient, lsp) + err = ovnClient.CreateBareLogicalSwitchPort(lsName, lspName, "unknown", "") require.NoError(t, err) + lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) + require.NoError(t, err) + require.NotNil(t, lsp) + require.NotEmpty(t, lsp.ExternalIDs) + require.Equal(t, util.CniTypeName, lsp.ExternalIDs["vendor"]) + err = ovnClient.SetLogicalSwitchPortExternalIDs(lspName, map[string]string{"k1": "v1"}) require.NoError(t, err) lsp, err = ovnClient.GetLogicalSwitchPort(lspName, false) require.NoError(t, err) - require.Equal(t, map[string]string{ - "k1": "v1", - "vendor": util.CniTypeName, - }, lsp.ExternalIDs) + require.NotNil(t, lsp) + require.NotEmpty(t, lsp.ExternalIDs) + require.Equal(t, util.CniTypeName, lsp.ExternalIDs["vendor"]) + require.Equal(t, "v1", lsp.ExternalIDs["k1"]) err = ovnClient.SetLogicalSwitchPortExternalIDs(lspName, map[string]string{"k1": "v2"}) require.NoError(t, err) lsp, err = ovnClient.GetLogicalSwitchPort(lspName, false) require.NoError(t, err) - require.Equal(t, map[string]string{ - "k1": "v2", - "vendor": util.CniTypeName, - }, lsp.ExternalIDs) + require.NotNil(t, lsp) + require.NotEmpty(t, lsp.ExternalIDs) + require.Equal(t, util.CniTypeName, lsp.ExternalIDs["vendor"]) + require.Equal(t, "v2", lsp.ExternalIDs["k1"]) } func (suite *OvnClientTestSuite) testSetLogicalSwitchPortSecurityGroup() { @@ -499,8 +489,12 @@ func (suite *OvnClientTestSuite) testSetLogicalSwitchPortSecurityGroup() { t.Parallel() ovnClient := suite.ovnClient + lsName := "test-set-sg-ls" lspNamePrefix := "test-set-sg-lsp" + err := ovnClient.CreateBareLogicalSwitch(lsName) + require.NoError(t, err) + addOpExpect := func(lsp *ovnnb.LogicalSwitchPort, sgs []string) { for _, sg := range sgs { require.Equalf(t, "true", lsp.ExternalIDs[associatedSgKeyPrefix+sg], "%s should exist", sg) @@ -522,22 +516,23 @@ func (suite *OvnClientTestSuite) testSetLogicalSwitchPortSecurityGroup() { t.Run("add operation", func(t *testing.T) { t.Parallel() - lspNamePrefix := lspNamePrefix + "add" + lspNamePrefix := lspNamePrefix + "-add" op := "add" t.Run("new sgs is completely different old sgs", func(t *testing.T) { t.Parallel() lspName := lspNamePrefix + "-complete" - lsp := &ovnnb.LogicalSwitchPort{ - Name: lspName, - ExternalIDs: map[string]string{ - associatedSgKeyPrefix + "sg1": "true", - sgsKey: "sg1", - }, - } + err := ovnClient.CreateBareLogicalSwitchPort(lsName, lspName, "unknown", "") + require.NoError(t, err) + + lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) + require.NoError(t, err) + require.NotNil(t, lsp) - err := createLogicalSwitchPort(ovnClient, lsp) + lsp.ExternalIDs[associatedSgKeyPrefix+"sg1"] = "true" + lsp.ExternalIDs[sgsKey] = "sg1" + err = ovnClient.UpdateLogicalSwitchPort(lsp, &lsp.ExternalIDs) require.NoError(t, err) diffSgs, err := ovnClient.SetLogicalSwitchPortSecurityGroup(lsp, op, "sg2", "sg3") @@ -553,16 +548,17 @@ func (suite *OvnClientTestSuite) testSetLogicalSwitchPortSecurityGroup() { t.Parallel() lspName := lspNamePrefix + "-old-subset" - lsp := &ovnnb.LogicalSwitchPort{ - Name: lspName, - ExternalIDs: map[string]string{ - associatedSgKeyPrefix + "sg1": "true", - associatedSgKeyPrefix + "sg2": "true", - sgsKey: "sg1/sg2", - }, - } + err := ovnClient.CreateBareLogicalSwitchPort(lsName, lspName, "unknown", "") + require.NoError(t, err) - err := createLogicalSwitchPort(ovnClient, lsp) + lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) + require.NoError(t, err) + require.NotNil(t, lsp) + + lsp.ExternalIDs[associatedSgKeyPrefix+"sg1"] = "true" + lsp.ExternalIDs[associatedSgKeyPrefix+"sg2"] = "true" + lsp.ExternalIDs[sgsKey] = "sg1/sg2" + err = ovnClient.UpdateLogicalSwitchPort(lsp, &lsp.ExternalIDs) require.NoError(t, err) diffSgs, err := ovnClient.SetLogicalSwitchPortSecurityGroup(lsp, op, "sg2", "sg3", "sg4", "sg1") @@ -578,17 +574,18 @@ func (suite *OvnClientTestSuite) testSetLogicalSwitchPortSecurityGroup() { t.Parallel() lspName := lspNamePrefix + "-new-subset" - lsp := &ovnnb.LogicalSwitchPort{ - Name: lspName, - ExternalIDs: map[string]string{ - associatedSgKeyPrefix + "sg1": "true", - associatedSgKeyPrefix + "sg2": "true", - associatedSgKeyPrefix + "sg3": "true", - sgsKey: "sg1/sg2/sg3", - }, - } + err := ovnClient.CreateBareLogicalSwitchPort(lsName, lspName, "unknown", "") + require.NoError(t, err) + + lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) + require.NoError(t, err) + require.NotNil(t, lsp) - err := createLogicalSwitchPort(ovnClient, lsp) + lsp.ExternalIDs[associatedSgKeyPrefix+"sg1"] = "true" + lsp.ExternalIDs[associatedSgKeyPrefix+"sg2"] = "true" + lsp.ExternalIDs[associatedSgKeyPrefix+"sg3"] = "true" + lsp.ExternalIDs[sgsKey] = "sg1/sg2/sg3" + err = ovnClient.UpdateLogicalSwitchPort(lsp, &lsp.ExternalIDs) require.NoError(t, err) diffSgs, err := ovnClient.SetLogicalSwitchPortSecurityGroup(lsp, op, "sg2", "sg1") @@ -604,17 +601,18 @@ func (suite *OvnClientTestSuite) testSetLogicalSwitchPortSecurityGroup() { t.Parallel() lspName := lspNamePrefix + "-partial" - lsp := &ovnnb.LogicalSwitchPort{ - Name: lspName, - ExternalIDs: map[string]string{ - associatedSgKeyPrefix + "sg1": "true", - associatedSgKeyPrefix + "sg2": "true", - associatedSgKeyPrefix + "sg3": "true", - sgsKey: "sg1/sg2/sg3", - }, - } + err := ovnClient.CreateBareLogicalSwitchPort(lsName, lspName, "unknown", "") + require.NoError(t, err) - err := createLogicalSwitchPort(ovnClient, lsp) + lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) + require.NoError(t, err) + require.NotNil(t, lsp) + + lsp.ExternalIDs[associatedSgKeyPrefix+"sg1"] = "true" + lsp.ExternalIDs[associatedSgKeyPrefix+"sg2"] = "true" + lsp.ExternalIDs[associatedSgKeyPrefix+"sg3"] = "true" + lsp.ExternalIDs[sgsKey] = "sg1/sg2/sg3" + err = ovnClient.UpdateLogicalSwitchPort(lsp, &lsp.ExternalIDs) require.NoError(t, err) diffSgs, err := ovnClient.SetLogicalSwitchPortSecurityGroup(lsp, op, "sg2", "sg3", "sg4") @@ -630,17 +628,18 @@ func (suite *OvnClientTestSuite) testSetLogicalSwitchPortSecurityGroup() { t.Parallel() lspName := lspNamePrefix + "-new-empty" - lsp := &ovnnb.LogicalSwitchPort{ - Name: lspName, - ExternalIDs: map[string]string{ - associatedSgKeyPrefix + "sg1": "true", - associatedSgKeyPrefix + "sg2": "true", - associatedSgKeyPrefix + "sg3": "true", - sgsKey: "sg1/sg2/sg3", - }, - } + err := ovnClient.CreateBareLogicalSwitchPort(lsName, lspName, "unknown", "") + require.NoError(t, err) - err := createLogicalSwitchPort(ovnClient, lsp) + lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) + require.NoError(t, err) + require.NotNil(t, lsp) + + lsp.ExternalIDs[associatedSgKeyPrefix+"sg1"] = "true" + lsp.ExternalIDs[associatedSgKeyPrefix+"sg2"] = "true" + lsp.ExternalIDs[associatedSgKeyPrefix+"sg3"] = "true" + lsp.ExternalIDs[sgsKey] = "sg1/sg2/sg3" + err = ovnClient.UpdateLogicalSwitchPort(lsp, &lsp.ExternalIDs) require.NoError(t, err) diffSgs, err := ovnClient.SetLogicalSwitchPortSecurityGroup(lsp, op) @@ -656,13 +655,12 @@ func (suite *OvnClientTestSuite) testSetLogicalSwitchPortSecurityGroup() { t.Parallel() lspName := lspNamePrefix + "-old-empty" - lsp := &ovnnb.LogicalSwitchPort{ - Name: lspName, - ExternalIDs: map[string]string{}, - } + err := ovnClient.CreateBareLogicalSwitchPort(lsName, lspName, "unknown", "") + require.NoError(t, err) - err := createLogicalSwitchPort(ovnClient, lsp) + lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) require.NoError(t, err) + require.NotNil(t, lsp) diffSgs, err := ovnClient.SetLogicalSwitchPortSecurityGroup(lsp, op, "sg2", "sg1") require.NoError(t, err) @@ -677,22 +675,23 @@ func (suite *OvnClientTestSuite) testSetLogicalSwitchPortSecurityGroup() { t.Run("remove operation", func(t *testing.T) { t.Parallel() - lspNamePrefix := lspNamePrefix + "remove" + lspNamePrefix := lspNamePrefix + "-remove" op := "remove" t.Run("new sgs is completely different old sgs", func(t *testing.T) { t.Parallel() lspName := lspNamePrefix + "-complete" - lsp := &ovnnb.LogicalSwitchPort{ - Name: lspName, - ExternalIDs: map[string]string{ - associatedSgKeyPrefix + "sg1": "true", - sgsKey: "sg1", - }, - } + err := ovnClient.CreateBareLogicalSwitchPort(lsName, lspName, "unknown", "") + require.NoError(t, err) - err := createLogicalSwitchPort(ovnClient, lsp) + lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) + require.NoError(t, err) + require.NotNil(t, lsp) + + lsp.ExternalIDs[associatedSgKeyPrefix+"sg1"] = "true" + lsp.ExternalIDs[sgsKey] = "sg1" + err = ovnClient.UpdateLogicalSwitchPort(lsp, &lsp.ExternalIDs) require.NoError(t, err) diffSgs, err := ovnClient.SetLogicalSwitchPortSecurityGroup(lsp, op, "sg2", "sg3") @@ -708,16 +707,17 @@ func (suite *OvnClientTestSuite) testSetLogicalSwitchPortSecurityGroup() { t.Parallel() lspName := lspNamePrefix + "-old-subset" - lsp := &ovnnb.LogicalSwitchPort{ - Name: lspName, - ExternalIDs: map[string]string{ - associatedSgKeyPrefix + "sg1": "true", - associatedSgKeyPrefix + "sg2": "true", - sgsKey: "sg1/sg2", - }, - } + err := ovnClient.CreateBareLogicalSwitchPort(lsName, lspName, "unknown", "") + require.NoError(t, err) + + lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) + require.NoError(t, err) + require.NotNil(t, lsp) - err := createLogicalSwitchPort(ovnClient, lsp) + lsp.ExternalIDs[associatedSgKeyPrefix+"sg1"] = "true" + lsp.ExternalIDs[associatedSgKeyPrefix+"sg2"] = "true" + lsp.ExternalIDs[sgsKey] = "sg1/sg2" + err = ovnClient.UpdateLogicalSwitchPort(lsp, &lsp.ExternalIDs) require.NoError(t, err) diffSgs, err := ovnClient.SetLogicalSwitchPortSecurityGroup(lsp, op, "sg2", "sg3", "sg4", "sg1") @@ -733,17 +733,18 @@ func (suite *OvnClientTestSuite) testSetLogicalSwitchPortSecurityGroup() { t.Parallel() lspName := lspNamePrefix + "-new-subset" - lsp := &ovnnb.LogicalSwitchPort{ - Name: lspName, - ExternalIDs: map[string]string{ - associatedSgKeyPrefix + "sg1": "true", - associatedSgKeyPrefix + "sg2": "true", - associatedSgKeyPrefix + "sg3": "true", - sgsKey: "sg1/sg2/sg3", - }, - } + err := ovnClient.CreateBareLogicalSwitchPort(lsName, lspName, "unknown", "") + require.NoError(t, err) + + lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) + require.NoError(t, err) + require.NotNil(t, lsp) - err := createLogicalSwitchPort(ovnClient, lsp) + lsp.ExternalIDs[associatedSgKeyPrefix+"sg1"] = "true" + lsp.ExternalIDs[associatedSgKeyPrefix+"sg2"] = "true" + lsp.ExternalIDs[associatedSgKeyPrefix+"sg3"] = "true" + lsp.ExternalIDs[sgsKey] = "sg1/sg2/sg3" + err = ovnClient.UpdateLogicalSwitchPort(lsp, &lsp.ExternalIDs) require.NoError(t, err) diffSgs, err := ovnClient.SetLogicalSwitchPortSecurityGroup(lsp, op, "sg2", "sg1") @@ -760,17 +761,18 @@ func (suite *OvnClientTestSuite) testSetLogicalSwitchPortSecurityGroup() { t.Parallel() lspName := lspNamePrefix + "-partial" - lsp := &ovnnb.LogicalSwitchPort{ - Name: lspName, - ExternalIDs: map[string]string{ - associatedSgKeyPrefix + "sg1": "true", - associatedSgKeyPrefix + "sg2": "true", - associatedSgKeyPrefix + "sg3": "true", - sgsKey: "sg1/sg2/sg3", - }, - } + err := ovnClient.CreateBareLogicalSwitchPort(lsName, lspName, "unknown", "") + require.NoError(t, err) - err := createLogicalSwitchPort(ovnClient, lsp) + lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) + require.NoError(t, err) + require.NotNil(t, lsp) + + lsp.ExternalIDs[associatedSgKeyPrefix+"sg1"] = "true" + lsp.ExternalIDs[associatedSgKeyPrefix+"sg2"] = "true" + lsp.ExternalIDs[associatedSgKeyPrefix+"sg3"] = "true" + lsp.ExternalIDs[sgsKey] = "sg1/sg2/sg3" + err = ovnClient.UpdateLogicalSwitchPort(lsp, &lsp.ExternalIDs) require.NoError(t, err) diffSgs, err := ovnClient.SetLogicalSwitchPortSecurityGroup(lsp, op, "sg2", "sg3", "sg4") @@ -787,13 +789,12 @@ func (suite *OvnClientTestSuite) testSetLogicalSwitchPortSecurityGroup() { t.Parallel() lspName := lspNamePrefix + "-old-empty" - lsp := &ovnnb.LogicalSwitchPort{ - Name: lspName, - ExternalIDs: map[string]string{}, - } + err := ovnClient.CreateBareLogicalSwitchPort(lsName, lspName, "unknown", "") + require.NoError(t, err) - err := createLogicalSwitchPort(ovnClient, lsp) + lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) require.NoError(t, err) + require.NotNil(t, lsp) diffSgs, err := ovnClient.SetLogicalSwitchPortSecurityGroup(lsp, op, "sg2", "sg1") require.NoError(t, err) @@ -807,20 +808,24 @@ func (suite *OvnClientTestSuite) testSetLogicalSwitchPortsSecurityGroup() { t.Parallel() ovnClient := suite.ovnClient + lsName := "test-set-sgs-ls" lspNamePrefix := "test-set-sgs-lsp" + err := ovnClient.CreateBareLogicalSwitch(lsName) + require.NoError(t, err) + for i := 0; i < 3; i++ { lspName := fmt.Sprintf("%s-%d", lspNamePrefix, i) - lsp := &ovnnb.LogicalSwitchPort{ - Name: lspName, - ExternalIDs: map[string]string{ - "vendor": util.CniTypeName, - associatedSgKeyPrefix + "sg1": "false", - associatedSgKeyPrefix + "sg2": "false", - }, - } + err = ovnClient.CreateBareLogicalSwitchPort(lsName, lspName, "unknown", "") + require.NoError(t, err) - err := createLogicalSwitchPort(ovnClient, lsp) + lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) + require.NoError(t, err) + require.NotNil(t, lsp) + + lsp.ExternalIDs[associatedSgKeyPrefix+"sg1"] = "false" + lsp.ExternalIDs[associatedSgKeyPrefix+"sg2"] = "false" + err = ovnClient.UpdateLogicalSwitchPort(lsp, &lsp.ExternalIDs) require.NoError(t, err) } @@ -832,6 +837,8 @@ func (suite *OvnClientTestSuite) testSetLogicalSwitchPortsSecurityGroup() { lspName := fmt.Sprintf("%s-%d", lspNamePrefix, i) lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) require.NoError(t, err) + require.NotNil(t, lsp) + require.NotEmpty(t, lsp.ExternalIDs) require.Equal(t, "false", lsp.ExternalIDs[associatedSgKeyPrefix+"sg1"]) require.Equal(t, "true", lsp.ExternalIDs[associatedSgKeyPrefix+"sg2"]) @@ -848,9 +855,10 @@ func (suite *OvnClientTestSuite) testSetLogicalSwitchPortsSecurityGroup() { lspName := fmt.Sprintf("%s-%d", lspNamePrefix, i) lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) require.NoError(t, err) + require.NotNil(t, lsp) + require.NotEmpty(t, lsp.ExternalIDs) require.Equal(t, "false", lsp.ExternalIDs[associatedSgKeyPrefix+"sg1"]) require.Equal(t, "false", lsp.ExternalIDs[associatedSgKeyPrefix+"sg2"]) - require.Empty(t, lsp.ExternalIDs[sgsKey]) } }) @@ -868,25 +876,30 @@ func (suite *OvnClientTestSuite) testEnablePortLayer2forward() { ovnClient := suite.ovnClient lsName := "test-enable-port-l2-ls" lspName := "test-enable-port-l2-lsp" + ns := "test-enable-port-l2-ns" + pod := "test-enable-port-l2-pod" + ip := util.GenerateRandomV4IP("192.168.1.0/24") + mac := util.GenerateMac() - lsp := &ovnnb.LogicalSwitchPort{ - UUID: ovsclient.NamedUUID(), - Name: lspName, - ExternalIDs: map[string]string{ - "vendor": util.CniTypeName, - logicalSwitchKey: lsName, - }, - } + err := ovnClient.CreateBareLogicalSwitch(lsName) + require.NoError(t, err) - err := createLogicalSwitchPort(ovnClient, lsp) + err = ovnClient.CreateLogicalSwitchPort(lsName, lspName, ip, mac, pod, ns, false, "", "", false, nil, "") require.NoError(t, err) + lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) + require.NoError(t, err) + require.NotNil(t, lsp) + require.NotEmpty(t, lsp.ExternalIDs) + require.Equal(t, util.CniTypeName, lsp.ExternalIDs["vendor"]) + err = ovnClient.EnablePortLayer2forward(lspName) require.NoError(t, err) lsp, err = ovnClient.GetLogicalSwitchPort(lspName, false) require.NoError(t, err) - require.ElementsMatch(t, []string{"unknown"}, lsp.Addresses) + require.NotNil(t, lsp) + require.Contains(t, lsp.Addresses, "unknown") } func (suite *OvnClientTestSuite) testSetLogicalSwitchPortVlanTag() { @@ -896,48 +909,52 @@ func (suite *OvnClientTestSuite) testSetLogicalSwitchPortVlanTag() { ovnClient := suite.ovnClient lsName := "test-set-port-vlan-tag-ls" lspName := "test-set-port-vlan-tag-lsp" + vlanID := 100 - lsp := &ovnnb.LogicalSwitchPort{ - UUID: ovsclient.NamedUUID(), - Name: lspName, - ExternalIDs: map[string]string{ - "vendor": util.CniTypeName, - logicalSwitchKey: lsName, - }, - } + err := ovnClient.CreateBareLogicalSwitch(lsName) + require.NoError(t, err) + + err = ovnClient.CreateLocalnetLogicalSwitchPort(lsName, lspName, "provider", vlanID) + require.NoError(t, err) - err := createLogicalSwitchPort(ovnClient, lsp) + lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) require.NoError(t, err) + require.NotNil(t, lsp) + require.NotNil(t, lsp.Tag) + require.Equal(t, vlanID, *lsp.Tag) + require.NotEmpty(t, lsp.ExternalIDs) + require.Equal(t, util.CniTypeName, lsp.ExternalIDs["vendor"]) - t.Run("set logical switch port tag when vlan id is 0", func(t *testing.T) { + t.Run("clear logical switch port vlan id", func(t *testing.T) { err = ovnClient.SetLogicalSwitchPortVlanTag(lspName, 0) require.NoError(t, err) lsp, err = ovnClient.GetLogicalSwitchPort(lspName, false) require.NoError(t, err) + require.NotNil(t, lsp) require.Nil(t, lsp.Tag) }) t.Run("set logical switch port vlan id", func(t *testing.T) { - err = ovnClient.SetLogicalSwitchPortVlanTag(lspName, 10) + vlanID := 10 + err = ovnClient.SetLogicalSwitchPortVlanTag(lspName, vlanID) require.NoError(t, err) lsp, err = ovnClient.GetLogicalSwitchPort(lspName, false) require.NoError(t, err) - require.Equal(t, 10, *lsp.Tag) + require.NotNil(t, lsp) + require.NotNil(t, lsp.Tag) + require.Equal(t, vlanID, *lsp.Tag) // no error when set the same vlan id - err = ovnClient.SetLogicalSwitchPortVlanTag(lspName, 10) - require.NoError(t, err) - }) - - t.Run("set logical switch port tag when vlan id is 0 again", func(t *testing.T) { - err = ovnClient.SetLogicalSwitchPortVlanTag(lspName, 0) + err = ovnClient.SetLogicalSwitchPortVlanTag(lspName, vlanID) require.NoError(t, err) lsp, err = ovnClient.GetLogicalSwitchPort(lspName, false) require.NoError(t, err) - require.Nil(t, lsp.Tag) + require.NotNil(t, lsp) + require.NotNil(t, lsp.Tag) + require.Equal(t, vlanID, *lsp.Tag) }) t.Run("invalid vlan id", func(t *testing.T) { @@ -954,56 +971,52 @@ func (suite *OvnClientTestSuite) testUpdateLogicalSwitchPort() { t.Parallel() ovnClient := suite.ovnClient - lspName := "test-update-lsp" + lsName := "test-update-lsp-ls" + lspName := "test-update-lsp-lsp" - lsp := &ovnnb.LogicalSwitchPort{ - UUID: ovsclient.NamedUUID(), - Name: lspName, - ExternalIDs: map[string]string{"vendor": util.CniTypeName}, - } + err := ovnClient.CreateBareLogicalSwitch(lsName) + require.NoError(t, err) - err := createLogicalSwitchPort(ovnClient, lsp) + err = ovnClient.CreateBareLogicalSwitchPort(lsName, lspName, "unknown", "") require.NoError(t, err) - t.Run("normal update", func(t *testing.T) { - lsp := &ovnnb.LogicalSwitchPort{ - Name: lspName, - Addresses: []string{"00:0c:29:e4:16:cc 192.168.231.110"}, - ExternalIDs: map[string]string{ - "liveMigration": "0", - }, - Options: map[string]string{ - "virtual-parents": "test-virtual-parents", - }, + lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) + require.NoError(t, err) + require.NotNil(t, lsp) + require.NotEmpty(t, lsp.ExternalIDs) + require.Equal(t, util.CniTypeName, lsp.ExternalIDs["vendor"]) + + t.Run("update external-ids & options", func(t *testing.T) { + lsp.ExternalIDs["liveMigration"] = "0" + if lsp.Options == nil { + lsp.Options = make(map[string]string, 1) } - err = ovnClient.UpdateLogicalSwitchPort(lsp) + lsp.Options["virtual-parents"] = "test-virtual-parents" + err = ovnClient.UpdateLogicalSwitchPort(lsp, &lsp.ExternalIDs, &lsp.Options) require.NoError(t, err) lsp, err = ovnClient.GetLogicalSwitchPort(lspName, false) require.NoError(t, err) - require.ElementsMatch(t, []string{"00:0c:29:e4:16:cc 192.168.231.110"}, lsp.Addresses) - require.Equal(t, map[string]string{ - "liveMigration": "0", - }, lsp.ExternalIDs) - require.Equal(t, map[string]string{ - "virtual-parents": "test-virtual-parents", - }, lsp.Options) + require.NotNil(t, lsp) + require.NotEmpty(t, lsp.ExternalIDs) + require.NotEmpty(t, lsp.Options) + require.Equal(t, "0", lsp.ExternalIDs["liveMigration"]) + require.Equal(t, "test-virtual-parents", lsp.Options["virtual-parents"]) }) - t.Run("clear addresses", func(t *testing.T) { - lsp := &ovnnb.LogicalSwitchPort{ - Name: lspName, - } - err = ovnClient.UpdateLogicalSwitchPort(lsp, &lsp.Addresses, &lsp.Options) + t.Run("remove external-ids & options", func(t *testing.T) { + delete(lsp.ExternalIDs, "liveMigration") + delete(lsp.Options, "virtual-parents") + + err = ovnClient.UpdateLogicalSwitchPort(lsp, &lsp.ExternalIDs, &lsp.Options) require.NoError(t, err) lsp, err = ovnClient.GetLogicalSwitchPort(lspName, false) require.NoError(t, err) - require.Empty(t, lsp.Addresses) + require.NotNil(t, lsp) + require.NotEmpty(t, lsp.ExternalIDs) + require.NotContains(t, lsp.ExternalIDs, "liveMigration") require.Empty(t, lsp.Options) - require.Equal(t, map[string]string{ - "liveMigration": "0", - }, lsp.ExternalIDs) }) } @@ -1014,22 +1027,15 @@ func (suite *OvnClientTestSuite) testListLogicalSwitchPorts() { ovnClient := suite.ovnClient lsName := "test-list-lsp-ls" + err := ovnClient.CreateBareLogicalSwitch(lsName) + require.NoError(t, err) t.Run("normal lsp", func(t *testing.T) { t.Parallel() // normal lsp lspName := "test-list-normal-lsp" - lsp := &ovnnb.LogicalSwitchPort{ - UUID: ovsclient.NamedUUID(), - Name: lspName, - ExternalIDs: map[string]string{ - logicalSwitchKey: lsName, - "vendor": util.CniTypeName, - }, - } - - err := createLogicalSwitchPort(ovnClient, lsp) + err := ovnClient.CreateBareLogicalSwitchPort(lsName, lspName, "unknown", "") require.NoError(t, err) out, err := ovnClient.ListLogicalSwitchPorts(true, map[string]string{logicalSwitchKey: lsName}, func(lsp *ovnnb.LogicalSwitchPort) bool { @@ -1044,50 +1050,18 @@ func (suite *OvnClientTestSuite) testListLogicalSwitchPorts() { t.Parallel() // patch lsp - lspName := "test-list-patch-lsp" + lrName := "test-list-patch-lsp-lr" + lspName := "test-list-patch-lsp-lsp" lrpName := "test-list-patch-lsp-lrp" - lsp := &ovnnb.LogicalSwitchPort{ - Name: lspName, - ExternalIDs: map[string]string{ - logicalSwitchKey: lsName, - "vendor": util.CniTypeName, - }, - Type: "router", - Options: map[string]string{ - "router-port": lrpName, - }, - } - err := createLogicalSwitchPort(ovnClient, lsp) + err := ovnClient.CreateLogicalRouter(lrName) require.NoError(t, err) - out, err := ovnClient.ListLogicalSwitchPorts(true, map[string]string{logicalSwitchKey: lsName}, func(lsp *ovnnb.LogicalSwitchPort) bool { - return lsp.Type == "router" && len(lsp.Options) != 0 && lsp.Options["router-port"] == lrpName - }) - require.NoError(t, err) - require.Len(t, out, 1) - require.Equal(t, lspName, out[0].Name) - }) - - t.Run("remote lsp", func(t *testing.T) { - t.Parallel() - - // remote lsp - lspName := "test-list-remote-lsp" - lsp := &ovnnb.LogicalSwitchPort{ - Name: lspName, - ExternalIDs: map[string]string{ - logicalSwitchKey: lsName, - "vendor": util.CniTypeName, - }, - Type: "remote", - } - - err := createLogicalSwitchPort(ovnClient, lsp) + err = ovnClient.CreateLogicalPatchPort(lsName, lrName, lspName, lrpName, "10.19.100.1/24", "") require.NoError(t, err) out, err := ovnClient.ListLogicalSwitchPorts(true, map[string]string{logicalSwitchKey: lsName}, func(lsp *ovnnb.LogicalSwitchPort) bool { - return lsp.Type == "remote" + return lsp.Type == "router" && len(lsp.Options) != 0 && lsp.Options["router-port"] == lrpName }) require.NoError(t, err) require.Len(t, out, 1) @@ -1099,16 +1073,7 @@ func (suite *OvnClientTestSuite) testListLogicalSwitchPorts() { // virtual lsp lspName := "test-list-virtual-lsp" - lsp := &ovnnb.LogicalSwitchPort{ - Name: lspName, - ExternalIDs: map[string]string{ - logicalSwitchKey: lsName, - "vendor": util.CniTypeName, - }, - Type: "virtual", - } - - err := createLogicalSwitchPort(ovnClient, lsp) + err := ovnClient.CreateVirtualLogicalSwitchPort(lspName, lsName, "unknown") require.NoError(t, err) out, err := ovnClient.ListLogicalSwitchPorts(true, map[string]string{logicalSwitchKey: lsName}, func(lsp *ovnnb.LogicalSwitchPort) bool { @@ -1131,7 +1096,7 @@ func (suite *OvnClientTestSuite) testDeleteLogicalSwitchPort() { err := ovnClient.CreateBareLogicalSwitch(lsName) require.NoError(t, err) - err = ovnClient.CreateBareLogicalSwitchPort(lsName, lspName, "", "") + err = ovnClient.CreateBareLogicalSwitchPort(lsName, lspName, "unknown", "") require.NoError(t, err) t.Run("no err when delete existent logical switch port", func(t *testing.T) { @@ -1249,7 +1214,7 @@ func (suite *OvnClientTestSuite) testDeleteLogicalSwitchPortOp() { err := ovnClient.CreateBareLogicalSwitch(lsName) require.NoError(t, err) - err = ovnClient.CreateBareLogicalSwitchPort(lsName, lspName, "", "") + err = ovnClient.CreateBareLogicalSwitchPort(lsName, lspName, "unknown", "") require.NoError(t, err) lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) @@ -1520,8 +1485,8 @@ func (suite *OvnClientTestSuite) testgetLogicalSwitchPortSgs() { }, } - sgs := getLogicalSwitchPortSgs(lsp) - require.True(t, sgs.IsEqual(strset.New("sg1", "sg2"))) + sgs := getLogicalSwitchPortSgs(lsp).List() + require.ElementsMatch(t, []string{"sg1", "sg2"}, sgs) }) t.Run("has no associated security group", func(t *testing.T) { @@ -1532,15 +1497,15 @@ func (suite *OvnClientTestSuite) testgetLogicalSwitchPortSgs() { }, } - sgs := getLogicalSwitchPortSgs(lsp) - require.Zero(t, sgs.Size()) + sgs := getLogicalSwitchPortSgs(lsp).List() + require.Empty(t, sgs) }) t.Run("has no external ids", func(t *testing.T) { t.Parallel() lsp := &ovnnb.LogicalSwitchPort{} - sgs := getLogicalSwitchPortSgs(lsp) - require.Zero(t, sgs.Size()) + sgs := getLogicalSwitchPortSgs(lsp).List() + require.Empty(t, sgs) }) } diff --git a/pkg/ovs/ovn-nb-logical_switch_test.go b/pkg/ovs/ovn-nb-logical_switch_test.go index 25fbe246b06..b2cd4056d3c 100644 --- a/pkg/ovs/ovn-nb-logical_switch_test.go +++ b/pkg/ovs/ovn-nb-logical_switch_test.go @@ -5,6 +5,7 @@ import ( "strings" "testing" + "github.com/google/uuid" "github.com/ovn-org/libovsdb/model" "github.com/ovn-org/libovsdb/ovsdb" "github.com/stretchr/testify/require" @@ -117,7 +118,7 @@ func (suite *OvnClientTestSuite) testLogicalSwitchDelPort() { err := ovnClient.CreateBareLogicalSwitch(lsName) require.NoError(t, err) - err = ovnClient.CreateBareLogicalSwitchPort(lsName, lspName, "", "") + err = ovnClient.CreateBareLogicalSwitchPort(lsName, lspName, "unknown", "") require.NoError(t, err) lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) @@ -140,7 +141,7 @@ func (suite *OvnClientTestSuite) testLogicalSwitchDelPort() { }) t.Run("del port from logical switch repeatedly", func(t *testing.T) { - err = ovnClient.LogicalSwitchDelPort(lsName, lspName) + err := ovnClient.LogicalSwitchDelPort(lsName, lspName) require.NoError(t, err) ls, err := ovnClient.GetLogicalSwitch(lsName, false) @@ -274,19 +275,19 @@ func (suite *OvnClientTestSuite) testListLogicalSwitch() { t.Parallel() ovnClient := suite.ovnClient - namePrefix := "test-list-ls" + namePrefix := "test-list-ls-" i := 0 // create three logical switch for ; i < 3; i++ { - name := fmt.Sprintf("%s-%d", namePrefix, i) + name := fmt.Sprintf("%s%d", namePrefix, i) err := ovnClient.CreateBareLogicalSwitch(name) require.NoError(t, err) } // create two logical switch which vendor is others for ; i < 5; i++ { - name := fmt.Sprintf("%s-%d", namePrefix, i) + name := fmt.Sprintf("%s%d", namePrefix, i) ls := &ovnnb.LogicalSwitch{ Name: name, ExternalIDs: map[string]string{"vendor": "test-vendor"}, @@ -298,7 +299,7 @@ func (suite *OvnClientTestSuite) testListLogicalSwitch() { // create two logical switch without vendor for ; i < 7; i++ { - name := fmt.Sprintf("%s-%d", namePrefix, i) + name := fmt.Sprintf("%s%d", namePrefix, i) ls := &ovnnb.LogicalSwitch{ Name: name, } @@ -346,33 +347,21 @@ func (suite *OvnClientTestSuite) testLogicalSwitchUpdatePortOp() { ovnClient := suite.ovnClient lsName := "test-update-port-op-ls" - lspUUID := ovsclient.NamedUUID() + lspName := "test-update-port-op-lsp" err := ovnClient.CreateBareLogicalSwitch(lsName) require.NoError(t, err) - t.Run("add new port to logical switch", func(t *testing.T) { - t.Parallel() - ops, err := ovnClient.LogicalSwitchUpdatePortOp(lsName, lspUUID, ovsdb.MutateOperationInsert) - require.NoError(t, err) - require.Equal(t, []ovsdb.Mutation{ - { - Column: "ports", - Mutator: ovsdb.MutateOperationInsert, - Value: ovsdb.OvsSet{ - GoSet: []interface{}{ - ovsdb.UUID{ - GoUUID: lspUUID, - }, - }, - }, - }, - }, ops[0].Mutations) - }) + err = ovnClient.CreateBareLogicalSwitchPort(lsName, lspName, "unknown", "") + require.NoError(t, err) + + lsp, err := ovnClient.GetLogicalSwitchPort(lspName, false) + require.NoError(t, err) + require.NotNil(t, lsp) t.Run("del port from logical switch", func(t *testing.T) { t.Parallel() - ops, err := ovnClient.LogicalSwitchUpdatePortOp(lsName, lspUUID, ovsdb.MutateOperationDelete) + ops, err := ovnClient.LogicalSwitchUpdatePortOp(lsName, lsp.UUID, ovsdb.MutateOperationDelete) require.NoError(t, err) require.Equal(t, []ovsdb.Mutation{ { @@ -381,7 +370,7 @@ func (suite *OvnClientTestSuite) testLogicalSwitchUpdatePortOp() { Value: ovsdb.OvsSet{ GoSet: []interface{}{ ovsdb.UUID{ - GoUUID: lspUUID, + GoUUID: lsp.UUID, }, }, }, @@ -391,7 +380,7 @@ func (suite *OvnClientTestSuite) testLogicalSwitchUpdatePortOp() { t.Run("should return err when logical switch does not exist", func(t *testing.T) { t.Parallel() - _, err := ovnClient.LogicalSwitchUpdatePortOp("test-update-port-op-ls-non-existent", lspUUID, ovsdb.MutateOperationInsert) + _, err := ovnClient.LogicalSwitchUpdatePortOp("test-update-port-op-ls-non-existent", uuid.NewString(), ovsdb.MutateOperationInsert) require.ErrorContains(t, err, "not found logical switch") }) } diff --git a/pkg/ovs/ovn-nb-port_group_test.go b/pkg/ovs/ovn-nb-port_group_test.go index af82ec3875c..06f29b0d461 100644 --- a/pkg/ovs/ovn-nb-port_group_test.go +++ b/pkg/ovs/ovn-nb-port_group_test.go @@ -11,7 +11,6 @@ import ( ovsclient "github.com/kubeovn/kube-ovn/pkg/ovsdb/client" "github.com/kubeovn/kube-ovn/pkg/ovsdb/ovnnb" - "github.com/kubeovn/kube-ovn/pkg/util" ) func (suite *OvnClientTestSuite) testCreatePortGroup() { @@ -42,32 +41,28 @@ func (suite *OvnClientTestSuite) testPortGroupResetPorts() { t.Parallel() ovnClient := suite.ovnClient - pgName := "test-reset-pg-ports" - prefix := "test-reset-ports" + lsName := "test-reset-pg-ports-ls" + pgName := "test-reset-pg-ports-pg" + prefix := "test-reset-pg-ports-lsp" lspNames := make([]string, 0, 3) - err := ovnClient.CreatePortGroup(pgName, map[string]string{ - "type": "security_group", - sgKey: "test-sg", - }) + err := ovnClient.CreateBareLogicalSwitch(lsName) require.NoError(t, err) for i := 1; i <= 3; i++ { lspName := fmt.Sprintf("%s-%d", prefix, i) lspNames = append(lspNames, lspName) - lsp := &ovnnb.LogicalSwitchPort{ - UUID: ovsclient.NamedUUID(), - Name: lspName, - ExternalIDs: map[string]string{ - "vendor": util.CniTypeName, - }, - } - - err := createLogicalSwitchPort(ovnClient, lsp) + err := ovnClient.CreateBareLogicalSwitchPort(lsName, lspName, "unknown", "") require.NoError(t, err) } + err = ovnClient.CreatePortGroup(pgName, map[string]string{ + "type": "security_group", + sgKey: "test-sg", + }) + require.NoError(t, err) + err = ovnClient.PortGroupAddPorts(pgName, lspNames...) require.NoError(t, err) diff --git a/pkg/ovs/ovn-nb-suite_test.go b/pkg/ovs/ovn-nb-suite_test.go index 3defd65bdc7..409e092afcb 100644 --- a/pkg/ovs/ovn-nb-suite_test.go +++ b/pkg/ovs/ovn-nb-suite_test.go @@ -13,7 +13,7 @@ import ( "github.com/cenkalti/backoff/v4" "github.com/go-logr/stdr" "github.com/ovn-org/libovsdb/client" - "github.com/ovn-org/libovsdb/database" + "github.com/ovn-org/libovsdb/database/inmemory" "github.com/ovn-org/libovsdb/model" "github.com/ovn-org/libovsdb/ovsdb" "github.com/ovn-org/libovsdb/ovsdb/serverdb" @@ -702,7 +702,7 @@ func newOVSDBServer(t *testing.T, dbModel model.ClientDBModel, schema ovsdb.Data require.NoError(t, err) serverSchema := serverdb.Schema() - db := database.NewInMemoryDatabase(map[string]model.ClientDBModel{ + db := inmemory.NewDatabase(map[string]model.ClientDBModel{ schema.Name: dbModel, serverSchema.Name: serverDBModel, }) diff --git a/pkg/ovs/ovn-nb_global_test.go b/pkg/ovs/ovn-nb_global_test.go index f57734de360..a66dd684faf 100644 --- a/pkg/ovs/ovn-nb_global_test.go +++ b/pkg/ovs/ovn-nb_global_test.go @@ -10,8 +10,7 @@ import ( func mockNBGlobal() *ovnnb.NBGlobal { return &ovnnb.NBGlobal{ - Connections: []string{"c7744628-6399-4852-8ac0-06e4e436c146"}, - NbCfg: 100, + NbCfg: 100, Options: map[string]string{ "mac_prefix": "11:22:33", "max_tunid": "16711680", diff --git a/pkg/ovs/ovn.go b/pkg/ovs/ovn.go index 0f7e826adfa..cad3a8e71af 100644 --- a/pkg/ovs/ovn.go +++ b/pkg/ovs/ovn.go @@ -133,7 +133,7 @@ func ConstructWaitForUniqueOperation(table, column string, value interface{}) ov Timeout: &timeout, Where: []ovsdb.Condition{{Column: column, Function: ovsdb.ConditionEqual, Value: value}}, Columns: []string{column}, - Until: "!=", + Until: string(ovsdb.WaitConditionNotEqual), Rows: []ovsdb.Row{{column: value}}, } } diff --git a/pkg/ovsdb/ovnnb/model.go b/pkg/ovsdb/ovnnb/model.go index f06a0697d11..87a79fdab5d 100644 --- a/pkg/ovsdb/ovnnb/model.go +++ b/pkg/ovsdb/ovnnb/model.go @@ -203,7 +203,8 @@ var schema = `{ [ "name" ] - ] + ], + "isRoot": true }, "BFD": { "columns": { @@ -290,7 +291,8 @@ var schema = `{ "logical_port", "dst_ip" ] - ] + ], + "isRoot": true }, "Chassis_Template_Var": { "columns": { @@ -326,7 +328,8 @@ var schema = `{ [ "chassis" ] - ] + ], + "isRoot": true }, "Connection": { "columns": { @@ -434,7 +437,8 @@ var schema = `{ [ "name" ] - ] + ], + "isRoot": true }, "DHCP_Options": { "columns": { @@ -465,7 +469,8 @@ var schema = `{ "max": "unlimited" } } - } + }, + "isRoot": true }, "DNS": { "columns": { @@ -493,7 +498,8 @@ var schema = `{ "max": "unlimited" } } - } + }, + "isRoot": true }, "Forwarding_Group": { "columns": { @@ -641,7 +647,8 @@ var schema = `{ [ "name" ] - ] + ], + "isRoot": true }, "Load_Balancer": { "columns": { @@ -744,7 +751,8 @@ var schema = `{ "max": "unlimited" } } - } + }, + "isRoot": true }, "Load_Balancer_Group": { "columns": { @@ -767,7 +775,8 @@ var schema = `{ [ "name" ] - ] + ], + "isRoot": true }, "Load_Balancer_Health_Check": { "columns": { @@ -914,7 +923,8 @@ var schema = `{ "max": "unlimited" } } - } + }, + "isRoot": true }, "Logical_Router_Policy": { "columns": { @@ -1287,7 +1297,8 @@ var schema = `{ "max": "unlimited" } } - } + }, + "isRoot": true }, "Logical_Switch_Port": { "columns": { @@ -1504,7 +1515,8 @@ var schema = `{ [ "name" ] - ] + ], + "isRoot": true }, "Meter_Band": { "columns": { @@ -1604,7 +1616,8 @@ var schema = `{ [ "name" ] - ] + ], + "isRoot": true }, "NAT": { "columns": { @@ -1779,7 +1792,8 @@ var schema = `{ "max": 1 } } - } + }, + "isRoot": true }, "Port_Group": { "columns": { @@ -1825,7 +1839,8 @@ var schema = `{ [ "name" ] - ] + ], + "isRoot": true }, "QoS": { "columns": { @@ -1959,7 +1974,8 @@ var schema = `{ "logical_port", "ip" ] - ] + ], + "isRoot": true } } }` diff --git a/pkg/ovsdb/ovnsb/model.go b/pkg/ovsdb/ovnsb/model.go index da9f6aea7c7..7de445d79b3 100644 --- a/pkg/ovsdb/ovnsb/model.go +++ b/pkg/ovsdb/ovnsb/model.go @@ -73,7 +73,8 @@ var schema = `{ [ "name" ] - ] + ], + "isRoot": true }, "BFD": { "columns": { @@ -152,7 +153,8 @@ var schema = `{ "src_port", "disc" ] - ] + ], + "isRoot": true }, "Chassis": { "columns": { @@ -222,7 +224,8 @@ var schema = `{ [ "name" ] - ] + ], + "isRoot": true }, "Chassis_Private": { "columns": { @@ -263,7 +266,8 @@ var schema = `{ [ "name" ] - ] + ], + "isRoot": true }, "Chassis_Template_Var": { "columns": { @@ -287,7 +291,8 @@ var schema = `{ [ "chassis" ] - ] + ], + "isRoot": true }, "Connection": { "columns": { @@ -403,7 +408,8 @@ var schema = `{ "seq_num": { "type": "integer" } - } + }, + "isRoot": true }, "DHCP_Options": { "columns": { @@ -440,7 +446,8 @@ var schema = `{ } } } - } + }, + "isRoot": true }, "DHCPv6_Options": { "columns": { @@ -471,7 +478,8 @@ var schema = `{ } } } - } + }, + "isRoot": true }, "DNS": { "columns": { @@ -509,7 +517,8 @@ var schema = `{ "max": "unlimited" } } - } + }, + "isRoot": true }, "Datapath_Binding": { "columns": { @@ -548,7 +557,8 @@ var schema = `{ [ "tunnel_key" ] - ] + ], + "isRoot": true }, "Encap": { "columns": { @@ -622,7 +632,8 @@ var schema = `{ "mac", "dp_key" ] - ] + ], + "isRoot": true }, "Gateway_Chassis": { "columns": { @@ -760,7 +771,8 @@ var schema = `{ [ "name" ] - ] + ], + "isRoot": true }, "IGMP_Group": { "columns": { @@ -807,7 +819,8 @@ var schema = `{ "datapath", "chassis" ] - ] + ], + "isRoot": true }, "IP_Multicast": { "columns": { @@ -891,7 +904,8 @@ var schema = `{ [ "datapath" ] - ] + ], + "isRoot": true }, "Load_Balancer": { "columns": { @@ -971,7 +985,8 @@ var schema = `{ "max": "unlimited" } } - } + }, + "isRoot": true }, "Logical_DP_Group": { "columns": { @@ -1081,7 +1096,8 @@ var schema = `{ "max": "unlimited" } } - } + }, + "isRoot": true }, "MAC_Binding": { "columns": { @@ -1111,7 +1127,8 @@ var schema = `{ "logical_port", "ip" ] - ] + ], + "isRoot": true }, "Meter": { "columns": { @@ -1148,7 +1165,8 @@ var schema = `{ [ "name" ] - ] + ], + "isRoot": true }, "Meter_Band": { "columns": { @@ -1236,7 +1254,8 @@ var schema = `{ [ "name" ] - ] + ], + "isRoot": true }, "Multicast_Group": { "columns": { @@ -1281,7 +1300,8 @@ var schema = `{ "datapath", "name" ] - ] + ], + "isRoot": true }, "Port_Binding": { "columns": { @@ -1505,7 +1525,8 @@ var schema = `{ [ "logical_port" ] - ] + ], + "isRoot": true }, "Port_Group": { "columns": { @@ -1526,7 +1547,8 @@ var schema = `{ [ "name" ] - ] + ], + "isRoot": true }, "RBAC_Permission": { "columns": { @@ -1554,7 +1576,8 @@ var schema = `{ "max": "unlimited" } } - } + }, + "isRoot": true }, "RBAC_Role": { "columns": { @@ -1575,7 +1598,8 @@ var schema = `{ "max": "unlimited" } } - } + }, + "isRoot": true }, "SB_Global": { "columns": { @@ -1629,7 +1653,8 @@ var schema = `{ "max": 1 } } - } + }, + "isRoot": true }, "SSL": { "columns": { @@ -1753,7 +1778,8 @@ var schema = `{ "port", "protocol" ] - ] + ], + "isRoot": true }, "Static_MAC_Binding": { "columns": { @@ -1783,7 +1809,8 @@ var schema = `{ "logical_port", "ip" ] - ] + ], + "isRoot": true } } }`