enable dnsplugin for network create

when users create a new network and the dnsname plugin can be found by
podman, we will enable container name resolution on the new network.
there is an option to opt *out* as well.

tests cannot be added until we solve the packaging portion of the
dnsname plugin.

Signed-off-by: baude <bbaude@redhat.com>
This commit is contained in:
baude
2019-10-03 15:22:40 -05:00
parent ac73fd3fe5
commit 2f6b8b94e8
7 changed files with 52 additions and 6 deletions

View File

@ -267,6 +267,7 @@ type MountValues struct {
type NetworkCreateValues struct { type NetworkCreateValues struct {
PodmanCommand PodmanCommand
Driver string Driver string
DisableDNS bool
Gateway net.IP Gateway net.IP
Internal bool Internal bool
IPamDriver string IPamDriver string

View File

@ -46,7 +46,7 @@ func init() {
// TODO enable when IPv6 is working // TODO enable when IPv6 is working
//flags.BoolVar(&networkCreateCommand.IPV6, "IPv6", false, "enable IPv6 networking") //flags.BoolVar(&networkCreateCommand.IPV6, "IPv6", false, "enable IPv6 networking")
flags.IPNetVar(&networkCreateCommand.Network, "subnet", net.IPNet{}, "subnet in CIDR format") flags.IPNetVar(&networkCreateCommand.Network, "subnet", net.IPNet{}, "subnet in CIDR format")
flags.BoolVar(&networkCreateCommand.DisableDNS, "disable-dns", false, "disable dns plugin")
} }
func networkcreateCmd(c *cliconfig.NetworkCreateValues) error { func networkcreateCmd(c *cliconfig.NetworkCreateValues) error {

View File

@ -982,6 +982,7 @@ _podman_network_create() {
--subnet --subnet
" "
local boolean_options=" local boolean_options="
--disable-dns
--help --help
-h -h
--internal --internal

View File

@ -15,6 +15,11 @@ If no options are provided, Podman will assign a free subnet and name for your n
Upon completion of creating the network, Podman will display the path to the newly added network file. Upon completion of creating the network, Podman will display the path to the newly added network file.
## OPTIONS ## OPTIONS
**--disable-dns**
Disables the DNS plugin for this network which if enabled, can perform container to container name
resolution.
**-d**, , **--driver** **-d**, , **--driver**
Driver to manage the network (default "bridge"). Currently on `bridge` is supported. Driver to manage the network (default "bridge"). Currently on `bridge` is supported.

View File

@ -155,15 +155,14 @@ func (r *LocalRuntime) removeNetwork(ctx context.Context, name string, container
// NetworkCreate creates a CNI network // NetworkCreate creates a CNI network
func (r *LocalRuntime) NetworkCreate(cli *cliconfig.NetworkCreateValues) (string, error) { func (r *LocalRuntime) NetworkCreate(cli *cliconfig.NetworkCreateValues) (string, error) {
var (
err error
)
isGateway := true isGateway := true
ipMasq := true ipMasq := true
subnet := &cli.Network subnet := &cli.Network
ipRange := cli.IPRange ipRange := cli.IPRange
runtimeConfig, err := r.GetConfig()
if err != nil {
return "", err
}
// if range is provided, make sure it is "in" network // if range is provided, make sure it is "in" network
if cli.IsSet("subnet") { if cli.IsSet("subnet") {
// if network is provided, does it conflict with existing CNI or live networks // if network is provided, does it conflict with existing CNI or live networks
@ -245,6 +244,11 @@ func (r *LocalRuntime) NetworkCreate(cli *cliconfig.NetworkCreateValues) (string
plugins = append(plugins, bridge) plugins = append(plugins, bridge)
plugins = append(plugins, network.NewPortMapPlugin()) plugins = append(plugins, network.NewPortMapPlugin())
plugins = append(plugins, network.NewFirewallPlugin()) plugins = append(plugins, network.NewFirewallPlugin())
// if we find the dnsname plugin, we add configuration for it
if network.HasDNSNamePlugin(runtimeConfig.CNIPluginDir) && !cli.DisableDNS {
// Note: in the future we might like to allow for dynamic domain names
plugins = append(plugins, network.NewDNSNamePlugin(network.DefaultPodmanDomainName))
}
ncList["plugins"] = plugins ncList["plugins"] = plugins
b, err := json.MarshalIndent(ncList, "", " ") b, err := json.MarshalIndent(ncList, "", " ")
if err != nil { if err != nil {

View File

@ -14,6 +14,9 @@ const (
// CNIDeviceName is the default network device name and in // CNIDeviceName is the default network device name and in
// reality should have an int appended to it (cni-podman4) // reality should have an int appended to it (cni-podman4)
CNIDeviceName = "cni-podman" CNIDeviceName = "cni-podman"
// DefaultPodmanDomainName is used for the dnsname plugin to define
// a localized domain name for a created network
DefaultPodmanDomainName = "dns.podman"
) )
// GetDefaultPodmanNetwork outputs the default network for podman // GetDefaultPodmanNetwork outputs the default network for podman
@ -97,3 +100,14 @@ type FirewallConfig struct {
func (f FirewallConfig) Bytes() ([]byte, error) { func (f FirewallConfig) Bytes() ([]byte, error) {
return json.MarshalIndent(f, "", "\t") return json.MarshalIndent(f, "", "\t")
} }
// DNSNameConfig describes the dns container name resolution plugin config
type DNSNameConfig struct {
PluginType string `json:"type"`
DomainName string `json:"domainName"`
}
// Bytes outputs the configuration as []byte
func (d DNSNameConfig) Bytes() ([]byte, error) {
return json.MarshalIndent(d, "", "\t")
}

View File

@ -2,6 +2,8 @@ package network
import ( import (
"net" "net"
"os"
"path/filepath"
) )
// NcList describes a generic map // NcList describes a generic map
@ -111,3 +113,22 @@ func NewFirewallPlugin() FirewallConfig {
Backend: "iptables", Backend: "iptables",
} }
} }
// NewDNSNamePlugin creates the dnsname config with a given
// domainname
func NewDNSNamePlugin(domainName string) DNSNameConfig {
return DNSNameConfig{
PluginType: "dnsname",
DomainName: domainName,
}
}
// HasDNSNamePlugin looks to see if the dnsname cni plugin is present
func HasDNSNamePlugin(paths []string) bool {
for _, p := range paths {
if _, err := os.Stat(filepath.Join(p, "dnsname")); err == nil {
return true
}
}
return false
}