Merge pull request #2308 from Luap99/bridge-vlan
libnetwork/netavark: allow same bridge name with different vlan
This commit is contained in:
commit
47b9c19c43
|
|
@ -86,7 +86,7 @@ func (n *cniNetwork) networkCreate(newNetwork *types.Network, defaultNet bool) (
|
||||||
switch newNetwork.Driver {
|
switch newNetwork.Driver {
|
||||||
case types.BridgeNetworkDriver:
|
case types.BridgeNetworkDriver:
|
||||||
internalutil.MapDockerBridgeDriverOptions(newNetwork)
|
internalutil.MapDockerBridgeDriverOptions(newNetwork)
|
||||||
err = internalutil.CreateBridge(n, newNetwork, usedNetworks, n.defaultsubnetPools)
|
err = internalutil.CreateBridge(n, newNetwork, usedNetworks, n.defaultsubnetPools, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,11 +10,13 @@ import (
|
||||||
"github.com/containers/common/pkg/config"
|
"github.com/containers/common/pkg/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
func CreateBridge(n NetUtil, network *types.Network, usedNetworks []*net.IPNet, subnetPools []config.SubnetPool) error {
|
func CreateBridge(n NetUtil, network *types.Network, usedNetworks []*net.IPNet, subnetPools []config.SubnetPool, checkBridgeConflict bool) error {
|
||||||
if network.NetworkInterface != "" {
|
if network.NetworkInterface != "" {
|
||||||
bridges := GetBridgeInterfaceNames(n)
|
if checkBridgeConflict {
|
||||||
if slices.Contains(bridges, network.NetworkInterface) {
|
bridges := GetBridgeInterfaceNames(n)
|
||||||
return fmt.Errorf("bridge name %s already in use", network.NetworkInterface)
|
if slices.Contains(bridges, network.NetworkInterface) {
|
||||||
|
return fmt.Errorf("bridge name %s already in use", network.NetworkInterface)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if !types.NameRegex.MatchString(network.NetworkInterface) {
|
if !types.NameRegex.MatchString(network.NetworkInterface) {
|
||||||
return fmt.Errorf("bridge name %s invalid: %w", network.NetworkInterface, types.RegexError)
|
return fmt.Errorf("bridge name %s invalid: %w", network.NetworkInterface, types.RegexError)
|
||||||
|
|
|
||||||
|
|
@ -169,11 +169,9 @@ func (n *netavarkNetwork) networkCreate(newNetwork *types.Network, defaultNet bo
|
||||||
switch newNetwork.Driver {
|
switch newNetwork.Driver {
|
||||||
case types.BridgeNetworkDriver:
|
case types.BridgeNetworkDriver:
|
||||||
internalutil.MapDockerBridgeDriverOptions(newNetwork)
|
internalutil.MapDockerBridgeDriverOptions(newNetwork)
|
||||||
err = internalutil.CreateBridge(n, newNetwork, usedNetworks, n.defaultsubnetPools)
|
|
||||||
if err != nil {
|
var vlan int
|
||||||
return nil, err
|
// validate the given options,
|
||||||
}
|
|
||||||
// validate the given options, we do not need them but just check to make sure they are valid
|
|
||||||
for key, value := range newNetwork.Options {
|
for key, value := range newNetwork.Options {
|
||||||
switch key {
|
switch key {
|
||||||
case types.MTUOption:
|
case types.MTUOption:
|
||||||
|
|
@ -183,7 +181,7 @@ func (n *netavarkNetwork) networkCreate(newNetwork *types.Network, defaultNet bo
|
||||||
}
|
}
|
||||||
|
|
||||||
case types.VLANOption:
|
case types.VLANOption:
|
||||||
_, err = internalutil.ParseVlan(value)
|
vlan, err = internalutil.ParseVlan(value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
@ -218,6 +216,17 @@ func (n *netavarkNetwork) networkCreate(newNetwork *types.Network, defaultNet bo
|
||||||
return nil, fmt.Errorf("unsupported bridge network option %s", key)
|
return nil, fmt.Errorf("unsupported bridge network option %s", key)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If there is no vlan there should be no other config with the same bridge.
|
||||||
|
// However with vlan we want to allow that so that you can have different
|
||||||
|
// configs on the same bridge but different vlans
|
||||||
|
// https://github.com/containers/common/issues/2095
|
||||||
|
checkBridgeConflict := vlan == 0
|
||||||
|
err = internalutil.CreateBridge(n, newNetwork, usedNetworks, n.defaultsubnetPools, checkBridgeConflict)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
case types.MacVLANNetworkDriver, types.IPVLANNetworkDriver:
|
case types.MacVLANNetworkDriver, types.IPVLANNetworkDriver:
|
||||||
err = createIpvlanOrMacvlan(newNetwork)
|
err = createIpvlanOrMacvlan(newNetwork)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
|
|
@ -913,6 +913,27 @@ var _ = Describe("Config", func() {
|
||||||
Expect(err.Error()).To(ContainSubstring(`vlan ID -1 must be between 0 and 4094`))
|
Expect(err.Error()).To(ContainSubstring(`vlan ID -1 must be between 0 and 4094`))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("create two networks with vlan option and same bridge", func() {
|
||||||
|
networkOpts := types.Network{
|
||||||
|
NetworkInterface: "br0",
|
||||||
|
Options: map[string]string{
|
||||||
|
types.VLANOption: "5",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
network1, err := libpodNet.NetworkCreate(networkOpts, nil)
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(network1.Driver).To(Equal("bridge"))
|
||||||
|
Expect(network1.Options).To(HaveKeyWithValue("vlan", "5"))
|
||||||
|
|
||||||
|
// set a new vlan
|
||||||
|
networkOpts.Options[types.VLANOption] = "99"
|
||||||
|
|
||||||
|
network2, err := libpodNet.NetworkCreate(networkOpts, nil)
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(network2.Driver).To(Equal("bridge"))
|
||||||
|
Expect(network2.Options).To(HaveKeyWithValue("vlan", "99"))
|
||||||
|
})
|
||||||
|
|
||||||
It("create network with vrf option", func() {
|
It("create network with vrf option", func() {
|
||||||
network := types.Network{
|
network := types.Network{
|
||||||
Options: map[string]string{
|
Options: map[string]string{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue