diff --git a/api/swagger.yaml b/api/swagger.yaml index 0ad0b1c076..126a7c8cdc 100644 --- a/api/swagger.yaml +++ b/api/swagger.yaml @@ -9900,7 +9900,9 @@ paths: Id: "22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30" Warning: "" 403: - description: "operation not supported for pre-defined networks" + description: | + Forbidden operation. This happens when trying to create a network named after a pre-defined network, + or when trying to create an overlay network on a daemon which is not part of a Swarm cluster. schema: $ref: "#/definitions/ErrorResponse" 404: diff --git a/daemon/network.go b/daemon/network.go index 66802c3e6e..2b5ac19276 100644 --- a/daemon/network.go +++ b/daemon/network.go @@ -293,6 +293,16 @@ func (daemon *Daemon) createNetwork(cfg *config.Config, create types.NetworkCrea return nil, PredefinedNetworkError(create.Name) } + c := daemon.netController + driver := create.Driver + if driver == "" { + driver = c.Config().DefaultDriver + } + + if driver == "overlay" && !daemon.cluster.IsManager() && !agent { + 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.`)) + } + var warning string nw, err := daemon.GetNetworkByName(create.Name) if err != nil { @@ -311,12 +321,6 @@ func (daemon *Daemon) createNetwork(cfg *config.Config, create types.NetworkCrea warning = fmt.Sprintf("Network with name %s (id : %s) already exists", nw.Name(), nw.ID()) } - c := daemon.netController - driver := create.Driver - if driver == "" { - driver = c.Config().DefaultDriver - } - networkOptions := make(map[string]string) for k, v := range create.Options { networkOptions[k] = v @@ -375,10 +379,6 @@ func (daemon *Daemon) createNetwork(cfg *config.Config, create types.NetworkCrea n, err := c.NewNetwork(driver, create.Name, id, nwOptions...) if err != nil { - if errors.Is(err, libnetwork.ErrDataStoreNotInitialized) { - //nolint: revive - return nil, 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.`) - } return nil, err }