Skip to content

Commit 5dadeac

Browse files
authored
Merge pull request #4737 from kersten/chore/error-wrapping-in-cli-generator
🌱 (chore): improve error wrapping for generate command execution
2 parents ba53421 + 24b6b9d commit 5dadeac

File tree

1 file changed

+61
-36
lines changed

1 file changed

+61
-36
lines changed

pkg/cli/alpha/internal/generate.go

Lines changed: 61 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,12 @@ func (opts *Generate) Generate() error {
5252
}
5353

5454
if opts.OutputDir == "" {
55-
cwd, err := os.Getwd()
56-
if err != nil {
57-
return fmt.Errorf("failed to get working directory: %w", err)
55+
cwd, getWdErr := os.Getwd()
56+
if getWdErr != nil {
57+
return fmt.Errorf("failed to get working directory: %w", getWdErr)
5858
}
5959
opts.OutputDir = cwd
60-
if _, err := os.Stat(opts.OutputDir); err == nil {
60+
if _, err = os.Stat(opts.OutputDir); err == nil {
6161
log.Warn("Using current working directory to re-scaffold the project")
6262
log.Warn("This directory will be cleaned up and all files removed before the re-generation")
6363

@@ -69,40 +69,41 @@ func (opts *Generate) Generate() error {
6969
err = util.RunCmd("Running cleanup", "sh", "-c", cleanupCmd)
7070
if err != nil {
7171
log.Error("Cleanup failed:", err)
72-
return err
72+
return fmt.Errorf("cleanup failed: %w", err)
7373
}
7474
}
7575
}
7676

77-
if err := createDirectory(opts.OutputDir); err != nil {
78-
return err
77+
if err = createDirectory(opts.OutputDir); err != nil {
78+
return fmt.Errorf("error creating output directory %q: %w", opts.OutputDir, err)
7979
}
8080

81-
if err := changeWorkingDirectory(opts.OutputDir); err != nil {
82-
return err
81+
if err = changeWorkingDirectory(opts.OutputDir); err != nil {
82+
return fmt.Errorf("error changing working directory %q: %w", opts.OutputDir, err)
8383
}
8484

85-
if err := kubebuilderInit(projectConfig); err != nil {
86-
return err
85+
if err = kubebuilderInit(projectConfig); err != nil {
86+
return fmt.Errorf("error initializing project config: %w", err)
8787
}
8888

89-
if err := kubebuilderEdit(projectConfig); err != nil {
90-
return err
89+
if err = kubebuilderEdit(projectConfig); err != nil {
90+
return fmt.Errorf("error editing project config: %w", err)
9191
}
9292

93-
if err := kubebuilderCreate(projectConfig); err != nil {
94-
return err
93+
if err = kubebuilderCreate(projectConfig); err != nil {
94+
return fmt.Errorf("error creating project config: %w", err)
9595
}
9696

97-
if err := migrateGrafanaPlugin(projectConfig, opts.InputDir, opts.OutputDir); err != nil {
98-
return err
97+
if err = migrateGrafanaPlugin(projectConfig, opts.InputDir, opts.OutputDir); err != nil {
98+
return fmt.Errorf("error migrating Grafana plugin: %w", err)
9999
}
100100

101101
if hasHelmPlugin(projectConfig) {
102-
if err := kubebuilderHelmEdit(); err != nil {
103-
return err
102+
if err = kubebuilderHelmEdit(); err != nil {
103+
return fmt.Errorf("error editing Helm plugin: %w", err)
104104
}
105105
}
106+
106107
return migrateDeployImagePlugin(projectConfig)
107108
}
108109

@@ -111,7 +112,7 @@ func (opts *Generate) Validate() error {
111112
var err error
112113
opts.InputDir, err = getInputPath(opts.InputDir)
113114
if err != nil {
114-
return err
115+
return fmt.Errorf("error getting input path %q: %w", opts.InputDir, err)
115116
}
116117

117118
_, err = exec.LookPath("kubebuilder")
@@ -134,31 +135,38 @@ func loadProjectConfig(inputDir string) (store.Store, error) {
134135
// Helper function to create the output directory.
135136
func createDirectory(outputDir string) error {
136137
if err := os.MkdirAll(outputDir, 0o755); err != nil {
137-
return fmt.Errorf("failed to create output directory %s: %w", outputDir, err)
138+
return fmt.Errorf("failed to create output directory %q: %w", outputDir, err)
138139
}
139140
return nil
140141
}
141142

142143
// Helper function to change the current working directory.
143144
func changeWorkingDirectory(outputDir string) error {
144145
if err := os.Chdir(outputDir); err != nil {
145-
return fmt.Errorf("failed to change the working directory to %s: %w", outputDir, err)
146+
return fmt.Errorf("failed to change the working directory to %q: %w", outputDir, err)
146147
}
147148
return nil
148149
}
149150

150151
// Initializes the project with Kubebuilder.
151152
func kubebuilderInit(s store.Store) error {
152153
args := append([]string{"init"}, getInitArgs(s)...)
153-
return util.RunCmd("kubebuilder init", "kubebuilder", args...)
154+
if err := util.RunCmd("kubebuilder init", "kubebuilder", args...); err != nil {
155+
return fmt.Errorf("failed to run kubebuilder init command: %w", err)
156+
}
157+
158+
return nil
154159
}
155160

156161
// Edits the project to enable or disable multigroup layout.
157162
func kubebuilderEdit(s store.Store) error {
158163
if s.Config().IsMultiGroup() {
159164
args := []string{"edit", "--multigroup"}
160-
return util.RunCmd("kubebuilder edit", "kubebuilder", args...)
165+
if err := util.RunCmd("kubebuilder edit", "kubebuilder", args...); err != nil {
166+
return fmt.Errorf("failed to run kubebuilder edit command: %w", err)
167+
}
161168
}
169+
162170
return nil
163171
}
164172

@@ -171,15 +179,15 @@ func kubebuilderCreate(s store.Store) error {
171179

172180
// First, scaffold all APIs
173181
for _, r := range resources {
174-
if err := createAPI(r); err != nil {
182+
if err = createAPI(r); err != nil {
175183
return fmt.Errorf("failed to create API for %s/%s/%s: %w", r.Group, r.Version, r.Kind, err)
176184
}
177185
}
178186

179187
// Then, scaffold all webhooks
180188
// We cannot create a webhook for an API that does not exist
181189
for _, r := range resources {
182-
if err := createWebhook(r); err != nil {
190+
if err = createWebhook(r); err != nil {
183191
return fmt.Errorf("failed to create webhook for %s/%s/%s: %w", r.Group, r.Version, r.Kind, err)
184192
}
185193
}
@@ -198,12 +206,12 @@ func migrateGrafanaPlugin(s store.Store, src, des string) error {
198206
return fmt.Errorf("failed to decode grafana plugin config: %w", err)
199207
}
200208

201-
if err := kubebuilderGrafanaEdit(); err != nil {
202-
return err
209+
if err = kubebuilderGrafanaEdit(); err != nil {
210+
return fmt.Errorf("error editing Grafana plugin: %w", err)
203211
}
204212

205-
if err := grafanaConfigMigrate(src, des); err != nil {
206-
return err
213+
if err = grafanaConfigMigrate(src, des); err != nil {
214+
return fmt.Errorf("error migrating Grafana config: %w", err)
207215
}
208216

209217
return kubebuilderGrafanaEdit()
@@ -233,7 +241,11 @@ func migrateDeployImagePlugin(s store.Store) error {
233241
func createAPIWithDeployImage(resourceData v1alpha1.ResourceData) error {
234242
args := append([]string{"create", "api"}, getGVKFlagsFromDeployImage(resourceData)...)
235243
args = append(args, getDeployImageOptions(resourceData)...)
236-
return util.RunCmd("kubebuilder create api", "kubebuilder", args...)
244+
if err := util.RunCmd("kubebuilder create api", "kubebuilder", args...); err != nil {
245+
return fmt.Errorf("failed to run kubebuilder create api command: %w", err)
246+
}
247+
248+
return nil
237249
}
238250

239251
// Helper function to get input path.
@@ -247,7 +259,7 @@ func getInputPath(inputPath string) (string, error) {
247259
}
248260
projectPath := fmt.Sprintf("%s/%s", inputPath, yaml.DefaultPath)
249261
if _, err := os.Stat(projectPath); os.IsNotExist(err) {
250-
return "", fmt.Errorf("project path %s does not exist: %w", projectPath, err)
262+
return "", fmt.Errorf("project path %q does not exist: %w", projectPath, err)
251263
}
252264
return inputPath, nil
253265
}
@@ -349,7 +361,11 @@ func createAPI(res resource.Resource) error {
349361
args = append(args, "--external-api-domain", res.Domain)
350362
}
351363

352-
return util.RunCmd("kubebuilder create api", "kubebuilder", args...)
364+
if err := util.RunCmd("kubebuilder create api", "kubebuilder", args...); err != nil {
365+
return fmt.Errorf("failed to run kubebuilder create api command: %w", err)
366+
}
367+
368+
return nil
353369
}
354370

355371
// Gets flags for API resource creation.
@@ -381,7 +397,12 @@ func createWebhook(res resource.Resource) error {
381397
}
382398
args := append([]string{"create", "webhook"}, getGVKFlags(res)...)
383399
args = append(args, getWebhookResourceFlags(res)...)
384-
return util.RunCmd("kubebuilder create webhook", "kubebuilder", args...)
400+
401+
if err := util.RunCmd("kubebuilder create webhook", "kubebuilder", args...); err != nil {
402+
return fmt.Errorf("failed to run kubebuilder create webhook command: %w", err)
403+
}
404+
405+
return nil
385406
}
386407

387408
// Gets flags for webhook creation.
@@ -412,9 +433,13 @@ func getWebhookResourceFlags(res resource.Resource) []string {
412433
func copyFile(src, des string) error {
413434
bytesRead, err := os.ReadFile(src)
414435
if err != nil {
415-
return fmt.Errorf("source file path %s does not exist: %w", src, err)
436+
return fmt.Errorf("source file path %q does not exist: %w", src, err)
416437
}
417-
return os.WriteFile(des, bytesRead, 0o755)
438+
if err = os.WriteFile(des, bytesRead, 0o755); err != nil {
439+
return fmt.Errorf("failed to write file %q: %w", des, err)
440+
}
441+
442+
return nil
418443
}
419444

420445
// Migrates Grafana configuration files.

0 commit comments

Comments
 (0)