(ctx context.Context, cfg *config.Config, create networktypes.CreateRequest, id string, agent bool)
| 298 | } |
| 299 | |
| 300 | func (daemon *Daemon) createNetwork(ctx context.Context, cfg *config.Config, create networktypes.CreateRequest, id string, agent bool) (*networktypes.CreateResponse, error) { |
| 301 | if network.IsPredefined(create.Name) { |
| 302 | return nil, PredefinedNetworkError(create.Name) |
| 303 | } |
| 304 | |
| 305 | c := daemon.netController |
| 306 | driver := create.Driver |
| 307 | if driver == "" { |
| 308 | driver = c.Config().DefaultDriver |
| 309 | } |
| 310 | |
| 311 | if driver == "overlay" && !daemon.cluster.IsManager() && !agent { |
| 312 | return nil, errdefs.Forbidden(errors.New(`This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.`)) |
| 313 | } |
| 314 | |
| 315 | networkOptions := make(map[string]string) |
| 316 | maps.Copy(networkOptions, create.Options) |
| 317 | if defaultOpts, ok := cfg.DefaultNetworkOpts[driver]; create.ConfigFrom == nil && ok { |
| 318 | for k, v := range defaultOpts { |
| 319 | if _, ok := networkOptions[k]; !ok { |
| 320 | log.G(ctx).WithFields(log.Fields{"driver": driver, "network": id, k: v}).Debug("Applying network default option") |
| 321 | networkOptions[k] = v |
| 322 | } |
| 323 | } |
| 324 | } |
| 325 | |
| 326 | enableIPv4 := true |
| 327 | if create.EnableIPv4 != nil { |
| 328 | enableIPv4 = *create.EnableIPv4 |
| 329 | // Make sure there's no conflicting DefaultNetworkOpts value (it'd be ignored but |
| 330 | // would look wrong in inspect output). |
| 331 | delete(networkOptions, netlabel.EnableIPv4) |
| 332 | } else if v, ok := networkOptions[netlabel.EnableIPv4]; ok { |
| 333 | var err error |
| 334 | if enableIPv4, err = strconv.ParseBool(v); err != nil { |
| 335 | return nil, errdefs.InvalidParameter(fmt.Errorf("driver-opt %q is not a valid bool", netlabel.EnableIPv4)) |
| 336 | } |
| 337 | } |
| 338 | |
| 339 | var enableIPv6 bool |
| 340 | if create.EnableIPv6 != nil { |
| 341 | enableIPv6 = *create.EnableIPv6 |
| 342 | // Make sure there's no conflicting DefaultNetworkOpts value (it'd be ignored but |
| 343 | // would look wrong in inspect output). |
| 344 | delete(networkOptions, netlabel.EnableIPv6) |
| 345 | } else if v, ok := networkOptions[netlabel.EnableIPv6]; ok { |
| 346 | var err error |
| 347 | if enableIPv6, err = strconv.ParseBool(v); err != nil { |
| 348 | return nil, errdefs.InvalidParameter(fmt.Errorf("driver-opt %q is not a valid bool", netlabel.EnableIPv6)) |
| 349 | } |
| 350 | } |
| 351 | |
| 352 | nwOptions := []libnetwork.NetworkOption{ |
| 353 | libnetwork.NetworkOptionEnableIPv4(enableIPv4), |
| 354 | libnetwork.NetworkOptionEnableIPv6(enableIPv6), |
| 355 | libnetwork.NetworkOptionDriverOpts(networkOptions), |
| 356 | libnetwork.NetworkOptionLabels(create.Labels), |
| 357 | libnetwork.NetworkOptionAttachable(create.Attachable), |
no test coverage detected