From aad25801c08944c87fff74c9cc9a83264e9fe714 Mon Sep 17 00:00:00 2001 From: msabansal Date: Thu, 9 Jun 2016 12:09:13 -0700 Subject: [PATCH] Fixing support for nat to choose a subnet automatically Signed-off-by: msabansal --- daemon/daemon_windows.go | 48 +++++++++++++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/daemon/daemon_windows.go b/daemon/daemon_windows.go index f6efe54784..5ecb8f3590 100644 --- a/daemon/daemon_windows.go +++ b/daemon/daemon_windows.go @@ -221,6 +221,18 @@ func (daemon *Daemon) initNetworkController(config *Config, activeSandboxes map[ return nil, err } + defaultNetworkExists := false + + if network, err := controller.NetworkByName(runconfig.DefaultDaemonNetworkMode().NetworkName()); err == nil { + options := network.Info().DriverOptions() + for _, v := range hnsresponse { + if options[winlibnetwork.HNSID] == v.Id { + defaultNetworkExists = true + break + } + } + } + // discover and add HNS networks to windows // network that exist are removed and added again for _, v := range hnsresponse { @@ -237,6 +249,8 @@ func (daemon *Daemon) initNetworkController(config *Config, activeSandboxes map[ controller.WalkNetworks(s) if n != nil { v.Name = n.Name() + // This will not cause network delete from HNS as the network + // is not yet populated in the libnetwork windows driver n.Delete() } @@ -254,10 +268,12 @@ func (daemon *Daemon) initNetworkController(config *Config, activeSandboxes map[ } name := v.Name - // There is only one nat network supported in windows. - // If it exists with a different name add it as the default name - if runconfig.DefaultDaemonNetworkMode() == containertypes.NetworkMode(strings.ToLower(v.Type)) { + + // If there is no nat network create one from the first NAT network + // encountered + if !defaultNetworkExists && runconfig.DefaultDaemonNetworkMode() == containertypes.NetworkMode(strings.ToLower(v.Type)) { name = runconfig.DefaultDaemonNetworkMode().NetworkName() + defaultNetworkExists = true } v6Conf := []*libnetwork.IpamConf{} @@ -292,26 +308,38 @@ func initBridgeDriver(controller libnetwork.NetworkController, config *Config) e winlibnetwork.NetworkName: runconfig.DefaultDaemonNetworkMode().NetworkName(), } - ipamV4Conf := libnetwork.IpamConf{} - if config.bridgeConfig.FixedCIDR == "" { - ipamV4Conf.PreferredPool = defaultNetworkSpace + var ipamOption libnetwork.NetworkOption + var subnetPrefix string + + if config.bridgeConfig.FixedCIDR != "" { + subnetPrefix = config.bridgeConfig.FixedCIDR } else { - ipamV4Conf.PreferredPool = config.bridgeConfig.FixedCIDR + // TP5 doesn't support properly detecting subnet + osv := system.GetOSVersion() + if osv.Build < 14360 { + subnetPrefix = defaultNetworkSpace + } } - v4Conf := []*libnetwork.IpamConf{&ipamV4Conf} - v6Conf := []*libnetwork.IpamConf{} + if subnetPrefix != "" { + ipamV4Conf := libnetwork.IpamConf{} + ipamV4Conf.PreferredPool = subnetPrefix + v4Conf := []*libnetwork.IpamConf{&ipamV4Conf} + v6Conf := []*libnetwork.IpamConf{} + ipamOption = libnetwork.NetworkOptionIpam("default", "", v4Conf, v6Conf, nil) + } _, err := controller.NewNetwork(string(runconfig.DefaultDaemonNetworkMode()), runconfig.DefaultDaemonNetworkMode().NetworkName(), "", libnetwork.NetworkOptionGeneric(options.Generic{ netlabel.GenericData: netOption, }), - libnetwork.NetworkOptionIpam("default", "", v4Conf, v6Conf, nil), + ipamOption, ) if err != nil { return fmt.Errorf("Error creating default network: %v", err) } + return nil }