Skip to content

Commit

Permalink
Add velero install
Browse files Browse the repository at this point in the history
Signed-off-by: Tiger Kaovilai <[email protected]>
  • Loading branch information
kaovilai committed Nov 30, 2023
1 parent d58302c commit 7bed30a
Showing 1 changed file with 28 additions and 6 deletions.
34 changes: 28 additions & 6 deletions design/schedule-skip-immediately-config_design.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ With this design, user can skip the first immediately due backup when schedule i
- Changing the default behavior

## High-Level Design
Add a new field with to the schedule spec and as a new cli flags for install, server, schedule commands; allowing user to skip immediately due backup when unpausing.
Add a new field with to the schedule spec and as a new cli flags for install, server, schedule commands; allowing user to skip immediately due backup when unpausing or schedule creation.

If CLI flag is specified during schedule unpause, velero will update the schedule spec accordingly and override prior spec for `skipImmediately``.

Expand All @@ -37,6 +37,8 @@ If CLI flag is specified during schedule unpause, velero will update the schedul

`velero server` will add a new flag `--skip-immediately` to configure default value to patch new schedules created without the field. This flag will default to false to maintain prior behavior if not set.

`velero install` will add a new flag `--skip-immediately` to configure default value to patch new schedules created without the field. This flag will default to false to maintain prior behavior if not set.

### API Changes
`pkg/apis/velero/v1/schedule_types.go`
```diff
Expand Down Expand Up @@ -65,11 +67,11 @@ type ScheduleSpec struct {
+ // If false, backup will not be skipped immediately when schedule is unpaused, but will run at next schedule time.
+ // If empty, will follow server configuration (default: false).
+ // +optional
+ SkipImmediately *bool `json:"skipImmediately,omitempty"`
+ SkipImmediately bool `json:"skipImmediately,omitempty"`
}
```

`LastUnpaused` will be added to `ScheduleStatus` struct to track the last time a schedule was unpaused to support configurable unpause behavior.
`LastSkipped` will be added to `ScheduleStatus` struct to track the last time a schedule was unpaused to support configurable unpause behavior.
```diff
// ScheduleStatus captures the current state of a Velero schedule
type ScheduleStatus struct {
Expand All @@ -83,10 +85,10 @@ type ScheduleStatus struct {
// +nullable
LastBackup *metav1.Time `json:"lastBackup,omitempty"`

+ // LastUnpaused is the last time a Schedule was unpaused
+ // LastSkipped is the last time a Schedule was skipped
+ // +optional
+ // +nullable
+ LastUnpaused *metav1.Time `json:"lastUnpaused,omitempty"`
+ LastSkipped *metav1.Time `json:"lastSkipped,omitempty"`

// ValidationErrors is a slice of all validation errors (if
// applicable)
Expand All @@ -95,7 +97,27 @@ type ScheduleStatus struct {
}
```

`LastUnpaused` will be set to the current time when a schedule is unpaused. When a schedule is paused, `LastUnpaused` will be set to nil.
When `schedule.spec.SkipImmediately` is `true`, `LastSkipped` will be set to the current time, and `schedule.spec.SkipImmediately` set to nil so it can be used again.

The `getNextRunTime()` function below is updated so `LastSkipped` which is after `LastBackup` will be used to determine next run time.

```go
func getNextRunTime(schedule *velerov1.Schedule, cronSchedule cron.Schedule, asOf time.Time) (bool, time.Time) {
var lastBackupTime time.Time
if schedule.Status.LastBackup != nil {
lastBackupTime = schedule.Status.LastBackup.Time
} else {
lastBackupTime = schedule.CreationTimestamp.Time
}
if schedule.Status.LastSkipped != nil && schedule.Status.LastSkipped.After(lastBackupTime) {
lastBackupTime = schedule.Status.LastSkipped.Time
}

nextRunTime := cronSchedule.Next(lastBackupTime)

return asOf.After(nextRunTime), nextRunTime
}
```

When schedule is unpaused, and `schedule.status.lastBackup` is not nil, if `.spec.SkipImmediately` is true, a backup will not be created if the schedule is due immediately from lastBackup timestamp. Backup will be run at the next cron schedule.

Expand Down

0 comments on commit 7bed30a

Please sign in to comment.