22
22
23
23
package v1alpha
24
24
25
- import "github.com/pkg/errors"
25
+ import (
26
+ "fmt"
27
+
28
+ "github.com/pkg/errors"
29
+ )
26
30
27
31
// DeploymentState is a strongly typed state of a deployment
28
32
type DeploymentState string
@@ -64,6 +68,9 @@ type DeploymentStatus struct {
64
68
65
69
// Members holds the status for all members in all server groups
66
70
Members DeploymentStatusMembers `json:"members"`
71
+
72
+ // Conditions specific to the entire deployment
73
+ Conditions ConditionList `json:"conditions,omitempty"`
67
74
}
68
75
69
76
// DeploymentStatusMembers holds the member status of all server groups
@@ -86,6 +93,95 @@ func (ds DeploymentStatusMembers) ContainsID(id string) bool {
86
93
ds .SyncWorkers .ContainsID (id )
87
94
}
88
95
96
+ // ForeachServerGroup calls the given callback for all server groups.
97
+ // If the callback returns an error, this error is returned and the callback is
98
+ // not called for the remaining groups.
99
+ func (ds DeploymentStatusMembers ) ForeachServerGroup (cb func (group ServerGroup , list * MemberStatusList ) error ) error {
100
+ if err := cb (ServerGroupSingle , & ds .Single ); err != nil {
101
+ return maskAny (err )
102
+ }
103
+ if err := cb (ServerGroupAgents , & ds .Agents ); err != nil {
104
+ return maskAny (err )
105
+ }
106
+ if err := cb (ServerGroupDBServers , & ds .DBServers ); err != nil {
107
+ return maskAny (err )
108
+ }
109
+ if err := cb (ServerGroupCoordinators , & ds .Coordinators ); err != nil {
110
+ return maskAny (err )
111
+ }
112
+ if err := cb (ServerGroupSyncMasters , & ds .SyncMasters ); err != nil {
113
+ return maskAny (err )
114
+ }
115
+ if err := cb (ServerGroupSyncWorkers , & ds .SyncWorkers ); err != nil {
116
+ return maskAny (err )
117
+ }
118
+ return nil
119
+ }
120
+
121
+ // MemberStatusByPodName returns a reference to the element in the given set of lists that has the given pod name.
122
+ // If no such element exists, nil is returned.
123
+ func (ds DeploymentStatusMembers ) MemberStatusByPodName (podName string ) (MemberStatus , ServerGroup , bool ) {
124
+ if result , found := ds .Single .ElementByPodName (podName ); found {
125
+ return result , ServerGroupSingle , true
126
+ }
127
+ if result , found := ds .Agents .ElementByPodName (podName ); found {
128
+ return result , ServerGroupAgents , true
129
+ }
130
+ if result , found := ds .DBServers .ElementByPodName (podName ); found {
131
+ return result , ServerGroupDBServers , true
132
+ }
133
+ if result , found := ds .Coordinators .ElementByPodName (podName ); found {
134
+ return result , ServerGroupCoordinators , true
135
+ }
136
+ if result , found := ds .SyncMasters .ElementByPodName (podName ); found {
137
+ return result , ServerGroupSyncMasters , true
138
+ }
139
+ if result , found := ds .SyncWorkers .ElementByPodName (podName ); found {
140
+ return result , ServerGroupSyncWorkers , true
141
+ }
142
+ return MemberStatus {}, 0 , false
143
+ }
144
+
145
+ // UpdateMemberStatus updates the given status in the given group.
146
+ func (ds * DeploymentStatusMembers ) UpdateMemberStatus (status MemberStatus , group ServerGroup ) error {
147
+ var err error
148
+ switch group {
149
+ case ServerGroupSingle :
150
+ err = ds .Single .Update (status )
151
+ case ServerGroupAgents :
152
+ err = ds .Agents .Update (status )
153
+ case ServerGroupDBServers :
154
+ err = ds .DBServers .Update (status )
155
+ case ServerGroupCoordinators :
156
+ err = ds .Coordinators .Update (status )
157
+ case ServerGroupSyncMasters :
158
+ err = ds .SyncMasters .Update (status )
159
+ case ServerGroupSyncWorkers :
160
+ err = ds .SyncWorkers .Update (status )
161
+ default :
162
+ return maskAny (errors .Wrapf (NotFoundError , "ServerGroup %d is not known" , group ))
163
+ }
164
+ if err != nil {
165
+ return maskAny (err )
166
+ }
167
+ return nil
168
+ }
169
+
170
+ // AllMembersReady returns true when all members are in the Ready state.
171
+ func (ds DeploymentStatusMembers ) AllMembersReady () bool {
172
+ if err := ds .ForeachServerGroup (func (group ServerGroup , list * MemberStatusList ) error {
173
+ for _ , x := range * list {
174
+ if ! x .Conditions .IsTrue (ConditionTypeReady ) {
175
+ return fmt .Errorf ("not ready" )
176
+ }
177
+ }
178
+ return nil
179
+ }); err != nil {
180
+ return false
181
+ }
182
+ return true
183
+ }
184
+
89
185
// MemberStatusList is a list of MemberStatus entries
90
186
type MemberStatusList []MemberStatus
91
187
@@ -99,6 +195,17 @@ func (l MemberStatusList) ContainsID(id string) bool {
99
195
return false
100
196
}
101
197
198
+ // ElementByPodName returns the element in the given list that has the given pod name and true.
199
+ // If no such element exists, an empty element and false is returned.
200
+ func (l MemberStatusList ) ElementByPodName (podName string ) (MemberStatus , bool ) {
201
+ for i , x := range l {
202
+ if x .PodName == podName {
203
+ return l [i ], true
204
+ }
205
+ }
206
+ return MemberStatus {}, false
207
+ }
208
+
102
209
// Add a member to the list.
103
210
// Returns an AlreadyExistsError if the ID of the given member already exists.
104
211
func (l * MemberStatusList ) Add (m MemberStatus ) error {
@@ -143,10 +250,8 @@ type MemberState string
143
250
const (
144
251
// MemberStateNone indicates that the state is not set yet
145
252
MemberStateNone MemberState = ""
146
- // MemberStateCreating indicates that the member is in the process of being created
147
- MemberStateCreating MemberState = "Creating"
148
- // MemberStateReady indicates that the member is running and reachable
149
- MemberStateReady MemberState = "Ready"
253
+ // MemberStateCreated indicates that all resources needed for the member have been created
254
+ MemberStateCreated MemberState = "Created"
150
255
// MemberStateCleanOut indicates that a dbserver is in the process of being cleaned out
151
256
MemberStateCleanOut MemberState = "CleanOut"
152
257
// MemberStateShuttingDown indicates that a member is shutting down
@@ -164,4 +269,6 @@ type MemberStatus struct {
164
269
PersistentVolumeClaimName string `json:"persistentVolumeClaimName,omitempty"`
165
270
// PodName holds the name of the Pod that currently runs this member
166
271
PodName string `json:"podName,omitempty"`
272
+ // Conditions specific to this member
273
+ Conditions ConditionList `json:"conditions,omitempty"`
167
274
}
0 commit comments