From aaadc511d86a0eb8b9441d5fd82fc503ff1d7304 Mon Sep 17 00:00:00 2001
From: Dave Tucker
Date: Fri, 5 Aug 2016 22:22:05 +0100
Subject: [PATCH] cli: service inspect - Null check for UpdateConfig
Fixes #25453
Signed-off-by: Dave Tucker
(cherry picked from commit 0e1fe4516fc7af03259753f6d264e91d11fe4d1a)
Signed-off-by: Tibor Vass
---
api/client/service/inspect.go | 13 +++--
api/client/service/inspect_test.go | 84 ++++++++++++++++++++++++++++++
2 files changed, 92 insertions(+), 5 deletions(-)
create mode 100644 api/client/service/inspect_test.go
diff --git a/api/client/service/inspect.go b/api/client/service/inspect.go
index 0893c5f457..0abdf5adb3 100644
--- a/api/client/service/inspect.go
+++ b/api/client/service/inspect.go
@@ -117,12 +117,15 @@ func printService(out io.Writer, service swarm.Service) {
if service.Spec.TaskTemplate.Placement != nil && len(service.Spec.TaskTemplate.Placement.Constraints) > 0 {
ioutils.FprintfIfNotEmpty(out, " Constraints\t: %s\n", strings.Join(service.Spec.TaskTemplate.Placement.Constraints, ", "))
}
- fmt.Fprintf(out, "UpdateConfig:\n")
- fmt.Fprintf(out, " Parallelism:\t%d\n", service.Spec.UpdateConfig.Parallelism)
- if service.Spec.UpdateConfig.Delay.Nanoseconds() > 0 {
- fmt.Fprintf(out, " Delay:\t\t%s\n", service.Spec.UpdateConfig.Delay)
+ if service.Spec.UpdateConfig != nil {
+ fmt.Fprintf(out, "UpdateConfig:\n")
+ fmt.Fprintf(out, " Parallelism:\t%d\n", service.Spec.UpdateConfig.Parallelism)
+ if service.Spec.UpdateConfig.Delay.Nanoseconds() > 0 {
+ fmt.Fprintf(out, " Delay:\t\t%s\n", service.Spec.UpdateConfig.Delay)
+ }
+ fmt.Fprintf(out, " On failure:\t%s\n", service.Spec.UpdateConfig.FailureAction)
}
- fmt.Fprintf(out, " On failure:\t%s\n", service.Spec.UpdateConfig.FailureAction)
+
fmt.Fprintf(out, "ContainerSpec:\n")
printContainerSpec(out, service.Spec.TaskTemplate.ContainerSpec)
diff --git a/api/client/service/inspect_test.go b/api/client/service/inspect_test.go
new file mode 100644
index 0000000000..7d7f03ffc9
--- /dev/null
+++ b/api/client/service/inspect_test.go
@@ -0,0 +1,84 @@
+package service
+
+import (
+ "bytes"
+ "strings"
+ "testing"
+ "time"
+
+ "github.com/docker/engine-api/types/swarm"
+)
+
+func TestPrettyPrintWithNoUpdateConfig(t *testing.T) {
+ b := new(bytes.Buffer)
+
+ endpointSpec := &swarm.EndpointSpec{
+ Mode: "vip",
+ Ports: []swarm.PortConfig{
+ {
+ Protocol: swarm.PortConfigProtocolTCP,
+ TargetPort: 5000,
+ },
+ },
+ }
+
+ two := uint64(2)
+
+ s := swarm.Service{
+ ID: "de179gar9d0o7ltdybungplod",
+ Meta: swarm.Meta{
+ Version: swarm.Version{Index: 315},
+ CreatedAt: time.Now(),
+ UpdatedAt: time.Now(),
+ },
+ Spec: swarm.ServiceSpec{
+ Annotations: swarm.Annotations{
+ Name: "my_service",
+ Labels: map[string]string{"com.label": "foo"},
+ },
+ TaskTemplate: swarm.TaskSpec{
+ ContainerSpec: swarm.ContainerSpec{
+ Image: "foo/bar@sha256:this_is_a_test",
+ },
+ },
+ Mode: swarm.ServiceMode{
+ Replicated: &swarm.ReplicatedService{
+ Replicas: &two,
+ },
+ },
+ UpdateConfig: nil,
+ Networks: []swarm.NetworkAttachmentConfig{
+ {
+ Target: "5vpyomhb6ievnk0i0o60gcnei",
+ Aliases: []string{"web"},
+ },
+ },
+ EndpointSpec: endpointSpec,
+ },
+ Endpoint: swarm.Endpoint{
+ Spec: *endpointSpec,
+ Ports: []swarm.PortConfig{
+ {
+ Protocol: swarm.PortConfigProtocolTCP,
+ TargetPort: 5000,
+ PublishedPort: 30000,
+ },
+ },
+ VirtualIPs: []swarm.EndpointVirtualIP{
+ {
+ NetworkID: "6o4107cj2jx9tihgb0jyts6pj",
+ Addr: "10.255.0.4/16",
+ },
+ },
+ },
+ UpdateStatus: swarm.UpdateStatus{
+ StartedAt: time.Now(),
+ CompletedAt: time.Now(),
+ },
+ }
+
+ printService(b, s)
+ if strings.Contains(b.String(), "UpdateStatus") {
+ t.Fatal("Pretty print failed before parsing UpdateStatus")
+ }
+}