Skip to content

Commit 93eec0d

Browse files
authored
add tests for kubernetes versions (#7035)
1 parent becafe7 commit 93eec0d

File tree

2 files changed

+94
-6
lines changed

2 files changed

+94
-6
lines changed

cmd/nginx-ingress/main.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,9 @@ func main() {
9292
podName := os.Getenv("POD_NAME")
9393

9494
config, kubeClient := mustCreateConfigAndKubeClient(ctx)
95-
mustValidateKubernetesVersionInfo(ctx, kubeClient)
95+
if err := validateKubernetesVersionInfo(ctx, kubeClient); err != nil {
96+
nl.Fatal(l, err)
97+
}
9698
pod, err := kubeClient.CoreV1().Pods(controllerNamespace).Get(context.TODO(), podName, meta_v1.GetOptions{})
9799
if err != nil {
98100
nl.Fatalf(l, "Failed to get pod: %v", err)
@@ -399,24 +401,25 @@ func mustCreateConfigAndKubeClient(ctx context.Context) (*rest.Config, *kubernet
399401
return config, kubeClient
400402
}
401403

402-
// mustValidateKubernetesVersionInfo calls internally os.Exit if
404+
// validateKubernetesVersionInfo returns an Error if
403405
// the k8s version can not be retrieved or the version is not supported.
404-
func mustValidateKubernetesVersionInfo(ctx context.Context, kubeClient kubernetes.Interface) {
406+
func validateKubernetesVersionInfo(ctx context.Context, kubeClient kubernetes.Interface) error {
405407
l := nl.LoggerFromContext(ctx)
406408
k8sVersion, err := k8s.GetK8sVersion(kubeClient)
407409
if err != nil {
408-
nl.Fatalf(l, "error retrieving k8s version: %v", err)
410+
return fmt.Errorf("error retrieving k8s version: %w", err)
409411
}
410412
nl.Infof(l, "Kubernetes version: %v", k8sVersion)
411413

412414
minK8sVersion, err := util_version.ParseGeneric("1.22.0")
413415
if err != nil {
414-
nl.Fatalf(l, "unexpected error parsing minimum supported version: %v", err)
416+
return fmt.Errorf("unexpected error parsing minimum supported version: %w", err)
415417
}
416418

417419
if !k8sVersion.AtLeast(minK8sVersion) {
418-
nl.Fatalf(l, "Versions of Kubernetes < %v are not supported, please refer to the documentation for details on supported versions and legacy controller support.", minK8sVersion)
420+
return fmt.Errorf("versions of kubernetes < %v are not supported, please refer to the documentation for details on supported versions and legacy controller support", minK8sVersion)
419421
}
422+
return nil
420423
}
421424

422425
// mustValidateIngressClass calls internally os.Exit

cmd/nginx-ingress/main_test.go

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,18 @@ package main
22

33
import (
44
"bytes"
5+
"context"
6+
"io"
7+
"log/slog"
58
"regexp"
69
"testing"
710

811
nl "github.com/nginxinc/kubernetes-ingress/internal/logger"
12+
nic_glog "github.com/nginxinc/kubernetes-ingress/internal/logger/glog"
913
"github.com/nginxinc/kubernetes-ingress/internal/logger/levels"
14+
pkgversion "k8s.io/apimachinery/pkg/version"
15+
fakediscovery "k8s.io/client-go/discovery/fake"
16+
"k8s.io/client-go/kubernetes/fake"
1017
)
1118

1219
func TestLogFormats(t *testing.T) {
@@ -46,3 +53,81 @@ func TestLogFormats(t *testing.T) {
4653
})
4754
}
4855
}
56+
57+
func TestK8sVersionValidation(t *testing.T) {
58+
testCases := []struct {
59+
name string
60+
kubeVersion string
61+
}{
62+
{
63+
name: "Earliest version 1.22.0",
64+
kubeVersion: "1.22.0",
65+
},
66+
{
67+
name: "Minor version 1.22.5",
68+
kubeVersion: "1.22.5",
69+
},
70+
{
71+
name: "Close to current 1.32.0",
72+
kubeVersion: "1.32.0",
73+
},
74+
}
75+
t.Parallel()
76+
for _, tc := range testCases {
77+
t.Run(tc.name, func(t *testing.T) {
78+
// setup logger
79+
l := slog.New(nic_glog.New(io.Discard, &nic_glog.Options{Level: levels.LevelInfo}))
80+
ctx := nl.ContextWithLogger(context.Background(), l)
81+
82+
// setup kube client with version
83+
clientset := fake.NewSimpleClientset()
84+
fakeDiscovery, _ := clientset.Discovery().(*fakediscovery.FakeDiscovery)
85+
fakeDiscovery.FakedServerVersion = &pkgversion.Info{GitVersion: tc.kubeVersion}
86+
87+
// run test
88+
err := validateKubernetesVersionInfo(ctx, clientset)
89+
if err != nil {
90+
t.Errorf("%v", err)
91+
}
92+
})
93+
}
94+
}
95+
96+
func TestK8sVersionValidationBad(t *testing.T) {
97+
testCases := []struct {
98+
name string
99+
kubeVersion string
100+
}{
101+
{
102+
name: "Before earliest version 1.21.0",
103+
kubeVersion: "1.21.0",
104+
},
105+
{
106+
name: "Empty version",
107+
kubeVersion: "",
108+
},
109+
{
110+
name: "Garbage",
111+
kubeVersion: "xyzabc",
112+
},
113+
}
114+
t.Parallel()
115+
for _, tc := range testCases {
116+
t.Run(tc.name, func(t *testing.T) {
117+
// setup logger
118+
l := slog.New(nic_glog.New(io.Discard, &nic_glog.Options{Level: levels.LevelInfo}))
119+
ctx := nl.ContextWithLogger(context.Background(), l)
120+
121+
// setup kube client with version
122+
clientset := fake.NewSimpleClientset()
123+
fakeDiscovery, _ := clientset.Discovery().(*fakediscovery.FakeDiscovery)
124+
fakeDiscovery.FakedServerVersion = &pkgversion.Info{GitVersion: tc.kubeVersion}
125+
126+
// run test
127+
err := validateKubernetesVersionInfo(ctx, clientset)
128+
if err == nil {
129+
t.Error("Wanted an error here")
130+
}
131+
})
132+
}
133+
}

0 commit comments

Comments
 (0)