2222
2323package v1alpha
2424
25- import "github.com/pkg/errors"
25+ import (
26+ "fmt"
27+
28+ "github.com/pkg/errors"
29+ )
2630
2731// DeploymentState is a strongly typed state of a deployment
2832type DeploymentState string
@@ -64,6 +68,9 @@ type DeploymentStatus struct {
6468
6569 // Members holds the status for all members in all server groups
6670 Members DeploymentStatusMembers `json:"members"`
71+
72+ // Conditions specific to the entire deployment
73+ Conditions ConditionList `json:"conditions,omitempty"`
6774}
6875
6976// DeploymentStatusMembers holds the member status of all server groups
@@ -86,6 +93,95 @@ func (ds DeploymentStatusMembers) ContainsID(id string) bool {
8693 ds .SyncWorkers .ContainsID (id )
8794}
8895
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+
89185// MemberStatusList is a list of MemberStatus entries
90186type MemberStatusList []MemberStatus
91187
@@ -99,6 +195,17 @@ func (l MemberStatusList) ContainsID(id string) bool {
99195 return false
100196}
101197
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+
102209// Add a member to the list.
103210// Returns an AlreadyExistsError if the ID of the given member already exists.
104211func (l * MemberStatusList ) Add (m MemberStatus ) error {
@@ -143,10 +250,8 @@ type MemberState string
143250const (
144251 // MemberStateNone indicates that the state is not set yet
145252 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"
150255 // MemberStateCleanOut indicates that a dbserver is in the process of being cleaned out
151256 MemberStateCleanOut MemberState = "CleanOut"
152257 // MemberStateShuttingDown indicates that a member is shutting down
@@ -164,4 +269,6 @@ type MemberStatus struct {
164269 PersistentVolumeClaimName string `json:"persistentVolumeClaimName,omitempty"`
165270 // PodName holds the name of the Pod that currently runs this member
166271 PodName string `json:"podName,omitempty"`
272+ // Conditions specific to this member
273+ Conditions ConditionList `json:"conditions,omitempty"`
167274}
0 commit comments