8
8
"path/filepath"
9
9
"regexp"
10
10
11
+ "github.com/openshift/microshift/pkg/util"
12
+ "github.com/vishvananda/netlink"
11
13
"k8s.io/klog/v2"
12
14
"sigs.k8s.io/yaml"
13
15
)
@@ -40,10 +42,6 @@ func (o *OVNKubernetesConfig) Validate() error {
40
42
if err != nil {
41
43
return fmt .Errorf ("failed to validate OVS bridge: %w" , err )
42
44
}
43
- err = o .validateConfig ()
44
- if err != nil {
45
- return fmt .Errorf ("failed to validate OVN-K configuration: %w" , err )
46
- }
47
45
return nil
48
46
}
49
47
@@ -56,28 +54,29 @@ func (o *OVNKubernetesConfig) validateOVSBridge() error {
56
54
return nil
57
55
}
58
56
59
- // validateConfig validates the user defined configuration in /etc/microshift/ovn.yaml
60
- func (o * OVNKubernetesConfig ) validateConfig () error {
61
- // validate MTU conf
62
- iface , err := net .InterfaceByName (OVNGatewayInterface )
63
- if err != nil {
64
- return fmt .Errorf ("failed to find OVN gateway interface %q: %w" , OVNGatewayInterface , err )
65
- }
66
-
67
- if iface .MTU < o .MTU {
68
- return fmt .Errorf ("interface MTU (%d) is too small for specified overlay (%d)" , iface .MTU , o .MTU )
69
- }
70
- return nil
71
- }
72
-
73
- // getClusterMTU retrieves MTU from ovn-kubernetes gateway interface "br-ex",
74
- // and falls back to use 1500 when "br-ex" mtu is unable to get or less than 0.
75
- func (o * OVNKubernetesConfig ) getClusterMTU (multinode bool ) {
76
- link , err := net .InterfaceByName (OVNGatewayInterface )
77
- if err == nil && link .MTU > 0 {
78
- o .MTU = link .MTU
57
+ // getClusterMTU retrieves MTU from the default route network interface,
58
+ // and falls back to use 1500 when unable to get the mtu or ipFamily than 0.
59
+ func (o * OVNKubernetesConfig ) getClusterMTU (multinode bool , ipFamily int ) {
60
+ klog .Infof ("getClusterMTU: finding default route interface" )
61
+ o .MTU = defaultMTU
62
+
63
+ // if configure both IPV4 and IPV6 check the smallest
64
+ //nolint:nestif
65
+ if ipFamily == netlink .FAMILY_ALL {
66
+ mtu , err := util .FindDefaultRouteMinMTU ()
67
+
68
+ if err == nil {
69
+ o .MTU = mtu
70
+ } else {
71
+ klog .Infof ("getClusterMTU: error %s." , err )
72
+ }
79
73
} else {
80
- o .MTU = defaultMTU
74
+ mtu , err := util .FindDefaultRouteMTU (ipFamily )
75
+ if err == nil {
76
+ o .MTU = mtu
77
+ } else {
78
+ klog .Infof ("getClusterMTU: error %s." , err )
79
+ }
81
80
}
82
81
83
82
if multinode {
@@ -86,12 +85,12 @@ func (o *OVNKubernetesConfig) getClusterMTU(multinode bool) {
86
85
}
87
86
88
87
// withDefaults returns the default values when ovn.yaml is not provided
89
- func (o * OVNKubernetesConfig ) withDefaults (multinode bool ) * OVNKubernetesConfig {
90
- o .getClusterMTU (multinode )
88
+ func (o * OVNKubernetesConfig ) withDefaults (multinode bool , ipFamily int ) * OVNKubernetesConfig {
89
+ o .getClusterMTU (multinode , ipFamily )
91
90
return o
92
91
}
93
92
94
- func newOVNKubernetesConfigFromFile (path string , multinode bool ) (* OVNKubernetesConfig , error ) {
93
+ func newOVNKubernetesConfigFromFile (path string , multinode bool , ipFamily int ) (* OVNKubernetesConfig , error ) {
95
94
o := new (OVNKubernetesConfig )
96
95
buf , err := os .ReadFile (path )
97
96
if err != nil {
@@ -104,24 +103,24 @@ func newOVNKubernetesConfigFromFile(path string, multinode bool) (*OVNKubernetes
104
103
}
105
104
// in case mtu is not defined
106
105
if o .MTU == 0 {
107
- o .getClusterMTU (multinode )
106
+ o .getClusterMTU (multinode , ipFamily )
108
107
}
109
108
klog .Infof ("parsed OVNKubernetes config from file %q: %+v" , path , o )
110
109
111
110
return o , nil
112
111
}
113
112
114
- func NewOVNKubernetesConfigFromFileOrDefault (dir string , multinode bool ) (* OVNKubernetesConfig , error ) {
113
+ func NewOVNKubernetesConfigFromFileOrDefault (dir string , multinode bool , ipFamily int ) (* OVNKubernetesConfig , error ) {
115
114
path := filepath .Join (dir , ovnConfigFileName )
116
115
if _ , err := os .Stat (path ); err != nil {
117
116
if errors .Is (err , os .ErrNotExist ) {
118
117
klog .Infof ("OVNKubernetes config file not found, assuming default values" )
119
- return new (OVNKubernetesConfig ).withDefaults (multinode ), nil
118
+ return new (OVNKubernetesConfig ).withDefaults (multinode , ipFamily ), nil
120
119
}
121
120
return nil , fmt .Errorf ("failed to get OVNKubernetes config file: %v" , err )
122
121
}
123
122
124
- o , err := newOVNKubernetesConfigFromFile (path , multinode )
123
+ o , err := newOVNKubernetesConfigFromFile (path , multinode , ipFamily )
125
124
if err == nil {
126
125
return o , nil
127
126
}
0 commit comments