@@ -1109,7 +1109,7 @@ func TestHelmChartReconciler_buildFromOCIHelmRepository(t *testing.T) {
1109
1109
g .Expect (err ).NotTo (HaveOccurred ())
1110
1110
1111
1111
// Upload the test chart
1112
- metadata , err := loadTestChartToOCI (chartData , chartPath , testRegistryServer )
1112
+ metadata , err := loadTestChartToOCI (chartData , testRegistryServer , "" , "" , "" )
1113
1113
g .Expect (err ).NotTo (HaveOccurred ())
1114
1114
1115
1115
storage , err := NewStorage (tmpDir , "example.com" , retentionTTL , retentionRecords )
@@ -2244,53 +2244,74 @@ func TestHelmChartReconciler_reconcileSourceFromOCI_authStrategy(t *testing.T) {
2244
2244
url string
2245
2245
registryOpts registryOptions
2246
2246
secretOpts secretOptions
2247
+ secret * corev1.Secret
2248
+ certsecret * corev1.Secret
2249
+ insecure bool
2247
2250
provider string
2248
2251
providerImg string
2249
2252
want sreconcile.Result
2250
2253
wantErr bool
2251
2254
assertConditions []metav1.Condition
2252
2255
}{
2253
2256
{
2254
- name : "HTTP without basic auth" ,
2255
- want : sreconcile .ResultSuccess ,
2257
+ name : "HTTP without basic auth" ,
2258
+ want : sreconcile .ResultSuccess ,
2259
+ insecure : true ,
2256
2260
assertConditions : []metav1.Condition {
2257
2261
* conditions .TrueCondition (meta .ReconcilingCondition , meta .ProgressingReason , "building artifact: pulled 'helmchart' chart with version '0.1.0'" ),
2258
2262
* conditions .UnknownCondition (meta .ReadyCondition , meta .ProgressingReason , "building artifact: pulled 'helmchart' chart with version '0.1.0'" ),
2259
2263
},
2260
2264
},
2261
2265
{
2262
- name : "HTTP with basic auth secret" ,
2263
- want : sreconcile .ResultSuccess ,
2266
+ name : "HTTP with basic auth secret" ,
2267
+ want : sreconcile .ResultSuccess ,
2268
+ insecure : true ,
2264
2269
registryOpts : registryOptions {
2265
2270
withBasicAuth : true ,
2266
2271
},
2267
2272
secretOpts : secretOptions {
2268
2273
username : testRegistryUsername ,
2269
2274
password : testRegistryPassword ,
2270
2275
},
2276
+ secret : & corev1.Secret {
2277
+ ObjectMeta : metav1.ObjectMeta {
2278
+ Name : "auth-secretref" ,
2279
+ },
2280
+ Type : corev1 .SecretTypeDockerConfigJson ,
2281
+ Data : map [string ][]byte {},
2282
+ },
2271
2283
assertConditions : []metav1.Condition {
2272
2284
* conditions .TrueCondition (meta .ReconcilingCondition , meta .ProgressingReason , "building artifact: pulled 'helmchart' chart with version '0.1.0'" ),
2273
2285
* conditions .UnknownCondition (meta .ReadyCondition , meta .ProgressingReason , "building artifact: pulled 'helmchart' chart with version '0.1.0'" ),
2274
2286
},
2275
2287
},
2276
2288
{
2277
- name : "HTTP registry - basic auth with invalid secret" ,
2278
- want : sreconcile .ResultEmpty ,
2279
- wantErr : true ,
2289
+ name : "HTTP registry - basic auth with invalid secret" ,
2290
+ want : sreconcile .ResultEmpty ,
2291
+ wantErr : true ,
2292
+ insecure : true ,
2280
2293
registryOpts : registryOptions {
2281
2294
withBasicAuth : true ,
2282
2295
},
2283
2296
secretOpts : secretOptions {
2284
2297
username : "wrong-pass" ,
2285
2298
password : "wrong-pass" ,
2286
2299
},
2300
+ secret : & corev1.Secret {
2301
+ ObjectMeta : metav1.ObjectMeta {
2302
+ Name : "auth-secretref" ,
2303
+ },
2304
+ Type : corev1 .SecretTypeDockerConfigJson ,
2305
+ Data : map [string ][]byte {},
2306
+ },
2287
2307
assertConditions : []metav1.Condition {
2288
2308
* conditions .TrueCondition (sourcev1 .FetchFailedCondition , "Unknown" , "unknown build error: failed to login to OCI registry" ),
2289
2309
},
2290
2310
},
2291
2311
{
2292
2312
name : "with contextual login provider" ,
2293
2313
wantErr : true ,
2314
+ insecure : true ,
2294
2315
provider : "aws" ,
2295
2316
providerImg : "oci://123456789000.dkr.ecr.us-east-2.amazonaws.com/test" ,
2296
2317
assertConditions : []metav1.Condition {
@@ -2303,16 +2324,87 @@ func TestHelmChartReconciler_reconcileSourceFromOCI_authStrategy(t *testing.T) {
2303
2324
registryOpts : registryOptions {
2304
2325
withBasicAuth : true ,
2305
2326
},
2327
+ insecure : true ,
2306
2328
secretOpts : secretOptions {
2307
2329
username : testRegistryUsername ,
2308
2330
password : testRegistryPassword ,
2309
2331
},
2332
+ secret : & corev1.Secret {
2333
+ ObjectMeta : metav1.ObjectMeta {
2334
+ Name : "auth-secretref" ,
2335
+ },
2336
+ Type : corev1 .SecretTypeDockerConfigJson ,
2337
+ Data : map [string ][]byte {},
2338
+ },
2310
2339
provider : "azure" ,
2311
2340
assertConditions : []metav1.Condition {
2312
2341
* conditions .TrueCondition (meta .ReconcilingCondition , meta .ProgressingReason , "building artifact: pulled 'helmchart' chart with version '0.1.0'" ),
2313
2342
* conditions .UnknownCondition (meta .ReadyCondition , meta .ProgressingReason , "building artifact: pulled 'helmchart' chart with version '0.1.0'" ),
2314
2343
},
2315
2344
},
2345
+ {
2346
+ name : "HTTPS With invalid CA cert" ,
2347
+ wantErr : true ,
2348
+ registryOpts : registryOptions {
2349
+ withTLS : true ,
2350
+ withClientCertAuth : true ,
2351
+ },
2352
+ secretOpts : secretOptions {
2353
+ username : testRegistryUsername ,
2354
+ password : testRegistryPassword ,
2355
+ },
2356
+ secret : & corev1.Secret {
2357
+ ObjectMeta : metav1.ObjectMeta {
2358
+ Name : "auth-secretref" ,
2359
+ },
2360
+ Type : corev1 .SecretTypeDockerConfigJson ,
2361
+ Data : map [string ][]byte {},
2362
+ },
2363
+ certsecret : & corev1.Secret {
2364
+ ObjectMeta : metav1.ObjectMeta {
2365
+ Name : "certs-secretref" ,
2366
+ },
2367
+ Data : map [string ][]byte {
2368
+ "caFile" : []byte ("invalid caFile" ),
2369
+ },
2370
+ },
2371
+ assertConditions : []metav1.Condition {
2372
+ * conditions .TrueCondition (sourcev1 .FetchFailedCondition , "Unknown" , "unknown build error: failed to construct Helm client's TLS config: cannot append certificate into certificate pool: invalid caFile" ),
2373
+ },
2374
+ },
2375
+ {
2376
+ name : "HTTPS With CA cert" ,
2377
+ want : sreconcile .ResultSuccess ,
2378
+ registryOpts : registryOptions {
2379
+ withTLS : true ,
2380
+ withClientCertAuth : true ,
2381
+ },
2382
+ secretOpts : secretOptions {
2383
+ username : testRegistryUsername ,
2384
+ password : testRegistryPassword ,
2385
+ },
2386
+ secret : & corev1.Secret {
2387
+ ObjectMeta : metav1.ObjectMeta {
2388
+ Name : "auth-secretref" ,
2389
+ },
2390
+ Type : corev1 .SecretTypeDockerConfigJson ,
2391
+ Data : map [string ][]byte {},
2392
+ },
2393
+ certsecret : & corev1.Secret {
2394
+ ObjectMeta : metav1.ObjectMeta {
2395
+ Name : "certs-secretref" ,
2396
+ },
2397
+ Data : map [string ][]byte {
2398
+ "caFile" : tlsCA ,
2399
+ "certFile" : clientPublicKey ,
2400
+ "keyFile" : clientPrivateKey ,
2401
+ },
2402
+ },
2403
+ assertConditions : []metav1.Condition {
2404
+ * conditions .TrueCondition (meta .ReconcilingCondition , meta .ProgressingReason , "building artifact: pulled 'helmchart' chart with version '0.1.0'" ),
2405
+ * conditions .UnknownCondition (meta .ReadyCondition , meta .ProgressingReason , "building artifact: pulled 'helmchart' chart with version '0.1.0'" ),
2406
+ },
2407
+ },
2316
2408
}
2317
2409
2318
2410
for _ , tt := range tests {
@@ -2325,7 +2417,9 @@ func TestHelmChartReconciler_reconcileSourceFromOCI_authStrategy(t *testing.T) {
2325
2417
2326
2418
workspaceDir := t .TempDir ()
2327
2419
2328
- tt .registryOpts .disableDNSMocking = true
2420
+ if tt .insecure {
2421
+ tt .registryOpts .disableDNSMocking = true
2422
+ }
2329
2423
server , err := setupRegistryServer (ctx , workspaceDir , tt .registryOpts )
2330
2424
g .Expect (err ).NotTo (HaveOccurred ())
2331
2425
t .Cleanup (func () {
@@ -2337,7 +2431,7 @@ func TestHelmChartReconciler_reconcileSourceFromOCI_authStrategy(t *testing.T) {
2337
2431
g .Expect (err ).ToNot (HaveOccurred ())
2338
2432
2339
2433
// Upload the test chart
2340
- metadata , err := loadTestChartToOCI (chartData , chartPath , server )
2434
+ metadata , err := loadTestChartToOCI (chartData , server , "testdata/certs/client.pem" , "testdata/certs/client-key.pem" , "testdata/certs/ca.pem" )
2341
2435
g .Expect (err ).ToNot (HaveOccurred ())
2342
2436
2343
2437
repo := & helmv1.HelmRepository {
@@ -2364,25 +2458,26 @@ func TestHelmChartReconciler_reconcileSourceFromOCI_authStrategy(t *testing.T) {
2364
2458
}
2365
2459
2366
2460
if tt .secretOpts .username != "" && tt .secretOpts .password != "" {
2367
- secret := & corev1.Secret {
2368
- ObjectMeta : metav1.ObjectMeta {
2369
- Name : "auth-secretref" ,
2370
- },
2371
- Type : corev1 .SecretTypeDockerConfigJson ,
2372
- Data : map [string ][]byte {
2373
- ".dockerconfigjson" : []byte (fmt .Sprintf (`{"auths": {%q: {"username": %q, "password": %q}}}` ,
2374
- server .registryHost , tt .secretOpts .username , tt .secretOpts .password )),
2375
- },
2376
- }
2461
+ tt .secret .Data [".dockerconfigjson" ] = []byte (fmt .Sprintf (`{"auths": {%q: {"username": %q, "password": %q}}}` ,
2462
+ server .registryHost , tt .secretOpts .username , tt .secretOpts .password ))
2463
+ }
2377
2464
2465
+ if tt .secret != nil {
2378
2466
repo .Spec .SecretRef = & meta.LocalObjectReference {
2379
- Name : secret .Name ,
2467
+ Name : tt . secret .Name ,
2380
2468
}
2381
- clientBuilder .WithObjects (secret , repo )
2382
- } else {
2383
- clientBuilder .WithObjects (repo )
2469
+ clientBuilder .WithObjects (tt .secret )
2470
+ }
2471
+
2472
+ if tt .certsecret != nil {
2473
+ repo .Spec .CertSecretRef = & meta.LocalObjectReference {
2474
+ Name : tt .certsecret .Name ,
2475
+ }
2476
+ clientBuilder .WithObjects (tt .certsecret )
2384
2477
}
2385
2478
2479
+ clientBuilder .WithObjects (repo )
2480
+
2386
2481
obj := & helmv1.HelmChart {
2387
2482
ObjectMeta : metav1.ObjectMeta {
2388
2483
GenerateName : "auth-strategy-" ,
@@ -2456,7 +2551,7 @@ func TestHelmChartReconciler_reconcileSourceFromOCI_verifySignature(t *testing.T
2456
2551
g .Expect (err ).ToNot (HaveOccurred ())
2457
2552
2458
2553
// Upload the test chart
2459
- metadata , err := loadTestChartToOCI (chartData , chartPath , server )
2554
+ metadata , err := loadTestChartToOCI (chartData , server , "" , "" , "" )
2460
2555
g .Expect (err ).NotTo (HaveOccurred ())
2461
2556
2462
2557
storage , err := NewStorage (tmpDir , "example.com" , retentionTTL , retentionRecords )
@@ -2687,30 +2782,24 @@ func extractChartMeta(chartData []byte) (*hchart.Metadata, error) {
2687
2782
return ch .Metadata , nil
2688
2783
}
2689
2784
2690
- func loadTestChartToOCI (chartData []byte , chartPath string , server * registryClientTestServer ) (* hchart.Metadata , error ) {
2785
+ func loadTestChartToOCI (chartData []byte , server * registryClientTestServer , certFile , keyFile , cafile string ) (* hchart.Metadata , error ) {
2691
2786
// Login to the registry
2692
2787
err := server .registryClient .Login (server .registryHost ,
2693
2788
helmreg .LoginOptBasicAuth (testRegistryUsername , testRegistryPassword ),
2694
- helmreg .LoginOptInsecure (true ))
2695
- if err != nil {
2696
- return nil , err
2697
- }
2698
-
2699
- // Load a test chart
2700
- chartData , err = os .ReadFile (chartPath )
2789
+ helmreg .LoginOptTLSClientConfig (certFile , keyFile , cafile ))
2701
2790
if err != nil {
2702
- return nil , err
2791
+ return nil , fmt . Errorf ( "failed to login to OCI registry: %w" , err )
2703
2792
}
2704
2793
metadata , err := extractChartMeta (chartData )
2705
2794
if err != nil {
2706
- return nil , err
2795
+ return nil , fmt . Errorf ( "failed to extract chart metadata: %w" , err )
2707
2796
}
2708
2797
2709
2798
// Upload the test chart
2710
2799
ref := fmt .Sprintf ("%s/testrepo/%s:%s" , server .registryHost , metadata .Name , metadata .Version )
2711
2800
_ , err = server .registryClient .Push (chartData , ref )
2712
2801
if err != nil {
2713
- return nil , err
2802
+ return nil , fmt . Errorf ( "failed to push chart: %w" , err )
2714
2803
}
2715
2804
2716
2805
return metadata , nil
0 commit comments