Skip to content

Commit 6293fe1

Browse files
committed
refactoring and fix tests
Signed-off-by: Soule BA <[email protected]>
1 parent bb0c982 commit 6293fe1

17 files changed

+399
-170
lines changed

api/v1/zz_generated.deepcopy.go

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1beta1/zz_generated.deepcopy.go

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1beta2/zz_generated.deepcopy.go

Lines changed: 11 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/spec/v1beta2/helmrepositories.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,10 +459,16 @@ a deprecation warning will be logged.
459459

460460
### Cert secret reference
461461

462+
<<<<<<< HEAD
462463
**Note:** TLS authentication is not yet supported by OCI Helm repositories.
463464

464465
`.spec.certSecretRef.name` is an optional field to specify a secret containing TLS
465466
certificate data. The secret can contain the following keys:
467+
=======
468+
To provide TLS credentials to use while connecting with the Helm repository,
469+
the referenced Secret is expected to contain `.data.certFile` and
470+
`.data.keyFile`, and/or `.data.caFile` values.
471+
>>>>>>> 3df4c49 (refactoring and fix tests)
466472

467473
* `certFile` and `keyFile`, to specify the client certificate and private key used for
468474
TLS client authentication. These must be used in conjunction, i.e. specifying one without
@@ -509,6 +515,28 @@ data:
509515
caFile: <BASE64>
510516
```
511517

518+
#### Provide TLS credentials in a secret of type kubernetes.io/dockerconfigjson
519+
520+
For OCI Helm repositories, Kubernetes secrets of type [kubernetes.io/dockerconfigjson](https://kubernetes.io/docs/concepts/configuration/secret/#secret-types)
521+
are also supported. It is possible to append TLS credentials to the secret data.
522+
523+
For example:
524+
525+
```yaml
526+
apiVersion: v1
527+
kind: Secret
528+
metadata:
529+
name: example-tls
530+
namespace: default
531+
type: kubernetes.io/dockerconfigjson
532+
data:
533+
.dockerconfigjson: <BASE64>
534+
certFile: <BASE64>
535+
keyFile: <BASE64>
536+
# NOTE: Can be supplied without the above values
537+
caFile: <BASE64>
538+
```
539+
512540
### Pass credentials
513541

514542
`.spec.passCredentials` is an optional field to allow the credentials from the

internal/controller/helmchart_controller_test.go

Lines changed: 61 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,7 +1069,7 @@ func TestHelmChartReconciler_buildFromOCIHelmRepository(t *testing.T) {
10691069
g.Expect(err).NotTo(HaveOccurred())
10701070

10711071
// Upload the test chart
1072-
metadata, err := loadTestChartToOCI(chartData, chartPath, testRegistryServer)
1072+
metadata, err := loadTestChartToOCI(chartData, testRegistryServer, "", "", "")
10731073
g.Expect(err).NotTo(HaveOccurred())
10741074

10751075
storage, err := NewStorage(tmpDir, "example.com", retentionTTL, retentionRecords)
@@ -2197,14 +2197,15 @@ func TestHelmChartReconciler_reconcileSourceFromOCI_authStrategy(t *testing.T) {
21972197
type secretOptions struct {
21982198
username string
21992199
password string
2200-
ca []byte
22012200
}
22022201

22032202
tests := []struct {
22042203
name string
22052204
url string
22062205
registryOpts registryOptions
22072206
secretOpts secretOptions
2207+
secret *corev1.Secret
2208+
withTLS bool
22082209
provider string
22092210
providerImg string
22102211
want sreconcile.Result
@@ -2229,6 +2230,13 @@ func TestHelmChartReconciler_reconcileSourceFromOCI_authStrategy(t *testing.T) {
22292230
username: testRegistryUsername,
22302231
password: testRegistryPassword,
22312232
},
2233+
secret: &corev1.Secret{
2234+
ObjectMeta: metav1.ObjectMeta{
2235+
Name: "auth-secretref",
2236+
},
2237+
Type: corev1.SecretTypeDockerConfigJson,
2238+
Data: map[string][]byte{},
2239+
},
22322240
assertConditions: []metav1.Condition{
22332241
*conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "building artifact: pulled 'helmchart' chart with version '0.1.0'"),
22342242
*conditions.UnknownCondition(meta.ReadyCondition, meta.ProgressingReason, "building artifact: pulled 'helmchart' chart with version '0.1.0'"),
@@ -2245,6 +2253,13 @@ func TestHelmChartReconciler_reconcileSourceFromOCI_authStrategy(t *testing.T) {
22452253
username: "wrong-pass",
22462254
password: "wrong-pass",
22472255
},
2256+
secret: &corev1.Secret{
2257+
ObjectMeta: metav1.ObjectMeta{
2258+
Name: "auth-secretref",
2259+
},
2260+
Type: corev1.SecretTypeDockerConfigJson,
2261+
Data: map[string][]byte{},
2262+
},
22482263
assertConditions: []metav1.Condition{
22492264
*conditions.TrueCondition(sourcev1.FetchFailedCondition, "Unknown", "unknown build error: failed to login to OCI registry"),
22502265
},
@@ -2268,6 +2283,13 @@ func TestHelmChartReconciler_reconcileSourceFromOCI_authStrategy(t *testing.T) {
22682283
username: testRegistryUsername,
22692284
password: testRegistryPassword,
22702285
},
2286+
secret: &corev1.Secret{
2287+
ObjectMeta: metav1.ObjectMeta{
2288+
Name: "auth-secretref",
2289+
},
2290+
Type: corev1.SecretTypeDockerConfigJson,
2291+
Data: map[string][]byte{},
2292+
},
22712293
provider: "azure",
22722294
assertConditions: []metav1.Condition{
22732295
*conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "building artifact: pulled 'helmchart' chart with version '0.1.0'"),
@@ -2278,27 +2300,47 @@ func TestHelmChartReconciler_reconcileSourceFromOCI_authStrategy(t *testing.T) {
22782300
name: "HTTPS With invalid CA cert",
22792301
wantErr: true,
22802302
registryOpts: registryOptions{
2281-
withBasicAuth: true,
2303+
withTLS: true,
22822304
},
2305+
withTLS: true,
22832306
secretOpts: secretOptions{
22842307
username: testRegistryUsername,
22852308
password: testRegistryPassword,
2286-
ca: []byte("invalid-ca"),
2309+
},
2310+
secret: &corev1.Secret{
2311+
ObjectMeta: metav1.ObjectMeta{
2312+
Name: "auth-secretref",
2313+
},
2314+
Type: corev1.SecretTypeDockerConfigJson,
2315+
Data: map[string][]byte{
2316+
"caFile": []byte("invalid caFile"),
2317+
},
22872318
},
22882319
assertConditions: []metav1.Condition{
2289-
*conditions.TrueCondition(sourcev1.FetchFailedCondition, "Unknown", "unknown build error: failed to login to OCI registry"),
2320+
*conditions.TrueCondition(sourcev1.FetchFailedCondition, "Unknown", "unknown build error: failed to create TLS client config with secret data: cannot append certificate into certificate pool: invalid caFile"),
22902321
},
22912322
},
22922323
{
22932324
name: "HTTPS With CA cert",
22942325
want: sreconcile.ResultSuccess,
22952326
registryOpts: registryOptions{
2296-
withBasicAuth: true,
2327+
withTLS: true,
22972328
},
2329+
withTLS: true,
22982330
secretOpts: secretOptions{
22992331
username: testRegistryUsername,
23002332
password: testRegistryPassword,
2301-
ca: []byte(tlsCA),
2333+
},
2334+
secret: &corev1.Secret{
2335+
ObjectMeta: metav1.ObjectMeta{
2336+
Name: "auth-secretref",
2337+
},
2338+
Type: corev1.SecretTypeDockerConfigJson,
2339+
Data: map[string][]byte{
2340+
"caFile": tlsCA,
2341+
"certFile": tlsPublicKey,
2342+
"keyFile": tlsPrivateKey,
2343+
},
23022344
},
23032345
assertConditions: []metav1.Condition{
23042346
*conditions.TrueCondition(meta.ReconcilingCondition, meta.ProgressingReason, "building artifact: pulled 'helmchart' chart with version '0.1.0'"),
@@ -2319,13 +2361,16 @@ func TestHelmChartReconciler_reconcileSourceFromOCI_authStrategy(t *testing.T) {
23192361

23202362
server, err := setupRegistryServer(ctx, workspaceDir, tt.registryOpts)
23212363
g.Expect(err).NotTo(HaveOccurred())
2364+
if tt.withTLS {
2365+
defer server.stopSrv()
2366+
}
23222367

23232368
// Load a test chart
23242369
chartData, err := os.ReadFile(chartPath)
23252370
g.Expect(err).ToNot(HaveOccurred())
23262371

23272372
// Upload the test chart
2328-
metadata, err := loadTestChartToOCI(chartData, chartPath, server)
2373+
metadata, err := loadTestChartToOCI(chartData, server, "testdata/certs/server.pem", "testdata/certs/server-key.pem", "testdata/certs/ca.pem")
23292374
g.Expect(err).ToNot(HaveOccurred())
23302375

23312376
repo := &helmv1.HelmRepository{
@@ -2351,40 +2396,16 @@ func TestHelmChartReconciler_reconcileSourceFromOCI_authStrategy(t *testing.T) {
23512396
repo.Spec.URL = tt.providerImg
23522397
}
23532398

2354-
var secret *corev1.Secret
23552399
if tt.secretOpts.username != "" && tt.secretOpts.password != "" {
2356-
secret = &corev1.Secret{
2357-
ObjectMeta: metav1.ObjectMeta{
2358-
Name: "auth-secretref",
2359-
},
2360-
Type: corev1.SecretTypeDockerConfigJson,
2361-
Data: map[string][]byte{
2362-
".dockerconfigjson": []byte(fmt.Sprintf(`{"auths": {%q: {"username": %q, "password": %q}}}`,
2363-
server.registryHost, tt.secretOpts.username, tt.secretOpts.password)),
2364-
},
2365-
}
2366-
}
2367-
2368-
if tt.secretOpts.ca != nil {
2369-
if secret == nil {
2370-
secret = &corev1.Secret{
2371-
ObjectMeta: metav1.ObjectMeta{
2372-
Name: "auth-secretref",
2373-
},
2374-
Data: map[string][]byte{
2375-
"caFile": tt.secretOpts.ca,
2376-
},
2377-
}
2378-
} else {
2379-
secret.Data["caFile"] = tt.secretOpts.ca
2380-
}
2400+
tt.secret.Data[".dockerconfigjson"] = []byte(fmt.Sprintf(`{"auths": {%q: {"username": %q, "password": %q}}}`,
2401+
server.registryHost, tt.secretOpts.username, tt.secretOpts.password))
23812402
}
23822403

2383-
if secret != nil {
2404+
if tt.secret != nil {
23842405
repo.Spec.SecretRef = &meta.LocalObjectReference{
2385-
Name: secret.Name,
2406+
Name: tt.secret.Name,
23862407
}
2387-
clientBuilder.WithObjects(secret, repo)
2408+
clientBuilder.WithObjects(tt.secret, repo)
23882409
} else {
23892410
clientBuilder.WithObjects(repo)
23902411
}
@@ -2457,7 +2478,7 @@ func TestHelmChartReconciler_reconcileSourceFromOCI_verifySignature(t *testing.T
24572478
g.Expect(err).ToNot(HaveOccurred())
24582479

24592480
// Upload the test chart
2460-
metadata, err := loadTestChartToOCI(chartData, chartPath, server)
2481+
metadata, err := loadTestChartToOCI(chartData, server, "", "", "")
24612482
g.Expect(err).NotTo(HaveOccurred())
24622483

24632484
storage, err := NewStorage(tmpDir, "example.com", retentionTTL, retentionRecords)
@@ -2688,17 +2709,11 @@ func extractChartMeta(chartData []byte) (*hchart.Metadata, error) {
26882709
return ch.Metadata, nil
26892710
}
26902711

2691-
func loadTestChartToOCI(chartData []byte, chartPath string, server *registryClientTestServer) (*hchart.Metadata, error) {
2712+
func loadTestChartToOCI(chartData []byte, server *registryClientTestServer, certFile, keyFile, cafile string) (*hchart.Metadata, error) {
26922713
// Login to the registry
26932714
err := server.registryClient.Login(server.registryHost,
26942715
helmreg.LoginOptBasicAuth(testRegistryUsername, testRegistryPassword),
2695-
helmreg.LoginOptInsecure(true))
2696-
if err != nil {
2697-
return nil, err
2698-
}
2699-
2700-
// Load a test chart
2701-
chartData, err = os.ReadFile(chartPath)
2716+
helmreg.LoginOptTLSClientConfig(certFile, keyFile, cafile))
27022717
if err != nil {
27032718
return nil, err
27042719
}

0 commit comments

Comments
 (0)