-
Notifications
You must be signed in to change notification settings - Fork 103
Expand file tree
/
Copy patharoupgrader.go
More file actions
95 lines (83 loc) · 4.13 KB
/
aroupgrader.go
File metadata and controls
95 lines (83 loc) · 4.13 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
package upgraders
import (
"context"
"github.com/go-logr/logr"
"sigs.k8s.io/controller-runtime/pkg/client"
upgradev1alpha1 "github.com/openshift/managed-upgrade-operator/api/v1alpha1"
ac "github.com/openshift/managed-upgrade-operator/pkg/availabilitychecks"
cv "github.com/openshift/managed-upgrade-operator/pkg/clusterversion"
"github.com/openshift/managed-upgrade-operator/pkg/configmanager"
"github.com/openshift/managed-upgrade-operator/pkg/drain"
"github.com/openshift/managed-upgrade-operator/pkg/eventmanager"
"github.com/openshift/managed-upgrade-operator/pkg/machinery"
"github.com/openshift/managed-upgrade-operator/pkg/maintenance"
"github.com/openshift/managed-upgrade-operator/pkg/metrics"
"github.com/openshift/managed-upgrade-operator/pkg/scaler"
"github.com/openshift/managed-upgrade-operator/pkg/upgradesteps"
)
// aroUpgrader is a cluster upgrader suitable for ARO clusters.
// It inherits from the base clusterUpgrader.
type aroUpgrader struct {
*clusterUpgrader
}
// NewAROUpgrader creates a new instance of an aroUpgrader
func NewAROUpgrader(c client.Client, cfm configmanager.ConfigManager, mc metrics.Metrics, notifier eventmanager.EventManager) (*aroUpgrader, error) {
cfg := &upgraderConfig{}
err := cfm.Into(cfg)
if err != nil {
return nil, err
}
m, err := maintenance.NewBuilder().NewClient(c)
if err != nil {
return nil, err
}
acs, err := ac.GetAvailabilityCheckers(&cfg.ExtDependencyAvailabilityCheck)
if err != nil {
return nil, err
}
au := aroUpgrader{
clusterUpgrader: &clusterUpgrader{
client: c,
metrics: mc,
cvClient: cv.NewCVClient(c),
notifier: notifier,
config: cfg,
scaler: scaler.NewScaler(),
drainstrategyBuilder: drain.NewBuilder(),
maintenance: m,
machinery: machinery.NewMachinery(),
availabilityCheckers: acs,
},
}
steps := []upgradesteps.UpgradeStep{
upgradesteps.Action(string(upgradev1alpha1.SendStartedNotification), au.SendStartedNotification),
upgradesteps.Action(string(upgradev1alpha1.UpgradePreHealthCheck), au.PreUpgradeHealthCheck),
upgradesteps.Action(string(upgradev1alpha1.ExtDepAvailabilityCheck), au.ExternalDependencyAvailabilityCheck),
upgradesteps.Action(string(upgradev1alpha1.UpgradeScaleUpExtraNodes), au.EnsureExtraUpgradeWorkers),
upgradesteps.Action(string(upgradev1alpha1.ControlPlaneMaintWindow), au.CreateControlPlaneMaintWindow),
upgradesteps.Action(string(upgradev1alpha1.CommenceUpgrade), au.CommenceUpgrade),
upgradesteps.Action(string(upgradev1alpha1.ControlPlaneUpgraded), au.ControlPlaneUpgraded),
upgradesteps.Action(string(upgradev1alpha1.RemoveControlPlaneMaintWindow), au.RemoveControlPlaneMaintWindow),
upgradesteps.Action(string(upgradev1alpha1.WorkersMaintWindow), au.CreateWorkerMaintWindow),
upgradesteps.Action(string(upgradev1alpha1.AllWorkerNodesUpgraded), au.AllWorkersUpgraded),
upgradesteps.Action(string(upgradev1alpha1.RemoveExtraScaledNodes), au.RemoveExtraScaledNodes),
upgradesteps.Action(string(upgradev1alpha1.RemoveMaintWindow), au.RemoveMaintWindow),
upgradesteps.Action(string(upgradev1alpha1.PostClusterHealthCheck), au.PostUpgradeHealthCheck),
upgradesteps.Action(string(upgradev1alpha1.SendCompletedNotification), au.SendCompletedNotification),
}
au.steps = steps
return &au, nil
}
// UpgradeCluster performs the upgrade of the cluster and returns an indication of the
// last-executed upgrade phase and any error associated with the phase execution.
func (u *aroUpgrader) UpgradeCluster(ctx context.Context, upgradeConfig *upgradev1alpha1.UpgradeConfig, logger logr.Logger) (upgradev1alpha1.UpgradePhase, error) {
u.upgradeConfig = upgradeConfig
return u.runSteps(ctx, logger, u.steps)
}
// HealthCheck performs a pre-upgrade healthcheck when an upgrade is scheduled in advance mainly
// to highlight and notify of issues which could get fixed before the upgrade begins.
func (u *aroUpgrader) HealthCheck(ctx context.Context, upgradeConfig *upgradev1alpha1.UpgradeConfig, logger logr.Logger) (bool, error) {
u.upgradeConfig = upgradeConfig
ok, err := u.PreUpgradeHealthCheck(ctx, logger)
return ok, err
}