Skip to content

Commit db6e1dc

Browse files
authored
chore(ci): fix regression test flakes (#5552)
* chore(ci): fix regression test flake * f * f * f * f * f
1 parent 3c30a9b commit db6e1dc

10 files changed

Lines changed: 63 additions & 25 deletions

File tree

e2e/playwright/regression/shared/version-history.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -162,16 +162,16 @@ export const deployNewVersion = async (
162162
await expect(confirmDeploymentModal).not.toBeVisible();
163163
}
164164

165-
// check if the deployment started or it it has already finished
166-
await expect(versionRow).toContainText(/(Deploying|Currently deployed version)/, { timeout: 10000 });
167-
await expect(versionRow).toContainText('Currently deployed version', { timeout: 45000 });
165+
// The row appears and disappears and appears again, so we need to make sure that it contains
166+
// both the sequence we are expecting and the currently deployed version text.
167+
await expect(versionRow).toContainText(new RegExp(`Sequence ${expectedSequence}.*Currently deployed version`), { timeout: 45000 });
168168
await expect(versionRow.getByRole('button', { name: 'Redeploy', exact: true })).toBeVisible();
169169

170170
if (expectedSequence > 0) {
171171
const previousVersionRow = allVersionsCard.getByTestId('version-history-row-1');
172+
await expect(previousVersionRow).toContainText(`Sequence ${expectedSequence - 1}`);
172173
await expect(previousVersionRow).toContainText('Previously deployed');
173174
await expect(previousVersionRow.getByRole('button', { name: 'Rollback', exact: true })).toBeVisible({ visible: supportsRollback });
174-
await expect(previousVersionRow).toContainText(`Sequence ${expectedSequence - 1}`);
175175
}
176176

177177
const currentVersionCard = page.getByTestId("current-version-card");
@@ -203,9 +203,9 @@ export const rollbackToVersion = async (page: Page, expect: Expect, rowIndex: nu
203203
await confirmDeploymentModal.getByRole('button', { name: 'Yes, redeploy', exact: true }).click();
204204
await expect(confirmDeploymentModal).not.toBeVisible();
205205

206-
// check if the deployment started or it it has already finished
207-
await expect(versionRow).toContainText(/(Deploying|Currently deployed version)/, { timeout: 10000 });
208-
await expect(versionRow).toContainText('Currently deployed version', { timeout: 45000 });
206+
// The row appears and disappears and appears again, so we need to make sure that it contains
207+
// both the sequence we are expecting and the currently deployed version text.
208+
await expect(versionRow).toContainText(new RegExp(`Sequence ${sequence}.*Currently deployed version`), { timeout: 45000 });
209209
await expect(versionRow.getByRole('button', { name: 'Redeploy', exact: true })).toBeVisible();
210210

211211
const nextVersionRow = allVersionsCard.getByTestId(`version-history-row-${rowIndex - 1}`);

pkg/kotsadmsnapshot/backup.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1244,7 +1244,11 @@ func getBackupDetailForBackup(ctx context.Context, ctrlClient ctrlclient.Client,
12441244
}
12451245
result.VolumeSizeHuman = units.HumanSize(float64(totalBytesDone)) // TODO: should this be TotalBytes rather than BytesDone?
12461246

1247-
if backup.Status.Phase == velerov1.BackupPhaseCompleted || backup.Status.Phase == velerov1.BackupPhasePartiallyFailed || backup.Status.Phase == velerov1.BackupPhaseFailed {
1247+
if backup.Status.Phase == velerov1.BackupPhaseCompleted ||
1248+
backup.Status.Phase == velerov1.BackupPhaseFailedValidation ||
1249+
backup.Status.Phase == velerov1.BackupPhasePartiallyFailed ||
1250+
backup.Status.Phase == velerov1.BackupPhaseFailed {
1251+
12481252
errs, warnings, execs, err := downloadBackupLogs(ctx, veleroNamespace, backup.Name)
12491253
result.Errors = errs
12501254
result.Warnings = warnings

pkg/kotsadmsnapshot/restore.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,11 @@ func GetRestoreDetails(ctx context.Context, kotsadmNamespace string, restoreID s
218218
Warnings: make([]types.SnapshotError, 0),
219219
}
220220

221-
if restore.Status.Phase == velerov1.RestorePhaseCompleted || restore.Status.Phase == velerov1.RestorePhasePartiallyFailed || restore.Status.Phase == velerov1.RestorePhaseFailed {
221+
if restore.Status.Phase == velerov1.RestorePhaseCompleted ||
222+
restore.Status.Phase == velerov1.RestorePhaseFailedValidation ||
223+
restore.Status.Phase == velerov1.RestorePhasePartiallyFailed ||
224+
restore.Status.Phase == velerov1.RestorePhaseFailed {
225+
222226
warnings, errs, err := DownloadRestoreResults(ctx, veleroNamespace, restore.Name)
223227
if err != nil {
224228
// do not fail on error

pkg/operator/operator.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -761,7 +761,7 @@ func (o *Operator) checkRestoreComplete(a *apptypes.App, restore *velerov1.Resto
761761
}
762762
break
763763

764-
case velerov1.RestorePhaseFailed, velerov1.RestorePhasePartiallyFailed:
764+
case velerov1.RestorePhaseFailedValidation, velerov1.RestorePhaseFailed, velerov1.RestorePhasePartiallyFailed:
765765
logger.Info("restore failed, resetting app restore")
766766

767767
if err := app.ResetRestore(a.ID); err != nil {

pkg/snapshot/backup.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,8 @@ func waitForVeleroBackupCompleted(ctx context.Context, clientset kubernetes.Inte
243243
switch backup.Status.Phase {
244244
case velerov1.BackupPhaseCompleted:
245245
return &backup, nil
246+
case velerov1.BackupPhaseFailedValidation:
247+
return &backup, errors.New("backup failed validation")
246248
case velerov1.BackupPhaseFailed:
247249
return &backup, errors.New("backup failed")
248250
case velerov1.BackupPhasePartiallyFailed:

pkg/snapshot/restore.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ func RestoreInstanceBackup(ctx context.Context, options RestoreInstanceBackupOpt
9191
switch backup.Status.Phase {
9292
case velerov1.BackupPhaseCompleted:
9393
break
94-
case velerov1.BackupPhaseFailed, velerov1.BackupPhasePartiallyFailed:
94+
case velerov1.BackupPhaseFailedValidation, velerov1.BackupPhaseFailed, velerov1.BackupPhasePartiallyFailed:
9595
return errors.Wrap(err, "cannot restore a failed backup")
9696
default:
9797
return errors.Wrap(err, "backup is still in progress")
@@ -309,6 +309,8 @@ func waitForVeleroRestoreCompleted(ctx context.Context, veleroNamespace string,
309309
switch restore.Status.Phase {
310310
case velerov1.RestorePhaseCompleted:
311311
return &restore, nil
312+
case velerov1.RestorePhaseFailedValidation:
313+
return &restore, errors.New("restore failed validation")
312314
case velerov1.RestorePhaseFailed:
313315
return &restore, errors.New("restore failed")
314316
case velerov1.RestorePhasePartiallyFailed:
@@ -471,7 +473,7 @@ func waitForKotsadmApplicationsRestore(backupID string, kotsadmNamespace string,
471473
switch s.RestoreDetail.Phase {
472474
case velerov1.RestorePhaseCompleted:
473475
break
474-
case velerov1.RestorePhaseFailed, velerov1.RestorePhasePartiallyFailed:
476+
case velerov1.RestorePhaseFailedValidation, velerov1.RestorePhaseFailed, velerov1.RestorePhasePartiallyFailed:
475477
errMsg := fmt.Sprintf("restore failed for app %s with %d errors and %d warnings", s.AppSlug, len(s.RestoreDetail.Errors), len(s.RestoreDetail.Warnings))
476478
errs = append(errs, errMsg)
477479
break

web/src/components/snapshots/AppSnapshotRestore.jsx

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class AppSnapshotRestore extends Component {
3131
this.state.fetchRestoreDetailJob.start(this.fetchRestoreDetail, 2000);
3232
} else {
3333
const phase = this.state.restoreDetail?.phase;
34-
if (phase && phase !== "New" && phase !== "InProgress") {
34+
if (isRestoreCompleted(phase)) {
3535
this.state.fetchRestoreDetailJob.stop();
3636
}
3737
}
@@ -307,10 +307,8 @@ class AppSnapshotRestore extends Component {
307307
(!restoreDetail?.warnings && !restoreDetail?.errors) ||
308308
(restoreDetail?.warnings?.length === 0 &&
309309
restoreDetail?.errors?.length === 0);
310-
const restoreCompleted = restoreDetail?.phase === "Completed";
311-
const restoreFailing =
312-
restoreDetail?.phase === "PartiallyFailed" ||
313-
restoreDetail?.phase === "Failed";
310+
const restoreCompleted = isRestoreSucceeded(restoreDetail?.phase);
311+
const restoreFailing = isRestoreFailed(restoreDetail?.phase);
314312
const restoreLoading = !restoreDetail?.warnings && !restoreDetail?.errors;
315313

316314
if (loadingRestoreDetail) {
@@ -438,4 +436,18 @@ class AppSnapshotRestore extends Component {
438436
}
439437
}
440438

439+
function isRestoreCompleted(phase) {
440+
return isRestoreSucceeded(phase) || isRestoreFailed(phase);
441+
}
442+
443+
function isRestoreFailed(phase) {
444+
return phase === "FailedValidation"
445+
|| phase === "Failed"
446+
|| phase === "PartiallyFailed";
447+
}
448+
449+
function isRestoreSucceeded(phase) {
450+
return phase === "Completed";
451+
}
452+
441453
export default withRouter(AppSnapshotRestore);

web/src/components/snapshots/SnapshotRestore.jsx

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class SnapshotRestore extends Component {
3535
(a) => a.appSlug === appSlug
3636
);
3737
const phase = currentAppDetails?.restoreDetail?.phase;
38-
if (phase && phase !== "New" && phase !== "InProgress") {
38+
if (isRestoreCompleted(phase)) {
3939
this.state.fetchRestoreDetailJob.stop();
4040
}
4141
}
@@ -321,11 +321,8 @@ class SnapshotRestore extends Component {
321321
!currentAppDetails?.restoreDetail?.errors) ||
322322
(currentAppDetails?.restoreDetail?.warnings?.length === 0 &&
323323
currentAppDetails?.restoreDetail?.errors?.length === 0);
324-
const restoreCompleted =
325-
currentAppDetails?.restoreDetail?.phase === "Completed";
326-
const restoreFailing =
327-
currentAppDetails?.restoreDetail?.phase === "PartiallyFailed" ||
328-
restoreDetail?.phase === "Failed";
324+
const restoreCompleted = isRestoreSucceeded(currentAppDetails?.restoreDetail?.phase);
325+
const restoreFailing = isRestoreFailed(currentAppDetails?.restoreDetail?.phase);
329326
const restoreLoading =
330327
!currentAppDetails?.restoreDetail?.warnings &&
331328
!currentAppDetails?.restoreDetail?.errors;
@@ -442,4 +439,18 @@ class SnapshotRestore extends Component {
442439
}
443440
}
444441

442+
function isRestoreCompleted(phase) {
443+
return isRestoreSucceeded(phase) || isRestoreFailed(phase);
444+
}
445+
446+
function isRestoreFailed(phase) {
447+
return phase === "FailedValidation"
448+
|| phase === "Failed"
449+
|| phase === "PartiallyFailed";
450+
}
451+
452+
function isRestoreSucceeded(phase) {
453+
return phase === "Completed";
454+
}
455+
445456
export default withRouter(SnapshotRestore);

web/src/scss/utilities/base.scss

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,9 @@ body a {
247247
&.reclaimed::before {
248248
background-color: #4999ad;
249249
}
250+
&.failedvalidation::before {
251+
background-color: #bc4752;
252+
}
250253
&.partiallyfailed::before {
251254
background-color: #bc4752;
252255
}

web/src/utilities/utilities.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -814,12 +814,12 @@ export const Utilities = {
814814
snapshotStatusToDisplayName(status) {
815815
// The front end replacessome status values with user friendly messages
816816
switch (status) {
817+
case "FailedValidation":
818+
return "Failed Validation";
817819
case "PartiallyFailed":
818820
return "Incomplete (Failed)";
819821
case "InProgress":
820822
return "In Progress";
821-
case "FailedValidation":
822-
return "Failed Validation";
823823
}
824824

825825
return status;

0 commit comments

Comments
 (0)