wip: create pipes to manage entrypoint stdout/stderr even after termination

This commit is contained in:
Roberto Abdelkader Martínez Pérez
2020-11-18 18:57:13 +01:00
committed by pancho horrillo
parent 847c1bd7a0
commit 0dd9cf07ab
2 changed files with 59 additions and 55 deletions
+23 -17
View File
@@ -18,13 +18,12 @@ package mux
import ( import (
"bufio" "bufio"
"bytes"
"log" "log"
"net/http" "net/http"
"os"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/BBVA/kapow/internal/logger"
"github.com/BBVA/kapow/internal/server/data" "github.com/BBVA/kapow/internal/server/data"
"github.com/BBVA/kapow/internal/server/model" "github.com/BBVA/kapow/internal/server/model"
"github.com/BBVA/kapow/internal/server/user/spawn" "github.com/BBVA/kapow/internal/server/user/spawn"
@@ -51,29 +50,36 @@ func handlerBuilder(route model.Route) http.Handler {
data.Handlers.Add(h) data.Handlers.Add(h)
defer data.Handlers.Remove(h.ID) defer data.Handlers.Remove(h.ID)
stdOut := &bytes.Buffer{} stdOutR, stdOutW, err := os.Pipe()
stdErr := &bytes.Buffer{} defer stdOutW.Close()
err = spawner(h, stdOut, stdErr) if err != nil {
//err = spawner(h, 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 { if err != nil {
log.Println(err) log.Println(err)
} }
logger.SendMsg(logger.SCRIPTS, createLogMsg(h.ID, *stdOut, *stdErr))
}) })
} }
func createLogMsg(handlerId string, stdout, stderr bytes.Buffer) logger.LogMsg { func logStream(handlerId string, streamName string, stream *os.File) {
var messages []string defer stream.Close()
scanner := bufio.NewScanner(bytes.NewBuffer(stdout.Bytes())) execLog := log.New(os.Stdout, "", log.Ldate|log.Ltime|log.LUTC|log.Lmicroseconds)
scanner := bufio.NewScanner(stream)
for scanner.Scan() { 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}
} }
+36 -38
View File
@@ -17,13 +17,11 @@
package mux package mux
import ( import (
"bytes"
"errors" "errors"
"io" "io"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"reflect" "reflect"
"strings"
"testing" "testing"
"github.com/google/uuid" "github.com/google/uuid"
@@ -199,50 +197,50 @@ func TestHandlerBuilderRemovesHandlerWhenDone(t *testing.T) {
} }
} }
func TestCreateLogMsgAdsPrefixInfo(t *testing.T) { // func TestCreateLogMsgAdsPrefixInfo(t *testing.T) {
expected := "FOO" // expected := "FOO"
msg := createLogMsg(expected, bytes.Buffer{}, bytes.Buffer{}) // msg := createLogMsg(expected, bytes.Buffer{}, bytes.Buffer{})
if msg.Prefix != expected { // if msg.Prefix != expected {
t.Errorf("LogMsg doesn't contain expected Prefix. Expected: %s, got: %s", expected, msg.Prefix) // t.Errorf("LogMsg doesn't contain expected Prefix. Expected: %s, got: %s", expected, msg.Prefix)
} // }
} // }
func TestCreateLogMsgAdsStdOutInfo(t *testing.T) { // func TestCreateLogMsgAdsStdOutInfo(t *testing.T) {
expected := "FOO\nBAR" // expected := "FOO\nBAR"
out := bytes.Buffer{} // out := bytes.Buffer{}
out.WriteString(expected) // out.WriteString(expected)
msg := createLogMsg("", out, bytes.Buffer{}) // msg := createLogMsg("", out, bytes.Buffer{})
if strings.Join(msg.Messages, "\n") != expected { // if strings.Join(msg.Messages, "\n") != expected {
t.Errorf("LogMsg doesn't contain expected payload. Expected: %s, got: %s", expected, msg.Prefix) // t.Errorf("LogMsg doesn't contain expected payload. Expected: %s, got: %s", expected, msg.Prefix)
} // }
} // }
func TestCreateLogMsgAdsStdErrInfo(t *testing.T) { // func TestCreateLogMsgAdsStdErrInfo(t *testing.T) {
expected := "FOO\nBAR" // expected := "FOO\nBAR"
err := bytes.Buffer{} // err := bytes.Buffer{}
err.WriteString(expected) // err.WriteString(expected)
msg := createLogMsg("", bytes.Buffer{}, err) // msg := createLogMsg("", bytes.Buffer{}, err)
if strings.Join(msg.Messages, "\n") != expected { // if strings.Join(msg.Messages, "\n") != expected {
t.Errorf("LogMsg doesn't contain expected payload. Expected: %s, got: %s", expected, msg.Prefix) // t.Errorf("LogMsg doesn't contain expected payload. Expected: %s, got: %s", expected, msg.Prefix)
} // }
} // }
func TestCreateLogMsgAdsStdOutAndStdErrInfo(t *testing.T) { // func TestCreateLogMsgAdsStdOutAndStdErrInfo(t *testing.T) {
expected := "FOO\nBAR\nFOO BAZ" // expected := "FOO\nBAR\nFOO BAZ"
out := bytes.Buffer{} // out := bytes.Buffer{}
out.WriteString("FOO\nBAR\n") // out.WriteString("FOO\nBAR\n")
err := bytes.Buffer{} // err := bytes.Buffer{}
err.WriteString("FOO BAZ") // err.WriteString("FOO BAZ")
msg := createLogMsg("", out, err) // msg := createLogMsg("", out, err)
if strings.Join(msg.Messages, "\n") != expected { // if strings.Join(msg.Messages, "\n") != expected {
t.Errorf("LogMsg doesn't contain expected payload. Expected: %s, got: %s", expected, msg.Prefix) // t.Errorf("LogMsg doesn't contain expected payload. Expected: %s, got: %s", expected, msg.Prefix)
} // }
} // }