From db9bf1c65945c72e9d28ba592d503695f3dcbe46 Mon Sep 17 00:00:00 2001 From: Lars Karlitski Date: Fri, 25 Sep 2020 10:21:04 +0200 Subject: [PATCH] osbuild-composer: move config parsing into separate file The configuration file is API. Let's give it a bit more prominence to help people treat it as such, and a chance to test it. A basic test is included in this commit. Also, this cuts down on the noise in main.go a bit. --- cmd/osbuild-composer/config.go | 37 ++++++++++++++++++ cmd/osbuild-composer/config_test.go | 22 +++++++++++ cmd/osbuild-composer/main.go | 39 ++++++------------- .../testdata/empty-config.toml | 0 4 files changed, 71 insertions(+), 27 deletions(-) create mode 100644 cmd/osbuild-composer/config.go create mode 100644 cmd/osbuild-composer/config_test.go create mode 100644 cmd/osbuild-composer/testdata/empty-config.toml diff --git a/cmd/osbuild-composer/config.go b/cmd/osbuild-composer/config.go new file mode 100644 index 000000000..2c600a659 --- /dev/null +++ b/cmd/osbuild-composer/config.go @@ -0,0 +1,37 @@ +package main + +import ( + "io" + + "github.com/BurntSushi/toml" +) + +type ComposerConfigFile struct { + Koji *struct { + Servers map[string]struct { + Kerberos *struct { + Principal string `toml:"principal"` + KeyTab string `toml:"keytab"` + } `toml:"kerberos,omitempty"` + } `toml:"servers"` + AllowedDomains []string `toml:"allowed_domains"` + CA *string `toml:"ca"` + } `toml:"koji"` + Worker *struct { + AllowedDomains []string `toml:"allowed_domains"` + CA *string `toml:"ca"` + } `toml:"worker,omitempty"` +} + +func LoadConfig(name string) (*ComposerConfigFile, error) { + var c ComposerConfigFile + _, err := toml.DecodeFile(name, &c) + if err != nil { + return nil, err + } + return &c, nil +} + +func DumpConfig(c *ComposerConfigFile, w io.Writer) error { + return toml.NewEncoder(w).Encode(c) +} diff --git a/cmd/osbuild-composer/config_test.go b/cmd/osbuild-composer/config_test.go new file mode 100644 index 000000000..8b1459fda --- /dev/null +++ b/cmd/osbuild-composer/config_test.go @@ -0,0 +1,22 @@ +package main + +import ( + "os" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestEmpty(t *testing.T) { + config, err := LoadConfig("testdata/empty-config.toml") + require.NoError(t, err) + require.Nil(t, config.Koji) + require.Nil(t, config.Worker) +} + +func TestNonExisting(t *testing.T) { + config, err := LoadConfig("testdata/non-existing-config.toml") + require.Error(t, err) + require.True(t, os.IsNotExist(err)) + require.Nil(t, config) +} diff --git a/cmd/osbuild-composer/main.go b/cmd/osbuild-composer/main.go index cdd55f283..c8ae2bf78 100644 --- a/cmd/osbuild-composer/main.go +++ b/cmd/osbuild-composer/main.go @@ -10,8 +10,6 @@ import ( "os" "path" - "github.com/BurntSushi/toml" - "github.com/osbuild/osbuild-composer/internal/distro/fedora31" "github.com/osbuild/osbuild-composer/internal/distro/fedora32" "github.com/osbuild/osbuild-composer/internal/distro/rhel8" @@ -79,36 +77,23 @@ func createTLSConfig(c *connectionConfig) (*tls.Config, error) { } func main() { - var config struct { - Koji *struct { - Servers map[string]struct { - Kerberos *struct { - Principal string `toml:"principal"` - KeyTab string `toml:"keytab"` - } `toml:"kerberos,omitempty"` - } `toml:"servers"` - AllowedDomains []string `toml:"allowed_domains"` - CA *string `toml:"ca"` - } `toml:"koji"` - Worker *struct { - AllowedDomains []string `toml:"allowed_domains"` - CA *string `toml:"ca"` - } `toml:"worker,omitempty"` - } var verbose bool flag.BoolVar(&verbose, "v", false, "Print access log") flag.Parse() - _, err := toml.DecodeFile(configFile, &config) - if err == nil { - log.Println("Composer configuration:") - encoder := toml.NewEncoder(log.Writer()) - err := encoder.Encode(&config) - if err != nil { - log.Fatalf("Could not print config: %v", err) + config, err := LoadConfig(configFile) + if err != nil { + if os.IsNotExist(err) { + config = &ComposerConfigFile{} + } else { + log.Fatalf("Error loading configuration: %v", err) } - } else if !os.IsNotExist(err) { - log.Fatalf("Could not load config file '%s': %v", configFile, err) + } + + log.Println("Loaded configuration:") + err = DumpConfig(config, log.Writer()) + if err != nil { + log.Fatalf("Error printing configuration: %v", err) } stateDir, ok := os.LookupEnv("STATE_DIRECTORY") diff --git a/cmd/osbuild-composer/testdata/empty-config.toml b/cmd/osbuild-composer/testdata/empty-config.toml new file mode 100644 index 000000000..e69de29bb