Skip to content

Commit b4a7143

Browse files
authored
[manila-csi-plugin] Add csi-provisioner's --extra-create-metadata as share metadata (kubernetes#2023)
* manila-csi-plugin: Add volume parameters passed from csi-provisioner as metadata * charts: Add extraCreateMetadata value to run csi-provisioner with --extra-create-metadata
1 parent 0418c18 commit b4a7143

File tree

4 files changed

+80
-8
lines changed

4 files changed

+80
-8
lines changed

charts/manila-csi-plugin/templates/controllerplugin-statefulset.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ spec:
2626
{{- if $.Values.csimanila.topologyAwarenessEnabled }}
2727
- "--feature-gates=Topology=true"
2828
{{- end }}
29+
{{- if $.Values.controllerplugin.provisioner.extraCreateMetadata }}
30+
- "--extra-create-metadata"
31+
{{- end }}
2932
env:
3033
- name: ADDRESS
3134
value: "unix:///var/lib/kubelet/plugins/{{ printf "%s.%s" .protocolSelector $.Values.driverName | lower }}/csi-controllerplugin.sock"

charts/manila-csi-plugin/values.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ controllerplugin:
7979
tag: v3.0.0
8080
pullPolicy: IfNotPresent
8181
resources: {}
82+
# Whether to pass --extra-create-metadata flag to csi-provisioner.
83+
extraCreateMetadata: false
8284
# CSI external-snapshotter container spec
8385
snapshotter:
8486
image:

