Skip to content

Commit b300372

Browse files
committed
feat: mutation handler for EncryptionConfig
1 parent 2532c3f commit b300372

File tree

7 files changed

+561
-0
lines changed

7 files changed

+561
-0
lines changed

api/v1alpha1/clusterconfig_types.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ import (
1212
"github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/common/pkg/capi/clustertopology/variables"
1313
)
1414

15+
const (
16+
AESCBC EncryptionProvider = "aescbc"
17+
SecretBox EncryptionProvider = "secretbox"
18+
)
19+
1520
var (
1621
DefaultDockerCertSANs = []string{
1722
"localhost",

api/v1alpha1/crds/caren.nutanix.com_genericclusterconfigs.yaml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,23 @@ spec:
233233
- provider
234234
type: object
235235
type: object
236+
encryption:
237+
description: |-
238+
Encryption defines the configuration to enable encryption at REST
239+
This configuration is used by API server to encrypt data before storing it in ETCD.
240+
Currently the encryption only enabled for secrets and configmaps.
241+
properties:
242+
providers:
243+
default: aescbc
244+
description: Encryption providers
245+
enum:
246+
- aescbc
247+
items:
248+
type: string
249+
maxItems: 1
250+
type: array
251+
uniqueItems: true
252+
type: object
236253
etcd:
237254
properties:
238255
image:

common/pkg/k8s/client/create.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Copyright 2024 Nutanix. All rights reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package client
5+
6+
import (
7+
"context"
8+
"fmt"
9+
10+
ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
11+
)
12+
13+
func Create(
14+
ctx context.Context,
15+
c ctrlclient.Client,
16+
obj ctrlclient.Object,
17+
opts ...ctrlclient.CreateOption,
18+
) error {
19+
options := []ctrlclient.CreateOption{ctrlclient.FieldOwner(FieldOwner)}
20+
options = append(options, opts...)
21+
err := c.Create(
22+
ctx,
23+
obj,
24+
options...,
25+
)
26+
if err != nil {
27+
return fmt.Errorf("create object failed: %w", err)
28+
}
29+
return nil
30+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
// Copyright 2024 Nutanix. All rights reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package encryption
5+
6+
import (
7+
"encoding/base64"
8+
"errors"
9+
"testing"
10+
11+
"github.com/stretchr/testify/assert"
12+
apiserverv1 "k8s.io/apiserver/pkg/apis/config/v1"
13+
14+
carenv1 "github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/api/v1alpha1"
15+
)
16+
17+
func Test_encryptionConfigForSecretsAndConfigMaps(t *testing.T) {
18+
testcases := []struct {
19+
name string
20+
providers []carenv1.EncryptionProvider
21+
wantErr error
22+
want *apiserverv1.ResourceConfiguration
23+
}{
24+
{
25+
name: "encryption configuration using aescbc and secretbox providers",
26+
providers: []carenv1.EncryptionProvider{carenv1.AESCBC, carenv1.SecretBox},
27+
wantErr: nil,
28+
want: &apiserverv1.ResourceConfiguration{
29+
Resources: []string{"secrets", "configmaps"},
30+
Providers: []apiserverv1.ProviderConfiguration{
31+
{
32+
AESCBC: &apiserverv1.AESConfiguration{
33+
Keys: []apiserverv1.Key{
34+
{
35+
Name: "key1",
36+
Secret: base64.StdEncoding.EncodeToString([]byte(testToken)),
37+
},
38+
},
39+
},
40+
Secretbox: &apiserverv1.SecretboxConfiguration{
41+
Keys: []apiserverv1.Key{
42+
{
43+
Name: "key1",
44+
Secret: base64.StdEncoding.EncodeToString([]byte(testToken)),
45+
},
46+
},
47+
},
48+
},
49+
},
50+
},
51+
},
52+
{
53+
name: "unsupported encryption provider",
54+
providers: []carenv1.EncryptionProvider{carenv1.EncryptionProvider("kmsv2")},
55+
wantErr: errors.New("unknown encryption provider: kmsv2"),
56+
want: nil,
57+
},
58+
}
59+
60+
for _, tt := range testcases {
61+
t.Run(tt.name, func(t *testing.T) {
62+
got, gErr := encryptionConfigForSecretsAndConfigMaps(tt.providers, testTokenGenerator)
63+
assert.Equal(t, tt.wantErr, gErr)
64+
assert.Equal(t, tt.want, got)
65+
})
66+
}
67+
}

0 commit comments

Comments
 (0)