From 0dd9cf07ab00389a9b204140e47c13c35286a210 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roberto=20Abdelkader=20Mart=C3=ADnez=20P=C3=A9rez?= Date: Wed, 18 Nov 2020 18:57:13 +0100 Subject: [PATCH] wip: create pipes to manage entrypoint stdout/stderr even after termination --- internal/server/user/mux/handlerbuilder.go | 40 +++++----- .../server/user/mux/handlerbuilder_test.go | 74 +++++++++---------- 2 files changed, 59 insertions(+), 55 deletions(-) diff --git a/internal/server/user/mux/handlerbuilder.go b/internal/server/user/mux/handlerbuilder.go index 55df210..bd5ca6d 100644 --- a/internal/server/user/mux/handlerbuilder.go +++ b/internal/server/user/mux/handlerbuilder.go @@ -18,13 +18,12 @@ package mux import ( "bufio" - "bytes" "log" "net/http" + "os" "github.com/google/uuid" - "github.com/BBVA/kapow/internal/logger" "github.com/BBVA/kapow/internal/server/data" "github.com/BBVA/kapow/internal/server/model" "github.com/BBVA/kapow/internal/server/user/spawn" @@ -51,29 +50,36 @@ func handlerBuilder(route model.Route) http.Handler { data.Handlers.Add(h) defer data.Handlers.Remove(h.ID) - stdOut := &bytes.Buffer{} - stdErr := &bytes.Buffer{} - err = spawner(h, stdOut, stdErr) - //err = spawner(h, nil) + stdOutR, stdOutW, err := os.Pipe() + defer stdOutW.Close() + if err != nil { + log.Println(err) + return + } + stdErrR, stdErrW, err := os.Pipe() + defer stdErrW.Close() + if err != nil { + log.Println(err) + return + } + + go logStream(h.ID, "stdout", stdOutR) + go logStream(h.ID, "stderr", stdErrR) + + err = spawner(h, stdOutW, stdErrW) if err != nil { log.Println(err) } - logger.SendMsg(logger.SCRIPTS, createLogMsg(h.ID, *stdOut, *stdErr)) }) } -func createLogMsg(handlerId string, stdout, stderr bytes.Buffer) logger.LogMsg { - var messages []string - scanner := bufio.NewScanner(bytes.NewBuffer(stdout.Bytes())) +func logStream(handlerId string, streamName string, stream *os.File) { + defer stream.Close() + execLog := log.New(os.Stdout, "", log.Ldate|log.Ltime|log.LUTC|log.Lmicroseconds) + scanner := bufio.NewScanner(stream) for scanner.Scan() { - messages = append(messages, scanner.Text()) + execLog.Printf("%s %s: %s", handlerId, streamName, scanner.Text()) } - scanner = bufio.NewScanner(bytes.NewBuffer(stderr.Bytes())) - for scanner.Scan() { - messages = append(messages, scanner.Text()) - } - - return logger.LogMsg{Prefix: handlerId, Messages: messages} } diff --git a/internal/server/user/mux/handlerbuilder_test.go b/internal/server/user/mux/handlerbuilder_test.go index 56f12a7..5f62361 100644 --- a/internal/server/user/mux/handlerbuilder_test.go +++ b/internal/server/user/mux/handlerbuilder_test.go @@ -17,13 +17,11 @@ package mux import ( - "bytes" "errors" "io" "net/http" "net/http/httptest" "reflect" - "strings" "testing" "github.com/google/uuid" @@ -199,50 +197,50 @@ func TestHandlerBuilderRemovesHandlerWhenDone(t *testing.T) { } } -func TestCreateLogMsgAdsPrefixInfo(t *testing.T) { - expected := "FOO" +// func TestCreateLogMsgAdsPrefixInfo(t *testing.T) { +// expected := "FOO" - msg := createLogMsg(expected, bytes.Buffer{}, bytes.Buffer{}) +// msg := createLogMsg(expected, bytes.Buffer{}, bytes.Buffer{}) - if msg.Prefix != expected { - t.Errorf("LogMsg doesn't contain expected Prefix. Expected: %s, got: %s", expected, msg.Prefix) - } -} +// if msg.Prefix != expected { +// t.Errorf("LogMsg doesn't contain expected Prefix. Expected: %s, got: %s", expected, msg.Prefix) +// } +// } -func TestCreateLogMsgAdsStdOutInfo(t *testing.T) { - expected := "FOO\nBAR" - out := bytes.Buffer{} - out.WriteString(expected) +// func TestCreateLogMsgAdsStdOutInfo(t *testing.T) { +// expected := "FOO\nBAR" +// out := bytes.Buffer{} +// out.WriteString(expected) - msg := createLogMsg("", out, bytes.Buffer{}) +// msg := createLogMsg("", out, bytes.Buffer{}) - if strings.Join(msg.Messages, "\n") != expected { - t.Errorf("LogMsg doesn't contain expected payload. Expected: %s, got: %s", expected, msg.Prefix) - } -} +// if strings.Join(msg.Messages, "\n") != expected { +// t.Errorf("LogMsg doesn't contain expected payload. Expected: %s, got: %s", expected, msg.Prefix) +// } +// } -func TestCreateLogMsgAdsStdErrInfo(t *testing.T) { - expected := "FOO\nBAR" - err := bytes.Buffer{} - err.WriteString(expected) +// func TestCreateLogMsgAdsStdErrInfo(t *testing.T) { +// expected := "FOO\nBAR" +// err := bytes.Buffer{} +// err.WriteString(expected) - msg := createLogMsg("", bytes.Buffer{}, err) +// msg := createLogMsg("", bytes.Buffer{}, err) - if strings.Join(msg.Messages, "\n") != expected { - t.Errorf("LogMsg doesn't contain expected payload. Expected: %s, got: %s", expected, msg.Prefix) - } -} +// if strings.Join(msg.Messages, "\n") != expected { +// t.Errorf("LogMsg doesn't contain expected payload. Expected: %s, got: %s", expected, msg.Prefix) +// } +// } -func TestCreateLogMsgAdsStdOutAndStdErrInfo(t *testing.T) { - expected := "FOO\nBAR\nFOO BAZ" - out := bytes.Buffer{} - out.WriteString("FOO\nBAR\n") - err := bytes.Buffer{} - err.WriteString("FOO BAZ") +// func TestCreateLogMsgAdsStdOutAndStdErrInfo(t *testing.T) { +// expected := "FOO\nBAR\nFOO BAZ" +// out := bytes.Buffer{} +// out.WriteString("FOO\nBAR\n") +// err := bytes.Buffer{} +// err.WriteString("FOO BAZ") - msg := createLogMsg("", out, err) +// msg := createLogMsg("", out, err) - if strings.Join(msg.Messages, "\n") != expected { - t.Errorf("LogMsg doesn't contain expected payload. Expected: %s, got: %s", expected, msg.Prefix) - } -} +// if strings.Join(msg.Messages, "\n") != expected { +// t.Errorf("LogMsg doesn't contain expected payload. Expected: %s, got: %s", expected, msg.Prefix) +// } +// }