-
Notifications
You must be signed in to change notification settings - Fork 20
/
policy-type.go
89 lines (71 loc) · 2.91 KB
/
policy-type.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
package tosca_v2_0
import (
"github.com/tliron/puccini/tosca"
)
//
// PolicyType
//
// [TOSCA-v2.0] @ ?
// [TOSCA-Simple-Profile-YAML-v1.3] @ 3.7.12
// [TOSCA-Simple-Profile-YAML-v1.2] @ 3.7.12
// [TOSCA-Simple-Profile-YAML-v1.1] @ 3.6.12
// [TOSCA-Simple-Profile-YAML-v1.0] @ 3.6.11
//
type PolicyType struct {
*Type `name:"policy type"`
PropertyDefinitions PropertyDefinitions `read:"properties,PropertyDefinition" inherit:"properties,Parent"`
TargetNodeTypeOrGroupTypeNames *[]string `read:"targets" inherit:"targets,Parent"`
TriggerDefinitions TriggerDefinitions `read:"triggers,TriggerDefinition" inherit:"triggers,Parent"` // introduced in TOSCA 1.1
Parent *PolicyType `lookup:"derived_from,ParentName" json:"-" yaml:"-"`
TargetNodeTypes NodeTypes `lookup:"targets,TargetNodeTypeOrGroupTypeNames" inherit:"targets,Parent" json:"-" yaml:"-"`
TargetGroupTypes GroupTypes `lookup:"targets,TargetNodeTypeOrGroupTypeNames" inherit:"targets,Parent" json:"-" yaml:"-"`
}
func NewPolicyType(context *tosca.Context) *PolicyType {
return &PolicyType{
Type: NewType(context),
PropertyDefinitions: make(PropertyDefinitions),
TriggerDefinitions: make(TriggerDefinitions),
}
}
// tosca.Reader signature
func ReadPolicyType(context *tosca.Context) tosca.EntityPtr {
self := NewPolicyType(context)
context.ValidateUnsupportedFields(context.ReadFields(self))
return self
}
// tosca.Hierarchical interface
func (self *PolicyType) GetParent() tosca.EntityPtr {
return self.Parent
}
// tosca.Inherits interface
func (self *PolicyType) Inherit() {
logInherit.Debugf("policy type: %s", self.Name)
if self.Parent == nil {
return
}
self.PropertyDefinitions.Inherit(self.Parent.PropertyDefinitions)
// TODO: inherit TriggerDefinitions?
// (Note we are checking for TargetNodeTypeOrGroupTypeNames and not TargetNodeTypes/TargetGroupTypes, because the latter will never be nil)
if self.TargetNodeTypeOrGroupTypeNames == nil {
self.TargetNodeTypeOrGroupTypeNames = self.Parent.TargetNodeTypeOrGroupTypeNames
self.TargetNodeTypes = self.Parent.TargetNodeTypes
self.TargetGroupTypes = self.Parent.TargetGroupTypes
}
// We cannot handle the "else" case here, because the node type hierarchy may not have been created yet,
// So we will do that check in the rendering phase, below
}
// parser.Renderable interface
func (self *PolicyType) Render() {
logRender.Debugf("policy type: %s", self.Name)
// (Note we are checking for TargetNodeTypeOrGroupTypeNames and not TargetNodeTypes/TargetGroupTypes, because the latter will never be nil)
if (self.Parent == nil) || (self.Parent.TargetNodeTypeOrGroupTypeNames == nil) {
return
}
context := self.Context.FieldChild("targets", nil)
self.Parent.TargetNodeTypes.ValidateSubset(self.TargetNodeTypes, context)
self.Parent.TargetGroupTypes.ValidateSubset(self.TargetGroupTypes, context)
}
//
// PolicyTypes
//
type PolicyTypes []*PolicyType