Skip to content

Commit

Permalink
Extract component versions to a static file
Browse files Browse the repository at this point in the history
This should make it easier to add new components, or change versions.
Embed the file into the binary with Go Embed.

Signed-off-by: David Calavera <dcalaverapalacio@twilio.com>
  • Loading branch information
David Calavera committed Aug 11, 2021
1 parent 302224c commit 828bacc
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 20 deletions.
37 changes: 17 additions & 20 deletions cmd/check_versions.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package cmd

import (
"context"
"encoding/json"
"fmt"
"os"
"strings"

Expand All @@ -12,6 +14,8 @@ import (
"k8s.io/cli-runtime/pkg/printers"
"k8s.io/client-go/kubernetes"

_ "embed"

"github.com/blang/semver/v4"
)

Expand Down Expand Up @@ -49,22 +53,8 @@ type Services []Service
// that can be used for reference
type KubernetesVersions map[string]Services

// This is the source of truth for what versions
// belong on which servers
var (
versions = KubernetesVersions{
"v1.19": Services{
{Name: "cert-manager", Version: "1.4.0"},
{Name: "coredns", Version: "1.8.4"},
{Name: "kube-proxy", Version: "1.19.6-eksbuild.2"},
{Name: "kube-state-metrics", Version: "2.1.0"},
{Name: "metrics-server", Version: "0.5.0"},
{Name: "node-problem-detector", Version: "0.8.9"},
{Name: "nvidia-device-plugin", Version: "0.9.0"},
{Name: "cluster-autoscaler", Version: "1.19"},
},
}
)
//go:embed config/components.json
var componentsConfig []byte

var getVersionsCmd = &cobra.Command{
Use: "versions",
Expand Down Expand Up @@ -92,7 +82,10 @@ var getVersionsCmd = &cobra.Command{
for _, s := range svcs {
// walk through required versions and
// find the matching service
req := getRequiredVersion(kubeVersion, s.Name)
req, err := getRequiredVersion(kubeVersion, s.Name)
if err != nil {
return err
}
if req == "unknown" {
continue
}
Expand Down Expand Up @@ -128,13 +121,17 @@ func isOutOfDate(required, current string) (bool, error) {
return r.Compare(c) > 0, nil
}

func getRequiredVersion(kubernetesVersion string, serviceName string) string {
func getRequiredVersion(kubernetesVersion string, serviceName string) (string, error) {
var versions KubernetesVersions
if err := json.Unmarshal(componentsConfig, &versions); err != nil {
return "", fmt.Errorf("unable to read components configuration: %w", err)
}
for _, e := range versions[kubernetesVersion] {
if e.Name == serviceName {
return e.Version
return e.Version, nil
}
}
return "unknown"
return "unknown", nil
}

func getDeployments(clientset *kubernetes.Clientset, namespace string) (Services, error) {
Expand Down
55 changes: 55 additions & 0 deletions cmd/check_versions_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package cmd

import "testing"

func TestGetRequiredVersions(t *testing.T) {
cases := Services{
{
Name: "cert-manager",
Version: "1.4.0",
},
{
Name: "coredns",
Version: "1.8.4",
},
{
Name: "kube-proxy",
Version: "1.19.6-eksbuild.2",
},
{
Name: "kube-state-metrics",
Version: "2.1.0",
},
{
Name: "metrics-server",
Version: "0.5.0",
},
{
Name: "node-problem-detector",
Version: "0.8.9",
},
{
Name: "nvidia-device-plugin",
Version: "0.9.0",
},
{
Name: "cluster-autoscaler",
Version: "1.19",
},
}

for _, test := range cases {
actual, err := getRequiredVersion("v1.19", test.Name)
if err != nil {
t.Fatal(err)
}
assertVersion(t, test.Name, test.Version, actual)
}
}

func assertVersion(t *testing.T, component, expected, actual string) {
t.Helper()
if expected != actual {
t.Fatalf("expected %s version %s, got %s", component, expected, actual)
}
}
36 changes: 36 additions & 0 deletions cmd/config/components.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{
"v1.19": [
{
"Name": "cert-manager",
"Version": "1.4.0"
},
{
"Name": "coredns",
"Version": "1.8.4"
},
{
"Name": "kube-proxy",
"Version": "1.19.6-eksbuild.2"
},
{
"Name": "kube-state-metrics",
"Version": "2.1.0"
},
{
"Name": "metrics-server",
"Version": "0.5.0"
},
{
"Name": "node-problem-detector",
"Version": "0.8.9"
},
{
"Name": "nvidia-device-plugin",
"Version": "0.9.0"
},
{
"Name": "cluster-autoscaler",
"Version": "1.19"
}
]
}

0 comments on commit 828bacc

Please sign in to comment.