Skip to content
This repository was archived by the owner on Nov 27, 2023. It is now read-only.

Commit 80da160

Browse files
authored
Merge pull request #1136 from docker/compose_unit_test_networks
Compose unit test networks & volumes
2 parents c1405ae + 8bb4aeb commit 80da160

File tree

11 files changed

+113
-32
lines changed

11 files changed

+113
-32
lines changed

ecs/awsResources.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@ func (b *ecsAPIService) ensureVolumes(r *awsResources, project *types.Project, t
406406
},
407407
{
408408
Key: "Name",
409-
Value: fmt.Sprintf("%s_%s", project.Name, name),
409+
Value: volume.Name,
410410
},
411411
},
412412
KmsKeyId: kmsKeyID,

ecs/testdata/simple/simple-cloudformation-conversion.golden

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ Resources:
3030
- Key: com.docker.compose.project
3131
Value: TestSimpleConvert
3232
- Key: com.docker.compose.network
33-
Value: default
33+
Value: TestSimpleConvert_default
3434
VpcId: vpc-123
3535
Type: AWS::EC2::SecurityGroup
3636
DefaultNetworkIngress:

ecs/volumes.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ func (b *ecsAPIService) createAccessPoints(project *types.Project, r awsResource
7272
},
7373
{
7474
Key: "Name",
75-
Value: fmt.Sprintf("%s_%s", project.Name, name),
75+
Value: volume.Name,
7676
},
7777
},
7878
FileSystemId: r.filesystems[name].ID(),

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ require (
1717
github.com/awslabs/goformation/v4 v4.15.6
1818
github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129
1919
github.com/cnabio/cnab-to-oci v0.3.1-beta1
20-
github.com/compose-spec/compose-go v0.0.0-20210106202047-687be5e0e320
20+
github.com/compose-spec/compose-go v0.0.0-20210113150448-e0b1ffe70cc5
2121
github.com/containerd/console v1.0.1
2222
github.com/containerd/containerd v1.4.3
2323
github.com/containerd/continuity v0.0.0-20200928162600-f2cc35102c2a // indirect

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -271,8 +271,8 @@ github.com/cnabio/cnab-to-oci v0.3.1-beta1/go.mod h1:8BomA5Vye+3V/Kd2NSFblCBmp1r
271271
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
272272
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
273273
github.com/codahale/hdrhistogram v0.0.0-20160425231609-f8ad88b59a58/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
274-
github.com/compose-spec/compose-go v0.0.0-20210106202047-687be5e0e320 h1:PjwzjUYqjto8PLdHLtPX2/JtCbYYsKMs1Zof7/h29YA=
275-
github.com/compose-spec/compose-go v0.0.0-20210106202047-687be5e0e320/go.mod h1:rz7rjxJGA/pWpLdBmDdqymGm2okEDYgBE7yx569xW+I=
274+
github.com/compose-spec/compose-go v0.0.0-20210113150448-e0b1ffe70cc5 h1:YBR7Ds5WrY+FNxN2aRRZyEB1E86PD+g1O5RjK++acx8=
275+
github.com/compose-spec/compose-go v0.0.0-20210113150448-e0b1ffe70cc5/go.mod h1:rz7rjxJGA/pWpLdBmDdqymGm2okEDYgBE7yx569xW+I=
276276
github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko=
277277
github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM=
278278
github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340 h1:9atoWyI9RtXFwf7UDbme/6M8Ud0rFrx+Q3ZWgSnsxtw=

local/compose/build.go

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,30 +36,22 @@ func (s *composeService) Build(ctx context.Context, project *types.Project) erro
3636
opts := map[string]build.Options{}
3737
for _, service := range project.Services {
3838
if service.Build != nil {
39-
imageName := getImageName(service, project)
39+
imageName := getImageName(service, project.Name)
4040
opts[imageName] = s.toBuildOptions(service, project.WorkingDir, imageName)
4141
}
4242
}
4343

4444
return s.build(ctx, project, opts)
4545
}
4646

