Signed-off-by: Madhu Venugopal <madhu@docker.com>
(cherry picked from commit 40c88b8c54fe4595f8bda5417ced3729eea5b16e)
Signed-off-by: Tibor Vass <tibor@docker.com>
| ... | ... |
@@ -810,7 +810,7 @@ func (c *Cluster) CreateService(s types.ServiceSpec, encodedAuth string) (string |
| 810 | 810 |
ctx, cancel := c.getRequestContext() |
| 811 | 811 |
defer cancel() |
| 812 | 812 |
|
| 813 |
- err := populateNetworkID(ctx, c.client, &s) |
|
| 813 |
+ err := c.populateNetworkID(ctx, c.client, &s) |
|
| 814 | 814 |
if err != nil {
|
| 815 | 815 |
return "", err |
| 816 | 816 |
} |
| ... | ... |
@@ -867,7 +867,7 @@ func (c *Cluster) UpdateService(serviceID string, version uint64, spec types.Ser |
| 867 | 867 |
ctx, cancel := c.getRequestContext() |
| 868 | 868 |
defer cancel() |
| 869 | 869 |
|
| 870 |
- err := populateNetworkID(ctx, c.client, &spec) |
|
| 870 |
+ err := c.populateNetworkID(ctx, c.client, &spec) |
|
| 871 | 871 |
if err != nil {
|
| 872 | 872 |
return err |
| 873 | 873 |
} |
| ... | ... |
@@ -1208,10 +1208,14 @@ func (c *Cluster) RemoveNetwork(input string) error {
|
| 1208 | 1208 |
return nil |
| 1209 | 1209 |
} |
| 1210 | 1210 |
|
| 1211 |
-func populateNetworkID(ctx context.Context, c swarmapi.ControlClient, s *types.ServiceSpec) error {
|
|
| 1211 |
+func (c *Cluster) populateNetworkID(ctx context.Context, client swarmapi.ControlClient, s *types.ServiceSpec) error {
|
|
| 1212 | 1212 |
for i, n := range s.Networks {
|
| 1213 |
- apiNetwork, err := getNetwork(ctx, c, n.Target) |
|
| 1213 |
+ apiNetwork, err := getNetwork(ctx, client, n.Target) |
|
| 1214 | 1214 |
if err != nil {
|
| 1215 |
+ if ln, _ := c.config.Backend.FindNetwork(n.Target); ln != nil && !ln.Info().Dynamic() {
|
|
| 1216 |
+ err = fmt.Errorf("network %s is not eligible for docker services", ln.Name())
|
|
| 1217 |
+ return errors.NewRequestForbiddenError(err) |
|
| 1218 |
+ } |
|
| 1215 | 1219 |
return err |
| 1216 | 1220 |
} |
| 1217 | 1221 |
s.Networks[i].Target = apiNetwork.ID |
| ... | ... |
@@ -10,6 +10,7 @@ import ( |
| 10 | 10 |
"github.com/docker/engine-api/types/events" |
| 11 | 11 |
"github.com/docker/engine-api/types/filters" |
| 12 | 12 |
"github.com/docker/engine-api/types/network" |
| 13 |
+ "github.com/docker/libnetwork" |
|
| 13 | 14 |
"github.com/docker/libnetwork/cluster" |
| 14 | 15 |
networktypes "github.com/docker/libnetwork/types" |
| 15 | 16 |
"golang.org/x/net/context" |
| ... | ... |
@@ -19,6 +20,7 @@ import ( |
| 19 | 19 |
type Backend interface {
|
| 20 | 20 |
CreateManagedNetwork(clustertypes.NetworkCreateRequest) error |
| 21 | 21 |
DeleteManagedNetwork(name string) error |
| 22 |
+ FindNetwork(idName string) (libnetwork.Network, error) |
|
| 22 | 23 |
SetupIngress(req clustertypes.NetworkCreateRequest, nodeIP string) error |
| 23 | 24 |
PullImage(ctx context.Context, image, tag string, metaHeaders map[string][]string, authConfig *types.AuthConfig, outStream io.Writer) error |
| 24 | 25 |
CreateManagedContainer(config types.ContainerCreateConfig, validateHostname bool) (types.ContainerCreateResponse, error) |