Skip to content
This repository was archived by the owner on Jul 18, 2025. It is now read-only.

Commit e255854

Browse files
Merge pull request #527 from ijc/sort-docker-app-inspect-output
inspect: sort services, networks, volumes and secrets by name
2 parents 74197d3 + 5a56710 commit e255854

File tree

3 files changed

+59
-21
lines changed

3 files changed

+59
-21
lines changed

internal/inspect/inspect.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,28 +34,46 @@ func Inspect(out io.Writer, app *types.App, argParameters map[string]string, ima
3434

3535
// Add Service section
3636
printSection(out, len(config.Services), func(w io.Writer) {
37+
sort.Slice(config.Services, func(i, j int) bool {
38+
return config.Services[i].Name < config.Services[j].Name
39+
})
3740
for _, service := range config.Services {
3841
fmt.Fprintf(w, "%s\t%d\t%s\t%s\n", service.Name, getReplicas(service), getPorts(service.Ports), service.Image)
3942
}
4043
}, "Service", "Replicas", "Ports", "Image")
4144

4245
// Add Network section
4346
printSection(out, len(config.Networks), func(w io.Writer) {
47+
names := make([]string, 0, len(config.Networks))
4448
for name := range config.Networks {
49+
names = append(names, name)
50+
}
51+
sort.Strings(names)
52+
for _, name := range names {
4553
fmt.Fprintln(w, name)
4654
}
4755
}, "Network")
4856

4957
// Add Volume section
5058
printSection(out, len(config.Volumes), func(w io.Writer) {
59+
names := make([]string, 0, len(config.Volumes))
5160
for name := range config.Volumes {
61+
names = append(names, name)
62+
}
63+
sort.Strings(names)
64+
for _, name := range names {
5265
fmt.Fprintln(w, name)
5366
}
5467
}, "Volume")
5568

5669
// Add Secret section
5770
printSection(out, len(config.Secrets), func(w io.Writer) {
71+
names := make([]string, 0, len(config.Secrets))
5872
for name := range config.Secrets {
73+
names = append(names, name)
74+
}
75+
sort.Strings(names)
76+
for _, name := range names {
5977
fmt.Fprintln(w, name)
6078
}
6179
}, "Secret")

internal/inspect/inspect_test.go

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -67,19 +67,29 @@ name: myapp
6767
version: "3.1"
6868
6969
services:
70-
web:
70+
web1:
7171
image: nginx:latest
7272
ports:
7373
- 8080-8100:12300-12320
7474
deploy:
7575
replicas: 2
76+
web2:
77+
image: nginx:latest
78+
ports:
79+
- 9080-9100:22300-22320
80+
deploy:
81+
replicas: 2
7682
networks:
77-
my-network:
83+
my-network1:
84+
my-network2:
7885
volumes:
79-
my-volume:
86+
my-volume1:
87+
my-volume2:
8088
secrets:
81-
my-secret:
82-
file: ./my_secret.txt
89+
my-secret1:
90+
file: ./my_secret1.txt
91+
my-secret2:
92+
file: ./my_secret2.txt
8393
`),
8494
fs.WithFile(internal.MetadataFileName, `
8595
version: 0.1.0
@@ -107,12 +117,18 @@ text: hello`),
107117
{name: "full"},
108118
} {
109119
t.Run(testcase.name, func(t *testing.T) {
110-
outBuffer := new(bytes.Buffer)
111120
app, err := types.NewAppFromDefaultFiles(dir.Join(testcase.name))
112121
assert.NilError(t, err)
113-
err = Inspect(outBuffer, app, testcase.args, nil)
114-
assert.NilError(t, err)
115-
golden.Assert(t, outBuffer.String(), fmt.Sprintf("inspect-%s.golden", testcase.name))
122+
// Inspect twice to ensure output is stable (e.g. sorting of maps)
123+
for i := 0; i < 2; i++ {
124+
t.Run(fmt.Sprintf("%d", i), func(t *testing.T) {
125+
outBuffer := new(bytes.Buffer)
126+
err = Inspect(outBuffer, app, testcase.args, nil)
127+
assert.NilError(t, err)
128+
golden.Assert(t, outBuffer.String(), fmt.Sprintf("inspect-%s.golden", testcase.name))
129+
})
130+
}
131+
116132
})
117133
}
118134
}

internal/inspect/testdata/inspect-full.golden

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,25 @@ Maintained by: dev <[email protected]>
44

55
some description
66

7-
Service (1) Replicas Ports Image
8-
----------- -------- ----- -----
9-
web 2 8080-8100 nginx:latest
7+
Services (2) Replicas Ports Image
8+
------------ -------- ----- -----
9+
web1 2 8080-8100 nginx:latest
10+
web2 2 9080-9100 nginx:latest
1011

11-
Network (1)
12-
-----------
13-
my-network
12+
Networks (2)
13+
------------
14+
my-network1
15+
my-network2
1416

15-
Volume (1)
16-
----------
17-
my-volume
17+
Volumes (2)
18+
-----------
19+
my-volume1
20+
my-volume2
1821

19-
Secret (1)
20-
----------
21-
my-secret
22+
Secrets (2)
23+
-----------
24+
my-secret1
25+
my-secret2
2226

2327
Parameters (2) Value
2428
-------------- -----

0 commit comments

Comments
 (0)