diff --git a/glusterd2/commands/peers/addpeer.go b/glusterd2/commands/peers/addpeer.go index 9cc18a983..d5b11b24b 100644 --- a/glusterd2/commands/peers/addpeer.go +++ b/glusterd2/commands/peers/addpeer.go @@ -28,8 +28,7 @@ func addPeerHandler(w http.ResponseWriter, r *http.Request) { for key := range req.Metadata { if strings.HasPrefix(key, "_") { - logger.WithField("metadata-key", key).Error("Key names starting with '_' are restricted in metadata field") - restutils.SendHTTPError(ctx, w, http.StatusInternalServerError, "Key names starting with '_' are restricted in metadata field") + restutils.SendHTTPError(ctx, w, http.StatusInternalServerError, errors.ErrRestrictedKeyFound) return } } diff --git a/pkg/errors/error.go b/pkg/errors/error.go index 525550326..50020f776 100644 --- a/pkg/errors/error.go +++ b/pkg/errors/error.go @@ -40,4 +40,5 @@ var ( ErrUnmarshallFailed = errors.New("failed to unmarshall from json") ErrClusterNotFound = errors.New("Cluster instance not found in store") ErrDuplicateBrickPath = errors.New("Duplicate brick entry") + ErrRestrictedKeyFound = errors.New("Key names starting with '_' are restricted in metadata field") ) diff --git a/plugins/device/deviceutils/utils.go b/plugins/device/deviceutils/utils.go new file mode 100644 index 000000000..105259d4b --- /dev/null +++ b/plugins/device/deviceutils/utils.go @@ -0,0 +1,43 @@ +package deviceutils + +import ( + "os/exec" +) + +// +func CreatePV(device string) error { + + pvcreateCmd := exec.Command("pvcreate", "--metadatasize=128M", "--dataalignment=256K", device) + if err := pvcreateCmd.Run(); err != nil { + return err + } + return nil +} + +// +func CreateVG(device string, vgName string) error { + + vgcreateCmd := exec.Command("vgcreate", vgName, device) + if err := vgcreateCmd.Run(); err != nil { + return err + } + return nil +} + +// +func RemoveVG(vgName string) error { + vgremoveCmd := exec.Command("vgremove", vgName) + if err := vgremoveCmd.Run(); err != nil { + return err + } + return nil +} + +// +func RemovePV(device string) error { + pvremoveCmd := exec.Command("pvremove", device) + if err := pvremoveCmd.Run(); err != nil { + return err + } + return nil +} diff --git a/plugins/device/transaction.go b/plugins/device/transaction.go index 8bb95e6ab..e6d743c63 100644 --- a/plugins/device/transaction.go +++ b/plugins/device/transaction.go @@ -1,9 +1,11 @@ package device import ( + "strings" + "github.com/gluster/glusterd2/glusterd2/transaction" deviceapi "github.com/gluster/glusterd2/plugins/device/api" - "github.com/gluster/glusterd2/plugins/device/cmdexec" + "github.com/gluster/glusterd2/plugins/device/deviceutils" ) func txnPrepareDevice(c transaction.TxnCtx) error { @@ -27,18 +29,30 @@ func txnPrepareDevice(c transaction.TxnCtx) error { deviceList = append(deviceList, tempDevice) } + var failedDevice []string + var successDevice []deviceapi.Info for index, device := range deviceList { - err := cmdexec.DeviceSetup(c, device.Name) + err := deviceutils.CreatePV(device.Name) if err != nil { - c.Logger().WithError(err).WithField("device", device.Name).Error("Failed to setup device, setting device status to 'DeviceFailed'") - deviceList[index].State = deviceapi.DeviceFailed + c.Logger().WithError(err).WithField("device", device.Name).Error("Failed to create physical volume") continue } + vgName := strings.Replace("vg"+device.Name, "/", "-", -1) + err = deviceutils.CreateVG(device.Name, vgName) + if err != nil { + c.Logger().WithError(err).WithField("device", device.Name).Error("Failed to create volume group") + err = deviceutils.RemovePV(device.Name) + if err != nil { + c.Logger().WithError(err).WithField("device", device.Name).Error("Failed to remove physical volume") + failedDevice = append(failedDevice, device.Name) + } + } c.Logger().WithError(err).WithField("device", device.Name).Error("Setup device successful, setting device status to 'DeviceEnabled'") deviceList[index].State = deviceapi.DeviceEnabled + successDevice = append(successDevice, deviceList[index]) } - err := AddDevices(deviceList, peerID) + err := AddDevices(successDevice, peerID) if err != nil { c.Logger().WithError(err).Error("Couldn't add deviceinfo to store") return err