• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

ovn-org / ovn-kubernetes / 10024163885

19 Jul 2024 04:40PM UTC coverage: 52.843% (+0.07%) from 52.774%
10024163885

push

github

web-flow
Merge pull request #4529 from qinqon/primary-udn-ensure-network-id

udn, controllers: Add getNetworkID helper

32 of 37 new or added lines in 3 files covered. (86.49%)

22 existing lines in 6 files now uncovered.

29706 of 56216 relevant lines covered (52.84%)

97.65 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

75.91
/go-controller/pkg/ovn/ovn.go
1
package ovn
2

3
import (
4
        "bytes"
5
        "errors"
6
        "fmt"
7
        "net"
8
        "reflect"
9
        "sync"
10
        "time"
11

12
        nettypes "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io/v1"
13
        libovsdbclient "github.com/ovn-org/libovsdb/client"
14

15
        "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/config"
16
        "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/kubevirt"
17
        libovsdbutil "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/libovsdb/util"
18
        "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/metrics"
19
        addressset "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/ovn/address_set"
20
        anpcontroller "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/ovn/controller/admin_network_policy"
21
        egresssvc_zone "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/ovn/controller/egressservice"
22
        ovntypes "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/types"
23
        "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/util"
24

25
        kapi "k8s.io/api/core/v1"
26
        "k8s.io/client-go/kubernetes/scheme"
27
        listers "k8s.io/client-go/listers/core/v1"
28
        ref "k8s.io/client-go/tools/reference"
29
        "k8s.io/klog/v2"
30
)
31

32
const egressFirewallDNSDefaultDuration = 30 * time.Minute
33

34
const (
35
        // TCP is the constant string for the string "TCP"
36
        TCP = "TCP"
37

38
        // UDP is the constant string for the string "UDP"
39
        UDP = "UDP"
40

41
        // SCTP is the constant string for the string "SCTP"
42
        SCTP = "SCTP"
43
)
44

45
// getPodNamespacedName returns <namespace>_<podname> for the provided pod
46
func getPodNamespacedName(pod *kapi.Pod) string {
3✔
47
        return util.GetLogicalPortName(pod.Namespace, pod.Name)
3✔
48
}
3✔
49

50
// syncPeriodic adds a goroutine that periodically does some work
51
// right now there is only one ticker registered
52
// for syncNodesPeriodic which deletes chassis records from the sbdb
53
// every 5 minutes
54
func (oc *DefaultNetworkController) syncPeriodic() {
×
55
        go func() {
×
56
                nodeSyncTicker := time.NewTicker(5 * time.Minute)
×
57
                defer nodeSyncTicker.Stop()
×
58
                for {
×
59
                        select {
×
60
                        case <-nodeSyncTicker.C:
×
61
                                oc.syncNodesPeriodic()
×
62
                        case <-oc.stopChan:
×
63
                                return
×
64
                        }
65
                }
66
        }()
67
}
68

69
func (oc *DefaultNetworkController) getPortInfo(pod *kapi.Pod) *lpInfo {
70✔
70
        var portInfo *lpInfo
70✔
71
        key := util.GetLogicalPortName(pod.Namespace, pod.Name)
70✔
72
        if util.PodWantsHostNetwork(pod) {
75✔
73
                // create dummy logicalPortInfo for host-networked pods
5✔
74
                mac, _ := net.ParseMAC("00:00:00:00:00:00")
5✔
75
                portInfo = &lpInfo{
5✔
76
                        logicalSwitch: "host-networked",
5✔
77
                        name:          key,
5✔
78
                        uuid:          "host-networked",
5✔
79
                        ips:           []*net.IPNet{},
5✔
80
                        mac:           mac,
5✔
81
                }
5✔
82
        } else {
70✔
83
                portInfo, _ = oc.logicalPortCache.get(pod, ovntypes.DefaultNetworkName)
65✔
84
        }
65✔
85
        return portInfo
70✔
86
}
87

