From a4836391a5874aed20e20990407e4d41144e10e4 Mon Sep 17 00:00:00 2001 From: Laura Brehm Date: Fri, 28 Jan 2022 14:31:55 +0000 Subject: [PATCH] Set NetworkMode correctly according to network priorities Signed-off-by: Laura Brehm --- pkg/compose/create.go | 26 +++++--------- pkg/compose/create_test.go | 71 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 17 deletions(-) diff --git a/pkg/compose/create.go b/pkg/compose/create.go index 1bd57cf0e..ebedcb3f7 100644 --- a/pkg/compose/create.go +++ b/pkg/compose/create.go @@ -445,14 +445,16 @@ func (s *composeService) prepareLabels(p *types.Project, service types.ServiceCo } func getDefaultNetworkMode(project *types.Project, service types.ServiceConfig) string { - mode := "none" - if len(project.Networks) > 0 { - for name := range getNetworksForService(service) { - mode = project.Networks[name].Name - break - } + if len(project.Networks) == 0 { + return "none" } - return mode + + if len(service.Networks) > 0 { + name := service.NetworksByPriority()[0] + return project.Networks[name].Name + } + + return project.Networks["default"].Name } func getRestartPolicy(service types.ServiceConfig) container.RestartPolicy { @@ -1013,16 +1015,6 @@ func getAliases(s types.ServiceConfig, c *types.ServiceNetworkConfig) []string { return aliases } -func getNetworksForService(s types.ServiceConfig) map[string]*types.ServiceNetworkConfig { - if len(s.Networks) > 0 { - return s.Networks - } - if s.NetworkMode != "" { - return nil - } - return map[string]*types.ServiceNetworkConfig{"default": nil} -} - func (s *composeService) ensureNetwork(ctx context.Context, n types.NetworkConfig) error { _, err := s.apiClient.NetworkInspect(ctx, n.Name, moby.NetworkInspectOptions{}) if err != nil { diff --git a/pkg/compose/create_test.go b/pkg/compose/create_test.go index 254e0b004..ea2ec88ad 100644 --- a/pkg/compose/create_test.go +++ b/pkg/compose/create_test.go @@ -151,3 +151,74 @@ func TestGetBindMode(t *testing.T) { assert.Equal(t, getBindMode(&composetypes.ServiceVolumeBind{SELinux: composetypes.SELinuxShared}, true), "ro,z") assert.Equal(t, getBindMode(&composetypes.ServiceVolumeBind{SELinux: composetypes.SELinuxPrivate}, true), "ro,Z") } + +func TestGetDefaultNetworkMode(t *testing.T) { + t.Run("returns the network with the highest priority when service has multiple networks", func(t *testing.T) { + service := composetypes.ServiceConfig{ + Name: "myService", + Networks: map[string]*composetypes.ServiceNetworkConfig{ + "myNetwork1": { + Priority: 10, + }, + "myNetwork2": { + Priority: 1000, + }, + }, + } + project := composetypes.Project{ + Name: "myProject", + Services: []composetypes.ServiceConfig{ + service, + }, + Networks: composetypes.Networks(map[string]composetypes.NetworkConfig{ + "myNetwork1": { + Name: "myProject_myNetwork1", + }, + "myNetwork2": { + Name: "myProject_myNetwork2", + }, + }), + } + + assert.Equal(t, getDefaultNetworkMode(&project, service), "myProject_myNetwork2") + }) + + t.Run("returns default network when service has no networks", func(t *testing.T) { + service := composetypes.ServiceConfig{ + Name: "myService", + } + project := composetypes.Project{ + Name: "myProject", + Services: []composetypes.ServiceConfig{ + service, + }, + Networks: composetypes.Networks(map[string]composetypes.NetworkConfig{ + "myNetwork1": { + Name: "myProject_myNetwork1", + }, + "myNetwork2": { + Name: "myProject_myNetwork2", + }, + "default": { + Name: "myProject_default", + }, + }), + } + + assert.Equal(t, getDefaultNetworkMode(&project, service), "myProject_default") + }) + + t.Run("returns none if project has no networks", func(t *testing.T) { + service := composetypes.ServiceConfig{ + Name: "myService", + } + project := composetypes.Project{ + Name: "myProject", + Services: []composetypes.ServiceConfig{ + service, + }, + } + + assert.Equal(t, getDefaultNetworkMode(&project, service), "none") + }) +}