Browse Source
shell: add commands volume.copy volume.delete volume.mount volume.unmount
pull/942/head
shell: add commands volume.copy volume.delete volume.mount volume.unmount
pull/942/head
Chris Lu
6 years ago
5 changed files with 224 additions and 2 deletions
-
53weed/shell/command_volume_copy.go
-
48weed/shell/command_volume_delete.go
-
60weed/shell/command_volume_mount.go
-
4weed/shell/command_volume_move.go
-
61weed/shell/command_volume_unmount.go
@ -0,0 +1,53 @@ |
|||
package shell |
|||
|
|||
import ( |
|||
"context" |
|||
"fmt" |
|||
"io" |
|||
|
|||
"github.com/chrislusf/seaweedfs/weed/storage/needle" |
|||
) |
|||
|
|||
func init() { |
|||
commands = append(commands, &commandVolumeCopy{}) |
|||
} |
|||
|
|||
type commandVolumeCopy struct { |
|||
} |
|||
|
|||
func (c *commandVolumeCopy) Name() string { |
|||
return "volume.copy" |
|||
} |
|||
|
|||
func (c *commandVolumeCopy) Help() string { |
|||
return `copy a volume from one volume server to another volume server |
|||
|
|||
volume.copy <source volume server host:port> <target volume server host:port> <volume id> |
|||
|
|||
This command copies a volume from one volume server to another volume server. |
|||
Usually you will want to unmount the volume first before copying. |
|||
|
|||
` |
|||
} |
|||
|
|||
func (c *commandVolumeCopy) Do(args []string, commandEnv *commandEnv, writer io.Writer) (err error) { |
|||
|
|||
if len(args) != 2 { |
|||
fmt.Fprintf(writer, "received args: %+v\n", args) |
|||
return fmt.Errorf("need 2 args of <source volume server host:port> <target volume server host:port> <volume id>") |
|||
} |
|||
sourceVolumeServer, targetVolumeServer, volumeIdString := args[0], args[1], args[2] |
|||
|
|||
volumeId, err := needle.NewVolumeId(volumeIdString) |
|||
if err != nil { |
|||
return fmt.Errorf("wrong volume id format %s: %v", volumeId, err) |
|||
} |
|||
|
|||
if sourceVolumeServer == targetVolumeServer { |
|||
return fmt.Errorf("source and target volume servers are the same!") |
|||
} |
|||
|
|||
ctx := context.Background() |
|||
_, err = copyVolume(ctx, commandEnv.option.GrpcDialOption, volumeId, sourceVolumeServer, targetVolumeServer) |
|||
return |
|||
} |
@ -0,0 +1,48 @@ |
|||
package shell |
|||
|
|||
import ( |
|||
"context" |
|||
"fmt" |
|||
"io" |
|||
|
|||
"github.com/chrislusf/seaweedfs/weed/storage/needle" |
|||
) |
|||
|
|||
func init() { |
|||
commands = append(commands, &commandVolumeDelete{}) |
|||
} |
|||
|
|||
type commandVolumeDelete struct { |
|||
} |
|||
|
|||
func (c *commandVolumeDelete) Name() string { |
|||
return "volume.delete" |
|||
} |
|||
|
|||
func (c *commandVolumeDelete) Help() string { |
|||
return `delete a live volume from one volume server |
|||
|
|||
volume.delete <volume server host:port> <volume id> |
|||
|
|||
This command deletes a volume from one volume server. |
|||
|
|||
` |
|||
} |
|||
|
|||
func (c *commandVolumeDelete) Do(args []string, commandEnv *commandEnv, writer io.Writer) (err error) { |
|||
|
|||
if len(args) != 2 { |
|||
fmt.Fprintf(writer, "received args: %+v\n", args) |
|||
return fmt.Errorf("need 2 args of <volume server host:port> <volume id>") |
|||
} |
|||
sourceVolumeServer, volumeIdString := args[0], args[1] |
|||
|
|||
volumeId, err := needle.NewVolumeId(volumeIdString) |
|||
if err != nil { |
|||
return fmt.Errorf("wrong volume id format %s: %v", volumeId, err) |
|||
} |
|||
|
|||
ctx := context.Background() |
|||
return deleteVolume(ctx, commandEnv.option.GrpcDialOption, volumeId, sourceVolumeServer) |
|||
|
|||
} |
@ -0,0 +1,60 @@ |
|||
package shell |
|||
|
|||
import ( |
|||
"context" |
|||
"fmt" |
|||
"io" |
|||
|
|||
"github.com/chrislusf/seaweedfs/weed/operation" |
|||
"github.com/chrislusf/seaweedfs/weed/pb/volume_server_pb" |
|||
"github.com/chrislusf/seaweedfs/weed/storage/needle" |
|||
"google.golang.org/grpc" |
|||
) |
|||
|
|||
func init() { |
|||
commands = append(commands, &commandVolumeMount{}) |
|||
} |
|||
|
|||
type commandVolumeMount struct { |
|||
} |
|||
|
|||
func (c *commandVolumeMount) Name() string { |
|||
return "volume.mount" |
|||
} |
|||
|
|||
func (c *commandVolumeMount) Help() string { |
|||
return `mount a volume from one volume server |
|||
|
|||
volume.mount <volume server host:port> <volume id> |
|||
|
|||
This command mounts a volume from one volume server. |
|||
|
|||
` |
|||
} |
|||
|
|||
func (c *commandVolumeMount) Do(args []string, commandEnv *commandEnv, writer io.Writer) (err error) { |
|||
|
|||
if len(args) != 2 { |
|||
fmt.Fprintf(writer, "received args: %+v\n", args) |
|||
return fmt.Errorf("need 2 args of <volume server host:port> <volume id>") |
|||
} |
|||
sourceVolumeServer, volumeIdString := args[0], args[1] |
|||
|
|||
volumeId, err := needle.NewVolumeId(volumeIdString) |
|||
if err != nil { |
|||
return fmt.Errorf("wrong volume id format %s: %v", volumeId, err) |
|||
} |
|||
|
|||
ctx := context.Background() |
|||
return mountVolume(ctx, commandEnv.option.GrpcDialOption, volumeId, sourceVolumeServer) |
|||
|
|||
} |
|||
|
|||
func mountVolume(ctx context.Context, grpcDialOption grpc.DialOption, volumeId needle.VolumeId, sourceVolumeServer string) (err error) { |
|||
return operation.WithVolumeServerClient(sourceVolumeServer, grpcDialOption, func(volumeServerClient volume_server_pb.VolumeServerClient) error { |
|||
_, mountErr := volumeServerClient.VolumeMount(ctx, &volume_server_pb.VolumeMountRequest{ |
|||
VolumeId: uint32(volumeId), |
|||
}) |
|||
return mountErr |
|||
}) |
|||
} |
@ -0,0 +1,61 @@ |
|||
package shell |
|||
|
|||
import ( |
|||
"context" |
|||
"fmt" |
|||
"io" |
|||
|
|||
"github.com/chrislusf/seaweedfs/weed/operation" |
|||
"github.com/chrislusf/seaweedfs/weed/pb/volume_server_pb" |
|||
"github.com/chrislusf/seaweedfs/weed/storage/needle" |
|||
"google.golang.org/grpc" |
|||
) |
|||
|
|||
func init() { |
|||
commands = append(commands, &commandVolumeUnmount{}) |
|||
} |
|||
|
|||
type commandVolumeUnmount struct { |
|||
} |
|||
|
|||
func (c *commandVolumeUnmount) Name() string { |
|||
return "volume.unmount" |
|||
} |
|||
|
|||
func (c *commandVolumeUnmount) Help() string { |
|||
return `unmount a volume from one volume server |
|||
|
|||
volume.unmount <volume server host:port> <volume id> |
|||
|
|||
This command unmounts a volume from one volume server. |
|||
|
|||
` |
|||
} |
|||
|
|||
func (c *commandVolumeUnmount) Do(args []string, commandEnv *commandEnv, writer io.Writer) (err error) { |
|||
|
|||
if len(args) != 2 { |
|||
fmt.Fprintf(writer, "received args: %+v\n", args) |
|||
return fmt.Errorf("need 2 args of <volume server host:port> <volume id>") |
|||
} |
|||
sourceVolumeServer, volumeIdString := args[0], args[1] |
|||
|
|||
volumeId, err := needle.NewVolumeId(volumeIdString) |
|||
if err != nil { |
|||
return fmt.Errorf("wrong volume id format %s: %v", volumeId, err) |
|||
} |
|||
|
|||
ctx := context.Background() |
|||
return unmountVolume(ctx, commandEnv.option.GrpcDialOption, volumeId, sourceVolumeServer) |
|||
|
|||
} |
|||
|
|||
|
|||
func unmountVolume(ctx context.Context, grpcDialOption grpc.DialOption, volumeId needle.VolumeId, sourceVolumeServer string) (err error) { |
|||
return operation.WithVolumeServerClient(sourceVolumeServer, grpcDialOption, func(volumeServerClient volume_server_pb.VolumeServerClient) error { |
|||
_, unmountErr := volumeServerClient.VolumeUnmount(ctx, &volume_server_pb.VolumeUnmountRequest{ |
|||
VolumeId: uint32(volumeId), |
|||
}) |
|||
return unmountErr |
|||
}) |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue