1
0
mirror of https://github.com/gluster/glusterd2.git synced 2026-02-06 06:45:35 +01:00
Files
glusterd2/plugins/device/transaction.go
Aravinda VK bebbc65052 Support for loopback bricks
Register the Bricks hosting directory using,

```
glustercli device add <peerid> <path> --provisioner loop
```

Example:

```
glustercli device add 70d79c3f-e7af-43f6-8b65-05dff2423da1 \
	   /exports --provisioner loop
```

Now create the volume using,

```
glustercli volume create gv1 --size 1G \
	   --provisioner loop \
	   --replica 3
```

Fixes: #1418
Signed-off-by: Aravinda VK <avishwan@redhat.com>
2019-02-14 10:49:17 +05:30

109 lines
3.2 KiB
Go

package device
import (
"os"
"github.com/gluster/glusterd2/glusterd2/transaction"
"github.com/gluster/glusterd2/pkg/api"
"github.com/gluster/glusterd2/pkg/fsutils"
"github.com/gluster/glusterd2/pkg/lvmutils"
deviceapi "github.com/gluster/glusterd2/plugins/device/api"
"github.com/gluster/glusterd2/plugins/device/deviceutils"
"github.com/pborman/uuid"
)
func txnPrepareDevice(c transaction.TxnCtx) error {
var req deviceapi.AddDeviceReq
if err := c.Get("req", &req); err != nil {
c.Logger().WithError(err).WithField("key", "req").Error("Failed to get key from transaction context")
return err
}
if req.ProvisionerType == api.ProvisionerTypeLoop {
return txnPrepareDeviceLoop(req, c)
}
return txnPrepareDeviceLvm(req, c)
}
func txnPrepareDeviceLvm(req deviceapi.AddDeviceReq, c transaction.TxnCtx) error {
var peerID uuid.UUID
if err := c.Get("peerid", &peerID); err != nil {
c.Logger().WithError(err).WithField("key", "peerid").Error("Failed to get key from transaction context")
return err
}
deviceInfo := deviceapi.Info{Device: req.Device}
err := lvmutils.CreatePV(req.Device)
if err != nil {
c.Logger().WithError(err).WithField("device", req.Device).Error("Failed to create physical volume")
return err
}
err = lvmutils.CreateVG(req.Device, deviceInfo.VgName())
if err != nil {
c.Logger().WithError(err).WithField("device", req.Device).Error("Failed to create volume group")
errPV := lvmutils.RemovePV(req.Device)
if errPV != nil {
c.Logger().WithError(err).WithField("device", req.Device).Error("Failed to remove physical volume")
}
return err
}
availableSize, extentSize, err := lvmutils.GetVgAvailableSize(deviceInfo.VgName())
if err != nil {
return err
}
deviceInfo = deviceapi.Info{
Device: req.Device,
State: deviceapi.DeviceEnabled,
AvailableSize: availableSize,
TotalSize: availableSize,
UsedSize: 0,
ExtentSize: extentSize,
PeerID: peerID,
ProvisionerType: api.ProvisionerTypeLvm,
}
err = deviceutils.AddOrUpdateDevice(deviceInfo)
if err != nil {
c.Logger().WithError(err).WithField("peerid", peerID).Error("Couldn't add deviceinfo to store")
return err
}
return nil
}
func txnPrepareDeviceLoop(req deviceapi.AddDeviceReq, c transaction.TxnCtx) error {
var peerID uuid.UUID
if err := c.Get("peerid", &peerID); err != nil {
c.Logger().WithError(err).WithField("key", "peerid").Error("Failed to get key from transaction context")
return err
}
deviceInfo := deviceapi.Info{Device: req.Device}
// TODO: Validate Path contains file system and empty
stat, err := fsutils.StatFs(req.Device)
if os.IsNotExist(err) {
c.Logger().WithError(err).WithField("device", req.Device).Error("Failed to prepare device, device not found")
return err
}
deviceInfo = deviceapi.Info{
Device: req.Device,
State: deviceapi.DeviceEnabled,
AvailableSize: stat.Total,
TotalSize: stat.Free,
UsedSize: stat.Total - stat.Free,
PeerID: peerID,
ProvisionerType: api.ProvisionerTypeLoop,
}
err = deviceutils.AddOrUpdateDevice(deviceInfo)
if err != nil {
c.Logger().WithError(err).WithField("peerid", peerID).Error("Couldn't add deviceinfo to store")
return err
}
return nil
}