Browse code

improve error message when using ineligible network with service create

Signed-off-by: Madhu Venugopal <madhu@docker.com>
(cherry picked from commit 40c88b8c54fe4595f8bda5417ced3729eea5b16e)
Signed-off-by: Tibor Vass <tibor@docker.com>

Madhu Venugopal authored on 2016/07/24 00:11:10
Showing 2 changed files
... ...
@@ -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)