Skip to content

Commit

Permalink
change the hybrid overlay config to use the ConfigMap instead of cli
Browse files Browse the repository at this point in the history
move the enabling of hybrid overlay into the ConfigMap for ovnkube like
all new arguments should be

Signed-off-by: Jacob Tanenbaum <jtanenba@redhat.com>
  • Loading branch information
JacobTanenbaum committed Sep 2, 2020
1 parent 735d6aa commit 2f217a8
Show file tree
Hide file tree
Showing 5 changed files with 175 additions and 42 deletions.
10 changes: 10 additions & 0 deletions bindata/network/ovn-kubernetes/004-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,13 @@ data:
[gateway]
mode=local
nodeport=true
{{ if .OVNHybridOverlayEnable }}
[hybridoverlay]
enabled=true
{{- if .OVNHybridOverlayNetCIDR }}
cluster-subnets="{{.OVNHybridOverlayNetCIDR}}"
{{- end }}
{{- if .OVNHybridOverlayVXLANPort}}
hybrid-overlay-vxlan-port="{{.OVNHybridOverlayVXLANPort}}"
{{- end }}
{{- end }}
12 changes: 0 additions & 12 deletions bindata/network/ovn-kubernetes/ovnkube-master.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -484,17 +484,6 @@ spec:
set +o allexport
fi
hybrid_overlay_flags=
if [[ -n "{{.OVNHybridOverlayEnable }}" ]]; then
hybrid_overlay_flags="--enable-hybrid-overlay --no-hostsubnet-nodes=kubernetes.io/os=windows"
if [[ -n "{{.OVNHybridOverlayNetCIDR}}" ]]; then
hybrid_overlay_flags="${hybrid_overlay_flags} --hybrid-overlay-cluster-subnets={{.OVNHybridOverlayNetCIDR}}"
fi
if [[ -n "{{.OVNHybridOverlayVXLANPort}}" ]]; then
hybrid_overlay_flags="${hybrid_overlay_flags} --hybrid-overlay-vxlan-port={{.OVNHybridOverlayVXLANPort}}"
fi
fi
gateway_mode_flags=
# Check to see if ovs is provided by the node. This is only for upgrade from 4.5->4.6 or
# openshift-sdn to ovn-kube conversion
Expand All @@ -520,7 +509,6 @@ spec:
--config-file=/run/ovnkube-config/ovnkube.conf \
--ovn-empty-lb-events \
--loglevel "${OVN_KUBE_LOG_LEVEL}" \
${hybrid_overlay_flags} \
--metrics-bind-address "127.0.0.1:29102" \
${gateway_mode_flags} \
--sb-address "{{.OVN_SB_DB_LIST}}" \
Expand Down
11 changes: 0 additions & 11 deletions bindata/network/ovn-kubernetes/ovnkube-node.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -119,16 +119,6 @@ spec:
done
echo "I$(date "+%m%d %H:%M:%S.%N") - starting ovnkube-node db_ip ${db_ip}"
hybrid_overlay_flags=
if [[ -n "{{.OVNHybridOverlayEnable}}" ]]; then
hybrid_overlay_flags="--enable-hybrid-overlay --no-hostsubnet-nodes=kubernetes.io/os=windows"
if [[ -n "{{.OVNHybridOverlayNetCIDR}}" ]]; then
hybrid_overlay_flags="${hybrid_overlay_flags} --hybrid-overlay-cluster-subnets={{.OVNHybridOverlayNetCIDR}}"
fi
if [[ -n "{{.OVNHybridOverlayVXLANPort}}" ]]; then
hybrid_overlay_flags="${hybrid_overlay_flags} --hybrid-overlay-vxlan-port={{.OVNHybridOverlayVXLANPort}}"
fi
fi
gateway_mode_flags=
# Check to see if ovs is provided by the node. This is only for upgrade from 4.5->4.6 or
Expand All @@ -153,7 +143,6 @@ spec:
--config-file=/run/ovnkube-config/ovnkube.conf \
--loglevel "${OVN_KUBE_LOG_LEVEL}" \
--inactivity-probe="${OVN_CONTROLLER_INACTIVITY_PROBE}" \
${hybrid_overlay_flags} \
${gateway_mode_flags} \
--metrics-bind-address "127.0.0.1:29103"
env:
Expand Down
4 changes: 2 additions & 2 deletions pkg/network/ovn_kubernetes.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,10 +101,10 @@ func renderOVNKubernetes(conf *operv1.NetworkSpec, bootstrapResult *bootstrap.Bo
} else {
data.Data["OVNHybridOverlayVXLANPort"] = ""
}
data.Data["OVNHybridOverlayEnable"] = "true"
data.Data["OVNHybridOverlayEnable"] = true
} else {
data.Data["OVNHybridOverlayNetCIDR"] = ""
data.Data["OVNHybridOverlayEnable"] = ""
data.Data["OVNHybridOverlayEnable"] = false
data.Data["OVNHybridOverlayVXLANPort"] = ""
}

