constellation/internal/versions/versions_test.go
Markus Rudy 837b24bf54
versions: generate k8s image patches (incl etcd) (#2764)
* versions: generate k8s image patches (incl etcd)
2023-12-21 20:56:55 +01:00

77 lines
1.9 KiB
Go

/*
Copyright (c) Edgeless Systems GmbH
SPDX-License-Identifier: AGPL-3.0-only
*/
package versions
import (
"fmt"
"path"
"strings"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/vincent-petithory/dataurl"
)
func TestVersionFromDockerImage(t *testing.T) {
testCases := map[string]struct {
imageName string
wantVersion string
wantPanic bool
}{
"valid image name": {
imageName: "registry.test.foo/kube-apiserver:v1.18.0",
wantVersion: "v1.18.0",
},
"valid image name with sha": {
imageName: "registry.test.foo/kube-apiserver:v1.18.0@sha256:1234567890abcdef",
wantVersion: "v1.18.0",
},
"invalid image name": {
imageName: "registry.test.foo/kube-apiserver",
wantPanic: true,
},
}
for name, tc := range testCases {
t.Run(name, func(t *testing.T) {
assert := assert.New(t)
if tc.wantPanic {
assert.Panics(func() { versionFromDockerImage(tc.imageName) })
} else {
assert.Equal(tc.wantVersion, versionFromDockerImage(tc.imageName))
}
})
}
}
func TestKubernetesImagePatchCompatibility(t *testing.T) {
// This test ensures that pinned Kubernetes images correspond to the
// supported Kubernetes versions.
for v, clusterConfig := range VersionConfigs {
t.Run(string(v), func(t *testing.T) {
for i, component := range clusterConfig.KubernetesComponents.GetUpgradableComponents() {
if !strings.HasPrefix(component.Url, "data:") {
// This test only applies to kubeadm patches.
continue
}
if strings.Contains(component.InstallPath, "/etcd") {
// The etcd version is not derived from the Kubernetes version
continue
}
t.Run(fmt.Sprintf("%d-%s", i, path.Base(component.InstallPath)), func(t *testing.T) {
require := require.New(t)
dataURL, err := dataurl.DecodeString(component.Url)
require.NoError(err)
require.Contains(string(dataURL.Data), clusterConfig.ClusterVersion)
})
}
})
}
}