From 22cad45ef3ed71298726ef164aef1466bdf33acf Mon Sep 17 00:00:00 2001 From: shengxiang Date: Sun, 13 Sep 2015 14:53:03 +0800 Subject: [PATCH] add func use grpc instead of REST --- gosuv.go | 51 +++++++++++++++------------------------------ gosuvpb/gosuv.pb.go | 34 +++++++++++++++++++++++++++--- gosuvpb/gosuv.proto | 6 ++++-- service.go | 20 ++++++++++++++++++ 4 files changed, 72 insertions(+), 39 deletions(-) diff --git a/gosuv.go b/gosuv.go index b030798..0f6fecf 100644 --- a/gosuv.go +++ b/gosuv.go @@ -5,17 +5,14 @@ import ( "io" "io/ioutil" "net" - "net/http" "os" "os/exec" "path/filepath" - "strconv" "time" "github.com/codegangsta/cli" "github.com/codegangsta/inject" pb "github.com/codeskyblue/gosuv/gosuvpb" - "github.com/franela/goreq" "github.com/qiniu/log" "golang.org/x/net/context" "google.golang.org/grpc" @@ -100,49 +97,34 @@ func StatusAction(client pb.GoSuvClient) { } } -func AddAction(ctx *cli.Context) { +func AddAction(ctx *cli.Context, client pb.GoSuvClient) { name := ctx.String("name") + if name == "" { + name = filepath.Base(ctx.Args()[0]) + } + dir, _ := os.Getwd() + if len(ctx.Args()) < 1 { log.Fatal("need at least one args") } - if name == "" { - name = filepath.Base(ctx.Args()[0]) - } - log.Println(ctx.Args().Tail()) - log.Println([]string(ctx.Args())) - log.Println(ctx.Args().Tail()) - log.Println(ctx.StringSlice("env")) - log.Println("Dir:", dir) cmdName := ctx.Args().First() - log.Println("cmd name:", cmdName) cmdPath, err := exec.LookPath(cmdName) if err != nil { log.Fatal(err) } - fmt.Printf("program: %s has been added\n", strconv.Quote(name)) - p := &ProgramInfo{ - Name: name, - Dir: dir, - Command: append([]string{cmdPath}, ctx.Args().Tail()...), - Environ: ctx.StringSlice("env"), - } - res, err := goreq.Request{ - Method: "POST", - Uri: buildURI(ctx, "/api/programs"), - Body: p, - }.Do() + + req := new(pb.ProgramInfo) + req.Name = ctx.String("name") + req.Directory = dir + req.Command = append([]string{cmdPath}, ctx.Args().Tail()...) + req.Environ = ctx.StringSlice("env") + + res, err := client.Create(context.Background(), req) if err != nil { log.Fatal(err) } - var jres JSONResponse - if res.StatusCode != http.StatusOK { - log.Fatal(res.Body.ToString()) - } - if err = res.Body.FromJsonTo(&jres); err != nil { - log.Fatal(err) - } - fmt.Println(jres.Message) + fmt.Println(res.Message) } func buildURI(ctx *cli.Context, uri string) string { @@ -352,10 +334,11 @@ func newPluginAction(name string) func(*cli.Context) { func runPlugin(ctx *cli.Context, name string) { pluginDir := filepath.Join(CMDPLUGIN_DIR, name) + selfPath, _ := filepath.Abs(os.Args[0]) envs := []string{ "GOSUV_SERVER_ADDR=" + ctx.GlobalString("addr"), "GOSUV_PLUGIN_NAME=" + name, - "GOSUV_PROGRAM=" + os.Args[0], + "GOSUV_PROGRAM=" + selfPath, } cmd := exec.Command(filepath.Join(pluginDir, "run"), ctx.Args()...) cmd.Stdout = os.Stdout diff --git a/gosuvpb/gosuv.pb.go b/gosuvpb/gosuv.pb.go index bd69868..7873a12 100644 --- a/gosuvpb/gosuv.pb.go +++ b/gosuvpb/gosuv.pb.go @@ -69,9 +69,10 @@ func (m *TailRequest) String() string { return proto.CompactTextString(m) } func (*TailRequest) ProtoMessage() {} type ProgramInfo struct { - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Command string `protobuf:"bytes,2,opt,name=command" json:"command,omitempty"` - Dir string `protobuf:"bytes,3,opt,name=dir" json:"dir,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Directory string `protobuf:"bytes,3,opt,name=directory" json:"directory,omitempty"` + Command []string `protobuf:"bytes,2,rep,name=command" json:"command,omitempty"` + Environ []string `protobuf:"bytes,4,rep,name=environ" json:"environ,omitempty"` } func (m *ProgramInfo) Reset() { *m = ProgramInfo{} } @@ -121,6 +122,7 @@ type GoSuvClient interface { Shutdown(ctx context.Context, in *NopRequest, opts ...grpc.CallOption) (*Response, error) Version(ctx context.Context, in *NopRequest, opts ...grpc.CallOption) (*Response, error) Status(ctx context.Context, in *NopRequest, opts ...grpc.CallOption) (*StatusResponse, error) + Create(ctx context.Context, in *ProgramInfo, opts ...grpc.CallOption) (*Response, error) } type goSuvClient struct { @@ -158,12 +160,22 @@ func (c *goSuvClient) Status(ctx context.Context, in *NopRequest, opts ...grpc.C return out, nil } +func (c *goSuvClient) Create(ctx context.Context, in *ProgramInfo, opts ...grpc.CallOption) (*Response, error) { + out := new(Response) + err := grpc.Invoke(ctx, "/gosuvpb.GoSuv/Create", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // Server API for GoSuv service type GoSuvServer interface { Shutdown(context.Context, *NopRequest) (*Response, error) Version(context.Context, *NopRequest) (*Response, error) Status(context.Context, *NopRequest) (*StatusResponse, error) + Create(context.Context, *ProgramInfo) (*Response, error) } func RegisterGoSuvServer(s *grpc.Server, srv GoSuvServer) { @@ -206,6 +218,18 @@ func _GoSuv_Status_Handler(srv interface{}, ctx context.Context, codec grpc.Code return out, nil } +func _GoSuv_Create_Handler(srv interface{}, ctx context.Context, codec grpc.Codec, buf []byte) (interface{}, error) { + in := new(ProgramInfo) + if err := codec.Unmarshal(buf, in); err != nil { + return nil, err + } + out, err := srv.(GoSuvServer).Create(ctx, in) + if err != nil { + return nil, err + } + return out, nil +} + var _GoSuv_serviceDesc = grpc.ServiceDesc{ ServiceName: "gosuvpb.GoSuv", HandlerType: (*GoSuvServer)(nil), @@ -222,6 +246,10 @@ var _GoSuv_serviceDesc = grpc.ServiceDesc{ MethodName: "Status", Handler: _GoSuv_Status_Handler, }, + { + MethodName: "Create", + Handler: _GoSuv_Create_Handler, + }, }, Streams: []grpc.StreamDesc{}, } diff --git a/gosuvpb/gosuv.proto b/gosuvpb/gosuv.proto index 2c779a6..34d7d22 100644 --- a/gosuvpb/gosuv.proto +++ b/gosuvpb/gosuv.proto @@ -20,8 +20,9 @@ message TailRequest { } message ProgramInfo { string name = 1; - string command = 2; - string dir = 3; + string directory = 3; + repeated string command = 2; + repeated string environ = 4; } message ProgramStatus { @@ -42,6 +43,7 @@ service GoSuv { rpc Shutdown(NopRequest) returns (Response) {} rpc Version(NopRequest) returns (Response) {} rpc Status(NopRequest) returns (StatusResponse) {} + rpc Create(ProgramInfo) returns (Response) {} } service Program { diff --git a/service.go b/service.go index 319b09c..2833d22 100644 --- a/service.go +++ b/service.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "log" "net" "os" "os/exec" @@ -72,6 +73,25 @@ type PbSuvServer struct { lis net.Listener } +func (s *PbSuvServer) Create(ctx context.Context, in *pb.ProgramInfo) (*pb.Response, error) { + pinfo := new(ProgramInfo) + pinfo.Name = in.Name + pinfo.Command = in.Command + pinfo.Dir = in.Directory + pinfo.Environ = in.Environ + + log.Println(in.Name) + program := NewProgram(pinfo) + if err := programTable.AddProgram(program); err != nil { + return nil, err + } + program.InputData(EVENT_START) + res := new(pb.Response) + res.Code = 200 + res.Message = fmt.Sprintf("%s: created", pinfo.Name) + return res, nil +} + func (s *PbSuvServer) Shutdown(ctx context.Context, in *pb.NopRequest) (*pb.Response, error) { go func() { time.Sleep(50 * time.Millisecond)