diff --git a/cmd/werf/bundle/export/export.go b/cmd/werf/bundle/export/export.go index e6103a5945..cc443dfa4d 100644 --- a/cmd/werf/bundle/export/export.go +++ b/cmd/werf/bundle/export/export.go @@ -251,6 +251,10 @@ func runExport(ctx context.Context) error { if err != nil { return err } + useCustomTagFunc, err := common.GetUseCustomTagFunc(&commonCmdData, giterminismManager, werfConfig) + if err != nil { + return err + } storageManager := manager.NewStorageManager(projectName, stagesStorage, finalStagesStorage, secondaryStagesStorageList, cacheStagesStorageList, storageLockManager) @@ -280,7 +284,7 @@ func runExport(ctx context.Context) error { } } - imagesInfoGetters = c.GetImageInfoGetters() + imagesInfoGetters = c.GetImageInfoGetters(image.InfoGetterOptions{CustomTagFunc: useCustomTagFunc}) return nil }); err != nil { @@ -308,11 +312,6 @@ func runExport(ctx context.Context) error { return err } - useCustomTagFunc, err := common.GetUseCustomTagFunc(&commonCmdData, giterminismManager, werfConfig) - if err != nil { - return err - } - headHash, err := giterminismManager.LocalGitRepo().HeadCommitHash(ctx) if err != nil { return fmt.Errorf("getting HEAD commit hash failed: %w", err) @@ -324,10 +323,9 @@ func runExport(ctx context.Context) error { } if vals, err := helpers.GetServiceValues(ctx, werfConfig.Meta.Project, imagesRepository, imagesInfoGetters, helpers.ServiceValuesOptions{ - Env: *commonCmdData.Environment, - CustomTagFunc: useCustomTagFunc, - CommitHash: headHash, - CommitDate: headTime, + Env: *commonCmdData.Environment, + CommitHash: headHash, + CommitDate: headTime, }); err != nil { return fmt.Errorf("error creating service values: %w", err) } else { diff --git a/cmd/werf/bundle/publish/publish.go b/cmd/werf/bundle/publish/publish.go index 8dc2cc30b1..ba4348c16b 100644 --- a/cmd/werf/bundle/publish/publish.go +++ b/cmd/werf/bundle/publish/publish.go @@ -277,6 +277,10 @@ func runPublish(ctx context.Context) error { if err != nil { return err } + useCustomTagFunc, err := common.GetUseCustomTagFunc(&commonCmdData, giterminismManager, werfConfig) + if err != nil { + return err + } storageManager := manager.NewStorageManager(projectName, stagesStorage, finalStagesStorage, secondaryStagesStorageList, cacheStagesStorageList, storageLockManager) @@ -306,7 +310,7 @@ func runPublish(ctx context.Context) error { } } - imagesInfoGetters = c.GetImageInfoGetters() + imagesInfoGetters = c.GetImageInfoGetters(image.InfoGetterOptions{CustomTagFunc: useCustomTagFunc}) return nil }); err != nil { @@ -339,11 +343,6 @@ func runPublish(ctx context.Context) error { return err } - useCustomTagFunc, err := common.GetUseCustomTagFunc(&commonCmdData, giterminismManager, werfConfig) - if err != nil { - return err - } - headHash, err := giterminismManager.LocalGitRepo().HeadCommitHash(ctx) if err != nil { return fmt.Errorf("getting HEAD commit hash failed: %w", err) @@ -355,10 +354,9 @@ func runPublish(ctx context.Context) error { } if vals, err := helpers.GetServiceValues(ctx, werfConfig.Meta.Project, imagesRepository, imagesInfoGetters, helpers.ServiceValuesOptions{ - Env: *commonCmdData.Environment, - CustomTagFunc: useCustomTagFunc, - CommitHash: headHash, - CommitDate: headTime, + Env: *commonCmdData.Environment, + CommitHash: headHash, + CommitDate: headTime, }); err != nil { return fmt.Errorf("error creating service values: %w", err) } else { diff --git a/cmd/werf/common/conveyor_options.go b/cmd/werf/common/conveyor_options.go index ff5889d4b3..e4e04a800d 100644 --- a/cmd/werf/common/conveyor_options.go +++ b/cmd/werf/common/conveyor_options.go @@ -11,6 +11,7 @@ import ( "github.com/werf/werf/pkg/config" "github.com/werf/werf/pkg/container_backend" "github.com/werf/werf/pkg/giterminism_manager" + "github.com/werf/werf/pkg/image" "github.com/werf/werf/pkg/slug" "github.com/werf/werf/pkg/storage" ) @@ -78,7 +79,7 @@ func GetBuildOptions(commonCmdData *CmdData, giterminismManager giterminism_mana return buildOptions, nil } -func getCustomTagFuncList(commonCmdData *CmdData, giterminismManager giterminism_manager.Interface, werfConfig *config.WerfConfig) ([]build.CustomTagFunc, error) { +func getCustomTagFuncList(commonCmdData *CmdData, giterminismManager giterminism_manager.Interface, werfConfig *config.WerfConfig) ([]image.CustomTagFunc, error) { tagOptionValues := getCustomTagOptionValues(commonCmdData) if len(tagOptionValues) == 0 { return nil, nil @@ -101,7 +102,7 @@ func getCustomTagFuncList(commonCmdData *CmdData, giterminismManager giterminism "image_content_based_tag": func() string { return "%[4]s" }, }) - var tagFuncList []build.CustomTagFunc + var tagFuncList []image.CustomTagFunc for _, optionValue := range tagOptionValues { tmpl, err := tmpl.Parse(optionValue) if err != nil { @@ -145,7 +146,7 @@ func getCustomTagFuncList(commonCmdData *CmdData, giterminismManager giterminism return tagFuncList, nil } -func GetUseCustomTagFunc(commonCmdData *CmdData, giterminismManager giterminism_manager.Interface, werfConfig *config.WerfConfig) (build.CustomTagFunc, error) { +func GetUseCustomTagFunc(commonCmdData *CmdData, giterminismManager giterminism_manager.Interface, werfConfig *config.WerfConfig) (image.CustomTagFunc, error) { customTagFuncList, err := getCustomTagFuncList(commonCmdData, giterminismManager, werfConfig) if err != nil { return nil, err diff --git a/cmd/werf/common/deploy_params.go b/cmd/werf/common/deploy_params.go index 210a7736e2..39e5be508a 100644 --- a/cmd/werf/common/deploy_params.go +++ b/cmd/werf/common/deploy_params.go @@ -54,7 +54,7 @@ func StubImageInfoGetters(werfConfig *config.WerfConfig) (list []*image.InfoGett } for _, imageName := range imagesNames { - list = append(list, image.NewInfoGetter(imageName, fmt.Sprintf("%s:%s", StubRepoAddress, StubTag), StubTag)) + list = append(list, image.NewInfoGetter(imageName, fmt.Sprintf("%s:%s", StubRepoAddress, StubTag), image.InfoGetterOptions{})) } return list diff --git a/cmd/werf/converge/converge.go b/cmd/werf/converge/converge.go index 4d4ee84891..0652668269 100644 --- a/cmd/werf/converge/converge.go +++ b/cmd/werf/converge/converge.go @@ -297,6 +297,10 @@ func run(ctx context.Context, containerBackend container_backend.ContainerBacken if err != nil { return err } + useCustomTagFunc, err := common.GetUseCustomTagFunc(&commonCmdData, giterminismManager, werfConfig) + if err != nil { + return err + } storageManager := manager.NewStorageManager(projectName, stagesStorage, finalStagesStorage, secondaryStagesStorageList, cacheStagesStorageList, storageLockManager) @@ -326,7 +330,7 @@ func run(ctx context.Context, containerBackend container_backend.ContainerBacken } } - imagesInfoGetters = c.GetImageInfoGetters() + imagesInfoGetters = c.GetImageInfoGetters(image.InfoGetterOptions{CustomTagFunc: useCustomTagFunc}) return nil }); err != nil { @@ -390,11 +394,6 @@ func run(ctx context.Context, containerBackend container_backend.ContainerBacken return err } - useCustomTagFunc, err := common.GetUseCustomTagFunc(&commonCmdData, giterminismManager, werfConfig) - if err != nil { - return err - } - headHash, err := giterminismManager.LocalGitRepo().HeadCommitHash(ctx) if err != nil { return fmt.Errorf("getting HEAD commit hash failed: %w", err) @@ -410,7 +409,6 @@ func run(ctx context.Context, containerBackend container_backend.ContainerBacken Env: *commonCmdData.Environment, SetDockerConfigJsonValue: *commonCmdData.SetDockerConfigJsonValue, DockerConfigPath: *commonCmdData.DockerConfig, - CustomTagFunc: useCustomTagFunc, CommitHash: headHash, CommitDate: headTime, }); err != nil { diff --git a/cmd/werf/export/export.go b/cmd/werf/export/export.go index c169a70481..2ad60e1fdc 100644 --- a/cmd/werf/export/export.go +++ b/cmd/werf/export/export.go @@ -234,7 +234,7 @@ func run(ctx context.Context, imagesToProcess, tagTemplateList []string) error { }) } -func getTagFuncList(imageNameList, tagTemplateList []string) ([]build.ExportTagFunc, error) { +func getTagFuncList(imageNameList, tagTemplateList []string) ([]image.ExportTagFunc, error) { templateName := "--tag" tmpl := template.New(templateName).Delims("%", "%") tmpl = tmpl.Funcs(map[string]interface{}{ @@ -244,7 +244,7 @@ func getTagFuncList(imageNameList, tagTemplateList []string) ([]build.ExportTagF "image_content_based_tag": func() string { return "%[4]s" }, }) - var tagFuncList []build.ExportTagFunc + var tagFuncList []image.ExportTagFunc for _, tagTemplate := range tagTemplateList { tagFunc, err := getExportTagFunc(tmpl, templateName, imageNameList, tagTemplate) if err != nil { @@ -257,7 +257,7 @@ func getTagFuncList(imageNameList, tagTemplateList []string) ([]build.ExportTagF return tagFuncList, nil } -func getExportTagFunc(tmpl *template.Template, templateName string, imageNameList []string, tagTemplate string) (build.ExportTagFunc, error) { +func getExportTagFunc(tmpl *template.Template, templateName string, imageNameList []string, tagTemplate string) (image.ExportTagFunc, error) { tmpl, err := tmpl.Parse(tagTemplate) if err != nil { return nil, err @@ -269,7 +269,7 @@ func getExportTagFunc(tmpl *template.Template, templateName string, imageNameLis } tagOrFormat := buf.String() - var tagFunc build.ExportTagFunc + var tagFunc image.ExportTagFunc tagFunc = func(imageName string, contentBasedTag string) string { if strings.ContainsRune(tagOrFormat, '%') { return fmt.Sprintf(tagOrFormat, imageName, slug.Slug(imageName), slug.DockerTag(imageName), contentBasedTag) diff --git a/cmd/werf/helm/get_autogenerated_values.go b/cmd/werf/helm/get_autogenerated_values.go index 0954735e87..b24006af93 100644 --- a/cmd/werf/helm/get_autogenerated_values.go +++ b/cmd/werf/helm/get_autogenerated_values.go @@ -195,6 +195,10 @@ func runGetServiceValues(ctx context.Context) error { if err != nil { return err } + useCustomTagFunc, err := common.GetUseCustomTagFunc(&getAutogeneratedValuedCmdData, giterminismManager, werfConfig) + if err != nil { + return err + } storageManager := manager.NewStorageManager(projectName, stagesStorage, finalStagesStorage, secondaryStagesStorageList, cacheStagesStorageList, storageLockManager) @@ -212,7 +216,7 @@ func runGetServiceValues(ctx context.Context) error { } imagesRepository = storageManager.StagesStorage.String() - imagesInfoGetters = c.GetImageInfoGetters() + imagesInfoGetters = c.GetImageInfoGetters(image.InfoGetterOptions{CustomTagFunc: useCustomTagFunc}) return nil }); err != nil { @@ -220,11 +224,6 @@ func runGetServiceValues(ctx context.Context) error { } } - useCustomTagFunc, err := common.GetUseCustomTagFunc(&getAutogeneratedValuedCmdData, giterminismManager, werfConfig) - if err != nil { - return err - } - headHash, err := giterminismManager.LocalGitRepo().HeadCommitHash(ctx) if err != nil { return fmt.Errorf("getting HEAD commit hash failed: %w", err) @@ -236,11 +235,10 @@ func runGetServiceValues(ctx context.Context) error { } serviceValues, err := helpers.GetServiceValues(ctx, projectName, imagesRepository, imagesInfoGetters, helpers.ServiceValuesOptions{ - Namespace: namespace, - Env: environment, - CustomTagFunc: useCustomTagFunc, - CommitHash: headHash, - CommitDate: headTime, + Namespace: namespace, + Env: environment, + CommitHash: headHash, + CommitDate: headTime, }) if err != nil { return fmt.Errorf("error creating service values: %w", err) diff --git a/cmd/werf/render/render.go b/cmd/werf/render/render.go index ac5acbe345..776db909c5 100644 --- a/cmd/werf/render/render.go +++ b/cmd/werf/render/render.go @@ -286,6 +286,10 @@ func runRender(ctx context.Context) error { if err != nil { return err } + useCustomTagFunc, err := common.GetUseCustomTagFunc(&commonCmdData, giterminismManager, werfConfig) + if err != nil { + return err + } storageManager := manager.NewStorageManager(projectName, stagesStorage, finalStagesStorage, secondaryStagesStorageList, cacheStagesStorageList, storageLockManager) @@ -315,7 +319,7 @@ func runRender(ctx context.Context) error { } } - imagesInfoGetters = c.GetImageInfoGetters() + imagesInfoGetters = c.GetImageInfoGetters(image.InfoGetterOptions{CustomTagFunc: useCustomTagFunc}) return nil }); err != nil { @@ -357,11 +361,6 @@ func runRender(ctx context.Context) error { return err } - useCustomTagFunc, err := common.GetUseCustomTagFunc(&commonCmdData, giterminismManager, werfConfig) - if err != nil { - return err - } - headHash, err := giterminismManager.LocalGitRepo().HeadCommitHash(ctx) if err != nil { return fmt.Errorf("getting HEAD commit hash failed: %w", err) @@ -379,7 +378,6 @@ func runRender(ctx context.Context) error { StubImagesNames: stubImagesNames, SetDockerConfigJsonValue: *commonCmdData.SetDockerConfigJsonValue, DockerConfigPath: *commonCmdData.DockerConfig, - CustomTagFunc: useCustomTagFunc, CommitHash: headHash, CommitDate: headTime, }); err != nil { diff --git a/pkg/build/build_phase.go b/pkg/build/build_phase.go index 3d5c74b8c3..ded1129766 100644 --- a/pkg/build/build_phase.go +++ b/pkg/build/build_phase.go @@ -22,6 +22,7 @@ import ( "github.com/werf/werf/pkg/container_backend" "github.com/werf/werf/pkg/docker_registry" "github.com/werf/werf/pkg/git_repo" + "github.com/werf/werf/pkg/image" imagePkg "github.com/werf/werf/pkg/image" "github.com/werf/werf/pkg/stapel" "github.com/werf/werf/pkg/storage" @@ -43,14 +44,9 @@ type BuildOptions struct { ReportFormat ReportFormat SkipImageMetadataPublication bool - CustomTagFuncList []CustomTagFunc + CustomTagFuncList []image.CustomTagFunc } -type ( - CustomTagFunc func(string, string) string - ExportTagFunc func(string, string) string -) - type IntrospectOptions struct { Targets []IntrospectTarget } @@ -246,20 +242,30 @@ func (phase *BuildPhase) AfterImageStages(ctx context.Context, img *Image) error return nil } - if !phase.ShouldBeBuiltMode { - if err := phase.addCustomImageTagsToStagesStorage(ctx, img); err != nil { - return fmt.Errorf("unable to add custom image tags to stages storage: %w", err) - } - } else { - if err := phase.checkCustomImageTagsExistence(ctx, img); err != nil { + if phase.Conveyor.StorageManager.GetFinalStagesStorage() != nil { + if err := phase.Conveyor.StorageManager.CopyStageIntoFinalStorage(ctx, img.GetLastNonEmptyStage(), phase.Conveyor.ContainerBackend, manager.CopyStageIntoFinalStorageOptions{ShouldBeBuiltMode: phase.ShouldBeBuiltMode}); err != nil { return err } } + var customTagStorage storage.StagesStorage + var customTagStage *image.StageDescription if phase.Conveyor.StorageManager.GetFinalStagesStorage() != nil { - if err := phase.Conveyor.StorageManager.CopyStageIntoFinalStorage(ctx, img.GetLastNonEmptyStage(), phase.Conveyor.ContainerBackend, manager.CopyStageIntoFinalStorageOptions{ShouldBeBuiltMode: phase.ShouldBeBuiltMode}); err != nil { + customTagStorage = phase.Conveyor.StorageManager.GetFinalStagesStorage() + customTagStage = manager.ConvertStageDescriptionForStagesStorage(img.GetLastNonEmptyStage().GetStageImage().Image.GetStageDescription(), phase.Conveyor.StorageManager.GetFinalStagesStorage()) + } else { + customTagStorage = phase.Conveyor.StorageManager.GetStagesStorage() + customTagStage = img.GetLastNonEmptyStage().GetStageImage().Image.GetStageDescription() + } + + if phase.ShouldBeBuiltMode { + if err := phase.checkCustomImageTagsExistence(ctx, img.GetName(), customTagStage, customTagStorage); err != nil { return err } + } else { + if err := phase.addCustomImageTagsToStagesStorage(ctx, img.GetName(), customTagStage, customTagStorage); err != nil { + return fmt.Errorf("unable to add custom image tags to stages storage: %w", err) + } } return nil @@ -320,11 +326,11 @@ func (phase *BuildPhase) publishImageMetadata(ctx context.Context, img *Image) e }) } -func (phase *BuildPhase) addCustomImageTagsToStagesStorage(ctx context.Context, img *Image) error { - return addCustomImageTags(ctx, phase.Conveyor.StorageManager.GetStagesStorage(), img, phase.CustomTagFuncList) +func (phase *BuildPhase) addCustomImageTagsToStagesStorage(ctx context.Context, imageName string, stageDesc *image.StageDescription, stagesStorage storage.StagesStorage) error { + return addCustomImageTags(ctx, stagesStorage, imageName, stageDesc, phase.CustomTagFuncList) } -func addCustomImageTags(ctx context.Context, stagesStorage storage.StagesStorage, img *Image, customTagFuncList []CustomTagFunc) error { +func addCustomImageTags(ctx context.Context, stagesStorage storage.StagesStorage, imageName string, stageDesc *image.StageDescription, customTagFuncList []image.CustomTagFunc) error { if len(customTagFuncList) == 0 { return nil } @@ -335,8 +341,8 @@ func addCustomImageTags(ctx context.Context, stagesStorage storage.StagesStorage }). DoError(func() error { for _, tagFunc := range customTagFuncList { - tag := tagFunc(img.GetName(), img.GetStageID()) - if err := addCustomImageTag(ctx, stagesStorage, img, tag); err != nil { + tag := tagFunc(imageName, stageDesc.Info.Tag) + if err := addCustomImageTag(ctx, stagesStorage, stageDesc, tag); err != nil { return err } } @@ -345,10 +351,9 @@ func addCustomImageTags(ctx context.Context, stagesStorage storage.StagesStorage }) } -func addCustomImageTag(ctx context.Context, stagesStorage storage.StagesStorage, img *Image, tag string) error { +func addCustomImageTag(ctx context.Context, stagesStorage storage.StagesStorage, stageDesc *image.StageDescription, tag string) error { return logboek.Context(ctx).Default().LogProcess("tag %s", tag). DoError(func() error { - stageDesc := img.GetLastNonEmptyStage().GetStageImage().Image.GetStageDescription() if err := stagesStorage.AddStageCustomTag(ctx, stageDesc, tag); err != nil { return err } @@ -359,15 +364,14 @@ func addCustomImageTag(ctx context.Context, stagesStorage storage.StagesStorage, }) } -func (phase *BuildPhase) checkCustomImageTagsExistence(ctx context.Context, img *Image) error { +func (phase *BuildPhase) checkCustomImageTagsExistence(ctx context.Context, imageName string, stageDesc *image.StageDescription, stagesStorage storage.StagesStorage) error { if len(phase.CustomTagFuncList) == 0 { return nil } - stageDesc := img.GetLastNonEmptyStage().GetStageImage().Image.GetStageDescription() for _, tagFunc := range phase.CustomTagFuncList { - tag := tagFunc(img.GetName(), img.GetStageID()) - if err := phase.Conveyor.StorageManager.GetStagesStorage().CheckStageCustomTag(ctx, stageDesc, tag); err != nil { + tag := tagFunc(imageName, stageDesc.Info.Tag) + if err := stagesStorage.CheckStageCustomTag(ctx, stageDesc, tag); err != nil { return fmt.Errorf("check custom tag %q existence failed: %w", tag, err) } } diff --git a/pkg/build/conveyor.go b/pkg/build/conveyor.go index c4313923f0..b4873a1d96 100644 --- a/pkg/build/conveyor.go +++ b/pkg/build/conveyor.go @@ -27,6 +27,7 @@ import ( "github.com/werf/werf/pkg/container_backend" "github.com/werf/werf/pkg/git_repo" "github.com/werf/werf/pkg/giterminism_manager" + "github.com/werf/werf/pkg/image" imagePkg "github.com/werf/werf/pkg/image" "github.com/werf/werf/pkg/logging" "github.com/werf/werf/pkg/path_matcher" @@ -307,7 +308,7 @@ func (c *Conveyor) GetRemoteGitRepo(key string) *git_repo.Remote { } type ShouldBeBuiltOptions struct { - CustomTagFuncList []CustomTagFunc + CustomTagFuncList []image.CustomTagFunc } func (c *Conveyor) ShouldBeBuilt(ctx context.Context, opts ShouldBeBuiltOptions) error { @@ -336,13 +337,13 @@ func (c *Conveyor) FetchLastImageStage(ctx context.Context, imageName string) er return c.StorageManager.FetchStage(ctx, c.ContainerBackend, lastImageStage) } -func (c *Conveyor) GetImageInfoGetters() (images []*imagePkg.InfoGetter) { +func (c *Conveyor) GetImageInfoGetters(opts imagePkg.InfoGetterOptions) (images []*imagePkg.InfoGetter) { for _, img := range c.images { if img.isArtifact { continue } - getter := c.StorageManager.GetImageInfoGetter(img.name, img.GetLastNonEmptyStage()) + getter := c.StorageManager.GetImageInfoGetter(img.name, img.GetLastNonEmptyStage(), opts) images = append(images, getter) } diff --git a/pkg/build/export_phase.go b/pkg/build/export_phase.go index e620f97abe..9b106dd373 100644 --- a/pkg/build/export_phase.go +++ b/pkg/build/export_phase.go @@ -6,6 +6,7 @@ import ( "github.com/werf/logboek" "github.com/werf/logboek/pkg/style" "github.com/werf/logboek/pkg/types" + "github.com/werf/werf/pkg/image" ) type ExportPhase struct { @@ -14,7 +15,7 @@ type ExportPhase struct { } type ExportPhaseOptions struct { - ExportTagFuncList []ExportTagFunc + ExportTagFuncList []image.ExportTagFunc } func NewExportPhase(c *Conveyor, opts ExportPhaseOptions) *ExportPhase { diff --git a/pkg/deploy/helm/chart_extender/helpers/service_values.go b/pkg/deploy/helm/chart_extender/helpers/service_values.go index 87789226a8..2688b6ffba 100644 --- a/pkg/deploy/helm/chart_extender/helpers/service_values.go +++ b/pkg/deploy/helm/chart_extender/helpers/service_values.go @@ -7,13 +7,11 @@ import ( "io/ioutil" "os" "path/filepath" - "strings" "time" "sigs.k8s.io/yaml" "github.com/werf/logboek" - "github.com/werf/werf/pkg/build" "github.com/werf/werf/pkg/image" "github.com/werf/werf/pkg/werf" ) @@ -39,7 +37,6 @@ type ServiceValuesOptions struct { Env string IsStub bool StubImagesNames []string - CustomTagFunc build.CustomTagFunc CommitHash string CommitDate *time.Time @@ -95,16 +92,8 @@ func GetServiceValues(ctx context.Context, projectName string, repo string, imag } for _, imageInfoGetter := range imageInfoGetters { - var tag string - var image string - - if opts.CustomTagFunc != nil { - tag = opts.CustomTagFunc(imageInfoGetter.GetWerfImageName(), imageInfoGetter.GetTag()) - image = strings.Join([]string{repo, tag}, ":") - } else { - tag = imageInfoGetter.GetTag() - image = imageInfoGetter.GetName() - } + tag := imageInfoGetter.GetTag() + image := imageInfoGetter.GetName() if imageInfoGetter.IsNameless() { werfInfo["is_nameless_image"] = true diff --git a/pkg/image/info_getter.go b/pkg/image/info_getter.go index 18a669a4ab..1c7ae3ec60 100644 --- a/pkg/image/info_getter.go +++ b/pkg/image/info_getter.go @@ -1,16 +1,32 @@ package image +import "fmt" + +type ( + CustomTagFunc func(string, string) string + ExportTagFunc func(string, string) string +) + type InfoGetter struct { WerfImageName string + Repo string Tag string - Name string + + InfoGetterOptions } -func NewInfoGetter(imageName string, name, tag string) *InfoGetter { +type InfoGetterOptions struct { + CustomTagFunc CustomTagFunc +} + +func NewInfoGetter(imageName string, ref string, opts InfoGetterOptions) *InfoGetter { + repo, tag := ParseRepositoryAndTag(ref) + return &InfoGetter{ - WerfImageName: imageName, - Name: name, - Tag: tag, + WerfImageName: imageName, + Repo: repo, + Tag: tag, + InfoGetterOptions: opts, } } @@ -23,9 +39,12 @@ func (d *InfoGetter) GetWerfImageName() string { } func (d *InfoGetter) GetName() string { - return d.Name + return fmt.Sprintf("%s:%s", d.Repo, d.GetTag()) } func (d *InfoGetter) GetTag() string { + if d.CustomTagFunc != nil { + return d.CustomTagFunc(d.WerfImageName, d.Tag) + } return d.Tag } diff --git a/pkg/image/info_getter_test.go b/pkg/image/info_getter_test.go new file mode 100644 index 0000000000..f3fcdb31b3 --- /dev/null +++ b/pkg/image/info_getter_test.go @@ -0,0 +1,69 @@ +package image + +import ( + "fmt" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +var _ = Describe("InfoGetter", func() { + DescribeTable("TestInfoGetter", + func(data TestInfoGetter) { + getter := NewInfoGetter(data.ImageName, data.Ref, data.Opts) + + Expect(getter.IsNameless()).To(Equal(data.ExpectIsNameless)) + Expect(getter.GetWerfImageName()).To(Equal(data.ExpectWerfImageName)) + Expect(getter.GetName()).To(Equal(data.ExpectName)) + Expect(getter.GetTag()).To(Equal(data.ExpectTag)) + }, + + Entry("nameless image", + TestInfoGetter{ + ImageName: "", + Ref: "myregistry.domain.com/group/project:abcd", + Opts: InfoGetterOptions{}, + ExpectIsNameless: true, + ExpectWerfImageName: "", + ExpectName: "myregistry.domain.com/group/project:abcd", + ExpectTag: "abcd", + }), + + Entry("named image", + TestInfoGetter{ + ImageName: "backend", + Ref: "myregistry.domain.com/group/project:abcd", + Opts: InfoGetterOptions{}, + ExpectIsNameless: false, + ExpectWerfImageName: "backend", + ExpectName: "myregistry.domain.com/group/project:abcd", + ExpectTag: "abcd", + }), + + Entry("named image with custom tag", + TestInfoGetter{ + ImageName: "backend", + Ref: "myregistry.domain.com/group/project:abcd", + Opts: InfoGetterOptions{ + CustomTagFunc: func(werfImageName string, tag string) string { + return fmt.Sprintf("%s-%s", werfImageName, tag) + }, + }, + ExpectIsNameless: false, + ExpectWerfImageName: "backend", + ExpectName: "myregistry.domain.com/group/project:backend-abcd", + ExpectTag: "backend-abcd", + }), + ) +}) + +type TestInfoGetter struct { + ImageName string + Ref string + Opts InfoGetterOptions + + ExpectIsNameless bool + ExpectWerfImageName string + ExpectName string + ExpectTag string +} diff --git a/pkg/image/suite_test.go b/pkg/image/suite_test.go new file mode 100644 index 0000000000..f798f0c4de --- /dev/null +++ b/pkg/image/suite_test.go @@ -0,0 +1,13 @@ +package image + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestStage(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Image Suite") +} diff --git a/pkg/storage/manager/storage_manager.go b/pkg/storage/manager/storage_manager.go index c4a45e4b9a..f65646ce19 100644 --- a/pkg/storage/manager/storage_manager.go +++ b/pkg/storage/manager/storage_manager.go @@ -53,7 +53,7 @@ type StorageManagerInterface interface { GetStagesStorage() storage.StagesStorage GetFinalStagesStorage() storage.StagesStorage GetSecondaryStagesStorageList() []storage.StagesStorage - GetImageInfoGetter(imageName string, stg stage.Interface) *image.InfoGetter + GetImageInfoGetter(imageName string, stg stage.Interface, opts image.InfoGetterOptions) *image.InfoGetter EnableParallel(parallelTasksLimit int) MaxNumberOfWorkers() int @@ -176,21 +176,16 @@ func (m *StorageManager) GetSecondaryStagesStorageList() []storage.StagesStorage return m.SecondaryStagesStorageList } -func (m *StorageManager) GetImageInfoGetter(imageName string, stg stage.Interface) *image.InfoGetter { +func (m *StorageManager) GetImageInfoGetter(imageName string, stg stage.Interface, opts image.InfoGetterOptions) *image.InfoGetter { stageID := stg.GetStageImage().Image.GetStageDescription().StageID info := stg.GetStageImage().Image.GetStageDescription().Info if m.FinalStagesStorage != nil { finalImageName := m.FinalStagesStorage.ConstructStageImageName(m.ProjectName, stageID.Digest, stageID.UniqueID) - _, tag := image.ParseRepositoryAndTag(finalImageName) - return image.NewInfoGetter(imageName, finalImageName, tag) + return image.NewInfoGetter(imageName, finalImageName, opts) } - return image.NewInfoGetter( - imageName, - info.Name, - info.Tag, - ) + return image.NewInfoGetter(imageName, info.Name, opts) } func (m *StorageManager) InitCache(ctx context.Context) error { @@ -395,7 +390,7 @@ func copyStageIntoStagesStorage(ctx context.Context, projectName string, stageID return fmt.Errorf("unable to store stage %s into the cache stages storage %s: %w", stageID.String(), stagesStorage.String(), err) } - if err := storeStageDescriptionIntoLocalManifestCache(ctx, projectName, stageID, stagesStorage, convertStageDescriptionForStagesStorage(newImg.GetStageDescription(), stagesStorage)); err != nil { + if err := storeStageDescriptionIntoLocalManifestCache(ctx, projectName, stageID, stagesStorage, ConvertStageDescriptionForStagesStorage(newImg.GetStageDescription(), stagesStorage)); err != nil { return fmt.Errorf("error storing stage %s description into local manifest cache: %w", targetStagesStorageImageName, err) } @@ -500,7 +495,7 @@ func (m *StorageManager) FetchStage(ctx context.Context, containerBackend contai // } // TODO(buildah): check no bugs introduced by removing of following calls - // if err := storeStageDescriptionIntoLocalManifestCache(ctx, m.ProjectName, *stageID, m.StagesStorage, convertStageDescriptionForStagesStorage(cacheDockerImage.Image.GetStageDescription(), m.StagesStorage)); err != nil { + // if err := storeStageDescriptionIntoLocalManifestCache(ctx, m.ProjectName, *stageID, m.StagesStorage, ConvertStageDescriptionForStagesStorage(cacheDockerImage.Image.GetStageDescription(), m.StagesStorage)); err != nil { if err := storeStageDescriptionIntoLocalManifestCache(ctx, m.ProjectName, *stageID, m.StagesStorage, cacheImg.GetStageDescription()); err != nil { return fmt.Errorf("error storing stage %s description into local manifest cache: %w", primaryImageName, err) } @@ -863,7 +858,7 @@ func storeStageDescriptionIntoLocalManifestCache(ctx context.Context, projectNam return nil } -func convertStageDescriptionForStagesStorage(stageDesc *image.StageDescription, stagesStorage storage.StagesStorage) *image.StageDescription { +func ConvertStageDescriptionForStagesStorage(stageDesc *image.StageDescription, stagesStorage storage.StagesStorage) *image.StageDescription { return &image.StageDescription{ StageID: &image.StageID{ Digest: stageDesc.StageID.Digest, @@ -901,7 +896,7 @@ func getStageDescription(ctx context.Context, projectName string, stageID image. return nil, fmt.Errorf("error getting stage %s description from the local manifest cache: %w", stageID.String(), err) } if stageDesc != nil { - return convertStageDescriptionForStagesStorage(stageDesc, stagesStorage), nil + return ConvertStageDescriptionForStagesStorage(stageDesc, stagesStorage), nil } } @@ -926,7 +921,7 @@ func getStageDescription(ctx context.Context, projectName string, stageID image. } } - return convertStageDescriptionForStagesStorage(stageDesc, stagesStorage), nil + return ConvertStageDescriptionForStagesStorage(stageDesc, stagesStorage), nil } }