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