Expand Down
180 changes: 163 additions & 17 deletions pkg/network/ovn_kubernetes_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package network

import (
"fmt"
"os"
"strings"
"testing"

Expand All @@ -13,8 +14,6 @@ import (
uns "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
)

// vars
var g = uint32(8061)
var OVNKubernetesConfig = operv1.Network{
Spec: operv1.NetworkSpec{
ServiceNetwork: []string{"172.30.0.0/16"},
Expand All @@ -31,7 +30,7 @@ var OVNKubernetesConfig = operv1.Network{
DefaultNetwork: operv1.DefaultNetworkDefinition{
Type: operv1.NetworkTypeOVNKubernetes,
OVNKubernetesConfig: &operv1.OVNKubernetesConfig{
GenevePort: &g,
GenevePort: ptrToUint32(8061),
},
},
},
Expand Down Expand Up @@ -70,6 +69,7 @@ func TestRenderOVNKubernetes(t *testing.T) {
g.Expect(objs).To(ContainElement(HaveKubernetesID("ClusterRoleBinding", "", "openshift-ovn-kubernetes-node")))
g.Expect(objs).To(ContainElement(HaveKubernetesID("DaemonSet", "openshift-ovn-kubernetes", "ovnkube-master")))
g.Expect(objs).To(ContainElement(HaveKubernetesID("DaemonSet", "openshift-ovn-kubernetes", "ovnkube-node")))
g.Expect(objs).To(ContainElement(HaveKubernetesID("ConfigMap", "openshift-ovn-kubernetes", "ovnkube-config")))

// make sure all deployments are in the master
for _, obj := range objs {
Expand Down Expand Up @@ -139,6 +139,144 @@ func TestRenderOVNKubernetesIPv6(t *testing.T) {
g.Expect(script).To(ContainSubstring("pssl:9641:[::]"))
}

func TestRenderedOVNKubernetesConfig(t *testing.T) {
type testcase struct {
desc string
expected string
hybridOverlayConfig *operv1.HybridOverlayConfig
}
testcases := []testcase{
{
desc: "default",
expected: `
[default]
mtu="1500"
cluster-subnets="10.128.0.0/15/23,10.0.0.0/14/24"
encap-port="8061"
[kubernetes]
service-cidrs="172.30.0.0/16"
ovn-config-namespace="openshift-ovn-kubernetes"
apiserver="https://1.1.1.1:1111"
[gateway]
mode=local
nodeport=true`,
},

{
desc: "HybridOverlay",
expected: `
[default]
mtu="1500"
cluster-subnets="10.128.0.0/15/23,10.0.0.0/14/24"
encap-port="8061"
[kubernetes]
service-cidrs="172.30.0.0/16"
ovn-config-namespace="openshift-ovn-kubernetes"
apiserver="https://1.1.1.1:1111"
[gateway]
mode=local
nodeport=true
[hybridoverlay]
enabled=true
cluster-subnets="10.132.0.0/14"`,
hybridOverlayConfig: &operv1.HybridOverlayConfig{
HybridClusterNetwork: []operv1.ClusterNetworkEntry{
{CIDR: "10.132.0.0/14", HostPrefix: 23},
},
},
},
{
desc: "HybridOverlay with custom VXLAN port",
expected: `
[default]
mtu="1500"
cluster-subnets="10.128.0.0/15/23,10.0.0.0/14/24"
encap-port="8061"
[kubernetes]
service-cidrs="172.30.0.0/16"
ovn-config-namespace="openshift-ovn-kubernetes"
apiserver="https://1.1.1.1:1111"
[gateway]
mode=local
nodeport=true
[hybridoverlay]
enabled=true
cluster-subnets="10.132.0.0/14"
hybrid-overlay-vxlan-port="9000"`,

hybridOverlayConfig: &operv1.HybridOverlayConfig{
HybridClusterNetwork: []operv1.ClusterNetworkEntry{
{CIDR: "10.132.0.0/14", HostPrefix: 23},
},
HybridOverlayVXLANPort: ptrToUint32(9000),
},
},
{
desc: "HybridOverlay enabled with no ClusterNetworkEntry",
expected: `
[default]
mtu="1500"
cluster-subnets="10.128.0.0/15/23,10.0.0.0/14/24"
encap-port="8061"
[kubernetes]
service-cidrs="172.30.0.0/16"
ovn-config-namespace="openshift-ovn-kubernetes"
apiserver="https://1.1.1.1:1111"
[gateway]
mode=local
nodeport=true
[hybridoverlay]
enabled=true`,

hybridOverlayConfig: &operv1.HybridOverlayConfig{},
},
}
g := NewGomegaWithT(t)

os.Setenv("KUBERNETES_SERVICE_HOST", "1.1.1.1")
os.Setenv("KUBERNETES_SERVICE_PORT", "1111")

for i, tc := range testcases {
t.Run(fmt.Sprintf("%d:%s", i, tc.desc), func(t *testing.T) {
OVNKubeConfig := OVNKubernetesConfig.DeepCopy()
if tc.hybridOverlayConfig != nil {
OVNKubeConfig.Spec.DefaultNetwork.OVNKubernetesConfig.HybridOverlayConfig = tc.hybridOverlayConfig
}
//set a few inputs so that the tests are not machine dependant
OVNKubeConfig.Spec.DefaultNetwork.OVNKubernetesConfig.MTU = ptrToUint32(1500)

crd := OVNKubeConfig.DeepCopy()
config := &crd.Spec

errs := validateOVNKubernetes(config)
g.Expect(errs).To(HaveLen(0))
FillDefaults(config, nil)

bootstrapResult := &bootstrap.BootstrapResult{
OVN: bootstrap.OVNBootstrapResult{
MasterIPs: []string{"1.2.3.4", "5.6.7.8", "9.10.11.12"},
},
}
objs, err := renderOVNKubernetes(config, bootstrapResult, manifestDirOvn)
g.Expect(err).NotTo(HaveOccurred())
confFile := extractOVNKubeConfig(g, objs)
g.Expect(confFile).To(Equal(strings.TrimSpace(tc.expected)))
})
}

}

func findNBDBPostStart(objects []*uns.Unstructured) (string, error) {
var master *uns.Unstructured
for _, obj := range objects {
Expand Down Expand Up @@ -188,10 +326,6 @@ func TestFillOVNKubernetesDefaults(t *testing.T) {
conf := &crd.Spec
conf.DefaultNetwork.OVNKubernetesConfig = nil

// vars
m := uint32(8900)
p := uint32(6081)

expected := operv1.NetworkSpec{
ServiceNetwork: []string{"172.30.0.0/16"},
ClusterNetwork: []operv1.ClusterNetworkEntry{
Expand All @@ -207,8 +341,8 @@ func TestFillOVNKubernetesDefaults(t *testing.T) {
DefaultNetwork: operv1.DefaultNetworkDefinition{
Type: operv1.NetworkTypeOVNKubernetes,
OVNKubernetesConfig: &operv1.OVNKubernetesConfig{
MTU: &m,
GenevePort: &p,
MTU: ptrToUint32(8900),
GenevePort: ptrToUint32(6081),
},
},
}
Expand Down Expand Up @@ -238,13 +372,11 @@ func TestValidateOVNKubernetes(t *testing.T) {
}

// set mtu to insanity
mtu := uint32(70000)
ovnConfig.MTU = &mtu
ovnConfig.MTU = ptrToUint32(70000)
errExpect("invalid MTU 70000")

// set geneve port to insanity
geneve := uint32(70001)
ovnConfig.GenevePort = &geneve
ovnConfig.GenevePort = ptrToUint32(70001)
errExpect("invalid GenevePort 70001")

config.ClusterNetwork = nil
Expand Down Expand Up @@ -333,14 +465,28 @@ func TestOVNKubernetesIsSafe(t *testing.T) {
next.DefaultNetwork.OVNKubernetesConfig.HybridOverlayConfig = nil

// change the mtu
mtu := uint32(70000)
next.DefaultNetwork.OVNKubernetesConfig.MTU = &mtu
next.DefaultNetwork.OVNKubernetesConfig.MTU = ptrToUint32(70000)

// change the geneve port
geneve := uint32(34001)
next.DefaultNetwork.OVNKubernetesConfig.GenevePort = &geneve
next.DefaultNetwork.OVNKubernetesConfig.GenevePort = ptrToUint32(34001)
errs = isOVNKubernetesChangeSafe(prev, next)
g.Expect(errs).To(HaveLen(2))
g.Expect(errs[0]).To(MatchError("cannot change ovn-kubernetes MTU"))
g.Expect(errs[1]).To(MatchError("cannot change ovn-kubernetes genevePort"))
}

func extractOVNKubeConfig(g *WithT, objs []*uns.Unstructured) string {
for _, obj := range objs {
if obj.GetKind() == "ConfigMap" && obj.GetName() == "ovnkube-config" {
val, ok, err := uns.NestedString(obj.Object, "data", "ovnkube.conf")
g.Expect(err).NotTo(HaveOccurred())
g.Expect(ok).To(BeTrue())
return string(val)
}
}
return ""
}

func ptrToUint32(x uint32) *uint32 {
return &x
}

0 comments on commit 2f217a8

Please sign in to comment.