Skip to content

Commit e4736f1

Browse files
committed
Record event in case upgrade is not allowed
1 parent 75357b9 commit e4736f1

File tree

2 files changed

+40
-8
lines changed

2 files changed

+40
-8
lines changed

pkg/deployment/reconcile/plan_builder.go

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ package reconcile
2525
import (
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.
3940
type 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,

pkg/util/k8sutil/events.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"fmt"
2727
"strings"
2828

29+
driver "github.com/arangodb/go-driver"
2930
"k8s.io/api/core/v1"
3031
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3132
"k8s.io/apimachinery/pkg/runtime"
@@ -191,6 +192,20 @@ func NewDowntimeNotAllowedEvent(apiObject APIObject, operation string) *Event {
191192
return event
192193
}
193194

195+
// NewUpgradeNotAllowedEvent creates an event indicating that an upgrade (or downgrade) is not allowed.
196+
func NewUpgradeNotAllowedEvent(apiObject APIObject, fromVersion, toVersion driver.Version) *Event {
197+
event := newDeploymentEvent(apiObject)
198+
event.Type = v1.EventTypeNormal
199+
if fromVersion.CompareTo(toVersion) < 0 {
200+
event.Reason = "Upgrade not allowed"
201+
event.Message = fmt.Sprintf("Upgrading ArangoDB from version %s to %s is not allowed", fromVersion, toVersion)
202+
} else {
203+
event.Reason = "Downgrade not allowed"
204+
event.Message = fmt.Sprintf("Downgrading ArangoDB from version %s to %s is not allowed", fromVersion, toVersion)
205+
}
206+
return event
207+
}
208+
194209
// NewErrorEvent creates an even of type error.
195210
func NewErrorEvent(reason string, err error, apiObject APIObject) *Event {
196211
event := newDeploymentEvent(apiObject)

0 commit comments

Comments
 (0)