Skip to content

Commit 3cc514d

Browse files
authored
fix(cli): Do not silently fail on find/List (#515)
1 parent 5149d1b commit 3cc514d

File tree

3 files changed

+34
-20
lines changed

3 files changed

+34
-20
lines changed

cmd/tk/args.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package main
22

33
import (
4+
"errors"
45
"os"
56
"path/filepath"
67

@@ -25,7 +26,7 @@ var workflowArgs = cli.Args{
2526
}
2627

2728
envs, err := tanka.FindEnvs(pwd, tanka.FindOpts{})
28-
if err != nil {
29+
if err != nil && !errors.As(err, &tanka.ErrParallel{}) {
2930
return nil
3031
}
3132

@@ -42,6 +43,6 @@ var workflowArgs = cli.Args{
4243
return reldirs
4344
}
4445

45-
return complete.PredictDirs("*").Predict(args)
46+
return complete.PredictFiles("*").Predict(args)
4647
}),
4748
}

pkg/tanka/errors.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ func (e ErrMultipleEnvs) Error() string {
2525
return fmt.Sprintf("found multiple Environments in '%s': \n - %s", e.path, strings.Join(e.names, "\n - "))
2626
}
2727

28-
// ErrParallel is an array of errors collected while parsing environments in parallel
28+
// ErrParallel is an array of errors collected while processing in parallel
2929
type ErrParallel struct {
3030
errors []error
3131
}
3232

3333
func (e ErrParallel) Error() string {
34-
returnErr := fmt.Sprintf("Unable to parse selected Environments:\n\n")
34+
returnErr := fmt.Sprintf("Errors occured during parallel processing:\n\n")
3535
for _, err := range e.errors {
36-
returnErr = fmt.Sprintf("%s- %s\n", returnErr, err.Error())
36+
returnErr = fmt.Sprintf("%s- %s\n\n", returnErr, err.Error())
3737
}
3838
return returnErr
3939
}

pkg/tanka/find.go

+28-15
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package tanka
22

33
import (
4+
"fmt"
45
"io/ioutil"
56
"os"
67
"path/filepath"
78

9+
"github.com/grafana/tanka/pkg/jsonnet/jpath"
810
"github.com/grafana/tanka/pkg/spec/v1alpha1"
11+
"github.com/pkg/errors"
912
"k8s.io/apimachinery/pkg/labels"
1013
)
1114

@@ -21,9 +24,9 @@ type FindOpts struct {
2124
// are not checked.
2225
func FindEnvs(path string, opts FindOpts) ([]*v1alpha1.Environment, error) {
2326
// find all environments at dir
24-
envs, err := find(path, Opts{JsonnetOpts: opts.JsonnetOpts})
25-
if err != nil {
26-
return nil, err
27+
envs, errs := find(path, Opts{JsonnetOpts: opts.JsonnetOpts})
28+
if errs != nil {
29+
return envs, ErrParallel{errors: errs}
2730
}
2831

2932
// optionally filter
@@ -42,18 +45,28 @@ func FindEnvs(path string, opts FindOpts) ([]*v1alpha1.Environment, error) {
4245
return filtered, nil
4346
}
4447

48+
func findErr(path string, err error) []error {
49+
return []error{fmt.Errorf("%s:\n %w", path, err)}
50+
}
51+
4552
// find implements the actual functionality described at 'FindEnvs'
46-
func find(path string, opts Opts) ([]*v1alpha1.Environment, error) {
53+
func find(path string, opts Opts) ([]*v1alpha1.Environment, []error) {
4754
// try if this has envs
4855
list, err := List(path, opts)
49-
if len(list) != 0 && err == nil {
56+
if err != nil &&
57+
// expected when looking for environments
58+
!errors.As(err, &jpath.ErrorNoBase{}) &&
59+
!errors.As(err, &jpath.ErrorFileNotFound{}) {
60+
return nil, findErr(path, err)
61+
}
62+
if len(list) != 0 {
5063
// it has. don't search deeper
5164
return list, nil
5265
}
5366

5467
stat, err := os.Stat(path)
5568
if err != nil {
56-
return nil, err
69+
return nil, findErr(path, err)
5770
}
5871

5972
// if path is a file, don't search deeper
@@ -64,7 +77,7 @@ func find(path string, opts Opts) ([]*v1alpha1.Environment, error) {
6477
// list directory
6578
files, err := ioutil.ReadDir(path)
6679
if err != nil {
67-
return nil, err
80+
return nil, findErr(path, err)
6881
}
6982

7083
// it's not one. Maybe subdirectories are?
@@ -82,31 +95,31 @@ func find(path string, opts Opts) ([]*v1alpha1.Environment, error) {
8295
}
8396

8497
// collect parallel results
85-
var lastErr error
98+
var errs []error
8699
var envs []*v1alpha1.Environment
87100

88101
for i := 0; i < routines; i++ {
89102
out := <-ch
90-
if out.err != nil {
91-
lastErr = out.err
103+
if out.errs != nil {
104+
errs = append(errs, out.errs...)
92105
}
93106

94107
envs = append(envs, out.envs...)
95108
}
96109

97-
if lastErr != nil {
98-
return nil, lastErr
110+
if len(errs) != 0 {
111+
return envs, errs
99112
}
100113

101114
return envs, nil
102115
}
103116

104117
type findOut struct {
105118
envs []*v1alpha1.Environment
106-
err error
119+
errs []error
107120
}
108121

109122
func findShim(dir string, opts Opts, ch chan findOut) {
110-
envs, err := find(dir, opts)
111-
ch <- findOut{envs: envs, err: err}
123+
envs, errs := find(dir, opts)
124+
ch <- findOut{envs: envs, errs: errs}
112125
}

0 commit comments

Comments
 (0)