88
func (oc *DefaultNetworkController) recordPodEvent(reason string, addErr error, pod *kapi.Pod) {
33✔
89
        podRef, err := ref.GetReference(scheme.Scheme, pod)
33✔
90
        if err != nil {
33✔
91
                klog.Errorf("Couldn't get a reference to pod %s/%s to post an event: '%v'",
×
92
                        pod.Namespace, pod.Name, err)
×
93
        } else {
33✔
94
                klog.V(5).Infof("Posting a %s event for Pod %s/%s", kapi.EventTypeWarning, pod.Namespace, pod.Name)
33✔
95
                oc.recorder.Eventf(podRef, kapi.EventTypeWarning, reason, addErr.Error())
33✔
96
        }
33✔
97
}
98

99
func (oc *DefaultNetworkController) recordNodeEvent(reason string, addErr error, node *kapi.Node) {
26✔
100
        nodeRef, err := ref.GetReference(scheme.Scheme, node)
26✔
101
        if err != nil {
26✔
102
                klog.Errorf("Couldn't get a reference to node %s to post an event: '%v'", node.Name, err)
×
103
        } else {
26✔
104
                klog.V(5).Infof("Posting a %s event for node %s", kapi.EventTypeWarning, node.Name)
26✔
105
                oc.recorder.Eventf(nodeRef, kapi.EventTypeWarning, reason, addErr.Error())
26✔
106
        }
26✔
107
}
108

109
func exGatewayAnnotationsChanged(oldPod, newPod *kapi.Pod) bool {
252✔
110
        return oldPod.Annotations[util.RoutingNamespaceAnnotation] != newPod.Annotations[util.RoutingNamespaceAnnotation] ||
252✔
111
                oldPod.Annotations[util.RoutingNetworkAnnotation] != newPod.Annotations[util.RoutingNetworkAnnotation] ||
252✔
112
                oldPod.Annotations[util.BfdAnnotation] != newPod.Annotations[util.BfdAnnotation]
252✔
113
}
252✔
114

115
func networkStatusAnnotationsChanged(oldPod, newPod *kapi.Pod) bool {
252✔
116
        return oldPod.Annotations[nettypes.NetworkStatusAnnot] != newPod.Annotations[nettypes.NetworkStatusAnnot]
252✔
117
}
252✔
118

119
// ensurePod tries to set up a pod. It returns nil on success and error on failure; failure
120
// indicates the pod set up should be retried later.
121
func (oc *DefaultNetworkController) ensurePod(oldPod, pod *kapi.Pod, addPort bool) error {
322✔
122
        // Try unscheduled pods later
322✔
123
        if !util.PodScheduled(pod) {
323✔
124
                return nil
1✔
125
        }
1✔
126

127
        // skip the pods on no host subnet nodes
128
        switchName := pod.Spec.NodeName
321✔
129
        if oc.lsManager.IsNonHostSubnetSwitch(switchName) {
321✔
130
                return nil
×
131
        }
×
132

133
        if oc.isPodScheduledinLocalZone(pod) {
622✔
134
                klog.V(5).Infof("Ensuring zone local for Pod %s/%s in node %s", pod.Namespace, pod.Name, pod.Spec.NodeName)
301✔
135
                return oc.ensureLocalZonePod(oldPod, pod, addPort)
301✔
136
        }
301✔
137

138
        klog.V(5).Infof("Ensuring zone remote for Pod %s/%s in node %s", pod.Namespace, pod.Name, pod.Spec.NodeName)
20✔
139
        return oc.ensureRemoteZonePod(oldPod, pod, addPort)
20✔
140
}
141

