machine

package
v1.1.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 7, 2020 License: Apache-2.0 Imports: 13 Imported by: 0

README

Step Machine

machine is an implementation of the AWS State Machine specification. The primary goal of this implementation is to enable testing of state machines and code together.

Continuing Development

Step at the moment is still very beta, and its API will likely change more before it stabilizes. If you have ideas for improvements please reach out.

Some of the TODOs left for the library are:

  1. Support for Parallel States
  2. Better Validations e.g. making sure all states are reachable and executable
  3. Client side visualization of state machine and execution using GraphViz

Documentation

Overview

State Machine implementation

State Machine Parser

Index

Constants

This section is empty.

Variables

View Source
var EmptyStateMachine = `{
  "StartAt": "WIN",
  "States": { "WIN": {"Type": "Succeed"}}
}`

EmptyStateMachine is a small Valid StateMachine

Functions

func DefaultHandler

func DefaultHandler(_ context.Context, input interface{}) (interface{}, error)

func Validate

func Validate(sm_json *string) error

Global Methods

func ValidateNameAndType

func ValidateNameAndType(s State) error

Types

type Catcher

type Catcher struct {
	ErrorEquals []*string      `json:",omitempty"`
	ResultPath  *jsonpath.Path `json:",omitempty"`
	Next        *string        `json:",omitempty"`
}

type Choice

type Choice struct {
	ChoiceRule

	Next *string `json:",omitempty"`
}

type ChoiceRule

type ChoiceRule struct {
	Variable *jsonpath.Path `json:",omitempty"`

	StringEquals            *string `json:",omitempty"`
	StringLessThan          *string `json:",omitempty"`
	StringGreaterThan       *string `json:",omitempty"`
	StringLessThanEquals    *string `json:",omitempty"`
	StringGreaterThanEquals *string `json:",omitempty"`

	NumericEquals            *float64 `json:",omitempty"`
	NumericLessThan          *float64 `json:",omitempty"`
	NumericGreaterThan       *float64 `json:",omitempty"`
	NumericLessThanEquals    *float64 `json:",omitempty"`
	NumericGreaterThanEquals *float64 `json:",omitempty"`

	BooleanEquals *bool `json:",omitempty"`

	TimestampEquals            *time.Time `json:",omitempty"`
	TimestampLessThan          *time.Time `json:",omitempty"`
	TimestampGreaterThan       *time.Time `json:",omitempty"`
	TimestampLessThanEquals    *time.Time `json:",omitempty"`
	TimestampGreaterThanEquals *time.Time `json:",omitempty"`

	And []*ChoiceRule `json:",omitempty"`
	Or  []*ChoiceRule `json:",omitempty"`
	Not *ChoiceRule   `json:",omitempty"`
}

func (*ChoiceRule) String

func (cr *ChoiceRule) String() string

type ChoiceState

type ChoiceState struct {
	Type    *string
	Comment *string `json:",omitempty"`

	InputPath  *jsonpath.Path `json:",omitempty"`
	OutputPath *jsonpath.Path `json:",omitempty"`

	Default *string `json:",omitempty"` // Default State if no choices match

	Choices []*Choice `json:",omitempty"`
	// contains filtered or unexported fields
}

func (*ChoiceState) Execute

func (s *ChoiceState) Execute(ctx context.Context, input interface{}) (output interface{}, next *string, err error)

func (*ChoiceState) GetType

func (s *ChoiceState) GetType() *string

func (*ChoiceState) Name

func (s *ChoiceState) Name() *string

func (*ChoiceState) SetName

func (s *ChoiceState) SetName(name *string)

func (*ChoiceState) SetType

func (s *ChoiceState) SetType(t *string)

func (*ChoiceState) Validate

func (s *ChoiceState) Validate() error

type Execution

type Execution struct {
	Output     map[string]interface{}
	OutputJSON string
	Error      error

	LastOutput     map[string]interface{} // interim output
	LastOutputJSON string
	LastError      error // interim error

	ExecutionHistory []HistoryEvent
}

func (*Execution) EnteredEvent

func (sm *Execution) EnteredEvent(s State, input interface{})

func (*Execution) ExitedEvent

func (sm *Execution) ExitedEvent(s State, output interface{})

func (*Execution) Failed

func (sm *Execution) Failed()

func (*Execution) Path

func (sm *Execution) Path() []string

Path returns the Path of States, ignoreing TaskFn states

func (*Execution) SetLastOutput

func (sm *Execution) SetLastOutput(output interface{}, err error)

func (*Execution) SetOutput

func (sm *Execution) SetOutput(output interface{}, err error)

