From e57b3ce4c0769356c66b93c9c676819a4ce5ff9d Mon Sep 17 00:00:00 2001 From: Dmitry Ukov Date: Fri, 7 Feb 2020 20:57:41 +0400 Subject: [PATCH] Show isogen container logs if debug is enabled Change-Id: I92c82eecdb35de22cc4da2326632b8af3aadd4cd --- pkg/container/container_docker.go | 20 ++++++++++++++++++-- pkg/container/container_docker_test.go | 22 +++++++++++++++++++++- pkg/log/log.go | 5 +++++ 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/pkg/container/container_docker.go b/pkg/container/container_docker.go index 966024640..d9259a6a1 100644 --- a/pkg/container/container_docker.go +++ b/pkg/container/container_docker.go @@ -225,8 +225,7 @@ func (c *DockerContainer) RunCommand( containerInput io.Reader, volumeMounts []string, envVars []string, - // TODO (D. Ukov) add debug logic - _ bool, + debug bool, ) error { realCmd, err := c.getCmd(cmd) if err != nil { @@ -264,7 +263,24 @@ func (c *DockerContainer) RunCommand( return err } + if debug { + log.Debug("start reading container logs") + var reader io.ReadCloser + reader, err = c.dockerClient.ContainerLogs(*c.ctx, c.id, types.ContainerLogsOptions{ShowStdout: true, Follow: true}) + if err != nil { + log.Debugf("failed to read container logs %s", err) + reader = ioutil.NopCloser(strings.NewReader("")) + } + + _, err = io.Copy(log.Writer(), reader) + if err != nil { + log.Debugf("failed to write container logs to log output %s", err) + } + log.Debug("got EOF from container logs") + } + statusCh, errCh := c.dockerClient.ContainerWait(*c.ctx, c.id, container.WaitConditionNotRunning) + log.Debugf("waiting until command '%s' is finished...", realCmd) select { case err = <-errCh: if err != nil { diff --git a/pkg/container/container_docker_test.go b/pkg/container/container_docker_test.go index d2f1dbeae..4cb47cc4c 100644 --- a/pkg/container/container_docker_test.go +++ b/pkg/container/container_docker_test.go @@ -352,7 +352,7 @@ func TestRunCommand(t *testing.T) { cmd: []string{"testCmd"}, containerInput: nil, volumeMounts: nil, - debug: false, + debug: true, mockDockerClient: mockDockerClient{ containerWait: func() (<-chan container.ContainerWaitOKBody, <-chan error) { resC := make(chan container.ContainerWaitOKBody) @@ -365,6 +365,26 @@ func TestRunCommand(t *testing.T) { expectedErr: ErrRunContainerCommand{Cmd: "docker logs testID"}, assertF: func(t *testing.T) {}, }, + { + cmd: []string{"testCmd"}, + containerInput: nil, + volumeMounts: nil, + debug: true, + mockDockerClient: mockDockerClient{ + containerWait: func() (<-chan container.ContainerWaitOKBody, <-chan error) { + resC := make(chan container.ContainerWaitOKBody) + go func() { + resC <- container.ContainerWaitOKBody{StatusCode: 1} + }() + return resC, nil + }, + containerLogs: func() (io.ReadCloser, error) { + return nil, fmt.Errorf("Logs error") + }, + }, + expectedErr: ErrRunContainerCommand{Cmd: "docker logs testID"}, + assertF: func(t *testing.T) {}, + }, } for _, tt := range tests { cnt := getDockerContainerMock(tt.mockDockerClient) diff --git a/pkg/log/log.go b/pkg/log/log.go index 3b5a24bcf..cc3bfd505 100644 --- a/pkg/log/log.go +++ b/pkg/log/log.go @@ -50,3 +50,8 @@ func Fatal(v ...interface{}) { func Fatalf(format string, v ...interface{}) { airshipLog.Fatalf(format, v...) } + +// Writer returns log output writer object +func Writer() io.Writer { + return airshipLog.Writer() +}