Skip to content

Commit

Permalink
Add support for timeout for restic backup and restore
Browse files Browse the repository at this point in the history
Signed-off-by: Md. Ishtiaq Islam <[email protected]>
  • Loading branch information
ishtiaqhimel committed Sep 12, 2024
1 parent a8ec4f0 commit 961583f
Show file tree
Hide file tree
Showing 19 changed files with 120 additions and 84 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ require (
k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0
kmodules.xyz/client-go v0.30.13
kmodules.xyz/offshoot-api v0.29.4
kubestash.dev/apimachinery v0.12.0
kubestash.dev/apimachinery v0.12.1-0.20240911133307-f1d8c0727f2e
sigs.k8s.io/controller-runtime v0.18.4
)

Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -638,8 +638,8 @@ kmodules.xyz/offshoot-api v0.29.4 h1:WQV2BIUIoVKKiqZNmZ4gAy367jEdwBhEl3dFCLZM1qA
kmodules.xyz/offshoot-api v0.29.4/go.mod h1:e+NQ0s4gW/YTPWBWEfdISZcmk+tlTq8IjvP5SLdqvko=
kmodules.xyz/prober v0.29.0 h1:Ex7m4F9rH7uWNNJlLgP63ROOM+nUATJkC2L5OQ7nwMg=
kmodules.xyz/prober v0.29.0/go.mod h1:UtK+HKyI1lFLEKX+HFLyOCVju6TO93zv3kwGpzqmKOo=
kubestash.dev/apimachinery v0.12.0 h1:33eDk/W2n/K45iRpAj8JTFGq9JzSvJBoWAjyoKTklgQ=
kubestash.dev/apimachinery v0.12.0/go.mod h1:gtVSpHtK8LvS26+rKyLTnZvijvSSCdfG83n6GL6+Kwc=
kubestash.dev/apimachinery v0.12.1-0.20240911133307-f1d8c0727f2e h1:4D0ogjJlJj9sGbldiYkazvrqMat4UyN2kVX47bCYs6w=
kubestash.dev/apimachinery v0.12.1-0.20240911133307-f1d8c0727f2e/go.mod h1:gtVSpHtK8LvS26+rKyLTnZvijvSSCdfG83n6GL6+Kwc=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
Expand Down
5 changes: 3 additions & 2 deletions pkg/trigger.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,8 +100,9 @@ func triggerBackup(backupConfig *coreapi.BackupConfiguration, session coreapi.Se
Kind: coreapi.ResourceKindBackupConfiguration,
Name: backupConfig.Name,
},
Session: session.Name,
RetryLeft: 0,
Session: session.Name,
RetryLeft: 0,
BackupTimeout: session.BackupTimeout,
},
}

Expand Down
8 changes: 8 additions & 0 deletions vendor/kubestash.dev/apimachinery/apis/constant.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,10 @@ const (
KubeStashAppRefName = "kubestash.com/app-ref-name"
)

const (
AnnKubeDBAppVersion = "kubedb.com/db-version"
)

