Skip to content

Commit f98af19

Browse files
committed
Hook to ask implementation to determine if it supports regions
1 parent 58ec02d commit f98af19

7 files changed

Lines changed: 89 additions & 63 deletions

pkg/workflows/host/requirement_selecting_module.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,12 @@ func (r *requirementSelectingModule) Execute(ctx context.Context, request *sdk.E
7777
}
7878

7979
for i, sub := range result.GetTriggerSubscriptions().GetSubscriptions() {
80-
if sub.Requirements == nil || CheckRequirements(r.main.RequirementsHandler, sub.Requirements) {
80+
if sub.Requirements == nil || CheckRequirements(ctx, r.main.RequirementsHandler, sub.Requirements) {
8181
continue
8282
}
8383
matched := false
8484
for j, m := range r.additional {
85-
if CheckRequirements(m.RequirementsHandler, sub.Requirements) {
85+
if CheckRequirements(ctx, m.RequirementsHandler, sub.Requirements) {
8686
m.ensureStarted()
8787
r.cache.Store(uint64(i), j)
8888
matched = true

pkg/workflows/host/requirement_selecting_module_test.go

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -106,14 +106,14 @@ func TestRequirementSelectingModule_Close(t *testing.T) {
106106
startFn: noop,
107107
closeFn: func() { add0Closed = true },
108108
},
109-
RequirementsHandler: RequirementsHandler{Tee: func(*sdk.Tee) bool { return true }},
109+
RequirementsHandler: RequirementsHandler{Tee: func(context.Context, *sdk.Tee) bool { return true }},
110110
}
111111
add1 := ModuleAndHandler{
112112
Module: &stubModule{
113113
startFn: noop,
114114
closeFn: func() { add1Closed = true },
115115
},
116-
RequirementsHandler: RequirementsHandler{Tee: func(*sdk.Tee) bool { return false }},
116+
RequirementsHandler: RequirementsHandler{Tee: func(context.Context, *sdk.Tee) bool { return false }},
117117
}
118118

119119
m := NewRequirementSelectingModule(main, []ModuleAndHandler{add0, add1})
@@ -172,7 +172,7 @@ func TestRequirementSelectingModule_Execute(t *testing.T) {
172172
return nil, nil
173173
},
174174
},
175-
RequirementsHandler: RequirementsHandler{Tee: func(*sdk.Tee) bool { return true }},
175+
RequirementsHandler: RequirementsHandler{Tee: func(context.Context, *sdk.Tee) bool { return true }},
176176
}
177177

178178
m := NewRequirementSelectingModule(main, []ModuleAndHandler{add})
@@ -200,7 +200,7 @@ func TestRequirementSelectingModule_Execute(t *testing.T) {
200200
return want, nil
201201
},
202202
},
203-
RequirementsHandler: RequirementsHandler{Tee: func(*sdk.Tee) bool { return true }},
203+
RequirementsHandler: RequirementsHandler{Tee: func(context.Context, *sdk.Tee) bool { return true }},
204204
}
205205

206206
m := NewRequirementSelectingModule(main, []ModuleAndHandler{add})
@@ -225,7 +225,7 @@ func TestRequirementSelectingModule_Execute(t *testing.T) {
225225
}}
226226
add := ModuleAndHandler{
227227
Module: &stubModule{startFn: noop},
228-
RequirementsHandler: RequirementsHandler{Tee: func(*sdk.Tee) bool { return false }},
228+
RequirementsHandler: RequirementsHandler{Tee: func(context.Context, *sdk.Tee) bool { return false }},
229229
}
230230

231231
m := NewRequirementSelectingModule(main, []ModuleAndHandler{add})
@@ -248,7 +248,7 @@ func TestRequirementSelectingModule_Execute(t *testing.T) {
248248
}}
249249
add0 := ModuleAndHandler{
250250
Module: &stubModule{startFn: noop},
251-
RequirementsHandler: RequirementsHandler{Tee: func(*sdk.Tee) bool { return false }},
251+
RequirementsHandler: RequirementsHandler{Tee: func(context.Context, *sdk.Tee) bool { return false }},
252252
}
253253
add1 := ModuleAndHandler{
254254
Module: &stubModule{
@@ -258,7 +258,7 @@ func TestRequirementSelectingModule_Execute(t *testing.T) {
258258
return want, nil
259259
},
260260
},
261-
RequirementsHandler: RequirementsHandler{Tee: func(*sdk.Tee) bool { return true }},
261+
RequirementsHandler: RequirementsHandler{Tee: func(context.Context, *sdk.Tee) bool { return true }},
262262
}
263263

