|
@@ -161,6 +161,24 @@ func validateEndpointSpec(epSpec *api.EndpointSpec) error {
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
+func (s *Server) validateNetworks(networks []*api.ServiceSpec_NetworkAttachmentConfig) error {
|
|
|
+ for _, na := range networks {
|
|
|
+ var network *api.Network
|
|
|
+ s.store.View(func(tx store.ReadTx) {
|
|
|
+ network = store.FindNetwork(tx, na.Target)
|
|
|
+ })
|
|
|
+ if network == nil {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ if _, ok := network.Spec.Annotations.Labels["com.docker.swarm.internal"]; ok {
|
|
|
+ return grpc.Errorf(codes.InvalidArgument,
|
|
|
+ "Service cannot be explicitly attached to %q network which is a swarm internal network",
|
|
|
+ network.Spec.Annotations.Name)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
func validateServiceSpec(spec *api.ServiceSpec) error {
|
|
|
if spec == nil {
|
|
|
return grpc.Errorf(codes.InvalidArgument, errInvalidArgument.Error())
|
|
@@ -247,6 +265,10 @@ func (s *Server) CreateService(ctx context.Context, request *api.CreateServiceRe
|
|
|
return nil, err
|
|
|
}
|
|
|
|
|
|
+ if err := s.validateNetworks(request.Spec.Networks); err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
if err := s.checkPortConflicts(request.Spec, ""); err != nil {
|
|
|
return nil, err
|
|
|
}
|