Skip to content

Commit 1cec01d

Browse files
authored
feat: Add JSON schema to scheduler strategy (#1254)
This allows using centralized JSON schema definition instead of tagging every `scheduler.Strategy` entry in plugin specs
1 parent 5dc9654 commit 1cec01d

File tree

8 files changed

+172
-79
lines changed

8 files changed

+172
-79
lines changed

examples/simple_plugin/go.mod

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ replace github.com/apache/arrow/go/v14 => github.com/cloudquery/arrow/go/v14 v14
1414

1515
require (
1616
github.com/apache/arrow/go/v13 v13.0.0-20230731205701-112f94971882 // indirect
17+
github.com/bahlo/generic-list-go v0.2.0 // indirect
18+
github.com/buger/jsonparser v1.1.1 // indirect
1719
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
1820
github.com/cloudquery/plugin-pb-go v1.11.0 // indirect
1921
github.com/cloudquery/plugin-sdk/v2 v2.7.0 // indirect
@@ -29,8 +31,10 @@ require (
2931
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.0 // indirect
3032
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect
3133
github.com/inconshreveable/mousetrap v1.1.0 // indirect
34+
github.com/invopop/jsonschema v0.10.0 // indirect
3235
github.com/klauspost/compress v1.16.7 // indirect
3336
github.com/klauspost/cpuid/v2 v2.2.5 // indirect
37+
github.com/mailru/easyjson v0.7.7 // indirect
3438
github.com/mattn/go-colorable v0.1.13 // indirect
3539
github.com/mattn/go-isatty v0.0.19 // indirect
3640
github.com/pierrec/lz4/v4 v4.1.18 // indirect
@@ -40,6 +44,7 @@ require (
4044
github.com/spf13/pflag v1.0.5 // indirect
4145
github.com/stretchr/testify v1.8.4 // indirect
4246
github.com/thoas/go-funk v0.9.3 // indirect
47+
github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect
4348
github.com/zeebo/xxh3 v1.0.2 // indirect
4449
go.opentelemetry.io/otel v1.16.0 // indirect
4550
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 // indirect

examples/simple_plugin/go.sum

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,12 @@ github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAE
3737
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
3838
github.com/apache/arrow/go/v13 v13.0.0-20230731205701-112f94971882 h1:mFDZW1FQk9yndPvxScp7RpcOpdSHaqcgBWO7sDlx4S8=
3939
github.com/apache/arrow/go/v13 v13.0.0-20230731205701-112f94971882/go.mod h1:W69eByFNO0ZR30q1/7Sr9d83zcVZmF2MiP3fFYAWJOc=
40+
github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk=
41+
github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
4042
github.com/bradleyjkemp/cupaloy/v2 v2.8.0 h1:any4BmKE+jGIaMpnU8YgH/I2LPiLBufr6oMMlVBbn9M=
4143
github.com/bradleyjkemp/cupaloy/v2 v2.8.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0=
44+
github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
45+
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
4246
github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
4347
github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
4448
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
@@ -163,6 +167,9 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:
163167
github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
164168
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
165169
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
170+
github.com/invopop/jsonschema v0.10.0 h1:c1ktzNLBun3LyQQhyty5WE3lulbOdIIyOVlkmDLehcE=
171+
github.com/invopop/jsonschema v0.10.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0=
172+
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
166173
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
167174
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
168175
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
@@ -177,6 +184,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
177184
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
178185
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
179186
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
187+
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
188+
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
180189
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
181190
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
182191
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
@@ -216,6 +225,8 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU
216225
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
217226
github.com/thoas/go-funk v0.9.3 h1:7+nAEx3kn5ZJcnDm2Bh23N2yOtweO14bi//dvRtgLpw=
218227
github.com/thoas/go-funk v0.9.3/go.mod h1:+IWnUfUmFO1+WVYQWQtIJHeRRdaIyyYglZN7xzUPe4Q=
228+
github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc=
229+
github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw=
219230
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
220231
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
221232
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=

go.mod

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ require (
1212
github.com/google/go-cmp v0.5.9
1313
github.com/google/uuid v1.3.1
1414
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.0
15+
github.com/invopop/jsonschema v0.10.0
1516
github.com/rs/zerolog v1.29.1
1617
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1
1718
github.com/spf13/cobra v1.6.1
@@ -32,6 +33,8 @@ replace github.com/apache/arrow/go/v14 => github.com/cloudquery/arrow/go/v14 v14
3233

3334
require (
3435
github.com/apache/arrow/go/v13 v13.0.0-20230731205701-112f94971882 // indirect
36+
github.com/bahlo/generic-list-go v0.2.0 // indirect
37+
github.com/buger/jsonparser v1.1.1 // indirect
3538
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
3639
github.com/davecgh/go-spew v1.1.1 // indirect
3740
github.com/ghodss/yaml v1.0.0 // indirect
@@ -44,12 +47,14 @@ require (
4447
github.com/klauspost/compress v1.16.7 // indirect
4548
github.com/klauspost/cpuid/v2 v2.2.5 // indirect
4649
github.com/kr/pretty v0.3.1 // indirect
50+
github.com/mailru/easyjson v0.7.7 // indirect
4751
github.com/mattn/go-colorable v0.1.13 // indirect
4852
github.com/mattn/go-isatty v0.0.19 // indirect
4953
github.com/pierrec/lz4/v4 v4.1.18 // indirect
5054
github.com/pmezard/go-difflib v1.0.0 // indirect
5155
github.com/rogpeppe/go-internal v1.10.0 // indirect
5256
github.com/spf13/pflag v1.0.5 // indirect
57+
github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect
5358
github.com/zeebo/xxh3 v1.0.2 // indirect
5459
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 // indirect
5560
go.opentelemetry.io/otel/metric v1.16.0 // indirect

go.sum

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,12 @@ github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAE
3737
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
3838
github.com/apache/arrow/go/v13 v13.0.0-20230731205701-112f94971882 h1:mFDZW1FQk9yndPvxScp7RpcOpdSHaqcgBWO7sDlx4S8=
3939
github.com/apache/arrow/go/v13 v13.0.0-20230731205701-112f94971882/go.mod h1:W69eByFNO0ZR30q1/7Sr9d83zcVZmF2MiP3fFYAWJOc=
40+
github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk=
41+
github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
4042
github.com/bradleyjkemp/cupaloy/v2 v2.8.0 h1:any4BmKE+jGIaMpnU8YgH/I2LPiLBufr6oMMlVBbn9M=
4143
github.com/bradleyjkemp/cupaloy/v2 v2.8.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0=
44+
github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
45+
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
4246
github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
4347
github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
4448
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
@@ -164,6 +168,9 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:
164168
github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
165169
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
166170
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
171+
github.com/invopop/jsonschema v0.10.0 h1:c1ktzNLBun3LyQQhyty5WE3lulbOdIIyOVlkmDLehcE=
172+
github.com/invopop/jsonschema v0.10.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0=
173+
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
167174
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
168175
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
169176
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
@@ -179,6 +186,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
179186
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
180187
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
181188
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
189+
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
190+
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
182191
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
183192
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
184193
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
@@ -222,6 +231,8 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU
222231
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
223232
github.com/thoas/go-funk v0.9.3 h1:7+nAEx3kn5ZJcnDm2Bh23N2yOtweO14bi//dvRtgLpw=
224233
github.com/thoas/go-funk v0.9.3/go.mod h1:+IWnUfUmFO1+WVYQWQtIJHeRRdaIyyYglZN7xzUPe4Q=
234+
github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc=
235+
github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw=
225236
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
226237
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
227238
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=

scheduler/scheduler.go

Lines changed: 0 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package scheduler
22

33
import (
4-
"bytes"
54
"context"
6-
"encoding/json"
75
"errors"
86
"fmt"
97
"runtime/debug"
@@ -39,83 +37,6 @@ const (
3937
StrategyShuffle
4038
)
4139

42-
type Strategy int
43-
44-
func (s *Strategy) String() string {
45-
if s == nil {
46-
return ""
47-
}
48-
return AllStrategyNames[*s]
49-
}
50-
51-
// MarshalJSON implements json.Marshaler.
52-
func (s *Strategy) MarshalJSON() ([]byte, error) {
53-
var b bytes.Buffer
54-
if s == nil {
55-
b.Write([]byte("null"))
56-
return b.Bytes(), nil
57-
}
58-
b.Write([]byte{'"'})
59-
b.Write([]byte(s.String()))
60-
b.Write([]byte{'"'})
61-
return b.Bytes(), nil
62-
}
63-
64-
// UnmarshalJSON implements json.Unmarshaler.
65-
func (s *Strategy) UnmarshalJSON(b []byte) error {
66-
var name string
67-
if err := json.Unmarshal(b, &name); err != nil {
68-
return err
69-
}
70-
strategy, err := StrategyForName(name)
71-
if err != nil {
72-
return err
73-
}
74-
*s = strategy
75-
return nil
76-
}
77-
78-
func (s *Strategy) Validate() error {
79-
if s == nil {
80-
return errors.New("scheduler strategy is nil")
81-
}
82-
for _, strategy := range AllStrategies {
83-
if strategy == *s {
84-
return nil
85-
}
86-
}
87-
return fmt.Errorf("unknown scheduler strategy: %d", s)
88-
}
89-
90-
var AllStrategies = Strategies{StrategyDFS, StrategyRoundRobin, StrategyShuffle}
91-
var AllStrategyNames = [...]string{
92-
StrategyDFS: "dfs",
93-
StrategyRoundRobin: "round-robin",
94-
StrategyShuffle: "shuffle",
95-
}
96-
97-
func StrategyForName(s string) (Strategy, error) {
98-
for i, name := range AllStrategyNames {
99-
if name == s {
100-
return AllStrategies[i], nil
101-
}
102-
}
103-
return StrategyDFS, fmt.Errorf("unknown scheduler strategy: %s", s)
104-
}
105-
106-
type Strategies []Strategy
107-
108-
func (s Strategies) String() string {
109-
var buffer bytes.Buffer
110-
for i, strategy := range s {
111-
if i > 0 {
112-
buffer.WriteString(", ")
113-
}
114-
buffer.WriteString(strategy.String())
115-
}
116-
return buffer.String()
117-
}
118-
11940
type Option func(*Scheduler)
12041

12142
func WithLogger(logger zerolog.Logger) Option {

scheduler/strategy.go

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package scheduler
2+
3+
import (
4+
"bytes"
5+
"encoding/json"
6+
"errors"
7+
"fmt"
8+
9+
"github.com/invopop/jsonschema"
10+
)
11+
12+
type Strategy int
13+
14+
func (s *Strategy) String() string {
15+
if s == nil {
16+
return ""
17+
}
18+
return AllStrategyNames[*s]
19+
}
20+
21+
// MarshalJSON implements json.Marshaler.
22+
func (s *Strategy) MarshalJSON() ([]byte, error) {
23+
var b bytes.Buffer
24+
if s == nil {
25+
b.Write([]byte("null"))
26+
return b.Bytes(), nil
27+
}
28+
b.Write([]byte{'"'})
29+
b.Write([]byte(s.String()))
30+
b.Write([]byte{'"'})
31+
return b.Bytes(), nil
32+
}
33+
34+
// UnmarshalJSON implements json.Unmarshaler.
35+
func (s *Strategy) UnmarshalJSON(b []byte) error {
36+
var name string
37+
if err := json.Unmarshal(b, &name); err != nil {
38+
return err
39+
}
40+
strategy, err := StrategyForName(name)
41+
if err != nil {
42+
return err
43+
}
44+
*s = strategy
45+
return nil
46+
}
47+
48+
func (s *Strategy) Validate() error {
49+
if s == nil {
50+
return errors.New("scheduler strategy is nil")
51+
}
52+
for _, strategy := range AllStrategies {
53+
if strategy == *s {
54+
return nil
55+
}
56+
}
57+
return fmt.Errorf("unknown scheduler strategy: %d", s)
58+
}
59+
60+
// JSONSchema uses value receiver because of https://github.com/invopop/jsonschema/issues/102
61+
func (Strategy) JSONSchema() *jsonschema.Schema {
62+
enum := make([]any, len(AllStrategyNames))
63+
for i, s := range AllStrategyNames {
64+
enum[i] = s
65+
}
66+
return &jsonschema.Schema{
67+
Type: "string",
68+
Enum: enum,
69+
Default: AllStrategyNames[StrategyDFS],
70+
Title: "CloudQuery scheduling strategy",
71+
}
72+
}
73+
74+
var AllStrategies = Strategies{StrategyDFS, StrategyRoundRobin, StrategyShuffle}
75+
var AllStrategyNames = [...]string{
76+
StrategyDFS: "dfs",
77+
StrategyRoundRobin: "round-robin",
78+
StrategyShuffle: "shuffle",
79+
}
80+
81+
func StrategyForName(s string) (Strategy, error) {
82+
for i, name := range AllStrategyNames {
83+
if name == s {
84+
return AllStrategies[i], nil
85+
}
86+
}
87+
return StrategyDFS, fmt.Errorf("unknown scheduler strategy: %s", s)
88+
}
89+
90+
type Strategies []Strategy
91+
92+
func (s Strategies) String() string {
93+
var buffer bytes.Buffer
94+
for i, strategy := range s {
95+
if i > 0 {
96+
buffer.WriteString(", ")
97+
}
98+
buffer.WriteString(strategy.String())
99+
}
100+
return buffer.String()
101+
}

scheduler/strategy.json

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"$schema": "https://json-schema.org/draft/2020-12/schema",
3+
"$id": "https://github.com/cloudquery/plugin-sdk/v4/scheduler/strategy",
4+
"$ref": "#/$defs/Strategy",
5+
"$defs": {
6+
"Strategy": {
7+
"type": "string",
8+
"enum": [
9+
"dfs",
10+
"round-robin",
11+
"shuffle"
12+
],
13+
"title": "CloudQuery scheduling strategy",
14+
"default": "dfs"
15+
}
16+
}
17+
}

scheduler/strategy_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package scheduler_test
2+
3+
import (
4+
_ "embed"
5+
"encoding/json"
6+
"reflect"
7+
"testing"
8+
9+
"github.com/cloudquery/plugin-sdk/v4/scheduler"
10+
"github.com/invopop/jsonschema"
11+
"github.com/stretchr/testify/require"
12+
)
13+
14+
//go:embed strategy.json
15+
var jsonSchema string
16+
17+
func TestStrategy_JSONSchema(t *testing.T) {
18+
sc := (&jsonschema.Reflector{RequiredFromJSONSchemaTags: true}).ReflectFromType(reflect.TypeOf(scheduler.StrategyDFS))
19+
data, err := json.MarshalIndent(sc, "", " ")
20+
require.NoError(t, err)
21+
require.JSONEq(t, string(data)+"\n", jsonSchema)
22+
}

0 commit comments

Comments
 (0)