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 (
|
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}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|||||||
Reference in New Issue
Block a user