@@ -18,7 +18,6 @@ package registry
1818
1919import (
2020 "context"
21- "fmt"
2221 "net/http"
2322 "net/url"
2423
@@ -27,15 +26,14 @@ import (
2726 "github.com/google/go-containerregistry/pkg/v1/remote"
2827 corev1 "k8s.io/api/core/v1"
2928 "k8s.io/apimachinery/pkg/types"
30- ctrl "sigs.k8s.io/controller-runtime"
3129 "sigs.k8s.io/controller-runtime/pkg/client"
3230
3331 "github.com/fluxcd/pkg/auth"
3432 authutils "github.com/fluxcd/pkg/auth/utils"
3533 "github.com/fluxcd/pkg/cache"
34+ "github.com/fluxcd/pkg/runtime/secrets"
3635
3736 imagev1 "github.com/fluxcd/image-reflector-controller/api/v1beta2"
38- "github.com/fluxcd/image-reflector-controller/internal/secret"
3937)
4038
4139// AuthOptionsGetter builds a slice of options from an ImageRepository by looking up references to Secrets etc.
@@ -65,7 +63,7 @@ func (r *AuthOptionsGetter) GetOptions(ctx context.Context, repo *imagev1.ImageR
6563 var proxyURL * url.URL
6664 var err error
6765 if repo .Spec .ProxySecretRef != nil {
68- proxyURL , err = r . GetProxyURL (ctx , repo )
66+ proxyURL , err = secrets . ProxyURLFromSecret (ctx , r . Client , repo . Spec . ProxySecretRef . Name , repo . Namespace )
6967 if err != nil {
7068 return nil , err
7169 }
@@ -80,22 +78,8 @@ func (r *AuthOptionsGetter) GetOptions(ctx context.Context, repo *imagev1.ImageR
8078 var options []remote.Option
8179 var authSecret corev1.Secret
8280 var authenticator authn.Authenticator
83- var authErr error
8481
85- if repo .Spec .SecretRef != nil {
86- ref , err := ParseImageReference (repo .Spec .Image , repo .Spec .Insecure )
87- if err != nil {
88- return nil , fmt .Errorf ("failed parsing image reference %q: %w" , repo .Spec .Image , err )
89- }
90-
91- if err := r .Get (ctx , types.NamespacedName {
92- Namespace : repo .GetNamespace (),
93- Name : repo .Spec .SecretRef .Name ,
94- }, & authSecret ); err != nil {
95- return nil , err
96- }
97- authenticator , authErr = secret .AuthFromSecret (authSecret , ref )
98- } else if provider := repo .GetProvider (); provider != "generic" {
82+ if provider := repo .GetProvider (); provider != "" && provider != "generic" {
9983 // Build login provider options and use it to attempt registry login.
10084 var opts []auth.Option
10185 if proxyURL != nil {
@@ -111,12 +95,11 @@ func (r *AuthOptionsGetter) GetOptions(ctx context.Context, repo *imagev1.ImageR
11195 if r .TokenCache != nil {
11296 opts = append (opts , auth .WithCache (* r .TokenCache , * involvedObject ))
11397 }
114- authenticator , authErr = authutils .GetArtifactRegistryCredentials (ctx , provider , repo .Spec .Image , opts ... )
115- }
116- if authErr != nil {
117- return nil , authErr
118- }
119- if authenticator != nil {
98+ var err error
99+ authenticator , err = authutils .GetArtifactRegistryCredentials (ctx , provider , repo .Spec .Image , opts ... )
100+ if err != nil {
101+ return nil , err
102+ }
120103 options = append (options , remote .WithAuth (authenticator ))
121104 }
122105
@@ -134,20 +117,10 @@ func (r *AuthOptionsGetter) GetOptions(ctx context.Context, repo *imagev1.ImageR
134117 }
135118 }
136119
137- tlsConfig , err := secret . TLSConfigFromKubeTLSSecret ( & certSecret )
120+ tlsConfig , err := secrets . TLSConfigFromSecret ( ctx , r . Client , certSecret . Name , certSecret . Namespace )
138121 if err != nil {
139122 return nil , err
140123 }
141- if tlsConfig == nil {
142- tlsConfig , err = secret .TLSConfigFromSecret (& certSecret )
143- if err != nil {
144- return nil , err
145- }
146- if tlsConfig != nil {
147- ctrl .LoggerFrom (ctx ).
148- Info ("warning: specifying TLS auth data via `certFile`/`keyFile`/`caFile` is deprecated, please use `tls.crt`/`tls.key`/`ca.crt` instead" )
149- }
150- }
151124 if tlsConfig != nil {
152125 transportOptions = append (transportOptions , func (t * http.Transport ) {
153126 t .TLSClientConfig = tlsConfig
@@ -164,29 +137,32 @@ func (r *AuthOptionsGetter) GetOptions(ctx context.Context, repo *imagev1.ImageR
164137 options = append (options , remote .WithTransport (tr ))
165138 }
166139
167- if authenticator == nil && repo .Spec .ServiceAccountName != "" {
168- serviceAccount := corev1.ServiceAccount {}
169- // Lookup service account
170- if err := r .Get (ctx , types.NamespacedName {
171- Namespace : repo .GetNamespace (),
172- Name : repo .Spec .ServiceAccountName ,
173- }, & serviceAccount ); err != nil {
174- return nil , err
140+ if authenticator == nil {
141+ var pullSecrets []corev1.Secret
142+
143+ if repo .Spec .SecretRef != nil {
144+ var s corev1.Secret
145+ key := types.NamespacedName {
146+ Name : repo .Spec .SecretRef .Name ,
147+ Namespace : repo .GetNamespace (),
148+ }
149+ if err := r .Get (ctx , key , & s ); err != nil {
150+ return nil , err
151+ }
152+ pullSecrets = append (pullSecrets , s )
175153 }
176154
177- if len (serviceAccount .ImagePullSecrets ) > 0 {
178- imagePullSecrets := make ([]corev1.Secret , len (serviceAccount .ImagePullSecrets ))
179- for i , ips := range serviceAccount .ImagePullSecrets {
180- var saAuthSecret corev1.Secret
181- if err := r .Get (ctx , types.NamespacedName {
182- Namespace : repo .GetNamespace (),
183- Name : ips .Name ,
184- }, & saAuthSecret ); err != nil {
185- return nil , err
186- }
187- imagePullSecrets [i ] = saAuthSecret
155+ if repo .Spec .ServiceAccountName != "" {
156+ s , err := secrets .PullSecretsFromServiceAccount (ctx , r .Client ,
157+ repo .Spec .ServiceAccountName , repo .GetNamespace ())
158+ if err != nil {
159+ return nil , err
188160 }
189- keychain , err := k8schain .NewFromPullSecrets (ctx , imagePullSecrets )
161+ pullSecrets = append (pullSecrets , s ... )
162+ }
163+
164+ if len (pullSecrets ) > 0 {
165+ keychain , err := k8schain .NewFromPullSecrets (ctx , pullSecrets )
190166 if err != nil {
191167 return nil , err
192168 }
@@ -196,37 +172,3 @@ func (r *AuthOptionsGetter) GetOptions(ctx context.Context, repo *imagev1.ImageR
196172
197173 return options , nil
198174}
199-
200- // GetProxyURL gets the proxy configuration for the transport based on the
201- // specified proxy secret reference in the ImageRepository object.
202- func (r * AuthOptionsGetter ) GetProxyURL (ctx context.Context , obj * imagev1.ImageRepository ) (* url.URL , error ) {
203- if obj .Spec .ProxySecretRef == nil || obj .Spec .ProxySecretRef .Name == "" {
204- return nil , nil
205- }
206-
207- proxySecretName := types.NamespacedName {
208- Namespace : obj .Namespace ,
209- Name : obj .Spec .ProxySecretRef .Name ,
210- }
211- var proxySecret corev1.Secret
212- if err := r .Get (ctx , proxySecretName , & proxySecret ); err != nil {
213- return nil , err
214- }
215-
216- proxyData := proxySecret .Data
217- address , ok := proxyData ["address" ]
218- if ! ok {
219- return nil , fmt .Errorf ("invalid proxy secret '%s/%s': key 'address' is missing" ,
220- obj .Namespace , obj .Spec .ProxySecretRef .Name )
221- }
222- proxyURL , err := url .Parse (string (address ))
223- if err != nil {
224- return nil , fmt .Errorf ("failed to parse proxy address '%s': %w" , address , err )
225- }
226- user , hasUser := proxyData ["username" ]
227- password , hasPassword := proxyData ["password" ]
228- if hasUser || hasPassword {
229- proxyURL .User = url .UserPassword (string (user ), string (password ))
230- }
231- return proxyURL , nil
232- }
0 commit comments