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 (
"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}
}
+36 -38
View File
@@ -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)
// }
// }