From 848f0cea38171b9c20e9709d3e051269eb22c038 Mon Sep 17 00:00:00 2001 From: cpanato Date: Sun, 3 Mar 2024 12:06:36 -0500 Subject: [PATCH 1/2] add import yaml function --- pkg/advisory/import.go | 63 +++++++++++++++++++++++++++++++++++++ pkg/advisory/import_test.go | 39 +++++++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 pkg/advisory/import.go create mode 100644 pkg/advisory/import_test.go diff --git a/pkg/advisory/import.go b/pkg/advisory/import.go new file mode 100644 index 00000000..1fbeb99c --- /dev/null +++ b/pkg/advisory/import.go @@ -0,0 +1,63 @@ +package advisory + +import ( + "bytes" + "context" + "fmt" + "os" + "path/filepath" + + "gopkg.in/yaml.v3" + + "github.com/wolfi-dev/wolfictl/pkg/configs" + v2 "github.com/wolfi-dev/wolfictl/pkg/configs/advisory/v2" + rwos "github.com/wolfi-dev/wolfictl/pkg/configs/rwfs/os" +) + +// ImporAdvisoriesYAML import and yaml Advisories data and present as a config index struct +func ImporAdvisoriesYAML(inputData string) (tempDir string, documents *configs.Index[v2.Document], err error) { + inputAdv, err := os.ReadFile(inputData) + if err != nil { + return "", nil, fmt.Errorf("unable to create output file: %v", err) + } + + yamlDocs := bytes.Split(inputAdv, []byte("\n---\n")) + // Unmarshal YAML documents + var docs []v2.Document + for _, doc := range yamlDocs { + var pkg v2.Document + err = yaml.Unmarshal(doc, &pkg) + if err != nil { + return "", nil, fmt.Errorf("unable to unmarshall input file: %v", err) + } + + docs = append(docs, pkg) + } + + tempDir = os.TempDir() + for _, doc := range docs { + f, err := os.Create(filepath.Join(tempDir, fmt.Sprintf("%s.advisories.yaml", doc.Name()))) + if err != nil { + return "", nil, fmt.Errorf("failed to create adv file: %v", err) + } + + d, err := yaml.Marshal(doc) + if err != nil { + return "", nil, fmt.Errorf("failed to marshal package %q: %v", doc.Package.Name, err) + } + _, err = f.Write(d) + if err != nil { + return "", nil, fmt.Errorf("failed save data to file: %v", err) + } + + f.Close() + } + + advisoryFsys := rwos.DirFS(tempDir) + advisoryDocIndices, err := v2.NewIndex(context.Background(), advisoryFsys) + if err != nil { + return "", nil, fmt.Errorf("unable to index advisory configs for directory %q: %v", tempDir, err) + } + + return tempDir, advisoryDocIndices, nil +} diff --git a/pkg/advisory/import_test.go b/pkg/advisory/import_test.go new file mode 100644 index 00000000..312bfcb1 --- /dev/null +++ b/pkg/advisory/import_test.go @@ -0,0 +1,39 @@ +package advisory + +import ( + "context" + "os" + "testing" + + "github.com/stretchr/testify/require" + v2 "github.com/wolfi-dev/wolfictl/pkg/configs/advisory/v2" + rwos "github.com/wolfi-dev/wolfictl/pkg/configs/rwfs/os" +) + +func Test_ImportAdvisoriesYAML(t *testing.T) { + const testdataDir = "./testdata/export/advisories" + + cases := []struct { + name string + pathToInputData string + }{ + { + name: "test-yaml", + pathToInputData: "./testdata/export/expected.yaml", + }, + } + + for _, tt := range cases { + t.Run(tt.name, func(t *testing.T) { + advisoryFsys := rwos.DirFS(testdataDir) + advisoryDocs, err := v2.NewIndex(context.Background(), advisoryFsys) + require.NoError(t, err) + + tempDir, importedDocuments, err := ImporAdvisoriesYAML(tt.pathToInputData) + require.NoError(t, err) + require.Equal(t, advisoryDocs.Select().Len(), importedDocuments.Select().Len()) + + defer os.RemoveAll(tempDir) + }) + } +} From 685e483e591bd98ab228a5d11dc854f92c81f9c3 Mon Sep 17 00:00:00 2001 From: cpanato Date: Sun, 3 Mar 2024 16:48:14 -0500 Subject: [PATCH 2/2] update go.mod --- go.mod | 4 +--- pkg/advisory/import_test.go | 6 ++---- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index be365940..604cea7d 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,6 @@ module github.com/wolfi-dev/wolfictl -go 1.21.3 - -toolchain go1.21.5 +go 1.21.7 require ( chainguard.dev/apko v0.14.1-0.20240227175428-53cb29ff83c9 diff --git a/pkg/advisory/import_test.go b/pkg/advisory/import_test.go index 312bfcb1..b055f327 100644 --- a/pkg/advisory/import_test.go +++ b/pkg/advisory/import_test.go @@ -2,10 +2,10 @@ package advisory import ( "context" - "os" "testing" "github.com/stretchr/testify/require" + v2 "github.com/wolfi-dev/wolfictl/pkg/configs/advisory/v2" rwos "github.com/wolfi-dev/wolfictl/pkg/configs/rwfs/os" ) @@ -29,11 +29,9 @@ func Test_ImportAdvisoriesYAML(t *testing.T) { advisoryDocs, err := v2.NewIndex(context.Background(), advisoryFsys) require.NoError(t, err) - tempDir, importedDocuments, err := ImporAdvisoriesYAML(tt.pathToInputData) + _, importedDocuments, err := ImporAdvisoriesYAML(tt.pathToInputData) require.NoError(t, err) require.Equal(t, advisoryDocs.Select().Len(), importedDocuments.Select().Len()) - - defer os.RemoveAll(tempDir) }) } }