Skip to content

Commit 12eb90b

Browse files
committed
fix duplicate acls because of parentkey (#5357)
* fix duplicate acls because of parentkey Signed-off-by: clyi <[email protected]> --------- Signed-off-by: clyi <[email protected]>
1 parent 83fbcae commit 12eb90b

File tree

4 files changed

+101
-7
lines changed

4 files changed

+101
-7
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: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@ import (
2828

2929
func (c *Controller) InitOVN() error {
3030
var err error
31-
if err = c.migrateACLTier(); err != nil {
32-
klog.Errorf("failed to migrate ACL tier: %v", err)
31+
32+
if err = c.migrateACLForVersionCompat(); err != nil {
33+
klog.Errorf("failed to sync the older acl : %v", err)
3334
return err
3435
}
3536

@@ -68,11 +69,20 @@ func (c *Controller) InitOVN() error {
6869
return nil
6970
}
7071

71-
// migrate tier field of ACL rules created in versions prior to v1.13.0
72-
// after upgrading, the tier field has a default value of zero, which is not the value used in versions >= v1.13.0
73-
// we need to migrate the tier field to the correct value
74-
func (c *Controller) migrateACLTier() error {
75-
return c.OVNNbClient.MigrateACLTier()
72+
func (c *Controller) migrateACLForVersionCompat() error {
73+
// migrate tier field of ACL rules created in versions prior to v1.13.0
74+
// after upgrading, the tier field has a default value of zero, which is not the value used in versions >= v1.13.0
75+
// we need to migrate the tier field to the correct value
76+
if err := c.OVNNbClient.MigrateACLTier(); err != nil {
77+
klog.Errorf("failed to migrate ACL tier: %v", err)
78+
return err
79+
}
80+
// clean all no parent key acls
81+
if err := c.OVNNbClient.CleanNoParentKeyAcls(); err != nil {
82+
klog.Errorf("failed to clean all no parent key acls: %v", err)
83+
return err
84+
}
85+
return nil
7686
}
7787

7888
func (c *Controller) InitDefaultVpc() error {

pkg/ovs/interface.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ type ACL interface {
157157
DeleteAclsOps(parentName, parentType, direction string, externalIDs map[string]string) ([]ovsdb.Operation, error)
158158
UpdateAnpRuleACLOps(pgName, asName, protocol, aclName string, priority int, aclAction ovnnb.ACLAction, logACLActions []ovnnb.ACLAction, rulePorts []v1alpha1.AdminNetworkPolicyPort, isIngress, isBanp bool) ([]ovsdb.Operation, error)
159159
MigrateACLTier() error
160+
CleanNoParentKeyAcls() error
160161
}
161162

162163
type AddressSet interface {

pkg/ovs/ovn-nb-acl.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1486,3 +1486,58 @@ func (c *OVNNbClient) MigrateACLTier() error {
14861486

14871487
return nil
14881488
}
1489+
1490+
func (c *OVNNbClient) CleanNoParentKeyAcls() error {
1491+
ctx, cancel := context.WithTimeout(context.Background(), c.Timeout)
1492+
defer cancel()
1493+
1494+
var aclList []ovnnb.ACL
1495+
if err := c.ovsDbClient.WhereCache(func(acl *ovnnb.ACL) bool {
1496+
_, ok := acl.ExternalIDs[aclParentKey]
1497+
return !ok
1498+
}).List(ctx, &aclList); err != nil {
1499+
err = fmt.Errorf("failed to list acls without parent: %w", err)
1500+
klog.Error(err)
1501+
return err
1502+
}
1503+
1504+
ops := make([]ovsdb.Operation, 0, len(aclList))
1505+
for _, acl := range aclList {
1506+
var portGroups []ovnnb.PortGroup
1507+
if err := c.ovsDbClient.WhereCache(func(pg *ovnnb.PortGroup) bool {
1508+
return slices.Contains(pg.ACLs, acl.UUID)
1509+
}).List(ctx, &portGroups); err == nil {
1510+
for _, pg := range portGroups {
1511+
op, err := c.portGroupUpdateACLOp(pg.Name, []string{acl.UUID}, ovsdb.MutateOperationDelete)
1512+
if err == nil {
1513+
ops = append(ops, op...)
1514+
}
1515+
}
1516+
}
1517+
var logicalSwitches []ovnnb.LogicalSwitch
1518+
if err := c.ovsDbClient.WhereCache(func(ls *ovnnb.LogicalSwitch) bool {
1519+
return slices.Contains(ls.ACLs, acl.UUID)
1520+
}).List(ctx, &logicalSwitches); err == nil {
1521+
for _, ls := range logicalSwitches {
1522+
op, err := c.logicalSwitchUpdateACLOp(ls.Name, []string{acl.UUID}, ovsdb.MutateOperationDelete)
1523+
if err == nil {
1524+
ops = append(ops, op...)
1525+
}
1526+
}
1527+
}
1528+
delOp, err := c.Where(&acl).Delete()
1529+
if err == nil {
1530+
ops = append(ops, delOp...)
1531+
}
1532+
}
1533+
if len(ops) == 0 {
1534+
return nil
1535+
}
1536+
1537+
if err := c.Transact("acl-clean-no-parent", ops); err != nil {
1538+
klog.Error(err)
1539+
return fmt.Errorf("failed to clean acls without parent: %w", err)
1540+
}
1541+
1542+
return nil
1543+
}

0 commit comments

Comments
 (0)