11package volumecommands
22
33import (
4+ "context"
45 "errors"
56 "net/http"
67 "path/filepath"
@@ -102,9 +103,6 @@ func registerVolCreateStepFuncs() {
102103func volumeCreateHandler (w http.ResponseWriter , r * http.Request ) {
103104
104105 ctx := r .Context ()
105- ctx , span := trace .StartSpan (ctx , "/volumeCreateHandler" )
106- defer span .End ()
107-
108106 logger := gdctx .GetReqLogger (ctx )
109107 var err error
110108
@@ -114,45 +112,68 @@ func volumeCreateHandler(w http.ResponseWriter, r *http.Request) {
114112 return
115113 }
116114
117- if err := validateVolCreateReq ( & req ); err != nil {
118- restutils .SendHTTPError (ctx , w , http . StatusBadRequest , err )
115+ if status , err := CreateVolume ( ctx , req ); err != nil {
116+ restutils .SendHTTPError (ctx , w , status , err )
119117 return
120118 }
121119
122- if containsReservedGroupProfile (req .Options ) {
123- restutils .SendHTTPError (ctx , w , http .StatusBadRequest , gderrors .ErrReservedGroupProfile )
120+ volinfo , err := volume .GetVolume (req .Name )
121+ if err != nil {
122+ // FIXME: If volume was created successfully in the txn above and
123+ // then the store goes down by the time we reach here, what do
124+ // we return to the client ?
125+ restutils .SendHTTPError (ctx , w , http .StatusInternalServerError , err )
124126 return
125127 }
126128
129+ logger .WithField ("volume-name" , volinfo .Name ).Info ("new volume created" )
130+ events .Broadcast (volume .NewEvent (volume .EventVolumeCreated , volinfo ))
131+
132+ resp := createVolumeCreateResp (volinfo )
133+ restutils .SetLocationHeader (r , w , volinfo .Name )
134+ restutils .SendHTTPResponse (ctx , w , http .StatusCreated , resp )
135+ }
136+
137+ func createVolumeCreateResp (v * volume.Volinfo ) * api.VolumeCreateResp {
138+ return (* api .VolumeCreateResp )(volume .CreateVolumeInfoResp (v ))
139+ }
140+
141+ // CreateVolume creates a volume
142+ func CreateVolume (ctx context.Context , req api.VolCreateReq ) (status int , err error ) {
143+ ctx , span := trace .StartSpan (ctx , "/volumeCreateHandler" )
144+ defer span .End ()
145+
146+ if err := validateVolCreateReq (& req ); err != nil {
147+ return http .StatusBadRequest , err
148+ }
149+
150+ if containsReservedGroupProfile (req .Options ) {
151+ return http .StatusBadRequest , gderrors .ErrReservedGroupProfile
152+ }
153+
127154 if req .Size > 0 {
128155 applyDefaults (& req )
129156
130157 if req .SnapshotReserveFactor < 1 {
131- restutils .SendHTTPError (ctx , w , http .StatusBadRequest ,
132- errors .New ("invalid snapshot reserve factor" ))
133- return
158+ return http .StatusBadRequest , errors .New ("invalid snapshot reserve factor" )
134159 }
135160
136161 if err := bricksplanner .PlanBricks (& req ); err != nil {
137- restutils .SendHTTPError (ctx , w , http .StatusInternalServerError , err )
138- return
162+ return http .StatusInternalServerError , err
139163 }
140164 } else {
141165 if err := checkDupBrickEntryVolCreate (req ); err != nil {
142- restutils .SendHTTPError (ctx , w , http .StatusBadRequest , err )
143- return
166+ return http .StatusBadRequest , err
144167 }
145168 }
146169
147170 req .Options , err = expandGroupOptions (req .Options )
148171 if err != nil {
149- restutils .SendHTTPError (ctx , w , http .StatusInternalServerError , err )
150- return
172+ return http .StatusInternalServerError , err
151173 }
152174
153175 if err := validateOptions (req .Options , req .VolOptionFlags ); err != nil {
154- restutils .SendHTTPError (ctx , w , http .StatusBadRequest , err )
155- return
176+ return http .StatusBadRequest , err
156177 }
157178
158179 // Include default Volume Options profile
@@ -171,21 +192,17 @@ func volumeCreateHandler(w http.ResponseWriter, r *http.Request) {
171192
172193 nodes , err := req .Nodes ()
173194 if err != nil {
174- restutils .SendHTTPError (ctx , w , http .StatusBadRequest , err )
175- return
195+ return http .StatusBadRequest , err
176196 }
177197
178198 txn , err := transactionv2 .NewTxnWithLocks (ctx , req .Name )
179199 if err != nil {
180- status , err := restutils .ErrToStatusCode (err )
181- restutils .SendHTTPError (ctx , w , status , err )
182- return
200+ return restutils .ErrToStatusCode (err )
183201 }
184202 defer txn .Done ()
185203
186204 if volume .Exists (req .Name ) {
187- restutils .SendHTTPError (ctx , w , http .StatusBadRequest , gderrors .ErrVolExists )
188- return
205+ return http .StatusBadRequest , gderrors .ErrVolExists
189206 }
190207
191208 txn .Steps = []* transaction.Step {
@@ -219,8 +236,7 @@ func volumeCreateHandler(w http.ResponseWriter, r *http.Request) {
219236 }
220237
221238 if err := txn .Ctx .Set ("req" , & req ); err != nil {
222- restutils .SendHTTPError (ctx , w , http .StatusInternalServerError , err )
223- return
239+ return http .StatusInternalServerError , err
224240 }
225241
226242 // Add attributes to the span with info that can be viewed along with traces.
@@ -231,28 +247,8 @@ func volumeCreateHandler(w http.ResponseWriter, r *http.Request) {
231247 )
232248
233249 if err := txn .Do (); err != nil {
234- status , err := restutils .ErrToStatusCode (err )
235- restutils .SendHTTPError (ctx , w , status , err )
236- return
250+ return restutils .ErrToStatusCode (err )
237251 }
238252
239- volinfo , err := volume .GetVolume (req .Name )
240- if err != nil {
241- // FIXME: If volume was created successfully in the txn above and
242- // then the store goes down by the time we reach here, what do
243- // we return to the client ?
244- restutils .SendHTTPError (ctx , w , http .StatusInternalServerError , err )
245- return
246- }
247-
248- logger .WithField ("volume-name" , volinfo .Name ).Info ("new volume created" )
249- events .Broadcast (volume .NewEvent (volume .EventVolumeCreated , volinfo ))
250-
251- resp := createVolumeCreateResp (volinfo )
252- restutils .SetLocationHeader (r , w , volinfo .Name )
253- restutils .SendHTTPResponse (ctx , w , http .StatusCreated , resp )
254- }
255-
256- func createVolumeCreateResp (v * volume.Volinfo ) * api.VolumeCreateResp {
257- return (* api .VolumeCreateResp )(volume .CreateVolumeInfoResp (v ))
253+ return http .StatusCreated , nil
258254}
0 commit comments