@@ -149,33 +149,51 @@ func createPlan(log zerolog.Logger, apiObject k8sutil.APIObject,
149149 }
150150 return nil
151151 }
152- status .Members .ForeachServerGroup (func (group api.ServerGroup , members api.MemberStatusList ) error {
153- for _ , m := range members {
154- if len (plan ) > 0 {
155- // Only 1 change at a time
156- continue
157- }
158- if m .Phase != api .MemberPhaseCreated {
159- // Only rotate when phase is created
160- continue
161- }
162- if podName := m .PodName ; podName != "" {
163- if p := getPod (podName ); p != nil {
164- // Got pod, compare it with what it should be
165- decision := podNeedsUpgrading (* p , spec , status .Images )
166- if decision .UpgradeNeeded && decision .UpgradeAllowed {
167- plan = append (plan , createUpgradeMemberPlan (log , m , group , "Version upgrade" )... )
168- } else {
169- rotNeeded , reason := podNeedsRotation (log , * p , apiObject , spec , group , status .Members .Agents , m .ID , context )
170- if rotNeeded {
171- plan = append (plan , createRotateMemberPlan (log , m , group , reason )... )
152+ // createRotateOrUpgradePlan goes over all pods to check if an upgrade or rotate
153+ // is needed. If an upgrade is needed but not allowed, the second return value
154+ // will be true.
155+ // Returns: (newPlan, upgradeNotAllowed)
156+ createRotateOrUpgradePlan := func () (api.Plan , bool ) {
157+ var newPlan api.Plan
158+ upgradeNotAllowed := false
159+ status .Members .ForeachServerGroup (func (group api.ServerGroup , members api.MemberStatusList ) error {
160+ for _ , m := range members {
161+ if m .Phase != api .MemberPhaseCreated {
162+ // Only rotate when phase is created
163+ continue
164+ }
165+ if podName := m .PodName ; podName != "" {
166+ if p := getPod (podName ); p != nil {
167+ // Got pod, compare it with what it should be
168+ decision := podNeedsUpgrading (* p , spec , status .Images )
169+ if decision .UpgradeNeeded && ! decision .UpgradeAllowed {
170+ // Oops, upgrade is not allowed
171+ upgradeNotAllowed = true
172+ return nil
173+ } else if len (newPlan ) == 0 {
174+ // Only rotate/upgrade 1 pod at a time
175+ if decision .UpgradeNeeded && decision .UpgradeAllowed {
176+ newPlan = createUpgradeMemberPlan (log , m , group , "Version upgrade" , spec .GetImage (), status )
177+ } else {
178+ rotNeeded , reason := podNeedsRotation (log , * p , apiObject , spec , group , status .Members .Agents , m .ID , context )
179+ if rotNeeded {
180+ newPlan = createRotateMemberPlan (log , m , group , reason )
181+ }
182+ }
172183 }
173184 }
174185 }
175186 }
176- }
177- return nil
178- })
187+ return nil
188+ })
189+ return newPlan , upgradeNotAllowed
190+ }
191+ if newPlan , upgradeNotAllowed := createRotateOrUpgradePlan (); upgradeNotAllowed {
192+ // TODO create event
193+ } else {
194+ // Use the new plan
195+ plan = newPlan
196+ }
179197 }
180198
181199 // Check for the need to rotate TLS certificate of a members
@@ -343,7 +361,7 @@ func createRotateMemberPlan(log zerolog.Logger, member api.MemberStatus,
343361// createUpgradeMemberPlan creates a plan to upgrade (stop-recreateWithAutoUpgrade-stop-start) an existing
344362// member.
345363func createUpgradeMemberPlan (log zerolog.Logger , member api.MemberStatus ,
346- group api.ServerGroup , reason string ) api.Plan {
364+ group api.ServerGroup , reason string , imageName string , status api. DeploymentStatus ) api.Plan {
347365 log .Debug ().
348366 Str ("id" , member .ID ).
349367 Str ("role" , group .AsRole ()).
@@ -353,6 +371,11 @@ func createUpgradeMemberPlan(log zerolog.Logger, member api.MemberStatus,
353371 api .NewAction (api .ActionTypeUpgradeMember , group , member .ID , reason ),
354372 api .NewAction (api .ActionTypeWaitForMemberUp , group , member .ID ),
355373 }
374+ if status .CurrentImage == nil || status .CurrentImage .Image != imageName {
375+ plan = append (api.Plan {
376+ api .NewAction (api .ActionTypeSetCurrentImage , group , "" , reason ).SetImage (imageName ),
377+ }, plan ... )
378+ }
356379 return plan
357380}
358381
0 commit comments