diff --git a/config.json b/config.json index 30fbdf7..18bac49 100644 --- a/config.json +++ b/config.json @@ -9,9 +9,9 @@ "key": "95d8bcdc739741dca74c4a0e489e0774" }, "paths": { - "bin": "bin", - "config": "config", - "pid": "pid", - "root": "" + "bin": "/bin", + "config": "/config", + "pid": "/pid", + "root": "/project/overFlow/probe" } } \ No newline at end of file diff --git a/main.go b/main.go index 4f05cdf..3f61ab0 100644 --- a/main.go +++ b/main.go @@ -62,7 +62,7 @@ func main() { var instance interface{} go func() { - if ooccp.ProbeStateTypeNotAuthorized != config.Config.Probe.State() { + if ooccp.ProbeStateTypeNotAuthorized == config.Config.Probe.State() { var err error instance = auth.New() diff --git a/probe/probe.go b/probe/probe.go index 4578d9c..a3eaddd 100644 --- a/probe/probe.go +++ b/probe/probe.go @@ -36,6 +36,7 @@ func (pm *probeManagers) Start() error { } probeRPCRegistry := crr.NewRPCRegistry() + centralProbeClient := oopccp.New(probeRPCRegistry) centralDataClient := oopccd.New() centralClients := map[string]oogwc.Client{ diff --git a/service/ContainerService.go b/service/ContainerService.go index f5123c5..e6e1842 100644 --- a/service/ContainerService.go +++ b/service/ContainerService.go @@ -1,11 +1,21 @@ package service import ( + "fmt" + "io/ioutil" + "os" + "os/exec" + "path" "reflect" + "strconv" + "time" cda "git.loafle.net/commons_go/di/annotation" cdr "git.loafle.net/commons_go/di/registry" + "git.loafle.net/commons_go/logging" crc "git.loafle.net/commons_go/rpc/client" + oopcc "git.loafle.net/overflow/overflow_probe_container/client" + "git.loafle.net/overflow/overflow_probes/config" ) func init() { @@ -17,9 +27,9 @@ type ContainerService struct { } type containerState struct { - socketName string - pid int - client crc.Client + pid int + port int + client crc.Client } func (cs *ContainerService) Call(name string, result interface{}, method string, params ...interface{}) error { @@ -39,7 +49,15 @@ func (cs *ContainerService) Send(name string, method string, params ...interface } func (cs *ContainerService) GetClient(name string) (crc.Client, error) { - return nil, nil + cState, ok := cs.clients[name] + if !ok { + if err := cs.runProcess(name); nil != err { + return nil, err + } + cState, _ = cs.clients[name] + } + + return cState.client, nil } func (cs *ContainerService) Connect(name string) error { @@ -53,47 +71,90 @@ func (cs *ContainerService) runProcess(name string) error { return nil } - // runCmd := config.Config.Paths["root"] + "/" + config.Config.Paths["bin"] + "/" + name + "/start" + cmdPath := path.Join(config.Config.Paths["root"], config.Config.Paths["bin"], name+".sh") + pidPath := path.Join(config.Config.Paths["root"], config.Config.Paths["pid"], name+".pid") - // sockFile := uuid.NewV4().String() - // sockArg := fmt.Sprintf("-sock=\"%s\"", sockFile) + cmd := exec.Command(cmdPath, pidPath) + if err := cmd.Start(); nil != err { + logging.Logger().Error(fmt.Sprintf("Probe: To run container(%s) failed err %v", name, err)) + return err + } - // cmd := exec.Command(runCmd, sockArg) - // if err := cmd.Start(); nil != err { - // logging.Logger().Error(fmt.Sprintf("Probe: To run container(%s) failed err %v", name, err)) - // return err - // } - // time.Sleep(time.Duration(time.Second * 2)) + port, err := watchPidFileCreate(pidPath, time.Duration(time.Second*2)) + if nil != err { + return err + } - // cs := &containerState{ - // socketName: sockFile, - // pid: cmd.Process.Pid, - // } - // cs.client = oopmcc.New(sockFile, nil) - // // write pid file - // cs.containerClients[name] = cs + clientAddr := fmt.Sprintf("localhost:%d", port) + client := oopcc.New(clientAddr, nil) + if err := client.Connect(); nil != err { + cmd.Process.Kill() + return err + } + + cState := &containerState{ + pid: cmd.Process.Pid, + port: port, + client: client, + } + + cs.clients[name] = cState return nil } func (cs *ContainerService) checkProcess(name string) bool { - return false + cState, ok := cs.clients[name] + if !ok || nil == cState || nil == cState.client { + return false + } + + _, err := os.FindProcess(cState.pid) + if nil != err { + return false + } + + return true } func (cs *ContainerService) killProcess(name string) error { - // cs, ok := cs.containerClients[name] - // if !ok || nil == cs || nil == cs.client { - // return fmt.Errorf("Probe: Container[%s] is not exist", name) - // } + cState, ok := cs.clients[name] + if !ok || nil == cState || nil == cState.client { + return fmt.Errorf("Probe: Container[%s] is not exist", name) + } - // p, err := os.FindProcess(cs.pid) - // if nil != err { - // return err - // } - // if err = p.Kill(); nil != err { - // return err - // } - // // remove pid file + p, err := os.FindProcess(cState.pid) + if nil != err { + return err + } + + if err = p.Kill(); nil != err { + return err + } return nil } + +func watchPidFileCreate(pidFilePath string, waitTime time.Duration) (int, error) { + startTime := time.Now() + + for { + if _, err := os.Stat(pidFilePath); err == nil { + buf, err := ioutil.ReadFile(pidFilePath) + if nil != err { + return 0, err + } + portNumber, err := strconv.ParseInt(string(buf), 10, 32) + if nil != err { + return 0, err + } + return int(portNumber), nil + } + + if time.Since(startTime) > waitTime { + return 0, fmt.Errorf("Probe: pid file not exist") + } + + time.Sleep(time.Duration(time.Millisecond * 100)) + } +}