Skip to content
This repository has been archived by the owner on Mar 26, 2020. It is now read-only.

Commit

Permalink
Auto generate Volume Name if not specified in Request
Browse files Browse the repository at this point in the history
Updates: #851
Signed-off-by: Aravinda VK <avishwan@redhat.com>
  • Loading branch information
aravindavk committed Jun 25, 2018
1 parent 53abd6b commit 31f8290
Show file tree
Hide file tree
Showing 9 changed files with 85 additions and 28 deletions.
2 changes: 1 addition & 1 deletion doc/quick-start-user-guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ $ curl -X POST http://192.168.56.101:24007/v1/volumes --data @volcreate.json -H

Send the volume create request using glustercli:

$ glustercli volume create testvol <uuid1>:/export/brick1/data <uuid2>:/export/brick2/data <uuid1>:/export/brick3/data <uuid2>:/export/brick4/data --replica 2
$ glustercli volume create --name testvol <uuid1>:/export/brick1/data <uuid2>:/export/brick2/data <uuid1>:/export/brick3/data <uuid2>:/export/brick4/data --replica 2

## Start the volume

Expand Down
13 changes: 13 additions & 0 deletions e2e/smartvol_ops_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,18 @@ func testSmartVolumeDistributeDisperse(t *testing.T) {
r.Nil(client.VolumeDelete(smartvolname))
}

func testSmartVolumeWithoutName(t *testing.T) {
r := require.New(t)

createReq := smartvolapi.VolCreateReq{
Size: 20,
}
volinfo, err := client.SmartVolumeCreate(createReq)
r.Nil(err)

r.Nil(client.VolumeDelete(volinfo.Name))
}

