@@ -1475,229 +1475,6 @@ var _ = ginkgo.Describe("Hybrid SDN Master Operations", func() {
14751475 gomega .Expect (err ).NotTo (gomega .HaveOccurred ())
14761476 })
14771477
1478- ginkgo .It ("cleans up a Linux node when the OVN hostsubnet annotation is removed" , func () {
1479- app .Action = func (ctx * cli.Context ) error {
1480- const (
1481- nodeHOMAC string = "0a:58:0a:01:01:03"
1482- hoSubnet string = "11.1.0.0/16"
1483- nodeHOIP string = "10.1.1.3"
1484- )
1485- node1 := tNode {
1486- Name : "node1" ,
1487- NodeIP : "1.2.3.4" ,
1488- NodeLRPMAC : "0a:58:0a:01:01:01" ,
1489- LrpIP : "100.64.0.2" ,
1490- DrLrpIP : "100.64.0.1" ,
1491- PhysicalBridgeMAC : "11:22:33:44:55:66" ,
1492- SystemID : "cb9ec8fa-b409-4ef3-9f42-d9283c47aac6" ,
1493- NodeSubnet : "10.1.1.0/24" ,
1494- GWRouter : types .GWRouterPrefix + "node1" ,
1495- GatewayRouterIPMask : "172.16.16.2/24" ,
1496- GatewayRouterIP : "172.16.16.2" ,
1497- GatewayRouterNextHop : "172.16.16.1" ,
1498- PhysicalBridgeName : "br-eth0" ,
1499- NodeGWIP : "10.1.1.1/24" ,
1500- NodeMgmtPortIP : "10.1.1.2" ,
1501- //NodeMgmtPortMAC: "0a:58:0a:01:01:02",
1502- NodeMgmtPortMAC : "0a:58:64:40:00:03" ,
1503- DnatSnatIP : "169.254.0.1" ,
1504- }
1505- testNode := node1 .k8sNode ("2" )
1506-
1507- kubeFakeClient := fake .NewSimpleClientset (& corev1.NodeList {
1508- Items : []corev1.Node {testNode },
1509- })
1510- egressFirewallFakeClient := & egressfirewallfake.Clientset {}
1511- egressIPFakeClient := & egressipfake.Clientset {}
1512- egressQoSFakeClient := & egressqosfake.Clientset {}
1513- egressServiceFakeClient := & egressservicefake.Clientset {}
1514- fakeClient := & util.OVNMasterClientset {
1515- KubeClient : kubeFakeClient ,
1516- EgressIPClient : egressIPFakeClient ,
1517- EgressFirewallClient : egressFirewallFakeClient ,
1518- EgressQoSClient : egressQoSFakeClient ,
1519- EgressServiceClient : egressServiceFakeClient ,
1520- }
1521-
1522- vlanID := 1024
1523- _ , err := config .InitConfig (ctx , nil , nil )
1524- gomega .Expect (err ).NotTo (gomega .HaveOccurred ())
1525- config .Kubernetes .HostNetworkNamespace = ""
1526- nodeAnnotator := kube .NewNodeAnnotator (& kube.Kube {KClient : kubeFakeClient }, testNode .Name )
1527- l3Config := node1 .gatewayConfig (config .GatewayModeShared , uint (vlanID ))
1528- err = util .SetL3GatewayConfig (nodeAnnotator , l3Config )
1529- gomega .Expect (err ).NotTo (gomega .HaveOccurred ())
1530- err = util .UpdateNodeManagementPortMACAddresses (& testNode , nodeAnnotator ,
1531- ovntest .MustParseMAC (node1 .NodeMgmtPortMAC ), types .DefaultNetworkName )
1532- gomega .Expect (err ).NotTo (gomega .HaveOccurred ())
1533- err = util .SetNodeHostSubnetAnnotation (nodeAnnotator , ovntest .MustParseIPNets (node1 .NodeSubnet ))
1534- gomega .Expect (err ).NotTo (gomega .HaveOccurred ())
1535- err = util .SetNodeHostCIDRs (nodeAnnotator , sets .New (fmt .Sprintf ("%s/24" , node1 .NodeIP )))
1536- gomega .Expect (err ).NotTo (gomega .HaveOccurred ())
1537- err = nodeAnnotator .Run ()
1538- gomega .Expect (err ).NotTo (gomega .HaveOccurred ())
1539-
1540- updatedNode , err := fakeClient .KubeClient .CoreV1 ().Nodes ().Get (context .TODO (), testNode .Name , metav1.GetOptions {})
1541- gomega .Expect (err ).NotTo (gomega .HaveOccurred ())
1542- l3GatewayConfig , err := util .ParseNodeL3GatewayAnnotation (updatedNode )
1543- gomega .Expect (err ).NotTo (gomega .HaveOccurred ())
1544- hostAddrs , err := util .ParseNodeHostCIDRsDropNetMask (updatedNode )
1545- gomega .Expect (err ).NotTo (gomega .HaveOccurred ())
1546-
1547- f , err = factory .NewMasterWatchFactory (fakeClient )
1548- gomega .Expect (err ).NotTo (gomega .HaveOccurred ())
1549- err = f .Start ()
1550- gomega .Expect (err ).NotTo (gomega .HaveOccurred ())
1551-
1552- expectedClusterLBGroup := newLoadBalancerGroup (types .ClusterLBGroupName )
1553- expectedSwitchLBGroup := newLoadBalancerGroup (types .ClusterSwitchLBGroupName )
1554- expectedRouterLBGroup := newLoadBalancerGroup (types .ClusterRouterLBGroupName )
1555- expectedOVNClusterRouter := newOVNClusterRouter ()
1556- ovnClusterRouterLRP := & nbdb.LogicalRouterPort {
1557- Name : types .GWRouterToJoinSwitchPrefix + types .OVNClusterRouter ,
1558- Networks : []string {"100.64.0.1/16" },
1559- UUID : types .GWRouterToJoinSwitchPrefix + types .OVNClusterRouter + "-UUID" ,
1560- }
1561- expectedOVNClusterRouter .Ports = []string {ovnClusterRouterLRP .UUID }
1562- expectedNodeSwitch := node1 .logicalSwitch ([]string {expectedClusterLBGroup .UUID , expectedSwitchLBGroup .UUID })
1563- expectedClusterRouterPortGroup := newRouterPortGroup ()
1564- expectedClusterPortGroup := newClusterPortGroup ()
1565-
1566- dbSetup := libovsdbtest.TestSetup {
1567- NBData : []libovsdbtest.TestData {
1568- newClusterJoinSwitch (),
1569- expectedNodeSwitch ,
1570- ovnClusterRouterLRP ,
1571- expectedOVNClusterRouter ,
1572- expectedClusterRouterPortGroup ,
1573- expectedClusterPortGroup ,
1574- expectedClusterLBGroup ,
1575- expectedSwitchLBGroup ,
1576- expectedRouterLBGroup ,
1577- },
1578- }
1579- var libovsdbOvnNBClient , libovsdbOvnSBClient libovsdbclient.Client
1580- libovsdbOvnNBClient , libovsdbOvnSBClient , libovsdbCleanup , err = libovsdbtest .NewNBSBTestHarness (dbSetup )
1581- gomega .Expect (err ).NotTo (gomega .HaveOccurred ())
1582-
1583- expectedDatabaseState := []libovsdbtest.TestData {ovnClusterRouterLRP }
1584- expectedDatabaseState = addNodeLogicalFlows (expectedDatabaseState , expectedOVNClusterRouter , expectedNodeSwitch , expectedClusterRouterPortGroup , expectedClusterPortGroup , & node1 )
1585-
1586- clusterController , err := NewOvnController (
1587- fakeClient ,
1588- f ,
1589- stopChan ,
1590- nil ,
1591- networkmanager .Default ().Interface (),
1592- libovsdbOvnNBClient ,
1593- libovsdbOvnSBClient ,
1594- record .NewFakeRecorder (10 ),
1595- wg ,
1596- nil ,
1597- NewPortCache (stopChan ),
1598- )
1599- gomega .Expect (err ).NotTo (gomega .HaveOccurred ())
1600-
1601- setupCOPP := true
1602- setupClusterController (clusterController , setupCOPP )
1603-
1604- //assuming all the pods have finished processing
1605- atomic .StoreUint32 (& clusterController .allInitialPodsProcessed , 1 )
1606- // Let the real code run and ensure OVN database sync
1607- gomega .Expect (clusterController .WatchNodes ()).To (gomega .Succeed ())
1608-
1609- gomega .Eventually (func () (map [string ]string , error ) {
1610- updatedNode , err := fakeClient .KubeClient .CoreV1 ().Nodes ().Get (context .TODO (), testNode .Name , metav1.GetOptions {})
1611- if err != nil {
1612- return nil , err
1613- }
1614- return updatedNode .Annotations , nil
1615- }, 2 ).Should (gomega .HaveKeyWithValue (hotypes .HybridOverlayDRMAC , nodeHOMAC ))
1616-
1617- subnet := ovntest .MustParseIPNet (node1 .NodeSubnet )
1618- err = clusterController .syncDefaultGatewayLogicalNetwork (updatedNode , l3GatewayConfig , []* net.IPNet {subnet }, hostAddrs .UnsortedList ())
1619- gomega .Expect (err ).NotTo (gomega .HaveOccurred ())
1620-
1621- var clusterSubnets []* net.IPNet
1622- for _ , clusterSubnet := range config .Default .ClusterSubnets {
1623- clusterSubnets = append (clusterSubnets , clusterSubnet .CIDR )
1624- }
1625-
1626- skipSnat := false
1627- expectedDatabaseState = generateGatewayInitExpectedNB (expectedDatabaseState , expectedOVNClusterRouter ,
1628- expectedNodeSwitch , node1 .Name , clusterSubnets , []* net.IPNet {subnet }, l3Config ,
1629- []* net.IPNet {classBIPAddress (node1 .LrpIP )}, []* net.IPNet {classBIPAddress (node1 .DrLrpIP )}, skipSnat ,
1630- node1 .NodeMgmtPortIP , "1400" )
1631-
1632- hybridSubnetStaticRoute1 , hybridLogicalRouterStaticRoute , hybridSubnetLRP1 , hybridSubnetLRP2 , hybridLogicalSwitchPort := setupHybridOverlayOVNObjects (node1 , "" , hoSubnet , nodeHOIP , nodeHOMAC )
1633-
1634- var node1LogicalRouter * nbdb.LogicalRouter
1635- var basicNode1StaticRoutes []string
1636-
1637- for _ , obj := range expectedDatabaseState {
1638- if logicalRouter , ok := obj .(* nbdb.LogicalRouter ); ok {
1639- if logicalRouter .Name == "GR_node1" {
1640- // keep a referance so that we can edit this object
1641- node1LogicalRouter = logicalRouter
1642- basicNode1StaticRoutes = logicalRouter .StaticRoutes
1643- logicalRouter .StaticRoutes = append (logicalRouter .StaticRoutes , hybridLogicalRouterStaticRoute .UUID )
1644- }
1645- }
1646- }
1647-
1648- // keep copies of these before appending hybrid overlay elements
1649- basicExpectedNodeSwitchPorts := expectedNodeSwitch .Ports
1650- basicExpectedOVNClusterRouterPolicies := expectedOVNClusterRouter .Policies
1651- basicExpectedOVNClusterStaticRoutes := expectedOVNClusterRouter .StaticRoutes
1652-
1653- expectedNodeSwitch .Ports = append (expectedNodeSwitch .Ports , hybridLogicalSwitchPort .UUID )
1654- expectedOVNClusterRouter .Policies = append (expectedOVNClusterRouter .Policies , hybridSubnetLRP1 .UUID , hybridSubnetLRP2 .UUID )
1655- expectedOVNClusterRouter .StaticRoutes = append (expectedOVNClusterRouter .StaticRoutes , hybridSubnetStaticRoute1 .UUID )
1656-
1657- expectedDatabaseStateWithHybridNode := append ([]libovsdbtest.TestData {hybridSubnetStaticRoute1 , hybridSubnetLRP2 , hybridSubnetLRP1 , hybridLogicalSwitchPort , hybridLogicalRouterStaticRoute }, expectedDatabaseState ... )
1658- expectedStaticMACBinding := & nbdb.StaticMACBinding {
1659- UUID : "MAC-binding-HO-UUID" ,
1660- IP : nodeHOIP ,
1661- LogicalPort : "rtos-node1" ,
1662- MAC : nodeHOMAC ,
1663- OverrideDynamicMAC : true ,
1664- }
1665- expectedDatabaseStateWithHybridNode = append (expectedDatabaseStateWithHybridNode , expectedStaticMACBinding )
1666- gomega .Eventually (libovsdbOvnNBClient ).Should (libovsdbtest .HaveData (expectedDatabaseStateWithHybridNode ))
1667-
1668- nodeAnnotator = kube .NewNodeAnnotator (& kube.Kube {KClient : kubeFakeClient }, testNode .Name )
1669- util .DeleteNodeHostSubnetAnnotation (nodeAnnotator )
1670- err = nodeAnnotator .Run ()
1671- gomega .Expect (err ).NotTo (gomega .HaveOccurred ())
1672-
1673- gomega .Eventually (func () (map [string ]string , error ) {
1674- updatedNode , err := fakeClient .KubeClient .CoreV1 ().Nodes ().Get (context .TODO (), testNode .Name , metav1.GetOptions {})
1675- if err != nil {
1676- return nil , err
1677- }
1678- return updatedNode .Annotations , nil
1679- }, 5 ).ShouldNot (gomega .HaveKey (hotypes .HybridOverlayDRMAC ))
1680-
1681- // restore values from the non-hybrid versions
1682- expectedNodeSwitch .Ports = basicExpectedNodeSwitchPorts
1683- expectedOVNClusterRouter .Policies = basicExpectedOVNClusterRouterPolicies
1684- expectedOVNClusterRouter .StaticRoutes = basicExpectedOVNClusterStaticRoutes
1685- node1LogicalRouter .StaticRoutes = basicNode1StaticRoutes
1686-
1687- gomega .Eventually (libovsdbOvnNBClient ).Should (libovsdbtest .HaveData (expectedDatabaseState ))
1688-
1689- return nil
1690- }
1691- err := app .Run ([]string {
1692- app .Name ,
1693- "-cluster-subnets=" + clusterCIDR ,
1694- "-gateway-mode=shared" ,
1695- "-enable-hybrid-overlay" ,
1696- "-hybrid-overlay-cluster-subnets=" + hybridOverlayClusterCIDR ,
1697- })
1698- gomega .Expect (err ).NotTo (gomega .HaveOccurred ())
1699- })
1700-
17011478 ginkgo .It ("cleans up a Linux node that has hybridOverlay annotations and database objects when hybrid overlay is disabled" , func () {
17021479 app .Action = func (ctx * cli.Context ) error {
17031480 const (
0 commit comments