@@ -13,6 +13,7 @@ import { ucFirst } from '@shell/utils/string';
13
13
import { LVM_DRIVER } from ' ../../../../models/harvester/storage.k8s.io.storageclass' ;
14
14
import { DATA_ENGINE_V2 } from ' ../../../../models/harvester/persistentvolumeclaim' ;
15
15
import { GIBIBYTE } from ' ../../../../utils/unit' ;
16
+ import { VOLUME_MODE } from ' @pkg/harvester/config/types' ;
16
17
17
18
export default {
18
19
name: ' HarvesterEditVolume' ,
@@ -71,6 +72,10 @@ export default {
71
72
return this .$store .getters [' harvester-common/getFeatureEnabled' ](' longhornV2LVMSupport' );
72
73
},
73
74
75
+ thirdPartyStorageClassEnabled () {
76
+ return this .$store .getters [' harvester-common/getFeatureEnabled' ](' thirdPartyStorage' );
77
+ },
78
+
74
79
encryptionValue () {
75
80
return ucFirst (String (this .value .isEncrypted ));
76
81
},
@@ -91,6 +96,18 @@ export default {
91
96
return allPVCs .find ((P ) => P .id === ` ${ this .namespace } /${ this .value .volumeName } ` );
92
97
},
93
98
99
+ showVolumeMode () {
100
+ if (! this .thirdPartyStorageClassEnabled || !! this .value ? .storageClassName === false ) {
101
+ return false ;
102
+ }
103
+
104
+ if (this .isLonghornStorageClass ) {
105
+ return false ;
106
+ }
107
+
108
+ return true ;
109
+ },
110
+
94
111
isDisabled () {
95
112
return ! this .value .newCreateId && this .isEdit && this .isVirtualType ;
96
113
},
@@ -112,14 +129,26 @@ export default {
112
129
113
130
isLonghornV2 () {
114
131
return this .value .pvc ? .isLonghornV2 || this .value .pvc ? .storageClass ? .isLonghornV2 ;
115
- }
132
+ },
133
+
134
+ isLonghornStorageClass () {
135
+ const selectedSC = this .storageClasses .find ((sc ) => sc .name === this .value ? .storageClassName ) || {};
136
+
137
+ return selectedSC && selectedSC .isLonghorn ;
138
+ },
139
+
140
+ volumeModeOptions () {
141
+ return Object .values (VOLUME_MODE );
142
+ },
116
143
},
117
144
118
145
watch: {
119
146
' value.storageClassName' : {
120
147
immediate: true ,
121
148
handler (neu ) {
122
149
this .value .accessMode = this .getAccessMode (neu);
150
+ this .value .volumeMode = this .getVolumeMode (neu, this .value .volumeMode );
151
+ this .update ();
123
152
}
124
153
},
125
154
@@ -151,6 +180,20 @@ export default {
151
180
},
152
181
153
182
methods: {
183
+ getVolumeMode (storageClassName , originalVolumeMode ) {
184
+ if (! this .thirdPartyStorageClassEnabled ) {
185
+ return VOLUME_MODE .BLOCK ;
186
+ }
187
+ const storageClass = this .storageClasses .find ((sc ) => sc .name === storageClassName);
188
+
189
+ // longhorn v1, v2 use block volumeMode
190
+ if (storageClass && storageClass .isLonghorn ) {
191
+ return VOLUME_MODE .BLOCK ;
192
+ }
193
+
194
+ return originalVolumeMode;
195
+ },
196
+
154
197
getAccessMode (storageClassName ) {
155
198
if (! this .longhornV2LVMSupport ) {
156
199
return ' ReadWriteMany' ;
@@ -286,6 +329,29 @@ export default {
286
329
/ >
287
330
< / InputOrDisplay>
288
331
< / div>
332
+ < div
333
+ v- if = " showVolumeMode"
334
+ data- testid= " input-volume-mode"
335
+ class = " col span-6"
336
+ >
337
+ < InputOrDisplay
338
+ : name= " t('harvester.volume.volumeMode')"
339
+ : value= " value.volumeMode"
340
+ : mode= " mode"
341
+ >
342
+ < LabeledSelect
343
+ v- model: value= " value.volumeMode"
344
+ : label= " t('harvester.volume.volumeMode')"
345
+ : mode= " mode"
346
+ : options= " volumeModeOptions"
347
+ : disabled= " isEdit"
348
+ required
349
+ @update: value= " update"
350
+ / >
351
+ < / InputOrDisplay>
352
+ < / div>
353
+ < / div>
354
+ < div class = " row mb-20" >
289
355
< div
290
356
v- if = " value.volumeEncryptionFeatureEnabled && isView"
291
357
class = " col span-6"
@@ -295,11 +361,9 @@ export default {
295
361
: value= " encryptionValue"
296
362
/ >
297
363
< / div>
298
- < / div>
299
- < div class = " row mb-20" >
300
364
< div
301
365
v- if = " value.volumeBackups && isView"
302
- class = " col span-3 "
366
+ class = " col span-6 "
303
367
>
304
368
< LabelValue
305
369
: name= " t('harvester.virtualMachine.volume.readyToUse')"
0 commit comments