Skip to content

Commit e6d19ec

Browse files
committed
test: mirror credentials config tests in credential provider config
1 parent 886109a commit e6d19ec

File tree

7 files changed

+127
-27
lines changed

7 files changed

+127
-27
lines changed

pkg/handlers/generic/mutation/imageregistries/credentials/credential_provider_config_files.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func (c providerConfig) isCredentialsEmpty() bool {
5252
c.Password == ""
5353
}
5454

55-
func templateFilesForImageCredentialProviderConfigs(config providerConfig) ([]cabpkv1.File, error) {
55+
func templateFilesForImageCredentialProviderConfigs(config providerConfig, mirror *mirrorConfig) ([]cabpkv1.File, error) {
5656
var files []cabpkv1.File
5757

5858
kubeletCredentialProviderConfigFile, err := templateKubeletCredentialProviderConfig()
@@ -65,6 +65,7 @@ func templateFilesForImageCredentialProviderConfigs(config providerConfig) ([]ca
6565

6666
kubeletDynamicCredentialProviderConfigFile, err := templateDynamicCredentialProviderConfig(
6767
config,
68+
mirror,
6869
)
6970
if err != nil {
7071
return nil, err
@@ -100,6 +101,7 @@ func templateKubeletCredentialProviderConfig() (*cabpkv1.File, error) {
100101

101102
func templateDynamicCredentialProviderConfig(
102103
config providerConfig,
104+
mirror *mirrorConfig,
103105
) (*cabpkv1.File, error) {
104106
registryURL, err := url.ParseRequestURI(config.URL)
105107
if err != nil {
@@ -137,11 +139,13 @@ func templateDynamicCredentialProviderConfig(
137139
ProviderBinary string
138140
ProviderArgs []string
139141
ProviderAPIVersion string
142+
Mirror *mirrorConfig
140143
}{
141144
RegistryHost: registryHostWithPath,
142145
ProviderBinary: providerBinary,
143146
ProviderArgs: providerArgs,
144147
ProviderAPIVersion: providerAPIVersion,
148+
Mirror: mirror,
145149
}
146150

147151
return fileFromTemplate(t, templateInput, kubeletDynamicCredentialProviderConfigOnRemote)

pkg/handlers/generic/mutation/imageregistries/credentials/credential_provider_config_files_test.go

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ func Test_templateDynamicCredentialProviderConfig(t *testing.T) {
9999
tests := []struct {
100100
name string
101101
credentials providerConfig
102+
mirror *mirrorConfig
102103
want *cabpkv1.File
103104
wantErr error
104105
}{
@@ -189,6 +190,73 @@ credentialProviders:
189190
`,
190191
},
191192
},
193+
194+
{
195+
name: "ECR image registry used as mirror",
196+
credentials: providerConfig{URL: "https://123456789.dkr.ecr.us-east-1.amazonaws.com"},
197+
mirror: &mirrorConfig{},
198+
want: &cabpkv1.File{
199+
Path: "/etc/kubernetes/dynamic-credential-provider-config.yaml",
200+
Owner: "",
201+
Permissions: "0600",
202+
Encoding: "",
203+
Append: false,
204+
Content: `apiVersion: credentialprovider.d2iq.com/v1alpha1
205+
kind: DynamicCredentialProviderConfig
206+
mirror:
207+
endpoint: "123456789.dkr.ecr.us-east-1.amazonaws.com"
208+
credentialsStrategy: "MirrorCredentialsOnly"
209+
credentialProviderPluginBinDir: /etc/kubernetes/image-credential-provider/
210+
credentialProviders:
211+
apiVersion: kubelet.config.k8s.io/v1beta1
212+
kind: CredentialProviderConfig
213+
providers:
214+
- name: ecr-credential-provider
215+
args:
216+
- get-credentials
217+
matchImages:
218+
- "123456789.dkr.ecr.us-east-1.amazonaws.com"
219+
defaultCacheDuration: "0s"
220+
apiVersion: credentialprovider.kubelet.k8s.io/v1alpha1
221+
`,
222+
},
223+
},
224+
{
225+
name: "image registry with static credentials used as mirror",
226+
credentials: providerConfig{
227+
URL: "https://myregistry.com",
228+
Username: "myuser",
229+
Password: "mypassword",
230+
},
231+
mirror: &mirrorConfig{
232+
CACert: "my-ca-cert",
233+
},
234+
want: &cabpkv1.File{
235+
Path: "/etc/kubernetes/dynamic-credential-provider-config.yaml",
236+
Owner: "",
237+
Permissions: "0600",
238+
Encoding: "",
239+
Append: false,
240+
Content: `apiVersion: credentialprovider.d2iq.com/v1alpha1
241+
kind: DynamicCredentialProviderConfig
242+
mirror:
243+
endpoint: "myregistry.com"
244+
credentialsStrategy: "MirrorCredentialsOnly"
245+
credentialProviderPluginBinDir: /etc/kubernetes/image-credential-provider/
246+
credentialProviders:
247+
apiVersion: kubelet.config.k8s.io/v1beta1
248+
kind: CredentialProviderConfig
249+
providers:
250+
- name: static-credential-provider
251+
args:
252+
- /etc/kubernetes/static-image-credentials.json
253+
matchImages:
254+
- "myregistry.com"
255+
defaultCacheDuration: "0s"
256+
apiVersion: credentialprovider.kubelet.k8s.io/v1beta1
257+
`,
258+
},
259+
},
192260
{
193261
name: "error for a registry with no credentials",
194262
credentials: providerConfig{
@@ -201,7 +269,7 @@ credentialProviders:
201269
tt := tests[idx]
202270
t.Run(tt.name, func(t *testing.T) {
203271
t.Parallel()
204-
file, err := templateDynamicCredentialProviderConfig(tt.credentials)
272+
file, err := templateDynamicCredentialProviderConfig(tt.credentials, tt.mirror)
205273
assert.ErrorIs(t, err, tt.wantErr)
206274
assert.Equal(t, tt.want, file)
207275
})

pkg/handlers/generic/mutation/imageregistries/credentials/inject.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ func registryWithOptionalCredentialsFromImageRegistryCredentials(
268268

269269
func generateFilesAndCommands(
270270
registryWithOptionalCredentials providerConfig,
271-
mirrorConfig mirrorConfig,
271+
mirrorConfig *mirrorConfig,
272272
imageRegistry v1alpha1.ImageRegistry,
273273
objName string,
274274
) ([]bootstrapv1.File, []string, error) {
@@ -281,6 +281,7 @@ func generateFilesAndCommands(
281281
}
282282
imageCredentialProviderConfigFiles, err := templateFilesForImageCredentialProviderConfigs(
283283
registryWithOptionalCredentials,
284+
mirrorConfig,
284285
)
285286
if err != nil {
286287
return nil, nil, fmt.Errorf(

pkg/handlers/generic/mutation/imageregistries/credentials/mirror.go

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,16 @@ func mirrorFromImageRegistry(
3636
c ctrlclient.Client,
3737
imageRegistry v1alpha1.ImageRegistry,
3838
obj ctrlclient.Object,
39-
) (mirrorConfig, error) {
40-
mirrorWithOptionalCACert := mirrorConfig{
39+
) (*mirrorConfig, error) {
40+
// using the registry as a mirror is supported by including empty mirror object or
41+
// mirror with CA certificate to the registry variable.
42+
// ex.
43+
// - url: https://my-registry.com
44+
// mirror: {}
45+
if imageRegistry.Mirror == nil {
46+
return nil, nil
47+
}
48+
mirrorWithOptionalCACert := &mirrorConfig{
4149
URL: imageRegistry.URL,
4250
}
4351
secret, err := secretForMirrorCACert(
@@ -47,7 +55,7 @@ func mirrorFromImageRegistry(
4755
obj.GetNamespace(),
4856
)
4957
if err != nil {
50-
return mirrorConfig{}, fmt.Errorf(
58+
return &mirrorConfig{}, fmt.Errorf(
5159
"error getting secret %s/%s from Image Registry variable: %w",
5260
obj.GetNamespace(),
5361
imageRegistry.Mirror.SecretRef.Name,
@@ -91,7 +99,10 @@ func secretForMirrorCACert(
9199
// Default Mirror for all registries. Use a mirror regardless of the intended registry.
92100
// The upstream registry will be automatically used after all defined mirrors have been tried.
93101
// reference: https://github.com/containerd/containerd/blob/main/docs/hosts.md#setup-default-mirror-for-all-registries
94-
func generateDefaultRegistryMirrorFile(mirror mirrorConfig) ([]cabpkv1.File, error) {
102+
func generateDefaultRegistryMirrorFile(mirror *mirrorConfig) ([]cabpkv1.File, error) {
103+
if mirror == nil {
104+
return nil, nil
105+
}
95106
t, err := template.New("").Parse(string(defaultRegistryMirrorPatch))
96107
if err != nil {
97108
return nil, fmt.Errorf("fail to parse go template for registry mirror: %w", err)
@@ -123,10 +134,10 @@ func generateDefaultRegistryMirrorFile(mirror mirrorConfig) ([]cabpkv1.File, err
123134
}
124135

125136
func generateMirrorCACertFile(
126-
config mirrorConfig,
137+
config *mirrorConfig,
127138
registry v1alpha1.ImageRegistry,
128139
) []cabpkv1.File {
129-
if config.CACert == "" {
140+
if config == nil || config.CACert == "" {
130141
return nil
131142
}
132143
return []cabpkv1.File{

pkg/handlers/generic/mutation/imageregistries/credentials/mirror_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@ func Test_generateDefaultRegistryMirrorFile(t *testing.T) {
1717
t.Parallel()
1818
tests := []struct {
1919
name string
20-
config mirrorConfig
20+
config *mirrorConfig
2121
want []cabpkv1.File
2222
wantErr error
2323
}{
2424
{
2525
name: "ECR image registry and no CA certificate",
26-
config: mirrorConfig{URL: "https://123456789.dkr.ecr.us-east-1.amazonaws.com"},
26+
config: &mirrorConfig{URL: "https://123456789.dkr.ecr.us-east-1.amazonaws.com"},
2727
want: []cabpkv1.File{
2828
{
2929
Path: "/etc/containerd/certs.d/_default/hosts.toml",
@@ -40,7 +40,7 @@ func Test_generateDefaultRegistryMirrorFile(t *testing.T) {
4040
},
4141
{
4242
name: "image registry with CA certificates",
43-
config: mirrorConfig{
43+
config: &mirrorConfig{
4444
URL: "https://myregistry.com",
4545
CACert: "mycacert",
4646
},
@@ -75,13 +75,13 @@ func Test_generateMirrorCACertFile(t *testing.T) {
7575
t.Parallel()
7676
tests := []struct {
7777
name string
78-
config mirrorConfig
78+
config *mirrorConfig
7979
registry v1alpha1.ImageRegistry
8080
want []cabpkv1.File
8181
}{
8282
{
8383
name: "Mirror registry with no CA certificate",
84-
config: mirrorConfig{
84+
config: &mirrorConfig{
8585
URL: "https://123456789.dkr.ecr.us-east-1.amazonaws.com",
8686
},
8787
registry: v1alpha1.ImageRegistry{
@@ -91,7 +91,7 @@ func Test_generateMirrorCACertFile(t *testing.T) {
9191
},
9292
{
9393
name: "Mirror registry with CA certificate",
94-
config: mirrorConfig{
94+
config: &mirrorConfig{
9595
URL: "https://myregistry.com",
9696
CACert: "mycacert",
9797
},

pkg/handlers/generic/mutation/imageregistries/credentials/templates/dynamic-credential-provider-config.yaml.gotmpl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
apiVersion: credentialprovider.d2iq.com/v1alpha1
22
kind: DynamicCredentialProviderConfig
3+
{{- if .Mirror }}
4+
mirror:
5+
{{- with .RegistryHost }}
6+
endpoint: {{ printf "%q" . }}
7+
{{- end }}
8+
credentialsStrategy: "MirrorCredentialsOnly"
9+
{{- end }}
310
credentialProviderPluginBinDir: /etc/kubernetes/image-credential-provider/
411
credentialProviders:
512
apiVersion: kubelet.config.k8s.io/v1

pkg/handlers/generic/mutation/imageregistries/credentials/tests/generate_patches.go

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,21 +37,30 @@ func TestGeneratePatches(
3737

3838
// Server side apply does not work with the fake client, hack around it by pre-creating empty Secrets
3939
// https://github.com/kubernetes-sigs/controller-runtime/issues/2341
40-
fakeClient.Create(
41-
context.Background(),
42-
newRegistryCredentialsSecret(validSecretName, request.Namespace),
40+
require.NoError(
41+
t,
42+
fakeClient.Create(
43+
context.Background(),
44+
newRegistryCredentialsSecret(validSecretName, request.Namespace),
45+
),
4346
)
4447

45-
fakeClient.Create(
46-
context.Background(),
47-
newMirrorSecret(validMirrorSecretName, request.Namespace),
48+
require.NoError(
49+
t,
50+
fakeClient.Create(
51+
context.Background(),
52+
newMirrorSecret(validMirrorSecretName, request.Namespace),
53+
),
4854
)
4955

50-
fakeClient.Create(
51-
context.Background(),
52-
newEmptySecret(
53-
request.KubeadmControlPlaneTemplateRequestObjectName+"-registry-config",
54-
request.Namespace,
56+
require.NoError(
57+
t,
58+
fakeClient.Create(
59+
context.Background(),
60+
newEmptySecret(
61+
request.KubeadmControlPlaneTemplateRequestObjectName+"-registry-config",
62+
request.Namespace,
63+
),
5564
),
5665
)
5766
require.NoError(
@@ -420,7 +429,7 @@ func TestGeneratePatches(
420429
variableName,
421430
v1alpha1.ImageRegistries{
422431
v1alpha1.ImageRegistry{
423-
URL: "https://my-registry.io",
432+
URL: "https://mirror-registry.com",
424433
Credentials: &v1alpha1.ImageCredentials{
425434
SecretRef: &corev1.ObjectReference{
426435
Name: validSecretName,

0 commit comments

Comments
 (0)