Skip to content

Commit 4a209b6

Browse files
authored
Merge branch 'main' into ks-code-owner
2 parents d1eeed1 + 319861e commit 4a209b6

File tree

5 files changed

+119
-10
lines changed

5 files changed

+119
-10
lines changed

pkg/settings/cresettings/settings.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ func reinit() {
4040
if err != nil {
4141
log.Fatalf("failed to initialize settings: %v", err)
4242
}
43+
} else {
44+
DefaultGetter = nil
4345
}
4446
}
4547

pkg/settings/cresettings/settings_test.go

Lines changed: 69 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"github.com/smartcontractkit/chainlink-common/pkg/config"
1818
"github.com/smartcontractkit/chainlink-common/pkg/contexts"
1919
"github.com/smartcontractkit/chainlink-common/pkg/logger"
20+
"github.com/smartcontractkit/chainlink-common/pkg/settings"
2021
"github.com/smartcontractkit/chainlink-common/pkg/settings/limits"
2122
)
2223

@@ -199,6 +200,10 @@ func TestDefaultGetter_SettingMap(t *testing.T) {
199200
}
200201
}`)
201202
reinit() // set default vars
203+
204+
// ensure merged values; defaults must remain
205+
require.Equal(t, "true", Default.PerWorkflow.ChainAllowed.Values["3379446385462418246"])
206+
// confirm
202207
got, err = limit.GetOrDefault(ctx, DefaultGetter)
203208
require.NoError(t, err)
204209
require.False(t, got)
@@ -233,13 +238,73 @@ func TestDefaultGetter_SettingMap(t *testing.T) {
233238
require.True(t, got)
234239
}
235240

236-
func TestChainAllows(t *testing.T) {
237-
gl, err := limits.MakeGateLimiter(limits.Factory{Logger: logger.Test(t)}, Default.PerWorkflow.ChainAllowed)
241+
func TestDefaultEnvVars(t *testing.T) {
242+
// confirm defaults
243+
require.Equal(t, "", Default.PerWorkflow.ChainAllowed.Values["1234"])
244+
require.Equal(t, "true", Default.PerWorkflow.ChainAllowed.Values["3379446385462418246"])
245+
246+
t.Cleanup(reinit) // restore after
247+
248+
// update defaults
249+
t.Setenv(envNameSettingsDefault, `{
250+
"PerWorkflow": {
251+
"ChainAllowed": {
252+
"Values": {
253+
"1234": "true"
254+
}
255+
}
256+
}
257+
}`)
258+
reinit() // set default vars
259+
260+
// confirm through Default
261+
require.Equal(t, "true", Default.PerWorkflow.ChainAllowed.Values["1234"])
262+
// without affecting others (they must merge)
263+
require.Equal(t, "true", Default.PerWorkflow.ChainAllowed.Values["3379446385462418246"])
264+
265+
// confirm through DefaultGetter
266+
gl, err := limits.MakeGateLimiter(limits.Factory{Logger: logger.Test(t), Settings: DefaultGetter}, Default.PerWorkflow.ChainAllowed)
238267
require.NoError(t, err)
239268

240-
ctx := contexts.WithCRE(t.Context(), contexts.CRE{Owner: "owner-id", Workflow: "foo"})
269+
ctx := contexts.WithCRE(t.Context(), contexts.CRE{Org: "foo", Owner: "owner-id", Workflow: "foo"})
270+
// defaults and global override allowed
271+
assert.NoError(t, gl.AllowErr(contexts.WithChainSelector(ctx, 3379446385462418246)))
272+
assert.NoError(t, gl.AllowErr(contexts.WithChainSelector(ctx, 12922642891491394802)))
273+
assert.NoError(t, gl.AllowErr(contexts.WithChainSelector(ctx, 1234)))
274+
275+
// update overrides
276+
t.Setenv(envNameSettingsDefault, "{}")
277+
t.Setenv(envNameSettings, `{
278+
"global": {
279+
"PerWorkflow": {
280+
"ChainAllowed": {
281+
"Values": {
282+
"1234": "true"
283+
}
284+
}
285+
}
286+
}
287+
}`)
288+
289+
reinit() // set default vars
290+
291+
// confirm through DefaultGetter
292+
gl, err = limits.MakeGateLimiter(limits.Factory{Logger: logger.Test(t), Settings: DefaultGetter}, Default.PerWorkflow.ChainAllowed)
293+
require.NoError(t, err)
294+
295+
// defaults and global override allowed
296+
assert.NoError(t, gl.AllowErr(contexts.WithChainSelector(ctx, 3379446385462418246)))
297+
assert.NoError(t, gl.AllowErr(contexts.WithChainSelector(ctx, 12922642891491394802)))
298+
assert.NoError(t, gl.AllowErr(contexts.WithChainSelector(ctx, 1234)))
299+
300+
// confirm through an empty, but non-nil getter
301+
getter, err := settings.NewJSONGetter([]byte(`{}`))
302+
require.NoError(t, err)
303+
gl, err = limits.MakeGateLimiter(limits.Factory{Logger: logger.Test(t), Settings: getter}, Default.PerWorkflow.ChainAllowed)
304+
require.NoError(t, err)
241305

306+
// defaults and global override allowed
242307
assert.NoError(t, gl.AllowErr(contexts.WithChainSelector(ctx, 3379446385462418246)))
243308
assert.NoError(t, gl.AllowErr(contexts.WithChainSelector(ctx, 12922642891491394802)))
244-
assert.ErrorIs(t, gl.AllowErr(contexts.WithChainSelector(ctx, 1234)), limits.ErrorNotAllowed{})
309+
assert.NoError(t, gl.AllowErr(contexts.WithChainSelector(ctx, 1234)))
245310
}

pkg/settings/map.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,16 +45,19 @@ func (s *SettingMap[T]) GetOrDefault(ctx context.Context, g Getter) (value T, er
4545
if err != nil {
4646
return s.Default.DefaultValue, fmt.Errorf("failed to get value from context: %w", err)
4747
}
48-
if g == nil {
48+
valueOrDefault := func() (T, error) {
4949
if str, ok := s.Values[strconv.FormatUint(k, 10)]; ok {
5050
value, err = s.Default.Parse(str)
5151
if err != nil {
5252
return s.Default.DefaultValue, err
5353
}
54-
return
54+
return value, nil
5555
}
5656
return s.Default.DefaultValue, nil
5757
}
58+
if g == nil {
59+
return valueOrDefault()
60+
}
5861

5962
valueKey := s.Default.Key + ".Values." + strconv.FormatUint(k, 10)
6063
defaultKey := s.Default.Key + ".Default"
@@ -66,20 +69,20 @@ func (s *SettingMap[T]) GetOrDefault(ctx context.Context, g Getter) (value T, er
6669
} else if str != "" {
6770
value, err = s.Default.Parse(str)
6871
if err != nil {
69-
return s.Default.DefaultValue, err
72+
return valueOrDefault()
7073
}
7174
return
7275
}
7376

7477
// Default override
7578
str, err = g.GetScoped(ctx, s.Default.Scope, defaultKey)
7679
if err != nil || str == "" {
77-
return s.Default.DefaultValue, err
80+
return valueOrDefault()
7881
}
7982

8083
value, err = s.Default.Parse(str)
8184
if err != nil {
82-
return s.Default.DefaultValue, err
85+
return valueOrDefault()
8386
}
8487
return
8588
}

pkg/types/llo/types.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,14 @@ type ChannelDefinition struct {
279279
}
280280

281281
func (a ChannelDefinition) Equals(b ChannelDefinition) bool {
282+
if a.Tombstone != b.Tombstone {
283+
return false
284+
}
285+
286+
if a.Source != b.Source {
287+
return false
288+
}
289+
282290
if a.ReportFormat != b.ReportFormat {
283291
return false
284292
}
@@ -359,7 +367,7 @@ func (c ChannelDefinitions) Value() (driver.Value, error) {
359367
type ChannelID = uint32
360368

361369
type ChannelDefinitionCache interface {
362-
Definitions() ChannelDefinitions
370+
Definitions(previous ChannelDefinitions) ChannelDefinitions
363371
services.Service
364372
}
365373

pkg/types/llo/types_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,37 @@ func Test_ChannelDefinition_Equals(t *testing.T) {
101101
}
102102
assert.False(t, a.Equals(b))
103103
})
104+
t.Run("different Tombstone", func(t *testing.T) {
105+
a := ChannelDefinition{
106+
ReportFormat: ReportFormatJSON,
107+
Streams: []Stream{{0, AggregatorMedian}, {1, AggregatorMode}},
108+
Opts: nil,
109+
}
110+
b := ChannelDefinition{
111+
ReportFormat: ReportFormatJSON,
112+
Streams: []Stream{{0, AggregatorMedian}, {1, AggregatorMode}},
113+
Opts: nil,
114+
Tombstone: true,
115+
}
116+
assert.False(t, a.Equals(b))
117+
})
118+
119+
t.Run("different Source", func(t *testing.T) {
120+
a := ChannelDefinition{
121+
ReportFormat: ReportFormatJSON,
122+
Streams: []Stream{{0, AggregatorMedian}, {1, AggregatorMode}},
123+
Opts: nil,
124+
Source: 1,
125+
}
126+
b := ChannelDefinition{
127+
ReportFormat: ReportFormatJSON,
128+
Streams: []Stream{{0, AggregatorMedian}, {1, AggregatorMode}},
129+
Opts: nil,
130+
Source: 2,
131+
}
132+
assert.False(t, a.Equals(b))
133+
})
134+
104135
t.Run("equal", func(t *testing.T) {
105136
a := ChannelDefinition{
106137
ReportFormat: ReportFormatJSON,

0 commit comments

Comments
 (0)