142
// ensureLocalZonePod tries to set up a local zone pod. It returns nil on success and error on failure; failure
143
// indicates the pod set up should be retried later.
144
func (oc *DefaultNetworkController) ensureLocalZonePod(oldPod, pod *kapi.Pod, addPort bool) error {
301✔
145
        if config.Metrics.EnableScaleMetrics {
301✔
146
                start := time.Now()
×
147
                defer func() {
×
148
                        duration := time.Since(start)
×
149
                        eventName := "add"
×
150
                        if !addPort {
×
151
                                eventName = "update"
×
152
                        }
×
153
                        metrics.RecordPodEvent(eventName, duration)
×
154
                }()
155
        }
156

157
        if oldPod != nil && (exGatewayAnnotationsChanged(oldPod, pod) || networkStatusAnnotationsChanged(oldPod, pod)) {
301✔
158
                // No matter if a pod is ovn networked, or host networked, we still need to check for exgw
×
159
                // annotations. If the pod is ovn networked and is in update reschedule, addLogicalPort will take
×
160
                // care of updating the exgw updates
×
161
                if err := oc.deletePodExternalGW(oldPod); err != nil {
×
162
                        return fmt.Errorf("ensurePod failed %s/%s: %w", pod.Namespace, pod.Name, err)
×
163
                }
×
164
        }
165

166
        if !util.PodWantsHostNetwork(pod) && addPort {
472✔
167
                if err := oc.addLogicalPort(pod); err != nil {
187✔
168
                        return fmt.Errorf("addLogicalPort failed for %s/%s: %w", pod.Namespace, pod.Name, err)
16✔
169
                }
16✔
170
        } else {
130✔
171
                // either pod is host-networked or its an update for a normal pod (addPort=false case)
130✔
172
                if oldPod == nil || exGatewayAnnotationsChanged(oldPod, pod) || networkStatusAnnotationsChanged(oldPod, pod) {
143✔
173
                        if err := oc.addPodExternalGW(pod); err != nil {
13✔
174
                                return fmt.Errorf("addPodExternalGW failed for %s/%s: %w", pod.Namespace, pod.Name, err)
×
175
                        }
×
176
                }
177
        }
178

179
        if kubevirt.IsPodLiveMigratable(pod) {
324✔
180
                return kubevirt.EnsureLocalZonePodAddressesToNodeRoute(oc.watchFactory, oc.nbClient, oc.lsManager, pod, ovntypes.DefaultNetworkName)
39✔
181
        }
39✔
182

183
        return nil
246✔
184
}
185

186
// ensureRemoteZonePod tries to set up remote zone pod bits required to interconnect it.
187
//   - Adds the remote pod ips to the pod namespace address set for network policy and egress gw
188
//
189
// It returns nil on success and error on failure; failure indicates the pod set up should be retried later.
190
func (oc *DefaultNetworkController) ensureRemoteZonePod(oldPod, pod *kapi.Pod, addPort bool) error {
20✔
191
        if (addPort || (oldPod != nil && len(pod.Status.PodIPs) != len(oldPod.Status.PodIPs))) && !util.PodWantsHostNetwork(pod) {
30✔
192
                podIfAddrs, err := util.GetPodCIDRsWithFullMask(pod, oc.NetInfo)
10✔
193
                if err != nil {
10✔
194
                        // not finding pod IPs on a remote pod is common until the other node wires the pod, suppress it
×
195
                        return fmt.Errorf("failed to obtain IPs to add remote pod %s/%s: %w",
×
196
                                pod.Namespace, pod.Name, ovntypes.NewSuppressedError(err))
×
197
                }
×
198
                if err := oc.addRemotePodToNamespace(pod.Namespace, podIfAddrs); err != nil {
10✔
199
                        return fmt.Errorf("failed to add remote pod %s/%s to namespace: %w", pod.Namespace, pod.Name, err)
×
200
                }
×
201
        }
202

203
        //FIXME: Update comments & reduce code duplication.
204
        // check if this remote pod is serving as an external GW.
205
        if oldPod != nil && (exGatewayAnnotationsChanged(oldPod, pod) || networkStatusAnnotationsChanged(oldPod, pod)) {
20✔
206
                // Delete the routes in the namespace associated with this remote oldPod if its acting as an external GW
×
207
                if err := oc.deletePodExternalGW(oldPod); err != nil {
×
208
                        return fmt.Errorf("deletePodExternalGW failed for remote pod %s/%s: %w", oldPod.Namespace, oldPod.Name, err)
×
209
                }
×
210
        }
211

212
        // either pod is host-networked or its an update for a normal pod (addPort=false case)
213
        if oldPod == nil || exGatewayAnnotationsChanged(oldPod, pod) || networkStatusAnnotationsChanged(oldPod, pod) {
40✔
214
                // check if this remote pod is serving as an external GW. If so add the routes in the namespace
20✔
215
                // associated with this remote pod
20✔
216
                if err := oc.addPodExternalGW(pod); err != nil {
20✔
217
                        return fmt.Errorf("addPodExternalGW failed for remote pod %s/%s: %v", pod.Namespace, pod.Name, err)
×
218
                }
×
219
        }
220
        if kubevirt.IsPodLiveMigratable(pod) {
27✔
221
                return kubevirt.EnsureRemoteZonePodAddressesToNodeRoute(oc.controllerName, oc.watchFactory, oc.nbClient, oc.lsManager, pod, ovntypes.DefaultNetworkName)
7✔
222
        }
7✔
223
        return nil
13✔
224
}
225

