@@ -18,7 +18,10 @@ package common
1818
1919import (
2020 "fmt"
21+ "strconv"
2122 "strings"
23+
24+ "k8s.io/klog/v2"
2225)
2326
2427const (
@@ -32,7 +35,11 @@ const (
3235 ParameterAvailabilityClass = "availability-class"
3336 ParameterKeyEnableConfidentialCompute = "enable-confidential-storage"
3437 ParameterKeyStoragePools = "storage-pools"
35- ParameterKeyResourceTags = "resource-tags"
38+
39+ // Parameters for Data Cache
40+ ParameterKeyDataCacheSize = "data-cache-size"
41+ ParameterKeyDataCacheMode = "data-cache-mode"
42+ ParameterKeyResourceTags = "resource-tags"
3643
3744 // Parameters for VolumeSnapshotClass
3845 ParameterKeyStorageLocations = "storage-locations"
@@ -68,6 +75,15 @@ const (
6875 tagKeyCreatedForSnapshotContentName = "kubernetes.io/created-for/volumesnapshotcontent/name"
6976)
7077
78+ type DataCacheParameters struct {
79+ // Values: {string} in int64 form
80+ // Default: ""
81+ DataCacheSize string
82+ // Values: writethrough, writeback
83+ // Default: writethrough
84+ DataCacheMode string
85+ }
86+
7187// DiskParameters contains normalized and defaulted disk parameters
7288type DiskParameters struct {
7389 // Values: pd-standard, pd-balanced, pd-ssd, or any other PD disk type. Not validated.
@@ -125,7 +141,7 @@ type StoragePool struct {
125141// put them into a well defined struct making sure to default unspecified fields.
126142// extraVolumeLabels are added as labels; if there are also labels specified in
127143// parameters, any matching extraVolumeLabels will be overridden.
128- func ExtractAndDefaultParameters (parameters map [string ]string , driverName string , extraVolumeLabels map [string ]string , enableStoragePools bool , extraTags map [string ]string ) (DiskParameters , error ) {
144+ func ExtractAndDefaultParameters (parameters map [string ]string , driverName string , extraVolumeLabels map [string ]string , enableStoragePools bool , enableDataCache bool , extraTags map [string ]string ) (DiskParameters , DataCacheParameters , error ) {
129145 p := DiskParameters {
130146 DiskType : "pd-standard" , // Default
131147 ReplicationType : replicationTypeNone , // Default
@@ -135,6 +151,12 @@ func ExtractAndDefaultParameters(parameters map[string]string, driverName string
135151 ResourceTags : make (map [string ]string ), // Default
136152 }
137153
154+ // Set data cache mode default
155+ d := DataCacheParameters {}
156+ if enableDataCache && parameters [ParameterKeyDataCacheSize ] != "" {
157+ d .DataCacheMode = DataCacheModeWriteThrough
158+ }
159+
138160 for k , v := range extraVolumeLabels {
139161 p .Labels [k ] = v
140162 }
@@ -169,7 +191,7 @@ func ExtractAndDefaultParameters(parameters map[string]string, driverName string
169191 case ParameterKeyLabels :
170192 paramLabels , err := ConvertLabelsStringToMap (v )
171193 if err != nil {
172- return p , fmt .Errorf ("parameters contain invalid labels parameter: %w" , err )
194+ return p , d , fmt .Errorf ("parameters contain invalid labels parameter: %w" , err )
173195 }
174196 // Override any existing labels with those from this parameter.
175197 for labelKey , labelValue := range paramLabels {
@@ -178,58 +200,79 @@ func ExtractAndDefaultParameters(parameters map[string]string, driverName string
178200 case ParameterKeyProvisionedIOPSOnCreate :
179201 paramProvisionedIOPSOnCreate , err := ConvertStringToInt64 (v )
180202 if err != nil {
181- return p , fmt .Errorf ("parameters contain invalid provisionedIOPSOnCreate parameter: %w" , err )
203+ return p , d , fmt .Errorf ("parameters contain invalid provisionedIOPSOnCreate parameter: %w" , err )
182204 }
183205 p .ProvisionedIOPSOnCreate = paramProvisionedIOPSOnCreate
184206 case ParameterKeyProvisionedThroughputOnCreate :
185207 paramProvisionedThroughputOnCreate , err := ConvertMiStringToInt64 (v )
186208 if err != nil {
187- return p , fmt .Errorf ("parameters contain invalid provisionedThroughputOnCreate parameter: %w" , err )
209+ return p , d , fmt .Errorf ("parameters contain invalid provisionedThroughputOnCreate parameter: %w" , err )
188210 }
189211 p .ProvisionedThroughputOnCreate = paramProvisionedThroughputOnCreate
190212 case ParameterAvailabilityClass :
191213 paramAvailabilityClass , err := ConvertStringToAvailabilityClass (v )
192214 if err != nil {
193- return p , fmt .Errorf ("parameters contain invalid availability class parameter: %w" , err )
215+ return p , d , fmt .Errorf ("parameters contain invalid availability class parameter: %w" , err )
194216 }
195217 if paramAvailabilityClass == ParameterRegionalHardFailoverClass {
196218 p .ForceAttach = true
197219 }
198220 case ParameterKeyEnableConfidentialCompute :
199221 paramEnableConfidentialCompute , err := ConvertStringToBool (v )
200222 if err != nil {
201- return p , fmt .Errorf ("parameters contain invalid value for enable-confidential-storage parameter: %w" , err )
223+ return p , d , fmt .Errorf ("parameters contain invalid value for enable-confidential-storage parameter: %w" , err )
202224 }
203225
204226 if paramEnableConfidentialCompute {
205227 // DiskEncryptionKmsKey is needed to enable confidentialStorage
206228 if val , ok := parameters [ParameterKeyDiskEncryptionKmsKey ]; ! ok || ! isValidDiskEncryptionKmsKey (val ) {
207- return p , fmt .Errorf ("Valid %v is required to enable ConfidentialStorage" , ParameterKeyDiskEncryptionKmsKey )
229+ return p , d , fmt .Errorf ("Valid %v is required to enable ConfidentialStorage" , ParameterKeyDiskEncryptionKmsKey )
208230 }
209231 }
210232
211233 p .EnableConfidentialCompute = paramEnableConfidentialCompute
212234 case ParameterKeyStoragePools :
213235 if ! enableStoragePools {
214- return p , fmt .Errorf ("parameters contains invalid option %q" , ParameterKeyStoragePools )
236+ return p , d , fmt .Errorf ("parameters contains invalid option %q" , ParameterKeyStoragePools )
215237 }
216238 storagePools , err := ParseStoragePools (v )
217239 if err != nil {
218- return p , fmt .Errorf ("parameters contain invalid value for %s parameter: %w" , ParameterKeyStoragePools , err )
240+ return p , d , fmt .Errorf ("parameters contain invalid value for %s parameter: %w" , ParameterKeyStoragePools , err )
219241 }
220242 p .StoragePools = storagePools
243+ case ParameterKeyDataCacheSize :
244+ if ! enableDataCache {
245+ return p , d , fmt .Errorf ("data caching enabled: %v; parameters contains invalid option %q" , enableDataCache , ParameterKeyDataCacheSize )
246+ }
247+ // TODO: need to parse or validate the string
248+
249+ paramDataCacheSize , err := ConvertGiStringToInt64 (v )
250+ if err != nil {
251+ return p , d , fmt .Errorf ("parameters contain invalid dataCacheSize parameter: %w" , err )
252+ }
253+ d .DataCacheSize = strconv .FormatInt (paramDataCacheSize , 10 )
254+ klog .V (2 ).Infof ("====== Data cache size is %v ======" , v )
255+ case ParameterKeyDataCacheMode :
256+ if ! enableDataCache {
257+ return p , d , fmt .Errorf ("data caching enabled %v; parameters contains invalid option %q" , enableDataCache , ParameterKeyDataCacheSize )
258+ }
259+ if err := ValidateDataCacheMode (v ); err != nil {
260+ return p , d , fmt .Errorf ("parameters contains invalid option: %w" , err )
261+ }
262+ d .DataCacheMode = v
263+ klog .V (2 ).Infof ("====== Data cache mode is %v ======" , v )
221264 case ParameterKeyResourceTags :
222265 if err := extractResourceTagsParameter (v , p .ResourceTags ); err != nil {
223- return p , err
266+ return p , d , err
224267 }
225268 default :
226- return p , fmt .Errorf ("parameters contains invalid option %q" , k )
269+ return p , d , fmt .Errorf ("parameters contains invalid option %q" , k )
227270 }
228271 }
229272 if len (p .Tags ) > 0 {
230273 p .Tags [tagKeyCreatedBy ] = driverName
231274 }
232- return p , nil
275+ return p , d , nil
233276}
234277
235278func ExtractAndDefaultSnapshotParameters (parameters map [string ]string , driverName string , extraTags map [string ]string ) (SnapshotParameters , error ) {
0 commit comments