func (*Execution) Start

func (sm *Execution) Start()

func (*Execution) Succeeded

func (sm *Execution) Succeeded()

type ExecutionFn

type ExecutionFn func(context.Context, interface{}) (interface{}, *string, error)

type FailState

type FailState struct {
	Type    *string
	Comment *string `json:",omitempty"`

	Error *string `json:",omitempty"`
	Cause *string `json:",omitempty"`
	// contains filtered or unexported fields
}

func (*FailState) Execute

func (s *FailState) Execute(_ context.Context, input interface{}) (output interface{}, next *string, err error)

func (*FailState) GetType

func (s *FailState) GetType() *string

func (*FailState) Name

func (s *FailState) Name() *string

func (*FailState) SetName

func (s *FailState) SetName(name *string)

func (*FailState) SetType

func (s *FailState) SetType(t *string)

func (*FailState) Validate

func (s *FailState) Validate() error

type HistoryEvent

type HistoryEvent struct {
	sfn.HistoryEvent
}

type MapState

type MapState struct {
	Type    *string
	Comment *string `json:",omitempty"`

	Iterator   *StateMachine
	ItemsPath  *jsonpath.Path `json:",omitempty"`
	Parameters interface{}    `json:",omitempty"`

	MaxConcurrency *float64 `json:",omitempty"`

	InputPath  *jsonpath.Path `json:",omitempty"`
	OutputPath *jsonpath.Path `json:",omitempty"`
	ResultPath *jsonpath.Path `json:",omitempty"`

	Catch []*Catcher `json:",omitempty"`
	Retry []*Retrier `json:",omitempty"`

	Next *string `json:",omitempty"`
	End  *bool   `json:",omitempty"`
	// contains filtered or unexported fields
}

func (*MapState) Execute

func (s *MapState) Execute(ctx context.Context, input interface{}) (output interface{}, next *string, err error)

func (*MapState) GetType

func (s *MapState) GetType() *string

func (*MapState) Name

func (s *MapState) Name() *string

func (*MapState) SetName

func (s *MapState) SetName(name *string)

func (*MapState) SetType

func (s *MapState) SetType(t *string)

func (*MapState) Validate

func (s *MapState) Validate() error

type ParallelState

type ParallelState struct {
	Type    *string
	Comment *string `json:",omitempty"`
	// contains filtered or unexported fields
}

func (*ParallelState) Execute

func (s *ParallelState) Execute(_ context.Context, input interface{}) (output interface{}, next *string, err error)

func (*ParallelState) GetType

func (s *ParallelState) GetType() *string

func (*ParallelState) Name

func (s *ParallelState) Name() *string

func (*ParallelState) SetName

func (s *ParallelState) SetName(name *string)

func (*ParallelState) SetType

func (s *ParallelState) SetType(t *string)

func (*ParallelState) Validate

func (s *ParallelState) Validate() error

type PassState

type PassState struct {
	Type    *string
	Comment *string `json:",omitempty"`

	InputPath  *jsonpath.Path `json:",omitempty"`
	OutputPath *jsonpath.Path `json:",omitempty"`
	ResultPath *jsonpath.Path `json:",omitempty"`

	Result interface{} `json:",omitempty"`

	Next *string `json:",omitempty"`
	End  *bool   `json:",omitempty"`
	// contains filtered or unexported fields
}

func (*PassState) Execute

func (s *PassState) Execute(ctx context.Context, input interface{}) (output interface{}, next *string, err error)

func (*PassState) GetType

func (s *PassState) GetType() *string

func (*PassState) Name

func (s *PassState) Name() *string

func (*PassState) SetName

func (s *PassState) SetName(name *string)

func (*PassState) SetType

func (s *PassState) SetType(t *string)

func (*PassState) Validate

func (s *PassState) Validate() error

type Retrier

type Retrier struct {
	ErrorEquals     []*string `json:",omitempty"`
	IntervalSeconds *int      `json:",omitempty"`
	MaxAttempts     *int      `json:",omitempty"`
	BackoffRate     *float64  `json:",omitempty"`
	// contains filtered or unexported fields
}

type State

type State interface {
	Execute(context.Context, interface{}) (interface{}, *string, error)
	Validate() error

	SetName(*string)
	SetType(*string)

	Name() *string
	GetType() *string
}

type StateMachine

type StateMachine struct {
	Comment *string `json:",omitempty"`

	StartAt *string

	States States
}

StateMachine the core struct for the machine

func FromJSON

func FromJSON(raw []byte) (*StateMachine, error)

func ParseFile

func ParseFile(file string) (*StateMachine, error)

