diff --git a/config/config.go b/config/config.go index 5b9d9a1f..49bc4080 100644 --- a/config/config.go +++ b/config/config.go @@ -52,9 +52,6 @@ const ( // DefaultConfigFilePath is the default path on disk to the garm // configuration file. DefaultConfigFilePath = "/etc/garm/config.toml" - // DefaultConfigDir is the default path on disk to the config dir. The config - // file will probably be in the same folder, but it is not mandatory. - DefaultConfigDir = "/etc/garm" // DefaultUser is the default username that should exist on the instances. DefaultUser = "runner" @@ -73,6 +70,10 @@ const ( ) var ( + // DefaultConfigDir is the default path on disk to the config dir. The config + // file will probably be in the same folder, but it is not mandatory. + DefaultConfigDir = "/etc/garm" + // DefaultUserGroups are the groups the default user will be part of. DefaultUserGroups = []string{ "sudo", "adm", "cdrom", "dialout", diff --git a/config/config_test.go b/config/config_test.go index 464bb8ef..009fd8c8 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -655,3 +655,61 @@ func TestTimeToLiveDuration(t *testing.T) { require.NotNil(t, err) require.EqualError(t, err, "time: unknown unit \"d\" in duration \"2d\"") } + +func TestNewConfig(t *testing.T) { + cfg, err := NewConfig("testdata/test-valid-config.toml") + require.Nil(t, err) + require.NotNil(t, cfg) + require.Equal(t, "https://garm.example.com/", cfg.Default.CallbackURL) + require.Equal(t, "./testdata/config_dir", cfg.Default.ConfigDir) + require.Equal(t, "0.0.0.0", cfg.APIServer.Bind) + require.Equal(t, 9998, cfg.APIServer.Port) + require.Equal(t, false, cfg.APIServer.UseTLS) + require.Equal(t, DBBackendType("mysql"), cfg.Database.DbBackend) + require.Equal(t, "bocyasicgatEtenOubwonIbsudNutDom", cfg.Database.Passphrase) + require.Equal(t, "test", cfg.Database.MySQL.Username) + require.Equal(t, "test", cfg.Database.MySQL.Password) + require.Equal(t, "127.0.0.1", cfg.Database.MySQL.Hostname) + require.Equal(t, "garm", cfg.Database.MySQL.DatabaseName) + require.Equal(t, "bocyasicgatEtenOubwonIbsudNutDom", cfg.JWTAuth.Secret) + require.Equal(t, timeToLive("48h"), cfg.JWTAuth.TimeToLive) +} + +func TestNewConfigEmptyConfigDir(t *testing.T) { + dirPath, err := ioutil.TempDir("", "garm-config-test") + if err != nil { + t.Fatalf("failed to create temporary directory: %s", err) + } + defer os.RemoveAll(dirPath) + DefaultConfigDir = dirPath + + cfg, err := NewConfig("testdata/test-empty-config-dir.toml") + require.Nil(t, err) + require.NotNil(t, cfg) + require.Equal(t, cfg.Default.ConfigDir, dirPath) + require.Equal(t, "https://garm.example.com/", cfg.Default.CallbackURL) + require.Equal(t, "0.0.0.0", cfg.APIServer.Bind) + require.Equal(t, 9998, cfg.APIServer.Port) + require.Equal(t, false, cfg.APIServer.UseTLS) + require.Equal(t, DBBackendType("mysql"), cfg.Database.DbBackend) + require.Equal(t, "test", cfg.Database.MySQL.Username) + require.Equal(t, "test", cfg.Database.MySQL.Password) + require.Equal(t, "127.0.0.1", cfg.Database.MySQL.Hostname) + require.Equal(t, "garm", cfg.Database.MySQL.DatabaseName) + require.Equal(t, "bocyasicgatEtenOubwonIbsudNutDom", cfg.JWTAuth.Secret) + require.Equal(t, timeToLive("48h"), cfg.JWTAuth.TimeToLive) +} + +func TestNewConfigInvalidTomlPath(t *testing.T) { + cfg, err := NewConfig("this is not a file path") + require.Nil(t, cfg) + require.NotNil(t, err) + require.Regexp(t, "decoding toml", err.Error()) +} + +func TestNewConfigInvalidConfig(t *testing.T) { + cfg, err := NewConfig("testdata/test-invalid-config.toml") + require.Nil(t, cfg) + require.NotNil(t, err) + require.Regexp(t, "validating config", err.Error()) +} diff --git a/config/testdata/test-empty-config-dir.toml b/config/testdata/test-empty-config-dir.toml new file mode 100644 index 00000000..30f36e7a --- /dev/null +++ b/config/testdata/test-empty-config-dir.toml @@ -0,0 +1,22 @@ +[default] + callback_url = "https://garm.example.com/" + config_dir = "" + +[apiserver] + bind = "0.0.0.0" + port = 9998 + use_tls = false + +[database] + backend = "mysql" + passphrase = "bocyasicgatEtenOubwonIbsudNutDom" + + [database.mysql] + username = "test" + password = "test" + hostname = "127.0.0.1" + database = "garm" + +[jwt_auth] + secret = "bocyasicgatEtenOubwonIbsudNutDom" + time_to_live = "48h" diff --git a/config/testdata/test-invalid-config.toml b/config/testdata/test-invalid-config.toml new file mode 100644 index 00000000..2f62acf2 --- /dev/null +++ b/config/testdata/test-invalid-config.toml @@ -0,0 +1,2 @@ +[apiserver] + port = -2 # this is considered an invalid port for garm diff --git a/config/testdata/test-valid-config.toml b/config/testdata/test-valid-config.toml new file mode 100644 index 00000000..5885f90f --- /dev/null +++ b/config/testdata/test-valid-config.toml @@ -0,0 +1,22 @@ +[default] + callback_url = "https://garm.example.com/" + config_dir = "./testdata/config_dir" + +[apiserver] + bind = "0.0.0.0" + port = 9998 + use_tls = false + +[database] + backend = "mysql" + passphrase = "bocyasicgatEtenOubwonIbsudNutDom" + + [database.mysql] + username = "test" + password = "test" + hostname = "127.0.0.1" + database = "garm" + +[jwt_auth] + secret = "bocyasicgatEtenOubwonIbsudNutDom" + time_to_live = "48h"