226
// removePod tried to tear down a pod. It returns nil on success and error on failure;
227
// failure indicates the pod tear down should be retried later.
228
func (oc *DefaultNetworkController) removePod(pod *kapi.Pod, portInfo *lpInfo) error {
72✔
229
        if oc.isPodScheduledinLocalZone(pod) {
131✔
230
                if err := oc.removeLocalZonePod(pod, portInfo); err != nil {
62✔
231
                        return err
3✔
232
                }
3✔
233
        } else {
13✔
234
                if err := oc.removeRemoteZonePod(pod); err != nil {
13✔
235
                        return err
×
236
                }
×
237
        }
238

239
        err := kubevirt.CleanUpLiveMigratablePod(oc.nbClient, oc.watchFactory, pod)
69✔
240
        if err != nil {
69✔
241
                return err
×
242
        }
×
243

244
        oc.forgetPodReleasedBeforeStartup(string(pod.UID), ovntypes.DefaultNetworkName)
69✔
245
        return nil
69✔
246
}
247

248
// removeLocalZonePod tries to tear down a local zone pod. It returns nil on success and error on failure;
249
// failure indicates the pod tear down should be retried later.
250
func (oc *DefaultNetworkController) removeLocalZonePod(pod *kapi.Pod, portInfo *lpInfo) error {
59✔
251
        oc.logicalPortCache.remove(pod, ovntypes.DefaultNetworkName)
59✔
252

59✔
253
        if config.Metrics.EnableScaleMetrics {
59✔
254
                start := time.Now()
×
255
                defer func() {
×
256
                        duration := time.Since(start)
×
257
                        metrics.RecordPodEvent("delete", duration)
×
258
                }()
×
259
        }
260
        if util.PodWantsHostNetwork(pod) {
62✔
261
                if err := oc.deletePodExternalGW(pod); err != nil {
3✔
262
                        return fmt.Errorf("unable to delete external gateway routes for pod %s: %w",
×
263
                                getPodNamespacedName(pod), err)
×
264
                }
×
265
                return nil
3✔
266
        }
267
        if err := oc.deleteLogicalPort(pod, portInfo); err != nil {
59✔
268
                return fmt.Errorf("deleteLogicalPort failed for pod %s: %w",
3✔
269
                        getPodNamespacedName(pod), err)
3✔
270
        }
3✔
271

272
        return nil
53✔
273
}
274

