Browse Source

Merge pull request #9130 from laurazard/fix_mac_address_network_priority

Set NetworkMode correctly according to network priorities
Ulysses Souza 3 years ago
parent
commit
5262d3bbf5
2 changed files with 80 additions and 17 deletions
  1. 9 17
      pkg/compose/create.go
  2. 71 0
      pkg/compose/create_test.go

+ 9 - 17
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 {

+ 71 - 0
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")
+	})
+}