From 9be7029cdd4736f3ac33004e4364e3e7f3bd1db5 Mon Sep 17 00:00:00 2001 From: Giuseppe Scrivano Date: Thu, 16 Jul 2020 12:19:51 +0200 Subject: libpod: pass down network options do not pass network specific options through the network namespace. Signed-off-by: Giuseppe Scrivano --- libpod/container.go | 2 ++ libpod/networking_linux.go | 20 ++++++++++++++++++-- libpod/options.go | 13 +++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) (limited to 'libpod') diff --git a/libpod/container.go b/libpod/container.go index f7abfb005..1ca38ae7e 100644 --- a/libpod/container.go +++ b/libpod/container.go @@ -341,6 +341,8 @@ type ContainerConfig struct { Networks []string `json:"networks,omitempty"` // Network mode specified for the default network. NetMode namespaces.NetworkMode `json:"networkMode,omitempty"` + // NetworkOptions are additional options for each network + NetworkOptions map[string][]string `json:"network_options,omitempty"` // Image Config diff --git a/libpod/networking_linux.go b/libpod/networking_linux.go index db8aa219b..9be8e0b14 100644 --- a/libpod/networking_linux.go +++ b/libpod/networking_linux.go @@ -223,6 +223,22 @@ func (r *Runtime) setupRootlessNetNS(ctr *Container) error { havePortMapping := len(ctr.Config().PortMappings) > 0 logPath := filepath.Join(ctr.runtime.config.Engine.TmpDir, fmt.Sprintf("slirp4netns-%s.log", ctr.config.ID)) + isSlirpHostForward := false + if ctr.config.NetworkOptions != nil { + slirpOptions := ctr.config.NetworkOptions["slirp4netns"] + for _, o := range slirpOptions { + switch o { + case "port_handler=slirp4netns": + isSlirpHostForward = true + case "port_handler=rootlesskit": + isSlirpHostForward = false + default: + return errors.Errorf("unknown option for slirp4netns: %q", o) + + } + } + } + cmdArgs := []string{} slirpFeatures, err := checkSlirpFlags(path) if err != nil { @@ -242,7 +258,7 @@ func (r *Runtime) setupRootlessNetNS(ctr *Container) error { } var apiSocket string - if havePortMapping && ctr.config.NetMode.IsPortForwardViaSlirpHostFwd() { + if havePortMapping && isSlirpHostForward { apiSocket = filepath.Join(ctr.runtime.config.Engine.TmpDir, fmt.Sprintf("%s.net", ctr.config.ID)) cmdArgs = append(cmdArgs, "--api-socket", apiSocket) } @@ -310,7 +326,7 @@ func (r *Runtime) setupRootlessNetNS(ctr *Container) error { } if havePortMapping { - if ctr.config.NetMode.IsPortForwardViaSlirpHostFwd() { + if isSlirpHostForward { return r.setupRootlessPortMappingViaSlirp(ctr, cmd, apiSocket) } else { return r.setupRootlessPortMappingViaRLK(ctr, netnsPath) diff --git a/libpod/options.go b/libpod/options.go index b3c11ebc1..32748a3c1 100644 --- a/libpod/options.go +++ b/libpod/options.go @@ -1003,6 +1003,19 @@ func WithStaticIP(ip net.IP) CtrCreateOption { } } +// WithNetworkOptions sets additional options for the networks. +func WithNetworkOptions(options map[string][]string) CtrCreateOption { + return func(ctr *Container) error { + if ctr.valid { + return define.ErrCtrFinalized + } + + ctr.config.NetworkOptions = options + + return nil + } +} + // WithStaticMAC indicates that the container should request a static MAC from // the CNI plugins. // It cannot be set unless WithNetNS has already been passed. -- cgit v1.2.3-54-g00ecf