275
// removeRemoteZonePod tries to tear down a remote zone pod bits. It returns nil on success and error on failure;
276
// failure indicates the pod tear down should be retried later.
277
// It removes the remote pod ips from the namespace address set and if its an external gw pod, removes
278
// its routes.
279
func (oc *DefaultNetworkController) removeRemoteZonePod(pod *kapi.Pod) error {
13✔
280
        if util.PodWantsHostNetwork(pod) {
15✔
281
                // Delete the routes in the namespace associated with this remote pod if it was acting as an external GW
2✔
282
                if err := oc.deletePodExternalGW(pod); err != nil {
2✔
283
                        return fmt.Errorf("unable to delete external gateway routes for remote pod %s: %w",
×
284
                                getPodNamespacedName(pod), err)
×
285
                }
×
286
        }
287

288
        // while this check is only intended for local pods, we also need it for
289
        // remote live migrated pods that might have been allocated from this zone
290
        if oc.wasPodReleasedBeforeStartup(string(pod.UID), ovntypes.DefaultNetworkName) {
13✔
291
                klog.Infof("Completed pod %s/%s was already released before startup",
×
292
                        pod.Namespace,
×
293
                        pod.Name,
×
294
                )
×
295
                return nil
×
296
        }
×
297

298
        if err := oc.removeRemoteZonePodFromNamespaceAddressSet(pod); err != nil {
13✔
299
                return fmt.Errorf("failed to remove the remote zone pod: %w", err)
×
300
        }
×
301

302
        if kubevirt.IsPodLiveMigratable(pod) {
20✔
303
                ips, err := util.GetPodCIDRsWithFullMask(pod, oc.NetInfo)
7✔
304
                if err != nil && !errors.Is(err, util.ErrNoPodIPFound) {
7✔
305
                        return fmt.Errorf("failed to get pod ips for the pod %s/%s: %w", pod.Namespace, pod.Name, err)
×
306
                }
×
307
                switchName, zoneContainsPodSubnet := kubevirt.ZoneContainsPodSubnet(oc.lsManager, ips)
7✔
308
                if zoneContainsPodSubnet {
11✔
309
                        if err := oc.lsManager.ReleaseIPs(switchName, ips); err != nil {
4✔
310
                                return err
×
311
                        }
×
312
                }
313
        }
314

315
        return nil
13✔
316
}
317

318
// WatchEgressFirewall starts the watching of egressfirewall resource and calls
319
// back the appropriate handler logic
320
func (oc *DefaultNetworkController) WatchEgressFirewall() error {
56✔
321
        _, err := oc.retryEgressFirewalls.WatchResource()
56✔
322
        return err
56✔
323
}
56✔
324

325
// WatchEgressNodes starts the watching of egress assignable nodes and calls
326
// back the appropriate handler logic.
327
func (oc *DefaultNetworkController) WatchEgressNodes() error {
48✔
328
        _, err := oc.retryEgressNodes.WatchResource()
48✔
329
        return err
48✔
330
}
48✔
331

332
// WatchEgressIP starts the watching of egressip resource and calls back the
333
// appropriate handler logic. It also initiates the other dedicated resource
334
// handlers for egress IP setup: namespaces, pods.
335
func (oc *DefaultNetworkController) WatchEgressIP() error {
69✔
336
        _, err := oc.retryEgressIPs.WatchResource()
69✔
337
        return err
69✔
338
}
69✔
339

340
func (oc *DefaultNetworkController) WatchEgressIPNamespaces() error {
69✔
341
        _, err := oc.retryEgressIPNamespaces.WatchResource()
69✔
342
        return err
69✔
343
}
69✔
344

345
func (oc *DefaultNetworkController) WatchEgressIPPods() error {
69✔
346
        _, err := oc.retryEgressIPPods.WatchResource()
69✔
347
        return err
69✔
348
}
69✔
349

350
// syncNodeGateway ensures a node's gateway router is configured
351
func (oc *DefaultNetworkController) syncNodeGateway(node *kapi.Node, hostSubnets []*net.IPNet) error {
30✔
352
        l3GatewayConfig, err := util.ParseNodeL3GatewayAnnotation(node)
30✔
353
        if err != nil {
38✔
354
                return err
8✔
355
        }
8✔
356

357
        if hostSubnets == nil {
44✔
358
                hostSubnets, err = util.ParseNodeHostSubnetAnnotation(node, ovntypes.DefaultNetworkName)
22✔
359
                if err != nil {
24✔
360
                        return err
2✔
361
                }
2✔
362
        }
363

364
        if l3GatewayConfig.Mode == config.GatewayModeDisabled {
20✔
365
                if err := oc.gatewayCleanup(node.Name); err != nil {
×
366
                        return fmt.Errorf("error cleaning up gateway for node %s: %v", node.Name, err)
×
367
                }
×
368
        } else if hostSubnets != nil {
40✔
369
                var hostAddrs []string
20✔
370
                if config.Gateway.Mode == config.GatewayModeShared {
37✔
371
                        hostAddrs, err = util.GetNodeHostAddrs(node)
17✔
372
                        if err != nil && !util.IsAnnotationNotSetError(err) {
17✔
373
                                return fmt.Errorf("failed to get host CIDRs for node: %s: %v", node.Name, err)
×
374
                        }
×
375
                }
376
                if err := oc.syncGatewayLogicalNetwork(node, l3GatewayConfig, hostSubnets, hostAddrs); err != nil {
21✔
377
                        return fmt.Errorf("error creating gateway for node %s: %v", node.Name, err)
1✔
378
                }
1✔
379
        }
380
        return nil
19✔
381
}
382

