wip: create pipes to manage entrypoint stdout/stderr even after termination
This commit is contained in:
committed by
pancho horrillo
parent
847c1bd7a0
commit
0dd9cf07ab
@@ -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}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
// }
|
||||
// }
|
||||
|
||||
Reference in New Issue
Block a user