Skip to content

✨ (API) add contextual error wrapping for external plugin helpers #4754

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions pkg/plugins/external/external_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,12 @@ func (m *mockValidFlagOutputGetter) GetExecOutput(_ []byte, _ string) ([]byte, e
Universe: nil,
Flags: getFlags(),
}
return json.Marshal(response)
marshaledResponse, err := json.Marshal(response)
if err != nil {
return nil, fmt.Errorf("error marshalling response: %w", err)
}

return marshaledResponse, nil
}

type mockValidMEOutputGetter struct{}
Expand All @@ -97,7 +102,12 @@ func (m *mockValidMEOutputGetter) GetExecOutput(_ []byte, _ string) ([]byte, err
Metadata: getMetadata(),
}

return json.Marshal(response)
marshaledResponse, err := json.Marshal(response)
if err != nil {
return nil, fmt.Errorf("error marshalling response: %w", err)
}

return marshaledResponse, nil
}

const (
Expand Down
38 changes: 19 additions & 19 deletions pkg/plugins/external/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ func (e *execOutputGetter) GetExecOutput(request []byte, path string) ([]byte, e
cmd.Stderr = os.Stderr
out, err := cmd.Output()
if err != nil {
return nil, err
return nil, fmt.Errorf("error getting output for cmd %q: %w", cmd, err)
}

return out, nil
Expand All @@ -84,17 +84,17 @@ func (o *osWdGetter) GetCurrentDir() (string, error) {
func makePluginRequest(req external.PluginRequest, path string) (*external.PluginResponse, error) {
reqBytes, err := json.Marshal(req)
if err != nil {
return nil, err
return nil, fmt.Errorf("error marshalling plugin request: %w", err)
}

out, err := outputGetter.GetExecOutput(reqBytes, path)
if err != nil {
return nil, err
return nil, fmt.Errorf("error executing plugin request: %w", err)
}

res := external.PluginResponse{}
if err := json.Unmarshal(out, &res); err != nil {
return nil, err
if err = json.Unmarshal(out, &res); err != nil {
return nil, fmt.Errorf("error unmarshalling plugin response: %w", err)
}

// Error if the plugin failed.
Expand All @@ -114,7 +114,7 @@ func getUniverseMap(fs machinery.Filesystem) (map[string]string, error) {

err := afero.Walk(fs.FS, ".", func(path string, info iofs.FileInfo, err error) error {
if err != nil {
return err
return fmt.Errorf("error walking path %q: %w", path, err)
}

if info.IsDir() {
Expand All @@ -123,7 +123,7 @@ func getUniverseMap(fs machinery.Filesystem) (map[string]string, error) {

file, err := fs.FS.Open(path)
if err != nil {
return err
return fmt.Errorf("error opening file %q: %w", path, err)
}

defer func() {
Expand All @@ -134,15 +134,15 @@ func getUniverseMap(fs machinery.Filesystem) (map[string]string, error) {

content, err := io.ReadAll(file)
if err != nil {
return err
return fmt.Errorf("error reading file %q: %w", path, err)
}

universe[path] = string(content)

return nil
})
if err != nil {
return nil, err
return nil, fmt.Errorf("error walking the directory: %w", err)
}

return universe, nil
Expand All @@ -153,7 +153,7 @@ func handlePluginResponse(fs machinery.Filesystem, req external.PluginRequest, p

req.Universe, err = getUniverseMap(fs)
if err != nil {
return err
return fmt.Errorf("error getting universe map: %w", err)
}

res, err := makePluginRequest(req, path)
Expand All @@ -167,27 +167,27 @@ func handlePluginResponse(fs machinery.Filesystem, req external.PluginRequest, p
}

for filename, data := range res.Universe {
path := filepath.Join(currentDir, filename)
dir := filepath.Dir(path)
file := filepath.Join(currentDir, filename)
dir := filepath.Dir(file)

// create the directory if it does not exist
if err := os.MkdirAll(dir, 0o750); err != nil {
if err = os.MkdirAll(dir, 0o750); err != nil {
return fmt.Errorf("error creating the directory: %w", err)
}

f, err := fs.FS.Create(path)
if err != nil {
return err
f, createErr := fs.FS.Create(file)
if createErr != nil {
return fmt.Errorf("error creating file %q: %w", file, createErr)
}

defer func() {
if err := f.Close(); err != nil {
if err = f.Close(); err != nil {
return
}
}()

if _, err := f.Write([]byte(data)); err != nil {
return err
if _, err = f.Write([]byte(data)); err != nil {
return fmt.Errorf("error writing file %q: %w", file, err)
}
}

Expand Down