-
Notifications
You must be signed in to change notification settings - Fork 80
Expand file tree
/
Copy pathcluster_origin.go
More file actions
109 lines (93 loc) · 4.72 KB
/
cluster_origin.go
File metadata and controls
109 lines (93 loc) · 4.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package backup
import (
v1 "github.com/rancher/backup-restore-operator/pkg/apis/resources.cattle.io/v1"
"github.com/rancher/wrangler/v3/pkg/condition"
)
type backupClusterOriginConditionMeta struct {
backupName string
hasClusterOriginID bool
clusterOriginID string
hasCurrentOriginCondition bool
currentOriginCondition bool
canInPlaceRestore bool
hasInPlaceRestoreCondition bool
currentInPlaceRestoreCondition bool
}
func newBackupClusterOriginConditionMeta(controllerClusterID string, backup *v1.Backup) backupClusterOriginConditionMeta {
conditionMeta := backupClusterOriginConditionMeta{
backupName: backup.Name,
hasClusterOriginID: false,
hasCurrentOriginCondition: false,
currentOriginCondition: false,
canInPlaceRestore: false,
hasInPlaceRestoreCondition: false,
currentInPlaceRestoreCondition: false,
}
originalValue := backup.Status.OriginCluster
conditionMeta.hasClusterOriginID = originalValue != ""
if conditionMeta.hasClusterOriginID {
conditionMeta.clusterOriginID = originalValue
}
currentOriginConditionString := condition.Cond(v1.BackupConditionClusterOrigin).GetStatus(backup)
conditionMeta.hasCurrentOriginCondition = currentOriginConditionString != ""
if !conditionMeta.hasCurrentOriginCondition {
conditionMeta.currentOriginCondition = currentOriginConditionString == "True"
}
if conditionMeta.hasClusterOriginID {
conditionMeta.canInPlaceRestore = conditionMeta.clusterOriginID == controllerClusterID
}
currentInPlaceRestoreString := condition.Cond(v1.BackupConditionInPlaceRestore).GetStatus(backup)
conditionMeta.hasInPlaceRestoreCondition = currentInPlaceRestoreString != ""
if !conditionMeta.hasInPlaceRestoreCondition {
conditionMeta.currentInPlaceRestoreCondition = currentInPlaceRestoreString == "True"
}
return conditionMeta
}
// prepareClusterOriginConditions helps set the cluster origin conditions and reports if anything changed in this part of status.
func (h *handler) prepareClusterOriginConditions(backup *v1.Backup) bool {
conditionChanged := false
if !h.canUseClusterOriginStatus {
currentOriginConditionString := condition.Cond(v1.BackupConditionClusterOrigin).GetStatus(backup)
if currentOriginConditionString != "False" {
condition.Cond(v1.BackupConditionClusterOrigin).SetStatusBool(backup, false)
condition.Cond(v1.BackupConditionClusterOrigin).Message(backup, "CRD not updated to include cluster UID yet.")
conditionChanged = true
}
currentInPlaceRestoreString := condition.Cond(v1.BackupConditionInPlaceRestore).GetStatus(backup)
if currentInPlaceRestoreString != "False" {
condition.Cond(v1.BackupConditionInPlaceRestore).SetStatusBool(backup, false)
condition.Cond(v1.BackupConditionInPlaceRestore).Message(backup, "Cannot determine if in-place Restore is viable.")
conditionChanged = true
}
return conditionChanged
}
// TODO: We could add a fallback mode that uses filenames (and/or the annotation) when the CRD is not updated
conditionMeta := newBackupClusterOriginConditionMeta(h.kubeSystemNS, backup)
// Fist pass we only care to set BackupConditionClusterOrigin based on if the context is there
if !conditionMeta.hasCurrentOriginCondition || conditionMeta.currentOriginCondition != conditionMeta.hasClusterOriginID {
conditionChanged = true
condition.Cond(v1.BackupConditionClusterOrigin).SetStatusBool(backup, conditionMeta.hasClusterOriginID)
if conditionMeta.hasClusterOriginID {
condition.Cond(v1.BackupConditionClusterOrigin).Message(backup, "Backup has cluster UID attached.")
} else {
condition.Cond(v1.BackupConditionClusterOrigin).Message(backup, "No cluster UID attached to backup.")
}
}
// Second pass, we care about the specifics of the ClusterOrigin to set the InPlaceRestore condition
if !conditionMeta.hasClusterOriginID {
// When annotation is missing, we'll mark as unable to determine
condition.Cond(v1.BackupConditionInPlaceRestore).SetStatusBool(backup, false)
condition.Cond(v1.BackupConditionInPlaceRestore).Message(backup, "Unable to determine if in-place Restore is viable.")
}
if !conditionMeta.hasInPlaceRestoreCondition || conditionMeta.canInPlaceRestore != conditionMeta.currentInPlaceRestoreCondition {
conditionChanged = true
condition.Cond(v1.BackupConditionInPlaceRestore).SetStatusBool(backup, conditionMeta.canInPlaceRestore)
if conditionMeta.canInPlaceRestore {
condition.Cond(v1.BackupConditionInPlaceRestore).Message(backup, "In-place Restore appears viable.")
} else {
condition.Cond(v1.BackupConditionInPlaceRestore).Message(backup, "In-place Restore does not appear viable.")
}
}
// When the annotation is present and not changed
return conditionChanged
}