@@ -7,20 +7,16 @@ import (
7
7
"context"
8
8
"errors"
9
9
"fmt"
10
- "net/http"
11
10
"os"
12
11
"time"
13
12
14
13
"github.com/avast/retry-go/v4"
15
- "github.com/defenseunicorns/pkg/helpers/v2"
16
- "github.com/google/go-containerregistry/pkg/authn"
17
- "github.com/google/go-containerregistry/pkg/crane"
18
- v1 "github.com/google/go-containerregistry/pkg/v1"
19
14
20
15
"github.com/zarf-dev/zarf/src/config"
21
16
"github.com/zarf-dev/zarf/src/internal/dns"
22
17
"github.com/zarf-dev/zarf/src/internal/git"
23
18
"github.com/zarf-dev/zarf/src/internal/gitea"
19
+ "github.com/zarf-dev/zarf/src/internal/packager/images"
24
20
"github.com/zarf-dev/zarf/src/internal/packager2/layout"
25
21
"github.com/zarf-dev/zarf/src/pkg/cluster"
26
22
"github.com/zarf-dev/zarf/src/pkg/logger"
@@ -56,113 +52,36 @@ func Mirror(ctx context.Context, opt MirrorOptions) error {
56
52
}
57
53
58
54
func pushImagesToRegistry (ctx context.Context , c * cluster.Cluster , pkgLayout * layout.PackageLayout , filter filters.ComponentFilterStrategy , regInfo types.RegistryInfo , noImgChecksum bool , retries int ) error {
59
- l := logger .From (ctx )
60
-
61
55
components , err := filter .Apply (pkgLayout .Pkg )
62
56
if err != nil {
63
57
return err
64
58
}
65
59
66
- images := map [transform. Image ]v1 .Image {}
60
+ refs := []transform .Image {}
67
61
for _ , component := range components {
68
62
for _ , img := range component .Images {
69
63
ref , err := transform .ParseImageRef (img )
70
64
if err != nil {
71
65
return fmt .Errorf ("failed to create ref for image %s: %w" , img , err )
72
66
}
73
- if _ , ok := images [ref ]; ok {
74
- continue
75
- }
76
- img , err := pkgLayout .GetImage (ref )
77
- if err != nil {
78
- return err
79
- }
80
- images [ref ] = img
67
+ refs = append (refs , ref )
81
68
}
82
69
}
83
- if len (images ) == 0 {
70
+ if len (refs ) == 0 {
84
71
return nil
85
72
}
86
-
87
- defaultTransport := http .DefaultTransport .(* http.Transport ).Clone ()
88
- defaultTransport .TLSClientConfig .InsecureSkipVerify = config .CommonOptions .InsecureSkipTLSVerify
89
- // TODO (@WSTARR) This is set to match the TLSHandshakeTimeout to potentially mitigate effects of https://github.com/zarf-dev/zarf/issues/1444
90
- defaultTransport .ResponseHeaderTimeout = 10 * time .Second
91
- transport := helpers .NewTransport (defaultTransport , nil )
92
-
93
- pushOptions := []crane.Option {
94
- crane .WithPlatform (& v1.Platform {OS : "linux" , Architecture : pkgLayout .Pkg .Build .Architecture }),
95
- crane .WithTransport (transport ),
96
- crane .WithAuth (authn .FromConfig (authn.AuthConfig {
97
- Username : regInfo .PushUsername ,
98
- Password : regInfo .PushPassword ,
99
- })),
100
- crane .WithUserAgent ("zarf" ),
101
- crane .WithNoClobber (true ),
102
- crane .WithJobs (1 ),
73
+ pushCfg := images.PushConfig {
74
+ // TODO set as an option
75
+ PlainHTTP : config .CommonOptions .PlainHTTP ,
76
+ SourceDirectory : pkgLayout .GetImageDir (),
77
+ ImageList : refs ,
78
+ NoChecksum : noImgChecksum ,
79
+ Arch : pkgLayout .Pkg .Build .Architecture ,
80
+ RegInfo : regInfo ,
103
81
}
104
- if config .CommonOptions .InsecureSkipTLSVerify {
105
- pushOptions = append (pushOptions , crane .Insecure )
106
- }
107
-
108
- for refInfo , img := range images {
109
- err = retry .Do (func () error {
110
- pushImage := func (registryUrl string ) error {
111
- names := []string {}
112
- if ! noImgChecksum {
113
- offlineNameCRC , err := transform .ImageTransformHost (registryUrl , refInfo .Reference )
114
- if err != nil {
115
- return retry .Unrecoverable (err )
116
- }
117
- names = append (names , offlineNameCRC )
118
- }
119
- offlineName , err := transform .ImageTransformHostWithoutChecksum (registryUrl , refInfo .Reference )
120
- if err != nil {
121
- return retry .Unrecoverable (err )
122
- }
123
- names = append (names , offlineName )
124
- for _ , name := range names {
125
- message .Infof ("Pushing image %s" , name )
126
- l .Info ("pushing image" , "name" , name )
127
- err = crane .Push (img , name , pushOptions ... )
128
- if err != nil {
129
- return err
130
- }
131
- }
132
- return nil
133
- }
134
-
135
- if ! dns .IsServiceURL (regInfo .Address ) {
136
- return pushImage (regInfo .Address )
137
- }
138
-
139
- if c == nil {
140
- return retry .Unrecoverable (errors .New ("cannot push to internal OCI registry when cluster is nil" ))
141
- }
142
- namespace , name , port , err := dns .ParseServiceURL (regInfo .Address )
143
- if err != nil {
144
- return err
145
- }
146
- tunnel , err := c .NewTunnel (namespace , cluster .SvcResource , name , "" , 0 , port )
147
- if err != nil {
148
- return err
149
- }
150
- _ , err = tunnel .Connect (ctx )
151
- if err != nil {
152
- return err
153
- }
154
- defer tunnel .Close ()
155
- err = tunnel .Wrap (func () error {
156
- return pushImage (tunnel .Endpoint ())
157
- })
158
- if err != nil {
159
- return err
160
- }
161
- return nil
162
- }, retry .Context (ctx ), retry .Attempts (uint (retries )), retry .Delay (500 * time .Millisecond ))
163
- if err != nil {
164
- return err
165
- }
82
+ err = images .Push (ctx , pushCfg )
83
+ if err != nil {
84
+ return fmt .Errorf ("failed to mirror images: %w" , err )
166
85
}
167
86
return nil
168
87
}
0 commit comments