add func use grpc instead of REST

master
shengxiang 9 years ago
parent 168f125e4f
commit 22cad45ef3

@ -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

@ -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{},
}

@ -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 {

@ -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)

Loading…
Cancel
Save