diff --git a/client/operation.go b/client/operation.go index 8e08605..9226e93 100644 --- a/client/operation.go +++ b/client/operation.go @@ -452,52 +452,35 @@ func (hc *houstonClient) stopChildProcess(req *shared.StopProcessRequest, op pro } func (hc *houstonClient) restartChildProcess(req *shared.RestartProcessRequest, op protos.OperationClient) error { - if req.Version == "latest" { - // 최신 버전을 찾음 - latest, err := shared.FindLastestVersion(hc.config.StorageRoot, req.Name) - if err != nil { - return err - } - - req.Version = latest - } - - var restarts []*procmeta for _, proc := range hc.childProcs { - if proc.name == req.Name { - if len(req.Version) == 0 { - restarts = append(restarts, proc) - } else if req.Version == proc.version { - restarts = append(restarts, proc) + if proc.cmd.Process.Pid == int(req.Pid) { + if len(req.Config) > 0 { + // config.json를 먼저 다운로드 시도 + root := proc.cmd.Path + if _, err := download(root, hc.makeDownloadUrl(req.Config), ""); err != nil { + return err + } } + + if err := proc.cmd.Process.Signal(syscall.SIGTERM); err != nil { + proc.cmd.Process.Signal(os.Kill) + } + proc.state = protos.ProcessState_Stopping + proc.cmd.Wait() + proc.cmd.Process.Release() + op.Refresh(context.Background(), hc.makeOperationQueryRequest()) + + proc.state = protos.ProcessState_Stopped + op.Refresh(context.Background(), hc.makeOperationQueryRequest()) + + if err := hc.launch(proc); err != nil { + return err + } + + break } } - if len(restarts) == 0 { - return errNoRunningProcess - } - - for _, proc := range restarts { - if err := proc.cmd.Process.Signal(syscall.SIGTERM); err != nil { - proc.cmd.Process.Signal(os.Kill) - } - proc.state = protos.ProcessState_Stopping - } - - op.Refresh(context.Background(), hc.makeOperationQueryRequest()) - - for _, proc := range restarts { - proc.cmd.Wait() - proc.cmd.Process.Release() - proc.state = protos.ProcessState_Stopped - } - op.Refresh(context.Background(), hc.makeOperationQueryRequest()) - - for _, proc := range restarts { - if err := hc.launch(proc); err != nil { - return err - } - } op.Refresh(context.Background(), hc.makeOperationQueryRequest()) return nil diff --git a/server/http_api.go b/server/http_api.go index fa96ff9..bb4a2e2 100644 --- a/server/http_api.go +++ b/server/http_api.go @@ -2,7 +2,6 @@ package server import ( "encoding/json" - "errors" "fmt" "io" "io/fs" @@ -10,6 +9,7 @@ import ( "os" "path" "strconv" + "strings" "time" "repositories.action2quare.com/ayo/gocommon/logger" @@ -140,6 +140,43 @@ func (h *houstonHandler) DeleteDeploySource(w http.ResponseWriter, r *http.Reque } } +func (h *houstonHandler) findLastestConfigFile(name string) (string, error) { + logger.Println("findLastestConfigFile :", name) + configFiles, err := os.ReadDir(path.Join(h.deployPath, name, "config")) + if err != nil { + logger.Println("findLastestConfigFile failed :", err) + return "", err + } + + var cf fs.FileInfo + for _, file := range configFiles { + if file.IsDir() { + continue + } + if strings.HasPrefix(file.Name(), "config.") { + test, err := file.Info() + if err != nil { + return "", err + } + + if cf == nil { + cf = test + } else if test.ModTime().After(cf.ModTime()) { + cf = test + } + } + } + + if cf != nil { + logger.Println("findLastestConfigFile cf found :", cf.Name()) + return path.Join(sub_folder_name_deploys, name, "config", cf.Name()), nil + } + + logger.Println("findLastestConfigFile cf NOT found") + + return "", nil +} + func (h *houstonHandler) Deploy(w http.ResponseWriter, r *http.Request) { //
+ pidstr := r.FormValue("pid") + target := r.FormValue("target") + name := r.FormValue("name") + if len(target) == 0 || len(pidstr) == 0 || len(name) == 0 { + w.WriteHeader(http.StatusBadRequest) + return + } + + deployConfig := false + configstr := r.FormValue("config") + if len(configstr) > 0 { + deployConfig, _ = strconv.ParseBool(configstr) + } + + pid, err := strconv.ParseInt(pidstr, 10, 0) + if err != nil { + logger.Println(err) + w.WriteHeader(http.StatusBadRequest) + return + } + + var configPath string + if deployConfig { + configPath, err = h.findLastestConfigFile(name) + if err != nil { + logger.Println(err) + w.WriteHeader(http.StatusBadRequest) + return + } + } + + h.Operation().RestartProcess(MakeRestartRequest(shared.RestartProcessRequest{ + Name: name, + Pid: int32(pid), + Config: configPath, + }, []string{target})) +} + func (h *houstonHandler) UploadLogs(w http.ResponseWriter, r *http.Request) { //