Skip to content

Commit 78fb865

Browse files
committed
fix duplicate acls because of parentkey
Signed-off-by: clyi <[email protected]>
1 parent c56cfd8 commit 78fb865

File tree

4 files changed

+97
-0
lines changed

4 files changed

+97
-0
lines changed

mocks/pkg/ovs/interface.go

Lines changed: 28 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/controller/init.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ import (
2323

2424
func (c *Controller) InitOVN() error {
2525
var err error
26+
if err = c.migrateACLForVersionCompat(); err != nil {
27+
klog.Errorf("failed to sync the older acl : %v", err)
28+
return err
29+
}
2630

2731
if err = c.initClusterRouter(); err != nil {
2832
klog.Errorf("init cluster router failed: %v", err)
@@ -54,6 +58,15 @@ func (c *Controller) InitOVN() error {
5458
return nil
5559
}
5660

61+
func (c *Controller) migrateACLForVersionCompat() error {
62+
// clean all no parent key acls
63+
if err := c.OVNNbClient.CleanNoParentKeyAcls(); err != nil {
64+
klog.Errorf("failed to clean all no parent key acls: %v", err)
65+
return err
66+
}
67+
return nil
68+
}
69+
5770
func (c *Controller) InitDefaultVpc() error {
5871
cachedVpc, err := c.vpcsLister.Get(c.config.ClusterRouter)
5972
if err != nil {

pkg/ovs/interface.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ type ACL interface {
138138
SGLostACL(sg *kubeovnv1.SecurityGroup) (bool, error)
139139
DeleteAcls(parentName, parentType, direction string, externalIDs map[string]string) error
140140
DeleteAclsOps(parentName, parentType, direction string, externalIDs map[string]string) ([]ovsdb.Operation, error)
141+
CleanNoParentKeyAcls() error
141142
}
142143

143144
type AddressSet interface {

pkg/ovs/ovn-nb-acl.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1274,3 +1274,58 @@ func (c *OVNNbClient) SGLostACL(sg *kubeovnv1.SecurityGroup) (bool, error) {
12741274
}
12751275
return false, nil
12761276
}
1277+
1278+
func (c *OVNNbClient) CleanNoParentKeyAcls() error {
1279+
ctx, cancel := context.WithTimeout(context.Background(), c.Timeout)
1280+
defer cancel()
1281+
1282+
var aclList []ovnnb.ACL
1283+
if err := c.ovsDbClient.WhereCache(func(acl *ovnnb.ACL) bool {
1284+
_, ok := acl.ExternalIDs[aclParentKey]
1285+
return !ok
1286+
}).List(ctx, &aclList); err != nil {
1287+
err = fmt.Errorf("failed to list acls without parent: %w", err)
1288+
klog.Error(err)
1289+
return err
1290+
}
1291+
1292+
ops := make([]ovsdb.Operation, 0, len(aclList))
1293+
for _, acl := range aclList {
1294+
var portGroups []ovnnb.PortGroup
1295+
if err := c.ovsDbClient.WhereCache(func(pg *ovnnb.PortGroup) bool {
1296+
return slices.Contains(pg.ACLs, acl.UUID)
1297+
}).List(ctx, &portGroups); err == nil {
1298+
for _, pg := range portGroups {
1299+
op, err := c.portGroupUpdateACLOp(pg.Name, []string{acl.UUID}, ovsdb.MutateOperationDelete)
1300+
if err == nil {
1301+
ops = append(ops, op...)
1302+
}
1303+
}
1304+
}
1305+
var logicalSwitches []ovnnb.LogicalSwitch
1306+
if err := c.ovsDbClient.WhereCache(func(ls *ovnnb.LogicalSwitch) bool {
1307+
return slices.Contains(ls.ACLs, acl.UUID)
1308+
}).List(ctx, &logicalSwitches); err == nil {
1309+
for _, ls := range logicalSwitches {
1310+
op, err := c.logicalSwitchUpdateACLOp(ls.Name, []string{acl.UUID}, ovsdb.MutateOperationDelete)
1311+
if err == nil {
1312+
ops = append(ops, op...)
1313+
}
1314+
}
1315+
}
1316+
delOp, err := c.Where(&acl).Delete()
1317+
if err == nil {
1318+
ops = append(ops, delOp...)
1319+
}
1320+
}
1321+
if len(ops) == 0 {
1322+
return nil
1323+
}
1324+
1325+
if err := c.Transact("acl-clean-no-parent", ops); err != nil {
1326+
klog.Error(err)
1327+
return fmt.Errorf("failed to clean acls without parent: %w", err)
1328+
}
1329+
1330+
return nil
1331+
}

0 commit comments

Comments
 (0)