Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 913002e

Browse files
committedFeb 19, 2025·
fix: errorbudgetadjutments events - handle multiple YAML documents in on file
1 parent c1b03c7 commit 913002e

File tree

4 files changed

+219
-31
lines changed

4 files changed

+219
-31
lines changed
 

‎internal/budgetadjustments/events/delete.go

+17-15
Original file line numberDiff line numberDiff line change
@@ -43,24 +43,26 @@ func NewDeleteCmd(clientProvider sdkclient.SdkClientProvider) *cobra.Command {
4343
}
4444

4545
func (g *DeleteCmd) run(cmd *cobra.Command) error {
46-
data, err := readFile(g.filepath)
46+
docs, err := getEventsStringsFromFile(g.filepath)
4747
if err != nil {
48-
return errors.Wrap(err, "failed to read input data")
49-
}
50-
body, err := yaml.YAMLToJSON(data)
51-
if err != nil {
52-
return errors.Wrap(err, "failed to convert input data to JSON")
48+
return errors.Wrap(err, "failed to read events form file")
5349
}
5450

55-
if _, err = DoRequest(
56-
g.client,
57-
cmd.Context(),
58-
http.MethodPost,
59-
fmt.Sprintf("%s/%s/events/delete", BudgetAdjustmentAPI, g.adjustment),
60-
nil,
61-
bytes.NewReader(body),
62-
); err != nil {
63-
return err
51+
for _, doc := range docs {
52+
jsonString, err := yaml.YAMLToJSON([]byte(doc))
53+
if err != nil {
54+
return errors.Wrap(err, "failed to convert input data to JSON")
55+
}
56+
if _, err = DoRequest(
57+
g.client,
58+
cmd.Context(),
59+
http.MethodPost,
60+
fmt.Sprintf("%s/%s/events/delete", BudgetAdjustmentAPI, g.adjustment),
61+
nil,
62+
bytes.NewReader(jsonString),
63+
); err != nil {
64+
return err
65+
}
6466
}
6567

6668
return nil

‎internal/budgetadjustments/events/inputreader.go

+24
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ import (
44
"io"
55
"os"
66
"path/filepath"
7+
"regexp"
8+
9+
"github.com/pkg/errors"
710
)
811

912
func readFile(path string) (data []byte, err error) {
@@ -13,3 +16,24 @@ func readFile(path string) (data []byte, err error) {
1316
path = filepath.Clean(path)
1417
return os.ReadFile(path) // #nosec G304
1518
}
19+
20+
func getEventsStringsFromFile(path string) ([]string, error) {
21+
data, err := readFile(path)
22+
if err != nil {
23+
return nil, errors.Wrap(err, "failed to read input data")
24+
}
25+
return splitYAMLDocs(data), nil
26+
}
27+
28+
func splitYAMLDocs(data []byte) []string {
29+
re := regexp.MustCompile("(?m)^---$\n?")
30+
split := re.Split(string(data), -1)
31+
var docs []string
32+
for _, docStr := range split {
33+
if len(docStr) < 1 {
34+
continue
35+
}
36+
docs = append(docs, docStr)
37+
}
38+
return docs
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
package events
2+
3+
import (
4+
"reflect"
5+
"strings"
6+
"testing"
7+
)
8+
9+
func TestSplitYAMLDocuments(t *testing.T) {
10+
tests := []struct {
11+
name string
12+
input string
13+
expected []string
14+
}{
15+
{
16+
name: "Basic YAML Split",
17+
input: `---
18+
name: doc1
19+
value: 1
20+
---
21+
name: doc2
22+
value: 2
23+
---
24+
name: doc3
25+
value: 3
26+
`,
27+
expected: []string{
28+
"name: doc1\nvalue: 1",
29+
"name: doc2\nvalue: 2",
30+
"name: doc3\nvalue: 3",
31+
},
32+
},
33+
{
34+
name: "Basic YAML Split with additional separators",
35+
input: `---
36+
---
37+
---
38+
name: doc1
39+
value: 1
40+
---
41+
---
42+
name: doc2
43+
value: 2
44+
---
45+
name: doc3
46+
value: 3
47+
---
48+
---`,
49+
expected: []string{
50+
"name: doc1\nvalue: 1",
51+
"name: doc2\nvalue: 2",
52+
"name: doc3\nvalue: 3",
53+
},
54+
},
55+
{
56+
name: "YAML with Lists",
57+
input: `---
58+
list:
59+
- item1
60+
- item2
61+
---
62+
list:
63+
- item3
64+
- item4
65+
`,
66+
expected: []string{
67+
"list:\n - item1\n - item2",
68+
"list:\n - item3\n - item4",
69+
},
70+
},
71+
{
72+
name: "YAML with Nested Structures",
73+
input: `---
74+
parent:
75+
child: value1
76+
---
77+
parent:
78+
child: value2
79+
`,
80+
expected: []string{
81+
"parent:\n child: value1",
82+
"parent:\n child: value2",
83+
},
84+
},
85+
{
86+
name: "invalid YAML",
87+
input: `---
88+
foo bar
89+
baz: bob
90+
`,
91+
expected: []string{"foo bar\nbaz: bob"},
92+
},
93+
{
94+
name: "just YAML",
95+
input: "YAML",
96+
expected: []string{"YAML"},
97+
},
98+
{
99+
name: "YAML with doc separators found in content",
100+
input: `---
101+
parent:
102+
child: "foo---bar"
103+
---
104+
parent:
105+
child: value2
106+
---
107+
----nt:
108+
child: value3
109+
----
110+
---
111+
---
112+
---
113+
`,
114+
expected: []string{
115+
"parent:\n child: \"foo---bar\"",
116+
"parent:\n child: value2",
117+
"----nt:\n child: value3\n----",
118+
"---\n ---",
119+
},
120+
},
121+
{
122+
name: "YAML with correct event format",
123+
input: `
124+
- eventStart: 2024-12-04T06:37:00Z
125+
eventEnd: 2024-12-04T06:59:00Z
126+
slos:
127+
- project: test-project
128+
name: sample-slo-1-578b974d-8e27-43cf-85a3-7751a774f13d
129+
update:
130+
eventStart: 2024-12-04T06:37:00Z
131+
eventEnd: 2024-12-04T06:59:00Z
132+
`,
133+
expected: []string{
134+
`- eventStart: 2024-12-04T06:37:00Z
135+
eventEnd: 2024-12-04T06:59:00Z
136+
slos:
137+
- project: test-project
138+
name: sample-slo-1-578b974d-8e27-43cf-85a3-7751a774f13d
139+
update:
140+
eventStart: 2024-12-04T06:37:00Z
141+
eventEnd: 2024-12-04T06:59:00Z`,
142+
},
143+
},
144+
}
145+
146+
for _, tt := range tests {
147+
t.Run(tt.name, func(t *testing.T) {
148+
result := splitYAMLDocs([]byte(tt.input))
149+
150+
// Trim whitespace from results for better comparison
151+
for i := range result {
152+
result[i] = strings.TrimSpace(result[i])
153+
}
154+
155+
if !reflect.DeepEqual(result, tt.expected) {
156+
t.Errorf("Test %s failed. Expected %v, but got %v", tt.name, tt.expected, result)
157+
}
158+
})
159+
}
160+
}

‎internal/budgetadjustments/events/update.go

+18-16
Original file line numberDiff line numberDiff line change
@@ -43,25 +43,27 @@ func NewUpdateCmd(clientProvider sdkclient.SdkClientProvider) *cobra.Command {
4343
}
4444

4545
func (g *UpdateCmd) run(cmd *cobra.Command) error {
46-
data, err := readFile(g.filepath)
46+
docs, err := getEventsStringsFromFile(g.filepath)
4747
if err != nil {
48-
return errors.Wrap(err, "failed to read input data")
49-
}
50-
body, err := yaml.YAMLToJSON(data)
51-
if err != nil {
52-
return errors.Wrap(err, "failed to convert input data to JSON")
48+
return errors.Wrap(err, "failed to read events form file")
5349
}
5450

55-
_, err = DoRequest(
56-
g.client,
57-
cmd.Context(),
58-
http.MethodPut,
59-
fmt.Sprintf("%s/%s/events/update", BudgetAdjustmentAPI, g.adjustment),
60-
nil,
61-
bytes.NewReader(body),
62-
)
63-
if err != nil {
64-
return err
51+
for _, doc := range docs {
52+
jsonString, err := yaml.YAMLToJSON([]byte(doc))
53+
if err != nil {
54+
return errors.Wrap(err, "failed to convert input data to JSON")
55+
}
56+
_, err = DoRequest(
57+
g.client,
58+
cmd.Context(),
59+
http.MethodPut,
60+
fmt.Sprintf("%s/%s/events/update", BudgetAdjustmentAPI, g.adjustment),
61+
nil,
62+
bytes.NewReader(jsonString),
63+
)
64+
if err != nil {
65+
return err
66+
}
6567
}
6668

6769
return nil

0 commit comments

Comments
 (0)
Please sign in to comment.