47-
func getImageName(service types.ServiceConfig, project *types.Project) string {
48-
imageName := service.Image
49-
if imageName == "" {
50-
imageName = project.Name + "_" + service.Name
51-
}
52-
return imageName
53-
}
54-
5547
func (s *composeService) ensureImagesExists(ctx context.Context, project *types.Project) error {
5648
opts := map[string]build.Options{}
5749
for _, service := range project.Services {
5850
if service.Image == "" && service.Build == nil {
5951
return fmt.Errorf("invalid service %q. Must specify either image or build", service.Name)
6052
}
6153

62-
imageName := getImageName(service, project)
54+
imageName := getImageName(service, project.Name)
6355
localImagePresent, err := s.localImagePresent(ctx, imageName)
6456
if err != nil {
6557
return err

local/compose/create.go

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@ func (s *composeService) Create(ctx context.Context, project *types.Project, opt
4848
return err
4949
}
5050

51-
if err := s.ensureProjectNetworks(ctx, project); err != nil {
51+
prepareNetworks(project)
52+
53+
if err := s.ensureNetworks(ctx, project.Networks); err != nil {
5254
return err
5355
}
5456

@@ -89,15 +91,17 @@ func (s *composeService) Create(ctx context.Context, project *types.Project, opt
8991
})
9092
}
9193

92-
func (s *composeService) ensureProjectNetworks(ctx context.Context, project *types.Project) error {
94+
func prepareNetworks(project *types.Project) {
9395
for k, network := range project.Networks {
94-
if !network.External.External && network.Name != "" {
95-
network.Name = fmt.Sprintf("%s_%s", project.Name, k)
96-
project.Networks[k] = network
97-
}
9896
network.Labels = network.Labels.Add(networkLabel, k)
9997
network.Labels = network.Labels.Add(projectLabel, project.Name)
10098
network.Labels = network.Labels.Add(versionLabel, ComposeVersion)
99+
project.Networks[k] = network
100+
}
101+
}
102+
103+
func (s *composeService) ensureNetworks(ctx context.Context, networks types.Networks) error {
104+
for _, network := range networks {
101105
err := s.ensureNetwork(ctx, network)
102106
if err != nil {
103107
return err
@@ -108,10 +112,6 @@ func (s *composeService) ensureProjectNetworks(ctx context.Context, project *typ
108112

109113
func (s *composeService) ensureProjectVolumes(ctx context.Context, project *types.Project) error {
110114
for k, volume := range project.Volumes {
111-
if !volume.External.External && volume.Name != "" {
112-
volume.Name = fmt.Sprintf("%s_%s", project.Name, k)
113-
project.Volumes[k] = volume
114-
}
115115
volume.Labels = volume.Labels.Add(volumeLabel, k)
116116
volume.Labels = volume.Labels.Add(projectLabel, project.Name)
117117
volume.Labels = volume.Labels.Add(versionLabel, ComposeVersion)
@@ -123,6 +123,14 @@ func (s *composeService) ensureProjectVolumes(ctx context.Context, project *type
123123
return nil
124124
}
125125

126+
func getImageName(service types.ServiceConfig, projectName string) string {
127+
imageName := service.Image
128+
if imageName == "" {
129+
imageName = projectName + "_" + service.Name
130+
}
131+
return imageName
132+
}
133+
126134
func getCreateOptions(p *types.Project, s types.ServiceConfig, number int, inherit *moby.Container, autoRemove bool) (*container.Config, *container.HostConfig, *network.NetworkingConfig, error) {
127135
hash, err := jsonHash(s)
128136
if err != nil {
@@ -155,10 +163,6 @@ func getCreateOptions(p *types.Project, s types.ServiceConfig, number int, inher
155163
if len(s.Entrypoint) > 0 {
156164
entrypoint = strslice.StrSlice(s.Entrypoint)
157165
}
158-
image := s.Image
159-
if s.Image == "" {
160-
image = fmt.Sprintf("%s_%s", p.Name, s.Name)
161-
}
162166

163167
var (
164168
tty = s.Tty
@@ -178,7 +182,7 @@ func getCreateOptions(p *types.Project, s types.ServiceConfig, number int, inher
178182
AttachStderr: true,
179183
AttachStdout: true,
180184
Cmd: runCmd,
181-
Image: image,
185+
Image: getImageName(s, p.Name),
182186
WorkingDir: s.WorkingDir,
183187
Entrypoint: entrypoint,
184188
NetworkDisabled: s.NetworkMode == "disabled",

local/compose/create_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"path/filepath"
2222
"testing"
2323

24+
"github.com/compose-spec/compose-go/types"
2425
composetypes "github.com/compose-spec/compose-go/types"
2526
mountTypes "github.com/docker/docker/api/types/mount"
2627
"gotest.tools/v3/assert"
@@ -60,3 +61,21 @@ func TestBuildVolumeMount(t *testing.T) {
6061
assert.Equal(t, mount.Source, "myProject_myVolume")
6162
assert.Equal(t, mount.Type, mountTypes.TypeVolume)
6263
}
64+
65+
func TestServiceImageName(t *testing.T) {
66+
assert.Equal(t, getImageName(types.ServiceConfig{Image: "myImage"}, "myProject"), "myImage")
67+
assert.Equal(t, getImageName(types.ServiceConfig{Name: "aService"}, "myProject"), "myProject_aService")
68+
}
69+
70+
func TestPrepareNetworkLabels(t *testing.T) {
71+
project := types.Project{
72+
Name: "myProject",
73+
Networks: types.Networks(map[string]types.NetworkConfig{"skynet": {}}),
74+
}
75+
prepareNetworks(&project)
76+
assert.DeepEqual(t, project.Networks["skynet"].Labels, types.Labels(map[string]string{
77+
"com.docker.compose.network": "skynet",
78+
"com.docker.compose.project": "myProject",
79+
"com.docker.compose.version": "1.0-alpha",
80+
}))
81+
}

tests/compose-e2e/compose_test.go

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,44 @@ func TestLocalComposeRun(t *testing.T) {
158158
})
159159
}
160160

161+
func TestNetworks(t *testing.T) {
162+
c := NewParallelE2eCLI(t, binDir)
163+
164+
const projectName = "network_e2e"
165+
166+
t.Run("ensure we do not reuse previous networks", func(t *testing.T) {
167+
c.RunDockerOrExitError("network", "rm", projectName+"_dbnet")
168+
c.RunDockerOrExitError("network", "rm", "microservices")
169+
})
170+
171+
t.Run("up", func(t *testing.T) {
172+
c.RunDockerCmd("compose", "up", "-d", "-f", "./fixtures/network-test/docker-compose.yaml", "--project-name", projectName, "-d")
173+
})
174+
175+
t.Run("check running project", func(t *testing.T) {
176+
res := c.RunDockerCmd("compose", "ps", "-p", projectName)
177+
res.Assert(t, icmd.Expected{Out: `web`})
178+
179+
endpoint := "http://localhost:80"
180+
output := HTTPGetWithRetry(t, endpoint+"/words/noun", http.StatusOK, 2*time.Second, 20*time.Second)
181+
assert.Assert(t, strings.Contains(output, `"word":`))
182+
183+
res = c.RunDockerCmd("network", "ls")
184+
res.Assert(t, icmd.Expected{Out: projectName + "_dbnet"})
185+
res.Assert(t, icmd.Expected{Out: "microservices"})
186+
})
187+
188+
t.Run("down", func(t *testing.T) {
189+
_ = c.RunDockerCmd("compose", "down", "--project-name", projectName)
190+
})
191+
192+
t.Run("check networks after down", func(t *testing.T) {
193+
res := c.RunDockerCmd("network", "ls")
194+
assert.Assert(t, !strings.Contains(res.Combined(), projectName), res.Combined())
195+
assert.Assert(t, !strings.Contains(res.Combined(), "microservices"), res.Combined())
196+
})
197+
}
198+
161199
func TestLocalComposeBuild(t *testing.T) {
162200
c := NewParallelE2eCLI(t, binDir)
163201

@@ -213,6 +251,7 @@ func TestLocalComposeVolume(t *testing.T) {
213251
//ensure local test run does not reuse previously build image
214252
c.RunDockerOrExitError("rmi", "compose-e2e-volume_nginx")
215253
c.RunDockerOrExitError("volume", "rm", projectName+"_staticVol")
254+
c.RunDockerOrExitError("volume", "rm", "myvolume")
216255
c.RunDockerCmd("compose", "up", "-d", "--workdir", "fixtures/volume-test", "--project-name", projectName)
217256
})
218257

@@ -224,7 +263,7 @@ func TestLocalComposeVolume(t *testing.T) {
224263
t.Run("check container volume specs", func(t *testing.T) {
225264
res := c.RunDockerCmd("inspect", "compose-e2e-volume_nginx2_1", "--format", "{{ json .HostConfig.Mounts }}")
226265
//nolint
227-
res.Assert(t, icmd.Expected{Out: `[{"Type":"volume","Source":"compose-e2e-volume_staticVol","Target":"/usr/share/nginx/html","ReadOnly":true},{"Type":"volume","Target":"/usr/src/app/node_modules"}]`})
266+
res.Assert(t, icmd.Expected{Out: `[{"Type":"volume","Source":"compose-e2e-volume_staticVol","Target":"/usr/share/nginx/html","ReadOnly":true},{"Type":"volume","Target":"/usr/src/app/node_modules"},{"Type":"volume","Source":"myVolume","Target":"/usr/share/nginx/test"}]`})
228267
})
229268

230269
t.Run("cleanup volume project", func(t *testing.T) {
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
services:
2+
db:
3+
image: gtardif/sentences-db
4+
networks:
5+
- dbnet
6+
words:
7+
image: gtardif/sentences-api
8+
ports:
9+
- "8080:8080"
10+
networks:
11+
- dbnet
12+
- servicenet
13+
web:
14+
image: gtardif/sentences-web
15+
ports:
16+
- "80:80"
17+
labels:
18+
- "my-label=test"
19+
networks:
20+
- servicenet
21+
22+
networks:
23+
dbnet:
24+
servicenet:
25+
name: microservices

0 commit comments

Comments
 (0)