Skip to content

Commit fe7244f

Browse files
authored
chore(v2): refactor defers (#1806)
* chore(v2): refactor defers * f * f * f
1 parent 39da54b commit fe7244f

File tree

5 files changed

+66
-73
lines changed

5 files changed

+66
-73
lines changed

operator/pkg/cli/migratev2/installation.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"log/slog"
77

88
ecv1beta1 "github.com/replicatedhq/embedded-cluster/kinds/apis/v1beta1"
9+
"github.com/replicatedhq/embedded-cluster/pkg/helpers"
910
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1011
"k8s.io/client-go/util/retry"
1112
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -44,7 +45,8 @@ func setV2MigrationComplete(ctx context.Context, cli client.Client, in *ecv1beta
4445
func setV2MigrationFailed(ctx context.Context, cli client.Client, in *ecv1beta1.Installation, failure error) error {
4546
slog.Info("Setting v2 migration failed")
4647

47-
err := setV2MigrationInProgressCondition(ctx, cli, in, metav1.ConditionFalse, "MigrationFailed", failure.Error())
48+
message := helpers.CleanErrorMessage(failure)
49+
err := setV2MigrationInProgressCondition(ctx, cli, in, metav1.ConditionFalse, "MigrationFailed", message)
4850
if err != nil {
4951
return fmt.Errorf("set v2 migration in progress condition: %w", err)
5052
}

operator/pkg/cli/migratev2/migrate.go

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ type LogFunc func(string, ...any)
1515
// Run runs the v1 to v2 migration. It installs the manager service on all nodes, copies the
1616
// installations to configmaps, enables the v2 admin console, and finally removes the operator
1717
// chart.
18-
func Run(ctx context.Context, cli client.Client, in *ecv1beta1.Installation) (err error) {
18+
func Run(ctx context.Context, cli client.Client, in *ecv1beta1.Installation) error {
1919
ok, err := needsMigration(ctx, cli)
2020
if err != nil {
2121
return fmt.Errorf("check if migration is needed: %w", err)
@@ -31,17 +31,38 @@ func Run(ctx context.Context, cli client.Client, in *ecv1beta1.Installation) (er
3131
if err != nil {
3232
return fmt.Errorf("set v2 migration in progress: %w", err)
3333
}
34+
3435
defer func() {
35-
if err == nil {
36-
return
36+
if r := recover(); r != nil {
37+
err := setV2MigrationFailed(ctx, cli, in, fmt.Errorf("panic: %v", err))
38+
if err != nil {
39+
slog.Error("Failed to set v2 migration failed", "error", err)
40+
}
41+
panic(r)
3742
}
43+
}()
44+
45+
err = runMigration(ctx, cli)
46+
if err != nil {
3847
if err := setV2MigrationFailed(ctx, cli, in, err); err != nil {
3948
slog.Error("Failed to set v2 migration failed", "error", err)
4049
}
41-
}()
50+
return err
51+
}
4252

53+
err = setV2MigrationComplete(ctx, cli, in)
54+
if err != nil {
55+
return fmt.Errorf("set v2 migration complete: %w", err)
56+
}
57+
58+
slog.Info("Successfully migrated from v2")
59+
60+
return nil
61+
}
62+
63+
func runMigration(ctx context.Context, cli client.Client) error {
4364
// scale down the operator to ensure that it does not reconcile and revert our changes.
44-
err = scaleDownOperator(ctx, cli)
65+
err := scaleDownOperator(ctx, cli)
4566
if err != nil {
4667
return fmt.Errorf("disable operator: %w", err)
4768
}
@@ -51,13 +72,6 @@ func Run(ctx context.Context, cli client.Client, in *ecv1beta1.Installation) (er
5172
return fmt.Errorf("cleanup k0s: %w", err)
5273
}
5374

54-
err = setV2MigrationComplete(ctx, cli, in)
55-
if err != nil {
56-
return fmt.Errorf("set v2 migration complete: %w", err)
57-
}
58-
59-
slog.Info("Successfully migrated from v2")
60-
6175
return nil
6276
}
6377

operator/pkg/upgrade/upgrade.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ func updateClusterConfig(ctx context.Context, cli client.Client) error {
208208
return nil
209209
}
210210

211-
func upgradeAddons(ctx context.Context, cli client.Client, hcli helm.Client, in *ecv1beta1.Installation) (finalErr error) {
211+
func upgradeAddons(ctx context.Context, cli client.Client, hcli helm.Client, in *ecv1beta1.Installation) error {
212212
err := k8sutil.SetInstallationState(ctx, cli, in.Name, v1beta1.InstallationStateAddonsInstalling, "Upgrading addons")
213213
if err != nil {
214214
return fmt.Errorf("set installation state: %w", err)

pkg/addons2/upgrade.go

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"context"
55
"fmt"
66
"log/slog"
7-
"runtime/debug"
87

98
"github.com/pkg/errors"
109
ecv1beta1 "github.com/replicatedhq/embedded-cluster/kinds/apis/v1beta1"
@@ -36,7 +35,7 @@ func Upgrade(ctx context.Context, hcli helm.Client, in *ecv1beta1.Installation,
3635
}
3736
for _, addon := range addons {
3837
if err := upgradeAddOn(ctx, hcli, kcli, in, addon); err != nil {
39-
return err
38+
return errors.Wrapf(err, "addon %s", addon.Name())
4039
}
4140
}
4241

@@ -105,7 +104,7 @@ func getAddOnsForUpgrade(in *ecv1beta1.Installation, meta *ectypes.ReleaseMetada
105104
return addOns, nil
106105
}
107106

108-
func upgradeAddOn(ctx context.Context, hcli helm.Client, kcli client.Client, in *ecv1beta1.Installation, addon types.AddOn) (finalErr error) {
107+
func upgradeAddOn(ctx context.Context, hcli helm.Client, kcli client.Client, in *ecv1beta1.Installation, addon types.AddOn) error {
109108
// check if we already processed this addon
110109
conditionStatus, err := k8sutil.GetConditionStatus(ctx, kcli, in.Name, conditionName(addon))
111110
if err != nil {
@@ -123,31 +122,21 @@ func upgradeAddOn(ctx context.Context, hcli helm.Client, kcli client.Client, in
123122
return errors.Wrap(err, "failed to set condition status")
124123
}
125124

126-
defer func() {
127-
if r := recover(); r != nil {
128-
finalErr = fmt.Errorf("upgrading %s recovered from panic: %v: %s", addon.Name(), r, string(debug.Stack()))
129-
}
130-
131-
status := metav1.ConditionTrue
132-
reason := "Upgraded"
133-
message := ""
134-
135-
if finalErr != nil {
136-
status = metav1.ConditionFalse
137-
reason = "UpgradeFailed"
138-
message = helpers.CleanErrorMessage(finalErr)
139-
}
140-
141-
if err := setCondition(ctx, kcli, in, conditionName(addon), status, reason, message); err != nil {
142-
slog.Error("Failed to set condition status", "error", err)
143-
}
144-
}()
145-
146125
// TODO (@salah): add support for end user overrides
147126
overrides := addOnOverrides(addon, in.Spec.Config, nil)
148127

149-
if err := addon.Upgrade(ctx, kcli, hcli, overrides); err != nil {
150-
return errors.Wrap(err, addon.Name())
128+
err = addon.Upgrade(ctx, kcli, hcli, overrides)
129+
if err != nil {
130+
message := helpers.CleanErrorMessage(err)
131+
if err := setCondition(ctx, kcli, in, conditionName(addon), metav1.ConditionFalse, "UpgradeFailed", message); err != nil {
132+
slog.Error("Failed to set condition upgrade failed", "error", err)
133+
}
134+
return errors.Wrap(err, "upgrade addon")
135+
}
136+
137+
err = setCondition(ctx, kcli, in, conditionName(addon), metav1.ConditionTrue, "Upgraded", "")
138+
if err != nil {
139+
return errors.Wrap(err, "set condition upgrade succeeded")
151140
}
152141

153142
slog.Info(addon.Name() + " is ready!")

pkg/extensions/upgrade.go

Lines changed: 22 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@ package extensions
22

33
import (
44
"context"
5-
"fmt"
65
"log/slog"
7-
"runtime/debug"
86

97
"github.com/pkg/errors"
108
ecv1beta1 "github.com/replicatedhq/embedded-cluster/kinds/apis/v1beta1"
@@ -76,7 +74,7 @@ func Upgrade(ctx context.Context, kcli client.Client, hcli helm.Client, prev *ec
7674
return nil
7775
}
7876

79-
func handleExtensionInstall(ctx context.Context, kcli client.Client, hcli helm.Client, in *ecv1beta1.Installation, ext ecv1beta1.Chart) (finalErr error) {
77+
func handleExtensionInstall(ctx context.Context, kcli client.Client, hcli helm.Client, in *ecv1beta1.Installation, ext ecv1beta1.Chart) error {
8078
return handleExtension(ctx, kcli, in, ext, actionInstall, func() error {
8179
exists, err := hcli.ReleaseExists(ctx, ext.TargetNS, ext.Name)
8280
if err != nil {
@@ -93,7 +91,7 @@ func handleExtensionInstall(ctx context.Context, kcli client.Client, hcli helm.C
9391
})
9492
}
9593

96-
func handleExtensionUpgrade(ctx context.Context, kcli client.Client, hcli helm.Client, in *ecv1beta1.Installation, ext ecv1beta1.Chart) (finalErr error) {
94+
func handleExtensionUpgrade(ctx context.Context, kcli client.Client, hcli helm.Client, in *ecv1beta1.Installation, ext ecv1beta1.Chart) error {
9795
return handleExtension(ctx, kcli, in, ext, actionUpgrade, func() error {
9896
if err := upgrade(ctx, hcli, ext); err != nil {
9997
return errors.Wrap(err, "upgrade")
@@ -109,7 +107,7 @@ func handleExtensionNoop(ctx context.Context, kcli client.Client, in *ecv1beta1.
109107
})
110108
}
111109

112-
func handleExtensionUninstall(ctx context.Context, kcli client.Client, hcli helm.Client, in *ecv1beta1.Installation, ext ecv1beta1.Chart) (finalErr error) {
110+
func handleExtensionUninstall(ctx context.Context, kcli client.Client, hcli helm.Client, in *ecv1beta1.Installation, ext ecv1beta1.Chart) error {
113111
return handleExtension(ctx, kcli, in, ext, actionUninstall, func() error {
114112
exists, err := hcli.ReleaseExists(ctx, ext.TargetNS, ext.Name)
115113
if err != nil {
@@ -126,7 +124,7 @@ func handleExtensionUninstall(ctx context.Context, kcli client.Client, hcli helm
126124
})
127125
}
128126

129-
func handleExtension(ctx context.Context, kcli client.Client, in *ecv1beta1.Installation, ext ecv1beta1.Chart, action helmAction, processFn func() error) (finalErr error) {
127+
func handleExtension(ctx context.Context, kcli client.Client, in *ecv1beta1.Installation, ext ecv1beta1.Chart, action helmAction, processFn func() error) error {
130128
slogArgs := slogArgs(ext, action)
131129

132130
processed, err := extensionAlreadyProcessed(ctx, kcli, in, ext)
@@ -146,26 +144,19 @@ func handleExtension(ctx context.Context, kcli client.Client, in *ecv1beta1.Inst
146144
}
147145
}
148146

149-
defer func() {
150-
if r := recover(); r != nil {
151-
actionIng, _ := formatAction(action)
152-
finalErr = fmt.Errorf("%s %s recovered from panic: %v: %s", actionIng, ext.Name, r, string(debug.Stack()))
153-
}
154-
155-
err := markExtensionProcessed(ctx, kcli, in, ext, action, finalErr)
156-
if err != nil {
157-
if finalErr == nil {
158-
finalErr = errors.Wrap(err, "mark extension as processed")
159-
} else {
160-
slog.Error("Failed to mark extension as processed", append(slogArgs, "error", err)...)
161-
}
147+
err = processFn()
148+
if err != nil {
149+
if err := markExtensionAsFailed(ctx, kcli, in, ext, action, err); err != nil {
150+
slog.Error("Failed to mark extension as failed", append(slogArgs, "error", err)...)
162151
}
163-
}()
164-
165-
if err := processFn(); err != nil {
166152
return errors.Wrap(err, "process extension")
167153
}
168154

155+
err = markExtensionAsProcessed(ctx, kcli, in, ext, action)
156+
if err != nil {
157+
return errors.Wrap(err, "mark extension as processed")
158+
}
159+
169160
slog.Info("Extension is ready!", slogArgs...)
170161

171162
return nil
@@ -187,23 +178,20 @@ func markExtensionAsProcessing(ctx context.Context, kcli client.Client, in *ecv1
187178
return nil
188179
}
189180

190-
func markExtensionProcessed(ctx context.Context, kcli client.Client, in *ecv1beta1.Installation, ext ecv1beta1.Chart, action helmAction, finalErr error) error {
181+
func markExtensionAsProcessed(ctx context.Context, kcli client.Client, in *ecv1beta1.Installation, ext ecv1beta1.Chart, action helmAction) error {
191182
_, actionEd := formatAction(action)
192-
193-
status := metav1.ConditionTrue
194-
reason := actionEd
195-
message := ""
196-
197-
if finalErr != nil {
198-
status = metav1.ConditionFalse
199-
reason = string(action) + "Failed"
200-
message = helpers.CleanErrorMessage(finalErr)
183+
if err := setCondition(ctx, kcli, in, conditionName(ext), metav1.ConditionTrue, actionEd, ""); err != nil {
184+
return errors.Wrap(err, "failed to set condition status")
201185
}
186+
return nil
187+
}
202188

203-
if err := setCondition(ctx, kcli, in, conditionName(ext), status, reason, message); err != nil {
189+
func markExtensionAsFailed(ctx context.Context, kcli client.Client, in *ecv1beta1.Installation, ext ecv1beta1.Chart, action helmAction, finalErr error) error {
190+
reason := string(action) + "Failed"
191+
message := helpers.CleanErrorMessage(finalErr)
192+
if err := setCondition(ctx, kcli, in, conditionName(ext), metav1.ConditionFalse, reason, message); err != nil {
204193
return errors.Wrap(err, "failed to set condition status")
205194
}
206-
207195
return nil
208196
}
209197

0 commit comments

Comments
 (0)