Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions pkg/compose/convergence_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,10 @@ import (
"github.com/docker/docker/api/types/image"
"github.com/docker/docker/api/types/network"
"github.com/docker/go-connections/nat"
"github.com/stretchr/testify/require"
"go.uber.org/mock/gomock"
"gotest.tools/v3/assert"
"gotest.tools/v3/assert/cmp"

"github.com/docker/compose/v5/pkg/api"
"github.com/docker/compose/v5/pkg/mocks"
Expand Down Expand Up @@ -425,3 +427,42 @@ func TestCreateMobyContainer(t *testing.T) {
assert.NilError(t, err)
})
}

func TestDefaultNetworkSettingsGwPrioritySelectsPrimaryNetwork(t *testing.T) {
project := &types.Project{
Name: "test",
Networks: map[string]types.NetworkConfig{
"net1": {Name: "net1"},
"net2": {Name: "net2"},
},
}

service := types.ServiceConfig{
Name: "svc",
Networks: map[string]*types.ServiceNetworkConfig{
"net1": {GatewayPriority: 0},
"net2": {GatewayPriority: 100},
},
}

mode, netConfig, err := defaultNetworkSettings(
project,
service,
0,
nil,
false,
APIVersion144,
)

require.NoError(t, err)
require.NotNil(t, netConfig)

endpoints := netConfig.EndpointsConfig
require.Len(t, endpoints, 2)

assert.Assert(t, cmp.Contains(endpoints, "net1"))
assert.Assert(t, cmp.Contains(endpoints, "net2"))

// gw_priority must only affect primary network selection
assert.Assert(t, cmp.Equal(container.NetworkMode("net1"), mode))
}
27 changes: 24 additions & 3 deletions pkg/compose/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -519,8 +519,17 @@ func defaultNetworkSettings(project *types.Project,
} else {
primaryNetworkKey = "default"
}

primaryNetworkMobyNetworkName := project.Networks[primaryNetworkKey].Name
primaryNetworkEndpoint := createEndpointSettings(project, service, serviceIndex, primaryNetworkKey, links, useNetworkAliases)
primaryNetworkEndpoint := createEndpointSettings(
project,
service,
serviceIndex,
primaryNetworkKey,
links,
useNetworkAliases,
)

endpointsConfig := map[string]*network.EndpointSettings{}

// Starting from API version 1.44, the Engine will take several EndpointsConfigs
Expand All @@ -532,7 +541,14 @@ func defaultNetworkSettings(project *types.Project,
serviceNetworks := service.NetworksByPriority()
for _, networkKey := range serviceNetworks[1:] {
mobyNetworkName := project.Networks[networkKey].Name
epSettings := createEndpointSettings(project, service, serviceIndex, networkKey, links, useNetworkAliases)
epSettings := createEndpointSettings(
project,
service,
serviceIndex,
networkKey,
links,
useNetworkAliases,
)
endpointsConfig[mobyNetworkName] = epSettings
}
}
Expand All @@ -544,12 +560,17 @@ func defaultNetworkSettings(project *types.Project,
if versions.LessThan(version, APIVersion149) {
for _, config := range service.Networks {
if config != nil && config.InterfaceName != "" {
return "", nil, fmt.Errorf("interface_name requires Docker Engine %s or later", DockerEngineV28_1)
return "", nil, fmt.Errorf(
"interface_name requires Docker Engine %s or later",
DockerEngineV28_1,
)
}
}
}

// Include the primary network
endpointsConfig[primaryNetworkMobyNetworkName] = primaryNetworkEndpoint

networkConfig := &network.NetworkingConfig{
EndpointsConfig: endpointsConfig,
}
Expand Down