-
Notifications
You must be signed in to change notification settings - Fork 20
/
workflow-activity-definition.go
141 lines (118 loc) · 4.62 KB
/
workflow-activity-definition.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package tosca_v2_0
import (
"strings"
"github.com/tliron/kutil/ard"
"github.com/tliron/puccini/tosca"
"github.com/tliron/puccini/tosca/normal"
"github.com/tliron/yamlkeys"
)
//
// WorkflowActivityDefinition
//
// [TOSCA-v2.0] @ ?
// [TOSCA-Simple-Profile-YAML-v1.3] @ 3.6.23
// [TOSCA-Simple-Profile-YAML-v1.2] @ 3.6.19
// [TOSCA-Simple-Profile-YAML-v1.1] @ 3.5.17
//
type WorkflowActivityDefinition struct {
*Entity `name:"workflow activity definition"`
DelegateWorkflowDefinitionName *string
InlineWorkflowDefinitionName *string
SetNodeState *string
CallOperationSpec *string
DelegateWorkflowDefinition *WorkflowDefinition `lookup:"delegate,DelegateWorkflowDefinitionName" json:"-" yaml:"-"`
InlineWorkflowDefinition *WorkflowDefinition `lookup:"inline,InlineWorkflowDefinitionName" json:"-" yaml:"-"`
CallInterface *InterfaceAssignment `json:"-" yaml:"-"`
CallOperation *OperationAssignment `json:"-" yaml:"-"`
}
func NewWorkflowActivityDefinition(context *tosca.Context) *WorkflowActivityDefinition {
return &WorkflowActivityDefinition{Entity: NewEntity(context)}
}
// tosca.Reader signature
func ReadWorkflowActivityDefinition(context *tosca.Context) tosca.EntityPtr {
self := NewWorkflowActivityDefinition(context)
if context.ValidateType(ard.TypeMap) {
map_ := context.Data.(ard.Map)
if len(map_) != 1 {
context.ReportValueMalformed("workflow activity definition", "map length not 1")
return self
}
for key, value := range map_ {
operator := yamlkeys.KeyString(key)
childContext := context.FieldChild(operator, value)
switch operator {
case "delegate":
self.DelegateWorkflowDefinitionName = childContext.ReadString()
case "inline":
self.InlineWorkflowDefinitionName = childContext.ReadString()
case "set_state":
self.SetNodeState = childContext.ReadString()
case "call_operation":
self.CallOperationSpec = childContext.ReadString()
default:
context.ReportValueMalformed("workflow activity definition", "unsupported operator")
return self
}
// We have only one key
break
}
}
return self
}
func (self *WorkflowActivityDefinition) Render(stepDefinition *WorkflowStepDefinition) {
if self.CallOperationSpec == nil {
return
}
// Parse operation spec
s := strings.SplitN(*self.CallOperationSpec, ".", 2)
if len(s) != 2 {
self.Context.FieldChild("call_operation", *self.CallOperationSpec).ReportValueWrongFormat("interface.operation")
return
}
var ok bool
// Lookup interface by name
if stepDefinition.TargetNodeTemplate != nil {
if self.CallInterface, ok = stepDefinition.TargetNodeTemplate.Interfaces[s[0]]; !ok {
self.Context.FieldChild("call_operation", s[0]).ReportReferenceNotFound("interface", stepDefinition.TargetNodeTemplate)
return
}
} else if stepDefinition.TargetGroup != nil {
if self.CallInterface, ok = stepDefinition.TargetGroup.Interfaces[s[0]]; !ok {
self.Context.FieldChild("call_operation", s[0]).ReportReferenceNotFound("interface", stepDefinition.TargetGroup)
return
}
} else {
// There was a lookup problem (neither node template nor group)
return
}
// Lookup operation by name
if self.CallOperation, ok = self.CallInterface.Operations[s[1]]; !ok {
self.Context.FieldChild("call_operation", s[1]).ReportReferenceNotFound("operation", self.CallInterface)
}
}
func (self *WorkflowActivityDefinition) Normalize(normalWorkflowStep *normal.WorkflowStep) *normal.WorkflowActivity {
logNormalize.Debug("workflow activity")
normalWorkflowActivity := normalWorkflowStep.NewActivity()
if self.DelegateWorkflowDefinition != nil {
normalWorkflowActivity.DelegateWorkflow = normalWorkflowStep.Workflow.ServiceTemplate.Workflows[self.DelegateWorkflowDefinition.Name]
} else if self.InlineWorkflowDefinition != nil {
normalWorkflowActivity.InlineWorkflow = normalWorkflowStep.Workflow.ServiceTemplate.Workflows[self.InlineWorkflowDefinition.Name]
} else if self.SetNodeState != nil {
normalWorkflowActivity.SetNodeState = *self.SetNodeState
} else if self.CallOperation != nil {
var normalInterface *normal.Interface
if normalWorkflowStep.TargetNodeTemplate != nil {
normalInterface = normalWorkflowStep.TargetNodeTemplate.Interfaces[self.CallInterface.Name]
} else if normalWorkflowStep.TargetGroup != nil {
normalInterface = normalWorkflowStep.TargetGroup.Interfaces[self.CallInterface.Name]
} else {
return normalWorkflowActivity
}
normalWorkflowActivity.CallOperation = normalInterface.Operations[self.CallOperation.Name]
}
return normalWorkflowActivity
}
//
// WorkflowActivityDefinitions
//
type WorkflowActivityDefinitions []*WorkflowActivityDefinition