Browse code

Fixing support for nat to choose a subnet automatically

Signed-off-by: msabansal <sabansal@microsoft.com>

msabansal authored on 2016/06/10 04:09:13
Showing 1 changed files
... ...
@@ -221,6 +221,18 @@ func (daemon *Daemon) initNetworkController(config *Config, activeSandboxes map[
221 221
 		return nil, err
222 222
 	}
223 223
 
224
+	defaultNetworkExists := false
225
+
226
+	if network, err := controller.NetworkByName(runconfig.DefaultDaemonNetworkMode().NetworkName()); err == nil {
227
+		options := network.Info().DriverOptions()
228
+		for _, v := range hnsresponse {
229
+			if options[winlibnetwork.HNSID] == v.Id {
230
+				defaultNetworkExists = true
231
+				break
232
+			}
233
+		}
234
+	}
235
+
224 236
 	// discover and add HNS networks to windows
225 237
 	// network that exist are removed and added again
226 238
 	for _, v := range hnsresponse {
... ...
@@ -237,6 +249,8 @@ func (daemon *Daemon) initNetworkController(config *Config, activeSandboxes map[
237 237
 		controller.WalkNetworks(s)
238 238
 		if n != nil {
239 239
 			v.Name = n.Name()
240
+			// This will not cause network delete from HNS as the network
241
+			// is not yet populated in the libnetwork windows driver
240 242
 			n.Delete()
241 243
 		}
242 244
 
... ...
@@ -254,10 +268,12 @@ func (daemon *Daemon) initNetworkController(config *Config, activeSandboxes map[
254 254
 		}
255 255
 
256 256
 		name := v.Name
257
-		// There is only one nat network supported in windows.
258
-		// If it exists with a different name add it as the default name
259
-		if runconfig.DefaultDaemonNetworkMode() == containertypes.NetworkMode(strings.ToLower(v.Type)) {
257
+
258
+		// If there is no nat network create one from the first NAT network
259
+		// encountered
260
+		if !defaultNetworkExists && runconfig.DefaultDaemonNetworkMode() == containertypes.NetworkMode(strings.ToLower(v.Type)) {
260 261
 			name = runconfig.DefaultDaemonNetworkMode().NetworkName()
262
+			defaultNetworkExists = true
261 263
 		}
262 264
 
263 265
 		v6Conf := []*libnetwork.IpamConf{}
... ...
@@ -292,26 +308,38 @@ func initBridgeDriver(controller libnetwork.NetworkController, config *Config) e
292 292
 		winlibnetwork.NetworkName: runconfig.DefaultDaemonNetworkMode().NetworkName(),
293 293
 	}
294 294
 
295
-	ipamV4Conf := libnetwork.IpamConf{}
296
-	if config.bridgeConfig.FixedCIDR == "" {
297
-		ipamV4Conf.PreferredPool = defaultNetworkSpace
295
+	var ipamOption libnetwork.NetworkOption
296
+	var subnetPrefix string
297
+
298
+	if config.bridgeConfig.FixedCIDR != "" {
299
+		subnetPrefix = config.bridgeConfig.FixedCIDR
298 300
 	} else {
299
-		ipamV4Conf.PreferredPool = config.bridgeConfig.FixedCIDR
301
+		// TP5 doesn't support properly detecting subnet
302
+		osv := system.GetOSVersion()
303
+		if osv.Build < 14360 {
304
+			subnetPrefix = defaultNetworkSpace
305
+		}
300 306
 	}
301 307
 
302
-	v4Conf := []*libnetwork.IpamConf{&ipamV4Conf}
303
-	v6Conf := []*libnetwork.IpamConf{}
308
+	if subnetPrefix != "" {
309
+		ipamV4Conf := libnetwork.IpamConf{}
310
+		ipamV4Conf.PreferredPool = subnetPrefix
311
+		v4Conf := []*libnetwork.IpamConf{&ipamV4Conf}
312
+		v6Conf := []*libnetwork.IpamConf{}
313
+		ipamOption = libnetwork.NetworkOptionIpam("default", "", v4Conf, v6Conf, nil)
314
+	}
304 315
 
305 316
 	_, err := controller.NewNetwork(string(runconfig.DefaultDaemonNetworkMode()), runconfig.DefaultDaemonNetworkMode().NetworkName(), "",
306 317
 		libnetwork.NetworkOptionGeneric(options.Generic{
307 318
 			netlabel.GenericData: netOption,
308 319
 		}),
309
-		libnetwork.NetworkOptionIpam("default", "", v4Conf, v6Conf, nil),
320
+		ipamOption,
310 321
 	)
311 322
 
312 323
 	if err != nil {
313 324
 		return fmt.Errorf("Error creating default network: %v", err)
314 325
 	}
326
+
315 327
 	return nil
316 328
 }
317 329