Skip to content

Commit 4b6fb61

Browse files
Bugfix: Stop base64 decoding ConfigMap.BinaryData (#47)
Ensure Kubernetes env provider does not decode binary data as base64.
1 parent 634dac6 commit 4b6fb61

File tree

3 files changed

+52
-47
lines changed

3 files changed

+52
-47
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
55
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

77
## [Unreleased]
8+
## [0.3.4] - 2022-11-24
9+
### Changed
10+
- Bugfix: Stop explicit base64 decoding of BinaryData from ConfigMap in Kubernetes env provider
11+
812
## [0.3.3] - 2022-11-24
913
### Changed
1014
- Kubernetes env provider can now read the trust bundle from both BinaryData and Data

environment/providers/kubernetes/kubernetes.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
package kubernetes
66

77
import (
8-
"encoding/base64"
98
"fmt"
109
"net/url"
1110

@@ -40,11 +39,7 @@ func (prov *provider) getAdditionalTrustBundle() (string, error) {
4039
return cert, nil
4140
}
4241
if b64Cert, ok := cm.BinaryData[certBundleKey]; ok {
43-
cert, err := base64.StdEncoding.DecodeString(string(b64Cert))
44-
if err != nil {
45-
return "", err
46-
}
47-
return string(cert), nil
42+
return string(b64Cert), nil
4843
}
4944
return "", nil
5045
}

environment/providers/kubernetes/kubernetes_test.go

Lines changed: 47 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,14 @@ import (
1111
. "github.com/onsi/gomega"
1212
corev1 "k8s.io/api/core/v1"
1313
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14+
"k8s.io/apimachinery/pkg/runtime"
15+
"k8s.io/apimachinery/pkg/runtime/serializer"
1416
krand "k8s.io/apimachinery/pkg/util/rand"
1517
"k8s.io/client-go/informers"
1618
coreinformers "k8s.io/client-go/informers/core/v1"
1719
"k8s.io/client-go/kubernetes"
1820
"k8s.io/client-go/kubernetes/fake"
21+
"k8s.io/client-go/kubernetes/scheme"
1922
"k8s.io/client-go/tools/cache"
2023

2124
"github.com/nutanix-cloud-native/prism-go-client/environment/credentials"
@@ -56,22 +59,21 @@ func runCMInformer(ctx context.Context, clientset kubernetes.Interface) coreinfo
5659
var _ = Describe("Kubernetes Environment Provider", Ordered, func() {
5760
expectedCACert, expectedB64CACert, err := certutils.GenerateCACertForTesting()
5861
Expect(err).ToNot(HaveOccurred())
59-
6062
var (
61-
secretName = "nutanix-credentials"
62-
cmName = "user-ca-bundle"
63-
secretNamespace = "kube-system"
64-
secretInformer coreinformers.SecretInformer
65-
cmInformer coreinformers.ConfigMapInformer
66-
prov types.Provider
67-
ip = krand.String(10)
68-
username = krand.String(10)
69-
password = krand.String(10)
63+
cmName = "user-ca-bundle"
64+
namespace = "kube-system"
65+
secretName = "nutanix-credentials"
66+
secretInformer coreinformers.SecretInformer
67+
cmInformer coreinformers.ConfigMapInformer
68+
prov types.Provider
69+
ip = krand.String(10)
70+
username = krand.String(10)
71+
password = krand.String(10)
7072

7173
fakeSecret = &corev1.Secret{
7274
ObjectMeta: metav1.ObjectMeta{
7375
Name: secretName,
74-
Namespace: secretNamespace,
76+
Namespace: namespace,
7577
},
7678
Data: map[string][]byte{
7779
"credentials": []byte(fmt.Sprintf(`
@@ -90,49 +92,53 @@ var _ = Describe("Kubernetes Environment Provider", Ordered, func() {
9092
`, username, password)),
9193
},
9294
}
93-
fakeCM = &corev1.ConfigMap{
94-
ObjectMeta: metav1.ObjectMeta{
95-
Name: cmName,
96-
Namespace: secretNamespace,
97-
},
98-
BinaryData: map[string][]byte{
99-
certBundleKey: []byte(expectedB64CACert),
100-
},
101-
}
102-
103-
fakeClientset = fake.NewSimpleClientset(fakeSecret, fakeCM)
104-
prismEndpoint = credentials.NutanixPrismEndpoint{
105-
Address: ip,
106-
Port: 9440,
107-
Insecure: true,
108-
CredentialRef: &credentials.NutanixCredentialReference{
109-
Kind: credentials.SecretKind,
110-
Name: secretName,
111-
Namespace: secretNamespace,
112-
},
113-
AdditionalTrustBundle: &credentials.NutanixTrustBundleReference{
114-
Kind: credentials.NutanixTrustBundleKindConfigMap,
115-
Name: cmName,
116-
Namespace: secretNamespace,
117-
},
118-
}
11995
)
96+
97+
const fakeCMTemplate = `apiVersion: v1
98+
kind: ConfigMap
99+
metadata:
100+
name: %s
101+
namespace: %s
102+
binaryData:
103+
ca.crt: %s`
104+
fakeCMStr := fmt.Sprintf(fakeCMTemplate, cmName, namespace, expectedB64CACert)
105+
decoder := serializer.NewCodecFactory(scheme.Scheme).UniversalDecoder()
106+
fakeCM := &corev1.ConfigMap{}
107+
err = runtime.DecodeInto(decoder, []byte(fakeCMStr), fakeCM)
108+
Expect(err).ToNot(HaveOccurred())
109+
110+
fakeClientset := fake.NewSimpleClientset(fakeSecret, fakeCM)
111+
prismEndpoint := credentials.NutanixPrismEndpoint{
112+
Address: ip,
113+
Port: 9440,
114+
Insecure: true,
115+
CredentialRef: &credentials.NutanixCredentialReference{
116+
Kind: credentials.SecretKind,
117+
Name: secretName,
118+
Namespace: namespace,
119+
},
120+
AdditionalTrustBundle: &credentials.NutanixTrustBundleReference{
121+
Kind: credentials.NutanixTrustBundleKindConfigMap,
122+
Name: cmName,
123+
Namespace: namespace,
124+
},
125+
}
120126
BeforeAll(func() {
121127
secretInformer = runSecretInformer(context.TODO(), fakeClientset)
122128
cmInformer = runCMInformer(context.TODO(), fakeClientset)
123129
prov = NewProvider(prismEndpoint, secretInformer, cmInformer)
124130
})
125131
It("must be able to look up secret", func() {
126-
_, err := fakeClientset.CoreV1().Secrets(secretNamespace).Get(context.TODO(), secretName, metav1.GetOptions{})
132+
_, err := fakeClientset.CoreV1().Secrets(namespace).Get(context.TODO(), secretName, metav1.GetOptions{})
127133
Expect(err).To(Succeed())
128134

129-
_, err = secretInformer.Lister().Secrets(secretNamespace).Get(secretName)
135+
_, err = secretInformer.Lister().Secrets(namespace).Get(secretName)
130136
Expect(err).To(Succeed())
131137

132-
_, err = fakeClientset.CoreV1().ConfigMaps(secretNamespace).Get(context.TODO(), cmName, metav1.GetOptions{})
138+
_, err = fakeClientset.CoreV1().ConfigMaps(namespace).Get(context.TODO(), cmName, metav1.GetOptions{})
133139
Expect(err).To(Succeed())
134140

135-
_, err = cmInformer.Lister().ConfigMaps(secretNamespace).Get(cmName)
141+
_, err = cmInformer.Lister().ConfigMaps(namespace).Get(cmName)
136142
Expect(err).To(Succeed())
137143
})
138144
It("must get management endpoint", func() {

0 commit comments

Comments
 (0)