11package node
22
33import (
4+ "context"
45 "fmt"
56 "net"
67 "sort"
@@ -11,6 +12,7 @@ import (
1112
1213 "github.com/containernetworking/plugins/pkg/ns"
1314 "github.com/containernetworking/plugins/pkg/testutils"
15+ nadapi "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io/v1"
1416 nadfake "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/clientset/versioned/fake"
1517 "github.com/stretchr/testify/mock"
1618 "github.com/vishvananda/netlink"
@@ -21,6 +23,7 @@ import (
2123 "k8s.io/client-go/kubernetes/fake"
2224 utilnet "k8s.io/utils/net"
2325 "k8s.io/utils/ptr"
26+ "sigs.k8s.io/knftables"
2427
2528 "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/config"
2629 udnfakeclient "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/crd/userdefinednetwork/v1/apis/clientset/versioned/fake"
@@ -1652,3 +1655,137 @@ func TestConstructUDNVRFIPRulesPodNetworkAdvertised(t *testing.T) {
16521655 })
16531656 }
16541657}
1658+
1659+ func TestUserDefinedNetworkGateway_updateAdvertisedUDNIsolationRules (t * testing.T ) {
1660+ tests := []struct {
1661+ name string
1662+ nad * nadapi.NetworkAttachmentDefinition
1663+ isNetworkAdvertised bool
1664+ initialElements []* knftables.Element
1665+ expectedV4Elements []* knftables.Element
1666+ expectedV6Elements []* knftables.Element
1667+ }{
1668+ {
1669+ name : "Should add V4 and V6 entries to the set for advertised L3 network" ,
1670+ nad : ovntest .GenerateNAD ("test" , "rednad" , "greenamespace" ,
1671+ types .Layer3Topology , "100.128.0.0/16/24,ae70::/60/64" , types .NetworkRolePrimary ),
1672+ isNetworkAdvertised : true ,
1673+ expectedV4Elements : []* knftables.Element {{
1674+ Set : nftablesAdvertisedUDNsSetV4 ,
1675+ Key : []string {"100.128.0.0/16" },
1676+ Comment : knftables.PtrTo [string ]("test" ),
1677+ }},
1678+ expectedV6Elements : []* knftables.Element {{
1679+ Set : nftablesAdvertisedUDNsSetV6 ,
1680+ Key : []string {"ae70::/60" },
1681+ Comment : knftables.PtrTo [string ]("test" ),
1682+ }},
1683+ },
1684+ {
1685+ name : "Should add V4 and V6 entries to the set for advertised L2 network" ,
1686+ nad : ovntest .GenerateNAD ("test" , "rednad" , "greenamespace" ,
1687+ types .Layer2Topology , "100.128.0.0/16,ae70::/60" , types .NetworkRolePrimary ),
1688+ isNetworkAdvertised : true ,
1689+ expectedV4Elements : []* knftables.Element {{
1690+ Set : nftablesAdvertisedUDNsSetV4 ,
1691+ Key : []string {"100.128.0.0/16" },
1692+ Comment : knftables.PtrTo [string ]("test" ),
1693+ }},
1694+ expectedV6Elements : []* knftables.Element {{
1695+ Set : nftablesAdvertisedUDNsSetV6 ,
1696+ Key : []string {"ae70::/60" },
1697+ Comment : knftables.PtrTo [string ]("test" ),
1698+ }},
1699+ },
1700+ {
1701+ name : "Should not add duplicate V4 and V6 entries to the for advertised network" ,
1702+ nad : ovntest .GenerateNAD ("test" , "rednad" , "greenamespace" ,
1703+ types .Layer3Topology , "100.128.0.0/16/24,ae70::/60/64" , types .NetworkRolePrimary ),
1704+ isNetworkAdvertised : true ,
1705+ initialElements : []* knftables.Element {
1706+ {
1707+ Set : nftablesAdvertisedUDNsSetV4 ,
1708+ Key : []string {"100.128.0.0/16" },
1709+ Comment : knftables.PtrTo [string ]("test" ),
1710+ }, {
1711+ Set : nftablesAdvertisedUDNsSetV6 ,
1712+ Key : []string {"ae70::/60" },
1713+ Comment : knftables.PtrTo [string ]("test" ),
1714+ },
1715+ },
1716+ expectedV4Elements : []* knftables.Element {{
1717+ Set : nftablesAdvertisedUDNsSetV4 ,
1718+ Key : []string {"100.128.0.0/16" },
1719+ Comment : knftables.PtrTo [string ]("test" ),
1720+ }},
1721+ expectedV6Elements : []* knftables.Element {{
1722+ Set : nftablesAdvertisedUDNsSetV6 ,
1723+ Key : []string {"ae70::/60" },
1724+ Comment : knftables.PtrTo [string ]("test" ),
1725+ }},
1726+ },
1727+ {
1728+ name : "Should remove V4 and V6 entries from the set when network for not advertised network" ,
1729+ nad : ovntest .GenerateNAD ("test" , "rednad" , "greenamespace" ,
1730+ types .Layer3Topology , "100.128.0.0/16/24,ae70::/60/64" , types .NetworkRolePrimary ),
1731+ isNetworkAdvertised : false ,
1732+ initialElements : []* knftables.Element {
1733+ {
1734+ Set : nftablesAdvertisedUDNsSetV4 ,
1735+ Key : []string {"100.128.0.0/16" },
1736+ Comment : knftables.PtrTo [string ]("test" ),
1737+ }, {
1738+ Set : nftablesAdvertisedUDNsSetV6 ,
1739+ Key : []string {"ae70::/60" },
1740+ Comment : knftables.PtrTo [string ]("test" ),
1741+ },
1742+ },
1743+ },
1744+ }
1745+ for _ , tt := range tests {
1746+ t .Run (tt .name , func (t * testing.T ) {
1747+ g := NewWithT (t )
1748+ nft := nodenft .SetFakeNFTablesHelper ()
1749+ config .IPv4Mode = true
1750+ config .IPv6Mode = true
1751+
1752+ netInfo , err := util .ParseNADInfo (tt .nad )
1753+ g .Expect (err ).NotTo (HaveOccurred ())
1754+
1755+ err = configureAdvertisedUDNIsolationNFTables ()
1756+ g .Expect (err ).ToNot (HaveOccurred ())
1757+ tx := nft .NewTransaction ()
1758+ for _ , element := range tt .initialElements {
1759+ tx .Add (element )
1760+ }
1761+ if tx .NumOperations () > 0 {
1762+ err = nft .Run (context .TODO (), tx )
1763+ g .Expect (err ).NotTo (HaveOccurred ())
1764+ }
1765+ udng := & UserDefinedNetworkGateway {
1766+ NetInfo : netInfo ,
1767+ }
1768+ err = udng .updateAdvertisedUDNIsolationRules (tt .isNetworkAdvertised )
1769+ g .Expect (err ).NotTo (HaveOccurred ())
1770+
1771+ v4Elems , err := nft .ListElements (context .TODO (), "set" , nftablesAdvertisedUDNsSetV4 )
1772+ g .Expect (err ).NotTo (HaveOccurred ())
1773+ g .Expect (v4Elems ).To (HaveLen (len (tt .expectedV4Elements )))
1774+
1775+ v6Elems , err := nft .ListElements (context .TODO (), "set" , nftablesAdvertisedUDNsSetV6 )
1776+ g .Expect (err ).NotTo (HaveOccurred ())
1777+ g .Expect (v6Elems ).To (HaveLen (len (tt .expectedV6Elements )))
1778+
1779+ for i , element := range tt .expectedV4Elements {
1780+ g .Expect (element .Key ).To (HaveLen (len (v4Elems [i ].Key )))
1781+ g .Expect (element .Key [0 ]).To (BeEquivalentTo (v4Elems [i ].Key [0 ]))
1782+ g .Expect (element .Comment ).To (BeEquivalentTo (v4Elems [i ].Comment ))
1783+ }
1784+ for i , element := range tt .expectedV6Elements {
1785+ g .Expect (element .Key ).To (HaveLen (len (v6Elems [i ].Key )))
1786+ g .Expect (element .Key [0 ]).To (BeEquivalentTo (v6Elems [i ].Key [0 ]))
1787+ g .Expect (element .Comment ).To (BeEquivalentTo (v6Elems [i ].Comment ))
1788+ }
1789+ })
1790+ }
1791+ }
0 commit comments