-
Notifications
You must be signed in to change notification settings - Fork 396
/
status.go
99 lines (90 loc) · 4.87 KB
/
status.go
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
package template
import (
"fmt"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/equality"
"k8s.io/client-go/util/retry"
mcfgv1 "github.com/openshift/machine-config-operator/pkg/apis/machineconfiguration.openshift.io/v1"
mcfgclientv1 "github.com/openshift/machine-config-operator/pkg/generated/clientset/versioned/typed/machineconfiguration.openshift.io/v1"
"github.com/openshift/machine-config-operator/pkg/version"
)
// - sets `running` condition to `true`.
// - reset the `available` condition to `false` when we are syncing to new generation.
// - does not modify `failing` condition.
func (ctrl *Controller) syncRunningStatus(ctrlconfig *mcfgv1.ControllerConfig) error {
updateFunc := func(cfg *mcfgv1.ControllerConfig) error {
reason := fmt.Sprintf("syncing towards (%d) generation using controller version %s", cfg.GetGeneration(), version.Version)
rcond := mcfgv1.NewControllerConfigStatusCondition(mcfgv1.TemplateControllerRunning, corev1.ConditionTrue, "", reason)
mcfgv1.SetControllerConfigStatusCondition(&cfg.Status, *rcond)
if cfg.GetGeneration() != cfg.Status.ObservedGeneration && mcfgv1.IsControllerConfigStatusConditionPresentAndEqual(cfg.Status.Conditions, mcfgv1.TemplateControllerCompleted, corev1.ConditionTrue) {
acond := mcfgv1.NewControllerConfigStatusCondition(mcfgv1.TemplateControllerCompleted, corev1.ConditionFalse, "", fmt.Sprintf("%s due to change in Generation", reason))
mcfgv1.SetControllerConfigStatusCondition(&cfg.Status, *acond)
}
cfg.Status.ObservedGeneration = ctrlconfig.GetGeneration()
return nil
}
return updateControllerConfigStatus(ctrlconfig.GetName(), ctrl.ccLister.Get, ctrl.client.MachineconfigurationV1().ControllerConfigs(), updateFunc)
}
// - resets `running` condition to `false`
// - resets `completed` condition to `false`
// - sets the `failing` condition to `true` using the `oerr`
func (ctrl *Controller) syncFailingStatus(ctrlconfig *mcfgv1.ControllerConfig, oerr error) error {
if oerr == nil {
return nil
}
updateFunc := func(cfg *mcfgv1.ControllerConfig) error {
message := fmt.Sprintf("failed to syncing towards (%d) generation using controller version %s: %v", cfg.GetGeneration(), version.Version, oerr)
fcond := mcfgv1.NewControllerConfigStatusCondition(mcfgv1.TemplateControllerFailing, corev1.ConditionTrue, "", message)
mcfgv1.SetControllerConfigStatusCondition(&cfg.Status, *fcond)
acond := mcfgv1.NewControllerConfigStatusCondition(mcfgv1.TemplateControllerCompleted, corev1.ConditionFalse, "", "")
mcfgv1.SetControllerConfigStatusCondition(&cfg.Status, *acond)
rcond := mcfgv1.NewControllerConfigStatusCondition(mcfgv1.TemplateControllerRunning, corev1.ConditionFalse, "", "")
mcfgv1.SetControllerConfigStatusCondition(&cfg.Status, *rcond)
cfg.Status.ObservedGeneration = ctrlconfig.GetGeneration()
return nil
}
if err := updateControllerConfigStatus(ctrlconfig.GetName(), ctrl.ccLister.Get, ctrl.client.MachineconfigurationV1().ControllerConfigs(), updateFunc); err != nil {
return fmt.Errorf("failed to sync status for %v", oerr)
}
return oerr
}
// - resets `running` condition to `false`
// - resets `failing` condition to `false`
// - sets the `completed` condition to `true`
func (ctrl *Controller) syncCompletedStatus(ctrlconfig *mcfgv1.ControllerConfig) error {
updateFunc := func(cfg *mcfgv1.ControllerConfig) error {
reason := fmt.Sprintf("sync completed towards (%d) generation using controller version %s", cfg.GetGeneration(), version.Version)
acond := mcfgv1.NewControllerConfigStatusCondition(mcfgv1.TemplateControllerCompleted, corev1.ConditionTrue, "", reason)
mcfgv1.SetControllerConfigStatusCondition(&cfg.Status, *acond)
rcond := mcfgv1.NewControllerConfigStatusCondition(mcfgv1.TemplateControllerRunning, corev1.ConditionFalse, "", "")
mcfgv1.SetControllerConfigStatusCondition(&cfg.Status, *rcond)
fcond := mcfgv1.NewControllerConfigStatusCondition(mcfgv1.TemplateControllerFailing, corev1.ConditionFalse, "", "")
mcfgv1.SetControllerConfigStatusCondition(&cfg.Status, *fcond)
cfg.Status.ObservedGeneration = ctrlconfig.GetGeneration()
return nil
}
return updateControllerConfigStatus(ctrlconfig.GetName(), ctrl.ccLister.Get, ctrl.client.MachineconfigurationV1().ControllerConfigs(), updateFunc)
}
type updateControllerConfigStatusFunc func(*mcfgv1.ControllerConfig) error
func updateControllerConfigStatus(name string,
controllerConfigGetter func(name string) (*mcfgv1.ControllerConfig, error),
client mcfgclientv1.ControllerConfigInterface,
updateFuncs ...updateControllerConfigStatusFunc) error {
return retry.RetryOnConflict(retry.DefaultBackoff, func() error {
old, err := controllerConfigGetter(name)
if err != nil {
return err
}
new := old.DeepCopy()
for _, update := range updateFuncs {
if err := update(new); err != nil {
return err
}
}
if equality.Semantic.DeepEqual(old, new) {
return nil
}
_, err = client.UpdateStatus(new)
return err
})
}