@@ -28,10 +28,8 @@ import (
28
28
)
29
29
30
30
const (
31
- minSize = 10 //10 GB
32
- maxSize = 16000 //16 TB
33
- customProfile = "custom-iops"
34
- dp2Profile = "dp2"
31
+ minSize = 10 //10 GB
32
+ RFSProfile = "rfs"
35
33
)
36
34
37
35
// CreateVolume creates file share
@@ -40,27 +38,37 @@ func (vpcs *VPCSession) CreateVolume(volumeRequest provider.Volume) (volumeRespo
40
38
defer vpcs .Logger .Debug ("Exit from CreateVolume method..." )
41
39
defer metrics .UpdateDurationFromStart (vpcs .Logger , "CreateVolume" , time .Now ())
42
40
41
+ var iops int64
42
+ var bandwidth int32
43
43
vpcs .Logger .Info ("Basic validation for CreateVolume request... " , zap .Reflect ("RequestedVolumeDetails" , volumeRequest ))
44
- resourceGroup , iops , err := validateVolumeRequest (volumeRequest )
44
+ resourceGroup , iops , bandwidth , err := validateVolumeRequest (volumeRequest )
45
45
if err != nil {
46
46
return nil , err
47
47
}
48
+
48
49
vpcs .Logger .Info ("Successfully validated inputs for CreateVolume request... " )
49
50
51
+ // Set zone if provided
52
+ var zone * models.Zone
53
+ if volumeRequest .Az != "" {
54
+ zone = & models.Zone {
55
+ Name : volumeRequest .Az ,
56
+ }
57
+ }
58
+
50
59
// Build the share template to send to backend
51
60
shareTemplate := & models.Share {
52
61
Name : * volumeRequest .Name ,
53
62
Size : int64 (* volumeRequest .Capacity ),
54
63
InitialOwner : (* models .InitialOwner )(volumeRequest .InitialOwner ),
55
64
Iops : iops ,
65
+ Bandwidth : bandwidth ,
56
66
AccessControlMode : volumeRequest .AccessControlMode ,
57
67
ResourceGroup : & resourceGroup ,
58
68
Profile : & models.Profile {
59
69
Name : volumeRequest .VPCVolume .Profile .Name ,
60
70
},
61
- Zone : & models.Zone {
62
- Name : volumeRequest .Az ,
63
- },
71
+ Zone : zone ,
64
72
}
65
73
66
74
// Check for VPC ID, SubnetID or PrimaryIPID either of the one is mandatory for VolumeAccessPoint/FileShareTarget creation
@@ -87,6 +95,12 @@ func (vpcs *VPCSession) CreateVolume(volumeRequest provider.Volume) (volumeRespo
87
95
shareTargetTemplate .TransitEncryption = volumeRequest .TransitEncryption
88
96
}
89
97
98
+ // Set access_protocol and transit_encryption ONLY for 'rfs' profile
99
+ if volumeRequest .VPCVolume .Profile != nil && volumeRequest .VPCVolume .Profile .Name == RFSProfile {
100
+ shareTargetTemplate .AccessProtocol = "nfs4"
101
+ shareTargetTemplate .TransitEncryption = "none"
102
+ }
103
+
90
104
volumeAccessPointList := make ([]models.ShareTarget , 1 )
91
105
volumeAccessPointList [0 ] = shareTargetTemplate
92
106
@@ -101,6 +115,7 @@ func (vpcs *VPCSession) CreateVolume(volumeRequest provider.Volume) (volumeRespo
101
115
102
116
vpcs .Logger .Info ("Calling VPC provider for volume creation..." )
103
117
var volume * models.Share
118
+
104
119
err = retry (vpcs .Logger , func () error {
105
120
volume , err = vpcs .Apiclient .FileShareService ().CreateFileShare (shareTemplate , vpcs .Logger )
106
121
return err
@@ -118,6 +133,7 @@ func (vpcs *VPCSession) CreateVolume(volumeRequest provider.Volume) (volumeRespo
118
133
if err != nil {
119
134
return nil , userError .GetUserError ("VolumeNotInValidState" , err , volume .ID )
120
135
}
136
+
121
137
vpcs .Logger .Info ("Volume got valid (stable) state" , zap .Reflect ("VolumeDetails" , volume ))
122
138
123
139
// Converting share to lib volume type
@@ -135,44 +151,47 @@ func (vpcs *VPCSession) CreateVolume(volumeRequest provider.Volume) (volumeRespo
135
151
}
136
152
137
153
// validateVolumeRequest validating volume request
138
- func validateVolumeRequest (volumeRequest provider.Volume ) (models.ResourceGroup , int64 , error ) {
154
+ func validateVolumeRequest (volumeRequest provider.Volume ) (models.ResourceGroup , int64 , int32 , error ) {
139
155
resourceGroup := models.ResourceGroup {}
140
156
var iops int64
141
157
iops = 0
158
+ var bandwidth int32
159
+ bandwidth = 0
142
160
143
161
// Volume name should not be empty
144
162
if volumeRequest .Name == nil {
145
- return resourceGroup , iops , userError .GetUserError ("InvalidVolumeName" , nil , nil )
163
+ return resourceGroup , iops , bandwidth , userError .GetUserError ("InvalidVolumeName" , nil , nil )
146
164
} else if len (* volumeRequest .Name ) == 0 {
147
- return resourceGroup , iops , userError .GetUserError ("InvalidVolumeName" , nil , * volumeRequest .Name )
165
+ return resourceGroup , iops , bandwidth , userError .GetUserError ("InvalidVolumeName" , nil , * volumeRequest .Name )
148
166
}
149
167
150
- // Capacity should not be empty
151
168
if volumeRequest .Capacity == nil {
152
- return resourceGroup , iops , userError .GetUserError ("VolumeCapacityInvalid" , nil , nil )
169
+ return resourceGroup , iops , bandwidth , userError .GetUserError ("VolumeCapacityInvalid" , nil , nil )
153
170
} else if * volumeRequest .Capacity < minSize {
154
- return resourceGroup , iops , userError .GetUserError ("VolumeCapacityInvalid" , nil , * volumeRequest .Capacity )
171
+ return resourceGroup , iops , bandwidth , userError .GetUserError ("VolumeCapacityInvalid" , nil , * volumeRequest .Capacity )
155
172
}
156
173
157
174
// Read user provided error, no harm to pass the 0 values to RIaaS in case of tiered profiles
158
175
if volumeRequest .Iops != nil {
159
176
iops = ToInt64 (* volumeRequest .Iops )
160
177
}
161
- if volumeRequest .VPCVolume .Profile == nil {
162
- return resourceGroup , iops , userError .GetUserError ("VolumeProfileEmpty" , nil )
178
+
179
+ if volumeRequest .Bandwidth != 0 {
180
+ bandwidth = volumeRequest .VPCVolume .Bandwidth
163
181
}
164
- if volumeRequest .VPCVolume .Profile .Name != customProfile && volumeRequest .VPCVolume .Profile .Name != dp2Profile && iops > 0 {
165
- return resourceGroup , iops , userError .GetUserError ("VolumeProfileIopsInvalid" , nil )
182
+
183
+ if volumeRequest .VPCVolume .Profile == nil {
184
+ return resourceGroup , iops , bandwidth , userError .GetUserError ("VolumeProfileEmpty" , nil )
166
185
}
167
186
168
187
// validate and add resource group ID or Name whichever is provided by user
169
188
if volumeRequest .VPCVolume .ResourceGroup == nil {
170
- return resourceGroup , iops , userError .GetUserError ("EmptyResourceGroup" , nil )
189
+ return resourceGroup , iops , bandwidth , userError .GetUserError ("EmptyResourceGroup" , nil )
171
190
}
172
191
173
192
// validate and add resource group ID or Name whichever is provided by user
174
193
if len (volumeRequest .VPCVolume .ResourceGroup .ID ) == 0 && len (volumeRequest .VPCVolume .ResourceGroup .Name ) == 0 {
175
- return resourceGroup , iops , userError .GetUserError ("EmptyResourceGroupIDandName" , nil )
194
+ return resourceGroup , iops , bandwidth , userError .GetUserError ("EmptyResourceGroupIDandName" , nil )
176
195
}
177
196
178
197
if len (volumeRequest .VPCVolume .ResourceGroup .ID ) > 0 {
@@ -183,7 +202,7 @@ func validateVolumeRequest(volumeRequest provider.Volume) (models.ResourceGroup,
183
202
resourceGroup .Name = volumeRequest .VPCVolume .ResourceGroup .Name
184
203
}
185
204
186
- return resourceGroup , iops , nil
205
+ return resourceGroup , iops , bandwidth , nil
187
206
}
188
207
189
208
func setENIParameters (shareTarget * models.ShareTarget , volumeRequest provider.Volume ) {
0 commit comments