@@ -25,6 +25,7 @@ package reconcile
2525import (
2626 "strings"
2727
28+ driver "github.com/arangodb/go-driver"
2829 upgraderules "github.com/arangodb/go-upgrade-rules"
2930 "github.com/rs/zerolog"
3031 "github.com/rs/zerolog/log"
@@ -37,6 +38,8 @@ import (
3738
3839// upgradeDecision is the result of an upgrade check.
3940type upgradeDecision struct {
41+ FromVersion driver.Version
42+ ToVersion driver.Version
4043 UpgradeNeeded bool // If set, the image version has changed
4144 UpgradeAllowed bool // If set, it is an allowed version change
4245 AutoUpgradeNeeded bool // If set, the database must be started with `--database.auto-upgrade` once
@@ -153,9 +156,10 @@ func createPlan(log zerolog.Logger, apiObject k8sutil.APIObject,
153156 // is needed. If an upgrade is needed but not allowed, the second return value
154157 // will be true.
155158 // Returns: (newPlan, upgradeNotAllowed)
156- createRotateOrUpgradePlan := func () (api.Plan , bool ) {
159+ createRotateOrUpgradePlan := func () (api.Plan , bool , driver. Version , driver. Version ) {
157160 var newPlan api.Plan
158161 upgradeNotAllowed := false
162+ var fromVersion , toVersion driver.Version
159163 status .Members .ForeachServerGroup (func (group api.ServerGroup , members api.MemberStatusList ) error {
160164 for _ , m := range members {
161165 if m .Phase != api .MemberPhaseCreated {
@@ -169,14 +173,17 @@ func createPlan(log zerolog.Logger, apiObject k8sutil.APIObject,
169173 if decision .UpgradeNeeded && ! decision .UpgradeAllowed {
170174 // Oops, upgrade is not allowed
171175 upgradeNotAllowed = true
176+ fromVersion = decision .FromVersion
177+ toVersion = decision .ToVersion
172178 return nil
173179 } else if len (newPlan ) == 0 {
174180 // Only rotate/upgrade 1 pod at a time
175- if decision .UpgradeNeeded && decision .UpgradeAllowed {
181+ if decision .UpgradeNeeded {
182+ // Yes, upgrade is needed (and allowed)
176183 newPlan = createUpgradeMemberPlan (log , m , group , "Version upgrade" , spec .GetImage (), status )
177184 } else {
178- rotNeeded , reason := podNeedsRotation ( log , * p , apiObject , spec , group , status . Members . Agents , m . ID , context )
179- if rotNeeded {
185+ // Upgrade is not needed, see if rotation is needed
186+ if rotNeeded , reason := podNeedsRotation ( log , * p , apiObject , spec , group , status . Members . Agents , m . ID , context ); rotNeeded {
180187 newPlan = createRotateMemberPlan (log , m , group , reason )
181188 }
182189 }
@@ -186,10 +193,11 @@ func createPlan(log zerolog.Logger, apiObject k8sutil.APIObject,
186193 }
187194 return nil
188195 })
189- return newPlan , upgradeNotAllowed
196+ return newPlan , upgradeNotAllowed , fromVersion , toVersion
190197 }
191- if newPlan , upgradeNotAllowed := createRotateOrUpgradePlan (); upgradeNotAllowed {
192- // TODO create event
198+ if newPlan , upgradeNotAllowed , fromVersion , toVersion := createRotateOrUpgradePlan (); upgradeNotAllowed {
199+ // Upgrade is needed, but not allowed
200+ context .CreateEvent (k8sutil .NewUpgradeNotAllowedEvent (apiObject , fromVersion , toVersion ))
193201 } else {
194202 // Use the new plan
195203 plan = newPlan
@@ -236,18 +244,27 @@ func podNeedsUpgrading(p v1.Pod, spec api.DeploymentSpec, images api.ImageInfoLi
236244 podVersion := podImageInfo .ArangoDBVersion
237245 if err := upgraderules .CheckUpgradeRules (podVersion , specVersion ); err != nil {
238246 // E.g. 3.x -> 4.x, we cannot allow automatically
239- return upgradeDecision {UpgradeNeeded : true , UpgradeAllowed : false }
247+ return upgradeDecision {
248+ FromVersion : podVersion ,
249+ ToVersion : specVersion ,
250+ UpgradeNeeded : true ,
251+ UpgradeAllowed : false ,
252+ }
240253 }
241254 if specVersion .Major () != podVersion .Major () || specVersion .Minor () != podVersion .Minor () {
242255 // Is allowed, with `--database.auto-upgrade`
243256 return upgradeDecision {
257+ FromVersion : podVersion ,
258+ ToVersion : specVersion ,
244259 UpgradeNeeded : true ,
245260 UpgradeAllowed : true ,
246261 AutoUpgradeNeeded : true ,
247262 }
248263 }
249264 // Patch version change, rotate only
250265 return upgradeDecision {
266+ FromVersion : podVersion ,
267+ ToVersion : specVersion ,
251268 UpgradeNeeded : true ,
252269 UpgradeAllowed : true ,
253270 AutoUpgradeNeeded : false ,
0 commit comments