Skip to content

Commit d3af2df

Browse files
authored
pkg/settings/cresettings: add CL_CRE_SETTINGS for default overrides (#1499)
1 parent b817801 commit d3af2df

File tree

4 files changed

+77
-2
lines changed

4 files changed

+77
-2
lines changed

pkg/config/rate.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ func ParseRate(s string) (Rate, error) {
3333
}
3434
rateLimit.Limit = rate.Every(d)
3535
} else {
36-
s = strings.TrimSuffix(s, "rps") // allowed but not required
37-
f, err := strconv.ParseFloat(s, 64)
36+
parts[0] = strings.TrimSuffix(parts[0], "rps") // allowed but not required
37+
f, err := strconv.ParseFloat(parts[0], 64)
3838
if err != nil {
3939
return Rate{}, err
4040
}

pkg/settings/cresettings/settings.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
package cresettings
33

44
import (
5+
"encoding/json"
56
"log"
7+
"os"
68
"time"
79

810
"golang.org/x/time/rate"
@@ -12,6 +14,12 @@ import (
1214
)
1315

1416
func init() {
17+
if v, ok := os.LookupEnv("CL_CRE_SETTINGS"); ok {
18+
err := json.Unmarshal([]byte(v), &Default)
19+
if err != nil {
20+
log.Fatalf("failed to initialize defaults: %v", err)
21+
}
22+
}
1523
err := InitConfig(&Default)
1624
if err != nil {
1725
log.Fatalf("failed to initialize keys: %v", err)

pkg/settings/cresettings/settings_test.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,14 @@ import (
77
"log"
88
"os"
99
"testing"
10+
"time"
1011

1112
"github.com/pelletier/go-toml/v2"
13+
"github.com/stretchr/testify/assert"
1214
"github.com/stretchr/testify/require"
15+
"golang.org/x/time/rate"
16+
17+
"github.com/smartcontractkit/chainlink-common/pkg/config"
1318
)
1419

1520
var update = flag.Bool("update", false, "update the golden files of this test")
@@ -52,3 +57,54 @@ func TestDefault(t *testing.T) {
5257
}
5358
})
5459
}
60+
61+
func TestSchema_Unmarshal(t *testing.T) {
62+
cfg := Default
63+
require.NoError(t, json.Unmarshal([]byte(`{
64+
"WorkflowLimit": "500",
65+
"HTTPTrigger": {
66+
"AuthRateLimit": "200rps:50"
67+
},
68+
"PerOrg": {
69+
"ZeroBalancePruningTimeout": "48h"
70+
},
71+
"PerOwner": {
72+
"WorkflowExecutionConcurrencyLimit": "99"
73+
},
74+
"PerWorkflow": {
75+
"WASMMemoryLimit": "250mb",
76+
"CRONTrigger": {
77+
"RateLimit": "every10s:5"
78+
},
79+
"HTTPTrigger": {
80+
"IncomingPayloadSizeLimit": "14kb"
81+
},
82+
"LogTrigger": {
83+
"EventRateLimit": "every13s:6"
84+
},
85+
"HTTPAction": {
86+
"RateLimit": "every3s:5"
87+
},
88+
"ChainWrite": {
89+
"EVM": {
90+
"TransactionGasLimit": "500000"
91+
}
92+
},
93+
"ChainRead": {
94+
"CallLimit": "3"
95+
}
96+
}
97+
}`), &cfg))
98+
99+
assert.Equal(t, 500, cfg.WorkflowLimit.DefaultValue)
100+
assert.Equal(t, config.Rate{Limit: 200, Burst: 50}, cfg.HTTPTrigger.AuthRateLimit.DefaultValue)
101+
assert.Equal(t, 48*time.Hour, cfg.PerOrg.ZeroBalancePruningTimeout.DefaultValue)
102+
assert.Equal(t, 99, cfg.PerOwner.WorkflowExecutionConcurrencyLimit.DefaultValue)
103+
assert.Equal(t, 250*config.MByte, cfg.PerWorkflow.WASMMemoryLimit.DefaultValue)
104+
assert.Equal(t, config.Rate{Limit: rate.Every(10 * time.Second), Burst: 5}, cfg.PerWorkflow.CRONTrigger.RateLimit.DefaultValue)
105+
assert.Equal(t, 14*config.KByte, cfg.PerWorkflow.HTTPTrigger.IncomingPayloadSizeLimit.DefaultValue)
106+
assert.Equal(t, config.Rate{Limit: rate.Every(13 * time.Second), Burst: 6}, cfg.PerWorkflow.LogTrigger.EventRateLimit.DefaultValue)
107+
assert.Equal(t, config.Rate{Limit: rate.Every(3 * time.Second), Burst: 5}, cfg.PerWorkflow.HTTPAction.RateLimit.DefaultValue)
108+
assert.Equal(t, 500000, cfg.PerWorkflow.ChainWrite.EVM.TransactionGasLimit.DefaultValue)
109+
assert.Equal(t, 3, cfg.PerWorkflow.ChainRead.CallLimit.DefaultValue)
110+
}

pkg/settings/settings.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,17 @@ func (s Setting[T]) MarshalText() ([]byte, error) {
4444
return []byte(fmt.Sprintf("%v", s.DefaultValue)), nil
4545
}
4646

47+
func (s *Setting[T]) UnmarshalText(b []byte) (err error) {
48+
if len(b) >= 2 && b[0] == '"' && b[len(b)-1] == '"' {
49+
b = b[1 : len(b)-1] // unquote string
50+
}
51+
s.DefaultValue, err = s.Parse(string(b))
52+
if err != nil {
53+
err = fmt.Errorf("%s: failed to parse %s: %w", s.Key, string(b), err)
54+
}
55+
return
56+
}
57+
4758
func (s *Setting[T]) initSetting(key string, scope Scope, unit *string) error {
4859
s.Key = key
4960
s.Scope = scope

0 commit comments

Comments
 (0)