Skip to content

Commit 16dbd2e

Browse files
committed
feat(bundle): implement 'bundle copy' command
``` werf bundle copy --repo REPO [--tag latest] --to NEWREPO [--to-tag NEWTAG] ``` Signed-off-by: Timofey Kirillov <timofey.kirillov@flant.com>
1 parent aabfcea commit 16dbd2e

File tree

32 files changed

+721
-551
lines changed

32 files changed

+721
-551
lines changed

cmd/werf/build/main.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,8 @@ If one or more IMAGE_NAME parameters specified, werf will build only these image
8181

8282
common.SetupSecondaryStagesStorageOptions(&commonCmdData, cmd)
8383
common.SetupCacheStagesStorageOptions(&commonCmdData, cmd)
84-
common.SetupStagesStorageOptions(&commonCmdData, cmd)
85-
common.SetupFinalStagesStorageOptions(&commonCmdData, cmd)
84+
common.SetupRepoOptions(&commonCmdData, cmd, common.RepoDataOptions{OptionalRepo: true})
85+
common.SetupFinalRepo(&commonCmdData, cmd)
8686

8787
common.SetupDockerConfig(&commonCmdData, cmd, "Command needs granted permissions to read, pull and push images into the specified repo, to pull base images")
8888
common.SetupInsecureRegistry(&commonCmdData, cmd)
@@ -214,8 +214,7 @@ func run(ctx context.Context, containerBackend container_backend.ContainerBacken
214214
}
215215
defer tmp_manager.ReleaseProjectDir(projectTmpDir)
216216

217-
stagesStorageAddress := common.GetOptionalStagesStorageAddress(&commonCmdData)
218-
stagesStorage, err := common.GetStagesStorage(stagesStorageAddress, containerBackend, &commonCmdData)
217+
stagesStorage, err := common.GetStagesStorage(containerBackend, &commonCmdData)
219218
if err != nil {
220219
return err
221220
}