Takes a file, and a map of Task Function s

func (*StateMachine) DefaultLambdaContext

func (sm *StateMachine) DefaultLambdaContext(lambda_name string) context.Context

func (*StateMachine) Execute

func (sm *StateMachine) Execute(input interface{}) (*Execution, error)

func (*StateMachine) FindTask

func (sm *StateMachine) FindTask(name string) (*TaskState, error)

func (*StateMachine) SetDefaultHandler

func (sm *StateMachine) SetDefaultHandler()

func (*StateMachine) SetResource

func (sm *StateMachine) SetResource(lambda_arn *string)

func (*StateMachine) SetTaskFnHandlers

func (sm *StateMachine) SetTaskFnHandlers(tfs *handler.TaskHandlers) error

func (*StateMachine) SetTaskHandler

func (sm *StateMachine) SetTaskHandler(task_name string, resource_fn interface{}) error

func (*StateMachine) Tasks

func (sm *StateMachine) Tasks() map[string]*TaskState

func (*StateMachine) Validate

func (sm *StateMachine) Validate() error

type States

type States map[string]State

States is the collection of states

func (*States) UnmarshalJSON

func (sm *States) UnmarshalJSON(b []byte) error

type SucceedState

type SucceedState struct {
	Type    *string
	Comment *string `json:",omitempty"`

	InputPath  *jsonpath.Path `json:",omitempty"`
	OutputPath *jsonpath.Path `json:",omitempty"`
	// contains filtered or unexported fields
}

func (*SucceedState) Execute

func (s *SucceedState) Execute(ctx context.Context, input interface{}) (output interface{}, next *string, err error)

func (*SucceedState) GetType

func (s *SucceedState) GetType() *string

func (*SucceedState) Name

func (s *SucceedState) Name() *string

func (*SucceedState) SetName

func (s *SucceedState) SetName(name *string)

func (*SucceedState) SetType

func (s *SucceedState) SetType(t *string)

func (*SucceedState) Validate

func (s *SucceedState) Validate() error

type TaskState

type TaskState struct {
	Type    *string
	Comment *string `json:",omitempty"`

	InputPath  *jsonpath.Path `json:",omitempty"`
	OutputPath *jsonpath.Path `json:",omitempty"`
	ResultPath *jsonpath.Path `json:",omitempty"`
	Parameters interface{}    `json:",omitempty"`

	Resource *string `json:",omitempty"`

	Catch []*Catcher `json:",omitempty"`
	Retry []*Retrier `json:",omitempty"`

	// Maps a Lambda Handler Function
	TaskHandler interface{} `json:"-"`

	Next *string `json:",omitempty"`
	End  *bool   `json:",omitempty"`

	TimeoutSeconds   int `json:",omitempty"`
	HeartbeatSeconds int `json:",omitempty"`
	// contains filtered or unexported fields
}

func (*TaskState) Execute

func (s *TaskState) Execute(ctx context.Context, input interface{}) (output interface{}, next *string, err error)

Input must include the Task name in $.Task

func (*TaskState) GetType

func (s *TaskState) GetType() *string

func (*TaskState) Name

func (s *TaskState) Name() *string

func (*TaskState) SetName

func (s *TaskState) SetName(name *string)

func (*TaskState) SetTaskHandler

func (s *TaskState) SetTaskHandler(resourcefn interface{})

func (*TaskState) SetType

func (s *TaskState) SetType(t *string)

func (*TaskState) Validate

func (s *TaskState) Validate() error

type WaitState

type WaitState struct {
	Type    *string
	Comment *string `json:",omitempty"`

	InputPath  *jsonpath.Path `json:",omitempty"`
	OutputPath *jsonpath.Path `json:",omitempty"`

	Seconds     *float64       `json:",omitempty"`
	SecondsPath *jsonpath.Path `json:",omitempty"`

	Timestamp     *time.Time     `json:",omitempty"`
	TimestampPath *jsonpath.Path `json:",omitempty"`

	Next *string `json:",omitempty"`
	End  *bool   `json:",omitempty"`
	// contains filtered or unexported fields
}

func (*WaitState) Execute

func (s *WaitState) Execute(ctx context.Context, input interface{}) (output interface{}, next *string, err error)

func (*WaitState) GetType

func (s *WaitState) GetType() *string

func (*WaitState) Name

func (s *WaitState) Name() *string

func (*WaitState) SetName

func (s *WaitState) SetName(name *string)

func (*WaitState) SetType

func (s *WaitState) SetType(t *string)

func (*WaitState) Validate

func (s *WaitState) Validate() error

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL