Skip to content

Commit 5fe4f9b

Browse files
authored
[CRE] Add new DONTime settings (#2183)
1 parent fff78a2 commit 5fe4f9b

5 files changed

Lines changed: 147 additions & 53 deletions

File tree

pkg/settings/cresettings/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ flowchart
151151
PerWorkflow.ExecutionTimestampsEnabled[/PerWorkflow.ExecutionTimestampsEnabled\]:::gate
152152
PerWorkflow.FeatureMultiTriggerExecutionIDsActiveAt[/PerWorkflow.FeatureMultiTriggerExecutionIDsActiveAt\]:::gate
153153
PerWorkflow.FeatureMultiTriggerExecutionIDsActivePeriod[/PerWorkflow.FeatureMultiTriggerExecutionIDsActivePeriod\]:::gate
154+
PerWorkflow.FeatureUseSingleDONTimeProviderPerExecutionActivePeriod[/PerWorkflow.FeatureUseSingleDONTimeProviderPerExecutionActivePeriod\]:::gate
154155
PerWorkflow.FeatureChainCapabilityHashBasedOCRActivePeriod[/PerWorkflow.FeatureChainCapabilityHashBasedOCRActivePeriod\]:::gate
155156
PerWorkflow.FeatureEVMWriteReportL1FeeActivePeriod[/PerWorkflow.FeatureEVMWriteReportL1FeeActivePeriod\]:::gate
156157
PerWorkflow.FeatureAptosWriteReportBlockTimestampActivePeriod[/PerWorkflow.FeatureAptosWriteReportBlockTimestampActivePeriod\]:::gate
@@ -226,6 +227,9 @@ flowchart
226227
subgraph PerWorkflow.Secrets
227228
PerWorkflow.Secrets.CallLimit{{CallLimit}}:::bound
228229
end
230+
subgraph PerWorkflow.DONTime
231+
PerWorkflow.DONTime.RequestTimeout{{RequestTimeout}}:::time
232+
end
229233
subgraph PerOrg.HTTPAction
230234
PerOrg.HTTPAction.MtlsRateLimit{{PerOrg.HTTPAction.MtlsRateLimit}}:::bound
231235
end

pkg/settings/cresettings/defaults.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,12 @@
154154
"Secrets": {
155155
"CallLimit": "5"
156156
},
157+
"DONTime": {
158+
"RequestTimeout": "30s"
159+
},
157160
"FeatureMultiTriggerExecutionIDsActiveAt": "2100-01-01 00:00:00 +0000 UTC",
158161
"FeatureMultiTriggerExecutionIDsActivePeriod": "[2100-01-01 00:00:00 +0000 UTC,2101-01-01 00:00:00 +0000 UTC]",
162+
"FeatureUseSingleDONTimeProviderPerExecutionActivePeriod": "[2100-01-01 00:00:00 +0000 UTC,2101-01-01 00:00:00 +0000 UTC]",
159163
"FeatureChainCapabilityHashBasedOCRActivePeriod": "[2100-01-01 00:00:00 +0000 UTC,2101-01-01 00:00:00 +0000 UTC]",
160164
"FeatureEVMWriteReportL1FeeActivePeriod": "[2100-01-01 00:00:00 +0000 UTC,2101-01-01 00:00:00 +0000 UTC]",
161165
"FeatureAptosWriteReportBlockTimestampActivePeriod": "[2100-01-01 00:00:00 +0000 UTC,2101-01-01 00:00:00 +0000 UTC]"

pkg/settings/cresettings/defaults.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ UserMetricLabelsPerMetric = '10'
8181
UserMetricLabelValueLength = '256'
8282
FeatureMultiTriggerExecutionIDsActiveAt = '2100-01-01 00:00:00 +0000 UTC'
8383
FeatureMultiTriggerExecutionIDsActivePeriod = '[2100-01-01 00:00:00 +0000 UTC,2101-01-01 00:00:00 +0000 UTC]'
84+
FeatureUseSingleDONTimeProviderPerExecutionActivePeriod = '[2100-01-01 00:00:00 +0000 UTC,2101-01-01 00:00:00 +0000 UTC]'
8485
FeatureChainCapabilityHashBasedOCRActivePeriod = '[2100-01-01 00:00:00 +0000 UTC,2101-01-01 00:00:00 +0000 UTC]'
8586
FeatureEVMWriteReportL1FeeActivePeriod = '[2100-01-01 00:00:00 +0000 UTC,2101-01-01 00:00:00 +0000 UTC]'
8687
FeatureAptosWriteReportBlockTimestampActivePeriod = '[2100-01-01 00:00:00 +0000 UTC,2101-01-01 00:00:00 +0000 UTC]'
@@ -161,3 +162,6 @@ ResponseSizeLimit = '100kb'
161162

162163
[PerWorkflow.Secrets]
163164
CallLimit = '5'
165+
166+
[PerWorkflow.DONTime]
167+
RequestTimeout = '30s'

pkg/settings/cresettings/settings.go

Lines changed: 65 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -58,24 +58,24 @@ var Default = Schema{
5858
GatewayVaultManagementEnabled: Bool(true),
5959
VaultJWTAuthEnabled: Bool(false),
6060
// Deprecated: retained for backwards compatibility; workflow owner identifies secret ownership.
61-
VaultOrgIdAsSecretOwnerEnabled: Bool(false),
62-
PropagateOrgIDInRequestMetadata: Bool(false),
63-
VaultBase64EncodingEnabled: Bool(false),
64-
VaultForceEmptyOCRRounds: Bool(false),
65-
VaultOptimizationsEnabled: Bool(false),
66-
VaultOwnerAddressCanonicalizationEnabled: Bool(false),
67-
VaultSignedResponseRequestIDEnabled: Bool(false),
68-
GatewayHTTPGlobalRate: Rate(rate.Limit(500), 500),
69-
GatewayHTTPPerNodeRate: Rate(rate.Limit(100), 100),
70-
GatewayConfidentialRelayGlobalRate: Rate(rate.Limit(50), 10),
71-
GatewayConfidentialRelayPerNodeRate: Rate(rate.Limit(10), 10),
72-
GatewayHTTPActionMtlsRequestRate: Rate(rate.Every(30*time.Second), 0),
73-
GatewayHTTPActionMtlsConcurrencyLimit: Int(50),
74-
TriggerRegistrationStatusUpdateTimeout: Duration(0 * time.Second),
75-
BaseTriggerRetryInterval: Duration(30 * time.Second),
76-
BaseTriggerMaxRetries: Int(20),
77-
BaseTriggerPruneAge: Duration(24 * time.Hour),
78-
BaseTriggerMaxSendsPerTick: Int(20),
61+
VaultOrgIdAsSecretOwnerEnabled: Bool(false),
62+
PropagateOrgIDInRequestMetadata: Bool(false),
63+
VaultBase64EncodingEnabled: Bool(false),
64+
VaultForceEmptyOCRRounds: Bool(false),
65+
VaultOptimizationsEnabled: Bool(false),
66+
VaultOwnerAddressCanonicalizationEnabled: Bool(false),
67+
VaultSignedResponseRequestIDEnabled: Bool(false),
68+
GatewayHTTPGlobalRate: Rate(rate.Limit(500), 500),
69+
GatewayHTTPPerNodeRate: Rate(rate.Limit(100), 100),
70+
GatewayConfidentialRelayGlobalRate: Rate(rate.Limit(50), 10),
71+
GatewayConfidentialRelayPerNodeRate: Rate(rate.Limit(10), 10),
72+
GatewayHTTPActionMtlsRequestRate: Rate(rate.Every(30*time.Second), 0),
73+
GatewayHTTPActionMtlsConcurrencyLimit: Int(50),
74+
TriggerRegistrationStatusUpdateTimeout: Duration(0 * time.Second),
75+
BaseTriggerRetryInterval: Duration(30 * time.Second),
76+
BaseTriggerMaxRetries: Int(20),
77+
BaseTriggerPruneAge: Duration(24 * time.Hour),
78+
BaseTriggerMaxSendsPerTick: Int(20),
7979

8080
// DANGER(cedric): Be extremely careful changing these vault limits below as they act as a default value
8181
// used by the Vault OCR plugin -- changing these values could cause issues with the plugin during an image
@@ -230,12 +230,12 @@ var Default = Schema{
230230
CallLimit: Int(20),
231231
},
232232
HTTPAction: httpAction{
233-
CallLimit: Int(5),
234-
CacheAgeLimit: Duration(10 * time.Minute),
235-
ConnectionTimeout: Duration(10 * time.Second),
236-
RequestSizeLimit: Size(10 * config.KByte),
237-
ResponseSizeLimit: Size(100 * config.KByte),
238-
GatewayProxyDonID: String(""),
233+
CallLimit: Int(5),
234+
CacheAgeLimit: Duration(10 * time.Minute),
235+
ConnectionTimeout: Duration(10 * time.Second),
236+
RequestSizeLimit: Size(10 * config.KByte),
237+
ResponseSizeLimit: Size(100 * config.KByte),
238+
GatewayProxyDonID: String(""),
239239
},
240240
ConfidentialHTTP: confidentialHTTP{
241241
CallLimit: Int(5),
@@ -246,11 +246,17 @@ var Default = Schema{
246246
Secrets: secrets{
247247
CallLimit: Int(5),
248248
},
249+
DONTime: donTime{
250+
RequestTimeout: Duration(30 * time.Second),
251+
},
249252

250253
FeatureMultiTriggerExecutionIDsActiveAt: Time(time.Date(2100, 1, 1, 0, 0, 0, 0, time.UTC)),
251254
FeatureMultiTriggerExecutionIDsActivePeriod: TimeRange(
252255
time.Date(2100, 1, 1, 0, 0, 0, 0, time.UTC),
253256
time.Date(2101, 1, 1, 0, 0, 0, 0, time.UTC)),
257+
FeatureUseSingleDONTimeProviderPerExecutionActivePeriod: TimeRange(
258+
time.Date(2100, 1, 1, 0, 0, 0, 0, time.UTC),
259+
time.Date(2101, 1, 1, 0, 0, 0, 0, time.UTC)),
254260
FeatureChainCapabilityHashBasedOCRActivePeriod: TimeRange(
255261
time.Date(2100, 1, 1, 0, 0, 0, 0, time.UTC),
256262
time.Date(2101, 1, 1, 0, 0, 0, 0, time.UTC)),
@@ -264,25 +270,25 @@ var Default = Schema{
264270
}
265271

266272
type Schema struct {
267-
WorkflowLimit Setting[int] `unit:"{workflow}"`
268-
WorkflowExecutionConcurrencyLimit Setting[int] `unit:"{workflow}"`
269-
GatewayIncomingPayloadSizeLimit Setting[config.Size]
270-
GatewayVaultManagementEnabled Setting[bool]
271-
VaultJWTAuthEnabled Setting[bool]
272-
VaultOrgIdAsSecretOwnerEnabled Setting[bool] // Deprecated
273-
PropagateOrgIDInRequestMetadata Setting[bool]
274-
VaultBase64EncodingEnabled Setting[bool]
275-
VaultForceEmptyOCRRounds Setting[bool]
276-
VaultOptimizationsEnabled Setting[bool]
277-
VaultOwnerAddressCanonicalizationEnabled Setting[bool]
278-
VaultSignedResponseRequestIDEnabled Setting[bool]
279-
GatewayHTTPGlobalRate Setting[config.Rate]
280-
GatewayHTTPPerNodeRate Setting[config.Rate]
281-
GatewayConfidentialRelayGlobalRate Setting[config.Rate]
282-
GatewayConfidentialRelayPerNodeRate Setting[config.Rate]
283-
GatewayHTTPActionMtlsRequestRate Setting[config.Rate]
284-
GatewayHTTPActionMtlsConcurrencyLimit Setting[int] `unit:"{request}"`
285-
TriggerRegistrationStatusUpdateTimeout Setting[time.Duration]
273+
WorkflowLimit Setting[int] `unit:"{workflow}"`
274+
WorkflowExecutionConcurrencyLimit Setting[int] `unit:"{workflow}"`
275+
GatewayIncomingPayloadSizeLimit Setting[config.Size]
276+
GatewayVaultManagementEnabled Setting[bool]
277+
VaultJWTAuthEnabled Setting[bool]
278+
VaultOrgIdAsSecretOwnerEnabled Setting[bool] // Deprecated
279+
PropagateOrgIDInRequestMetadata Setting[bool]
280+
VaultBase64EncodingEnabled Setting[bool]
281+
VaultForceEmptyOCRRounds Setting[bool]
282+
VaultOptimizationsEnabled Setting[bool]
283+
VaultOwnerAddressCanonicalizationEnabled Setting[bool]
284+
VaultSignedResponseRequestIDEnabled Setting[bool]
285+
GatewayHTTPGlobalRate Setting[config.Rate]
286+
GatewayHTTPPerNodeRate Setting[config.Rate]
287+
GatewayConfidentialRelayGlobalRate Setting[config.Rate]
288+
GatewayConfidentialRelayPerNodeRate Setting[config.Rate]
289+
GatewayHTTPActionMtlsRequestRate Setting[config.Rate]
290+
GatewayHTTPActionMtlsConcurrencyLimit Setting[int] `unit:"{request}"`
291+
TriggerRegistrationStatusUpdateTimeout Setting[time.Duration]
286292

287293
BaseTriggerRetryInterval Setting[time.Duration]
288294
BaseTriggerMaxRetries Setting[int] `unit:"{attempt}"`
@@ -372,11 +378,13 @@ type Workflows struct {
372378
HTTPAction httpAction
373379
ConfidentialHTTP confidentialHTTP
374380
Secrets secrets
381+
DONTime donTime
375382

376-
FeatureMultiTriggerExecutionIDsActiveAt Setting[config.Timestamp] // Deprecated
377-
FeatureMultiTriggerExecutionIDsActivePeriod Setting[Range[config.Timestamp]]
378-
FeatureChainCapabilityHashBasedOCRActivePeriod Setting[Range[config.Timestamp]]
379-
FeatureEVMWriteReportL1FeeActivePeriod Setting[Range[config.Timestamp]]
383+
FeatureMultiTriggerExecutionIDsActiveAt Setting[config.Timestamp] // Deprecated
384+
FeatureMultiTriggerExecutionIDsActivePeriod Setting[Range[config.Timestamp]]
385+
FeatureUseSingleDONTimeProviderPerExecutionActivePeriod Setting[Range[config.Timestamp]]
386+
FeatureChainCapabilityHashBasedOCRActivePeriod Setting[Range[config.Timestamp]]
387+
FeatureEVMWriteReportL1FeeActivePeriod Setting[Range[config.Timestamp]]
380388
FeatureAptosWriteReportBlockTimestampActivePeriod Setting[Range[config.Timestamp]]
381389
}
382390

@@ -419,12 +427,12 @@ type chainRead struct {
419427
PayloadSizeLimit Setting[config.Size]
420428
}
421429
type httpAction struct {
422-
CallLimit Setting[int] `unit:"{call}"`
423-
CacheAgeLimit Setting[time.Duration]
424-
ConnectionTimeout Setting[time.Duration]
425-
RequestSizeLimit Setting[config.Size]
426-
ResponseSizeLimit Setting[config.Size]
427-
GatewayProxyDonID Setting[string]
430+
CallLimit Setting[int] `unit:"{call}"`
431+
CacheAgeLimit Setting[time.Duration]
432+
ConnectionTimeout Setting[time.Duration]
433+
RequestSizeLimit Setting[config.Size]
434+
ResponseSizeLimit Setting[config.Size]
435+
GatewayProxyDonID Setting[string]
428436
}
429437
type perOrgHTTPAction struct {
430438
MtlsRateLimit Setting[config.Rate]
@@ -442,3 +450,7 @@ type consensus struct {
442450
ObservationSizeLimit Setting[config.Size]
443451
CallLimit Setting[int] `unit:"{call}"`
444452
}
453+
454+
type donTime struct {
455+
RequestTimeout Setting[time.Duration]
456+
}

pkg/settings/cresettings/settings_test.go

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@ func TestSchema_Unmarshal(t *testing.T) {
109109
"Secrets": {
110110
"CallLimit": "5"
111111
},
112+
"DONTime": {
113+
"RequestTimeout": "45s"
114+
},
112115
"ChainWrite": {
113116
"EVM": {
114117
"TransactionGasLimit": "500000"
@@ -118,6 +121,7 @@ func TestSchema_Unmarshal(t *testing.T) {
118121
"CallLimit": "3"
119122
},
120123
"FeatureMultiTriggerExecutionIDsActiveAt": "2025-06-15 00:00:00 +0000 UTC",
124+
"FeatureUseSingleDONTimeProviderPerExecutionActivePeriod": "[2025-08-15 00:00:00 +0000 UTC,2025-09-15 00:00:00 +0000 UTC]",
121125
"FeatureChainCapabilityHashBasedOCRActivePeriod": "[2025-07-15 00:00:00 +0000 UTC,2025-08-15 00:00:00 +0000 UTC]",
122126
"FeatureEVMWriteReportL1FeeActivePeriod": "[2025-09-15 00:00:00 +0000 UTC,2025-10-15 00:00:00 +0000 UTC]",
123127
"FeatureAptosWriteReportBlockTimestampActivePeriod": "[2025-11-15 00:00:00 +0000 UTC,2025-12-15 00:00:00 +0000 UTC]"
@@ -149,9 +153,14 @@ func TestSchema_Unmarshal(t *testing.T) {
149153
assert.Equal(t, 5, cfg.PerWorkflow.ConfidentialHTTP.CallLimit.DefaultValue)
150154
assert.Equal(t, 10*config.KByte, cfg.PerWorkflow.ConfidentialHTTP.RequestSizeLimit.DefaultValue)
151155
assert.Equal(t, 5, cfg.PerWorkflow.Secrets.CallLimit.DefaultValue)
156+
assert.Equal(t, 45*time.Second, cfg.PerWorkflow.DONTime.RequestTimeout.DefaultValue)
152157
assert.Equal(t, uint64(500000), cfg.PerWorkflow.ChainWrite.EVM.TransactionGasLimit.DefaultValue)
153158
assert.Equal(t, 3, cfg.PerWorkflow.ChainRead.CallLimit.DefaultValue)
154159
assert.Equal(t, config.Timestamp(time.Date(2025, 6, 15, 0, 0, 0, 0, time.UTC).Unix()), cfg.PerWorkflow.FeatureMultiTriggerExecutionIDsActiveAt.DefaultValue)
160+
assert.Equal(t, settings.Range[config.Timestamp]{
161+
Lower: config.Timestamp(time.Date(2025, 8, 15, 0, 0, 0, 0, time.UTC).Unix()),
162+
Upper: config.Timestamp(time.Date(2025, 9, 15, 0, 0, 0, 0, time.UTC).Unix()),
163+
}, cfg.PerWorkflow.FeatureUseSingleDONTimeProviderPerExecutionActivePeriod.DefaultValue)
155164
assert.Equal(t, settings.Range[config.Timestamp]{
156165
Lower: config.Timestamp(time.Date(2025, 7, 15, 0, 0, 0, 0, time.UTC).Unix()),
157166
Upper: config.Timestamp(time.Date(2025, 8, 15, 0, 0, 0, 0, time.UTC).Unix()),
@@ -166,6 +175,67 @@ func TestSchema_Unmarshal(t *testing.T) {
166175
}, cfg.PerWorkflow.FeatureAptosWriteReportBlockTimestampActivePeriod.DefaultValue)
167176
}
168177

178+
func TestDONTimeRequestTimeoutKeyInit(t *testing.T) {
179+
s := Default.PerWorkflow.DONTime.RequestTimeout
180+
181+
assert.Equal(t, "PerWorkflow.DONTime.RequestTimeout", s.GetKey())
182+
assert.Equal(t, settings.ScopeWorkflow, s.Scope)
183+
assert.NotNil(t, s.Parse)
184+
assert.Equal(t, 30*time.Second, s.DefaultValue)
185+
186+
got, err := s.Parse("1m")
187+
require.NoError(t, err)
188+
assert.Equal(t, time.Minute, got)
189+
}
190+
191+
func TestDONTimeRequestTimeoutGetOrDefault(t *testing.T) {
192+
setting := Default.PerWorkflow.DONTime.RequestTimeout
193+
ctx := contexts.WithCRE(t.Context(), contexts.CRE{Org: "test-org", Owner: "test-owner", Workflow: "test-wf"})
194+
overrideCtx := contexts.WithCRE(t.Context(), contexts.CRE{Owner: "owner-id", Workflow: "test-wf-id"})
195+
196+
got, err := setting.GetOrDefault(ctx, DefaultGetter)
197+
require.NoError(t, err)
198+
assert.Equal(t, 30*time.Second, got)
199+
200+
got, err = setting.GetOrDefault(overrideCtx, DefaultGetter)
201+
require.NoError(t, err)
202+
assert.Equal(t, 30*time.Second, got)
203+
204+
t.Cleanup(reinit)
205+
t.Setenv(EnvNameSettings, `{
206+
"workflow": {
207+
"test-wf-id": {
208+
"PerWorkflow": {
209+
"DONTime": {
210+
"RequestTimeout": "1m"
211+
}
212+
}
213+
}
214+
}
215+
}`)
216+
reinit()
217+
218+
got, err = setting.GetOrDefault(ctx, DefaultGetter)
219+
require.NoError(t, err)
220+
assert.Equal(t, 30*time.Second, got)
221+
222+
got, err = setting.GetOrDefault(overrideCtx, DefaultGetter)
223+
require.NoError(t, err)
224+
assert.Equal(t, time.Minute, got)
225+
}
226+
227+
func TestFeatureUseSingleDONTimeProviderPerExecutionActivePeriodKeyInit(t *testing.T) {
228+
s := Default.PerWorkflow.FeatureUseSingleDONTimeProviderPerExecutionActivePeriod
229+
230+
assert.Equal(t, "PerWorkflow.FeatureUseSingleDONTimeProviderPerExecutionActivePeriod", s.GetKey())
231+
assert.Equal(t, settings.ScopeWorkflow, s.Scope)
232+
assert.NotNil(t, s.Parse)
233+
assert.Equal(t, settings.Range[config.Timestamp]{
234+
Lower: config.Timestamp(time.Date(2100, 1, 1, 0, 0, 0, 0, time.UTC).Unix()),
235+
Upper: config.Timestamp(time.Date(2101, 1, 1, 0, 0, 0, 0, time.UTC).Unix()),
236+
}, s.DefaultValue)
237+
}
238+
169239
func TestGatewayProxyDonIDKeyInit(t *testing.T) {
170240
s := Default.PerWorkflow.HTTPAction.GatewayProxyDonID
171241

0 commit comments

Comments
 (0)