Skip to content

Commit c5bec27

Browse files
committed
Use credentials when calling ControllerModifyVolume
Storage providers expect to obtain secrets from the ControllerMoodifyVolume CSI procedure. Without these credentials, it may not be possible to apply the parameters of a VolumeAttributeClass. A CSIPersistentVolumeSource does not have ControllerModifySecretRef (like ControllerExpandSecretRef), so in order to resolve credentials a secret reference from annotations on the PersistentVolume are used: - volume.kubernetes.io/controller-modify-secret-name - volume.kubernetes.io/controller-modify-secret-namespace In absence of these annotations, the ControllerExpandSecretRef of the CSIPersistentVolumeSource used as a fallback.
1 parent fe9e0f4 commit c5bec27

File tree

1 file changed

+40
-3
lines changed

1 file changed

+40
-3
lines changed

pkg/modifier/csi_modifier.go

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,17 @@ import (
2424

2525
"github.com/kubernetes-csi/external-resizer/pkg/csi"
2626
v1 "k8s.io/api/core/v1"
27+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2728
"k8s.io/client-go/informers"
2829
"k8s.io/client-go/kubernetes"
2930
)
3031

32+
const (
33+
// annotations set by the external-provisioner when a modify secret is configured
34+
modifySecretNameAnn = "volume.kubernetes.io/controller-modify-secret-name"
35+
modifySecretNamespaceAnn = "volume.kubernetes.io/controller-modify-secret-namespace"
36+
)
37+
3138
var ModifyNotSupportErr = errors.New("CSI driver does not support controller modify")
3239

3340
func NewModifierFromClient(
@@ -86,18 +93,48 @@ func (r *csiModifier) Modify(pv *v1.PersistentVolume, mutableParameters map[stri
8693
return errors.New("empty volume handle")
8794
}
8895

89-
var secrets map[string]string
96+
secrets, err := r.getModifyCredentials(source.ControllerExpandSecretRef, pv.Annotations)
97+
if err != nil {
98+
return err
99+
}
90100

91101
ctx, cancel := timeoutCtx(r.timeout)
92-
93102
defer cancel()
94-
err := r.client.Modify(ctx, volumeID, secrets, mutableParameters)
103+
104+
err = r.client.Modify(ctx, volumeID, secrets, mutableParameters)
95105
if err != nil {
96106
return err
97107
}
108+
98109
return nil
99110
}
100111

112+
// getModifyCredentials fetches the credential from the secret referenced in the annotations. When missing,
113+
// the default secretRef (CSIPersistentVolumeSource.ControllerExpandSecretRef) is used.
114+
func (r *csiModifier) getModifyCredentials(secretRef *v1.SecretReference, annotations map[string]string) (map[string]string, error) {
115+
secretName := annotations[modifySecretNameAnn]
116+
secretNamespace := annotations[modifySecretNamespaceAnn]
117+
if secretNamespace == "" || secretName == "" {
118+
if secretRef == nil {
119+
return nil, nil
120+
}
121+
122+
secretName = secretRef.Name
123+
secretNamespace = secretRef.Namespace
124+
}
125+
126+
secret, err := r.k8sClient.CoreV1().Secrets(secretNamespace).Get(context.TODO(), secretName, metav1.GetOptions{})
127+
if err != nil {
128+
return nil, fmt.Errorf("error getting secret %s in namespace %s: %v", secretName, secretNamespace, err)
129+
}
130+
131+
credentials := map[string]string{}
132+
for key, value := range secret.Data {
133+
credentials[key] = string(value)
134+
}
135+
return credentials, nil
136+
}
137+
101138
func supportsControllerModify(client csi.Client, timeout time.Duration) (bool, error) {
102139
ctx, cancel := timeoutCtx(timeout)
103140
defer cancel()

0 commit comments

Comments
 (0)