Browse Source

Merge pull request #35940 from yongtang/35920-filter-health-starting

Fix issue of filter in `docker ps` where `health=starting` returns nothing
Vincent Demeester 7 years ago
parent
commit
7c7a7c7944
3 changed files with 29 additions and 10 deletions
  1. 0 9
      container/state.go
  2. 5 1
      container/view.go
  3. 24 0
      container/view_test.go

+ 0 - 9
container/state.go

@@ -102,15 +102,6 @@ func (s *State) String() string {
 	return fmt.Sprintf("Exited (%d) %s ago", s.ExitCodeValue, units.HumanDuration(time.Now().UTC().Sub(s.FinishedAt)))
 	return fmt.Sprintf("Exited (%d) %s ago", s.ExitCodeValue, units.HumanDuration(time.Now().UTC().Sub(s.FinishedAt)))
 }
 }
 
 
-// HealthString returns a single string to describe health status.
-func (s *State) HealthString() string {
-	if s.Health == nil {
-		return types.NoHealthcheck
-	}
-
-	return s.Health.String()
-}
-
 // IsValidHealthString checks if the provided string is a valid container health status or not.
 // IsValidHealthString checks if the provided string is a valid container health status or not.
 func IsValidHealthString(s string) bool {
 func IsValidHealthString(s string) bool {
 	return s == types.Starting ||
 	return s == types.Starting ||

+ 5 - 1
container/view.go

@@ -295,6 +295,10 @@ func (v *memdbView) GetAllNames() map[string][]string {
 // transform maps a (deep) copied Container object to what queries need.
 // transform maps a (deep) copied Container object to what queries need.
 // A lock on the Container is not held because these are immutable deep copies.
 // A lock on the Container is not held because these are immutable deep copies.
 func (v *memdbView) transform(container *Container) *Snapshot {
 func (v *memdbView) transform(container *Container) *Snapshot {
+	health := types.NoHealthcheck
+	if container.Health != nil {
+		health = container.Health.Status()
+	}
 	snapshot := &Snapshot{
 	snapshot := &Snapshot{
 		Container: types.Container{
 		Container: types.Container{
 			ID:      container.ID,
 			ID:      container.ID,
@@ -313,7 +317,7 @@ func (v *memdbView) transform(container *Container) *Snapshot {
 		Managed:      container.Managed,
 		Managed:      container.Managed,
 		ExposedPorts: make(nat.PortSet),
 		ExposedPorts: make(nat.PortSet),
 		PortBindings: make(nat.PortSet),
 		PortBindings: make(nat.PortSet),
-		Health:       container.HealthString(),
+		Health:       health,
 		Running:      container.Running,
 		Running:      container.Running,
 		Paused:       container.Paused,
 		Paused:       container.Paused,
 		ExitCode:     container.ExitCode(),
 		ExitCode:     container.ExitCode(),

+ 24 - 0
container/view_test.go

@@ -6,6 +6,7 @@ import (
 	"path/filepath"
 	"path/filepath"
 	"testing"
 	"testing"
 
 
+	"github.com/docker/docker/api/types"
 	containertypes "github.com/docker/docker/api/types/container"
 	containertypes "github.com/docker/docker/api/types/container"
 	"github.com/pborman/uuid"
 	"github.com/pborman/uuid"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/assert"
@@ -159,3 +160,26 @@ func TestNames(t *testing.T) {
 	view = db.Snapshot()
 	view = db.Snapshot()
 	assert.Equal(t, map[string][]string{"containerid4": {"name1", "name2"}}, view.GetAllNames())
 	assert.Equal(t, map[string][]string{"containerid4": {"name1", "name2"}}, view.GetAllNames())
 }
 }
+
+// Test case for GitHub issue 35920
+func TestViewWithHealthCheck(t *testing.T) {
+	var (
+		db, _ = NewViewDB()
+		one   = newContainer(t)
+	)
+	one.Health = &Health{
+		Health: types.Health{
+			Status: "starting",
+		},
+	}
+	if err := one.CheckpointTo(db); err != nil {
+		t.Fatal(err)
+	}
+	s, err := db.Snapshot().Get(one.ID)
+	if err != nil {
+		t.Fatal(err)
+	}
+	if s == nil || s.Health != "starting" {
+		t.Fatalf("expected Health=starting. Got: %+v", s)
+	}
+}