From 9596f6db61db4da88c3ff58ebafffacde871191d Mon Sep 17 00:00:00 2001 From: Timofey Kirillov Date: Fri, 15 Apr 2022 14:51:28 +0300 Subject: [PATCH] feat(stapel-to-buildah): implemented dependencies checksum using buildah container backend Signed-off-by: Timofey Kirillov --- pkg/build/build_phase.go | 2 +- pkg/build/stage/base.go | 2 +- pkg/build/stage/before_install.go | 2 +- pkg/build/stage/before_setup.go | 2 +- pkg/build/stage/conveyor.go | 2 +- pkg/build/stage/dependencies.go | 110 +++++++++++------- pkg/build/stage/dependencies_test.go | 2 +- pkg/build/stage/docker_instructions.go | 2 +- pkg/build/stage/dockerfile.go | 2 +- pkg/build/stage/dockerfile_test.go | 2 +- pkg/build/stage/from.go | 2 +- pkg/build/stage/git_archive.go | 2 +- pkg/build/stage/git_cache.go | 3 +- pkg/build/stage/git_latest_patch.go | 3 +- pkg/build/stage/install.go | 2 +- pkg/build/stage/interface.go | 6 +- pkg/build/stage/setup.go | 2 +- pkg/container_backend/buildah_backend.go | 88 ++++++++++++++ .../docker_server_backend.go | 4 + pkg/container_backend/interface.go | 1 + .../perf_check_container_backend.go | 8 ++ 21 files changed, 188 insertions(+), 61 deletions(-) diff --git a/pkg/build/build_phase.go b/pkg/build/build_phase.go index 7e43ab46b5..17e086cc80 100644 --- a/pkg/build/build_phase.go +++ b/pkg/build/build_phase.go @@ -567,7 +567,7 @@ func extractLegacyStageImage(stageImage *stage.StageImage) *container_backend.Le func (phase *BuildPhase) calculateStage(ctx context.Context, img *Image, stg stage.Interface) (bool, func(), error) { // FIXME(stapel-to-buildah): store StageImage-s everywhere in stage and build pkgs - stageDependencies, err := stg.GetDependencies(ctx, phase.Conveyor, phase.StagesIterator.GetPrevImage(img, stg), phase.StagesIterator.GetPrevBuiltImage(img, stg)) + stageDependencies, err := stg.GetDependencies(ctx, phase.Conveyor, phase.Conveyor.ContainerBackend, phase.StagesIterator.GetPrevImage(img, stg), phase.StagesIterator.GetPrevBuiltImage(img, stg)) if err != nil { return false, nil, err } diff --git a/pkg/build/stage/base.go b/pkg/build/stage/base.go index 4ff354040c..4d2bf7ba89 100644 --- a/pkg/build/stage/base.go +++ b/pkg/build/stage/base.go @@ -126,7 +126,7 @@ func (s *BaseStage) FetchDependencies(_ context.Context, _ Conveyor, _ container return nil } -func (s *BaseStage) GetDependencies(_ context.Context, _ Conveyor, _, _ *StageImage) (string, error) { +func (s *BaseStage) GetDependencies(_ context.Context, _ Conveyor, _ container_backend.ContainerBackend, _, _ *StageImage) (string, error) { panic("method must be implemented!") } diff --git a/pkg/build/stage/before_install.go b/pkg/build/stage/before_install.go index 575fbd2d03..bf7aa35154 100644 --- a/pkg/build/stage/before_install.go +++ b/pkg/build/stage/before_install.go @@ -27,7 +27,7 @@ type BeforeInstallStage struct { *UserStage } -func (s *BeforeInstallStage) GetDependencies(ctx context.Context, _ Conveyor, _, _ *StageImage) (string, error) { +func (s *BeforeInstallStage) GetDependencies(ctx context.Context, _ Conveyor, _ container_backend.ContainerBackend, _, _ *StageImage) (string, error) { return s.builder.BeforeInstallChecksum(ctx), nil } diff --git a/pkg/build/stage/before_setup.go b/pkg/build/stage/before_setup.go index 4d831632bb..bb341a126e 100644 --- a/pkg/build/stage/before_setup.go +++ b/pkg/build/stage/before_setup.go @@ -28,7 +28,7 @@ type BeforeSetupStage struct { *UserWithGitPatchStage } -func (s *BeforeSetupStage) GetDependencies(ctx context.Context, c Conveyor, _, _ *StageImage) (string, error) { +func (s *BeforeSetupStage) GetDependencies(ctx context.Context, c Conveyor, _ container_backend.ContainerBackend, _, _ *StageImage) (string, error) { stageDependenciesChecksum, err := s.getStageDependenciesChecksum(ctx, c, BeforeSetup) if err != nil { return "", err diff --git a/pkg/build/stage/conveyor.go b/pkg/build/stage/conveyor.go index 79d224bfd4..0bad5edbd4 100644 --- a/pkg/build/stage/conveyor.go +++ b/pkg/build/stage/conveyor.go @@ -30,7 +30,7 @@ type Conveyor interface { GiterminismManager() giterminism_manager.Interface - UseLegacyStapelBuilder(cr container_backend.ContainerBackend) bool + UseLegacyStapelBuilder(cb container_backend.ContainerBackend) bool } type VirtualMergeOptions struct { diff --git a/pkg/build/stage/dependencies.go b/pkg/build/stage/dependencies.go index dbac672625..9593d7bf35 100644 --- a/pkg/build/stage/dependencies.go +++ b/pkg/build/stage/dependencies.go @@ -67,14 +67,14 @@ type DependenciesStage struct { dependencies []*config.Dependency } -func (s *DependenciesStage) GetDependencies(ctx context.Context, c Conveyor, _, _ *StageImage) (string, error) { +func (s *DependenciesStage) GetDependencies(ctx context.Context, c Conveyor, cb container_backend.ContainerBackend, _, _ *StageImage) (string, error) { var args []string for ind, elm := range s.imports { var sourceChecksum string var err error if err := logboek.Context(ctx).Info().LogProcess("Getting import %d source checksum ...", ind).DoError(func() error { - sourceChecksum, err = s.getImportSourceChecksum(ctx, c, elm) + sourceChecksum, err = s.getImportSourceChecksum(ctx, c, cb, elm) return err }); err != nil { return "", fmt.Errorf("unable to get import %d source checksum: %w", ind, err) @@ -217,7 +217,7 @@ func (s *DependenciesStage) PrepareImage(ctx context.Context, c Conveyor, cr con } } -func (s *DependenciesStage) getImportSourceChecksum(ctx context.Context, c Conveyor, importElm *config.Import) (string, error) { +func (s *DependenciesStage) getImportSourceChecksum(ctx context.Context, c Conveyor, cb container_backend.ContainerBackend, importElm *config.Import) (string, error) { importSourceID := getImportSourceID(c, importElm) importMetadata, err := c.GetImportMetadata(ctx, s.projectName, importSourceID) if err != nil { @@ -225,7 +225,7 @@ func (s *DependenciesStage) getImportSourceChecksum(ctx context.Context, c Conve } if importMetadata == nil { - checksum, err := s.generateImportChecksum(ctx, c, importElm) + checksum, err := s.generateImportChecksum(ctx, c, cb, importElm) if err != nil { return "", fmt.Errorf("unable to generate import source checksum: %w", err) } @@ -245,59 +245,83 @@ func (s *DependenciesStage) getImportSourceChecksum(ctx context.Context, c Conve return importMetadata.Checksum, nil } -func (s *DependenciesStage) generateImportChecksum(ctx context.Context, c Conveyor, importElm *config.Import) (string, error) { +func (s *DependenciesStage) generateImportChecksum(ctx context.Context, c Conveyor, cb container_backend.ContainerBackend, importElm *config.Import) (string, error) { if err := fetchSourceImageDockerImage(ctx, c, importElm); err != nil { return "", fmt.Errorf("unable to fetch source image: %w", err) } sourceImageDockerImageName := getSourceImageDockerImageName(c, importElm) - importSourceID := getImportSourceID(c, importElm) - stapelContainerName, err := stapel.GetOrCreateContainer(ctx) - if err != nil { - return "", err - } + if c.UseLegacyStapelBuilder(cb) { + importSourceID := getImportSourceID(c, importElm) - importHostTmpDir := filepath.Join(s.imageTmpDir, string(s.Name()), "imports", importSourceID) - importContainerDir := s.containerWerfDir + stapelContainerName, err := stapel.GetOrCreateContainer(ctx) + if err != nil { + return "", err + } - importScriptHostTmpPath := filepath.Join(importHostTmpDir, "script.sh") - resultChecksumHostTmpPath := filepath.Join(importHostTmpDir, "checksum") - importScriptContainerPath := path.Join(importContainerDir, "script.sh") - resultChecksumContainerPath := path.Join(importContainerDir, "checksum") + importHostTmpDir := filepath.Join(s.imageTmpDir, string(s.Name()), "imports", importSourceID) + importContainerDir := s.containerWerfDir - command := generateChecksumCommand(importElm.Add, importElm.IncludePaths, importElm.ExcludePaths, resultChecksumContainerPath) - if err := stapel.CreateScript(importScriptHostTmpPath, []string{command}); err != nil { - return "", fmt.Errorf("unable to create script: %w", err) - } + importScriptHostTmpPath := filepath.Join(importHostTmpDir, "script.sh") + resultChecksumHostTmpPath := filepath.Join(importHostTmpDir, "checksum") + importScriptContainerPath := path.Join(importContainerDir, "script.sh") + resultChecksumContainerPath := path.Join(importContainerDir, "checksum") - runArgs := []string{ - "--rm", - "--user=0:0", - "--workdir=/", - fmt.Sprintf("--volumes-from=%s", stapelContainerName), - fmt.Sprintf("--volume=%s:%s", importHostTmpDir, importContainerDir), - fmt.Sprintf("--entrypoint=%s", stapel.BashBinPath()), - sourceImageDockerImageName, - importScriptContainerPath, - } + command := generateChecksumCommand(importElm.Add, importElm.IncludePaths, importElm.ExcludePaths, resultChecksumContainerPath) + if err := stapel.CreateScript(importScriptHostTmpPath, []string{command}); err != nil { + return "", fmt.Errorf("unable to create script: %w", err) + } - if debugImportSourceChecksum() { - fmt.Println(runArgs) - } + runArgs := []string{ + "--rm", + "--user=0:0", + "--workdir=/", + fmt.Sprintf("--volumes-from=%s", stapelContainerName), + fmt.Sprintf("--volume=%s:%s", importHostTmpDir, importContainerDir), + fmt.Sprintf("--entrypoint=%s", stapel.BashBinPath()), + sourceImageDockerImageName, + importScriptContainerPath, + } - if output, err := docker.CliRun_RecordedOutput(ctx, runArgs...); err != nil { - logboek.Context(ctx).Error().LogF("%s", output) - return "", err - } + if debugImportSourceChecksum() { + fmt.Println(runArgs) + } - data, err := ioutil.ReadFile(resultChecksumHostTmpPath) - if err != nil { - return "", fmt.Errorf("unable to read file with import source checksum: %w", err) - } + if output, err := docker.CliRun_RecordedOutput(ctx, runArgs...); err != nil { + logboek.Context(ctx).Error().LogF("%s", output) + return "", err + } - checksum := strings.TrimSpace(string(data)) - return checksum, nil + data, err := ioutil.ReadFile(resultChecksumHostTmpPath) + if err != nil { + return "", fmt.Errorf("unable to read file with import source checksum: %w", err) + } + + checksum := strings.TrimSpace(string(data)) + + return checksum, nil + } else { + var checksum string + var err error + + logboek.Context(ctx).Debug().LogProcess("Calculating dependency import checksum").Do(func() { + checksum, err = cb.CalculateDependencyImportChecksum(ctx, container_backend.DependencyImportSpec{ + ImageName: sourceImageDockerImageName, + FromPath: importElm.Add, + ToPath: importElm.To, + IncludePaths: importElm.IncludePaths, + ExcludePaths: importElm.ExcludePaths, + Owner: importElm.Owner, + Group: importElm.Group, + }) + }) + + if err != nil { + return "", fmt.Errorf("unable to calculate dependency import checksum in %s: %w", sourceImageDockerImageName, err) + } + return checksum, nil + } } func generateChecksumCommand(from string, includePaths, excludePaths []string, resultChecksumPath string) string { diff --git a/pkg/build/stage/dependencies_test.go b/pkg/build/stage/dependencies_test.go index 9aa43cf323..28bde03b9d 100644 --- a/pkg/build/stage/dependencies_test.go +++ b/pkg/build/stage/dependencies_test.go @@ -30,7 +30,7 @@ var _ = Describe("DependenciesStage", func() { Builder: stageBuilder, } - digest, err := stage.GetDependencies(ctx, conveyor, nil, stageImage) + digest, err := stage.GetDependencies(ctx, conveyor, containerBackend, nil, stageImage) Expect(err).To(Succeed()) Expect(digest).To(Equal(data.ExpectedDigest)) diff --git a/pkg/build/stage/docker_instructions.go b/pkg/build/stage/docker_instructions.go index a605c68423..97c22ae8b8 100644 --- a/pkg/build/stage/docker_instructions.go +++ b/pkg/build/stage/docker_instructions.go @@ -30,7 +30,7 @@ type DockerInstructionsStage struct { instructions *config.Docker } -func (s *DockerInstructionsStage) GetDependencies(_ context.Context, _ Conveyor, _, _ *StageImage) (string, error) { +func (s *DockerInstructionsStage) GetDependencies(_ context.Context, _ Conveyor, _ container_backend.ContainerBackend, _, _ *StageImage) (string, error) { var args []string args = append(args, s.instructions.Volume...) diff --git a/pkg/build/stage/dockerfile.go b/pkg/build/stage/dockerfile.go index 56574ae0ec..3628993612 100644 --- a/pkg/build/stage/dockerfile.go +++ b/pkg/build/stage/dockerfile.go @@ -411,7 +411,7 @@ func isUnsupportedMediaTypeError(err error) bool { var errImageNotExistLocally = errors.New("IMAGE_NOT_EXIST_LOCALLY") -func (s *DockerfileStage) GetDependencies(ctx context.Context, c Conveyor, _, _ *StageImage) (string, error) { +func (s *DockerfileStage) GetDependencies(ctx context.Context, c Conveyor, _ container_backend.ContainerBackend, _, _ *StageImage) (string, error) { resolvedDependenciesArgsHash := resolveDependenciesArgsHash(s.dependencies, c) resolvedDockerMetaArgsHash, err := s.resolveDockerMetaArgs(resolvedDependenciesArgsHash) diff --git a/pkg/build/stage/dockerfile_test.go b/pkg/build/stage/dockerfile_test.go index 025574326e..b0be15bb82 100644 --- a/pkg/build/stage/dockerfile_test.go +++ b/pkg/build/stage/dockerfile_test.go @@ -78,7 +78,7 @@ var _ = Describe("DockerfileStage", func() { Builder: stageBuilder, } - digest, err := stage.GetDependencies(ctx, conveyor, nil, stageImage) + digest, err := stage.GetDependencies(ctx, conveyor, containerBackend, nil, stageImage) Expect(err).To(Succeed()) Expect(digest).To(Equal(data.TestDependencies.ExpectedDigest)) diff --git a/pkg/build/stage/from.go b/pkg/build/stage/from.go index 40165cdd95..30e9730275 100644 --- a/pkg/build/stage/from.go +++ b/pkg/build/stage/from.go @@ -47,7 +47,7 @@ type FromStage struct { cacheVersion string } -func (s *FromStage) GetDependencies(_ context.Context, c Conveyor, prevImage, _ *StageImage) (string, error) { +func (s *FromStage) GetDependencies(_ context.Context, c Conveyor, _ container_backend.ContainerBackend, prevImage, _ *StageImage) (string, error) { var args []string if s.cacheVersion != "" { diff --git a/pkg/build/stage/git_archive.go b/pkg/build/stage/git_archive.go index e1921f2da9..cd105cbd47 100644 --- a/pkg/build/stage/git_archive.go +++ b/pkg/build/stage/git_archive.go @@ -47,7 +47,7 @@ func (s *GitArchiveStage) SelectSuitableStage(ctx context.Context, c Conveyor, s } // TODO: 1.3 add git mapping type (dir, file, ...) to gitArchive stage digest -func (s *GitArchiveStage) GetDependencies(ctx context.Context, c Conveyor, _, _ *StageImage) (string, error) { +func (s *GitArchiveStage) GetDependencies(ctx context.Context, c Conveyor, _ container_backend.ContainerBackend, _, _ *StageImage) (string, error) { var args []string for _, gitMapping := range s.gitMappings { if gitMapping.IsLocal() { diff --git a/pkg/build/stage/git_cache.go b/pkg/build/stage/git_cache.go index 756539ea7c..cb95135387 100644 --- a/pkg/build/stage/git_cache.go +++ b/pkg/build/stage/git_cache.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/werf/werf/pkg/container_backend" "github.com/werf/werf/pkg/image" "github.com/werf/werf/pkg/util" ) @@ -45,7 +46,7 @@ func (s *GitCacheStage) IsEmpty(ctx context.Context, c Conveyor, prevBuiltImage return isEmpty, nil } -func (s *GitCacheStage) GetDependencies(ctx context.Context, c Conveyor, _, prevBuiltImage *StageImage) (string, error) { +func (s *GitCacheStage) GetDependencies(ctx context.Context, c Conveyor, _ container_backend.ContainerBackend, _, prevBuiltImage *StageImage) (string, error) { patchSize, err := s.gitMappingsPatchSize(ctx, c, prevBuiltImage) if err != nil { return "", err diff --git a/pkg/build/stage/git_latest_patch.go b/pkg/build/stage/git_latest_patch.go index 83449c3cbf..d78764c6b4 100644 --- a/pkg/build/stage/git_latest_patch.go +++ b/pkg/build/stage/git_latest_patch.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/werf/werf/pkg/container_backend" "github.com/werf/werf/pkg/image" "github.com/werf/werf/pkg/util" ) @@ -49,7 +50,7 @@ func (s *GitLatestPatchStage) IsEmpty(ctx context.Context, c Conveyor, prevBuilt return isEmpty, nil } -func (s *GitLatestPatchStage) GetDependencies(ctx context.Context, c Conveyor, _, prevBuiltImage *StageImage) (string, error) { +func (s *GitLatestPatchStage) GetDependencies(ctx context.Context, c Conveyor, _ container_backend.ContainerBackend, _, prevBuiltImage *StageImage) (string, error) { var args []string for _, gitMapping := range s.gitMappings { diff --git a/pkg/build/stage/install.go b/pkg/build/stage/install.go index ff5aed4d4e..24211cc0c7 100644 --- a/pkg/build/stage/install.go +++ b/pkg/build/stage/install.go @@ -28,7 +28,7 @@ type InstallStage struct { *UserWithGitPatchStage } -func (s *InstallStage) GetDependencies(ctx context.Context, c Conveyor, _, _ *StageImage) (string, error) { +func (s *InstallStage) GetDependencies(ctx context.Context, c Conveyor, _ container_backend.ContainerBackend, _, _ *StageImage) (string, error) { stageDependenciesChecksum, err := s.getStageDependenciesChecksum(ctx, c, Install) if err != nil { return "", err diff --git a/pkg/build/stage/interface.go b/pkg/build/stage/interface.go index ee07a97c59..a91876c293 100644 --- a/pkg/build/stage/interface.go +++ b/pkg/build/stage/interface.go @@ -14,11 +14,11 @@ type Interface interface { IsEmpty(ctx context.Context, c Conveyor, prevBuiltImage *StageImage) (bool, error) - FetchDependencies(ctx context.Context, c Conveyor, cr container_backend.ContainerBackend, dockerRegistry docker_registry.ApiInterface) error - GetDependencies(ctx context.Context, c Conveyor, prevImage *StageImage, prevBuiltImage *StageImage) (string, error) + FetchDependencies(ctx context.Context, c Conveyor, cb container_backend.ContainerBackend, dockerRegistry docker_registry.ApiInterface) error + GetDependencies(ctx context.Context, c Conveyor, cb container_backend.ContainerBackend, prevImage *StageImage, prevBuiltImage *StageImage) (string, error) GetNextStageDependencies(ctx context.Context, c Conveyor) (string, error) - PrepareImage(ctx context.Context, c Conveyor, cr container_backend.ContainerBackend, prevBuiltImage, stageImage *StageImage) error + PrepareImage(ctx context.Context, c Conveyor, cb container_backend.ContainerBackend, prevBuiltImage, stageImage *StageImage) error PreRunHook(context.Context, Conveyor) error diff --git a/pkg/build/stage/setup.go b/pkg/build/stage/setup.go index 78ce211e0d..6d993a5fda 100644 --- a/pkg/build/stage/setup.go +++ b/pkg/build/stage/setup.go @@ -28,7 +28,7 @@ type SetupStage struct { *UserWithGitPatchStage } -func (s *SetupStage) GetDependencies(ctx context.Context, c Conveyor, _, _ *StageImage) (string, error) { +func (s *SetupStage) GetDependencies(ctx context.Context, c Conveyor, _ container_backend.ContainerBackend, _, _ *StageImage) (string, error) { stageDependenciesChecksum, err := s.getStageDependenciesChecksum(ctx, c, Setup) if err != nil { return "", err diff --git a/pkg/container_backend/buildah_backend.go b/pkg/container_backend/buildah_backend.go index 704231def4..b4cb4a548c 100644 --- a/pkg/container_backend/buildah_backend.go +++ b/pkg/container_backend/buildah_backend.go @@ -3,11 +3,14 @@ package container_backend import ( "bufio" "context" + "crypto/md5" "errors" "fmt" + "io" "io/fs" "os" "path/filepath" + "sort" "strconv" "strings" @@ -124,6 +127,91 @@ func (runtime *BuildahBackend) applyCommands(ctx context.Context, container *con return nil } +func (runtime *BuildahBackend) CalculateDependencyImportChecksum(ctx context.Context, dependencyImport DependencyImportSpec) (string, error) { + // TODO(2.0): Take into account empty dirs + + var container *containerDesc + if c, err := runtime.createContainers(ctx, []string{dependencyImport.ImageName}); err != nil { + return "", err + } else { + container = c[0] + } + defer func() { + if err := runtime.removeContainers(ctx, []*containerDesc{container}); err != nil { + logboek.Context(ctx).Error().LogF("ERROR: unable to remove temporal dependency container: %s\n", err) + } + }() + + logboek.Context(ctx).Debug().LogF("Mounting dependency container %s\n", container.Name) + if err := runtime.mountContainers(ctx, []*containerDesc{container}); err != nil { + return "", fmt.Errorf("unable to mount build container %s: %w", container.Name, err) + } + defer func() { + logboek.Context(ctx).Debug().LogF("Unmounting build container %s\n", container.Name) + if err := runtime.unmountContainers(ctx, []*containerDesc{container}); err != nil { + logboek.Context(ctx).Error().LogF("ERROR: unable to unmount containers: %s\n", err) + } + }() + + fromPath := filepath.Join(container.RootMount, dependencyImport.FromPath) + + pathMatcher := path_matcher.NewPathMatcher(path_matcher.PathMatcherOptions{ + BasePath: fromPath, + IncludeGlobs: dependencyImport.IncludePaths, + ExcludeGlobs: dependencyImport.ExcludePaths, + }) + + var files []string + + err := filepath.Walk(fromPath, func(path string, f os.FileInfo, err error) error { + if err != nil { + return fmt.Errorf("error accessing %s: %w", path, err) + } + + if !pathMatcher.IsDirOrSubmodulePathMatched(path) { + if f.IsDir() { + return filepath.SkipDir + } else { + return nil + } + } + + if f.IsDir() { + return nil + } + + if pathMatcher.IsPathMatched(path) { + files = append(files, path) + } + return nil + }) + if err != nil { + return "", err + } + + hash := md5.New() + sort.Strings(files) + + for _, path := range files { + logboek.Context(ctx).Debug().LogF("Calculating checksum of container file %s\n", path) + f, err := os.Open(path) + if err != nil { + return "", fmt.Errorf("unable to open file %q: %w", path, err) + } + + fileHash := md5.New() + if _, err := io.Copy(fileHash, f); err != nil { + return "", fmt.Errorf("error reading file %q: %w", path, err) + } + + if _, err := fmt.Fprintf(hash, "%x %s\n", fileHash.Sum(nil), filepath.Join("/", util.GetRelativeToBaseFilepath(container.RootMount, path))); err != nil { + return "", fmt.Errorf("error calculating file %q checksum: %w", path, err) + } + } + + return fmt.Sprintf("%x", hash.Sum(nil)), nil +} + func (runtime *BuildahBackend) applyDataArchives(ctx context.Context, container *containerDesc, dataArchives []DataArchiveSpec) error { for _, archive := range dataArchives { destPath := filepath.Join(container.RootMount, archive.To) diff --git a/pkg/container_backend/docker_server_backend.go b/pkg/container_backend/docker_server_backend.go index bf431b260e..7b0dca29b3 100644 --- a/pkg/container_backend/docker_server_backend.go +++ b/pkg/container_backend/docker_server_backend.go @@ -28,6 +28,10 @@ func (runtime *DockerServerBackend) BuildStapelStage(ctx context.Context, opts B panic("BuildStapelStage does not implemented for DockerServerBackend. Please report the bug if you've received this message.") } +func (runtime *DockerServerBackend) CalculateDependencyImportChecksum(ctx context.Context, dependencyImport DependencyImportSpec) (string, error) { + panic("CalculateDependencyImportChecksum does not implemented for DockerServerBackend. Please report the bug if you've received this message.") +} + func (runtime *DockerServerBackend) BuildDockerfile(ctx context.Context, _ []byte, opts BuildDockerfileOpts) (string, error) { switch { case opts.ContextTar == nil: diff --git a/pkg/container_backend/interface.go b/pkg/container_backend/interface.go index b251ea8202..c4a1791ab3 100644 --- a/pkg/container_backend/interface.go +++ b/pkg/container_backend/interface.go @@ -52,6 +52,7 @@ type ContainerBackend interface { GetImageInfo(ctx context.Context, ref string, opts GetImageInfoOpts) (*image.Info, error) BuildDockerfile(ctx context.Context, dockerfile []byte, opts BuildDockerfileOpts) (string, error) BuildStapelStage(ctx context.Context, opts BuildStapelStageOptions) (string, error) + CalculateDependencyImportChecksum(ctx context.Context, dependencyImport DependencyImportSpec) (string, error) HasStapelBuildSupport() bool String() string diff --git a/pkg/container_backend/perf_check_container_backend.go b/pkg/container_backend/perf_check_container_backend.go index 2b1b22e7ca..f6d0cd88f0 100644 --- a/pkg/container_backend/perf_check_container_backend.go +++ b/pkg/container_backend/perf_check_container_backend.go @@ -75,6 +75,14 @@ func (runtime *PerfCheckContainerBackend) BuildStapelStage(ctx context.Context, return } +func (runtime *PerfCheckContainerBackend) CalculateDependencyImportChecksum(ctx context.Context, dependencyImport DependencyImportSpec) (resID string, resErr error) { + logboek.Context(ctx).Default().LogProcess("ContainerBackend.BuildDockerfile"). + Do(func() { + resID, resErr = runtime.ContainerBackend.CalculateDependencyImportChecksum(ctx, dependencyImport) + }) + return +} + func (runtime *PerfCheckContainerBackend) RefreshImageObject(ctx context.Context, img LegacyImageInterface) (resErr error) { logboek.Context(ctx).Default().LogProcess("ContainerBackend.RefreshImageObject %q", img.Name()). Do(func() {