From 676b9058de482fdaaf3110eed1fab37690da1a83 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Tue, 7 Jul 2015 16:59:20 -0700 Subject: [PATCH] Separate out memory statistics and system information into two different services --- commands.go | 11 ++++++++++- pkg/controller/client.go | 26 ++++++++++++++++++++++++-- pkg/server/router.go | 3 ++- pkg/server/rpc/sysinfo.go | 30 ++++++++++++++++++++++-------- 4 files changed, 58 insertions(+), 12 deletions(-) diff --git a/commands.go b/commands.go index 743f1f951..e1fefa0b5 100644 --- a/commands.go +++ b/commands.go @@ -101,7 +101,7 @@ func runController(c *cli.Context) { if err != nil { Fatalf("Unable to determine current user. Reason: %s\n", err) } - if len(c.Args()) <= 2 || c.Args().First() == "help" { + if len(c.Args()) < 2 || c.Args().First() == "help" { cli.ShowCommandHelpAndExit(c, "controller", 1) // last argument is exit code } switch c.Args().First() { @@ -117,7 +117,16 @@ func runController(c *cli.Context) { Fatalln(err) } Println(string(memstats)) + case "sysinfo": + sysinfo, err := controller.GetSysInfo(c.Args().Tail().First()) + if err != nil { + Fatalln(err) + } + Println(string(sysinfo)) case "donut": + if len(c.Args()) <= 2 || c.Args().First() == "help" { + cli.ShowCommandHelpAndExit(c, "controller", 1) // last argument is exit code + } hostname, _ := os.Hostname() err := controller.SetDonut(c.Args().Tail().First(), hostname, c.Args().Tail().Tail()) if err != nil { diff --git a/pkg/controller/client.go b/pkg/controller/client.go index 7f91a661c..1383af66a 100644 --- a/pkg/controller/client.go +++ b/pkg/controller/client.go @@ -47,8 +47,30 @@ func GetDisks(url string) ([]string, error) { return reply.Disks, nil } -// GetMemStats get system info of the server at given url +// GetMemStats get memory status of the server at given url func GetMemStats(url string) ([]byte, error) { + op := RPCOps{ + Method: "MemStats.Get", + Request: rpc.Args{Request: ""}, + } + req, err := NewRequest(url, op, http.DefaultTransport) + if err != nil { + return nil, iodine.New(err, nil) + } + resp, err := req.Do() + if err != nil { + return nil, iodine.New(err, nil) + } + defer resp.Body.Close() + var reply rpc.MemStatsReply + if err := jsonrpc.DecodeClientResponse(resp.Body, &reply); err != nil { + return nil, iodine.New(err, nil) + } + return json.MarshalIndent(reply, "", "\t") +} + +// GetSysInfo get system status of the server at given url +func GetSysInfo(url string) ([]byte, error) { op := RPCOps{ Method: "SysInfo.Get", Request: rpc.Args{Request: ""}, @@ -96,4 +118,4 @@ func SetDonut(url, hostname string, disks []string) error { return reply.Error } -// Add more functions here for many replies +// Add more functions here for other RPC messages diff --git a/pkg/server/router.go b/pkg/server/router.go index 7fa25b542..509202002 100644 --- a/pkg/server/router.go +++ b/pkg/server/router.go @@ -114,8 +114,9 @@ func getRPCHandler() http.Handler { s.RegisterJSONCodec() s.RegisterService(new(rpc.VersionService), "Version") s.RegisterService(new(rpc.SysInfoService), "SysInfo") + s.RegisterService(new(rpc.MemStatsService), "MemStats") s.RegisterService(new(rpc.DiskInfoService), "DiskInfo") s.RegisterService(new(rpc.DonutService), "Donut") - // Add new services here + // Add new RPC services here return registerRPC(router.NewRouter(), s) } diff --git a/pkg/server/rpc/sysinfo.go b/pkg/server/rpc/sysinfo.go index e463faabf..a81cd920c 100644 --- a/pkg/server/rpc/sysinfo.go +++ b/pkg/server/rpc/sysinfo.go @@ -29,13 +29,20 @@ type SysInfoService struct{} // SysInfoReply - type SysInfoReply struct { - Hostname string `json:"hostname"` - SysARCH string `json:"sys.arch"` - SysOS string `json:"sys.os"` - SysCPUS int `json:"sys.ncpus"` - Routines int `json:"goroutines"` - GOVersion string `json:"goversion"` - MemStats runtime.MemStats `json:"memstats"` + Hostname string `json:"hostname"` + SysARCH string `json:"sys.arch"` + SysOS string `json:"sys.os"` + SysCPUS int `json:"sys.ncpus"` + Routines int `json:"goroutines"` + GOVersion string `json:"goversion"` +} + +// MemStatsService - +type MemStatsService struct{} + +// MemStatsReply - +type MemStatsReply struct { + runtime.MemStats `json:"memstats"` } func setSysInfoReply(sis *SysInfoReply) error { @@ -50,11 +57,13 @@ func setSysInfoReply(sis *SysInfoReply) error { if err != nil { return iodine.New(err, nil) } + return nil +} +func setMemStatsReply(sis *MemStatsReply) error { var memStats runtime.MemStats runtime.ReadMemStats(&memStats) sis.MemStats = memStats - return nil } @@ -62,3 +71,8 @@ func setSysInfoReply(sis *SysInfoReply) error { func (s *SysInfoService) Get(r *http.Request, args *Args, reply *SysInfoReply) error { return setSysInfoReply(reply) } + +// Get method +func (s *MemStatsService) Get(r *http.Request, args *Args, reply *MemStatsReply) error { + return setMemStatsReply(reply) +}