From 9247e09944a4c7f3c2f3f20f180c047a19fb6bae Mon Sep 17 00:00:00 2001 From: Yong Tang Date: Tue, 30 Jan 2018 17:26:56 +0000 Subject: [PATCH] Fix issue of ExitCode and PID not show up in Task.Status.ContainerStatus This fix tries to address the issue raised in 36139 where ExitCode and PID does not show up in Task.Status.ContainerStatus The issue was caused by `json:",omitempty"` in PID and ExitCode which interprate 0 as null. This is confusion as ExitCode 0 does have a meaning. This fix removes `json:",omitempty"` in ExitCode and PID, but changes ContainerStatus to pointer so that ContainerStatus does not show up at all if no content. If ContainerStatus does have a content, then ExitCode and PID will show up (even if they are 0). This fix fixes 36139. Signed-off-by: Yong Tang --- api/types/swarm/task.go | 18 ++++++------ daemon/cluster/convert/task.go | 8 ++++-- .../docker_cli_service_create_test.go | 28 +++++++++---------- 3 files changed, 28 insertions(+), 26 deletions(-) diff --git a/api/types/swarm/task.go b/api/types/swarm/task.go index ff11b07e74fb3..079ec3690f01c 100644 --- a/api/types/swarm/task.go +++ b/api/types/swarm/task.go @@ -162,19 +162,19 @@ const ( // TaskStatus represents the status of a task. type TaskStatus struct { - Timestamp time.Time `json:",omitempty"` - State TaskState `json:",omitempty"` - Message string `json:",omitempty"` - Err string `json:",omitempty"` - ContainerStatus ContainerStatus `json:",omitempty"` - PortStatus PortStatus `json:",omitempty"` + Timestamp time.Time `json:",omitempty"` + State TaskState `json:",omitempty"` + Message string `json:",omitempty"` + Err string `json:",omitempty"` + ContainerStatus *ContainerStatus `json:",omitempty"` + PortStatus PortStatus `json:",omitempty"` } // ContainerStatus represents the status of a container. type ContainerStatus struct { - ContainerID string `json:",omitempty"` - PID int `json:",omitempty"` - ExitCode int `json:",omitempty"` + ContainerID string + PID int + ExitCode int } // PortStatus represents the port status of a task's host ports whose diff --git a/daemon/cluster/convert/task.go b/daemon/cluster/convert/task.go index bedf2dba9ecc5..be3bacf11c3de 100644 --- a/daemon/cluster/convert/task.go +++ b/daemon/cluster/convert/task.go @@ -42,9 +42,11 @@ func TaskFromGRPC(t swarmapi.Task) (types.Task, error) { task.Status.Timestamp, _ = gogotypes.TimestampFromProto(t.Status.Timestamp) if containerStatus != nil { - task.Status.ContainerStatus.ContainerID = containerStatus.ContainerID - task.Status.ContainerStatus.PID = int(containerStatus.PID) - task.Status.ContainerStatus.ExitCode = int(containerStatus.ExitCode) + task.Status.ContainerStatus = &types.ContainerStatus{ + ContainerID: containerStatus.ContainerID, + PID: int(containerStatus.PID), + ExitCode: int(containerStatus.ExitCode), + } } // NetworksAttachments diff --git a/integration-cli/docker_cli_service_create_test.go b/integration-cli/docker_cli_service_create_test.go index ac7eff713c341..d690b7e45f8e5 100644 --- a/integration-cli/docker_cli_service_create_test.go +++ b/integration-cli/docker_cli_service_create_test.go @@ -29,10 +29,10 @@ func (s *DockerSwarmSuite) TestServiceCreateMountVolume(c *check.C) { task := tasks[0] waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) { - if task.NodeID == "" || task.Status.ContainerStatus.ContainerID == "" { + if task.NodeID == "" || task.Status.ContainerStatus == nil { task = d.GetTask(c, task.ID) } - return task.NodeID != "" && task.Status.ContainerStatus.ContainerID != "", nil + return task.NodeID != "" && task.Status.ContainerStatus != nil, nil }, checker.Equals, true) // check container mount config @@ -143,10 +143,10 @@ func (s *DockerSwarmSuite) TestServiceCreateWithSecretSourceTargetPaths(c *check task := tasks[0] waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) { - if task.NodeID == "" || task.Status.ContainerStatus.ContainerID == "" { + if task.NodeID == "" || task.Status.ContainerStatus == nil { task = d.GetTask(c, task.ID) } - return task.NodeID != "" && task.Status.ContainerStatus.ContainerID != "", nil + return task.NodeID != "" && task.Status.ContainerStatus != nil, nil }, checker.Equals, true) for testName, testTarget := range testPaths { @@ -193,10 +193,10 @@ func (s *DockerSwarmSuite) TestServiceCreateWithSecretReferencedTwice(c *check.C task := tasks[0] waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) { - if task.NodeID == "" || task.Status.ContainerStatus.ContainerID == "" { + if task.NodeID == "" || task.Status.ContainerStatus == nil { task = d.GetTask(c, task.ID) } - return task.NodeID != "" && task.Status.ContainerStatus.ContainerID != "", nil + return task.NodeID != "" && task.Status.ContainerStatus != nil, nil }, checker.Equals, true) for _, target := range []string{"target1", "target2"} { @@ -290,10 +290,10 @@ func (s *DockerSwarmSuite) TestServiceCreateWithConfigSourceTargetPaths(c *check task := tasks[0] waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) { - if task.NodeID == "" || task.Status.ContainerStatus.ContainerID == "" { + if task.NodeID == "" || task.Status.ContainerStatus == nil { task = d.GetTask(c, task.ID) } - return task.NodeID != "" && task.Status.ContainerStatus.ContainerID != "", nil + return task.NodeID != "" && task.Status.ContainerStatus != nil, nil }, checker.Equals, true) for testName, testTarget := range testPaths { @@ -340,10 +340,10 @@ func (s *DockerSwarmSuite) TestServiceCreateWithConfigReferencedTwice(c *check.C task := tasks[0] waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) { - if task.NodeID == "" || task.Status.ContainerStatus.ContainerID == "" { + if task.NodeID == "" || task.Status.ContainerStatus == nil { task = d.GetTask(c, task.ID) } - return task.NodeID != "" && task.Status.ContainerStatus.ContainerID != "", nil + return task.NodeID != "" && task.Status.ContainerStatus != nil, nil }, checker.Equals, true) for _, target := range []string{"target1", "target2"} { @@ -372,10 +372,10 @@ func (s *DockerSwarmSuite) TestServiceCreateMountTmpfs(c *check.C) { task := tasks[0] waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) { - if task.NodeID == "" || task.Status.ContainerStatus.ContainerID == "" { + if task.NodeID == "" || task.Status.ContainerStatus == nil { task = d.GetTask(c, task.ID) } - return task.NodeID != "" && task.Status.ContainerStatus.ContainerID != "", nil + return task.NodeID != "" && task.Status.ContainerStatus != nil, nil }, checker.Equals, true) // check container mount config @@ -428,10 +428,10 @@ func (s *DockerSwarmSuite) TestServiceCreateWithNetworkAlias(c *check.C) { task := tasks[0] waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) { - if task.NodeID == "" || task.Status.ContainerStatus.ContainerID == "" { + if task.NodeID == "" || task.Status.ContainerStatus == nil { task = d.GetTask(c, task.ID) } - return task.NodeID != "" && task.Status.ContainerStatus.ContainerID != "", nil + return task.NodeID != "" && task.Status.ContainerStatus != nil, nil }, checker.Equals, true) // check container alias config