383
// gatewayChanged() compares old annotations to new and returns true if something has changed.
384
func gatewayChanged(oldNode, newNode *kapi.Node) bool {
28✔
385
        oldL3GatewayConfig, _ := util.ParseNodeL3GatewayAnnotation(oldNode)
28✔
386
        l3GatewayConfig, _ := util.ParseNodeL3GatewayAnnotation(newNode)
28✔
387
        return !reflect.DeepEqual(oldL3GatewayConfig, l3GatewayConfig)
28✔
388
}
28✔
389

390
// hostCIDRsChanged compares old annotations to new and returns true if the something has changed.
391
func hostCIDRsChanged(oldNode, newNode *kapi.Node) bool {
26✔
392
        oldAddrs, _ := util.ParseNodeHostCIDRs(oldNode)
26✔
393
        Addrs, _ := util.ParseNodeHostCIDRs(newNode)
26✔
394
        return !oldAddrs.Equal(Addrs)
26✔
395
}
26✔
396

397
// macAddressChanged() compares old annotations to new and returns true if something has changed.
398
func macAddressChanged(oldNode, node *kapi.Node) bool {
28✔
399
        oldMacAddress, _ := util.ParseNodeManagementPortMACAddress(oldNode)
28✔
400
        macAddress, _ := util.ParseNodeManagementPortMACAddress(node)
28✔
401
        return !bytes.Equal(oldMacAddress, macAddress)
28✔
402
}
28✔
403

404
func nodeSubnetChanged(oldNode, node *kapi.Node) bool {
33✔
405
        oldSubnets, _ := util.ParseNodeHostSubnetAnnotation(oldNode, ovntypes.DefaultNetworkName)
33✔
406
        newSubnets, _ := util.ParseNodeHostSubnetAnnotation(node, ovntypes.DefaultNetworkName)
33✔
407
        return !reflect.DeepEqual(oldSubnets, newSubnets)
33✔
408
}
33✔
409

410
func primaryAddrChanged(oldNode, newNode *kapi.Node) bool {
32✔
411
        oldIP, _ := util.GetNodePrimaryIP(oldNode)
32✔
412
        newIP, _ := util.GetNodePrimaryIP(newNode)
32✔
413
        return oldIP != newIP
32✔
414
}
32✔
415

416
func nodeChassisChanged(oldNode, node *kapi.Node) bool {
28✔
417
        oldChassis, _ := util.ParseNodeChassisIDAnnotation(oldNode)
28✔
418
        newChassis, _ := util.ParseNodeChassisIDAnnotation(node)
28✔
419
        return oldChassis != newChassis
28✔
420
}
28✔
421

422
// nodeGatewayMTUSupportChanged returns true if annotation "k8s.ovn.org/gateway-mtu-support" on the node was updated.
423
func nodeGatewayMTUSupportChanged(oldNode, node *kapi.Node) bool {
26✔
424
        return util.ParseNodeGatewayMTUSupport(oldNode) != util.ParseNodeGatewayMTUSupport(node)
26✔
425
}
26✔
426

427
// shouldUpdateNode() determines if the ovn-kubernetes plugin should update the state of the node.
428
// ovn-kube should not perform an update if it does not assign a hostsubnet, or if you want to change
429
// whether or not ovn-kubernetes assigns a hostsubnet
430
func shouldUpdateNode(node, oldNode *kapi.Node) (bool, error) {
37✔
431
        newNoHostSubnet := util.NoHostSubnet(node)
37✔
432
        oldNoHostSubnet := util.NoHostSubnet(oldNode)
37✔
433

37✔
434
        if oldNoHostSubnet && newNoHostSubnet {
37✔
UNCOV
435
                return false, nil
×
UNCOV
436
        }
×
437

438
        return true, nil
37✔
439
}
440

