mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
000f0403d9
This fix tries to improve the display of `docker service ls` and adds `--format` flag to `docker service ls`. In addition to `--format` flag, several other improvement: 1. Updates `docker stacks service`. 2. Adds `servicesFormat` to config file. Related docs has been updated. Signed-off-by: Yong Tang <yong.tang.github@outlook.com>
177 lines
4.1 KiB
Go
177 lines
4.1 KiB
Go
package formatter
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/docker/docker/api/types/swarm"
|
|
"github.com/docker/docker/pkg/testutil/assert"
|
|
)
|
|
|
|
func TestServiceContextWrite(t *testing.T) {
|
|
cases := []struct {
|
|
context Context
|
|
expected string
|
|
}{
|
|
// Errors
|
|
{
|
|
Context{Format: "{{InvalidFunction}}"},
|
|
`Template parsing error: template: :1: function "InvalidFunction" not defined
|
|
`,
|
|
},
|
|
{
|
|
Context{Format: "{{nil}}"},
|
|
`Template parsing error: template: :1:2: executing "" at <nil>: nil is not a command
|
|
`,
|
|
},
|
|
// Table format
|
|
{
|
|
Context{Format: NewServiceListFormat("table", false)},
|
|
`ID NAME MODE REPLICAS IMAGE
|
|
id_baz baz global 2/4
|
|
id_bar bar replicated 2/4
|
|
`,
|
|
},
|
|
{
|
|
Context{Format: NewServiceListFormat("table", true)},
|
|
`id_baz
|
|
id_bar
|
|
`,
|
|
},
|
|
{
|
|
Context{Format: NewServiceListFormat("table {{.Name}}", false)},
|
|
`NAME
|
|
baz
|
|
bar
|
|
`,
|
|
},
|
|
{
|
|
Context{Format: NewServiceListFormat("table {{.Name}}", true)},
|
|
`NAME
|
|
baz
|
|
bar
|
|
`,
|
|
},
|
|
// Raw Format
|
|
{
|
|
Context{Format: NewServiceListFormat("raw", false)},
|
|
`id: id_baz
|
|
name: baz
|
|
mode: global
|
|
replicas: 2/4
|
|
image:
|
|
|
|
id: id_bar
|
|
name: bar
|
|
mode: replicated
|
|
replicas: 2/4
|
|
image:
|
|
|
|
`,
|
|
},
|
|
{
|
|
Context{Format: NewServiceListFormat("raw", true)},
|
|
`id: id_baz
|
|
id: id_bar
|
|
`,
|
|
},
|
|
// Custom Format
|
|
{
|
|
Context{Format: NewServiceListFormat("{{.Name}}", false)},
|
|
`baz
|
|
bar
|
|
`,
|
|
},
|
|
}
|
|
|
|
for _, testcase := range cases {
|
|
services := []swarm.Service{
|
|
{ID: "id_baz", Spec: swarm.ServiceSpec{Annotations: swarm.Annotations{Name: "baz"}}},
|
|
{ID: "id_bar", Spec: swarm.ServiceSpec{Annotations: swarm.Annotations{Name: "bar"}}},
|
|
}
|
|
info := map[string]ServiceListInfo{
|
|
"id_baz": {
|
|
Mode: "global",
|
|
Replicas: "2/4",
|
|
},
|
|
"id_bar": {
|
|
Mode: "replicated",
|
|
Replicas: "2/4",
|
|
},
|
|
}
|
|
out := bytes.NewBufferString("")
|
|
testcase.context.Output = out
|
|
err := ServiceListWrite(testcase.context, services, info)
|
|
if err != nil {
|
|
assert.Error(t, err, testcase.expected)
|
|
} else {
|
|
assert.Equal(t, out.String(), testcase.expected)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestServiceContextWriteJSON(t *testing.T) {
|
|
services := []swarm.Service{
|
|
{ID: "id_baz", Spec: swarm.ServiceSpec{Annotations: swarm.Annotations{Name: "baz"}}},
|
|
{ID: "id_bar", Spec: swarm.ServiceSpec{Annotations: swarm.Annotations{Name: "bar"}}},
|
|
}
|
|
info := map[string]ServiceListInfo{
|
|
"id_baz": {
|
|
Mode: "global",
|
|
Replicas: "2/4",
|
|
},
|
|
"id_bar": {
|
|
Mode: "replicated",
|
|
Replicas: "2/4",
|
|
},
|
|
}
|
|
expectedJSONs := []map[string]interface{}{
|
|
{"ID": "id_baz", "Name": "baz", "Mode": "global", "Replicas": "2/4", "Image": ""},
|
|
{"ID": "id_bar", "Name": "bar", "Mode": "replicated", "Replicas": "2/4", "Image": ""},
|
|
}
|
|
|
|
out := bytes.NewBufferString("")
|
|
err := ServiceListWrite(Context{Format: "{{json .}}", Output: out}, services, info)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
for i, line := range strings.Split(strings.TrimSpace(out.String()), "\n") {
|
|
t.Logf("Output: line %d: %s", i, line)
|
|
var m map[string]interface{}
|
|
if err := json.Unmarshal([]byte(line), &m); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
assert.DeepEqual(t, m, expectedJSONs[i])
|
|
}
|
|
}
|
|
func TestServiceContextWriteJSONField(t *testing.T) {
|
|
services := []swarm.Service{
|
|
{ID: "id_baz", Spec: swarm.ServiceSpec{Annotations: swarm.Annotations{Name: "baz"}}},
|
|
{ID: "id_bar", Spec: swarm.ServiceSpec{Annotations: swarm.Annotations{Name: "bar"}}},
|
|
}
|
|
info := map[string]ServiceListInfo{
|
|
"id_baz": {
|
|
Mode: "global",
|
|
Replicas: "2/4",
|
|
},
|
|
"id_bar": {
|
|
Mode: "replicated",
|
|
Replicas: "2/4",
|
|
},
|
|
}
|
|
out := bytes.NewBufferString("")
|
|
err := ServiceListWrite(Context{Format: "{{json .Name}}", Output: out}, services, info)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
for i, line := range strings.Split(strings.TrimSpace(out.String()), "\n") {
|
|
t.Logf("Output: line %d: %s", i, line)
|
|
var s string
|
|
if err := json.Unmarshal([]byte(line), &s); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
assert.Equal(t, s, services[i].Spec.Name)
|
|
}
|
|
}
|