From fd064160577134e8af10421bcb201cffc3be1714 Mon Sep 17 00:00:00 2001 From: Julien Pivotto Date: Sun, 9 Aug 2020 15:42:25 +0200 Subject: [PATCH] Use strict unmarshalling of rules (#7767) * Fix unmarshalling of rules Fix #7042 Signed-off-by: Julien Pivotto --- pkg/rulefmt/rulefmt.go | 9 +++++++-- pkg/rulefmt/rulefmt_test.go | 4 ++++ pkg/rulefmt/testdata/bad_field.bad.yaml | 10 ++++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 pkg/rulefmt/testdata/bad_field.bad.yaml diff --git a/pkg/rulefmt/rulefmt.go b/pkg/rulefmt/rulefmt.go index 0003332170..7a2179e7d1 100644 --- a/pkg/rulefmt/rulefmt.go +++ b/pkg/rulefmt/rulefmt.go @@ -14,7 +14,9 @@ package rulefmt import ( + "bytes" "context" + "io" "io/ioutil" "strings" "time" @@ -267,8 +269,11 @@ func Parse(content []byte) (*RuleGroups, []error) { errs []error ) - err := yaml.Unmarshal(content, &groups) - if err != nil { + decoder := yaml.NewDecoder(bytes.NewReader(content)) + decoder.KnownFields(true) + err := decoder.Decode(&groups) + // Ignore io.EOF which happens with empty input. + if err != nil && err != io.EOF { errs = append(errs, err) } err = yaml.Unmarshal(content, &node) diff --git a/pkg/rulefmt/rulefmt_test.go b/pkg/rulefmt/rulefmt_test.go index 26151c8c11..4101b61b96 100644 --- a/pkg/rulefmt/rulefmt_test.go +++ b/pkg/rulefmt/rulefmt_test.go @@ -67,6 +67,10 @@ func TestParseFileFailure(t *testing.T) { filename: "invalid_record_name.bad.yaml", errMsg: "invalid recording rule name", }, + { + filename: "bad_field.bad.yaml", + errMsg: "field annotation not found", + }, } for _, c := range table { diff --git a/pkg/rulefmt/testdata/bad_field.bad.yaml b/pkg/rulefmt/testdata/bad_field.bad.yaml new file mode 100644 index 0000000000..b93f71c129 --- /dev/null +++ b/pkg/rulefmt/testdata/bad_field.bad.yaml @@ -0,0 +1,10 @@ +groups: + - name: yolo + rules: + - alert: hola + expr: 1 + labels: + instance: localhost + annotation: + summary: annonations is written without s above +