264264
m := NewRequirementSelectingModule(main, []ModuleAndHandler{add0, add1})
@@ -287,7 +287,7 @@ func TestRequirementSelectingModule_Execute(t *testing.T) {
287287
startFn: func() { atomic.AddInt32(&addStartCount, 1) },
288288
closeFn: noopClose,
289289
},
290-
RequirementsHandler: RequirementsHandler{Tee: func(*sdk.Tee) bool { return true }},
290+
RequirementsHandler: RequirementsHandler{Tee: func(context.Context, *sdk.Tee) bool { return true }},
291291
}
292292

293293
m := NewRequirementSelectingModule(main, []ModuleAndHandler{add})
@@ -338,7 +338,7 @@ func TestRequirementSelectingModule_Execute(t *testing.T) {
338338
return subscribeResult(subWithReqs(teeReqs)), nil
339339
},
340340
},
341-
RequirementsHandler: RequirementsHandler{Tee: func(*sdk.Tee) bool { return true }},
341+
RequirementsHandler: RequirementsHandler{Tee: func(context.Context, *sdk.Tee) bool { return true }},
342342
}
343343
add := ModuleAndHandler{
344344
Module: &stubModule{
@@ -348,7 +348,7 @@ func TestRequirementSelectingModule_Execute(t *testing.T) {
348348
return nil, nil
349349
},
350350
},
351-
RequirementsHandler: RequirementsHandler{Tee: func(*sdk.Tee) bool { return true }},
351+
RequirementsHandler: RequirementsHandler{Tee: func(context.Context, *sdk.Tee) bool { return true }},
352352
}
353353

354354
m := NewRequirementSelectingModule(main, []ModuleAndHandler{add})
@@ -386,7 +386,7 @@ func TestRequirementSelectingModule_TriggerCache(t *testing.T) {
386386
return &sdk.ExecutionResult{}, nil
387387
},
388388
},
389-
RequirementsHandler: RequirementsHandler{Tee: func(*sdk.Tee) bool { return true }},
389+
RequirementsHandler: RequirementsHandler{Tee: func(context.Context, *sdk.Tee) bool { return true }},
390390
}
391391

392392
m := NewRequirementSelectingModule(main, []ModuleAndHandler{add})
@@ -427,7 +427,7 @@ func TestRequirementSelectingModule_TriggerCache(t *testing.T) {
427427
return &sdk.ExecutionResult{}, nil
428428
},
429429
},
430-
RequirementsHandler: RequirementsHandler{Tee: func(*sdk.Tee) bool { return true }},
430+
RequirementsHandler: RequirementsHandler{Tee: func(context.Context, *sdk.Tee) bool { return true }},
431431
}
432432

433433
m := NewRequirementSelectingModule(main, []ModuleAndHandler{add})
@@ -469,7 +469,7 @@ func TestRequirementSelectingModule_TriggerCache(t *testing.T) {
469469
return wantAdditional, nil
470470
},
471471
},
472-
RequirementsHandler: RequirementsHandler{Tee: func(*sdk.Tee) bool { return true }},
472+
RequirementsHandler: RequirementsHandler{Tee: func(context.Context, *sdk.Tee) bool { return true }},
473473
}
474474

475475
m := NewRequirementSelectingModule(main, []ModuleAndHandler{add})

pkg/workflows/host/requirements_gen/requirements_helper.go.tmpl

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,26 @@
11
package host
22

3+
import "ctx"
4+
35
// RequirementsHandler contains a callback for each public field in sdk.Requirements.
46
// Each callback receives the field value and returns a list of strings or an error.
57
type RequirementsHandler struct {
68
{{- range .Fields}}
7-
{{.Name}} func({{.Type}}) bool
9+
{{.Name}} func(context.Context, {{.Type}}) bool
810
{{- end}}
911
}
1012

