From 06b390815c3226c8b192e9b61227e598fef6e2d6 Mon Sep 17 00:00:00 2001 From: mountain Date: Mon, 26 Jun 2023 11:26:57 +0900 Subject: [PATCH] =?UTF-8?q?=ED=94=84=EB=A1=9C=EC=84=B8=EC=8A=A4=20?= =?UTF-8?q?=EC=9E=AC=EC=8B=9C=EC=9E=91=20=EC=9A=94=EC=B2=AD=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/operation.go | 65 ++++++++++++-------------------- server/http_api.go | 92 +++++++++++++++++++++++++++++++++++++++++++-- server/operation.go | 26 +++++-------- shared/operator.go | 5 ++- 4 files changed, 124 insertions(+), 64 deletions(-) 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) { //
// @@ -191,9 +228,11 @@ func (h *houstonHandler) Deploy(w http.ResponseWriter, r *http.Request) { return } - configPath := "" - if _, err := os.Stat(path.Join(h.deployPath, name, "config", "config.json")); err == nil || errors.Is(err, fs.ErrExist) { - configPath = path.Join(sub_folder_name_deploys, name, "config", "config.json") + configPath, err := h.findLastestConfigFile(name) + if err != nil { + logger.Println(err) + w.WriteHeader(http.StatusBadRequest) + return } h.Operation().Deploy(MakeDeployRequest( @@ -310,6 +349,51 @@ func (h *houstonHandler) StopProcess(w http.ResponseWriter, r *http.Request) { }, targets)) } +func (h *houstonHandler) RestartProcess(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) { //
// diff --git a/server/operation.go b/server/operation.go index 254b1af..35de2dc 100644 --- a/server/operation.go +++ b/server/operation.go @@ -328,26 +328,18 @@ func (os *operationServer) RestartProcess(d RestartProcessRequest) { return false }) - if len(d.hostnames) > 0 { - // hostname만 재시작 - var final []*hostWithChan - conv := make(map[string]bool) - for _, hn := range d.hostnames { - conv[hn] = true - } - - for _, t := range targets { - if _, ok := conv[t.Hostname]; ok { - final = append(final, t) - } - } - targets = final + if len(d.hostnames) != 1 { + return } + // hostname만 재시작 for _, t := range targets { - t.opChan <- &opdef{ - operation: shared.Restart, - args: d, + if t.Hostname == d.hostnames[0] { + t.opChan <- &opdef{ + operation: shared.Restart, + args: d, + } + return } } } diff --git a/shared/operator.go b/shared/operator.go index 4c64b54..1876ed8 100644 --- a/shared/operator.go +++ b/shared/operator.go @@ -45,8 +45,9 @@ type StopProcessRequest struct { } type RestartProcessRequest struct { - Name string - Version string + Name string + Pid int32 + Config string } type UploadRequest struct {