-
Notifications
You must be signed in to change notification settings - Fork 19
/
builder.go
146 lines (129 loc) · 4.76 KB
/
builder.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
142
143
144
145
146
package clusteroperator
import (
configv1 "github.com/openshift/api/config/v1"
"k8s.io/apimachinery/pkg/api/equality"
"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// From https://github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorstatus/builder.go
// Note: the clock api-machinery library in that package is now deprecated, so it has been removed here.
// NewBuilder returns a builder for ClusterOperatorStatus.
func NewBuilder() *Builder {
return &Builder{
status: &configv1.ClusterOperatorStatus{
Conditions: []configv1.ClusterOperatorStatusCondition{},
Versions: []configv1.OperandVersion{},
RelatedObjects: []configv1.ObjectReference{},
},
}
}
// Builder helps build ClusterOperatorStatus with appropriate
// ClusterOperatorStatusCondition and OperandVersion.
type Builder struct {
status *configv1.ClusterOperatorStatus
}
// GetStatus returns the ClusterOperatorStatus built.
func (b *Builder) GetStatus() configv1.ClusterOperatorStatus {
return *b.status
}
// WithProgressing sets an OperatorProgressing type condition.
func (b *Builder) WithProgressing(status metav1.ConditionStatus, reason, message string) *Builder {
return b.withCondition(string(configv1.OperatorProgressing), status, reason, message)
}
// WithDegraded sets an OperatorDegraded type condition.
func (b *Builder) WithDegraded(status metav1.ConditionStatus, reason, message string) *Builder {
return b.withCondition(string(configv1.OperatorDegraded), status, reason, message)
}
// WithAvailable sets an OperatorAvailable type condition.
func (b *Builder) WithAvailable(status metav1.ConditionStatus, reason, message string) *Builder {
return b.withCondition(string(configv1.OperatorAvailable), status, reason, message)
}
// WithUpgradeable sets an OperatorUpgradeable type condition.
func (b *Builder) WithUpgradeable(status metav1.ConditionStatus, reason, message string) *Builder {
return b.withCondition(string(configv1.OperatorUpgradeable), status, reason, message)
}
func (b *Builder) withCondition(typ string, status metav1.ConditionStatus, reason, message string) *Builder {
conditions := convertToMetaV1Conditions(b.status.Conditions)
meta.SetStatusCondition(&conditions, metav1.Condition{
Type: typ,
Status: status,
Reason: reason,
Message: message,
})
b.status.Conditions = convertToClusterOperatorConditions(conditions)
return b
}
func convertToMetaV1Conditions(in []configv1.ClusterOperatorStatusCondition) []metav1.Condition {
out := make([]metav1.Condition, 0, len(in))
for _, c := range in {
out = append(out, metav1.Condition{
Type: string(c.Type),
Status: metav1.ConditionStatus(c.Status),
Reason: c.Reason,
Message: c.Message,
LastTransitionTime: c.LastTransitionTime,
})
}
return out
}
func convertToClusterOperatorConditions(in []metav1.Condition) []configv1.ClusterOperatorStatusCondition {
out := make([]configv1.ClusterOperatorStatusCondition, 0, len(in))
for _, c := range in {
out = append(out, configv1.ClusterOperatorStatusCondition{
Type: configv1.ClusterStatusConditionType(c.Type),
Status: configv1.ConditionStatus(c.Status),
Reason: c.Reason,
Message: c.Message,
LastTransitionTime: c.LastTransitionTime,
})
}
return out
}
// WithVersion adds the specific version into the status.
func (b *Builder) WithVersion(name, version string) *Builder {
for i := range b.status.Versions {
if b.status.Versions[i].Name == name {
b.status.Versions[i].Version = version
return b
}
}
b.status.Versions = append(b.status.Versions, configv1.OperandVersion{
Name: name,
Version: version,
})
return b
}
// WithoutVersion removes the specified version from the existing status.
func (b *Builder) WithoutVersion(name string) *Builder {
out := b.status.Versions[:0]
for i, v := range b.status.Versions {
if v.Name == name {
continue
}
out[i] = v
}
b.status.Versions = out
return b
}
// WithRelatedObject adds the reference specified to the RelatedObjects list.
func (b *Builder) WithRelatedObject(reference configv1.ObjectReference) *Builder {
for i := range b.status.RelatedObjects {
if equality.Semantic.DeepEqual(b.status.RelatedObjects[i], reference) {
return b
}
}
b.status.RelatedObjects = append(b.status.RelatedObjects, reference)
return b
}
// WithoutRelatedObject removes the reference specified from the RelatedObjects list.
func (b *Builder) WithoutRelatedObject(reference configv1.ObjectReference) *Builder {
related := b.status.RelatedObjects[:0]
for i, ro := range b.status.RelatedObjects {
if equality.Semantic.DeepEqual(b.status.RelatedObjects[i], reference) {
continue
}
related[i] = ro
}
b.status.RelatedObjects = related
return b
}