Skip to content

Commit 424afc8

Browse files
Refactor StateOptions and execute failure policy (#74)
1 parent c17ff97 commit 424afc8

10 files changed

+71
-85
lines changed

integ/execute_api_fail_recovery_workflow_state1.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,26 @@ import (
77
"github.com/indeedeng/iwf-golang-sdk/iwf"
88
)
99

10-
type executeApiFailRecoveryWorkflowState1 struct{}
10+
type executeApiFailRecoveryWorkflowState1 struct {
11+
iwf.WorkflowStateDefaultsNoWaitUntil
12+
}
1113

1214
func (b executeApiFailRecoveryWorkflowState1) GetStateId() string {
1315
return "execute_api_fail_recovery_workflow_state1"
1416
}
1517

16-
func (b executeApiFailRecoveryWorkflowState1) GetStateOptions() *iwfidl.WorkflowStateOptions {
17-
options := iwf.NewWorkflowStateOptionsExtension(nil).SetProceedOnExecuteFailure(executeApiFailRecoveryWorkflowState2{}, nil)
18-
options.ExecuteApiRetryPolicy = &iwfidl.RetryPolicy{
19-
InitialIntervalSeconds: iwfidl.PtrInt32(1),
20-
MaximumAttempts: iwfidl.PtrInt32(1),
18+
func (b executeApiFailRecoveryWorkflowState1) GetStateOptions() *iwf.StateOptions {
19+
options := &iwf.StateOptions{
20+
ExecuteApiRetryPolicy: &iwfidl.RetryPolicy{
21+
InitialIntervalSeconds: iwfidl.PtrInt32(1),
22+
MaximumAttempts: iwfidl.PtrInt32(1),
23+
},
24+
ExecuteApiFailureProceedState: &executeApiFailRecoveryWorkflowState2{},
2125
}
2226

2327
return options
2428
}
2529

26-
func (b executeApiFailRecoveryWorkflowState1) WaitUntil(ctx iwf.WorkflowContext, input iwf.Object, persistence iwf.Persistence, communication iwf.Communication) (*iwf.CommandRequest, error) {
27-
return iwf.EmptyCommandRequest(), nil
28-
}
29-
3030
func (b executeApiFailRecoveryWorkflowState1) Execute(ctx iwf.WorkflowContext, input iwf.Object, commandResults iwf.CommandResults, persistence iwf.Persistence, communication iwf.Communication) (*iwf.StateDecision, error) {
3131
return nil, errors.New("error")
3232
}

integ/execute_api_fail_recovery_workflow_state2.go

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,7 @@ import (
55
)
66

77
type executeApiFailRecoveryWorkflowState2 struct {
8-
iwf.DefaultStateOptions
9-
}
10-
11-
func (b executeApiFailRecoveryWorkflowState2) GetStateId() string {
12-
return "execute_api_fail_recovery_workflow_state2"
13-
}
14-
15-
func (b executeApiFailRecoveryWorkflowState2) WaitUntil(ctx iwf.WorkflowContext, input iwf.Object, persistence iwf.Persistence, communication iwf.Communication) (*iwf.CommandRequest, error) {
16-
return iwf.EmptyCommandRequest(), nil
8+
iwf.WorkflowStateDefaultsNoWaitUntil
179
}
1810

1911
func (b executeApiFailRecoveryWorkflowState2) Execute(ctx iwf.WorkflowContext, input iwf.Object, commandResults iwf.CommandResults, persistence iwf.Persistence, communication iwf.Communication) (*iwf.StateDecision, error) {

integ/proceed_on_state_start_fail_workflow_state1.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ func (b *proceedOnStateStartFailWorkflowState1) Execute(ctx iwf.WorkflowContext,
2727
return iwf.SingleNextState(&proceedOnStateStartFailWorkflowState2{}, b.output), nil
2828
}
2929

30-
func (b *proceedOnStateStartFailWorkflowState1) GetStateOptions() *iwfidl.WorkflowStateOptions {
31-
return &iwfidl.WorkflowStateOptions{
30+
func (b *proceedOnStateStartFailWorkflowState1) GetStateOptions() *iwf.StateOptions {
31+
return &iwf.StateOptions{
3232
WaitUntilApiRetryPolicy: &iwfidl.RetryPolicy{
3333
InitialIntervalSeconds: iwfidl.PtrInt32(1),
3434
MaximumAttempts: iwfidl.PtrInt32(2),

integ/state_api_fail_workflow_state1.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ func (b stateApiFailWorkflowState1) Execute(ctx iwf.WorkflowContext, input iwf.O
1818
return iwf.ForceFailWorkflow("a failing message"), nil
1919
}
2020

21-
func (b stateApiFailWorkflowState1) GetStateOptions() *iwfidl.WorkflowStateOptions {
22-
return &iwfidl.WorkflowStateOptions{
21+
func (b stateApiFailWorkflowState1) GetStateOptions() *iwf.StateOptions {
22+
return &iwf.StateOptions{
2323
WaitUntilApiRetryPolicy: &iwfidl.RetryPolicy{
2424
MaximumAttempts: iwfidl.PtrInt32(1),
2525
},

integ/state_api_timeout_workflow_state1.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ func (b stateApiTimeoutWorkflowState1) Execute(ctx iwf.WorkflowContext, input iw
1919
return iwf.ForceFailWorkflow("a failing message"), nil
2020
}
2121

22-
func (b stateApiTimeoutWorkflowState1) GetStateOptions() *iwfidl.WorkflowStateOptions {
23-
return &iwfidl.WorkflowStateOptions{
22+
func (b stateApiTimeoutWorkflowState1) GetStateOptions() *iwf.StateOptions {
23+
return &iwf.StateOptions{
2424
WaitUntilApiRetryPolicy: &iwfidl.RetryPolicy{
2525
MaximumAttempts: iwfidl.PtrInt32(1),
2626
},

iwf/client_impl.go

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,7 @@ func (c *clientImpl) StartWorkflow(ctx context.Context, workflow ObjectWorkflow,
3030
if state != nil {
3131
startStateId = GetFinalWorkflowStateId(state)
3232
startStateOpt := state.GetStateOptions()
33-
if ShouldSkipWaitUntilAPI(state) {
34-
if startStateOpt == nil {
35-
startStateOpt = &iwfidl.WorkflowStateOptions{
36-
SkipWaitUntil: ptr.Any(true),
37-
}
38-
} else {
39-
startStateOpt.SkipWaitUntil = ptr.Any(true)
40-
}
41-
}
42-
unregOpt.StartStateOptions = startStateOpt
33+
unregOpt.StartStateOptions = toIdlStateOptions(ShouldSkipWaitUntilAPI(state), startStateOpt)
4334
}
4435

4536
if options != nil {

iwf/internal_mapper.go

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -103,16 +103,7 @@ func toIdlDecision(from *StateDecision, wfType string, registry Registry, encode
103103
var options *iwfidl.WorkflowStateOptions
104104
if !strings.HasPrefix(fromMv.NextStateId, ReservedStateIdPrefix) {
105105
stateDef := registry.getWorkflowStateDef(wfType, fromMv.NextStateId)
106-
options = stateDef.State.GetStateOptions()
107-
if ShouldSkipWaitUntilAPI(stateDef.State) {
108-
if options == nil {
109-
options = &iwfidl.WorkflowStateOptions{
110-
SkipWaitUntil: ptr.Any(true),
111-
}
112-
} else {
113-
options.SkipWaitUntil = ptr.Any(true)
114-
}
115-
}
106+
options = toIdlStateOptions(ShouldSkipWaitUntilAPI(stateDef.State), stateDef.State.GetStateOptions())
116107
}
117108
mv := iwfidl.StateMovement{
118109
StateId: fromMv.NextStateId,
@@ -125,3 +116,37 @@ func toIdlDecision(from *StateDecision, wfType string, registry Registry, encode
125116
NextStates: mvs,
126117
}, nil
127118
}
119+
120+
func toIdlStateOptions(skipWaitUntil bool, stateOptions *StateOptions) *iwfidl.WorkflowStateOptions {
121+
if stateOptions == nil {
122+
stateOptions = &StateOptions{}
123+
}
124+
125+
idlStOptions := &iwfidl.WorkflowStateOptions{
126+
SearchAttributesLoadingPolicy: stateOptions.SearchAttributesLoadingPolicy,
127+
DataAttributesLoadingPolicy: stateOptions.DataAttributesLoadingPolicy,
128+
WaitUntilApiTimeoutSeconds: stateOptions.WaitUntilApiTimeoutSeconds,
129+
ExecuteApiTimeoutSeconds: stateOptions.ExecuteApiTimeoutSeconds,
130+
WaitUntilApiRetryPolicy: stateOptions.WaitUntilApiRetryPolicy,
131+
ExecuteApiRetryPolicy: stateOptions.ExecuteApiRetryPolicy,
132+
WaitUntilApiFailurePolicy: stateOptions.WaitUntilApiFailurePolicy,
133+
}
134+
135+
if skipWaitUntil {
136+
idlStOptions.SkipWaitUntil = ptr.Any(true)
137+
}
138+
139+
if stateOptions.ExecuteApiFailureProceedState != nil {
140+
idlStOptions.ExecuteApiFailurePolicy = iwfidl.PROCEED_TO_CONFIGURED_STATE.Ptr()
141+
idlStOptions.ExecuteApiFailureProceedStateId = ptr.Any(GetFinalWorkflowStateId(stateOptions.ExecuteApiFailureProceedState))
142+
143+
proceedStateOptions := stateOptions.ExecuteApiFailureProceedState.GetStateOptions()
144+
if proceedStateOptions != nil && proceedStateOptions.ExecuteApiFailureProceedState != nil {
145+
panic("nested failure handling/recovery is not supported: ExecuteApiFailureProceedState cannot have ExecuteApiFailureProceedState")
146+
}
147+
idlStOptions.ExecuteApiFailureProceedStateOptions =
148+
toIdlStateOptions(ShouldSkipWaitUntilAPI(stateOptions.ExecuteApiFailureProceedState), proceedStateOptions)
149+
}
150+
151+
return idlStOptions
152+
}

iwf/state_options.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package iwf
2+
3+
import (
4+
"github.com/indeedeng/iwf-golang-sdk/gen/iwfidl"
5+
)
6+
7+
type StateOptions struct {
8+
SearchAttributesLoadingPolicy *iwfidl.PersistenceLoadingPolicy
9+
DataAttributesLoadingPolicy *iwfidl.PersistenceLoadingPolicy
10+
WaitUntilApiTimeoutSeconds *int32
11+
ExecuteApiTimeoutSeconds *int32
12+
WaitUntilApiRetryPolicy *iwfidl.RetryPolicy
13+
ExecuteApiRetryPolicy *iwfidl.RetryPolicy
14+
WaitUntilApiFailurePolicy *iwfidl.WaitUntilApiFailurePolicy
15+
ExecuteApiFailureProceedState WorkflowState
16+
}

iwf/workflow_state.go

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

33
import (
4-
"github.com/indeedeng/iwf-golang-sdk/gen/iwfidl"
54
"reflect"
65
)
76

@@ -51,7 +50,7 @@ type WorkflowState interface {
5150

5251
// GetStateOptions can just return nil to use the default Options
5352
// StateOptions is optional configuration to adjust the state behaviors
54-
GetStateOptions() *iwfidl.WorkflowStateOptions
53+
GetStateOptions() *StateOptions
5554
}
5655

5756
// GetFinalWorkflowStateId returns the stateId that will be registered and used
@@ -95,7 +94,7 @@ func (d DefaultStateId) GetStateId() string {
9594

9695
type DefaultStateOptions struct{}
9796

98-
func (d DefaultStateOptions) GetStateOptions() *iwfidl.WorkflowStateOptions {
97+
func (d DefaultStateOptions) GetStateOptions() *StateOptions {
9998
return nil
10099
}
101100

iwf/workflow_state_options_extension.go

Lines changed: 0 additions & 37 deletions
This file was deleted.

0 commit comments

Comments
 (0)