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

Commit 5a56710

Browse files
author
Ian Campbell
committed
inspect: sort services, networks, volumes and secrets by name
Networks, Volumes and Secrets are maps so iteration is randomized by the runtime. Although Services are an slice here they have, at some point, be laundered through a map and so also need sorting. Test by adding a second instance of each to the "full" test case and by always inspecting twice (in case the first one got lucky). Fixes: #525 Signed-off-by: Ian Campbell <[email protected]>
1 parent 137c8cd commit 5a56710

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)