Skip to content

Commit 59ad6e8

Browse files
committed
🌱 (chore): improve error context and wrapping in utility and test helpers
1 parent 6452e9f commit 59ad6e8

File tree

4 files changed

+36
-27
lines changed

4 files changed

+36
-27
lines changed

‎test/e2e/utils/kubectl.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package utils
1919
import (
2020
"encoding/json"
2121
"errors"
22+
"fmt"
2223
"os/exec"
2324
"strconv"
2425
"strings"
@@ -114,12 +115,12 @@ func (vi VersionInfo) GetMinorInt() uint64 { return vi.minor }
114115
func (vi *VersionInfo) parseVersionInts() (err error) {
115116
if vi.Major != "" {
116117
if vi.major, err = strconv.ParseUint(vi.Major, 10, 64); err != nil {
117-
return err
118+
return fmt.Errorf("error parsing major version %q: %w", vi.Major, err)
118119
}
119120
}
120121
if vi.Minor != "" {
121122
if vi.minor, err = strconv.ParseUint(vi.Minor, 10, 64); err != nil {
122-
return err
123+
return fmt.Errorf("error parsing minor version %q: %w", vi.Minor, err)
123124
}
124125
}
125126
return nil
@@ -142,18 +143,18 @@ func (v *KubernetesVersion) prepare() error {
142143
func (k *Kubectl) Version() (ver KubernetesVersion, err error) {
143144
out, err := k.Command("version", "-o", "json")
144145
if err != nil {
145-
return KubernetesVersion{}, err
146+
return KubernetesVersion{}, fmt.Errorf("error getting kubernetes version: %w", err)
146147
}
147-
if err := ver.decode(out); err != nil {
148-
return KubernetesVersion{}, err
148+
if decodeErr := ver.decode(out); decodeErr != nil {
149+
return KubernetesVersion{}, fmt.Errorf("error parsing kubernetes version: %w", decodeErr)
149150
}
150151
return ver, nil
151152
}
152153

153-
func (v *KubernetesVersion) decode(out string) (err error) {
154+
func (v *KubernetesVersion) decode(out string) error {
154155
dec := json.NewDecoder(strings.NewReader(out))
155156
if err := dec.Decode(&v); err != nil {
156-
return err
157+
return fmt.Errorf("error decoding kubernetes version: %w", err)
157158
}
158159
return v.prepare()
159160
}

‎test/e2e/utils/test_context.go

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ type TestContext struct {
5959
func NewTestContext(binaryName string, env ...string) (*TestContext, error) {
6060
testSuffix, err := util.RandomSuffix()
6161
if err != nil {
62-
return nil, err
62+
return nil, fmt.Errorf("failed to generate random suffix: %w", err)
6363
}
6464

6565
cc := &CmdContext{
@@ -74,12 +74,12 @@ func NewTestContext(binaryName string, env ...string) (*TestContext, error) {
7474
}
7575
k8sVersion, err := kubectl.Version()
7676
if err != nil {
77-
return nil, err
77+
return nil, fmt.Errorf("failed to get kubernetes version: %w", err)
7878
}
7979

8080
// Set CmdContext.Dir after running Kubectl.Version() because dir does not exist yet.
8181
if cc.Dir, err = filepath.Abs("e2e-" + testSuffix); err != nil {
82-
return nil, err
82+
return nil, fmt.Errorf("failed to determine absolute path to %q: %w", "e2e-"+testSuffix, err)
8383
}
8484

8585
return &TestContext{
@@ -108,13 +108,17 @@ func (t *TestContext) Prepare() error {
108108
for _, toolName := range []string{"controller-gen", "kustomize"} {
109109
if toolPath, err := exec.LookPath(toolName); err == nil {
110110
if err := os.RemoveAll(toolPath); err != nil {
111-
return err
111+
return fmt.Errorf("failed to remove %q: %w", toolName, err)
112112
}
113113
}
114114
}
115115

116116
_, _ = fmt.Fprintf(GinkgoWriter, "preparing testing directory: %s\n", t.Dir)
117-
return os.MkdirAll(t.Dir, 0o755)
117+
if err := os.MkdirAll(t.Dir, 0o755); err != nil {
118+
return fmt.Errorf("error creating test directory %q: %w", t.Dir, err)
119+
}
120+
121+
return nil
118122
}
119123

120124
// makeCertManagerURL returns a kubectl-able URL for the cert-manager bundle.
@@ -320,13 +324,13 @@ func (t *TestContext) AllowProjectBeMultiGroup() error {
320324
`
321325
projectBytes, err := os.ReadFile(filepath.Join(t.Dir, "PROJECT"))
322326
if err != nil {
323-
return err
327+
return fmt.Errorf("cannot read project file: %w", err)
324328
}
325329

326330
projectBytes = append([]byte(multiGroup), projectBytes...)
327331
err = os.WriteFile(filepath.Join(t.Dir, "PROJECT"), projectBytes, 0o644)
328332
if err != nil {
329-
return err
333+
return fmt.Errorf("could not write to project file: %w", err)
330334
}
331335
return nil
332336
}

‎test/e2e/utils/webhooks.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ func ImplementWebhooks(filename, lowerKind string) error {
2828
//nolint:gosec // false positive
2929
bs, err := os.ReadFile(filename)
3030
if err != nil {
31-
return err
31+
return fmt.Errorf("error reading webhooks file %q: %w", filename, err)
3232
}
3333
str := string(bs)
3434

@@ -38,7 +38,7 @@ func ImplementWebhooks(filename, lowerKind string) error {
3838
`import (
3939
"errors"`)
4040
if err != nil {
41-
return err
41+
return fmt.Errorf("error replacing imports in webhooks file %q: %w", filename, err)
4242
}
4343

4444
// implement defaulting webhook logic
@@ -51,7 +51,7 @@ func ImplementWebhooks(filename, lowerKind string) error {
5151
replace,
5252
)
5353
if err != nil {
54-
return err
54+
return fmt.Errorf("error replacing default logic in webhooks file %q: %w", filename, err)
5555
}
5656

5757
// implement validation webhook logic
@@ -62,7 +62,7 @@ func ImplementWebhooks(filename, lowerKind string) error {
6262
return nil, errors.New(".spec.count must >= 0")
6363
}`, lowerKind))
6464
if err != nil {
65-
return err
65+
return fmt.Errorf("error replacing validation logic in webhooks file %q: %w", filename, err)
6666
}
6767
str, err = util.EnsureExistAndReplace(
6868
str,
@@ -71,8 +71,12 @@ func ImplementWebhooks(filename, lowerKind string) error {
7171
return nil, errors.New(".spec.count must >= 0")
7272
}`, lowerKind))
7373
if err != nil {
74-
return err
74+
return fmt.Errorf("error replacing validation logic in webhooks file %q: %w", filename, err)
7575
}
7676
//nolint:gosec // false positive
77-
return os.WriteFile(filename, []byte(str), 0o644)
77+
if writeFileErr := os.WriteFile(filename, []byte(str), 0o644); writeFileErr != nil {
78+
return fmt.Errorf("error writing webhooks file %q: %w", filename, writeFileErr)
79+
}
80+
81+
return nil
7882
}

‎test/e2e/v4/plugin_cluster_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -621,17 +621,17 @@ func removeCurlPod(kbc *utils.TestContext) {
621621
// TokenRequest API in raw format in order to make it generic for all version of the k8s that
622622
// is currently being supported in kubebuilder test infra.
623623
// TokenRequest API returns the token in raw JWT format itself. There is no conversion required.
624-
func serviceAccountToken(kbc *utils.TestContext) (out string, err error) {
624+
func serviceAccountToken(kbc *utils.TestContext) (string, error) {
625+
var out string
626+
625627
secretName := fmt.Sprintf("%s-token-request", kbc.Kubectl.ServiceAccount)
626628
tokenRequestFile := filepath.Join(kbc.Dir, secretName)
627-
err = os.WriteFile(tokenRequestFile, []byte(tokenRequestRawString), os.FileMode(0o755))
628-
if err != nil {
629-
return out, err
629+
if err := os.WriteFile(tokenRequestFile, []byte(tokenRequestRawString), os.FileMode(0o755)); err != nil {
630+
return out, fmt.Errorf("error creating token request file %s: %w", tokenRequestFile, err)
630631
}
631-
var rawJSON string
632632
getToken := func(g Gomega) {
633633
// Output of this is already a valid JWT token. No need to covert this from base64 to string format
634-
rawJSON, err = kbc.Kubectl.Command(
634+
rawJSON, err := kbc.Kubectl.Command(
635635
"create",
636636
"--raw", fmt.Sprintf(
637637
"/api/v1/namespaces/%s/serviceaccounts/%s/token",
@@ -650,5 +650,5 @@ func serviceAccountToken(kbc *utils.TestContext) (out string, err error) {
650650
}
651651
Eventually(getToken, time.Minute, time.Second).Should(Succeed())
652652

653-
return out, err
653+
return out, nil
654654
}

0 commit comments

Comments
 (0)