Skip to content

Commit ed60abd

Browse files
authored
Merge pull request #774 from k8up-io/eff-schedules
Move randomized schedules to Status and remove EffectiveSchedules CRD
2 parents 6070243 + 88c7357 commit ed60abd

15 files changed

+183
-694
lines changed

Makefile.restic-integration.vars.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ restore_dir ?= $(integrationtest_dir)/restore
1313

1414
stats_url ?= http://localhost:8091
1515

16-
restic_version ?= 0.12.1
16+
restic_version ?= $(shell go mod edit -json | jq -r '.Require[] | select(.Path == "github.com/restic/restic").Version' | sed "s/v//")
1717
restic_path ?= $(go_bin)/restic
1818
restic_pid ?= $(integrationtest_dir)/restic.pid
1919
restic_url ?= https://github.com/restic/restic/releases/download/v$(restic_version)/restic_$(restic_version)_$(os)_$(arch).bz2

api/v1/effectiveschedule_types.go

Lines changed: 0 additions & 64 deletions
This file was deleted.

api/v1/schedule_types.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,13 @@ type ScheduleStatus struct {
8383
// They are an extension mechanism which allows tools and other controllers to collect summary information about
8484
// resources without needing to understand resource-specific status details.
8585
Conditions []metav1.Condition `json:"conditions,omitempty"`
86+
// EffectiveSchedules contains a list of schedules generated from randomizing schedules.
87+
EffectiveSchedules []EffectiveSchedule `json:"effectiveSchedules,omitempty"`
88+
}
89+
90+
type EffectiveSchedule struct {
91+
JobType JobType `json:"jobType,omitempty"`
92+
GeneratedSchedule ScheduleDefinition `json:"generatedSchedule,omitempty"`
8693
}
8794

8895
// +kubebuilder:object:root=true
@@ -196,8 +203,3 @@ func (s ScheduleDefinition) IsNonStandard() bool {
196203
func (s ScheduleDefinition) IsRandom() bool {
197204
return s.IsNonStandard() && strings.HasSuffix(string(s), "-random")
198205
}
199-
200-
// IsReferencedBy returns true if the given ref matches the schedule's name and namespace.
201-
func (s *Schedule) IsReferencedBy(ref ScheduleRef) bool {
202-
return ref.Namespace == s.Namespace && ref.Name == s.Name
203-
}

api/v1/zz_generated.deepcopy.go

Lines changed: 5 additions & 78 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/apiextensions.k8s.io/v1/k8up.io_effectiveschedules.yaml

Lines changed: 0 additions & 87 deletions
This file was deleted.

config/crd/apiextensions.k8s.io/v1/k8up.io_schedules.yaml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3494,6 +3494,20 @@ spec:
34943494
- type
34953495
type: object
34963496
type: array
3497+
effectiveSchedules:
3498+
description: EffectiveSchedules contains a list of schedules generated
3499+
from randomizing schedules.
3500+
items:
3501+
properties:
3502+
generatedSchedule:
3503+
description: ScheduleDefinition is the actual cron-type expression
3504+
that defines the interval of the actions.
3505+
type: string
3506+
jobType:
3507+
description: JobType defines what job type this is.
3508+
type: string
3509+
type: object
3510+
type: array
34973511
type: object
34983512
type: object
34993513
served: true

controllers/schedule_controller.go

Lines changed: 2 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package controllers
22

33
import (
44
"context"
5-
"time"
65

76
"github.com/go-logr/logr"
87
"k8s.io/apimachinery/pkg/api/errors"
@@ -27,6 +26,7 @@ type ScheduleReconciler struct {
2726

2827
// +kubebuilder:rbac:groups=k8up.io,resources=schedules,verbs=get;list;watch;create;update;patch;delete
2928
// +kubebuilder:rbac:groups=k8up.io,resources=schedules/status;schedules/finalizers,verbs=get;update;patch
29+
// The following permissions are just for backwards compatibility.
3030
// +kubebuilder:rbac:groups=k8up.io,resources=effectiveschedules,verbs=get;list;watch;create;update;patch;delete
3131
// +kubebuilder:rbac:groups=k8up.io,resources=effectiveschedules/finalizers,verbs=update
3232

@@ -44,13 +44,6 @@ func (r *ScheduleReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
4444
return reconcile.Result{}, err
4545
}
4646

47-
effectiveSchedules, err := r.fetchEffectiveSchedules(ctx, schedule)
48-
if err != nil {
49-
requeueAfter := 60 * time.Second
50-
r.Log.Info("could not retrieve list of effective schedules", "error", err.Error(), "retry_after", requeueAfter)
51-
return ctrl.Result{Requeue: true, RequeueAfter: requeueAfter}, err
52-
}
53-
5447
repository := cfg.Config.GetGlobalRepository()
5548
if schedule.Spec.Backend != nil {
5649
repository = schedule.Spec.Backend.String()
@@ -60,7 +53,7 @@ func (r *ScheduleReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
6053
}
6154
config := job.NewConfig(ctx, r.Client, log, schedule, r.Scheme, repository)
6255

63-
return ctrl.Result{}, handler.NewScheduleHandler(config, schedule, effectiveSchedules).Handle()
56+
return ctrl.Result{}, handler.NewScheduleHandler(config, schedule).Handle()
6457
}
6558

6659
// SetupWithManager configures the reconciler.
@@ -73,31 +66,3 @@ func (r *ScheduleReconciler) SetupWithManager(mgr ctrl.Manager, l logr.Logger) e
7366
WithEventFilter(predicate.GenerationChangedPredicate{}).
7467
Complete(r)
7568
}
76-
77-
// fetchEffectiveSchedules retrieves a list of EffectiveSchedules and filter the one that matches the given schedule.
78-
// Returns an error if the listing failed, but empty map when no matching EffectiveSchedule object was found.
79-
func (r *ScheduleReconciler) fetchEffectiveSchedules(ctx context.Context, schedule *k8upv1.Schedule) (map[k8upv1.JobType]k8upv1.EffectiveSchedule, error) {
80-
list := k8upv1.EffectiveScheduleList{}
81-
err := r.Client.List(ctx, &list, client.InNamespace(cfg.Config.OperatorNamespace))
82-
if err != nil {
83-
return map[k8upv1.JobType]k8upv1.EffectiveSchedule{}, err
84-
}
85-
return filterEffectiveSchedulesForReferencesOfSchedule(list, schedule), nil
86-
}
87-
88-
// filterEffectiveSchedulesForReferencesOfSchedule iterates over the given list of EffectiveSchedules and returns results that reference the given schedule in their spec.
89-
// It returns an empty map if no element matches.
90-
func filterEffectiveSchedulesForReferencesOfSchedule(list k8upv1.EffectiveScheduleList, schedule *k8upv1.Schedule) map[k8upv1.JobType]k8upv1.EffectiveSchedule {
91-
filtered := map[k8upv1.JobType]k8upv1.EffectiveSchedule{}
92-
for _, es := range list.Items {
93-
if es.GetDeletionTimestamp() != nil {
94-
continue
95-
}
96-
for _, jobRef := range es.Spec.ScheduleRefs {
97-
if schedule.IsReferencedBy(jobRef) {
98-
filtered[es.Spec.JobType] = es
99-
}
100-
}
101-
}
102-
return filtered
103-
}

0 commit comments

Comments
 (0)