Skip to content

Commit cba5465

Browse files
committed
Add minimum version check for creating rollbacks entries in update marker
1 parent a6052ca commit cba5465

File tree

3 files changed

+55
-5
lines changed

3 files changed

+55
-5
lines changed

internal/pkg/agent/application/upgrade/step_mark.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,9 +216,10 @@ func markUpgrade(log *logger.Logger, dataDirPath string, updatedOn time.Time, ag
216216
DesiredOutcome: desiredOutcome,
217217
}
218218

219-
if rollbackWindow > 0 {
220-
219+
if rollbackWindow > 0 && agent.parsedVersion != nil && !agent.parsedVersion.Less(*Version_9_2_0_SNAPSHOT) {
221220
// if we have a not empty rollback window, write the prev version in the rollbacks_available field
221+
// we also need to check the destination version because the manual rollback and delayed cleanup will be
222+
// handled by that version of agent, so it needs to be recent enough
222223
upgradeDetails.Metadata.RollbacksAvailable = []details.RollbackAvailable{
223224
{
224225
Version: previousAgent.version,

internal/pkg/agent/application/upgrade/step_mark_test.go

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ desired_outcome: true
268268
func TestMarkUpgrade(t *testing.T) {
269269
var parsed123SNAPSHOT = agtversion.NewParsedSemVer(1, 2, 3, "SNAPSHOT", "")
270270
var parsed456SNAPSHOT = agtversion.NewParsedSemVer(4, 5, 6, "SNAPSHOT", "")
271-
271+
var parsed920SNAPSHOT = agtversion.NewParsedSemVer(9, 2, 0, "SNAPSHOT", "")
272272
// fix a timestamp (truncated to the second because of loss of precision during marshalling/unmarshalling)
273273
updatedOnNow := time.Now().UTC().Truncate(time.Second)
274274

@@ -371,7 +371,7 @@ func TestMarkUpgrade(t *testing.T) {
371371
},
372372
},
373373
{
374-
name: "rollback window specified - available rollbacks must be present",
374+
name: "rollback window specified but new version is too low - no rollbacks",
375375
args: args{
376376
updatedOn: updatedOnNow,
377377
currentAgent: agentInstall{
@@ -410,6 +410,52 @@ func TestMarkUpgrade(t *testing.T) {
410410
TargetVersion: "4.5.6-SNAPSHOT",
411411
State: "UPG_REPLACING",
412412
ActionID: "",
413+
},
414+
DesiredOutcome: OUTCOME_UPGRADE,
415+
}
416+
assert.Equal(t, expectedMarker, actualMarker)
417+
},
418+
},
419+
{
420+
name: "rollback window specified and new version is at least 9.2.0-SNAPSHOT - available rollbacks must be present",
421+
args: args{
422+
updatedOn: updatedOnNow,
423+
currentAgent: agentInstall{
424+
parsedVersion: parsed920SNAPSHOT,
425+
version: "9.2.0-SNAPSHOT",
426+
hash: "newagt",
427+
versionedHome: filepath.Join("data", "elastic-agent-9.2.0-SNAPSHOT-newagt"),
428+
},
429+
previousAgent: agentInstall{
430+
parsedVersion: parsed123SNAPSHOT,
431+
version: "1.2.3-SNAPSHOT",
432+
hash: "prvagt",
433+
versionedHome: filepath.Join("data", "elastic-agent-1.2.3-SNAPSHOT-prvagt"),
434+
},
435+
action: nil,
436+
details: details.NewDetails("9.2.0-SNAPSHOT", details.StateReplacing, ""),
437+
desiredOutcome: OUTCOME_UPGRADE,
438+
rollbackWindow: 7 * 24 * time.Hour,
439+
},
440+
wantErr: assert.NoError,
441+
assertAfterMark: func(t *testing.T, dataDir string) {
442+
actualMarker, err := LoadMarker(dataDir)
443+
require.NoError(t, err, "error reading actualMarker content after writing")
444+
445+
expectedMarker := &UpdateMarker{
446+
Version: "9.2.0-SNAPSHOT",
447+
Hash: "newagt",
448+
VersionedHome: filepath.Join("data", "elastic-agent-9.2.0-SNAPSHOT-newagt"),
449+
UpdatedOn: updatedOnNow,
450+
PrevVersion: "1.2.3-SNAPSHOT",
451+
PrevHash: "prvagt",
452+
PrevVersionedHome: filepath.Join("data", "elastic-agent-1.2.3-SNAPSHOT-prvagt"),
453+
Acked: false,
454+
Action: nil,
455+
Details: &details.Details{
456+
TargetVersion: "9.2.0-SNAPSHOT",
457+
State: "UPG_REPLACING",
458+
ActionID: "",
413459
Metadata: details.Metadata{
414460
RollbacksAvailable: []details.RollbackAvailable{
415461
{

internal/pkg/agent/application/upgrade/upgrade.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ var (
6464
ErrNilUpdateMarker = errors.New("loaded a nil update marker")
6565
ErrEmptyRollbackVersion = errors.New("rollback version is empty")
6666
ErrNoRollbacksAvailable = errors.New("no rollbacks available")
67+
68+
// Version_9_2_0_SNAPSHOT is the minimum version for manual rollback and rollback reason
69+
Version_9_2_0_SNAPSHOT = agtversion.NewParsedSemVer(9, 2, 0, "SNAPSHOT", "")
6770
)
6871

6972
func init() {
@@ -371,7 +374,7 @@ func (u *Upgrader) Upgrade(ctx context.Context, version string, rollback bool, s
371374
versionedHome: currentVersionedHome,
372375
}
373376
rollbackWindow := time.Duration(0)
374-
if u.upgradeSettings != nil && u.upgradeSettings.Rollback != nil { // TODO && target version supports manual rollback and deferred cleanup
377+
if u.upgradeSettings != nil && u.upgradeSettings.Rollback != nil {
375378
rollbackWindow = u.upgradeSettings.Rollback.Window
376379
}
377380
if err := markUpgrade(u.log, paths.Data(), time.Now(), current, previous, action, det, OUTCOME_UPGRADE, rollbackWindow); err != nil {

0 commit comments

Comments
 (0)