diff options
Diffstat (limited to 'pkg/container/docker_logger.go')
-rw-r--r-- | pkg/container/docker_logger.go | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/pkg/container/docker_logger.go b/pkg/container/docker_logger.go new file mode 100644 index 0000000..b9eb503 --- /dev/null +++ b/pkg/container/docker_logger.go @@ -0,0 +1,83 @@ +//go:build !(WITHOUT_DOCKER || !(linux || darwin || windows || netbsd)) + +package container + +import ( + "bufio" + "encoding/json" + "errors" + "io" + + "github.com/sirupsen/logrus" +) + +type dockerMessage struct { + ID string `json:"id"` + Stream string `json:"stream"` + Error string `json:"error"` + ErrorDetail struct { + Message string + } + Status string `json:"status"` + Progress string `json:"progress"` +} + +const logPrefix = " \U0001F433 " + +func logDockerResponse(logger logrus.FieldLogger, dockerResponse io.ReadCloser, isError bool) error { + if dockerResponse == nil { + return nil + } + defer dockerResponse.Close() + + scanner := bufio.NewScanner(dockerResponse) + msg := dockerMessage{} + + for scanner.Scan() { + line := scanner.Bytes() + + msg.ID = "" + msg.Stream = "" + msg.Error = "" + msg.ErrorDetail.Message = "" + msg.Status = "" + msg.Progress = "" + + if err := json.Unmarshal(line, &msg); err != nil { + writeLog(logger, false, "Unable to unmarshal line [%s] ==> %v", string(line), err) + continue + } + + if msg.Error != "" { + writeLog(logger, isError, "%s", msg.Error) + return errors.New(msg.Error) + } + + if msg.ErrorDetail.Message != "" { + writeLog(logger, isError, "%s", msg.ErrorDetail.Message) + return errors.New(msg.Error) + } + + if msg.Status != "" { + if msg.Progress != "" { + writeLog(logger, isError, "%s :: %s :: %s\n", msg.Status, msg.ID, msg.Progress) + } else { + writeLog(logger, isError, "%s :: %s\n", msg.Status, msg.ID) + } + } else if msg.Stream != "" { + writeLog(logger, isError, "%s", msg.Stream) + } else { + writeLog(logger, false, "Unable to handle line: %s", string(line)) + } + } + + return nil +} + +func writeLog(logger logrus.FieldLogger, isError bool, format string, args ...interface{}) { + if isError { + logger.Errorf(format, args...) + } else { + logger.Debugf(format, args...) + } +} |