Skip to content

Commit 0045d72

Browse files
nervghalexey-igrychev
authored andcommitted
refactor(sbom): reuse ContainerBackend.SaveImageToStream();
refactor(sbom): use mutate.Extract() Signed-off-by: Alexandr Zaytsev <[email protected]>
1 parent c902bec commit 0045d72

24 files changed

+164
-465
lines changed

cmd/werf/sbom/get/get.go

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package get
22

33
import (
4+
"bytes"
45
"context"
56
"fmt"
67
"io"
@@ -17,7 +18,6 @@ import (
1718
"github.com/werf/werf/v2/pkg/container_backend"
1819
"github.com/werf/werf/v2/pkg/giterminism_manager"
1920
"github.com/werf/werf/v2/pkg/sbom"
20-
"github.com/werf/werf/v2/pkg/sbom/finder"
2121
"github.com/werf/werf/v2/pkg/tmp_manager"
2222
"github.com/werf/werf/v2/pkg/true_git"
2323
"github.com/werf/werf/v2/pkg/werf/global_warnings"
@@ -219,20 +219,35 @@ func run(ctx context.Context, containerBackend container_backend.ContainerBacken
219219
return err
220220
}
221221

222-
sbomArtifactFinder := finder.NewFinder(containerBackend)
223-
224-
artifactFile, err := sbomArtifactFinder.FindArtifactFile(ctx, exportedImages, requestedImageName)
222+
sbomImageName, err := getSbomImageName(exportedImages, requestedImageName)
225223
if err != nil {
226-
return fmt.Errorf("find artifact file error: %w", err)
224+
return fmt.Errorf("unable to get SBOM image name: %w", err)
225+
}
226+
227+
opener := func() (io.ReadCloser, error) {
228+
return containerBackend.SaveImageToStream(ctx, sbomImageName)
227229
}
228-
if artifactFile == nil {
229-
return fmt.Errorf("artifact file is not found in SBOM image %q", sbom.ImageName(requestedImageName))
230+
231+
artifactContent, err := sbom.FindSingleSbomArtifact(opener)
232+
if err != nil {
233+
return fmt.Errorf("unable to find artifact file: %w", err)
230234
}
231235

232236
return logboek.Streams().DoErrorWithoutProxyStreamDataFormatting(func() error {
233-
if _, err = io.Copy(os.Stdout, artifactFile); err != nil {
237+
if _, err = io.Copy(os.Stdout, bytes.NewReader(artifactContent)); err != nil {
234238
return fmt.Errorf("unable to redirect artifact file content into stdout: %w", err)
235239
}
236240
return nil
237241
})
238242
}
243+
244+
func getSbomImageName(exportedImages []*image.Image, requestedImageName string) (string, error) {
245+
foundImage, ok := lo.Find(exportedImages, func(item *image.Image) bool {
246+
return item.Name == requestedImageName
247+
})
248+
if !ok {
249+
return "", fmt.Errorf("unable to find requested image %q", requestedImageName)
250+
}
251+
252+
return sbom.ImageName(foundImage.GetLastNonEmptyStage().GetStageImage().Image.GetStageDesc().Info.Name), nil
253+
}

pkg/buildah/common.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package buildah
22

33
import (
4-
"bytes"
54
"context"
65
"fmt"
76
"io"
@@ -215,7 +214,6 @@ type Buildah interface {
215214
PruneImages(ctx context.Context, opts PruneImagesOptions) (PruneImagesReport, error)
216215
SaveImageToStream(ctx context.Context, imageName string) (io.ReadCloser, error)
217216
LoadImageFromStream(ctx context.Context, input io.Reader) (string, error)
218-
DumpImage(ctx context.Context, ref string, opts StreamOpts) (*bytes.Reader, error)
219217
}
220218

221219
type Mode string

pkg/buildah/native_linux.go

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -334,49 +334,6 @@ func (b *NativeBuildah) Push(ctx context.Context, ref string, opts PushOpts) err
334334
return nil
335335
}
336336

337-
func (b *NativeBuildah) DumpImage(ctx context.Context, ref string, opts StreamOpts) (*bytes.Reader, error) {
338-
// NOTICE: targetPlatform specified for push causes buildah to fail for some unknown reason
339-
sysCtx, err := b.getSystemContext("")
340-
if err != nil {
341-
return nil, err
342-
}
343-
344-
tmpFile, err := os.CreateTemp(b.TmpDir, "buildah-img-******.tar")
345-
if err != nil {
346-
return nil, err
347-
}
348-
defer tmpFile.Close()
349-
defer os.Remove(tmpFile.Name())
350-
351-
pushOpts := buildah.PushOptions{
352-
Compression: define.Uncompressed,
353-
SignaturePolicyPath: b.SignaturePolicyPath,
354-
ReportWriter: opts.LogWriter,
355-
Store: b.Store,
356-
SystemContext: sysCtx,
357-
ManifestType: manifest.DockerV2Schema2MediaType,
358-
}
359-
360-
// NOTE: Here we use "docker-archive" transport on [email protected] to disable gzip compression.
361-
// Is there any way to disable gzip compression with "oci-archive" transport using go code?
362-
// In e2e this approach works with Buildah CLI.
363-
destinationRef, err := alltransports.ParseImageName(fmt.Sprintf("docker-archive:%s", tmpFile.Name()))
364-
if err != nil {
365-
return nil, fmt.Errorf("error parsing destination ref from %q: %w", tmpFile.Name(), err)
366-
}
367-
368-
if _, _, err = buildah.Push(ctx, ref, destinationRef, pushOpts); err != nil {
369-
return nil, fmt.Errorf("error pushing image %q: %w", ref, err)
370-
}
371-
372-
bSlice, err := os.ReadFile(tmpFile.Name())
373-
if err != nil {
374-
return nil, fmt.Errorf("unable to bufferize image data: %w", err)
375-
}
376-
377-
return bytes.NewReader(bSlice), nil
378-
}
379-
380337
func (b *NativeBuildah) BuildFromDockerfile(ctx context.Context, dockerfile string, opts BuildFromDockerfileOpts) (string, error) {
381338
var targetPlatform string
382339
var targetPlatforms []struct{ OS, Arch, Variant string }

pkg/container_backend/buildah_backend.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1205,9 +1205,3 @@ func mapSbomScanOptionsToBuidahBackendScanOptions(scanOpts scanner.ScanOptions)
12051205
Commands: []string{scanCmd.String()},
12061206
}
12071207
}
1208-
1209-
func (backend *BuildahBackend) DumpImage(ctx context.Context, ref string) (*bytes.Reader, error) {
1210-
return backend.buildah.DumpImage(ctx, ref, buildah.StreamOpts{
1211-
LogWriter: io.Discard,
1212-
})
1213-
}

pkg/container_backend/docker_server_backend.go

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package container_backend
22

33
import (
4-
"bytes"
54
"context"
65
"errors"
76
"fmt"
@@ -500,23 +499,6 @@ func (backend *DockerServerBackend) GenerateSBOM(ctx context.Context, scanOpts s
500499
return imageId, nil
501500
}
502501

503-
func (backend *DockerServerBackend) DumpImage(ctx context.Context, ref string) (*bytes.Reader, error) {
504-
rc, err := docker.ImageSave(ctx, ref)
505-
if err != nil {
506-
return nil, fmt.Errorf("unable to open image streaming %q: %w", ref, err)
507-
}
508-
buf := &bytes.Buffer{}
509-
510-
if _, err = io.Copy(buf, rc); err != nil {
511-
return nil, fmt.Errorf("unable to bufferize image data: %w", err)
512-
}
513-
if err = rc.Close(); err != nil {
514-
return nil, fmt.Errorf("unable to close image streaming: %w", err)
515-
}
516-
517-
return bytes.NewReader(buf.Bytes()), nil
518-
}
519-
520502
func mapSbomScanCommandsToSbomBillNames(commands []scanner.ScanCommand) []string {
521503
return lo.Map(commands, func(scanCmd scanner.ScanCommand, _ int) string {
522504
return filepath.Join(scanCmd.OutputStandard.String(), fmt.Sprintf("%s.json", scanCmd.Checksum()))

pkg/container_backend/interface.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package container_backend
22

33
import (
4-
"bytes"
54
"context"
65
"io"
76

@@ -111,9 +110,6 @@ type ContainerBackend interface {
111110
// PruneVolumes removes all anonymous volumes not used by at least one container
112111
PruneVolumes(ctx context.Context, options prune.Options) (prune.Report, error)
113112

114-
// DumpImage streams image using bytes reader
115-
DumpImage(ctx context.Context, ref string) (*bytes.Reader, error)
116-
117113
// GenerateSBOM scans and generates SBOM from source image into another destination image
118114
GenerateSBOM(ctx context.Context, scanOpts scanner.ScanOptions, dstImgLabels []string) (string, error)
119115

pkg/container_backend/perf_check_container_backend.go

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package container_backend
22

33
import (
4-
"bytes"
54
"context"
65
"io"
76

@@ -225,14 +224,6 @@ func (runtime *PerfCheckContainerBackend) LoadImageFromStream(ctx context.Contex
225224
return runtime.ContainerBackend.LoadImageFromStream(ctx, input)
226225
}
227226

228-
func (runtime *PerfCheckContainerBackend) DumpImage(ctx context.Context, ref string) (reader *bytes.Reader, err error) {
229-
logboek.Context(ctx).Default().LogProcess("ContainerBackend.DumpImage %v", ref).
230-
Do(func() {
231-
reader, err = runtime.ContainerBackend.DumpImage(ctx, ref)
232-
})
233-
return
234-
}
235-
236227
func (runtime *PerfCheckContainerBackend) GenerateSBOM(ctx context.Context, scanOpts scanner.ScanOptions, dstImgLabels []string) (imgId string, err error) {
237228
logboek.Context(ctx).Default().LogProcess("ContainerBackend.GenerateSBOM scanOpts=%+v, dstImgLabels=%v", scanOpts, dstImgLabels).
238229
Do(func() {

pkg/container_backend/stream_reader/file.go

Lines changed: 0 additions & 27 deletions
This file was deleted.

pkg/container_backend/stream_reader/reader.go

Lines changed: 0 additions & 118 deletions
This file was deleted.

0 commit comments

Comments
 (0)