// Keys for structure logging
const (
KeyTargetKind = "target_kind"
Expand Down Expand Up @@ -152,3 +156,7 @@ const (
SnapshotVersionV1 = "v1"
DirRepository = "repository"
)

const (
KeyRestoreSessionBeneficiary = "restoresession.kubestash.com/beneficiary"
)
Original file line number Diff line number Diff line change
Expand Up @@ -132,10 +132,10 @@ type SessionConfig struct {
// +optional
RetryConfig *RetryConfig `json:"retryConfig,omitempty"`

// Timeout specifies the maximum duration of backup. BackupSession will be considered Failed
// BackupTimeout specifies the maximum duration of backup. Backup will be considered Failed
// if backup does not complete within this time limit. By default, KubeStash don't set any timeout for backup.
// +optional
Timeout *metav1.Duration `json:"timeout,omitempty"`
BackupTimeout *metav1.Duration `json:"backupTimeout,omitempty"`

// SessionHistoryLimit specifies how many backup Jobs and associate resources KubeStash should keep for debugging purpose.
// The default value is 1.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,11 @@ type BackupSessionSpec struct {
// If this set to non-zero, KubeStash will create a new BackupSession if the current one fails.
// +optional
RetryLeft int32 `json:"retryLeft,omitempty"`

// BackupTimeout specifies the maximum duration of backup. Backup will be considered Failed
// if backup does not complete within this time limit. By default, KubeStash don't set any timeout for backup.
// +optional
BackupTimeout *metav1.Duration `json:"timeout,omitempty"`
}

// BackupSessionStatus defines the observed state of BackupSession
Expand All @@ -75,11 +80,6 @@ type BackupSessionStatus struct {
// +optional
Duration string `json:"duration,omitempty"`

// Deadline specifies the deadline of backup. BackupSession will be
// considered Failed if backup does not complete within this deadline
// +optional
Deadline *metav1.Time `json:"sessionDeadline,omitempty"`

// TotalSnapshots specifies the total number of snapshots created for this backupSession.
// +optional
TotalSnapshots *int32 `json:"totalSnapshots,omitempty"`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,7 @@ func (rs *RestoreSession) CalculatePhase() RestorePhase {
}

if cutil.IsConditionTrue(rs.Status.Conditions, TypeMetricsPushed) &&
(cutil.IsConditionTrue(rs.Status.Conditions, TypeDeadlineExceeded) ||
cutil.IsConditionFalse(rs.Status.Conditions, TypePreRestoreHooksExecutionSucceeded) ||
(cutil.IsConditionFalse(rs.Status.Conditions, TypePreRestoreHooksExecutionSucceeded) ||
cutil.IsConditionFalse(rs.Status.Conditions, TypePostRestoreHooksExecutionSucceeded) ||
cutil.IsConditionFalse(rs.Status.Conditions, TypeRestoreExecutorEnsured)) {
return RestoreFailed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,10 @@ type RestoreSessionSpec struct {
// +optional
Hooks *RestoreHooks `json:"hooks,omitempty"`

// Timeout specifies a duration that KubeStash should wait for the session execution to be completed.
// If the session execution does not finish within this time period, KubeStash will consider this session as a failure.
// RestoreTimeout specifies a duration that KubeStash should wait for the restore to be completed.
// If the restore does not finish within this time period, KubeStash will consider this restore as a failure.
// +optional
Timeout *metav1.Duration `json:"timeout,omitempty"`
RestoreTimeout *metav1.Duration `json:"restoreTimeout,omitempty"`

// ManifestOptions provide options to select particular manifest object to restore
// +optional
Expand Down Expand Up @@ -222,11 +222,6 @@ type RestoreSessionStatus struct {
// +optional
Duration string `json:"duration,omitempty"`

// Deadline specifies a timestamp till this session is valid. If the session does not complete within this deadline,
// it will be considered as failed.
// +optional
Deadline *metav1.Time `json:"deadline,omitempty"`

// TotalComponents represents the number of total components for this RestoreSession
// +optional
TotalComponents int32 `json:"totalComponents,omitempty"`
Expand Down
3 changes: 0 additions & 3 deletions vendor/kubestash.dev/apimachinery/apis/core/v1alpha1/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -217,9 +217,6 @@ type RetryConfig struct {
}

const (
TypeDeadlineExceeded = "DeadlineExceeded"
ReasonFailedToCompleteWithinDeadline = "FailedToCompleteWithinDeadline"

// TypeMetricsPushed indicates whether Metrics are pushed or not
TypeMetricsPushed = "MetricsPushed"
ReasonSuccessfullyPushedMetrics = "SuccessfullyPushedMetrics"
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package v1alpha1

import (
"fmt"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"kmodules.xyz/client-go/apiextensions"
cutil "kmodules.xyz/client-go/conditions"
"kmodules.xyz/client-go/meta"
Expand Down Expand Up @@ -187,3 +188,15 @@ func (s *Snapshot) OffshootLabels() map[string]string {
func (s *Snapshot) GetComponentPath(componentName string) string {
return filepath.Join(apis.DirRepository, s.Spec.Version, s.Spec.Session, componentName)
}

func (s *Snapshot) GetRemainingTimeoutDuration(timeout *metav1.Duration) (*metav1.Duration, error) {
if timeout == nil {
return nil, nil
}

diff := metav1.Now().Sub(s.GetCreationTimestamp().Time)
if diff < timeout.Duration {
return &metav1.Duration{Duration: timeout.Duration - diff}, nil
}
return nil, fmt.Errorf("deadline exceeded")
}
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,12 @@ spec:
description: BatchSession specifies the session configuration for
the targets.
properties:
backupTimeout:
description: BackupTimeout specifies the maximum duration of
backup. Backup will be considered Failed if backup does not
complete within this time limit. By default, KubeStash don't
set any timeout for backup.
type: string
hooks:
description: Hooks specifies the backup hooks that should be
executed before and/or after the backup.
Expand Down Expand Up @@ -36194,12 +36200,6 @@ spec:
type: array
type: object
type: array
timeout:
description: Timeout specifies the maximum duration of backup.
BackupSession will be considered Failed if backup does not
complete within this time limit. By default, KubeStash don't
set any timeout for backup.
type: string
type: object
type: array
targets:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15716,6 +15716,12 @@ spec:
type: object
type: array
type: object
backupTimeout:
description: BackupTimeout specifies the maximum duration
of backup. Backup will be considered Failed if backup
does not complete within this time limit. By default,
KubeStash don't set any timeout for backup.
type: string
hooks:
description: Hooks specifies the backup hooks that should
be executed before and/or after the backup.
Expand Down Expand Up @@ -37239,12 +37245,6 @@ spec:
debugging purpose. The default value is 1.
format: int32
type: integer
timeout:
description: Timeout specifies the maximum duration of backup.
BackupSession will be considered Failed if backup does
not complete within this time limit. By default, KubeStash
don't set any timeout for backup.
type: string
type: object
type: array
type: object
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14554,6 +14554,12 @@ spec:
type: object
type: array
type: object
backupTimeout:
description: BackupTimeout specifies the maximum duration of
backup. Backup will be considered Failed if backup does not
complete within this time limit. By default, KubeStash don't
set any timeout for backup.
type: string
hooks:
description: Hooks specifies the backup hooks that should be
executed before and/or after the backup.
Expand Down Expand Up @@ -34373,12 +34379,6 @@ spec:
purpose. The default value is 1.
format: int32
type: integer
timeout:
description: Timeout specifies the maximum duration of backup.
BackupSession will be considered Failed if backup does not
complete within this time limit. By default, KubeStash don't
set any timeout for backup.
type: string
type: object
type: array
target:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,12 @@ spec:
description: Session specifies the name of the session that triggered
this backup
type: string
timeout:
description: BackupTimeout specifies the maximum duration of backup.
Backup will be considered Failed if backup does not complete within
this time limit. By default, KubeStash don't set any timeout for
backup.
type: string
type: object
status:
description: BackupSessionStatus defines the observed state of BackupSession
Expand Down Expand Up @@ -249,12 +255,6 @@ spec:
not. This field will exist only if the `retryConfig` has been set
in the respective backup invoker.
type: boolean
sessionDeadline:
description: Deadline specifies the deadline of backup. BackupSession
will be considered Failed if backup does not complete within this
deadline
format: date-time
type: string
snapshots:
description: Snapshots specifies the Snapshots status
items:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24312,6 +24312,12 @@ spec:
restored files will be applied
type: string
type: object
restoreTimeout:
description: RestoreTimeout specifies a duration that KubeStash should
wait for the restore to be completed. If the restore does not finish
within this time period, KubeStash will consider this restore as
a failure.
type: string
target:
description: Target indicates the target application where the data
will be restored. The target must be in the same namespace as the
Expand All @@ -24330,12 +24336,6 @@ spec:
required:
- name
type: object
timeout:
description: Timeout specifies a duration that KubeStash should wait
for the session execution to be completed. If the session execution
does not finish within this time period, KubeStash will consider
this session as a failure.
type: string
type: object
status:
description: RestoreSessionStatus defines the observed state of RestoreSession
Expand Down Expand Up @@ -24420,12 +24420,6 @@ spec:
- type
type: object
type: array
deadline:
description: Deadline specifies a timestamp till this session is valid.
If the session does not complete within this deadline, it will be
considered as failed.
format: date-time
type: string
dependencies:
description: Dependencies specifies whether the objects required by
this RestoreSession exist or not
Expand Down
Loading

0 comments on commit 961583f

Please sign in to comment.