Skip to content

Commit

Permalink
expose PruneOpts
Browse files Browse the repository at this point in the history
  • Loading branch information
Elbehery committed Jul 10, 2024
1 parent 7f27ef7 commit f462c3b
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 65 deletions.
42 changes: 15 additions & 27 deletions pkg/cmd/backuprestore/backupnoconfig.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,21 @@ package backuprestore
import (
"context"
"fmt"
"github.com/google/uuid"
"io"
"slices"

gcron "github.com/go-co-op/gocron/v2"
backupv1alpha1 "github.com/openshift/api/config/v1alpha1"
backupv1client "github.com/openshift/client-go/config/clientset/versioned/typed/config/v1alpha1"
prune "github.com/openshift/cluster-etcd-operator/pkg/cmd/prune-backups"

"github.com/spf13/cobra"
"github.com/spf13/pflag"
prune_backups "github.com/openshift/cluster-etcd-operator/pkg/cmd/prune-backups"

v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/klog/v2"

gcron "github.com/go-co-op/gocron/v2"
"github.com/google/uuid"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
)

type backupNoConfig struct {
Expand Down Expand Up @@ -163,27 +163,15 @@ func (b *backupNoConfig) scheduleBackup() error {
}

func (b *backupNoConfig) pruneBackups() error {
switch b.retention.RetentionType {
case prune.RetentionTypeNone:
klog.Info("no retention policy specified")
return nil
case prune.RetentionTypeNumber:
if b.retention.RetentionNumber == nil {
err := fmt.Errorf("retention policy RetentionTypeNumber requires RetentionNumberConfig")
klog.Error(err)
return err
}
return prune.Retain(b.retention)
case prune.RetentionTypeSize:
if b.retention.RetentionSize == nil {
err := fmt.Errorf("retention policy RetentionTypeSize requires RetentionSizeConfig")
klog.Error(err)
return err
}
return prune.Retain(b.retention)
default:
err := fmt.Errorf("illegal retention policy type: [%v]", b.retention.RetentionType)
klog.Error(err)
opts := &prune_backups.PruneOpts{
RetentionType: string(b.retention.RetentionType),
MaxNumberOfBackups: b.retention.RetentionNumber.MaxNumberOfBackups,
MaxSizeOfBackupsGb: b.retention.RetentionSize.MaxSizeOfBackupsGb,
}

if err := opts.Validate(); err != nil {
return err
}

return opts.Run()
}
56 changes: 28 additions & 28 deletions pkg/cmd/prune-backups/prune.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,14 @@ type backupDirStat struct {
modTime time.Time
}

type pruneOpts struct {
retentionType string
maxNumberOfBackups int
maxSizeOfBackupsGb int
type PruneOpts struct {
RetentionType string
MaxNumberOfBackups int
MaxSizeOfBackupsGb int
}

func NewPruneCommand() *cobra.Command {
opts := pruneOpts{retentionType: "None"}
opts := PruneOpts{RetentionType: "None"}
cmd := &cobra.Command{
Use: "prune-backups",
Short: "Prunes existing backups on the filesystem.",
Expand All @@ -57,54 +57,54 @@ func NewPruneCommand() *cobra.Command {
return cmd
}

func (r *pruneOpts) AddFlags(cmd *cobra.Command) {
func (r *PruneOpts) AddFlags(cmd *cobra.Command) {
flagSet := cmd.Flags()
flagSet.StringVar(&r.retentionType, "type", r.retentionType, "Which kind of retention to execute, can either be None, RetentionNumber or RetentionSize.")
flagSet.StringVar(&r.RetentionType, "type", r.RetentionType, "Which kind of retention to execute, can either be None, RetentionNumber or RetentionSize.")
// the defaults are zero for validation, we inject the real defaults from the periodic backup controller
flagSet.IntVar(&r.maxNumberOfBackups, "maxNumberOfBackups", 0, "how many backups to keep when type=RetentionNumber")
flagSet.IntVar(&r.maxSizeOfBackupsGb, "maxSizeOfBackupsGb", 0, "how many gigabytes of backups to keep when type=RetentionSize")
flagSet.IntVar(&r.MaxNumberOfBackups, "MaxNumberOfBackups", 0, "how many backups to keep when type=RetentionNumber")
flagSet.IntVar(&r.MaxSizeOfBackupsGb, "MaxSizeOfBackupsGb", 0, "how many gigabytes of backups to keep when type=RetentionSize")

// adding klog flags to tune verbosity better
gfs := goflag.NewFlagSet("", goflag.ExitOnError)
klog.InitFlags(gfs)
cmd.Flags().AddGoFlagSet(gfs)
}

func (r *pruneOpts) Validate() error {
if r.retentionType != RetentionTypeNone && r.retentionType != RetentionTypeNumber && r.retentionType != RetentionTypeSize {
return fmt.Errorf("unknown retention type: [%s]", r.retentionType)
func (r *PruneOpts) Validate() error {
if r.RetentionType != RetentionTypeNone && r.RetentionType != RetentionTypeNumber && r.RetentionType != RetentionTypeSize {
return fmt.Errorf("unknown retention type: [%s]", r.RetentionType)
}

if r.retentionType == RetentionTypeNumber {
if r.maxNumberOfBackups < 1 {
return fmt.Errorf("unexpected amount of backups [%d] found, expected at least 1", r.maxNumberOfBackups)
if r.RetentionType == RetentionTypeNumber {
if r.MaxNumberOfBackups < 1 {
return fmt.Errorf("unexpected amount of backups [%d] found, expected at least 1", r.MaxNumberOfBackups)
}

if r.maxSizeOfBackupsGb != 0 {
return fmt.Errorf("unexpected argument [maxSizeOfBackupsGb] found while using %s", RetentionTypeNumber)
if r.MaxSizeOfBackupsGb != 0 {
return fmt.Errorf("unexpected argument [MaxSizeOfBackupsGb] found while using %s", RetentionTypeNumber)
}

} else if r.retentionType == RetentionTypeSize {
if r.maxSizeOfBackupsGb < 1 {
return fmt.Errorf("unexpected size of backups [%d]gb found, expected at least 1", r.maxSizeOfBackupsGb)
} else if r.RetentionType == RetentionTypeSize {
if r.MaxSizeOfBackupsGb < 1 {
return fmt.Errorf("unexpected size of backups [%d]gb found, expected at least 1", r.MaxSizeOfBackupsGb)
}

if r.maxNumberOfBackups != 0 {
return fmt.Errorf("unexpected argument [maxNumberOfBackups] found while using %s", RetentionTypeSize)
if r.MaxNumberOfBackups != 0 {
return fmt.Errorf("unexpected argument [MaxNumberOfBackups] found while using %s", RetentionTypeSize)
}
}

return nil
}

func (r *pruneOpts) Run() error {
if r.retentionType == RetentionTypeNone {
func (r *PruneOpts) Run() error {
if r.RetentionType == RetentionTypeNone {
klog.Infof("nothing to do, retention type is none")
return nil
} else if r.retentionType == RetentionTypeSize {
return retainBySizeGb(r.maxSizeOfBackupsGb)
} else if r.retentionType == RetentionTypeNumber {
return retainByNumber(r.maxNumberOfBackups)
} else if r.RetentionType == RetentionTypeSize {
return retainBySizeGb(r.MaxSizeOfBackupsGb)
} else if r.RetentionType == RetentionTypeNumber {
return retainByNumber(r.MaxNumberOfBackups)
}

return nil
Expand Down
20 changes: 10 additions & 10 deletions pkg/cmd/prune-backups/prune_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,21 +13,21 @@ import (

func TestCommandValidation(t *testing.T) {
testCases := map[string]struct {
opts pruneOpts
opts PruneOpts
expectedErr error
}{
"none happy": {opts: pruneOpts{retentionType: RetentionTypeNone}},
"number happy": {opts: pruneOpts{retentionType: RetentionTypeNumber, maxNumberOfBackups: 1}},
"number zero": {opts: pruneOpts{retentionType: RetentionTypeNumber, maxNumberOfBackups: 0},
"none happy": {opts: PruneOpts{RetentionType: RetentionTypeNone}},
"number happy": {opts: PruneOpts{RetentionType: RetentionTypeNumber, MaxNumberOfBackups: 1}},
"number zero": {opts: PruneOpts{RetentionType: RetentionTypeNumber, MaxNumberOfBackups: 0},
expectedErr: fmt.Errorf("unexpected amount of backups [0] found, expected at least 1")},
"number flipped": {opts: pruneOpts{retentionType: RetentionTypeNumber, maxNumberOfBackups: 2, maxSizeOfBackupsGb: 25},
expectedErr: fmt.Errorf("unexpected argument [maxSizeOfBackupsGb] found while using RetentionNumber")},
"number flipped": {opts: PruneOpts{RetentionType: RetentionTypeNumber, MaxNumberOfBackups: 2, MaxSizeOfBackupsGb: 25},
expectedErr: fmt.Errorf("unexpected argument [MaxSizeOfBackupsGb] found while using RetentionNumber")},

"size happy": {opts: pruneOpts{retentionType: RetentionTypeSize, maxSizeOfBackupsGb: 1}},
"size zero": {opts: pruneOpts{retentionType: RetentionTypeSize, maxSizeOfBackupsGb: 0},
"size happy": {opts: PruneOpts{RetentionType: RetentionTypeSize, MaxSizeOfBackupsGb: 1}},
"size zero": {opts: PruneOpts{RetentionType: RetentionTypeSize, MaxSizeOfBackupsGb: 0},
expectedErr: fmt.Errorf("unexpected size of backups [0]gb found, expected at least 1")},
"size flipped": {opts: pruneOpts{retentionType: RetentionTypeSize, maxSizeOfBackupsGb: 2, maxNumberOfBackups: 25},
expectedErr: fmt.Errorf("unexpected argument [maxNumberOfBackups] found while using RetentionSize")},
"size flipped": {opts: PruneOpts{RetentionType: RetentionTypeSize, MaxSizeOfBackupsGb: 2, MaxNumberOfBackups: 25},
expectedErr: fmt.Errorf("unexpected argument [MaxNumberOfBackups] found while using RetentionSize")},
}

for k, v := range testCases {
Expand Down

0 comments on commit f462c3b

Please sign in to comment.