fix: allow template for syft convert (#1521)

This commit is contained in:
Keith Zantow 2023-01-26 12:07:36 -05:00 committed by GitHub
parent 8c91605541
commit ba55963104
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 43 additions and 49 deletions

View File

@ -11,9 +11,9 @@ import (
"github.com/anchore/syft/syft" "github.com/anchore/syft/syft"
) )
func Run(ctx context.Context, app *config.Application, args []string) error { func Run(_ context.Context, app *config.Application, args []string) error {
log.Warn("convert is an experimental feature, run `syft convert -h` for help") log.Warn("convert is an experimental feature, run `syft convert -h` for help")
writer, err := options.MakeWriter(app.Outputs, app.File, "") writer, err := options.MakeWriter(app.Outputs, app.File, app.OutputTemplatePath)
if err != nil { if err != nil {
return err return err
} }
@ -30,7 +30,9 @@ func Run(ctx context.Context, app *config.Application, args []string) error {
if err != nil { if err != nil {
return fmt.Errorf("failed to open SBOM file: %w", err) return fmt.Errorf("failed to open SBOM file: %w", err)
} }
defer f.Close() defer func() {
_ = f.Close()
}()
sbom, _, err := syft.Decode(f) sbom, _, err := syft.Decode(f)
if err != nil { if err != nil {

View File

@ -1,6 +1,7 @@
package cli package cli
import ( import (
"fmt"
"os" "os"
"path/filepath" "path/filepath"
"strings" "strings"
@ -9,13 +10,8 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
type conversion struct {
To string
From string
}
func TestConvertCmdFlags(t *testing.T) { func TestConvertCmdFlags(t *testing.T) {
commonAssertions := []traitAssertion{ assertions := []traitAssertion{
func(tb testing.TB, stdout, _ string, _ int) { func(tb testing.TB, stdout, _ string, _ int) {
tb.Helper() tb.Helper()
if len(stdout) < 1000 { if len(stdout) < 1000 {
@ -26,52 +22,48 @@ func TestConvertCmdFlags(t *testing.T) {
} }
tests := []struct { tests := []struct {
name string to string
conversions []conversion from string
env map[string]string template string
assertions []traitAssertion env map[string]string
}{ }{
{ {to: "syft-json", from: "spdx-json"},
name: "syft-format convertable to spdx-json", {to: "syft-json", from: "cyclonedx-json"},
conversions: []conversion{ {to: "spdx-json", from: "syft-json"},
{To: "syft-json", From: "spdx-json"}, {to: "template", from: "syft-json", template: "test-fixtures/csv.template"},
{To: "syft-json", From: "cyclonedx-json"}, {to: "spdx-json", from: "cyclonedx-json"},
{To: "spdx-json", From: "syft-json"}, {to: "cyclonedx-json", from: "syft-json"},
{To: "spdx-json", From: "cyclonedx-json"}, {to: "cyclonedx-json", from: "spdx-json"},
{To: "cyclonedx-json", From: "syft-json"},
{To: "cyclonedx-json", From: "spdx-json"},
},
assertions: commonAssertions,
},
} }
for _, test := range tests { for _, test := range tests {
t.Run(test.name, func(t *testing.T) { t.Run(fmt.Sprintf("from %s to %s", test.from, test.to), func(t *testing.T) {
for _, c := range test.conversions { sbomArgs := []string{"dir:./test-fixtures/image-pkg-coverage", "-o", test.from}
sbomArgs := []string{"dir:./test-fixtures/image-pkg-coverage", "-o", c.From} cmd, stdout, stderr := runSyft(t, test.env, sbomArgs...)
cmd, stdout, stderr := runSyft(t, test.env, sbomArgs...) if cmd.ProcessState.ExitCode() != 0 {
if cmd.ProcessState.ExitCode() != 0 { t.Log("STDOUT:\n", stdout)
t.Fatalf("failure executing syft creating an sbom") t.Log("STDERR:\n", stderr)
t.Log("STDOUT:\n", stdout) t.Log("COMMAND:", strings.Join(cmd.Args, " "))
t.Log("STDERR:\n", stderr) t.Fatalf("failure executing syft creating an sbom")
t.Log("COMMAND:", strings.Join(cmd.Args, " ")) return
return }
}
tempDir := t.TempDir() tempDir := t.TempDir()
sbomFile := filepath.Join(tempDir, "sbom.json") sbomFile := filepath.Join(tempDir, "sbom.json")
require.NoError(t, os.WriteFile(sbomFile, []byte(stdout), 0666)) require.NoError(t, os.WriteFile(sbomFile, []byte(stdout), 0666))
convertArgs := []string{"convert", sbomFile, "-o", c.To} convertArgs := []string{"convert", sbomFile, "-o", test.to}
cmd, stdout, stderr = runSyft(t, test.env, convertArgs...) if test.template != "" {
for _, traitFn := range test.assertions { convertArgs = append(convertArgs, "--template", test.template)
traitFn(t, stdout, stderr, cmd.ProcessState.ExitCode()) }
} cmd, stdout, stderr = runSyft(t, test.env, convertArgs...)
if t.Failed() { for _, traitFn := range assertions {
t.Log("STDOUT:\n", stdout) traitFn(t, stdout, stderr, cmd.ProcessState.ExitCode())
t.Log("STDERR:\n", stderr) }
t.Log("COMMAND:", strings.Join(cmd.Args, " ")) if t.Failed() {
} t.Log("STDOUT:\n", stdout)
t.Log("STDERR:\n", stderr)
t.Log("COMMAND:", strings.Join(cmd.Args, " "))
} }
}) })
} }