debian-forge-composer/cmd/osbuild-composer/config_test.go
Tomáš Hozza 286236b698 Config: don't override undefined keys when loading from ENV
Composer can load configuration values defined as map from ENV.
Previously, when loading the configuration from ENV, the whole map would
get overridden, not just values defined in the ENV. This is however not
intended and not consistent with how loading configuration from file
works.

Adjust the configuration loading from ENV and adjust the unit test
accordingly.

Signed-off-by: Tomáš Hozza <thozza@redhat.com>
2024-07-17 11:02:41 +02:00

184 lines
5.1 KiB
Go

package main
import (
"bytes"
"os"
"strings"
"testing"
"github.com/stretchr/testify/require"
)
func TestEmpty(t *testing.T) {
config, err := LoadConfig("testdata/empty-config.toml")
require.NoError(t, err)
require.NotNil(t, config)
require.Equal(t, GetDefaultConfig(), config)
}
func TestNonExisting(t *testing.T) {
config, err := LoadConfig("testdata/non-existing-config.toml")
require.Nil(t, err)
require.Equal(t, config, GetDefaultConfig())
}
func TestDefaultConfig(t *testing.T) {
defaultConfig := GetDefaultConfig()
require.False(t, defaultConfig.Koji.EnableJWT)
require.Equal(t, "", defaultConfig.Koji.JWTKeysCA)
require.False(t, defaultConfig.Worker.EnableJWT)
require.Equal(t, "", defaultConfig.Worker.JWTKeysCA)
require.Equal(t, KojiAPIConfig{
EnableTLS: true,
EnableMTLS: true,
EnableJWT: false,
}, defaultConfig.Koji)
require.Equal(t, WorkerAPIConfig{
RequestJobTimeout: "0",
BasePath: "/api/worker/v1",
EnableArtifacts: true,
EnableTLS: true,
EnableMTLS: true,
EnableJWT: false,
WorkerHeartbeatTimeout: "1h",
}, defaultConfig.Worker)
expectedWeldrAPIConfig := WeldrAPIConfig{
DistroConfigs: map[string]WeldrDistroConfig{
"rhel-*": {
[]string{
"azure-eap7-rhui",
"azure-rhui",
"azure-sap-rhui",
"ec2",
"ec2-ha",
"ec2-sap",
"gce-rhui",
},
},
"fedora-*": {
[]string{
"iot-bootable-container",
},
},
},
}
require.Equal(t, expectedWeldrAPIConfig, defaultConfig.WeldrAPI)
expectedDistroAliases := map[string]string{
"rhel-10": "rhel-10.0",
"rhel-7": "rhel-7.9",
"rhel-8": "rhel-8.10",
"rhel-9": "rhel-9.5",
}
require.Equal(t, expectedDistroAliases, defaultConfig.DistroAliases)
require.Equal(t, "journal", defaultConfig.LogFormat)
}
func TestConfig(t *testing.T) {
config, err := LoadConfig("testdata/test.toml")
require.NoError(t, err)
require.NotNil(t, config)
require.Equal(t, config.Koji.AllowedDomains, []string{"osbuild.org"})
require.Equal(t, config.Koji.CA, "/etc/osbuild-composer/ca-crt.pem")
require.Equal(t, config.Worker.AllowedDomains, []string{"osbuild.org"})
require.Equal(t, config.Worker.CA, "/etc/osbuild-composer/ca-crt.pem")
require.Equal(t, []string{"qcow2", "vmdk"}, config.WeldrAPI.DistroConfigs["*"].ImageTypeDenyList)
require.Equal(t, []string{"qcow2"}, config.WeldrAPI.DistroConfigs["rhel-84"].ImageTypeDenyList)
require.Equal(t, "overwrite-me-db", config.Worker.PGDatabase)
require.NoError(t, os.Setenv("PGDATABASE", "composer-db"))
config, err = LoadConfig("testdata/test.toml")
require.NoError(t, err)
require.NotNil(t, config)
require.Equal(t, "composer-db", config.Worker.PGDatabase)
require.False(t, config.Koji.EnableJWT)
require.Equal(t, []string{"https://sso.redhat.com/auth/realms/redhat-external/protocol/openid-connect/certs"}, config.Koji.JWTKeysURLs)
require.Equal(t, "", config.Koji.JWTKeysCA)
require.Equal(t, "/var/lib/osbuild-composer/acl", config.Koji.JWTACLFile)
// 'rhel-8' and 'rhel-9' aliases are overwritten by the config file
expectedDistroAliases := map[string]string{
"rhel-10": "rhel-10.0", // this value is from the default config
"rhel-7": "rhel-7.9", // this value is from the default config
"rhel-8": "rhel-8.9",
"rhel-9": "rhel-9.3",
}
require.Equal(t, expectedDistroAliases, config.DistroAliases)
}
func TestWeldrDistrosImageTypeDenyList(t *testing.T) {
config, err := LoadConfig("testdata/test.toml")
require.NoError(t, err)
require.NotNil(t, config)
// rhel config is overridden, but fedora is unaffected
expectedWeldrDistrosImageTypeDenyList := map[string][]string{
"*": {"qcow2", "vmdk"},
"fedora-*": {"iot-bootable-container"},
"rhel-84": {"qcow2"},
}
require.Equal(t, expectedWeldrDistrosImageTypeDenyList, config.weldrDistrosImageTypeDenyList())
}
func TestDumpConfig(t *testing.T) {
config := &ComposerConfigFile{
Worker: WorkerAPIConfig{
PGPassword: "sensitive",
},
}
var buf bytes.Buffer
require.NoError(t, DumpConfig(*config, &buf))
require.Contains(t, buf.String(), "pg_password = \"\"")
require.NotContains(t, buf.String(), "sensitive")
// DumpConfig takes a copy
require.Equal(t, "sensitive", config.Worker.PGPassword)
}
func TestEnvStrToMap(t *testing.T) {
env := "key1=value1,key2=value2,key3=value3"
expected := map[string]string{
"key1": "value1",
"key2": "value2",
"key3": "value3",
}
got, err := envStrToMap(env)
require.NoError(t, err)
require.Equal(t, expected, got)
}
func TestConfigFromEnv(t *testing.T) {
// simulate the environment variables
currentEnv := os.Environ()
defer func() {
os.Clearenv()
for _, env := range currentEnv {
pair := strings.SplitN(env, "=", 2)
_ = os.Setenv(pair[0], pair[1])
}
}()
os.Setenv("DISTRO_ALIASES", "rhel-7=rhel-7.9,rhel-8=rhel-8.9,rhel-9=rhel-9.3")
expectedDistroAliases := map[string]string{
"rhel-7": "rhel-7.9",
"rhel-8": "rhel-8.9",
"rhel-9": "rhel-9.3",
"rhel-10": "rhel-10.0", // this value is from the default config
}
config, err := LoadConfig("")
require.NoError(t, err)
require.Equal(t, expectedDistroAliases, config.DistroAliases)
}