2016-09-08 13:11:39 -04:00
|
|
|
package service
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
2016-09-13 03:01:31 -04:00
|
|
|
"encoding/json"
|
2016-09-08 13:11:39 -04:00
|
|
|
"strings"
|
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
2017-04-17 18:07:56 -04:00
|
|
|
"github.com/docker/cli/cli/command/formatter"
|
2017-04-07 19:37:03 -04:00
|
|
|
"github.com/docker/docker/api/types"
|
2019-03-18 21:37:22 -04:00
|
|
|
"github.com/docker/docker/api/types/container"
|
2016-09-08 13:11:39 -04:00
|
|
|
"github.com/docker/docker/api/types/swarm"
|
2020-02-22 12:12:14 -05:00
|
|
|
"gotest.tools/v3/assert"
|
|
|
|
is "gotest.tools/v3/assert/cmp"
|
2020-04-29 11:11:48 -04:00
|
|
|
"gotest.tools/v3/golden"
|
2016-09-08 13:11:39 -04:00
|
|
|
)
|
|
|
|
|
2016-09-13 03:01:31 -04:00
|
|
|
func formatServiceInspect(t *testing.T, format formatter.Format, now time.Time) string {
|
2023-11-20 05:10:29 -05:00
|
|
|
t.Helper()
|
2016-09-08 13:11:39 -04:00
|
|
|
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},
|
2016-09-13 03:01:31 -04:00
|
|
|
CreatedAt: now,
|
|
|
|
UpdatedAt: now,
|
2016-09-08 13:11:39 -04:00
|
|
|
},
|
|
|
|
Spec: swarm.ServiceSpec{
|
|
|
|
Annotations: swarm.Annotations{
|
|
|
|
Name: "my_service",
|
|
|
|
Labels: map[string]string{"com.label": "foo"},
|
|
|
|
},
|
|
|
|
TaskTemplate: swarm.TaskSpec{
|
2019-06-16 03:27:27 -04:00
|
|
|
LogDriver: &swarm.Driver{
|
|
|
|
Name: "driver",
|
|
|
|
Options: map[string]string{
|
|
|
|
"max-file": "5",
|
|
|
|
},
|
|
|
|
},
|
2017-08-07 05:52:40 -04:00
|
|
|
ContainerSpec: &swarm.ContainerSpec{
|
2016-09-08 13:11:39 -04:00
|
|
|
Image: "foo/bar@sha256:this_is_a_test",
|
2018-04-15 19:39:01 -04:00
|
|
|
Configs: []*swarm.ConfigReference{
|
|
|
|
{
|
|
|
|
ConfigID: "mtc3i44r1awdoziy2iceg73z8",
|
|
|
|
ConfigName: "configtest.conf",
|
2018-04-15 19:39:41 -04:00
|
|
|
File: &swarm.ConfigReferenceFileTarget{
|
|
|
|
Name: "/configtest.conf",
|
|
|
|
},
|
2018-04-15 19:39:01 -04:00
|
|
|
},
|
|
|
|
},
|
|
|
|
Secrets: []*swarm.SecretReference{
|
|
|
|
{
|
|
|
|
SecretID: "3hv39ehbbb4hdozo7spod9ftn",
|
|
|
|
SecretName: "secrettest.conf",
|
2018-04-15 19:39:41 -04:00
|
|
|
File: &swarm.SecretReferenceFileTarget{
|
|
|
|
Name: "/secrettest.conf",
|
|
|
|
},
|
2018-04-15 19:39:01 -04:00
|
|
|
},
|
|
|
|
},
|
2019-03-12 21:40:05 -04:00
|
|
|
|
|
|
|
Healthcheck: &container.HealthConfig{
|
|
|
|
Test: []string{"CMD-SHELL", "curl"},
|
|
|
|
Interval: 4,
|
|
|
|
Retries: 3,
|
|
|
|
StartPeriod: 2,
|
|
|
|
Timeout: 1,
|
|
|
|
},
|
2016-09-08 13:11:39 -04:00
|
|
|
},
|
2020-04-29 11:11:48 -04:00
|
|
|
Resources: &swarm.ResourceRequirements{
|
|
|
|
Limits: &swarm.Limit{
|
|
|
|
NanoCPUs: 100000000000,
|
|
|
|
MemoryBytes: 10490000,
|
|
|
|
Pids: 20,
|
|
|
|
},
|
|
|
|
},
|
2017-04-07 19:37:03 -04:00
|
|
|
Networks: []swarm.NetworkAttachmentConfig{
|
|
|
|
{
|
|
|
|
Target: "5vpyomhb6ievnk0i0o60gcnei",
|
|
|
|
Aliases: []string{"web"},
|
|
|
|
},
|
|
|
|
},
|
2016-09-08 13:11:39 -04:00
|
|
|
},
|
|
|
|
Mode: swarm.ServiceMode{
|
|
|
|
Replicated: &swarm.ReplicatedService{
|
|
|
|
Replicas: &two,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
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",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2016-12-01 17:08:06 -05:00
|
|
|
UpdateStatus: &swarm.UpdateStatus{
|
|
|
|
StartedAt: &now,
|
|
|
|
CompletedAt: &now,
|
2016-09-08 13:11:39 -04:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
2016-07-25 15:24:34 -04:00
|
|
|
ctx := formatter.Context{
|
|
|
|
Output: b,
|
2016-09-13 03:01:31 -04:00
|
|
|
Format: format,
|
2016-07-25 15:24:34 -04:00
|
|
|
}
|
|
|
|
|
2018-10-23 11:05:44 -04:00
|
|
|
err := InspectFormatWrite(ctx, []string{"de179gar9d0o7ltdybungplod"},
|
2023-11-20 12:04:36 -05:00
|
|
|
func(ref string) (any, []byte, error) {
|
2017-04-07 19:37:03 -04:00
|
|
|
return s, nil, nil
|
|
|
|
},
|
2023-11-20 12:04:36 -05:00
|
|
|
func(ref string) (any, []byte, error) {
|
2017-04-07 19:37:03 -04:00
|
|
|
return types.NetworkResource{
|
|
|
|
ID: "5vpyomhb6ievnk0i0o60gcnei",
|
|
|
|
Name: "mynetwork",
|
|
|
|
}, nil, nil
|
|
|
|
},
|
|
|
|
)
|
2016-07-25 15:24:34 -04:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
2016-09-13 03:01:31 -04:00
|
|
|
return b.String()
|
|
|
|
}
|
2016-07-25 15:24:34 -04:00
|
|
|
|
2020-04-29 11:11:48 -04:00
|
|
|
func TestPrettyPrint(t *testing.T) {
|
|
|
|
s := formatServiceInspect(t, NewFormat("pretty"), time.Now())
|
|
|
|
golden.Assert(t, s, "service-inspect-pretty.golden")
|
|
|
|
}
|
|
|
|
|
2016-09-13 03:01:31 -04:00
|
|
|
func TestPrettyPrintWithNoUpdateConfig(t *testing.T) {
|
2018-10-23 11:05:44 -04:00
|
|
|
s := formatServiceInspect(t, NewFormat("pretty"), time.Now())
|
2016-09-13 03:01:31 -04:00
|
|
|
if strings.Contains(s, "UpdateStatus") {
|
2016-09-08 13:11:39 -04:00
|
|
|
t.Fatal("Pretty print failed before parsing UpdateStatus")
|
|
|
|
}
|
2017-04-07 19:37:03 -04:00
|
|
|
if !strings.Contains(s, "mynetwork") {
|
|
|
|
t.Fatal("network name not found in inspect output")
|
|
|
|
}
|
2016-09-08 13:11:39 -04:00
|
|
|
}
|
2016-09-13 03:01:31 -04:00
|
|
|
|
|
|
|
func TestJSONFormatWithNoUpdateConfig(t *testing.T) {
|
|
|
|
now := time.Now()
|
|
|
|
// s1: [{"ID":..}]
|
|
|
|
// s2: {"ID":..}
|
2018-10-23 11:05:44 -04:00
|
|
|
s1 := formatServiceInspect(t, NewFormat(""), now)
|
|
|
|
s2 := formatServiceInspect(t, NewFormat("{{json .}}"), now)
|
2023-11-20 12:04:36 -05:00
|
|
|
var m1Wrap []map[string]any
|
2016-09-13 03:01:31 -04:00
|
|
|
if err := json.Unmarshal([]byte(s1), &m1Wrap); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
if len(m1Wrap) != 1 {
|
|
|
|
t.Fatalf("strange s1=%s", s1)
|
|
|
|
}
|
|
|
|
m1 := m1Wrap[0]
|
2023-11-20 12:04:36 -05:00
|
|
|
var m2 map[string]any
|
2016-09-13 03:01:31 -04:00
|
|
|
if err := json.Unmarshal([]byte(s2), &m2); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
2018-03-05 18:53:52 -05:00
|
|
|
assert.Check(t, is.DeepEqual(m1, m2))
|
2016-09-13 03:01:31 -04:00
|
|
|
}
|
2018-04-15 19:39:41 -04:00
|
|
|
|
|
|
|
func TestPrettyPrintWithConfigsAndSecrets(t *testing.T) {
|
2018-10-23 11:05:44 -04:00
|
|
|
s := formatServiceInspect(t, NewFormat("pretty"), time.Now())
|
2019-06-16 03:27:27 -04:00
|
|
|
assert.Check(t, is.Contains(s, "Log Driver:"), "Pretty print missing Log Driver")
|
2018-04-15 19:39:41 -04:00
|
|
|
assert.Check(t, is.Contains(s, "Configs:"), "Pretty print missing configs")
|
|
|
|
assert.Check(t, is.Contains(s, "Secrets:"), "Pretty print missing secrets")
|
2019-03-12 21:40:05 -04:00
|
|
|
assert.Check(t, is.Contains(s, "Healthcheck:"), "Pretty print missing healthcheck")
|
2018-04-15 19:39:41 -04:00
|
|
|
}
|