func validateVolumeCreate(msg *volume.VolCreateRequest, v *volume.Volinfo) (int, error) { if volume.ExistsFunc(msg.Name) { log.WithField("volume", msg.Name).Error("Volume already exists") return http.StatusBadRequest, errors.ErrVolExists } httpStatusCode, err := volume.ValidateBrickEntriesFunc(v.Bricks, v.ID, msg.Force) if err != nil { return httpStatusCode, err } return 0, nil }
func volumeCreateHandler(w http.ResponseWriter, r *http.Request) { req := new(volume.VolCreateRequest) httpStatus, e := unmarshalVolCreateRequest(req, r) if e != nil { rest.SendHTTPError(w, httpStatus, e.Error()) return } if volume.ExistsFunc(req.Name) { rest.SendHTTPError(w, http.StatusInternalServerError, gderrors.ErrVolExists.Error()) return } nodes, e := nodesForVolCreate(req) if e != nil { rest.SendHTTPError(w, http.StatusInternalServerError, e.Error()) return } txn, e := (&transaction.SimpleTxn{ Nodes: nodes, LockKey: req.Name, Stage: "vol-create.Stage", Commit: "vol-create.Commit", Store: "vol-create.Store", Rollback: "vol-create.Rollback", LogFields: &log.Fields{ "reqid": uuid.NewRandom().String(), }, }).NewTxn() if e != nil { rest.SendHTTPError(w, http.StatusInternalServerError, e.Error()) return } defer txn.Cleanup() e = txn.Ctx.Set("req", req) if e != nil { rest.SendHTTPError(w, http.StatusInternalServerError, e.Error()) return } vol, e := createVolinfo(req) if e != nil { rest.SendHTTPError(w, http.StatusInternalServerError, e.Error()) return } e = txn.Ctx.Set("volinfo", vol) if e != nil { rest.SendHTTPError(w, http.StatusInternalServerError, e.Error()) return } c, e := txn.Do() if e != nil { rest.SendHTTPError(w, http.StatusInternalServerError, e.Error()) return } e = c.Get("volinfo", &vol) if e == nil { rest.SendHTTPResponse(w, http.StatusCreated, vol) c.Logger().WithField("volname", vol.Name).Info("new volume created") } else { rest.SendHTTPError(w, http.StatusInternalServerError, "failed to get volinfo") } return }