binctr/vendor/github.com/Microsoft/hcsshim/internal/uvm/start.go
Jess Frazelle 94d1cfbfbf
update vendor
Signed-off-by: Jess Frazelle <acidburn@microsoft.com>
2018-09-25 12:27:46 -04:00

68 lines
1.4 KiB
Go

package uvm
import (
"encoding/json"
"io"
"io/ioutil"
"net"
"syscall"
"github.com/sirupsen/logrus"
)
const _ERROR_CONNECTION_ABORTED syscall.Errno = 1236
func forwardGcsLogs(l net.Listener) {
c, err := l.Accept()
l.Close()
if err != nil {
logrus.Error("accepting log socket: ", err)
return
}
j := json.NewDecoder(c)
logger := logrus.StandardLogger()
for {
e := logrus.Entry{Logger: logger}
err = j.Decode(&e.Data)
if err == io.EOF || err == _ERROR_CONNECTION_ABORTED {
break
}
if err != nil {
// Something went wrong. Read the rest of the data as a single
// string and log it at once -- it's probably a GCS panic stack.
logrus.Error("gcs log read: ", err)
rest, _ := ioutil.ReadAll(io.MultiReader(j.Buffered(), c))
if len(rest) != 0 {
logrus.Error("gcs stderr: ", string(rest))
}
break
}
msg := e.Data["msg"]
delete(e.Data, "msg")
lvl := e.Data["level"]
delete(e.Data, "level")
e.Data["vm.time"] = e.Data["time"]
delete(e.Data, "time")
switch lvl {
case "debug":
e.Debug(msg)
case "info":
e.Info(msg)
case "warning":
e.Warning(msg)
case "error", "fatal":
e.Error(msg)
default:
e.Info(msg)
}
}
}
// Start synchronously starts the utility VM.
func (uvm *UtilityVM) Start() error {
if uvm.gcslog != nil {
go forwardGcsLogs(uvm.gcslog)
uvm.gcslog = nil
}
return uvm.hcsSystem.Start()
}