From 305b9630a0db59e2daf7e5c681322e4212584f8d Mon Sep 17 00:00:00 2001 From: stirante Date: Mon, 27 Jan 2020 11:53:17 +0100 Subject: [PATCH 1/3] Add health check to container list --- pkg/commands/container.go | 35 ++++++++++++++++++++++++----------- pkg/utils/utils.go | 7 +++++++ 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/pkg/commands/container.go b/pkg/commands/container.go index 9f48442d..6d5dc93e 100644 --- a/pkg/commands/container.go +++ b/pkg/commands/container.go @@ -53,17 +53,18 @@ type Details struct { Path string `json:"Path"` Args []string `json:"Args"` State struct { - Status string `json:"Status"` - Running bool `json:"Running"` - Paused bool `json:"Paused"` - Restarting bool `json:"Restarting"` - OOMKilled bool `json:"OOMKilled"` - Dead bool `json:"Dead"` - Pid int `json:"Pid"` - ExitCode int `json:"ExitCode"` - Error string `json:"Error"` - StartedAt time.Time `json:"StartedAt"` - FinishedAt time.Time `json:"FinishedAt"` + Status string `json:"Status"` + Running bool `json:"Running"` + Paused bool `json:"Paused"` + Restarting bool `json:"Restarting"` + OOMKilled bool `json:"OOMKilled"` + Dead bool `json:"Dead"` + Pid int `json:"Pid"` + ExitCode int `json:"ExitCode"` + Error string `json:"Error"` + StartedAt time.Time `json:"StartedAt"` + FinishedAt time.Time `json:"FinishedAt"` + Health types.Health `json:"Health"` } `json:"State"` Image string `json:"Image"` ResolvConfPath string `json:"ResolvConfPath"` @@ -259,6 +260,12 @@ func (c *Container) GetDisplayStatus() string { if c.Container.State == "exited" { state += " (" + strconv.Itoa(c.Details.State.ExitCode) + ")" } + if c.Container.State == "running" && c.Details.State.Health.Status != "" { + state += " (" + c.Details.State.Health.Status + ")"; + } + if c.Container.State == "running" && c.Details.State.Health.Status == "unhealthy" { + return utils.MultiColoredString(state, c.GetColor(), color.BgRed) + } return utils.ColoredString(state, c.GetColor()) } @@ -305,6 +312,12 @@ func (c *Container) GetColor() color.Attribute { case "created": return color.FgCyan case "running": + if c.Details.State.Health.Status == "starting" { + return color.FgYellow + } + if c.Details.State.Health.Status == "unhealthy" { + return color.FgBlack + } return color.FgGreen case "paused": return color.FgYellow diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go index 9521e57f..5a68b1f0 100644 --- a/pkg/utils/utils.go +++ b/pkg/utils/utils.go @@ -52,6 +52,13 @@ func ColoredString(str string, colorAttribute color.Attribute) string { return ColoredStringDirect(str, colour) } +// MultiColoredString takes a string and an array of colour attributes and returns a colored +// string with those attributes +func MultiColoredString(str string, colorAttribute ...color.Attribute) string { + colour := color.New(colorAttribute...) + return ColoredStringDirect(str, colour) +} + // ColoredStringDirect used for aggregating a few color attributes rather than // just sending a single one func ColoredStringDirect(str string, colour *color.Color) string { From 0c2edc7c22205b76230be0bebe3e7b4ced6cfc41 Mon Sep 17 00:00:00 2001 From: stirante Date: Mon, 27 Jan 2020 12:44:32 +0100 Subject: [PATCH 2/3] Run gofmt on container.go --- pkg/commands/container.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/commands/container.go b/pkg/commands/container.go index 6d5dc93e..c126ed25 100644 --- a/pkg/commands/container.go +++ b/pkg/commands/container.go @@ -261,7 +261,7 @@ func (c *Container) GetDisplayStatus() string { state += " (" + strconv.Itoa(c.Details.State.ExitCode) + ")" } if c.Container.State == "running" && c.Details.State.Health.Status != "" { - state += " (" + c.Details.State.Health.Status + ")"; + state += " (" + c.Details.State.Health.Status + ")" } if c.Container.State == "running" && c.Details.State.Health.Status == "unhealthy" { return utils.MultiColoredString(state, c.GetColor(), color.BgRed) From 6adb04a364fff73e75fd6edbfffb9ad29480150c Mon Sep 17 00:00:00 2001 From: Piotr Brzozowski Date: Thu, 30 Jan 2020 18:48:38 +0100 Subject: [PATCH 3/3] Add changes from suggestions --- pkg/commands/container.go | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/pkg/commands/container.go b/pkg/commands/container.go index c126ed25..cc896ae5 100644 --- a/pkg/commands/container.go +++ b/pkg/commands/container.go @@ -258,16 +258,26 @@ func (c *Container) GetDisplayStrings(isFocused bool) []string { func (c *Container) GetDisplayStatus() string { state := c.Container.State if c.Container.State == "exited" { - state += " (" + strconv.Itoa(c.Details.State.ExitCode) + ")" - } - if c.Container.State == "running" && c.Details.State.Health.Status != "" { - state += " (" + c.Details.State.Health.Status + ")" - } - if c.Container.State == "running" && c.Details.State.Health.Status == "unhealthy" { - return utils.MultiColoredString(state, c.GetColor(), color.BgRed) + return utils.ColoredString(state+" ("+strconv.Itoa(c.Details.State.ExitCode)+")", c.GetColor()) } - return utils.ColoredString(state, c.GetColor()) + return utils.ColoredString(state, c.GetColor()) + c.healthStatusString() +} + +func (c *Container) healthStatusString() string { + healthStatusColorMap := map[string]color.Attribute{ + "healthy": color.FgGreen, + "unhealthy": color.FgRed, + "starting": color.FgYellow, + } + if c.Container.State != "running" { + return "" + } + healthStatus := c.Details.State.Health.Status + if healthStatusColor, ok := healthStatusColorMap[healthStatus]; ok { + return utils.ColoredString(" ("+healthStatus+")", healthStatusColor) + } + return "" } // GetDisplayCPUPerc colors the cpu percentage based on how extreme it is @@ -312,12 +322,6 @@ func (c *Container) GetColor() color.Attribute { case "created": return color.FgCyan case "running": - if c.Details.State.Health.Status == "starting" { - return color.FgYellow - } - if c.Details.State.Health.Status == "unhealthy" { - return color.FgBlack - } return color.FgGreen case "paused": return color.FgYellow