// TestSmartVolume creates a volume and starts it, runs further tests on it and
// finally deletes the volume
func TestSmartVolume(t *testing.T) {
Expand Down Expand Up @@ -252,6 +264,7 @@ func TestSmartVolume(t *testing.T) {
t.Run("Smartvol Disperse Volume", testSmartVolumeDisperse)
t.Run("Smartvol Distributed-Replicate Volume", testSmartVolumeDistributeReplicate)
t.Run("Smartvol Distributed-Disperse Volume", testSmartVolumeDistributeDisperse)
t.Run("Smartvol Without Name", testSmartVolumeWithoutName)

// // Device Cleanup
r.Nil(loopDevicesCleanup(t))
Expand Down
30 changes: 30 additions & 0 deletions e2e/volume_ops_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ func TestVolume(t *testing.T) {
t.Logf("Using temp dir: %s", tmpDir)
//defer os.RemoveAll(tmpDir)

t.Run("CreateWithoutName", testVolumeCreateWithoutName)

// Create the volume
t.Run("Create", testVolumeCreate)
// Expand the volume
Expand All @@ -68,6 +70,34 @@ func TestVolume(t *testing.T) {
t.Run("Disperse", testDisperse)
}

func testVolumeCreateWithoutName(t *testing.T) {
r := require.New(t)

var brickPaths []string
for i := 1; i <= 2; i++ {
brickPath, err := ioutil.TempDir(tmpDir, "brick")
r.Nil(err)
brickPaths = append(brickPaths, brickPath)
}

// create 2x2 dist-rep volume
createReq := api.VolCreateReq{
Subvols: []api.SubvolReq{
{
Bricks: []api.BrickReq{
{PeerID: gds[0].PeerID(), Path: brickPaths[0]},
{PeerID: gds[1].PeerID(), Path: brickPaths[1]},
},
},
},
Force: true,
}
volinfo, err := client.VolumeCreate(createReq)
r.Nil(err)

r.Nil(client.VolumeDelete(volinfo.Name))
}

func testVolumeCreate(t *testing.T) {
r := require.New(t)

Expand Down
23 changes: 11 additions & 12 deletions glustercli/cmd/volume-create.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ const (
)

var (
flagCreateVolumeName string
flagCreateStripeCount int
flagCreateReplicaCount int
flagCreateArbiterCount int
Expand All @@ -42,15 +43,16 @@ var (
flagCreateSubvolZoneOverlap bool

volumeCreateCmd = &cobra.Command{
Use: "create <volname> [<brick> [<brick>]...|--size <size>]",
Use: "create [--name <volname>] [<brick> [<brick>]...|--size <size>]",
Short: volumeCreateHelpShort,
Long: volumeCreateHelpLong,
Args: cobra.MinimumNArgs(1),
Args: cobra.MinimumNArgs(0),
Run: volumeCreateCmdRun,
}
)

func init() {
volumeCreateCmd.Flags().StringVar(&flagCreateVolumeName, "name", "", "Volume Name")
volumeCreateCmd.Flags().IntVar(&flagCreateStripeCount, "stripe", 0, "Stripe Count")
volumeCreateCmd.Flags().IntVar(&flagCreateReplicaCount, "replica", 0, "Replica Count")
volumeCreateCmd.Flags().IntVar(&flagCreateArbiterCount, "arbiter", 0, "Arbiter Count")
Expand Down Expand Up @@ -91,10 +93,8 @@ func smartVolumeCreate(cmd *cobra.Command, args []string) {
failure("Invalid Volume Size specified", nil, 1)
}

volname := args[0]

req := smartvolapi.VolCreateReq{
Name: volname,
Name: flagCreateVolumeName,
Transport: flagCreateTransport,
Size: size,
ReplicaCount: flagCreateReplicaCount,
Expand All @@ -117,7 +117,7 @@ func smartVolumeCreate(cmd *cobra.Command, args []string) {
if err != nil {
if verbose {
log.WithFields(log.Fields{
"volume": volname,
"volume": flagCreateVolumeName,
"error": err.Error(),
}).Error("volume creation failed")
}
Expand All @@ -133,17 +133,16 @@ func volumeCreateCmdRun(cmd *cobra.Command, args []string) {
return
}

if len(args) < 2 {
if len(args) < 1 {
failure("Bricks not specified", nil, 1)
}

volname := args[0]
bricks, err := bricksAsUUID(args[1:])
bricks, err := bricksAsUUID(args)
if err != nil {
if verbose {
log.WithFields(log.Fields{
"error": err.Error(),
"volume": volname,
"volume": flagCreateVolumeName,
}).Error("error getting brick UUIDs")
}
failure("Error getting brick UUIDs", err, 1)
Expand Down Expand Up @@ -243,7 +242,7 @@ func volumeCreateCmdRun(cmd *cobra.Command, args []string) {
}

req := api.VolCreateReq{
Name: volname,
Name: flagCreateVolumeName,
Subvols: subvols,
Force: flagCreateForce,
Options: options,
Expand All @@ -269,7 +268,7 @@ func volumeCreateCmdRun(cmd *cobra.Command, args []string) {
if err != nil {
if verbose {
log.WithFields(log.Fields{
"volume": volname,
"volume": flagCreateVolumeName,
"error": err.Error(),
}).Error("volume creation failed")
}
Expand Down
5 changes: 5 additions & 0 deletions glusterd2/commands/volumes/volume-create.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,11 @@ func volumeCreateHandler(w http.ResponseWriter, r *http.Request) {
return
}

// Generate Volume name if not provided
if req.Name == "" {
req.Name = volume.GenerateVolumeName()
}

if err := validateVolCreateReq(&req); err != nil {
restutils.SendHTTPError(ctx, w, http.StatusBadRequest, err)
return
Expand Down
5 changes: 5 additions & 0 deletions glusterd2/volume/volume-utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ var (
volumeNameRE = regexp.MustCompile("^[a-zA-Z0-9_-]+$")
)

// GenerateVolumeName generates volume name as vol_<random-id>
func GenerateVolumeName() string {
return "vol_" + uuid.NewRandom().String()
}

// IsValidName validates Volume name
func IsValidName(name string) bool {
return volumeNameRE.MatchString(name)
Expand Down
2 changes: 1 addition & 1 deletion pkg/api/volume_req.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ type SubvolReq struct {
"create-brick-dir" : if brick dir is not present, create it
*/
type VolCreateReq struct {
Name string `json:"name"`
Name string `json:"name,omitempty"`
Transport string `json:"transport,omitempty"`
Subvols []SubvolReq `json:"subvols"`
Options map[string]string `json:"options,omitempty"`
Expand Down
28 changes: 14 additions & 14 deletions plugins/smartvol/api/req_resp.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,23 @@ package api

// VolCreateReq represents a Volume Create Request
type VolCreateReq struct {
Name string `json:"name"`
Name string `json:"name,omitempty"`
Transport string `json:"transport,omitempty"`
Force bool `json:"force,omitempty"`
Size uint64 `json:"size"`
DistributeCount int `json:"distribute"`
ReplicaCount int `json:"replica"`
ArbiterCount int `json:"arbiter"`
DisperseCount int `json:"disperse"`
DisperseRedundancyCount int `json:"disperse-redundancy"`
DisperseDataCount int `json:"disperse-data"`
SnapshotEnabled bool `json:"snapshot"`
SnapshotReserveFactor float64 `json:"snapshot-reserve-factor"`
LimitPeers []string `json:"limit-peers"`
LimitZones []string `json:"limit-zones"`
ExcludePeers []string `json:"exclude-peers"`
ExcludeZones []string `json:"exclude-zones"`
SubvolZonesOverlap bool `json:"subvolume-zones-overlap"`
DistributeCount int `json:"distribute,omitempty"`
ReplicaCount int `json:"replica,omitempty"`
ArbiterCount int `json:"arbiter,omitempty"`
DisperseCount int `json:"disperse,omitempty"`
DisperseRedundancyCount int `json:"disperse-redundancy,omitempty"`
DisperseDataCount int `json:"disperse-data,omitempty"`
SnapshotEnabled bool `json:"snapshot,omitempty"`
SnapshotReserveFactor float64 `json:"snapshot-reserve-factor,omitempty"`
LimitPeers []string `json:"limit-peers,omitempty"`
LimitZones []string `json:"limit-zones,omitempty"`
ExcludePeers []string `json:"exclude-peers,omitempty"`
ExcludeZones []string `json:"exclude-zones,omitempty"`
SubvolZonesOverlap bool `json:"subvolume-zones-overlap,omitempty"`
}

// Brick represents Brick Request
Expand Down
5 changes: 5 additions & 0 deletions plugins/smartvol/rest.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,11 @@ func smartVolumeCreateHandler(w http.ResponseWriter, r *http.Request) {
return
}

// Generate Volume name if not provided
if req.Name == "" {
req.Name = volume.GenerateVolumeName()
}

if err := validateVolCreateReq(&req); err != nil {
restutils.SendHTTPError(ctx, w, http.StatusBadRequest, err)
return
Expand Down

0 comments on commit 31f8290

Please sign in to comment.