11package v1alpha1
22
33import (
4+ "github.com/RocketChat/airlock/internal/rules"
45 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
56)
67
8+ const (
9+ MongoDBBackupControllerName = "MongoDBBackup"
10+
11+ BackupConditionBucketStoreReady = "BucketStoreReady"
12+ BackupConditionAccessRequestReady = "MongoDBAccessRequestReady"
13+ BackupConditionJobScheduled = "JobScheduled"
14+ BackupConditionJobCompleted = "JobCompleted"
15+ BackupConditionJobFailed = "JobFailed"
16+
17+ BackupPhasePending = "Pending"
18+ BackupPhaseRunning = "Running"
19+ BackupPhaseCompleted = "Completed"
20+ BackupPhaseFailed = "Failed"
21+
22+ BackupReasonBackupNotStarted = "BackupNotStarted"
23+
24+ BackupReasonBackupStoreNotFound = "BackupStoreNotFound"
25+ BackupReasonAccessRequestNotFound = "AccessRequestNotFound"
26+ BackupReasonAccessRequestNotReady = "AccessRequestNotReady"
27+ BackupReasonAccessRequestReady = "AccessRequestReady"
28+
29+ BackupReasonBackupStoreReady = "BackupStoreReady"
30+ BackupReasonJobScheduled = "JobScheduled"
31+ BackupReasonJobCompleted = "JobCompleted"
32+ BackupReasonJobFailed = "JobFailed"
33+ )
34+
35+ var BackupPhaseRules = []rules.PhaseRule {
36+ // a successful backup
37+ rules .NewPhaseRule (
38+ BackupPhaseCompleted ,
39+ rules .ConditionsAll (
40+ // store is ready
41+ rules .ConditionEquals (BackupConditionBucketStoreReady , metav1 .ConditionTrue ),
42+ // accessrequest is ready
43+ rules .ConditionEquals (BackupConditionAccessRequestReady , metav1 .ConditionTrue ),
44+ // job is scheduled
45+ rules .ConditionEquals (BackupConditionJobCompleted , metav1 .ConditionTrue ),
46+ ),
47+ ),
48+ // for a running backup, check that consumes most conditions first
49+ rules .NewPhaseRule (
50+ BackupPhaseRunning ,
51+ rules .ConditionsAll (
52+ // store is ready
53+ rules .ConditionEquals (BackupConditionBucketStoreReady , metav1 .ConditionTrue ),
54+ // accessrequest is ready
55+ rules .ConditionEquals (BackupConditionAccessRequestReady , metav1 .ConditionTrue ),
56+ // job is scheduled
57+ rules .ConditionEquals (BackupConditionJobScheduled , metav1 .ConditionTrue ),
58+ ),
59+ ),
60+ // a failed backup can consist of any of the conditions being false-y
61+ rules .NewPhaseRule (
62+ BackupPhaseFailed ,
63+ rules .ConditionsAny (
64+ // store is not ready
65+ rules .ConditionEquals (BackupConditionBucketStoreReady , metav1 .ConditionFalse ),
66+ // accessrequest is not ready
67+ rules .ConditionEquals (BackupConditionAccessRequestReady , metav1 .ConditionFalse ),
68+ // job is failed
69+ rules .ConditionEquals (BackupConditionJobFailed , metav1 .ConditionTrue ),
70+ // job schedule failed
71+ // rules.ConditionEquals(BackupConditionJobScheduled, metav1.ConditionFalse),
72+ ),
73+ ),
74+ // pending backup is an amalgamation of all the conditions that are not yet met
75+ // when any of the precursors are in unknown state
76+ rules .NewPhaseRule (
77+ BackupPhasePending ,
78+ rules .ConditionsAny (
79+ // store is in unknown state
80+ rules .ConditionEquals (BackupConditionBucketStoreReady , metav1 .ConditionUnknown ),
81+ // accessrequest is in unknown state
82+ rules .ConditionEquals (BackupConditionAccessRequestReady , metav1 .ConditionUnknown ),
83+ ),
84+ ),
85+ rules .NewPhaseRule (
86+ BackupPhasePending ,
87+ rules .ConditionsAll (
88+ // store is either ready or hasn't been checked yet by their controller
89+ rules .ConditionEquals (BackupConditionBucketStoreReady , metav1 .ConditionTrue , metav1 .ConditionUnknown ),
90+ // accessrequest is either ready or hasn't been checked yet by access requyest controller
91+ rules .ConditionEquals (BackupConditionAccessRequestReady , metav1 .ConditionTrue , metav1 .ConditionUnknown ),
92+ // job is not scheduled yet
93+ rules .ConditionEquals (BackupConditionJobScheduled , metav1 .ConditionUnknown , metav1 .ConditionFalse ),
94+ ),
95+ ),
96+ }
97+
798// MongoDBBackupSpec defines the desired state of MongoDBBackup
899// +kubebuilder:object:generate=true
9100// +k8s:deepcopy-gen=true
@@ -33,12 +124,23 @@ type MongoDBBackupStoreRef struct {
33124// +kubebuilder:object:generate=true
34125// +k8s:deepcopy-gen=true
35126type MongoDBBackupStatus struct {
36- Phase string `json:"phase,omitempty"`
37- StartTime * metav1.Time `json:"startTime,omitempty"`
38- CompletionTime * metav1.Time `json:"completionTime,omitempty"`
39- BackupPath string `json:"backupPath,omitempty"`
40- Size string `json:"size,omitempty"`
41- Conditions []metav1.Condition `json:"conditions,omitempty"`
127+ Phase string `json:"phase,omitempty"`
128+ ObservedGeneration * int64 `json:"observedGeneration,omitempty"`
129+ StartTime * metav1.Time `json:"startTime,omitempty"`
130+ CompletionTime * metav1.Time `json:"completionTime,omitempty"`
131+ Conditions []metav1.Condition `json:"conditions,omitempty"`
132+
133+ Result * MongoDBBackupStatusResult `json:"result,omitempty"`
134+ }
135+
136+ type MongoDBBackupStatusResult struct {
137+ Path string `json:"path,omitempty"`
138+ Job * MongoDBBackupStatusJob `json:"job,omitempty"`
139+ }
140+
141+ type MongoDBBackupStatusJob struct {
142+ ID string `json:"id,omitempty"`
143+ Name string `json:"name,omitempty"`
42144}
43145
44146// +kubebuilder:object:root=true
@@ -64,3 +166,15 @@ type MongoDBBackupList struct {
64166func init () {
65167 SchemeBuilder .Register (& MongoDBBackup {}, & MongoDBBackupList {})
66168}
169+
170+ func (o * MongoDBBackup ) SetPhase (phase string ) {
171+ o .Status .Phase = phase
172+ }
173+
174+ func (o * MongoDBBackup ) GetPhase () string {
175+ return o .Status .Phase
176+ }
177+
178+ func (o * MongoDBBackup ) SetObservedGeneration (generation int64 ) {
179+ o .Status .ObservedGeneration = & generation
180+ }
0 commit comments