11-
// CheckRequirements calls each non-nil callback in handler for the corresponding
13+
// CheckRequirements calls each non-nil callback in the handler for the corresponding
1214
// non-nil field in req, returning false if any are false, or if the handler is nil.
1315
// Unknown fields on the proto also result in a false return value.
14-
func CheckRequirements(handler RequirementsHandler, req *sdk.Requirements) bool {
16+
func CheckRequirements(ctx context.Context, handler RequirementsHandler, req *sdk.Requirements) bool {
1517
if len(req.ProtoReflect().GetUnknown()) != 0 {
1618
return false
1719
}
1820

1921
{{range .Fields}}
2022
if req.{{.Name}} != nil {
21-
if handler.{{.Name}} == nil || !handler.{{.Name}}(req.{{.Name}}) {
23+
if handler.{{.Name}} == nil || !handler.{{.Name}}(ctx, req.{{.Name}}) {
2224
return false
2325
}
2426

pkg/workflows/host/requirements_helper_gen.go

Lines changed: 9 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/workflows/host/requirements_helper_gen_test.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package host
22

33
import (
4+
"context"
45
"testing"
56

67
"github.com/stretchr/testify/assert"
@@ -21,27 +22,27 @@ func Test_CheckRequirements(t *testing.T) {
2122
req := &sdk.Requirements{}
2223
require.NoError(t, proto.Unmarshal(b, req))
2324

24-
assert.False(t, CheckRequirements(RequirementsHandler{}, req))
25+
assert.False(t, CheckRequirements(context.Background(), RequirementsHandler{}, req))
2526
})
2627

2728
t.Run("no fields always passes", func(t *testing.T) {
28-
assert.True(t, CheckRequirements(RequirementsHandler{}, &sdk.Requirements{}))
29+
assert.True(t, CheckRequirements(context.Background(), RequirementsHandler{}, &sdk.Requirements{}))
2930
})
3031

3132
t.Run("handler not set returns false", func(t *testing.T) {
3233
req := &sdk.Requirements{Tee: &sdk.Tee{}}
33-
assert.False(t, CheckRequirements(RequirementsHandler{}, req))
34+
assert.False(t, CheckRequirements(context.Background(), RequirementsHandler{}, req))
3435
})
3536

3637
t.Run("handler returns false causes false return value", func(t *testing.T) {
3738
req := &sdk.Requirements{Tee: &sdk.Tee{}}
38-
handler := RequirementsHandler{Tee: func(*sdk.Tee) bool { return false }}
39-
assert.False(t, CheckRequirements(handler, req))
39+
handler := RequirementsHandler{Tee: func(context.Context, *sdk.Tee) bool { return false }}
40+
assert.False(t, CheckRequirements(context.Background(), handler, req))
4041
})
4142

4243
t.Run("handler returns true causes true return value", func(t *testing.T) {
4344
req := &sdk.Requirements{Tee: &sdk.Tee{}}
44-
handler := RequirementsHandler{Tee: func(*sdk.Tee) bool { return true }}
45-
assert.True(t, CheckRequirements(handler, req))
45+
handler := RequirementsHandler{Tee: func(context.Context, *sdk.Tee) bool { return true }}
46+
assert.True(t, CheckRequirements(context.Background(), handler, req))
4647
})
4748
}

pkg/workflows/host/tee_provider.go

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,34 @@
11
package host
22

3-
import sdkpb "github.com/smartcontractkit/chainlink-protos/cre/go/sdk"
3+
import (
4+
"context"
5+
"sync"
6+
7+
sdkpb "github.com/smartcontractkit/chainlink-protos/cre/go/sdk"
8+
)
49

510
type teeProvider struct {
611
sdkpb.TeeType
7-
regions map[string]bool
12+
regionsFn func(ctx context.Context) map[string]bool
13+
once sync.Once
814
}
915

10-
func NewTeeProvider(tpe sdkpb.TeeType, regions []string) func(tee *sdkpb.Tee) bool {
11-
supportedRegions := map[string]bool{}
12-
for _, region := range regions {
13-
supportedRegions[region] = true
16+
func NewTeeProvider(tpe sdkpb.TeeType, regionsFn func(ctx context.Context) []string) func(context.Context, *sdkpb.Tee) bool {
17+
p := &teeProvider{
18+
TeeType: tpe,
19+
regionsFn: func(ctx context.Context) map[string]bool {
20+
regions := regionsFn(ctx)
21+
rMap := make(map[string]bool, len(regions))
22+
for _, region := range regions {
23+
rMap[region] = true
24+
}
25+
return rMap
26+
},
1427
}
15-
return (&teeProvider{TeeType: tpe, regions: supportedRegions}).Provides
28+
return p.Provides
1629
}
1730

18-
func (t *teeProvider) Provides(tee *sdkpb.Tee) bool {
31+
func (t *teeProvider) Provides(ctx context.Context, tee *sdkpb.Tee) bool {
1932
switch teet := tee.Type.(type) {
2033
case *sdkpb.Tee_Any:
2134
return true
@@ -26,8 +39,9 @@ func (t *teeProvider) Provides(tee *sdkpb.Tee) bool {
2639
return true
2740
}
2841

42+
regions := t.regionsFn(ctx)
2943
for _, region := range selection.Regions {
30-
if t.regions[region] {
44+
if regions[region] {
3145
return true
3246
}
3347
}

0 commit comments

Comments
 (0)