mirror of
https://github.com/project-zot/zot.git
synced 2025-01-06 22:40:28 -05:00
feat(config): handle config files with no explicit extension (#2147)
Signed-off-by: Petu Eusebiu <peusebiu@cisco.com>
This commit is contained in:
parent
d685adb029
commit
0bed25dddd
2 changed files with 78 additions and 4 deletions
|
@ -7,6 +7,7 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -23,6 +24,7 @@ import (
|
||||||
"zotregistry.io/zot/pkg/api"
|
"zotregistry.io/zot/pkg/api"
|
||||||
"zotregistry.io/zot/pkg/api/config"
|
"zotregistry.io/zot/pkg/api/config"
|
||||||
"zotregistry.io/zot/pkg/api/constants"
|
"zotregistry.io/zot/pkg/api/constants"
|
||||||
|
"zotregistry.io/zot/pkg/common"
|
||||||
extconf "zotregistry.io/zot/pkg/extensions/config"
|
extconf "zotregistry.io/zot/pkg/extensions/config"
|
||||||
"zotregistry.io/zot/pkg/extensions/monitoring"
|
"zotregistry.io/zot/pkg/extensions/monitoring"
|
||||||
zlog "zotregistry.io/zot/pkg/log"
|
zlog "zotregistry.io/zot/pkg/log"
|
||||||
|
@ -738,13 +740,45 @@ func LoadConfiguration(config *config.Config, configPath string) error {
|
||||||
// we need another key delimiter.
|
// we need another key delimiter.
|
||||||
viperInstance := viper.NewWithOptions(viper.KeyDelimiter("::"))
|
viperInstance := viper.NewWithOptions(viper.KeyDelimiter("::"))
|
||||||
|
|
||||||
|
ext := filepath.Ext(configPath)
|
||||||
|
ext = strings.Replace(ext, ".", "", 1)
|
||||||
|
|
||||||
|
/* if file extension is not supported, try everything
|
||||||
|
it's also possible that the filename is starting with a dot eg: ".config". */
|
||||||
|
if !common.Contains(viper.SupportedExts, ext) {
|
||||||
|
ext = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ext {
|
||||||
|
case "":
|
||||||
|
log.Info().Str("path", configPath).Msg("config file with no extension, trying all supported config types")
|
||||||
|
|
||||||
|
var err error
|
||||||
|
|
||||||
|
for _, configType := range viper.SupportedExts {
|
||||||
|
viperInstance.SetConfigType(configType)
|
||||||
|
viperInstance.SetConfigFile(configPath)
|
||||||
|
|
||||||
|
err = viperInstance.ReadInConfig()
|
||||||
|
if err == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Error().Err(err).Str("path", configPath).Msg("failed to read configuration, tried all supported config types")
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
default:
|
||||||
viperInstance.SetConfigFile(configPath)
|
viperInstance.SetConfigFile(configPath)
|
||||||
|
|
||||||
if err := viperInstance.ReadInConfig(); err != nil {
|
if err := viperInstance.ReadInConfig(); err != nil {
|
||||||
log.Error().Err(err).Msg("failed to read configuration")
|
log.Error().Err(err).Str("path", configPath).Msg("failed to read configuration")
|
||||||
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
metaData := &mapstructure.Metadata{}
|
metaData := &mapstructure.Metadata{}
|
||||||
if err := viperInstance.UnmarshalExact(&config, metadataConfig(metaData)); err != nil {
|
if err := viperInstance.UnmarshalExact(&config, metadataConfig(metaData)); err != nil {
|
||||||
|
|
|
@ -121,6 +121,46 @@ func TestVerify(t *testing.T) {
|
||||||
So(err, ShouldNotBeNil)
|
So(err, ShouldNotBeNil)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Convey("Test verify config with no extension", t, func(c C) {
|
||||||
|
tmpfile, err := os.CreateTemp("", "zot-test*")
|
||||||
|
So(err, ShouldBeNil)
|
||||||
|
defer os.Remove(tmpfile.Name()) // clean up
|
||||||
|
content := []byte(`{"distSpecVersion":"1.1.0-dev","storage":{"rootDirectory":"/tmp/zot"},
|
||||||
|
"http":{"address":"127.0.0.1","port":"8080","realm":"zot"},
|
||||||
|
"log":{"level":"debug"}}`)
|
||||||
|
_, err = tmpfile.Write(content)
|
||||||
|
So(err, ShouldBeNil)
|
||||||
|
err = tmpfile.Close()
|
||||||
|
So(err, ShouldBeNil)
|
||||||
|
os.Args = []string{"cli_test", "verify", tmpfile.Name()}
|
||||||
|
err = cli.NewServerRootCmd().Execute()
|
||||||
|
So(err, ShouldBeNil)
|
||||||
|
})
|
||||||
|
|
||||||
|
Convey("Test verify config with dotted config name", t, func(c C) {
|
||||||
|
tmpfile, err := os.CreateTemp("", ".zot-test*")
|
||||||
|
So(err, ShouldBeNil)
|
||||||
|
defer os.Remove(tmpfile.Name()) // clean up
|
||||||
|
content := []byte(`
|
||||||
|
distspecversion: 1.1.0-dev
|
||||||
|
http:
|
||||||
|
address: 127.0.0.1
|
||||||
|
port: 8080
|
||||||
|
realm: zot
|
||||||
|
log:
|
||||||
|
level: debug
|
||||||
|
storage:
|
||||||
|
rootdirectory: /tmp/zot
|
||||||
|
`)
|
||||||
|
_, err = tmpfile.Write(content)
|
||||||
|
So(err, ShouldBeNil)
|
||||||
|
err = tmpfile.Close()
|
||||||
|
So(err, ShouldBeNil)
|
||||||
|
os.Args = []string{"cli_test", "verify", tmpfile.Name()}
|
||||||
|
err = cli.NewServerRootCmd().Execute()
|
||||||
|
So(err, ShouldBeNil)
|
||||||
|
})
|
||||||
|
|
||||||
Convey("Test verify CVE warn for remote storage", t, func(c C) {
|
Convey("Test verify CVE warn for remote storage", t, func(c C) {
|
||||||
tmpfile, err := os.CreateTemp("", "zot-test*.json")
|
tmpfile, err := os.CreateTemp("", "zot-test*.json")
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
|
Loading…
Reference in a new issue