Skip to content

Commit

Permalink
Merge pull request #8457 from afbjorklund/bridge-mtu
Browse files Browse the repository at this point in the history
Add podman network create flag for bridge mtu
  • Loading branch information
openshift-merge-robot authored Dec 2, 2020
2 parents b2cd6e0 + db70e91 commit c585012
Show file tree
Hide file tree
Showing 6 changed files with 102 additions and 2 deletions.
9 changes: 9 additions & 0 deletions cmd/podman/networks/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ var (
var (
networkCreateOptions entities.NetworkCreateOptions
labels []string
opts []string
)

func networkCreateFlags(cmd *cobra.Command) {
Expand All @@ -39,6 +40,10 @@ func networkCreateFlags(cmd *cobra.Command) {
flags.StringVarP(&networkCreateOptions.Driver, driverFlagName, "d", "bridge", "driver to manage the network")
_ = cmd.RegisterFlagCompletionFunc(driverFlagName, common.AutocompleteNetworkDriver)

optFlagName := "opt"
flags.StringArrayVarP(&opts, optFlagName, "o", []string{}, "Set driver specific options (default [])")
_ = cmd.RegisterFlagCompletionFunc(optFlagName, completion.AutocompleteNone)

gatewayFlagName := "gateway"
flags.IPVar(&networkCreateOptions.Gateway, gatewayFlagName, nil, "IPv4 or IPv6 gateway for the subnet")
_ = cmd.RegisterFlagCompletionFunc(gatewayFlagName, completion.AutocompleteNone)
Expand Down Expand Up @@ -93,6 +98,10 @@ func networkCreate(cmd *cobra.Command, args []string) error {
if err != nil {
return errors.Wrap(err, "failed to parse labels")
}
networkCreateOptions.Options, err = parse.GetAllLabels([]string{}, opts)
if err != nil {
return errors.Wrapf(err, "unable to process options")
}
response, err := registry.ContainerEngine().NetworkCreate(registry.Context(), name, networkCreateOptions)
if err != nil {
return err
Expand Down
8 changes: 8 additions & 0 deletions docs/source/markdown/podman-network-create.1.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,14 @@ resolution.

Driver to manage the network (default "bridge"). Currently only `bridge` is supported.

#### **--opt**=*option*, **-o**

Set driver specific options.

For the `bridge` driver the following options are supported: `mtu` and `vlan`.
The `mtu` option sets the Maximum Transmission Unit (MTU) and takes an integer value.
The `vlan` option assign VLAN tag and enables vlan\_filtering. Defaults to none.

#### **--gateway**

Define a gateway for the subnet. If you want to provide a gateway address, you must also provide a
Expand Down
48 changes: 47 additions & 1 deletion libpod/network/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"io/ioutil"
"os"
"path/filepath"
"strconv"

"github.com/containernetworking/cni/pkg/version"
"github.com/containers/common/pkg/config"
Expand Down Expand Up @@ -76,6 +77,29 @@ func validateBridgeOptions(options entities.NetworkCreateOptions) error {

}

// parseMTU parses the mtu option
func parseMTU(mtu string) (int, error) {
if mtu == "" {
return 0, nil // default
}
m, err := strconv.Atoi(mtu)
if err != nil {
return 0, err
}
if m < 0 {
return 0, errors.Errorf("the value %d for mtu is less than zero", m)
}
return m, nil
}

// parseVlan parses the vlan option
func parseVlan(vlan string) (int, error) {
if vlan == "" {
return 0, nil // default
}
return strconv.Atoi(vlan)
}

// createBridge creates a CNI network
func createBridge(name string, options entities.NetworkCreateOptions, runtimeConfig *config.Config) (string, error) {
var (
Expand Down Expand Up @@ -149,6 +173,28 @@ func createBridge(name string, options entities.NetworkCreateOptions, runtimeCon
ipMasq = false
}

var mtu int
var vlan int
for k, v := range options.Options {
var err error
switch k {
case "mtu":
mtu, err = parseMTU(v)
if err != nil {
return "", err
}

case "vlan":
vlan, err = parseVlan(v)
if err != nil {
return "", err
}

default:
return "", errors.Errorf("unsupported option %s", k)
}
}

// obtain host bridge name
bridgeDeviceName, err := GetFreeDeviceName(runtimeConfig)
if err != nil {
Expand All @@ -172,7 +218,7 @@ func createBridge(name string, options entities.NetworkCreateOptions, runtimeCon
ncList := NewNcList(name, version.Current(), options.Labels)
var plugins []CNIPlugins
// TODO need to iron out the role of isDefaultGW and IPMasq
bridge := NewHostLocalBridge(bridgeDeviceName, isGateway, false, ipMasq, ipamConfig)
bridge := NewHostLocalBridge(bridgeDeviceName, isGateway, false, ipMasq, mtu, vlan, ipamConfig)
plugins = append(plugins, bridge)
plugins = append(plugins, NewPortMapPlugin())
plugins = append(plugins, NewFirewallPlugin())
Expand Down
4 changes: 3 additions & 1 deletion libpod/network/netconflist.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,14 @@ func NewNcList(name, version string, labels NcLabels) NcList {
}

// NewHostLocalBridge creates a new LocalBridge for host-local
func NewHostLocalBridge(name string, isGateWay, isDefaultGW, ipMasq bool, ipamConf IPAMHostLocalConf) *HostLocalBridge {
func NewHostLocalBridge(name string, isGateWay, isDefaultGW, ipMasq bool, mtu int, vlan int, ipamConf IPAMHostLocalConf) *HostLocalBridge {
hostLocalBridge := HostLocalBridge{
PluginType: "bridge",
BrName: name,
IPMasq: ipMasq,
MTU: mtu,
HairpinMode: true,
Vlan: vlan,
IPAM: ipamConf,
}
if isGateWay {
Expand Down
2 changes: 2 additions & 0 deletions pkg/domain/entities/network.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ type NetworkCreateOptions struct {
Range net.IPNet
Subnet net.IPNet
IPv6 bool
// Mapping of driver options and values.
Options map[string]string
}

// NetworkCreateReport describes a created network for the cli
Expand Down
33 changes: 33 additions & 0 deletions test/e2e/network_create_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -329,4 +329,37 @@ var _ = Describe("Podman network create", func() {
Expect(nc).To(ExitWithError())
})

It("podman network create with mtu option", func() {
net := "mtu-test"
nc := podmanTest.Podman([]string{"network", "create", "--opt", "mtu=9000", net})
nc.WaitWithDefaultTimeout()
Expect(nc.ExitCode()).To(BeZero())
defer podmanTest.removeCNINetwork(net)

nc = podmanTest.Podman([]string{"network", "inspect", net})
nc.WaitWithDefaultTimeout()
Expect(nc.ExitCode()).To(BeZero())
Expect(nc.OutputToString()).To(ContainSubstring(`"mtu": 9000,`))
})

It("podman network create with vlan option", func() {
net := "vlan-test"
nc := podmanTest.Podman([]string{"network", "create", "--opt", "vlan=9", net})
nc.WaitWithDefaultTimeout()
Expect(nc.ExitCode()).To(BeZero())
defer podmanTest.removeCNINetwork(net)

nc = podmanTest.Podman([]string{"network", "inspect", net})
nc.WaitWithDefaultTimeout()
Expect(nc.ExitCode()).To(BeZero())
Expect(nc.OutputToString()).To(ContainSubstring(`"vlan": 9`))
})

It("podman network create with invalid option", func() {
net := "invalid-test"
nc := podmanTest.Podman([]string{"network", "create", "--opt", "foo=bar", net})
nc.WaitWithDefaultTimeout()
Expect(nc).To(ExitWithError())
})

})

0 comments on commit c585012

Please sign in to comment.