Skip to content

Commit e88b11f

Browse files
committed
fix: marshal secrets for non node publish secret ref
1 parent 7aec51d commit e88b11f

File tree

3 files changed

+49
-21
lines changed

3 files changed

+49
-21
lines changed

pkg/rotation/reconciler.go

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@ const (
6868
mountRotationCompleteReason = "MountRotationComplete"
6969
k8sSecretRotationFailedReason = "SecretRotationFailed"
7070
k8sSecretRotationCompleteReason = "SecretRotationComplete"
71+
72+
csipodname = "csi.storage.k8s.io/pod.name"
73+
csipodnamespace = "csi.storage.k8s.io/pod.namespace"
74+
csipoduid = "csi.storage.k8s.io/pod.uid"
75+
csipodsa = "csi.storage.k8s.io/serviceAccount.name"
7176
)
7277

7378
// Reconciler reconciles and rotates contents in the pod
@@ -183,14 +188,6 @@ func (r *Reconciler) reconcile(ctx context.Context, spcps *v1alpha1.SecretProvid
183188
errorReason = internalerrors.SecretProviderClassNotFound
184189
return fmt.Errorf("failed to get secret provider class %s/%s, err: %+v", spcNamespace, spcName, err)
185190
}
186-
paramsJSON, err := json.Marshal(spc.Spec.Parameters)
187-
if err != nil {
188-
return fmt.Errorf("failed to marshal parameters, err: %+v", err)
189-
}
190-
permissionJSON, err := json.Marshal(permission)
191-
if err != nil {
192-
return fmt.Errorf("failed to marshal permission, err: %+v", err)
193-
}
194191
// get pod from informer cache
195192
podName, podNamespace := spcps.Status.PodName, spcps.Namespace
196193
pod, err := r.store.GetPod(podName, podNamespace)
@@ -199,6 +196,25 @@ func (r *Reconciler) reconcile(ctx context.Context, spcps *v1alpha1.SecretProvid
199196
return fmt.Errorf("failed to get pod %s/%s, err: %+v", podNamespace, podName, err)
200197
}
201198

199+
parameters := make(map[string]string)
200+
if spc.Spec.Parameters != nil {
201+
parameters = spc.Spec.Parameters
202+
}
203+
// Set these parameters to mimic the exact same attributes we get as part of NodePublishVolumeRequest
204+
parameters[csipodname] = podName
205+
parameters[csipodnamespace] = podNamespace
206+
parameters[csipoduid] = string(pod.UID)
207+
parameters[csipodsa] = pod.Spec.ServiceAccountName
208+
209+
paramsJSON, err := json.Marshal(parameters)
210+
if err != nil {
211+
return fmt.Errorf("failed to marshal parameters, err: %+v", err)
212+
}
213+
permissionJSON, err := json.Marshal(permission)
214+
if err != nil {
215+
return fmt.Errorf("failed to marshal permission, err: %+v", err)
216+
}
217+
202218
// check if the volume pertaining to the current spc is using nodePublishSecretRef for
203219
// accessing external secrets store
204220
var nodePublishSecretRef *v1.LocalObjectReference
@@ -217,6 +233,7 @@ func (r *Reconciler) reconcile(ctx context.Context, spcps *v1alpha1.SecretProvid
217233
}
218234

219235
var secretsJSON []byte
236+
nodePublishSecretData := make(map[string]string)
220237
// read the Kubernetes secret referenced in NodePublishSecretRef and marshal it
221238
// This comprises the secret parameter in the MountRequest to the provider
222239
if nodePublishSecretRef != nil {
@@ -231,15 +248,15 @@ func (r *Reconciler) reconcile(ctx context.Context, spcps *v1alpha1.SecretProvid
231248
return fmt.Errorf("failed to get node publish secret %s/%s, err: %+v", secretNamespace, secretName, err)
232249
}
233250

234-
nodePublishSecretData := make(map[string]string)
235251
for k, v := range secret.Data {
236252
nodePublishSecretData[k] = string(v)
237253
}
238-
secretsJSON, err = json.Marshal(nodePublishSecretData)
239-
if err != nil {
240-
r.generateEvent(pod, v1.EventTypeWarning, mountRotationFailedReason, fmt.Sprintf("failed to marshal node publish secret data, err: %+v", err))
241-
return fmt.Errorf("failed to marshal node publish secret data, err: %+v", err)
242-
}
254+
}
255+
256+
secretsJSON, err = json.Marshal(nodePublishSecretData)
257+
if err != nil {
258+
r.generateEvent(pod, v1.EventTypeWarning, mountRotationFailedReason, fmt.Sprintf("failed to marshal node publish secret data, err: %+v", err))
259+
return fmt.Errorf("failed to marshal node publish secret data, err: %+v", err)
243260
}
244261

245262
// generate a map with the current object versions stored in spc pod status

pkg/secrets-store/provider_client_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ func TestMountContent(t *testing.T) {
5555
socketPath: getTempTestDir(t),
5656
attributes: "{}",
5757
targetPath: "/var/lib/kubelet/pods/d448c6a2-cda8-42e3-84fb-3cf75faa8399/volumes/kubernetes.io~csi/secrets-store-inline/mount",
58-
permission: "0644",
58+
permission: "420",
59+
secrets: "{}",
5960
expectedObjectVersion: map[string]string{"secret/secret1": "v1", "secret/secret2": "v2"},
6061
},
6162
}
@@ -160,7 +161,8 @@ func TestMountContentError(t *testing.T) {
160161
socketPath: getTempTestDir(t),
161162
attributes: "{}",
162163
targetPath: "/var/lib/kubelet/pods/d448c6a2-cda8-42e3-84fb-3cf75faa8399/volumes/kubernetes.io~csi/secrets-store-inline/mount",
163-
permission: "0644",
164+
permission: "420",
165+
secrets: "{}",
164166
expectedErrorCode: "AuthenticationFailed",
165167
},
166168
}

provider/fake/fake_server.go

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ package fake
1818

1919
import (
2020
"context"
21+
"encoding/json"
2122
"fmt"
2223
"net"
24+
"os"
2325

2426
"google.golang.org/grpc"
2527

@@ -77,18 +79,25 @@ func (m *MockCSIProviderServer) Start() error {
7779

7880
// Mount implements provider csi-provider method
7981
func (m *MockCSIProviderServer) Mount(ctx context.Context, req *v1alpha1.MountRequest) (*v1alpha1.MountResponse, error) {
82+
var attrib, secret map[string]string
83+
var filePermission os.FileMode
84+
var err error
85+
8086
if m.returnErr != nil {
8187
return &v1alpha1.MountResponse{}, m.returnErr
8288
}
83-
if len(req.GetAttributes()) == 0 {
84-
return nil, fmt.Errorf("missing attributes")
89+
if err = json.Unmarshal([]byte(req.GetAttributes()), &attrib); err != nil {
90+
return nil, fmt.Errorf("failed to unmarshal attributes, error: %+v", err)
91+
}
92+
if err = json.Unmarshal([]byte(req.GetSecrets()), &secret); err != nil {
93+
return nil, fmt.Errorf("failed to unmarshal secrets, error: %+v", err)
94+
}
95+
if err = json.Unmarshal([]byte(req.GetPermission()), &filePermission); err != nil {
96+
return nil, fmt.Errorf("failed to unmarshal file permission, error: %+v", err)
8597
}
8698
if len(req.GetTargetPath()) == 0 {
8799
return nil, fmt.Errorf("missing target path")
88100
}
89-
if len(req.GetPermission()) == 0 {
90-
return nil, fmt.Errorf("missing permissions")
91-
}
92101
return &v1alpha1.MountResponse{
93102
ObjectVersion: m.objects,
94103
Error: &v1alpha1.Error{

0 commit comments

Comments
 (0)