From a927a149ecf077977df55d989f1ef6dbe233422e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20St=C3=A4bler?= Date: Fri, 5 Nov 2021 10:18:02 +0100 Subject: [PATCH] Make config parsing more resilient for unknown fields MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Christoph Stäbler (cherry picked from commit 43928573792934eac131b3c175970519a42e309f) --- go-controller/pkg/config/config.go | 6 ++- go-controller/pkg/config/config_test.go | 53 +++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/go-controller/pkg/config/config.go b/go-controller/pkg/config/config.go index b809dc3476..c833773c33 100644 --- a/go-controller/pkg/config/config.go +++ b/go-controller/pkg/config/config.go @@ -1316,7 +1316,11 @@ func initConfigWithPath(ctx *cli.Context, exec kexec.Interface, saPath string, d // Parse ovn-k8s config file. if err = gcfg.ReadInto(&cfg, f); err != nil { - return "", fmt.Errorf("failed to parse config file %s: %v", f.Name(), err) + if gcfg.FatalOnly(err) != nil { + return "", fmt.Errorf("failed to parse config file %s: %v", f.Name(), err) + } + // error is only a warning -> log it but continue + klog.Warningf("Warning on parsing config file: %s", err) } klog.Infof("Parsed config file %s", f.Name()) klog.Infof("Parsed config: %+v", cfg) diff --git a/go-controller/pkg/config/config_test.go b/go-controller/pkg/config/config_test.go index 8539876d6b..3c46c8b6b1 100644 --- a/go-controller/pkg/config/config_test.go +++ b/go-controller/pkg/config/config_test.go @@ -1107,6 +1107,59 @@ mode=shared gomega.Expect(err).NotTo(gomega.HaveOccurred()) }) + It("ignores unknown fields in config file and does not return an error", func() { + err := ioutil.WriteFile(cfgFile.Name(), []byte(`[default] +key=value +mtu=1234 + +[foobar] +foo=bar +`), 0644) + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + + app.Action = func(ctx *cli.Context) error { + var cfgPath string + cfgPath, err = InitConfig(ctx, kexec.New(), nil) + + // unknown section foobar and its keys & values should be ignored + // same for key=value in default section + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + + gomega.Expect(cfgPath).To(gomega.Equal(cfgFile.Name())) + gomega.Expect(Default.MTU).To(gomega.Equal(1234)) + return nil + } + cliArgs := []string{ + app.Name, + "-config-file=" + cfgFile.Name(), + } + err = app.Run(cliArgs) + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + }) + + It("rejects a config with invalid syntax", func() { + err := ioutil.WriteFile(cfgFile.Name(), []byte(`[default] +mtu=1234 + +[foobar +foo=bar +`), 0644) + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + + app.Action = func(ctx *cli.Context) error { + _, err = InitConfig(ctx, kexec.New(), nil) + gomega.Expect(err).To(gomega.HaveOccurred()) + + return nil + } + cliArgs := []string{ + app.Name, + "-config-file=" + cfgFile.Name(), + } + err = app.Run(cliArgs) + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + }) + Describe("OvnDBAuth operations", func() { var certFile, keyFile, caFile string