pkg/csi/manila/controllerserver.go

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,15 @@ type controllerServer struct {
4343
var (
4444
pendingVolumes = sync.Map{}
4545
pendingSnapshots = sync.Map{}
46+
47+
// Recognized volume parameters passed by Kubernetes csi-provisioner sidecar
48+
// when run with --extra-create-metadata flag. These are added to metadata
49+
// of newly created shares if present.
50+
recognizedCSIProvisionerParams = []string{
51+
"csi.storage.k8s.io/pvc/name",
52+
"csi.storage.k8s.io/pvc/namespace",
53+
"csi.storage.k8s.io/pv/name",
54+
}
4655
)
4756

4857
func getVolumeCreator(source *csi.VolumeContentSource, shareOpts *options.ControllerVolumeContext, compatOpts *options.CompatibilityOptions) (volumeCreator, error) {
@@ -92,7 +101,7 @@ func (cs *controllerServer) CreateVolume(ctx context.Context, req *csi.CreateVol
92101
return nil, status.Errorf(codes.InvalidArgument, "invalid volume parameters: %v", err)
93102
}
94103

95-
shareMetadata, err := prepareShareMetadata(shareOpts.AppendShareMetadata, cs.d.clusterID)
104+
shareMetadata, err := prepareShareMetadata(shareOpts.AppendShareMetadata, cs.d.clusterID, params)
96105
if err != nil {
97106
return nil, err
98107
}
@@ -485,16 +494,34 @@ func parseStringMapFromJSON(data string) (m map[string]string, err error) {
485494
return
486495
}
487496

488-
func prepareShareMetadata(appendShareMetadata, clusterID string) (map[string]string, error) {
489-
shareMetadata, err := parseStringMapFromJSON(appendShareMetadata)
497+
func prepareShareMetadata(appendShareMetadata, clusterID string, volumeParams map[string]string) (map[string]string, error) {
498+
shareMetadata := make(map[string]string)
499+
500+
// Get extra metadata provided by csi-provisioner sidecar if present.
501+
for _, k := range recognizedCSIProvisionerParams {
502+
if v, ok := volumeParams[k]; ok {
503+
shareMetadata[k] = v
504+
}
505+
}
506+
507+
// Get metadata from appendShareMetadata volume parameter.
508+
// It will not overwrite keys defined in recognizedCSIProvisionerParams.
509+
510+
appendShareMetadataMap, err := parseStringMapFromJSON(appendShareMetadata)
490511
if err != nil {
491512
return nil, status.Errorf(codes.InvalidArgument, "failed to parse appendShareMetadata field: %v", err)
492513
}
493514

494-
if clusterID != "" {
495-
if shareMetadata == nil {
496-
shareMetadata = make(map[string]string)
515+
for k, v := range appendShareMetadataMap {
516+
if existingValue, ok := shareMetadata[k]; ok {
517+
klog.Warningf("skip adding share metadata key %s from appendShareMetadata because it already exists with value %s", k, existingValue)
518+
} else {
519+
shareMetadata[k] = v
497520
}
521+
}
522+
523+
// Get cluster ID.
524+
if clusterID != "" {
498525
if val, ok := shareMetadata[clusterMetadataKey]; ok && val != clusterID {
499526
klog.Warningf("skip adding cluster ID %v to share metadata because appended metadata already defines it as %v", clusterID, val)
500527
} else {

pkg/csi/manila/controllerserver_test.go

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,24 @@ import (
2020

2121
func TestPrepareShareMetadata(t *testing.T) {
2222
ts := []struct {
23+
allVolumeParams map[string]string
2324
appendShareMetadata string
2425
cluster string
2526
expectedResult map[string]string
2627
expectedError bool
2728
}{
2829
{
2930
// Empty metadata and cluster
31+
allVolumeParams: map[string]string{},
3032
appendShareMetadata: "",
3133
cluster: "",
3234
expectedResult: nil,
3335
expectedError: false,
3436
},
3537
{
3638
// Existing metadata and empty cluster
37-
appendShareMetadata: "{\"keyA\": \"valueA\", \"keyB\": \"valueB\"}",
39+
allVolumeParams: map[string]string{"appendShareMetadata": `{"keyA": "valueA", "keyB": "valueB"}`},
40+
appendShareMetadata: `{"keyA": "valueA", "keyB": "valueB"}`,
3841
cluster: "",
3942
expectedResult: map[string]string{"keyA": "valueA", "keyB": "valueB"},
4043
expectedError: false,
@@ -48,29 +51,66 @@ func TestPrepareShareMetadata(t *testing.T) {
4851
},
4952
{
5053
// Both metadata and cluster
54+
allVolumeParams: map[string]string{"appendShareMetadata": `{"keyA": "valueA", "keyB": "valueB"}`},
5155
appendShareMetadata: "{\"keyA\": \"valueA\", \"keyB\": \"valueB\"}",
5256
cluster: "MyCluster",
5357
expectedResult: map[string]string{"keyA": "valueA", "keyB": "valueB", clusterMetadataKey: "MyCluster"},
5458
expectedError: false,
5559
},
5660
{
5761
// Overwrite cluster
62+
allVolumeParams: map[string]string{"appendShareMetadata": "{\"keyA\": \"valueA\", \"" + clusterMetadataKey + "\": \"SomeValue\"}"},
5863
appendShareMetadata: "{\"keyA\": \"valueA\", \"" + clusterMetadataKey + "\": \"SomeValue\"}",
5964
cluster: "MyCluster",
6065
expectedResult: map[string]string{"keyA": "valueA", clusterMetadataKey: "SomeValue"},
6166
expectedError: false,
6267
},
6368
{
6469
// Incorrect metadata
70+
allVolumeParams: map[string]string{"appendShareMetadata": "INVALID"},
6571
appendShareMetadata: "INVALID",
6672
cluster: "MyCluster",
6773
expectedResult: nil,
6874
expectedError: true,
6975
},
76+
{
77+
// csi-provisioner PV/PVC metadata
78+
allVolumeParams: map[string]string{
79+
"csi.storage.k8s.io/pvc/name": "pvc-name",
80+
"csi.storage.k8s.io/pvc/namespace": "pvc-namespace",
81+
"csi.storage.k8s.io/pv/name": "pv-name",
82+
},
83+
cluster: "",
84+
expectedResult: map[string]string{
85+
"csi.storage.k8s.io/pvc/name": "pvc-name",
86+
"csi.storage.k8s.io/pvc/namespace": "pvc-namespace",
87+
"csi.storage.k8s.io/pv/name": "pv-name",
88+
},
89+
appendShareMetadata: "",
90+
expectedError: false,
91+
},
92+
{
93+
// csi-provisioner PV/PVC metadata with conflicting appendShareMetadata
94+
allVolumeParams: map[string]string{
95+
"csi.storage.k8s.io/pvc/name": "pvc-name",
96+
"csi.storage.k8s.io/pvc/namespace": "pvc-namespace",
97+
"csi.storage.k8s.io/pv/name": "pv-name",
98+
"appendShareMetadata": `{"csi.storage.k8s.io/pvc/name": "SomeValue", "keyX": "valueX"}`,
99+
},
100+
appendShareMetadata: `{"csi.storage.k8s.io/pvc/name": "SomeValue", "keyX": "valueX"}`,
101+
cluster: "",
102+
expectedResult: map[string]string{
103+
"csi.storage.k8s.io/pvc/name": "pvc-name",
104+
"csi.storage.k8s.io/pvc/namespace": "pvc-namespace",
105+
"csi.storage.k8s.io/pv/name": "pv-name",
106+
"keyX": "valueX",
107+
},
108+
expectedError: false,
109+
},
70110
}
71111

72112
for i := range ts {
73-
result, err := prepareShareMetadata(ts[i].appendShareMetadata, ts[i].cluster)
113+
result, err := prepareShareMetadata(ts[i].appendShareMetadata, ts[i].cluster, ts[i].allVolumeParams)
74114

75115
if err != nil && !ts[i].expectedError {
76116
t.Errorf("test %d: unexpected error: %v", i, err)

0 commit comments

Comments
 (0)