automation-tests/common/pkg/config/config_local_test.go

592 lines
17 KiB
Go

//go:build !remote
package config
import (
"fmt"
"os"
"path"
"runtime"
"strings"
"github.com/containers/common/libnetwork/types"
. "github.com/onsi/ginkgo/v2"
"github.com/onsi/gomega"
)
var _ = Describe("Config Local", func() {
It("should not fail on invalid NetworkConfigDir", func() {
defConf, err := defaultConfig()
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(defConf).NotTo(gomega.BeNil())
// Given
tmpfile := path.Join(os.TempDir(), "wrong-file")
file, err := os.Create(tmpfile)
gomega.Expect(err).ToNot(gomega.HaveOccurred())
file.Close()
defer os.Remove(tmpfile)
defConf.Network.NetworkConfigDir = tmpfile
defConf.Network.CNIPluginDirs.Set([]string{})
// When
err = defConf.Network.Validate()
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
})
It("should not fail on invalid CNIPluginDirs", func() {
defConf, err := defaultConfig()
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(defConf).NotTo(gomega.BeNil())
t := GinkgoT()
validDirPath := t.TempDir()
// Given
defConf.Network.NetworkConfigDir = validDirPath
defConf.Network.CNIPluginDirs.Set([]string{invalidPath})
// When
err = defConf.Network.Validate()
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
})
It("should fail on invalid subnet pool", func() {
defConf, err := defaultConfig()
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(defConf).NotTo(gomega.BeNil())
t := GinkgoT()
validDirPath := t.TempDir()
// Given
defConf.Network.NetworkConfigDir = validDirPath
defConf.Network.CNIPluginDirs.Set([]string{validDirPath})
net, _ := types.ParseCIDR("10.0.0.0/24")
defConf.Network.DefaultSubnetPools = []SubnetPool{
{Base: &net, Size: 16},
}
// When
err = defConf.Network.Validate()
// Then
gomega.Expect(err).To(gomega.HaveOccurred())
defConf.Network.DefaultSubnetPools = []SubnetPool{
{Base: &net, Size: 33},
}
// When
err = defConf.Network.Validate()
// Then
gomega.Expect(err).To(gomega.HaveOccurred())
})
It("parse network subnet pool", func() {
config, err := NewConfig("testdata/containers_default.conf")
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
net1, _ := types.ParseCIDR("10.89.0.0/16")
net2, _ := types.ParseCIDR("10.90.0.0/15")
gomega.Expect(config.Network.DefaultSubnetPools).To(gomega.Equal(
[]SubnetPool{{
Base: &net1,
Size: 24,
}, {
Base: &net2,
Size: 24,
}},
))
})
It("parse dns port", func() {
// Given
config, err := New(nil)
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config.Network.DNSBindPort).To(gomega.Equal(uint16(0)))
// When
config2, err := NewConfig("testdata/containers_default.conf")
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config2.Network.DNSBindPort).To(gomega.Equal(uint16(1153)))
})
It("test firewall", func() {
// Given
config, err := New(nil)
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config.Network.FirewallDriver).To(gomega.Equal(string("")))
// When
config2, err := NewConfig("testdata/containers_default.conf")
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config2.Network.FirewallDriver).To(gomega.Equal("none"))
})
It("parse pasta_options", func() {
// Given
config, err := New(nil)
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config.Network.PastaOptions.Get()).To(gomega.BeEmpty())
// When
config2, err := NewConfig("testdata/containers_default.conf")
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config2.Network.PastaOptions.Get()).To(gomega.Equal([]string{"-t", "auto"}))
})
It("parse default_rootless_network_cmd", func() {
// Given
config, err := NewConfig("")
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config.Network.DefaultRootlessNetworkCmd).To(gomega.Equal("pasta"))
// When
config2, err := NewConfig("testdata/containers_default.conf")
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config2.Network.DefaultRootlessNetworkCmd).To(gomega.Equal("slirp4netns"))
})
It("should fail on invalid device mode", func() {
defConf, err := defaultConfig()
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(defConf).NotTo(gomega.BeNil())
// Given
defConf.Containers.Devices.Set([]string{"/dev/null:/dev/null:abc"})
// When
err = defConf.Containers.Validate()
// Then
gomega.Expect(err).To(gomega.HaveOccurred())
})
It("should fail on invalid first device", func() {
defConf, err := defaultConfig()
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(defConf).NotTo(gomega.BeNil())
// Given
defConf.Containers.Devices.Set([]string{"wrong:/dev/null:rw"})
// When
err = defConf.Containers.Validate()
// Then
gomega.Expect(err).To(gomega.HaveOccurred())
})
It("should fail on invalid second device", func() {
defConf, err := defaultConfig()
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(defConf).NotTo(gomega.BeNil())
// Given
defConf.Containers.Devices.Set([]string{"/dev/null:wrong:rw"})
// When
err = defConf.Containers.Validate()
// Then
gomega.Expect(err).To(gomega.HaveOccurred())
})
It("should fail on invalid device", func() {
defConf, err := defaultConfig()
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(defConf).NotTo(gomega.BeNil())
// Given
defConf.Containers.Devices.Set([]string{invalidPath})
// When
err = defConf.Containers.Validate()
// Then
gomega.Expect(err).To(gomega.HaveOccurred())
})
It("should fail on wrong invalid device specification", func() {
defConf, err := defaultConfig()
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(defConf).NotTo(gomega.BeNil())
// Given
defConf.Containers.Devices.Set([]string{"::::"})
// When
err = defConf.Containers.Validate()
// Then
gomega.Expect(err).To(gomega.HaveOccurred())
})
It("should fail on invalid interface_name", func() {
defConf, err := defaultConfig()
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(defConf).NotTo(gomega.BeNil())
// Given
defConf.Containers.InterfaceName = "random"
// When
err = defConf.Containers.Validate()
// Then
gomega.Expect(err).To(gomega.HaveOccurred())
})
It("should succeed on good interface_name", func() {
defConf, err := defaultConfig()
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(defConf).NotTo(gomega.BeNil())
// Given
defConf.Containers.InterfaceName = "device"
// When
err = defConf.Containers.Validate()
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
})
It("should succeed on default interface_name", func() {
defConf, err := defaultConfig()
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(defConf).NotTo(gomega.BeNil())
// Given
defConf.Containers.InterfaceName = ""
// When
err = defConf.Containers.Validate()
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
})
It("should fail on bad timezone", func() {
defConf, err := defaultConfig()
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(defConf).NotTo(gomega.BeNil())
// Given
defConf.Containers.TZ = "foo"
// When
err = defConf.Containers.Validate()
// Then
gomega.Expect(err).To(gomega.HaveOccurred())
})
It("should succeed on good timezone", func() {
defConf, err := defaultConfig()
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(defConf).NotTo(gomega.BeNil())
// Given
defConf.Containers.TZ = "US/Eastern"
// When
err = defConf.Containers.Validate()
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
})
It("should succeed on local timezone", func() {
defConf, err := defaultConfig()
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(defConf).NotTo(gomega.BeNil())
// Given
defConf.Containers.TZ = "local"
// When
err = defConf.Containers.Validate()
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
})
It("should fail on wrong DefaultUlimits", func() {
defConf, err := defaultConfig()
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(defConf).NotTo(gomega.BeNil())
// Given
defConf.Containers.DefaultUlimits.Set([]string{invalidPath})
// When
err = defConf.Containers.Validate()
// Then
gomega.Expect(err).To(gomega.HaveOccurred())
})
It("should return containers engine env", func() {
// Given
expectedEnv := []string{"super=duper", "foo=bar"}
// When
config, err := NewConfig("testdata/containers_default.conf")
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config.Engine.Env.Get()).To(gomega.BeEquivalentTo(expectedEnv))
gomega.Expect(os.Getenv("super")).To(gomega.BeEquivalentTo("duper"))
gomega.Expect(os.Getenv("foo")).To(gomega.BeEquivalentTo("bar"))
})
It("should override cdi_spec_dirs if provided", func() {
// Given
config1, err := New(nil)
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config1.Engine.CdiSpecDirs.Get()).To(gomega.Equal([]string{"/etc/cdi"}))
// Given default just get default
config2, err := NewConfig("testdata/containers_default.conf")
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config2.Engine.CdiSpecDirs.Get()).To(gomega.Equal([]string{"/etc/cdi"}))
// Given override just get override
config3, err := NewConfig("testdata/containers_override.conf")
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config3.Engine.CdiSpecDirs.Get()).To(gomega.Equal([]string{"/somepath"}))
// Given override just get override
config4, err := NewConfig("testdata/containers_override2.conf")
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config4.Engine.CdiSpecDirs.Get()).To(gomega.Equal([]string{"/somepath", "/some_other_path"}))
})
It("Expect Remote to be False", func() {
// Given
// When
config, err := New(nil)
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config.Engine.Remote).To(gomega.BeFalse())
})
It("verify getDefaultEnv", func() {
envs := []string{
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
}
// Given we do
t := GinkgoT()
t.Setenv(containersConfEnv, "/dev/null")
// When
config, err := New(nil)
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config.GetDefaultEnv()).To(gomega.BeEquivalentTo(envs))
config.Containers.HTTPProxy = true
gomega.Expect(config.GetDefaultEnv()).To(gomega.BeEquivalentTo(envs))
t.Setenv("HTTP_PROXY", "localhost")
t.Setenv("FOO", "BAR")
newenvs := []string{"HTTP_PROXY=localhost"}
envs = append(newenvs, envs...)
gomega.Expect(config.GetDefaultEnv()).To(gomega.BeEquivalentTo(envs))
config.Containers.HTTPProxy = false
config.Containers.EnvHost = true
envString := strings.Join(config.GetDefaultEnv(), ",")
gomega.Expect(envString).To(gomega.ContainSubstring("FOO=BAR"))
gomega.Expect(envString).To(gomega.ContainSubstring("HTTP_PROXY=localhost"))
})
It("Default Umask", func() {
// Given
// When
config, err := New(nil)
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config.Containers.Umask).To(gomega.Equal("0022"))
})
It("Set Umask", func() {
// Given
// When
config, err := NewConfig("testdata/containers_default.conf")
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config.Containers.Umask).To(gomega.Equal("0002"))
})
It("Should fail on bad Umask", func() {
defConf, err := defaultConfig()
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(defConf).NotTo(gomega.BeNil())
// Given
defConf.Containers.Umask = "88888"
// When
err = defConf.Containers.Validate()
// Then
gomega.Expect(err).To(gomega.HaveOccurred())
})
It("default netns", func() {
// Given
config, err := New(nil)
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config.Containers.NetNS).To(gomega.Equal("private"))
// When
config2, err := NewConfig("testdata/containers_default.conf")
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config2.Containers.NetNS).To(gomega.Equal("bridge"))
})
It("should have a default secret driver", func() {
// Given
path := ""
// When
config, err := NewConfig(path)
gomega.Expect(err).ToNot(gomega.HaveOccurred())
// Then
gomega.Expect(config.Secrets.Driver).To(gomega.Equal("file"))
})
It("should be possible to override the secret driver and options", func() {
// Given
path := "testdata/containers_override.conf"
// When
config, err := NewConfig(path)
gomega.Expect(err).ToNot(gomega.HaveOccurred())
// Then
gomega.Expect(config.Secrets.Driver).To(gomega.Equal("pass"))
gomega.Expect(config.Secrets.Opts).To(gomega.Equal(map[string]string{
"key": "foo@bar",
"root": "/srv/password-store",
}))
})
It("Set machine image path", func() {
// Given
config, err := New(nil)
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config.Machine.Image).To(gomega.Equal(""))
// When
config2, err := NewConfig("testdata/containers_default.conf")
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
path := "https://example.com/$OS/$ARCH/foobar.ami"
gomega.Expect(config2.Machine.Image).To(gomega.Equal(path))
val := fmt.Sprintf("https://example.com/%s/%s/foobar.ami", runtime.GOOS, runtime.GOARCH)
gomega.Expect(config2.Machine.URI()).To(gomega.BeEquivalentTo(val))
})
It("CompatAPIEnforceDockerHub", func() {
// Given
config, err := New(nil)
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config.Engine.CompatAPIEnforceDockerHub).To(gomega.BeTrue())
// When
config2, err := NewConfig("testdata/containers_default.conf")
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config2.Engine.CompatAPIEnforceDockerHub).To(gomega.BeFalse())
})
It("ComposeProviders", func() {
// Given
config, err := New(nil)
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config.Engine.ComposeProviders.Get()).To(gomega.Equal(getDefaultComposeProviders())) // no hard-coding to work on all platforms
// When
config2, err := NewConfig("testdata/containers_default.conf")
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config2.Engine.ComposeProviders.Get()).To(gomega.Equal([]string{"/some/thing/else", "/than/before"}))
})
It("AddCompression", func() {
// Given
config, err := New(nil)
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config.Engine.AddCompression.Get()).To(gomega.BeEmpty()) // no hard-coding to work on all platforms
// When
config2, err := NewConfig("testdata/containers_default.conf")
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config2.Engine.AddCompression.Get()).To(gomega.Equal([]string{"zstd", "zstd:chunked"}))
})
It("ComposeWarningLogs", func() {
// Given
config, err := New(nil)
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config.Engine.ComposeWarningLogs).To(gomega.BeTrue())
// When
config2, err := NewConfig("testdata/containers_default.conf")
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config2.Engine.ComposeWarningLogs).To(gomega.BeFalse())
})
It("Set machine disk", func() {
// Given
config, err := New(nil)
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config.Machine.DiskSize).To(gomega.Equal(uint64(100)))
// When
config2, err := NewConfig("testdata/containers_default.conf")
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config2.Machine.DiskSize).To(gomega.Equal(uint64(20)))
})
It("Set machine CPUs", func() {
// Given
cpus := runtime.NumCPU() / 2
if cpus == 0 {
cpus = 1
}
config, err := New(nil)
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config.Machine.CPUs).To(gomega.Equal(uint64(cpus)))
// When
config2, err := NewConfig("testdata/containers_default.conf")
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config2.Machine.CPUs).To(gomega.Equal(uint64(1)))
})
It("Set machine memory", func() {
// Given
config, err := New(nil)
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config.Machine.Memory).To(gomega.Equal(uint64(2048)))
// When
config2, err := NewConfig("testdata/containers_default.conf")
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config2.Machine.Memory).To(gomega.Equal(uint64(1024)))
})
It("Get Rosetta value", func() {
// Given
config, err := New(nil)
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config.Machine.Rosetta).To(gomega.BeTrue())
// When
config2, err := NewConfig("testdata/containers_default.conf")
// Then
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config2.Machine.Rosetta).To(gomega.BeFalse())
})
})