Skip to content

Commit 0d8c1a9

Browse files
support vip dual stack (kubeovn#3617)
Signed-off-by: zcq98 <[email protected]> Co-authored-by: zcq98 <[email protected]> Signed-off-by: zhangzujian <[email protected]>
1 parent 2960014 commit 0d8c1a9

27 files changed

+691
-576
lines changed

Diff for: go.mod

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ require (
1515
github.com/emicklei/go-restful/v3 v3.12.1
1616
github.com/evanphx/json-patch/v5 v5.9.0
1717
github.com/go-logr/stdr v1.2.2
18+
github.com/google/uuid v1.6.0
1819
github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.7.0
1920
github.com/k8snetworkplumbingwg/sriovnet v1.2.0
2021
github.com/kubeovn/felix v0.0.0-20240506083207-ed396be1b6cf
@@ -92,7 +93,6 @@ require (
9293
github.com/google/go-cmp v0.6.0 // indirect
9394
github.com/google/gofuzz v1.2.0 // indirect
9495
github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect
95-
github.com/google/uuid v1.6.0 // indirect
9696
github.com/gopherjs/gopherjs v1.17.2 // indirect
9797
github.com/gorilla/websocket v1.5.3 // indirect
9898
github.com/grpc-ecosystem/grpc-gateway/v2 v2.21.0 // indirect
@@ -186,7 +186,7 @@ require (
186186
replace (
187187
github.com/mdlayher/arp => github.com/kubeovn/arp v0.0.0-20240218024213-d9612a263f68
188188
github.com/openshift/client-go => github.com/openshift/client-go v0.0.1
189-
github.com/ovn-org/libovsdb => github.com/kubeovn/libovsdb v0.0.0-20230517064328-9d5a1383643f
189+
github.com/ovn-org/libovsdb => github.com/kubeovn/libovsdb v0.0.0-20240218023647-f0bc3ce57fcd
190190
k8s.io/api => k8s.io/api v0.30.4
191191
k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.30.4
192192
k8s.io/apimachinery => k8s.io/apimachinery v0.30.4

Diff for: go.sum

+2-2
Original file line numberDiff line numberDiff line change
@@ -1015,8 +1015,8 @@ github.com/kubeovn/go-iptables v0.0.0-20230322103850-8619a8ab3dca h1:fTMjoho2et9
10151015
github.com/kubeovn/go-iptables v0.0.0-20230322103850-8619a8ab3dca/go.mod h1:jY1XeGzkx8ASNJ+SqQSxTESNXARkjvt+I6IJOTnzIjw=
10161016
github.com/kubeovn/gonetworkmanager/v2 v2.0.0-20230905082151-e28c4d73a589 h1:y9exo1hjCsq7jsGUzt11kxhTiEGrGSQ0ZqibAiZk2PQ=
10171017
github.com/kubeovn/gonetworkmanager/v2 v2.0.0-20230905082151-e28c4d73a589/go.mod h1:49upX+/hUyppWIqu58cumojyIwXdkA8k6reA/mQlKuI=
1018-
github.com/kubeovn/libovsdb v0.0.0-20230517064328-9d5a1383643f h1:HDjnbJZN+2T3XH7usjtO2+PYDA2fyrLGYjypEA/87pM=
1019-
github.com/kubeovn/libovsdb v0.0.0-20230517064328-9d5a1383643f/go.mod h1:NHoQwGSKygdpFb8y7HBS6b1HP4EtJ14zzLrnd/A1fmY=
1018+
github.com/kubeovn/libovsdb v0.0.0-20240218023647-f0bc3ce57fcd h1:GhgvSBFKEkVNgDq8IslC04NVuoznreZH/Imz/cr6bhs=
1019+
github.com/kubeovn/libovsdb v0.0.0-20240218023647-f0bc3ce57fcd/go.mod h1:pTnlGt1JZrncr6pJn/Fhnp3FFTMQRaTVxiSKBLVGa5s=
10201020
github.com/kubeovn/ovsdb v0.0.0-20240410091831-5dd26006c475 h1:KZba2Kj9TXCUdUSqOR3eiy4VvkkIyhDVImYmYs6GQWU=
10211021
github.com/kubeovn/ovsdb v0.0.0-20240410091831-5dd26006c475/go.mod h1:LAd0qoeAAm/QyZcpxN2BnpndM2/dhZt+/kokPvcxKcE=
10221022
github.com/kubernetes-csi/external-snapshotter/client/v4 v4.2.0 h1:nHHjmvjitIiyPlUHk/ofpgvBcNcawJLtf4PYHORLjAA=

Diff for: mocks/pkg/ovs/interface.go

+28
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: pkg/ovs/interface.go

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ type LogicalSwitch interface {
6060

6161
type LogicalSwitchPort interface {
6262
CreateLogicalSwitchPort(lsName, lspName, ip, mac, podName, namespace string, portSecurity bool, securityGroups, vips string, enableDHCP bool, dhcpOptions *DHCPOptionsUUIDs, vpc string) error
63+
CreateVirtualLogicalSwitchPort(lspName, lsName, ip string) error
6364
CreateBareLogicalSwitchPort(lsName, lspName, ip, mac string) error
6465
CreateLocalnetLogicalSwitchPort(lsName, lspName, provider, cidrBlock string, vlanID int) error
6566
CreateVirtualLogicalSwitchPorts(lsName string, ips ...string) error

Diff for: pkg/ovs/ovn-nb-acl_test.go

+18-3
Original file line numberDiff line numberDiff line change
@@ -1407,7 +1407,13 @@ func (suite *OvnClientTestSuite) testGetACL() {
14071407
priority := "2000"
14081408
match := "ip4.dst == 100.64.0.0/16"
14091409

1410-
err := ovnClient.CreateBareACL(pgName, ovnnb.ACLDirectionToLport, priority, match, ovnnb.ACLActionAllowRelated)
1410+
err := ovnClient.CreatePortGroup(pgName, nil)
1411+
require.NoError(t, err)
1412+
1413+
acl, err := ovnClient.newACL(pgName, ovnnb.ACLDirectionToLport, priority, match, ovnnb.ACLActionAllowRelated)
1414+
require.NoError(t, err)
1415+
1416+
err = ovnClient.CreateAcls(pgName, portGroupKey, acl)
14111417
require.NoError(t, err)
14121418

14131419
t.Run("direction, priority and match are same", func(t *testing.T) {
@@ -1456,18 +1462,27 @@ func (suite *OvnClientTestSuite) testListAcls() {
14561462
pgName := "test-list-acl-pg"
14571463
basePort := 50000
14581464

1465+
err := ovnClient.CreatePortGroup(pgName, nil)
1466+
require.NoError(t, err)
1467+
14591468
matchPrefix := "outport == @ovn.sg.test_list_acl_pg && ip"
14601469
// create two to-lport acl
14611470
for i := 0; i < 2; i++ {
14621471
match := fmt.Sprintf("%s && tcp.dst == %d", matchPrefix, basePort+i)
1463-
err := ovnClient.CreateBareACL(pgName, ovnnb.ACLDirectionToLport, "9999", match, ovnnb.ACLActionAllowRelated)
1472+
acl, err := ovnClient.newACL(pgName, ovnnb.ACLDirectionToLport, "9999", match, ovnnb.ACLActionAllowRelated)
1473+
require.NoError(t, err)
1474+
1475+
err = ovnClient.CreateAcls(pgName, portGroupKey, acl)
14641476
require.NoError(t, err)
14651477
}
14661478

14671479
// create two from-lport acl
14681480
for i := 0; i < 3; i++ {
14691481
match := fmt.Sprintf("%s && tcp.dst == %d", matchPrefix, basePort+i)
1470-
err := ovnClient.CreateBareACL(pgName, ovnnb.ACLDirectionFromLport, "9999", match, ovnnb.ACLActionAllowRelated)
1482+
acl, err := ovnClient.newACL(pgName, ovnnb.ACLDirectionFromLport, "9999", match, ovnnb.ACLActionAllowRelated)
1483+
require.NoError(t, err)
1484+
1485+
err = ovnClient.CreateAcls(pgName, portGroupKey, acl)
14711486
require.NoError(t, err)
14721487
}
14731488

Diff for: pkg/ovs/ovn-nb-bfd_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,9 @@ func (suite *OvnClientTestSuite) testDeleteBFD() {
8181
t.Parallel()
8282

8383
ovnClient := suite.ovnClient
84-
lrpName := "test-list-bfd"
85-
dstIP1 := "192.168.124.1"
86-
dstIP2 := "192.168.124.2"
84+
lrpName := "test-del-bfd"
85+
dstIP1 := "192.168.124.4"
86+
dstIP2 := "192.168.124.5"
8787
minRx1, minTx1, detectMult1 := 101, 102, 19
8888
minRx2, minTx2, detectMult2 := 201, 202, 29
8989

Diff for: pkg/ovs/ovn-nb-gateway_chassis.go

+23-13
Original file line numberDiff line numberDiff line change
@@ -37,22 +37,33 @@ func (c *OVNNbClient) DeleteGatewayChassises(lrpName string, chassises []string)
3737
return nil
3838
}
3939

40-
ops := make([]ovsdb.Operation, 0, len(chassises))
40+
lrp, err := c.GetLogicalRouterPort(lrpName, false)
41+
if err != nil {
42+
klog.Error(err)
43+
return err
44+
}
4145

46+
ops := make([]ovsdb.Operation, 0, len(chassises)*2)
4247
for _, chassisName := range chassises {
4348
gwChassisName := lrpName + "-" + chassisName
44-
op, err := c.DeleteGatewayChassisOp(gwChassisName)
49+
uuid, delOps, err := c.DeleteGatewayChassisOp(gwChassisName)
4550
if err != nil {
4651
klog.Error(err)
4752
return nil
4853
}
4954

50-
// ignore non-existent object
51-
if len(op) == 0 {
52-
continue
55+
mutateOps, err := c.Where(lrp).Mutate(lrp, model.Mutation{
56+
Field: &lrp.GatewayChassis,
57+
Value: []string{uuid},
58+
Mutator: ovsdb.MutateOperationDelete,
59+
})
60+
if err != nil {
61+
klog.Error(err)
62+
return nil
5363
}
5464

55-
ops = append(ops, op...)
65+
ops = append(ops, mutateOps...)
66+
ops = append(ops, delOps...)
5667
}
5768

5869
if err := c.Transact("gateway-chassises-delete", ops); err != nil {
@@ -160,23 +171,22 @@ func (c *OVNNbClient) CreateGatewayChassisesOp(lrpName string, chassises []strin
160171
}
161172

162173
// DeleteGatewayChassisOp create operation which delete gateway chassis
163-
func (c *OVNNbClient) DeleteGatewayChassisOp(chassisName string) ([]ovsdb.Operation, error) {
174+
func (c *OVNNbClient) DeleteGatewayChassisOp(chassisName string) (uuid string, ops []ovsdb.Operation, err error) {
164175
gwChassis, err := c.GetGatewayChassis(chassisName, true)
165176
if err != nil {
166177
klog.Error(err)
167-
return nil, err
178+
return "", nil, err
168179
}
169180

170181
// not found, skip
171182
if gwChassis == nil {
172-
return nil, nil
183+
return "", nil, nil
173184
}
174185

175-
op, err := c.Where(gwChassis).Delete()
176-
if err != nil {
186+
if ops, err = c.Where(gwChassis).Delete(); err != nil {
177187
klog.Error(err)
178-
return nil, err
188+
return "", nil, err
179189
}
180190

181-
return op, nil
191+
return gwChassis.UUID, ops, nil
182192
}

Diff for: pkg/ovs/ovn-nb-gateway_chassis_test.go

+28-32
Original file line numberDiff line numberDiff line change
@@ -4,39 +4,37 @@ import (
44
"github.com/ovn-org/libovsdb/ovsdb"
55
"github.com/stretchr/testify/require"
66

7-
ovsclient "github.com/kubeovn/kube-ovn/pkg/ovsdb/client"
87
"github.com/kubeovn/kube-ovn/pkg/ovsdb/ovnnb"
9-
"github.com/kubeovn/kube-ovn/pkg/util"
108
)
119

1210
func (suite *OvnClientTestSuite) testCreateGatewayChassises() {
1311
t := suite.T()
1412
t.Parallel()
1513

1614
ovnClient := suite.ovnClient
15+
lrName := "test-create-gateway-chassises-lr"
16+
lrpName := "test-create-gateway-chassises-lrp"
1717
chassises := []string{"c7efec70-9519-4b03-8b67-057f2a95e5c7", "4a0891b6-fe81-4986-a367-aad0ea7ca9f3", "dcc2eda3-b3ea-4d53-afe0-7b6eaf7917ba"}
1818

19-
lrp := &ovnnb.LogicalRouterPort{
20-
UUID: ovsclient.NamedUUID(),
21-
Name: "test-create-gateway-chassises",
22-
ExternalIDs: map[string]string{
23-
"vendor": util.CniTypeName,
24-
},
25-
}
19+
err := ovnClient.CreateLogicalRouter(lrName)
20+
require.NoError(t, err)
2621

27-
err := createLogicalRouterPort(ovnClient, lrp)
22+
err = ovnClient.CreateLogicalRouterPort(lrName, lrpName, "00:11:22:37:af:62", []string{"fd00::c0a8:1001/120"})
2823
require.NoError(t, err)
2924

30-
err = ovnClient.CreateGatewayChassises(lrp.Name, chassises...)
25+
err = ovnClient.CreateGatewayChassises(lrpName, chassises...)
3126
require.NoError(t, err)
3227

33-
lrp, err = ovnClient.GetLogicalRouterPort(lrp.Name, false)
28+
lrp, err := ovnClient.GetLogicalRouterPort(lrpName, false)
3429
require.NoError(t, err)
30+
require.NotNil(t, lrp)
31+
require.Len(t, lrp.GatewayChassis, len(chassises))
3532

3633
for i, chassisName := range chassises {
3734
gwChassisName := lrp.Name + "-" + chassisName
3835
gwChassis, err := ovnClient.GetGatewayChassis(gwChassisName, false)
3936
require.NoError(t, err)
37+
require.NotNil(t, gwChassis)
4038
require.Equal(t, gwChassisName, gwChassis.Name)
4139
require.Equal(t, chassisName, gwChassis.ChassisName)
4240
require.Equal(t, 100-i, gwChassis.Priority)
@@ -49,18 +47,14 @@ func (suite *OvnClientTestSuite) testDeleteGatewayChassises() {
4947
t.Parallel()
5048

5149
ovnClient := suite.ovnClient
50+
lrName := "test-gateway-chassis-del-lr"
5251
lrpName := "test-gateway-chassis-del-lrp"
5352
chassises := []string{"ea8368a0-28cd-4549-9da5-a7ea67262619", "b25ffb94-8b32-4c7e-b5b0-0f343bf6bdd8", "62265268-8af7-4b36-a550-ab5ad38375e3"}
5453

55-
lrp := &ovnnb.LogicalRouterPort{
56-
UUID: ovsclient.NamedUUID(),
57-
Name: lrpName,
58-
ExternalIDs: map[string]string{
59-
"vendor": util.CniTypeName,
60-
},
61-
}
54+
err := ovnClient.CreateLogicalRouter(lrName)
55+
require.NoError(t, err)
6256

63-
err := createLogicalRouterPort(ovnClient, lrp)
57+
err = ovnClient.CreateLogicalRouterPort(lrName, lrpName, "00:11:22:37:af:62", []string{"fd00::c0a8:1001/120"})
6458
require.NoError(t, err)
6559

6660
err = ovnClient.CreateGatewayChassises(lrpName, chassises...)
@@ -69,6 +63,11 @@ func (suite *OvnClientTestSuite) testDeleteGatewayChassises() {
6963
err = ovnClient.DeleteGatewayChassises(lrpName, append(chassises, "73bbe5d4-2b9b-47d0-aba8-94e86941881a"))
7064
require.NoError(t, err)
7165

66+
lrp, err := ovnClient.GetLogicalRouterPort(lrpName, false)
67+
require.NoError(t, err)
68+
require.NotNil(t, lrp)
69+
require.Len(t, lrp.GatewayChassis, 0)
70+
7271
for _, chassisName := range chassises {
7372
gwChassisName := lrpName + "-" + chassisName
7473
_, err := ovnClient.GetGatewayChassis(gwChassisName, false)
@@ -81,19 +80,15 @@ func (suite *OvnClientTestSuite) testDeleteGatewayChassisOp() {
8180
t.Parallel()
8281

8382
ovnClient := suite.ovnClient
83+
lrName := "test-gateway-chassis-del-op-lr"
8484
lrpName := "test-gateway-chassis-del-op-lrp"
8585
chassis := "6c322ce8-02b7-42b3-925b-ae24020272a9"
8686
gwChassisName := lrpName + "-" + chassis
8787

88-
lrp := &ovnnb.LogicalRouterPort{
89-
UUID: ovsclient.NamedUUID(),
90-
Name: lrpName,
91-
ExternalIDs: map[string]string{
92-
"vendor": util.CniTypeName,
93-
},
94-
}
88+
err := ovnClient.CreateLogicalRouter(lrName)
89+
require.NoError(t, err)
9590

96-
err := createLogicalRouterPort(ovnClient, lrp)
91+
err = ovnClient.CreateLogicalRouterPort(lrName, lrpName, "00:11:22:37:af:62", []string{"fd00::c0a8:1001/120"})
9792
require.NoError(t, err)
9893

9994
err = ovnClient.CreateGatewayChassises(lrpName, chassis)
@@ -102,18 +97,19 @@ func (suite *OvnClientTestSuite) testDeleteGatewayChassisOp() {
10297
gwChassis, err := ovnClient.GetGatewayChassis(gwChassisName, false)
10398
require.NoError(t, err)
10499

105-
ops, err := ovnClient.DeleteGatewayChassisOp(gwChassisName)
100+
uuid, ops, err := ovnClient.DeleteGatewayChassisOp(gwChassisName)
106101
require.NoError(t, err)
102+
require.Equal(t, gwChassis.UUID, uuid)
107103
require.Len(t, ops, 1)
108104

109105
require.Equal(t,
110106
ovsdb.Operation{
111-
Op: "delete",
112-
Table: "Gateway_Chassis",
107+
Op: ovsdb.OperationDelete,
108+
Table: ovnnb.GatewayChassisTable,
113109
Where: []ovsdb.Condition{
114110
{
115111
Column: "_uuid",
116-
Function: "==",
112+
Function: ovsdb.ConditionEqual,
117113
Value: ovsdb.UUID{
118114
GoUUID: gwChassis.UUID,
119115
},

Diff for: pkg/ovs/ovn-nb-load_balancer.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -556,7 +556,7 @@ func (c *OVNNbClient) LoadBalancerDeleteHealthCheck(lbName, uuid string) error {
556556
if len(ops) == 0 {
557557
return nil
558558
}
559-
if err = c.Transact("lb-del", ops); err != nil {
559+
if err = c.Transact("lb-hc-del", ops); err != nil {
560560
return fmt.Errorf("failed to delete health check %s from load balancers %s: %v", uuid, lbName, err)
561561
}
562562
}

0 commit comments

Comments
 (0)