cmd/werf/bundle/apply/apply.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ func NewCmd() *cobra.Command {
6161
common.SetupTmpDir(&commonCmdData, cmd, common.SetupTmpDirOptions{})
6262
common.SetupHomeDir(&commonCmdData, cmd, common.SetupHomeDirOptions{})
6363

64-
common.SetupStagesStorageOptions(&commonCmdData, cmd) // FIXME
65-
common.SetupFinalStagesStorageOptions(&commonCmdData, cmd)
64+
common.SetupRepoOptions(&commonCmdData, cmd, common.RepoDataOptions{})
65+
common.SetupFinalRepo(&commonCmdData, cmd)
6666

6767
common.SetupDockerConfig(&commonCmdData, cmd, "Command needs granted permissions to read, pull and push images into the specified repo, to pull base images")
6868
common.SetupInsecureRegistry(&commonCmdData, cmd)
@@ -128,7 +128,7 @@ func runApply() error {
128128
return err
129129
}
130130

131-
repoAddress, err := common.GetStagesStorageAddress(&commonCmdData)
131+
repoAddress, err := commonCmdData.Repo.GetAddress()
132132
if err != nil {
133133
return err
134134
}

cmd/werf/bundle/copy/copy.go

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package copy
2+
3+
import (
4+
"fmt"
5+
"os"
6+
7+
"github.com/spf13/cobra"
8+
helm_v3 "helm.sh/helm/v3/cmd/helm"
9+
10+
"github.com/werf/werf/cmd/werf/common"
11+
"github.com/werf/werf/pkg/deploy/bundles"
12+
"github.com/werf/werf/pkg/werf"
13+
"github.com/werf/werf/pkg/werf/global_warnings"
14+
)
15+
16+
var cmdData struct {
17+
Repo *common.RepoData
18+
Tag string
19+
To *common.RepoData
20+
ToTag string
21+
}
22+
23+
var commonCmdData common.CmdData
24+
25+
func NewCmd() *cobra.Command {
26+
cmd := &cobra.Command{
27+
Use: "copy",
28+
Short: "Copy published bundle into another location",
29+
Long: common.GetLongCommandDescription(`Take latest bundle from the specified container registry using specified version tag and copy it either into a different tag within the same container registry or into another container registry.`),
30+
DisableFlagsInUseLine: true,
31+
Annotations: map[string]string{
32+
common.CmdEnvAnno: common.EnvsDescription(),
33+
},
34+
RunE: func(cmd *cobra.Command, args []string) error {
35+
defer global_warnings.PrintGlobalWarnings(common.GetContext())
36+
37+
if err := common.ProcessLogOptions(&commonCmdData); err != nil {
38+
common.PrintHelp(cmd)
39+
return err
40+
}
41+
42+
common.LogVersion()
43+
44+
return common.LogRunningTime(runCopy)
45+
},
46+
}
47+
48+
common.SetupTmpDir(&commonCmdData, cmd, common.SetupTmpDirOptions{})
49+
common.SetupHomeDir(&commonCmdData, cmd, common.SetupHomeDirOptions{})
50+
51+
common.SetupDockerConfig(&commonCmdData, cmd, "Command needs granted permissions to read, pull and push images into the specified repos")
52+
common.SetupInsecureRegistry(&commonCmdData, cmd)
53+
common.SetupInsecureHelmDependencies(&commonCmdData, cmd)
54+
common.SetupSkipTlsVerifyRegistry(&commonCmdData, cmd)
55+
56+
cmdData.Repo = common.NewRepoData("repo", common.RepoDataOptions{OnlyAddress: true})
57+
cmdData.Repo.SetupCmd(cmd)
58+
59+
cmdData.To = common.NewRepoData("to", common.RepoDataOptions{OnlyAddress: true})
60+
cmdData.To.SetupCmd(cmd)
61+
62+
common.SetupLogOptions(&commonCmdData, cmd)
63+
common.SetupLogProjectDir(&commonCmdData, cmd)
64+
common.SetupPlatform(&commonCmdData, cmd)
65+
66+
defaultTag := os.Getenv("WERF_TAG")
67+
if defaultTag == "" {
68+
defaultTag = "latest"
69+
}
70+
cmd.Flags().StringVarP(&cmdData.Tag, "tag", "", defaultTag, "Provide from tag version of the bundle to copy ($WERF_TAG or latest by default)")
71+
cmd.Flags().StringVarP(&cmdData.ToTag, "to-tag", "", "", "Provide to tag version of the bundle to copy ($WERF_TO_TAG or same as --tag by default)")
72+
73+
return cmd
74+
}
75+
76+
func runCopy() error {
77+
ctx := common.GetContext()
78+
79+
if err := werf.Init(*commonCmdData.TmpDir, *commonCmdData.HomeDir); err != nil {
80+
return fmt.Errorf("initialization error: %w", err)
81+
}
82+
83+
if err := common.DockerRegistryInit(ctx, &commonCmdData); err != nil {
84+
return err
85+
}
86+
87+
helm_v3.Settings.Debug = *commonCmdData.LogDebug
88+
89+
bundlesRegistryClient, err := common.NewBundlesRegistryClient(ctx, &commonCmdData)
90+
if err != nil {
91+
return err
92+
}
93+
94+
if *cmdData.Repo.Address == "" {
95+
return fmt.Errorf("--repo=ADDRESS param required")
96+
}
97+
if *cmdData.To.Address == "" {
98+
return fmt.Errorf("--to=ADDRESS param required")
99+
}
100+
101+
fromRegistry, err := cmdData.Repo.CreateDockerRegistry(*commonCmdData.InsecureRegistry, *commonCmdData.SkipTlsVerifyRegistry)
102+
if err != nil {
103+
return fmt.Errorf("error creating container registry accessor for repo %s: %w", *cmdData.Repo.Address, err)
104+
}
105+
106+
fromTag := cmdData.Tag
107+
toTag := cmdData.ToTag
108+
if toTag == "" {
109+
toTag = fromTag
110+
}
111+
112+
fromRef := fmt.Sprintf("%s:%s", *cmdData.Repo.Address, fromTag)
113+
toRef := fmt.Sprintf("%s:%s", *cmdData.To.Address, toTag)
114+
115+
return bundles.Copy(ctx, fromRef, toRef, bundlesRegistryClient, fromRegistry)
116+
}

cmd/werf/bundle/download/download.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55
"os"
66

77
"github.com/spf13/cobra"
8-
"helm.sh/helm/v3/cmd/helm"
8+
helm_v3 "helm.sh/helm/v3/cmd/helm"
99

1010
"github.com/werf/werf/cmd/werf/common"
1111
"github.com/werf/werf/pkg/deploy/bundles"
@@ -50,8 +50,8 @@ func NewCmd() *cobra.Command {
5050
common.SetupInsecureHelmDependencies(&commonCmdData, cmd)
5151
common.SetupSkipTlsVerifyRegistry(&commonCmdData, cmd)
5252

53-
common.SetupStagesStorageOptions(&commonCmdData, cmd) // FIXME
54-
common.SetupFinalStagesStorageOptions(&commonCmdData, cmd)
53+
common.SetupRepoOptions(&commonCmdData, cmd, common.RepoDataOptions{})
54+
common.SetupFinalRepo(&commonCmdData, cmd)
5555

5656
common.SetupLogOptions(&commonCmdData, cmd)
5757
common.SetupLogProjectDir(&commonCmdData, cmd)
@@ -77,7 +77,7 @@ func runDownload() error {
7777
return err
7878
}
7979

80-
repoAddress, err := common.GetStagesStorageAddress(&commonCmdData)
80+
repoAddress, err := commonCmdData.Repo.GetAddress()
8181
if err != nil {
8282
return err
8383
}

cmd/werf/bundle/export/export.go

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,8 @@ func NewCmd() *cobra.Command {
8282

8383
common.SetupSecondaryStagesStorageOptions(&commonCmdData, cmd)
8484
common.SetupCacheStagesStorageOptions(&commonCmdData, cmd)
85-
common.SetupStagesStorageOptions(&commonCmdData, cmd)
86-
common.SetupFinalStagesStorageOptions(&commonCmdData, cmd)
85+
common.SetupRepoOptions(&commonCmdData, cmd, common.RepoDataOptions{})
86+
common.SetupFinalRepo(&commonCmdData, cmd)
8787

8888
common.SetupDockerConfig(&commonCmdData, cmd, "Command needs granted permissions to read, pull and push images into the specified repo and to pull base images")
8989
common.SetupInsecureRegistry(&commonCmdData, cmd)
@@ -223,16 +223,11 @@ func runExport(ctx context.Context) error {
223223

224224
logboek.LogOptionalLn()
225225

226-
repoAddress, err := common.GetStagesStorageAddress(&commonCmdData)
227-
if err != nil {
228-
return err
229-
}
230-
231226
var imagesInfoGetters []*image.InfoGetter
232227
var imagesRepository string
233228

234229
if len(werfConfig.StapelImages) != 0 || len(werfConfig.ImagesFromDockerfile) != 0 {
235-
stagesStorage, err := common.GetStagesStorage(repoAddress, containerBackend, &commonCmdData)
230+
stagesStorage, err := common.GetStagesStorage(containerBackend, &commonCmdData)
236231
if err != nil {
237232
return err
238233
}

cmd/werf/bundle/publish/publish.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@ Published into container registry bundle can be rolled out by the "werf bundle"
8888

8989
common.SetupSecondaryStagesStorageOptions(&commonCmdData, cmd)
9090
common.SetupCacheStagesStorageOptions(&commonCmdData, cmd)
91-
common.SetupStagesStorageOptions(&commonCmdData, cmd)
92-
common.SetupFinalStagesStorageOptions(&commonCmdData, cmd)
91+
common.SetupRepoOptions(&commonCmdData, cmd, common.RepoDataOptions{})
92+
common.SetupFinalRepo(&commonCmdData, cmd)
9393

9494
common.SetupDockerConfig(&commonCmdData, cmd, "Command needs granted permissions to read, pull and push images into the specified repo and to pull base images")
9595
common.SetupInsecureRegistry(&commonCmdData, cmd)
@@ -239,7 +239,7 @@ func runPublish(ctx context.Context) error {
239239

240240
logboek.LogOptionalLn()
241241

242-
repoAddress, err := common.GetStagesStorageAddress(&commonCmdData)
242+
repoAddress, err := commonCmdData.Repo.GetAddress()
243243
if err != nil {
244244
return err
245245
}
@@ -253,7 +253,7 @@ func runPublish(ctx context.Context) error {
253253
var imagesRepository string
254254

255255
if len(werfConfig.StapelImages) != 0 || len(werfConfig.ImagesFromDockerfile) != 0 {
256-
stagesStorage, err := common.GetStagesStorage(repoAddress, containerBackend, &commonCmdData)
256+
stagesStorage, err := common.GetStagesStorage(containerBackend, &commonCmdData)
257257
if err != nil {
258258
return err
259259
}

cmd/werf/bundle/render/render.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99

1010
uuid "github.com/satori/go.uuid"
1111
"github.com/spf13/cobra"
12-
"helm.sh/helm/v3/cmd/helm"
12+
helm_v3 "helm.sh/helm/v3/cmd/helm"
1313
"helm.sh/helm/v3/pkg/action"
1414
"helm.sh/helm/v3/pkg/chart"
1515
"helm.sh/helm/v3/pkg/chart/loader"
@@ -64,8 +64,8 @@ func NewCmd() *cobra.Command {
6464
common.SetupTmpDir(&commonCmdData, cmd, common.SetupTmpDirOptions{})
6565
common.SetupHomeDir(&commonCmdData, cmd, common.SetupHomeDirOptions{})
6666

67-
common.SetupStagesStorageOptions(&commonCmdData, cmd)
68-
common.SetupFinalStagesStorageOptions(&commonCmdData, cmd)
67+
common.SetupRepoOptions(&commonCmdData, cmd, common.RepoDataOptions{})
68+
common.SetupFinalRepo(&commonCmdData, cmd)
6969

7070
common.SetupDockerConfig(&commonCmdData, cmd, "Command needs granted permissions to read, pull and push images into the specified repo, to pull base images")
7171
common.SetupInsecureRegistry(&commonCmdData, cmd)
@@ -114,17 +114,17 @@ func runRender(ctx context.Context) error {
114114
var isLocal bool
115115
switch {
116116
case cmdData.BundleDir != "":
117-
if *commonCmdData.StagesStorage != "" {
117+
if *commonCmdData.Repo.Address != "" {
118118
return fmt.Errorf("only one of --bundle-dir or --repo should be specified, but both provided")
119119
}
120-
if *commonCmdData.FinalStagesStorage != "" {
120+
if *commonCmdData.FinalRepo.Address != "" {
121121
return fmt.Errorf("only one of --bundle-dir or --final-repo should be specified, but both provided")
122122
}
123123

124124
isLocal = true
125-
case *commonCmdData.StagesStorage == storage.LocalStorageAddress:
125+
case *commonCmdData.Repo.Address == storage.LocalStorageAddress:
126126
return fmt.Errorf("--repo %s is not allowed, specify remote storage address", storage.LocalStorageAddress)
127-
case *commonCmdData.StagesStorage != "":
127+
case *commonCmdData.Repo.Address != "":
128128
isLocal = false
129129
default:
130130
return fmt.Errorf("either --bundle-dir or --repo required")
@@ -165,7 +165,7 @@ func runRender(ctx context.Context) error {
165165
return err
166166
}
167167

168-
repoAddress, err := common.GetStagesStorageAddress(&commonCmdData)
168+
repoAddress, err := commonCmdData.Repo.GetAddress()
169169
if err != nil {
170170
return err
171171
}

cmd/werf/cleanup/cleanup.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ It is safe to run this command periodically (daily is enough) by automated clean
6565

6666
common.SetupSecondaryStagesStorageOptions(&commonCmdData, cmd)
6767
common.SetupCacheStagesStorageOptions(&commonCmdData, cmd)
68-
common.SetupStagesStorageOptions(&commonCmdData, cmd)
69-
common.SetupFinalStagesStorageOptions(&commonCmdData, cmd)
68+
common.SetupRepoOptions(&commonCmdData, cmd, common.RepoDataOptions{})
69+
common.SetupFinalRepo(&commonCmdData, cmd)
7070
common.SetupParallelOptions(&commonCmdData, cmd, common.DefaultCleanupParallelTasksLimit)
7171

7272
common.SetupDockerConfig(&commonCmdData, cmd, "Command needs granted permissions to read, pull and delete images from the specified repo")
@@ -189,14 +189,14 @@ func runCleanup(ctx context.Context) error {
189189

190190
projectName := werfConfig.Meta.Project
191191

192-
stagesStorageAddress, err := common.GetStagesStorageAddress(&commonCmdData)
192+
_, err = commonCmdData.Repo.GetAddress()
193193
if err != nil {
194194
logboek.Context(ctx).Default().LogLnDetails(`The "werf cleanup" command is only used to cleaning the container registry. In case you need to clean the runner or the localhost, use the commands of the "werf host" group.
195195
It is worth noting that auto-cleaning is enabled by default, and manual use is usually not required (if not, we would appreciate feedback and creating an issue https://github.com/werf/werf/issues/new).`)
196196

197197
return err
198198
}
199-
stagesStorage, err := common.GetStagesStorage(stagesStorageAddress, containerBackend, &commonCmdData)
199+
stagesStorage, err := common.GetStagesStorage(containerBackend, &commonCmdData)
200200
if err != nil {
201201
return err
202202
}

0 commit comments

Comments
 (0)