| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  | package cmd | 
					
						
							| 
									
										
										
										
											2016-04-09 01:37:38 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"net/rpc" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	router "github.com/gorilla/mux" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Storage server implements rpc primitives to facilitate exporting a
 | 
					
						
							|  |  |  | // disk over a network.
 | 
					
						
							|  |  |  | type storageServer struct { | 
					
						
							|  |  |  | 	storage StorageAPI | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /// Volume operations handlers
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // MakeVolHandler - make vol handler is rpc wrapper for MakeVol operation.
 | 
					
						
							|  |  |  | func (s *storageServer) MakeVolHandler(arg *string, reply *GenericReply) error { | 
					
						
							| 
									
										
										
										
											2016-08-16 22:57:14 +08:00
										 |  |  | 	return s.storage.MakeVol(*arg) | 
					
						
							| 
									
										
										
										
											2016-04-09 01:37:38 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // ListVolsHandler - list vols handler is rpc wrapper for ListVols operation.
 | 
					
						
							|  |  |  | func (s *storageServer) ListVolsHandler(arg *string, reply *ListVolsReply) error { | 
					
						
							|  |  |  | 	vols, err := s.storage.ListVols() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	reply.Vols = vols | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // StatVolHandler - stat vol handler is a rpc wrapper for StatVol operation.
 | 
					
						
							|  |  |  | func (s *storageServer) StatVolHandler(arg *string, reply *VolInfo) error { | 
					
						
							|  |  |  | 	volInfo, err := s.storage.StatVol(*arg) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	*reply = volInfo | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // DeleteVolHandler - delete vol handler is a rpc wrapper for
 | 
					
						
							|  |  |  | // DeleteVol operation.
 | 
					
						
							|  |  |  | func (s *storageServer) DeleteVolHandler(arg *string, reply *GenericReply) error { | 
					
						
							| 
									
										
										
										
											2016-08-16 22:57:14 +08:00
										 |  |  | 	return s.storage.DeleteVol(*arg) | 
					
						
							| 
									
										
										
										
											2016-04-09 01:37:38 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /// File operations
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-06 03:51:56 +08:00
										 |  |  | // StatFileHandler - stat file handler is rpc wrapper to stat file.
 | 
					
						
							|  |  |  | func (s *storageServer) StatFileHandler(arg *StatFileArgs, reply *FileInfo) error { | 
					
						
							|  |  |  | 	fileInfo, err := s.storage.StatFile(arg.Vol, arg.Path) | 
					
						
							| 
									
										
										
										
											2016-04-09 01:37:38 +08:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-05-06 03:51:56 +08:00
										 |  |  | 	*reply = fileInfo | 
					
						
							| 
									
										
										
										
											2016-04-09 01:37:38 +08:00
										 |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-06 03:51:56 +08:00
										 |  |  | // ListDirHandler - list directory handler is rpc wrapper to list dir.
 | 
					
						
							|  |  |  | func (s *storageServer) ListDirHandler(arg *ListDirArgs, reply *[]string) error { | 
					
						
							|  |  |  | 	entries, err := s.storage.ListDir(arg.Vol, arg.Path) | 
					
						
							| 
									
										
										
										
											2016-04-09 01:37:38 +08:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-05-06 03:51:56 +08:00
										 |  |  | 	*reply = entries | 
					
						
							| 
									
										
										
										
											2016-04-09 01:37:38 +08:00
										 |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-26 05:51:06 +08:00
										 |  |  | // ReadAllHandler - read all handler is rpc wrapper to read all storage API.
 | 
					
						
							|  |  |  | func (s *storageServer) ReadAllHandler(arg *ReadFileArgs, reply *[]byte) error { | 
					
						
							|  |  |  | 	buf, err := s.storage.ReadAll(arg.Vol, arg.Path) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	reply = &buf | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-29 06:13:15 +08:00
										 |  |  | // ReadFileHandler - read file handler is rpc wrapper to read file.
 | 
					
						
							|  |  |  | func (s *storageServer) ReadFileHandler(arg *ReadFileArgs, reply *int64) error { | 
					
						
							|  |  |  | 	n, err := s.storage.ReadFile(arg.Vol, arg.Path, arg.Offset, arg.Buffer) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	reply = &n | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // AppendFileHandler - append file handler is rpc wrapper to append file.
 | 
					
						
							| 
									
										
										
										
											2016-06-20 06:31:13 +08:00
										 |  |  | func (s *storageServer) AppendFileHandler(arg *AppendFileArgs, reply *GenericReply) error { | 
					
						
							|  |  |  | 	return s.storage.AppendFile(arg.Vol, arg.Path, arg.Buffer) | 
					
						
							| 
									
										
										
										
											2016-05-29 06:13:15 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-09 01:37:38 +08:00
										 |  |  | // DeleteFileHandler - delete file handler is rpc wrapper to delete file.
 | 
					
						
							|  |  |  | func (s *storageServer) DeleteFileHandler(arg *DeleteFileArgs, reply *GenericReply) error { | 
					
						
							| 
									
										
										
										
											2016-06-20 06:31:13 +08:00
										 |  |  | 	return s.storage.DeleteFile(arg.Vol, arg.Path) | 
					
						
							| 
									
										
										
										
											2016-04-09 01:37:38 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-02 18:12:18 +08:00
										 |  |  | // RenameFileHandler - rename file handler is rpc wrapper to rename file.
 | 
					
						
							|  |  |  | func (s *storageServer) RenameFileHandler(arg *RenameFileArgs, reply *GenericReply) error { | 
					
						
							| 
									
										
										
										
											2016-06-20 06:31:13 +08:00
										 |  |  | 	return s.storage.RenameFile(arg.SrcVol, arg.SrcPath, arg.DstVol, arg.DstPath) | 
					
						
							| 
									
										
										
										
											2016-05-02 18:12:18 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-20 11:05:38 +08:00
										 |  |  | // Initialize new storage rpc.
 | 
					
						
							| 
									
										
										
										
											2016-04-30 05:24:10 +08:00
										 |  |  | func newRPCServer(exportPath string) (*storageServer, error) { | 
					
						
							|  |  |  | 	// Initialize posix storage API.
 | 
					
						
							|  |  |  | 	storage, err := newPosix(exportPath) | 
					
						
							| 
									
										
										
										
											2016-05-12 09:58:32 +08:00
										 |  |  | 	if err != nil && err != errDiskNotFound { | 
					
						
							| 
									
										
										
										
											2016-04-30 05:24:10 +08:00
										 |  |  | 		return nil, err | 
					
						
							| 
									
										
										
										
											2016-04-09 01:37:38 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-04-30 05:24:10 +08:00
										 |  |  | 	return &storageServer{ | 
					
						
							|  |  |  | 		storage: storage, | 
					
						
							|  |  |  | 	}, nil | 
					
						
							| 
									
										
										
										
											2016-04-20 11:05:38 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // registerStorageRPCRouter - register storage rpc router.
 | 
					
						
							|  |  |  | func registerStorageRPCRouter(mux *router.Router, stServer *storageServer) { | 
					
						
							| 
									
										
										
										
											2016-04-13 03:45:15 +08:00
										 |  |  | 	storageRPCServer := rpc.NewServer() | 
					
						
							| 
									
										
										
										
											2016-04-09 01:37:38 +08:00
										 |  |  | 	storageRPCServer.RegisterName("Storage", stServer) | 
					
						
							|  |  |  | 	storageRouter := mux.NewRoute().PathPrefix(reservedBucket).Subrouter() | 
					
						
							| 
									
										
										
										
											2016-04-13 03:45:15 +08:00
										 |  |  | 	// Add minio storage routes.
 | 
					
						
							| 
									
										
										
										
											2016-04-24 15:36:00 +08:00
										 |  |  | 	storageRouter.Path("/storage").Handler(storageRPCServer) | 
					
						
							| 
									
										
										
										
											2016-04-09 01:37:38 +08:00
										 |  |  | } |