constellation/operators/constellation-node-operator/internal/deploy/imageinfo_test.go

230 lines
6.5 KiB
Go

/*
Copyright (c) Edgeless Systems GmbH
SPDX-License-Identifier: AGPL-3.0-only
*/
package deploy
import (
"bufio"
"os"
"strings"
"testing"
"github.com/spf13/afero"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestImageVersion(t *testing.T) {
testCases := map[string]struct {
imageReference string
createFile [2]string
wantVersion string
wantErr bool
}{
"version found in /etc": {
imageReference: "some-reference",
createFile: [2]string{"/host/etc/os-release", osRelease},
wantVersion: "v2.3.0",
},
"version found in /usr/lib": {
imageReference: "some-reference",
createFile: [2]string{"/host/usr/lib/os-release", osRelease},
wantVersion: "v2.3.0",
},
"version not found": {
imageReference: "some-reference",
wantErr: true,
},
"fallback version found": {
imageReference: "ami-04a87d302e2509aad",
wantVersion: "v2.2.0",
},
}
for name, tc := range testCases {
t.Run(name, func(t *testing.T) {
assert := assert.New(t)
require := require.New(t)
fs := afero.NewMemMapFs()
if tc.createFile[0] != "" {
err := afero.WriteFile(fs, tc.createFile[0], []byte(tc.createFile[1]), os.ModePerm)
require.NoError(err)
}
imageInfo := &ImageInfo{
fs: &afero.Afero{Fs: fs},
}
version, err := imageInfo.ImageVersion(tc.imageReference)
if tc.wantErr {
assert.Error(err)
return
}
require.NoError(err)
assert.Equal(tc.wantVersion, version)
})
}
}
func TestGetOSReleaseImageVersion(t *testing.T) {
testCases := map[string]struct {
path string
wantVersion string
wantErr bool
}{
"version found": {
path: "os-release",
wantVersion: "v2.3.0",
},
"invalid path": {
path: "not/a/real/path",
wantErr: true,
},
"empty file": {
path: "empty",
wantErr: true,
},
}
for name, tc := range testCases {
t.Run(name, func(t *testing.T) {
assert := assert.New(t)
require := require.New(t)
fs := afero.NewMemMapFs()
err := afero.WriteFile(fs, "os-release", []byte(osRelease), os.ModePerm)
require.NoError(err)
err = afero.WriteFile(fs, "empty", []byte{}, os.ModePerm)
require.NoError(err)
imageInfo := &ImageInfo{
fs: &afero.Afero{Fs: fs},
}
version, err := imageInfo.getOSReleaseImageVersion(tc.path)
if tc.wantErr {
assert.Error(err)
return
}
require.NoError(err)
assert.Equal(tc.wantVersion, version)
})
}
}
func TestParseOSRelease(t *testing.T) {
assert := assert.New(t)
require := require.New(t)
osReleaseMap, err := parseOSRelease(bufio.NewScanner(strings.NewReader(osRelease)))
require.NoError(err)
assert.Equal(wantMap, osReleaseMap)
}
func TestImageVersionFromFallback(t *testing.T) {
testCases := map[string]struct {
imageReference string
wantVersion string
wantErr bool
}{
"AWS reference": {
imageReference: "ami-06b8cbf4837a0a57c",
wantVersion: "v2.2.2",
},
"Azure reference": {
imageReference: "/subscriptions/0d202bbb-4fa7-4af8-8125-58c269a05435/resourceGroups/constellation-images/providers/Microsoft.Compute/galleries/Constellation/images/constellation/versions/2.1.0",
wantVersion: "v2.1.0",
},
"GCP reference": {
imageReference: "projects/constellation-images/global/images/constellation-v2-0-0",
wantVersion: "v2.0.0",
},
"unknown reference": {
imageReference: "unknown",
wantErr: true,
},
}
for name, tc := range testCases {
t.Run(name, func(t *testing.T) {
assert := assert.New(t)
require := require.New(t)
version, err := imageVersionFromFallback(tc.imageReference)
if tc.wantErr {
assert.Error(err)
return
}
require.NoError(err)
assert.Equal(tc.wantVersion, version)
})
}
}
const osRelease = `
# Some comment
# Some empty lines below
SINGLE_QUOTED_VALUE='WOW! This is a single quoted value!'
DOUBLE_QUOTED_VALUE="WOW! This is a double quoted value!"
ESCAPED_BACKSLASH='This is a string with an escaped backslash: \\'
ESCAPED_DOLLAR='This is a string with an escaped dollar: \$'
ESCAPED_DOUBLE_QUOTE='This is a string with an escaped double quote: \"'
ESCAPED_SINGLE_QUOTE="This is a string with an escaped single quote: \'"
NAME="Fedora Linux"
VERSION="37 (Thirty Seven)"
ID=fedora
PRETTY_NAME="Fedora Linux 37 (Thirty Seven)"
ANSI_COLOR="0;38;2;60;110;180"
VERSION_ID=37
VERSION_CODENAME=""
PLATFORM_ID="platform:f37"
LOGO=fedora-logo-icon
CPE_NAME="cpe:/o:fedoraproject:fedora:37"
DEFAULT_HOSTNAME="fedora"
HOME_URL="https://fedoraproject.org/"
DOCUMENTATION_URL="https://docs.fedoraproject.org/en-US/fedora/f37/system-administrators-guide/"
SUPPORT_URL="https://ask.fedoraproject.org/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"
REDHAT_BUGZILLA_PRODUCT="Fedora"
REDHAT_BUGZILLA_PRODUCT_VERSION=37
REDHAT_SUPPORT_PRODUCT="Fedora"
REDHAT_SUPPORT_PRODUCT_VERSION=37
IMAGE_ID="constellation"
IMAGE_VERSION="v2.3.0"
`
var wantMap = map[string]string{
"NAME": `Fedora Linux`,
"VERSION": `37 (Thirty Seven)`,
"ID": `fedora`,
"SINGLE_QUOTED_VALUE": `WOW! This is a single quoted value!`,
"DOUBLE_QUOTED_VALUE": `WOW! This is a double quoted value!`,
"ESCAPED_BACKSLASH": `This is a string with an escaped backslash: \`,
"ESCAPED_DOLLAR": `This is a string with an escaped dollar: $`,
"ESCAPED_DOUBLE_QUOTE": `This is a string with an escaped double quote: "`,
"ESCAPED_SINGLE_QUOTE": `This is a string with an escaped single quote: '`,
"VERSION_ID": `37`,
"VERSION_CODENAME": ``,
"PLATFORM_ID": `platform:f37`,
"PRETTY_NAME": `Fedora Linux 37 (Thirty Seven)`,
"ANSI_COLOR": `0;38;2;60;110;180`,
"LOGO": `fedora-logo-icon`,
"CPE_NAME": `cpe:/o:fedoraproject:fedora:37`,
"DEFAULT_HOSTNAME": `fedora`,
"HOME_URL": `https://fedoraproject.org/`,
"DOCUMENTATION_URL": `https://docs.fedoraproject.org/en-US/fedora/f37/system-administrators-guide/`,
"SUPPORT_URL": `https://ask.fedoraproject.org/`,
"BUG_REPORT_URL": `https://bugzilla.redhat.com/`,
"REDHAT_BUGZILLA_PRODUCT": `Fedora`,
"REDHAT_BUGZILLA_PRODUCT_VERSION": `37`,
"REDHAT_SUPPORT_PRODUCT": `Fedora`,
"REDHAT_SUPPORT_PRODUCT_VERSION": `37`,
"IMAGE_ID": `constellation`,
"IMAGE_VERSION": `v2.3.0`,
}