441
func (oc *DefaultNetworkController) StartServiceController(wg *sync.WaitGroup, runRepair bool) error {
12✔
442
        klog.Infof("Starting OVN Service Controller: Using Endpoint Slices")
12✔
443
        wg.Add(1)
12✔
444
        go func() {
24✔
445
                defer wg.Done()
12✔
446
                useLBGroups := oc.clusterLoadBalancerGroupUUID != ""
12✔
447
                // use 5 workers like most of the kubernetes controllers in the
12✔
448
                // kubernetes controller-manager
12✔
449
                err := oc.svcController.Run(5, oc.stopChan, runRepair, useLBGroups, oc.svcTemplateSupport)
12✔
450
                if err != nil {
21✔
451
                        klog.Errorf("Error running OVN Kubernetes Services controller: %v", err)
9✔
452
                }
9✔
453
        }()
454
        return nil
12✔
455
}
456

457
func (oc *DefaultNetworkController) InitEgressServiceZoneController() (*egresssvc_zone.Controller, error) {
10✔
458
        // If the EgressIP controller is enabled it will take care of creating the
10✔
459
        // "no reroute" policies - we can pass "noop" functions to the egress service controller.
10✔
460
        initClusterEgressPolicies := func(libovsdbclient.Client, addressset.AddressSetFactory, string, string) error { return nil }
10✔
461
        ensureNodeNoReroutePolicies := func(libovsdbclient.Client, addressset.AddressSetFactory, string, string, listers.NodeLister) error {
10✔
462
                return nil
×
463
        }
×
464
        deleteLegacyDefaultNoRerouteNodePolicies := func(libovsdbclient.Client, string, string) error { return nil }
10✔
465
        // used only when IC=true
466
        createDefaultNodeRouteToExternal := func(libovsdbclient.Client, string, string) error { return nil }
10✔
467

468
        if !config.OVNKubernetesFeature.EnableEgressIP {
20✔
469
                initClusterEgressPolicies = InitClusterEgressPolicies
10✔
470
                ensureNodeNoReroutePolicies = ensureDefaultNoRerouteNodePolicies
10✔
471
                deleteLegacyDefaultNoRerouteNodePolicies = DeleteLegacyDefaultNoRerouteNodePolicies
10✔
472
                createDefaultNodeRouteToExternal = libovsdbutil.CreateDefaultRouteToExternal
10✔
473
        }
10✔
474

475
        return egresssvc_zone.NewController(oc.NetInfo, DefaultNetworkControllerName, oc.client, oc.nbClient, oc.addressSetFactory,
10✔
476
                initClusterEgressPolicies, ensureNodeNoReroutePolicies, deleteLegacyDefaultNoRerouteNodePolicies,
10✔
477
                createDefaultNodeRouteToExternal,
10✔
478
                oc.stopChan, oc.watchFactory.EgressServiceInformer(), oc.watchFactory.ServiceCoreInformer(),
10✔
479
                oc.watchFactory.EndpointSliceCoreInformer(),
10✔
480
                oc.watchFactory.NodeCoreInformer(), oc.zone)
10✔
481
}
482

483
func (oc *DefaultNetworkController) newANPController() error {
15✔
484
        var err error
15✔
485
        oc.anpController, err = anpcontroller.NewController(
15✔
486
                DefaultNetworkControllerName,
15✔
487
                oc.nbClient,
15✔
488
                oc.kube.ANPClient,
15✔
489
                oc.watchFactory.ANPInformer(),
15✔
490
                oc.watchFactory.BANPInformer(),
15✔
491
                oc.watchFactory.NamespaceCoreInformer(),
15✔
492
                oc.watchFactory.PodCoreInformer(),
15✔
493
                oc.watchFactory.NodeCoreInformer(),
15✔
494
                oc.addressSetFactory,
15✔
495
                oc.isPodScheduledinLocalZone,
15✔
496
                oc.zone,
15✔
497
                oc.recorder,
15✔
498
        )
15✔
499
        return err
15✔
500
}
15✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc