Skip to content

Commit

Permalink
Honor network options for macvlan networks
Browse files Browse the repository at this point in the history
when creating a macvlan network, we should honor gateway, subnet, and
mtu as provided by the user.

Fixes: containers#9167

Signed-off-by: baude <[email protected]>
  • Loading branch information
baude committed Feb 2, 2021
1 parent d66a18c commit bd0e22e
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 5 deletions.
5 changes: 4 additions & 1 deletion libpod/network/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,14 +103,17 @@ func (p PortMapConfig) Bytes() ([]byte, error) {

// IPAMDHCP describes the ipamdhcp config
type IPAMDHCP struct {
DHCP string `json:"type"`
DHCP string `json:"type"`
Routes []IPAMRoute `json:"routes,omitempty"`
Ranges [][]IPAMLocalHostRangeConf `json:"ranges,omitempty"`
}

// MacVLANConfig describes the macvlan config
type MacVLANConfig struct {
PluginType string `json:"type"`
Master string `json:"master"`
IPAM IPAMDHCP `json:"ipam"`
MTU int `json:"mtu,omitempty"`
}

// Bytes outputs the configuration as []byte
Expand Down
15 changes: 14 additions & 1 deletion libpod/network/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,7 @@ func createBridge(name string, options entities.NetworkCreateOptions, runtimeCon

func createMacVLAN(name string, options entities.NetworkCreateOptions, runtimeConfig *config.Config) (string, error) {
var (
mtu int
plugins []CNIPlugins
)
liveNetNames, err := GetLiveNetworkNames()
Expand Down Expand Up @@ -283,7 +284,19 @@ func createMacVLAN(name string, options entities.NetworkCreateOptions, runtimeCo
}
}
ncList := NewNcList(name, version.Current(), options.Labels)
macvlan := NewMacVLANPlugin(parentNetworkDevice)
if val, ok := options.Options["mtu"]; ok {
intVal, err := strconv.Atoi(val)
if err != nil {
return "", err
}
if intVal > 0 {
mtu = intVal
}
}
macvlan, err := NewMacVLANPlugin(parentNetworkDevice, options.Gateway, &options.Range, &options.Subnet, mtu)
if err != nil {
return "", err
}
plugins = append(plugins, macvlan)
ncList["plugins"] = plugins
b, err := json.MarshalIndent(ncList, "", " ")
Expand Down
16 changes: 14 additions & 2 deletions libpod/network/netconflist.go
Original file line number Diff line number Diff line change
Expand Up @@ -172,19 +172,31 @@ func HasDNSNamePlugin(paths []string) bool {
}

// NewMacVLANPlugin creates a macvlanconfig with a given device name
func NewMacVLANPlugin(device string) MacVLANConfig {
func NewMacVLANPlugin(device string, gateway net.IP, ipRange *net.IPNet, subnet *net.IPNet, mtu int) (MacVLANConfig, error) {
i := IPAMDHCP{DHCP: "dhcp"}
if gateway != nil || ipRange != nil || subnet != nil {
ipam, err := NewIPAMLocalHostRange(subnet, ipRange, gateway)
if err != nil {
return MacVLANConfig{}, err
}
ranges := make([][]IPAMLocalHostRangeConf, 0)
ranges = append(ranges, ipam)
i.Ranges = ranges
}

m := MacVLANConfig{
PluginType: "macvlan",
IPAM: i,
}
if mtu > 0 {
m.MTU = mtu
}
// CNI is supposed to use the default route if a
// parent device is not provided
if len(device) > 0 {
m.Master = device
}
return m
return m, nil
}

// IfPassesFilter filters NetworkListReport and returns true if the filter match the given config
Expand Down
29 changes: 28 additions & 1 deletion test/e2e/network_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -487,7 +487,6 @@ var _ = Describe("Podman network", func() {
inspect := podmanTest.Podman([]string{"network", "inspect", net})
inspect.WaitWithDefaultTimeout()
Expect(inspect.ExitCode()).To(BeZero())
fmt.Println(inspect.OutputToString())

out, err := inspect.jq(".[0].plugins[0].master")
Expect(err).To(BeNil())
Expand All @@ -513,4 +512,32 @@ var _ = Describe("Podman network", func() {
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(1))
})

It("podman network create macvlan with network info and options", func() {
net := "macvlan" + stringid.GenerateNonCryptoID()
nc := podmanTest.Podman([]string{"network", "create", "-d", "macvlan", "-o", "parent=lo", "-o", "mtu=1500", "--gateway", "192.168.1.254", "--subnet", "192.168.1.0/24", net})
nc.WaitWithDefaultTimeout()
defer podmanTest.removeCNINetwork(net)
Expect(nc.ExitCode()).To(Equal(0))

inspect := podmanTest.Podman([]string{"network", "inspect", net})
inspect.WaitWithDefaultTimeout()
Expect(inspect.ExitCode()).To(BeZero())

mtu, err := inspect.jq(".[0].plugins[0].mtu")
Expect(err).To(BeNil())
Expect(mtu).To(Equal("1500"))

gw, err := inspect.jq(".[0].plugins[0].ipam.ranges[0][0].gateway")
Expect(err).To(BeNil())
Expect(gw).To(Equal("\"192.168.1.254\""))

subnet, err := inspect.jq(".[0].plugins[0].ipam.ranges[0][0].subnet")
Expect(err).To(BeNil())
Expect(subnet).To(Equal("\"192.168.1.0/24\""))

nc = podmanTest.Podman([]string{"network", "rm", net})
nc.WaitWithDefaultTimeout()
Expect(nc.ExitCode()).To(Equal(0))
})
})

0 comments on commit bd0e22e

Please sign in to comment.