Browse code

Merge pull request #31795 from dnephin/compose-file-v3.2

Compose file v3.2

Daniel Nephin authored on 2017/03/15 03:10:24
Showing 7 changed files
... ...
@@ -4,6 +4,7 @@ import (
4 4
 	"fmt"
5 5
 	"os"
6 6
 	"sort"
7
+	"strings"
7 8
 	"time"
8 9
 
9 10
 	"github.com/docker/docker/api/types"
... ...
@@ -56,7 +57,7 @@ func convertService(
56 56
 ) (swarm.ServiceSpec, error) {
57 57
 	name := namespace.Scope(service.Name)
58 58
 
59
-	endpoint, err := convertEndpointSpec(service.Ports)
59
+	endpoint, err := convertEndpointSpec(service.Deploy.EndpointMode, service.Ports)
60 60
 	if err != nil {
61 61
 		return swarm.ServiceSpec{}, err
62 62
 	}
... ...
@@ -373,7 +374,7 @@ func (a byPublishedPort) Len() int           { return len(a) }
373 373
 func (a byPublishedPort) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
374 374
 func (a byPublishedPort) Less(i, j int) bool { return a[i].PublishedPort < a[j].PublishedPort }
375 375
 
376
-func convertEndpointSpec(source []composetypes.ServicePortConfig) (*swarm.EndpointSpec, error) {
376
+func convertEndpointSpec(endpointMode string, source []composetypes.ServicePortConfig) (*swarm.EndpointSpec, error) {
377 377
 	portConfigs := []swarm.PortConfig{}
378 378
 	for _, port := range source {
379 379
 		portConfig := swarm.PortConfig{
... ...
@@ -386,7 +387,10 @@ func convertEndpointSpec(source []composetypes.ServicePortConfig) (*swarm.Endpoi
386 386
 	}
387 387
 
388 388
 	sort.Sort(byPublishedPort(portConfigs))
389
-	return &swarm.EndpointSpec{Ports: portConfigs}, nil
389
+	return &swarm.EndpointSpec{
390
+		Mode:  swarm.ResolutionMode(strings.ToLower(endpointMode)),
391
+		Ports: portConfigs,
392
+	}, nil
390 393
 }
391 394
 
392 395
 func convertEnvironment(source map[string]string) []string {
... ...
@@ -156,9 +156,10 @@ func TestConvertEndpointSpec(t *testing.T) {
156 156
 			Published: 80,
157 157
 		},
158 158
 	}
159
-	endpoint, err := convertEndpointSpec(source)
159
+	endpoint, err := convertEndpointSpec("vip", source)
160 160
 
161 161
 	expected := swarm.EndpointSpec{
162
+		Mode: swarm.ResolutionMode(strings.ToLower("vip")),
162 163
 		Ports: []swarm.PortConfig{
163 164
 			{
164 165
 				TargetPort:    8080,
... ...
@@ -977,7 +977,7 @@ func (sbn servicesByName) Less(i, j int) bool { return sbn[i].Name < sbn[j].Name
977 977
 
978 978
 func TestLoadAttachableNetwork(t *testing.T) {
979 979
 	config, err := loadYAML(`
980
-version: "3.1"
980
+version: "3.2"
981 981
 networks:
982 982
   mynet1:
983 983
     driver: overlay
... ...
@@ -985,7 +985,9 @@ networks:
985 985
   mynet2:
986 986
     driver: bridge
987 987
 `)
988
-	assert.NoError(t, err)
988
+	if !assert.NoError(t, err) {
989
+		return
990
+	}
989 991
 
990 992
 	expected := map[string]types.NetworkConfig{
991 993
 		"mynet1": {
... ...
@@ -1003,7 +1005,7 @@ networks:
1003 1003
 
1004 1004
 func TestLoadExpandedPortFormat(t *testing.T) {
1005 1005
 	config, err := loadYAML(`
1006
-version: "3.1"
1006
+version: "3.2"
1007 1007
 services:
1008 1008
   web:
1009 1009
     image: busybox
... ...
@@ -1019,7 +1021,9 @@ services:
1019 1019
         target: 22
1020 1020
         published: 10022
1021 1021
 `)
1022
-	assert.NoError(t, err)
1022
+	if !assert.NoError(t, err) {
1023
+		return
1024
+	}
1023 1025
 
1024 1026
 	expected := []types.ServicePortConfig{
1025 1027
 		{
... ...
@@ -1088,7 +1092,7 @@ services:
1088 1088
 
1089 1089
 func TestLoadExpandedMountFormat(t *testing.T) {
1090 1090
 	config, err := loadYAML(`
1091
-version: "3.1"
1091
+version: "3.2"
1092 1092
 services:
1093 1093
   web:
1094 1094
     image: busybox
... ...
@@ -1100,7 +1104,9 @@ services:
1100 1100
 volumes:
1101 1101
   foo: {}
1102 1102
 `)
1103
-	assert.NoError(t, err)
1103
+	if !assert.NoError(t, err) {
1104
+		return
1105
+	}
1104 1106
 
1105 1107
 	expected := types.ServiceVolumeConfig{
1106 1108
 		Type:     "volume",
... ...
@@ -2,6 +2,7 @@
2 2
 // sources:
3 3
 // data/config_schema_v3.0.json
4 4
 // data/config_schema_v3.1.json
5
+// data/config_schema_v3.2.json
5 6
 // DO NOT EDIT!
6 7
 
7 8
 package schema
... ...
@@ -89,7 +90,7 @@ func dataConfig_schema_v30Json() (*asset, error) {
89 89
 	return a, nil
90 90
 }
91 91
 
92
-var _dataConfig_schema_v31Json = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xec\x5b\xcd\x73\xdc\x28\x16\xbf\xf7\x5f\xa1\x52\x72\x8b\x3f\xb2\xb5\xa9\xad\xda\xdc\xf6\xb8\xa7\x99\xf3\xb8\x3a\x2a\x5a\x7a\xad\x26\x46\x40\x00\xb5\xdd\x49\xf9\x7f\x9f\xd2\x67\x03\x02\x81\xba\xe5\x38\x33\x35\x27\xdb\xe2\xf7\x80\xf7\xfd\x1e\xe0\x1f\x9b\x24\x49\xdf\xcb\xfc\x00\x15\x4a\x3f\x27\xe9\x41\x29\xfe\xf9\xfe\xfe\xab\x64\xf4\xb6\xfb\x7a\xc7\x44\x79\x5f\x08\xb4\x57\xb7\x1f\x3f\xdd\x77\xdf\xde\xa5\x37\x0d\x1d\x2e\x1a\x92\x9c\xd1\x3d\x2e\xb3\x6e\x24\x3b\xfe\xfb\xee\x5f\x77\x0d\x79\x07\x51\x27\x0e\x0d\x88\xed\xbe\x42\xae\xba\x6f\x02\xbe\xd5\x58\x40\x43\xfc\x90\x1e\x41\x48\xcc\x68\xba\xbd\xd9\x34\x63\x5c\x30\x0e\x42\x61\x90\xe9\xe7\xa4\xd9\x5c\x92\x8c\x90\xe1\x83\x36\xad\x54\x02\xd3\x32\x6d\x3f\xbf\xb4\x33\x24\x49\x2a\x41\x1c\x71\xae\xcd\x30\x6e\xf5\xdd\xfd\x79\xfe\xfb\x11\x76\x63\xcf\xaa\x6d\xb6\xfd\xce\x91\x52\x20\xe8\xef\xd3\xbd\xb5\xc3\x5f\x1e\xd0\xed\xf7\xff\xdd\xfe\xf1\xf1\xf6\xbf\x77\xd9\xed\xf6\xc3\x7b\x63\xb8\x91\xaf\x80\x7d\xb7\x7c\x01\x7b\x4c\xb1\xc2\x8c\x8e\xeb\xa7\x23\xf2\xa5\xff\xed\x65\x5c\x18\x15\x45\x0b\x46\xc4\x58\x7b\x8f\x88\x04\x93\x67\x0a\xea\x89\x89\xc7\x10\xcf\x23\xec\x8d\x78\xee\xd7\x77\xf0\x6c\xb2\x73\x64\xa4\xae\x82\x1a\x1c\x50\x6f\xc4\x4c\xb7\xfc\x3a\xfa\x93\x90\x0b\x50\x61\x93\xed\x50\x6f\x66\xb1\xcd\xf2\xd7\x31\xbc\x19\x98\x9e\xc5\x76\x08\x6d\xed\x76\x83\x86\x7b\xbb\x44\xe5\x72\x2f\xbf\xac\x46\x61\x79\xa4\x54\x00\x27\xec\xd4\x7c\xf3\xc8\xa3\x03\x54\x40\x55\x3a\x8a\x20\x49\xd2\x5d\x8d\x49\x61\x4b\x94\x51\xf8\xad\x99\xe2\x41\xfb\x98\x24\x3f\xec\x48\xa6\xcd\xd3\x8e\x1b\x7f\xf9\x15\x3e\x8e\x7b\x78\x19\xc7\x73\x46\x15\x3c\xab\x96\xa9\xf9\xa5\x3b\x11\xb0\xfc\x11\xc4\x1e\x13\x88\xa5\x40\xa2\x94\x33\x22\x23\x58\xaa\x8c\x89\xac\xc0\xb9\x4a\x5f\x2c\xf2\xc9\x7c\x61\x7b\x1a\x49\xb5\xbf\xb6\x1b\xc7\x84\x69\x8e\x78\x86\x8a\xc2\xe0\x03\x09\x81\x4e\xe9\x4d\x92\x62\x05\x95\x74\xb3\x98\xa4\x35\xc5\xdf\x6a\xf8\x7f\x0f\x51\xa2\x06\x7b\xde\x42\x30\xbe\xfe\xc4\xa5\x60\x35\xcf\x38\x12\x8d\x81\xcd\x8b\x3f\xcd\x59\x55\x21\xba\x96\xd5\x2d\xe1\x23\x42\xf2\x8c\x2a\x84\x29\x88\x8c\xa2\x2a\x64\x48\x8d\xd7\x01\x2d\x64\xd6\x25\xfc\x59\x33\xda\x67\x1d\xbd\xb4\x26\x18\xb3\xff\xaa\xfa\x28\xe8\x9c\x61\x77\xd3\x34\xa6\xdd\xec\x2d\xb5\x08\x33\x09\x48\xe4\x87\x0b\xe9\x59\x85\x30\x8d\x91\x1d\x50\x25\x4e\x9c\xe1\xce\x5e\x7e\x39\x43\x00\x7a\xcc\xc6\x58\xb2\x58\x0c\x40\x8f\x58\x30\x5a\x0d\xde\x10\x13\x60\xc6\x20\xdf\xd0\x3f\x73\x26\xc1\x16\x8c\xc5\xa0\x3e\x34\xb2\x6a\xc8\x64\xa0\x78\x18\x18\xbf\x49\x52\x5a\x57\x3b\x10\x4d\x0d\x6b\x20\xf7\x4c\x54\xa8\xd9\xec\xb0\xb6\x36\x6c\x48\xda\x61\x79\xba\x00\x75\x1e\x9a\xb4\x8e\x48\x46\x30\x7d\x5c\xdf\xc4\xe1\x59\x09\x94\x1d\x98\x54\xf1\x31\x5c\x23\x3f\x00\x22\xea\x90\x1f\x20\x7f\x9c\x21\xd7\x51\x06\x35\x93\x2a\xc6\xc8\x71\x85\xca\x30\x88\xe7\x21\x08\x41\x3b\x20\x17\xf1\xb9\xaa\xf0\xb5\x69\x59\x59\x36\x50\x9f\xc5\x4d\x2a\x97\x7e\x38\x94\xf3\x0b\x81\x8f\x20\x62\x13\x38\xe3\xe7\x82\xcb\x1e\x0c\x17\x20\x49\xb8\xfa\x34\xa0\x5f\xee\xba\xe2\x73\xc6\xab\xda\xdf\x08\x49\xb7\x76\xb9\x90\x58\x79\xdf\xf5\xc5\xe2\x30\xae\xa0\x30\xb4\x52\xa1\xbc\xa9\x1b\x04\x48\x8f\x5e\xcf\xd0\xbe\xbb\xc9\x2a\x56\xf8\x0c\x74\x02\xb6\x65\xe3\x8d\xd4\x8b\x13\x61\x72\x51\xfd\x18\xa5\xba\x60\x03\x11\xe0\xc6\xb7\xbd\xd8\x6d\x9e\xb7\x1b\x36\xb1\x16\x87\x08\x46\x12\xc2\xce\xee\x15\xa4\x31\x1b\xe6\xc7\x4f\x91\x36\xe1\xa2\xfd\xcf\x2c\xad\x87\xd4\x3b\x67\x7c\x8d\x1c\x98\xea\xbc\x95\xd6\xdd\x5c\x1b\xd9\x06\xbc\xed\x95\x4b\x78\x8e\x0b\x7f\xac\x68\x23\x84\xee\x60\x9c\x09\x35\xf1\xae\xe5\xe9\xde\x67\xc1\xba\xb8\x86\x38\x75\x4e\xf8\xdd\xe2\x13\x69\x4c\xd4\x1d\x45\x34\xf5\xbf\xa0\x7f\x84\x3d\x23\x9d\x89\x52\x0e\xb4\x42\xa2\x04\xb3\x0d\xc1\x54\x41\x09\xc2\x43\xc0\xeb\x1d\xc1\xf2\x00\xc5\x12\x1a\xc1\x14\xcb\x19\x89\x73\x0c\x67\xfb\x19\xef\x0c\xe6\x84\xdb\xab\x6b\x33\x2e\xf0\x11\x13\x28\x2d\x8e\x77\x8c\x11\x40\xd4\x48\x14\x02\x50\x91\x31\x4a\x4e\x11\x48\xa9\x90\x08\xb6\x7f\x12\xf2\x5a\x60\x75\xca\x18\x57\xab\x57\x85\xf2\x50\x65\x12\x7f\x07\xd3\xf7\xce\x56\xdf\x4f\xb4\xb5\x36\x64\x9d\x67\x25\xaf\xe5\x7e\x3e\xb3\x7d\x25\xb7\x91\xac\x16\xf9\x75\x8e\x33\x8b\xaf\xcd\x20\x37\x0f\x2e\x97\x80\x27\x0e\xdf\xab\x30\x54\x43\xcd\xba\x8a\x33\x50\xcb\x93\xcc\xd5\x65\xb5\xb5\x54\x05\xa6\x19\xe3\x40\x83\xbe\x21\x15\xe3\x59\x29\x50\x0e\x19\x07\x81\x99\x53\x14\x46\x80\x2d\x6a\x81\x9a\xf5\xa7\xd3\x48\x5c\x52\xe4\x8e\x3b\x1a\x54\x55\x7c\x7f\xe1\x21\x80\x52\x61\x67\xaf\x09\xae\xb0\xdf\x69\x1c\x56\x1b\x51\xaf\x75\xb5\x9a\xbb\x44\x9b\x29\xcf\xa2\x42\xf6\x4c\x87\x30\xdf\x20\x44\x74\x06\x07\x24\x16\xa4\x8e\xd6\x31\xf7\x9e\xfc\xe4\xea\x1b\x9c\xfb\x32\x6e\xa6\xda\xf9\x6e\xfa\x8d\x6c\x9d\xf8\x45\xa5\x97\xbd\x8d\xad\xb7\xfa\x71\x3b\x55\x2d\x83\x4d\x5c\x8b\xa1\x72\xae\x01\x19\xa1\xd3\x2b\x96\xe4\x2f\x11\xa1\x0d\x1d\xb5\x70\x87\x6e\x22\xe2\x78\xbf\x52\x64\xec\x7c\xed\xa8\x1f\x5d\x11\x68\x34\x3b\x3c\x39\xf0\x5d\x22\xc9\x38\x39\x8d\x28\x54\x76\xa1\x33\xba\x67\x89\x77\xbb\xfe\x22\xed\xa7\xb0\x42\x59\xce\xb8\x47\xca\xf1\x6c\x2c\xcd\x98\xd6\x29\xc4\x4c\x49\xe9\xf3\xfe\x27\x26\x1e\x9b\xdc\x52\x60\x77\x10\xd8\x58\x24\x0b\xee\x1e\xad\x63\xbb\x61\x02\xd7\xa5\x9a\x0e\x0d\x5e\x42\xce\x5f\xf0\xf5\x20\xef\xe5\x1b\x96\x68\x67\x5d\x3b\xb9\x72\x66\x13\xe4\xc5\x31\x9c\xba\x05\x28\x81\xad\x5b\x81\xa1\xfe\xd1\xd3\x34\xc8\x5f\xf3\xec\x5c\xe1\x0a\x58\xed\x8e\x28\x1b\xdd\x70\x7a\xa2\x54\xbb\x9c\x0c\x28\x55\x43\xda\x3a\x7d\x18\x95\x3a\xb4\xd8\x41\xc5\xc5\xe4\x1e\x01\x9c\xe0\x1c\xc9\x50\x7e\xbf\xe2\x8c\xb6\xe6\x05\x52\x90\x75\x8f\x53\x16\x55\x54\x33\xa5\x14\x47\x02\x11\x02\x04\xcb\x2a\xa6\x34\x49\x0b\x20\xe8\x74\x51\x55\xda\x92\xef\x11\x26\xb5\x80\x0c\xe5\xde\xc8\x6b\x51\x54\x8c\x62\xc5\x9c\x11\x22\x6e\xc9\x0a\x3d\x67\xc3\xb2\x2d\x24\xd4\x30\x98\xbd\x72\xec\xf1\xaa\x66\x09\x5d\x66\x5d\x56\xf4\xce\xa8\xe8\x5c\x42\x7b\x2c\x66\x58\x71\xc2\xba\x00\xd9\x44\x92\xf1\xf4\x3b\x48\x1f\x8c\xd9\x7d\xf3\x9e\x71\x46\x70\x7e\x5a\x8b\xc3\x9c\xd1\x4e\xc8\x31\x06\x71\xa5\x05\x36\xe6\xd0\x74\x18\x15\x57\x41\x67\x6d\x09\x9e\x30\x2d\xd8\xd3\x82\x05\xd7\x33\x25\x4e\x50\x0e\x56\xbc\xbb\x56\xd0\x52\x09\x84\xa9\x5a\x7c\xd9\x73\x2d\x5b\x57\x64\xf3\xd1\x3e\x03\x51\x7f\xc4\x05\xf3\xb8\x2f\xd2\xe7\xbc\x0e\x5e\x89\x54\x50\x31\xe1\x34\xc0\x15\x5e\xbb\x85\x58\x1c\x60\x2b\x64\xb5\xa8\x3b\xb4\x1e\x95\x31\xbe\x7e\x13\x1f\xbe\x27\xdb\x86\x03\x12\xe6\xa8\x5a\xcb\x3b\xa2\x6f\x15\x53\x67\x0e\x4e\xe6\x9b\xcd\xc4\xdf\x70\x86\x76\x1d\xde\x7b\x8f\x90\xf5\x8e\x7a\x7a\xb4\x69\x7d\xbf\xe6\x59\xf3\x8a\x41\x6f\x78\x10\xe0\xd1\xea\xc3\x58\x33\xdf\x8c\xb2\xda\x46\xab\xd8\x7b\x1b\xbf\xde\xfe\xdb\xf2\xdd\x3e\x79\x73\xd5\xf9\x48\x29\x94\x1f\xa2\x5a\x82\x85\x45\xe3\x15\x71\x68\xd2\xb8\x3a\xc3\x50\x8f\xfa\x27\x0a\xfd\x4d\x6c\xf6\xe7\xd9\x57\xff\xe0\x36\xf8\xd2\xb5\x45\x5d\x9c\xc7\x23\x9e\x77\xfe\x02\x3a\x7b\x6b\x55\x98\x47\xfb\x9a\x4a\xa6\xc7\x03\x73\x92\x8c\x7e\x7f\xd0\x53\x6c\xcd\x6d\xd8\x30\xc7\xff\x44\x98\xc9\x74\xee\xe2\x6f\x80\x78\x8e\xa3\xac\x45\x7b\x21\xce\x73\xbe\x62\xb0\xb9\xfb\x30\x53\x32\xcc\xbd\x13\x7a\xa5\x5c\xbb\xc2\xa5\xaa\x5b\xa7\x56\x9f\x31\x48\x77\xfa\xce\xdd\xe3\xff\x1a\xfd\xe4\xd5\x7b\xc3\x27\x3d\x4d\x8e\xaf\x7e\x98\xc7\xe8\xdd\x8b\xf5\xad\x21\x1f\x0b\xd2\xbd\xba\xd3\xa2\xfb\x56\x6f\xbd\x7c\x6a\x74\xbe\x85\xb7\x0f\xf1\x87\x37\xe9\x9e\x7b\xc5\x8d\xfe\xb3\xfd\xff\x81\xcd\xcb\xe6\xcf\x00\x00\x00\xff\xff\xea\x87\x24\xae\xb8\x34\x00\x00")
92
+var _dataConfig_schema_v31Json = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xec\x1a\xcb\x8e\xdb\x36\xf0\xee\xaf\x10\x94\xdc\xe2\xdd\x4d\xd1\xa0\x40\x73\xeb\xb1\xa7\xf6\xdc\x85\x23\xd0\xd2\x58\x66\x96\x22\x19\x92\x72\xd6\x09\xfc\xef\x05\xf5\x32\x45\x91\x22\x6d\x2b\xd9\x45\xd1\xd3\xae\xc5\x99\xe1\xbc\x67\x38\xe4\xf7\x55\x92\xa4\x6f\x65\xbe\x87\x0a\xa5\x1f\x93\x74\xaf\x14\xff\xf8\xf0\xf0\x59\x32\x7a\xd7\x7e\xbd\x67\xa2\x7c\x28\x04\xda\xa9\xbb\xf7\x1f\x1e\xda\x6f\x6f\xd2\xb5\xc6\xc3\x85\x46\xc9\x19\xdd\xe1\x32\x6b\x57\xb2\xc3\xaf\xf7\xbf\xdc\x6b\xf4\x16\x44\x1d\x39\x68\x20\xb6\xfd\x0c\xb9\x6a\xbf\x09\xf8\x52\x63\x01\x1a\xf9\x31\x3d\x80\x90\x98\xd1\x74\xb3\x5e\xe9\x35\x2e\x18\x07\xa1\x30\xc8\xf4\x63\xa2\x99\x4b\x92\x01\xa4\xff\x60\x90\x95\x4a\x60\x5a\xa6\xcd\xe7\x53\x43\x21\x49\x52\x09\xe2\x80\x73\x83\xc2\xc0\xea\x9b\x87\x33\xfd\x87\x01\x6c\x6d\x53\x35\x98\x6d\xbe\x73\xa4\x14\x08\xfa\xf7\x94\xb7\x66\xf9\xd3\x23\xba\xfb\xf6\xc7\xdd\x3f\xef\xef\x7e\xbf\xcf\xee\x36\xef\xde\x8e\x96\xb5\x7e\x05\xec\xda\xed\x0b\xd8\x61\x8a\x15\x66\x74\xd8\x3f\x1d\x20\x4f\xdd\x7f\xa7\x61\x63\x54\x14\x0d\x30\x22\xa3\xbd\x77\x88\x48\x18\xcb\x4c\x41\x7d\x65\xe2\x29\x24\xf3\x00\xf6\x42\x32\x77\xfb\x3b\x64\x1e\x8b\x73\x60\xa4\xae\x82\x16\xec\xa1\x5e\x48\x98\x76\xfb\x65\xec\x27\x21\x17\xa0\xc2\x2e\xdb\x42\xbd\x98\xc7\xea\xed\x6f\x13\x78\xd5\x0b\x3d\x0b\xdb\x42\x18\x7b\x37\x0c\x8e\xc2\xdb\xa5\x2a\x57\x78\xf9\x75\x35\x28\xcb\xa3\xa5\x02\x38\x61\x47\xfd\xcd\xa3\x8f\x16\xa0\x02\xaa\xd2\x41\x05\x49\x92\x6e\x6b\x4c\x0a\x5b\xa3\x8c\xc2\x5f\x9a\xc4\xa3\xf1\x31\x49\xbe\xdb\x99\xcc\xa0\xd3\xac\x8f\x7e\xf9\x0d\x3e\xac\x7b\x64\x19\xd6\x73\x46\x15\x3c\xab\x46\xa8\xf9\xad\x5b\x15\xb0\xfc\x09\xc4\x0e\x13\x88\xc5\x40\xa2\x94\x33\x2a\x23\x58\xaa\x8c\x89\xac\xc0\xb9\x4a\x4f\x16\xfa\x84\x5e\xd8\x9f\x06\x54\xe3\xd7\x66\xe5\x20\x98\xe6\x88\x67\xa8\x28\x46\x72\x20\x21\xd0\x31\x5d\x27\x29\x56\x50\x49\xb7\x88\x49\x5a\x53\xfc\xa5\x86\x3f\x3b\x10\x25\x6a\xb0\xe9\x16\x82\xf1\xe5\x09\x97\x82\xd5\x3c\xe3\x48\x68\x07\x9b\x57\x7f\x9a\xb3\xaa\x42\x74\x29\xaf\xbb\x44\x8e\x08\xcd\x33\xaa\x10\xa6\x20\x32\x8a\xaa\x90\x23\xe9\xa8\x03\x5a\xc8\xac\x2d\xf8\xb3\x6e\xb4\xcb\x5a\x7c\x69\x11\x18\xaa\xff\xa2\xf6\x28\xe8\x9c\x63\xb7\x64\xb4\x6b\x6b\xde\x52\x0b\x31\x93\x80\x44\xbe\xbf\x12\x9f\x55\x08\xd3\x18\xdd\x01\x55\xe2\xc8\x19\x6e\xfd\xe5\xd5\x39\x02\xd0\x43\x36\xe4\x92\x8b\xd5\x00\xf4\x80\x05\xa3\x55\x1f\x0d\x31\x09\x66\x48\xf2\x1a\xff\x99\x33\x09\xb6\x62\x2c\x01\xcd\xa5\x41\xd4\x91\x4e\x7a\x8c\xc7\x5e\xf0\x75\x92\xd2\xba\xda\x82\xd0\x3d\xec\x08\x72\xc7\x44\x85\x34\xb3\xfd\xde\xc6\xf2\x48\xd3\x0e\xcf\x33\x15\x68\xca\xa0\xcb\x3a\x22\x19\xc1\xf4\x69\x79\x17\x87\x67\x25\x50\xb6\x67\x52\xc5\xe7\x70\x03\x7d\x0f\x88\xa8\x7d\xbe\x87\xfc\x69\x06\xdd\x84\x1a\x61\x33\xa9\x62\x9c\x1c\x57\xa8\x0c\x03\xf1\x3c\x04\x42\xd0\x16\xc8\x55\x72\x2e\xaa\x7c\x83\x2c\x2b\x4b\x0d\xea\xf3\xb8\x49\xe7\xd2\x2d\x87\x6a\x7e\x21\xf0\x01\x44\x6c\x01\x67\xfc\xdc\x70\xd9\x8b\xe1\x06\x24\x09\x77\x9f\x23\xd0\x4f\xf7\x6d\xf3\x39\x13\x55\xcd\x7f\x84\xa4\x1b\xbb\x5d\x48\xac\xba\xef\xfa\x62\x49\x18\xd7\x50\x8c\xac\x52\xa1\x5c\xf7\x0d\x02\xa4\xc7\xae\x67\xd0\xee\x74\x93\x55\xac\xf0\x39\xe8\x04\xd8\xd6\x8d\x37\x53\x5f\x5c\x08\x93\xab\xfa\xc7\x28\xd3\x05\x0f\x10\x01\x69\x7c\xec\xc5\xb2\x79\x66\x37\xec\x62\x0d\x1c\x22\x18\x49\x08\x07\xbb\x57\x91\x23\x6a\x98\x1f\x3e\x44\xfa\x84\x0b\xf7\xb7\x59\x5c\x0f\xaa\x97\x66\x7c\x8f\x1c\x20\x75\x66\xa5\x09\x37\x17\x23\x9b\x40\xb4\xfd\xe0\x16\x9e\xe3\xc2\x9f\x2b\x9a\x0c\x61\x06\x18\x67\x42\x4d\xa2\xeb\xe7\x94\xfb\x76\xeb\x9b\xab\x3d\x17\xf8\x80\x09\x94\x30\x3e\xb5\x6c\x19\x23\x80\xe8\x28\xf5\x08\x40\x45\xc6\x28\x39\x46\x40\x4a\x85\x44\xf0\x40\x21\x21\xaf\x05\x56\xc7\x8c\x71\xb5\x78\x9f\x21\xf7\x55\x26\xf1\x37\x18\x5b\xf3\x9c\xef\x3b\x42\x1b\x8b\x21\x6b\x42\x72\xa5\x41\x7d\x29\x29\x1c\xc6\x8e\x44\x18\x4c\x54\xe1\x14\x95\x4a\x56\x8b\x3c\xf6\x80\xad\xf7\x44\xa2\x84\xd8\x23\xbc\x76\xb7\x71\xd8\xcc\x03\x97\x97\x00\x4f\x0a\x5d\x67\xc2\x50\x55\xb6\x7f\x9b\x79\xe5\xe4\x0c\x7d\x79\x94\xb9\xba\xae\x5b\x93\xaa\xc0\x34\x63\x1c\x68\x30\x36\xa4\x62\x3c\x2b\x05\xca\x21\xe3\x20\x30\x73\xaa\x62\x6d\x46\x7a\x51\x0b\xa4\xf7\x9f\x92\x91\xb8\xa4\x88\x84\xc2\x4c\x55\x7c\x77\xe5\xb1\x52\xa9\x70\xb0\xd7\x04\x57\xd8\x1f\x34\x0e\xaf\x8d\xe8\x00\xda\xea\xef\x2e\xfa\x33\x05\xff\xcc\x29\xa6\x0a\x4a\xed\x26\x53\xa7\x9a\xe9\x39\xe7\x5b\xce\x88\x5e\x73\x8f\xc4\xd8\xa0\x33\x7c\x24\x6d\x60\xee\x94\x1b\xc1\xd5\x89\x3a\xf9\x1a\xdd\x75\x34\xf4\xd6\x1d\x23\x1b\x27\xfc\x45\xc5\xdc\x66\x63\xe3\xad\xa7\xee\xa0\xaa\x65\xf0\x58\xd0\xc0\x50\x39\xd7\xd2\x0e\xa0\xc6\xd0\x7e\xd1\x6a\xa1\xdb\x64\x1d\x04\x05\x76\x73\xbb\xb2\x24\xbb\x60\xec\x6e\x9d\x58\x7b\x02\xae\x79\xb2\x09\x1a\x9c\xbf\xcf\xcf\xb6\x3b\x20\xef\xdc\x19\x4b\xb4\xb5\x26\xae\xae\xe0\xd6\xde\x28\x0e\xe1\x1c\x23\x40\x09\x6c\xd9\xa5\x4f\xd4\x66\x3e\x01\xf9\x3a\xc7\x46\x0a\x57\xc0\x6a\x77\xc1\x5b\x99\xfe\xdd\x21\xa5\xc6\x5c\x3e\x60\x54\x03\xd2\xb6\xe9\xe3\x60\xd4\xbe\xbb\x0c\x1a\x2e\x26\x48\x04\x70\x82\x73\x24\x43\x89\xe8\x86\xf1\x44\xcd\x0b\xa4\x20\x6b\xef\x65\x2f\x4a\xfd\x33\x39\x9f\x23\x81\x08\x01\x82\x65\x15\x93\x43\xd3\x02\x08\x3a\x5e\x55\x3e\x1b\xf4\x1d\xc2\xa4\x16\x90\xa1\x5c\x75\x57\xbf\x01\x9f\x4b\x2b\x46\xb1\x62\xce\x0c\x11\xb7\x65\x85\x9e\xb3\x7e\xdb\x06\x24\xd4\xd9\x8c\x9b\xfa\xd8\xc9\x82\xe1\x09\x6d\xe3\x77\x59\x75\x9e\x31\xd1\xb9\xd6\x7b\x3c\xa6\xdf\x71\x22\xba\x00\xa9\x33\xc9\x30\xf8\x09\xe2\x07\x4b\x4b\x77\xca\xc8\x38\x23\x38\x3f\x2e\x25\x61\xce\x68\xab\xe4\x18\x87\xb8\xd1\x03\xb5\x3b\xe8\x56\xa8\xe2\x2a\x18\xac\x0d\xc2\x57\x4c\x0b\xf6\xf5\x82\x0d\x97\x73\x25\x4e\x50\x0e\x56\xbe\xbb\x55\xd1\x52\x09\x84\xa9\xba\xb8\x9c\xdf\x2a\xd6\x0d\xd5\x7c\xf0\xcf\x40\xd6\x1f\xe0\xc2\xf7\xe8\x9e\x4c\x9f\xf3\x3a\x38\x0d\xac\xa0\x62\xc2\xe9\x80\x0b\x3c\xf4\x08\x89\xd8\x83\x2d\x50\xd5\xa2\xc6\xc7\x1d\x54\xc6\xf8\xf2\xa7\x8d\xf0\x88\x78\x13\x4e\x48\x98\xa3\x6a\xa9\xe8\x88\x1e\xa8\xa7\xce\x1a\x9c\xcc\xcf\x2d\x12\xff\xec\x22\xc4\x75\x98\xf7\x0e\x42\xd6\x5b\xea\x19\x21\x4c\x4f\x19\xae\x5b\xfe\xf8\x63\xca\xc9\x7f\x28\xb9\x2d\xe9\xf5\x77\x61\x1e\xab\x3e\x0e\x3d\xf3\x7a\xd0\xd5\x26\xda\xc4\xde\x8b\xa8\xe5\xf8\x6f\xda\x77\x7b\x44\xe0\xea\xf3\x2f\xec\x04\x6f\x48\x2e\xdd\x8b\xa6\x40\x6e\xe9\xa0\xfe\x4f\x2d\xff\x11\x47\xfc\x79\xfe\xd5\x3d\x20\x0b\xbe\xdc\x6a\xa0\xae\x2e\xce\x11\xcf\x95\x5e\x81\xcd\x5e\xda\x14\xe3\xc1\xa2\x61\x92\xe9\x99\x7f\x4e\x93\xd1\xf7\x69\x1d\xc6\x66\xcc\x86\x0d\xe6\x78\xe3\x3b\xae\x90\x73\x83\xa4\x1e\xc4\x73\xbf\x62\x6d\xda\x29\x71\x5e\xf2\x05\x93\xcd\xfd\xbb\x99\x3e\x60\xee\xde\xfb\x07\x15\xd0\x05\x86\x74\x6e\x9b\x5a\x87\x87\x5e\xbb\xd3\x77\x9b\x9e\xf8\x37\xf0\x27\xaf\x38\xb5\x9c\xf4\x38\x99\x49\x7d\x1f\x0f\x5a\xdb\x17\x98\x9b\x91\x7e\x2c\x90\xf6\x15\x89\x91\xdd\x37\xe6\x79\xca\x67\x46\xe7\xdb\x4e\x7b\xcc\xdb\xbf\xb1\xf4\xdc\x6a\xac\xcc\xbf\xcd\x7b\xd8\xd5\x69\xf5\x6f\x00\x00\x00\xff\xff\xfc\xf3\x11\x6a\x88\x2f\x00\x00")
93 93
 
94 94
 func dataConfig_schema_v31JsonBytes() ([]byte, error) {
95 95
 	return bindataRead(
... ...
@@ -109,6 +110,26 @@ func dataConfig_schema_v31Json() (*asset, error) {
109 109
 	return a, nil
110 110
 }
111 111
 
112
+var _dataConfig_schema_v32Json = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xec\x5b\xcd\x73\xdc\x28\x16\xbf\xf7\x5f\xa1\x52\x72\x8b\x3f\xb2\xb5\xa9\xad\xda\xdc\xf6\xb8\xa7\x99\xf3\xb8\x3a\x2a\x1a\xbd\x56\x13\x4b\x40\x00\xb5\xdd\x49\xf9\x7f\x9f\xd2\x67\x03\x02\x81\xba\xe5\x38\x33\x35\x27\xdb\xe2\xf7\x80\xf7\xfd\x1e\xe0\x1f\x9b\x24\x49\xdf\x4b\x7c\x80\x0a\xa5\x9f\x93\xf4\xa0\x14\xff\x7c\x7f\xff\x55\x32\x7a\xdb\x7d\xbd\x63\xa2\xb8\xcf\x05\xda\xab\xdb\x8f\x9f\xee\xbb\x6f\xef\xd2\x9b\x86\x8e\xe4\x0d\x09\x66\x74\x4f\x8a\xac\x1b\xc9\x8e\xff\xbe\xfb\xd7\x5d\x43\xde\x41\xd4\x89\x43\x03\x62\xbb\xaf\x80\x55\xf7\x4d\xc0\xb7\x9a\x08\x68\x88\x1f\xd2\x23\x08\x49\x18\x4d\xb7\x37\x9b\x66\x8c\x0b\xc6\x41\x28\x02\x32\xfd\x9c\x34\x9b\x4b\x92\x11\x32\x7c\xd0\xa6\x95\x4a\x10\x5a\xa4\xed\xe7\x97\x76\x86\x24\x49\x25\x88\x23\xc1\xda\x0c\xe3\x56\xdf\xdd\x9f\xe7\xbf\x1f\x61\x37\xf6\xac\xda\x66\xdb\xef\x1c\x29\x05\x82\xfe\x3e\xdd\x5b\x3b\xfc\xe5\x01\xdd\x7e\xff\xdf\xed\x1f\x1f\x6f\xff\x7b\x97\xdd\x6e\x3f\xbc\x37\x86\x1b\xf9\x0a\xd8\x77\xcb\xe7\xb0\x27\x94\x28\xc2\xe8\xb8\x7e\x3a\x22\x5f\xfa\xdf\x5e\xc6\x85\x51\x9e\xb7\x60\x54\x1a\x6b\xef\x51\x29\xc1\xe4\x99\x82\x7a\x62\xe2\x31\xc4\xf3\x08\x7b\x23\x9e\xfb\xf5\x1d\x3c\x9b\xec\x1c\x59\x59\x57\x41\x0d\x0e\xa8\x37\x62\xa6\x5b\x7e\x1d\xfd\x49\xc0\x02\x54\xd8\x64\x3b\xd4\x9b\x59\x6c\xb3\xfc\x75\x0c\x6f\x06\xa6\x67\xb1\x1d\x42\x5b\xbb\xdd\xa0\xe1\xde\x2e\x51\xb9\xdc\xcb\x2f\xab\x51\x58\x1e\x29\xe5\xc0\x4b\x76\x6a\xbe\x79\xe4\xd1\x01\x2a\xa0\x2a\x1d\x45\x90\x24\xe9\xae\x26\x65\x6e\x4b\x94\x51\xf8\xad\x99\xe2\x41\xfb\x98\x24\x3f\xec\x48\xa6\xcd\xd3\x8e\x1b\x7f\xf9\x15\x3e\x8e\x7b\x78\x19\xc7\x31\xa3\x0a\x9e\x55\xcb\xd4\xfc\xd2\x9d\x08\x18\x7e\x04\xb1\x27\x25\xc4\x52\x20\x51\xc8\x19\x91\x95\x44\xaa\x8c\x89\x2c\x27\x58\x39\xe9\x31\xc2\x07\xc8\xf6\x82\x55\xc1\x59\xf6\x59\xb7\x0f\x99\xbe\x58\xf3\x4c\x26\x0e\x1b\xe6\x48\xaa\xfd\xb5\xdd\x38\x26\x4c\x31\xe2\x19\xca\x73\x43\x20\x48\x08\x74\x4a\x6f\x92\x94\x28\xa8\xa4\x5b\x56\x49\x5a\x53\xf2\xad\x86\xff\xf7\x10\x25\x6a\xb0\xe7\xcd\x05\xe3\xeb\x4f\x5c\x08\x56\xf3\x8c\x23\xd1\x58\xea\xbc\x1e\x53\xcc\xaa\x0a\xd1\xb5\xcc\x77\x09\x1f\x11\x92\x67\x54\x21\x42\x41\x64\x14\x55\x21\x8b\x6c\xdc\x17\x68\x2e\xb3\xae\x72\x88\xb5\x24\x63\x82\xb1\x8c\x58\x55\x1f\x39\x9d\xf3\x90\x6e\x9a\xc6\x47\x9a\xbd\xa5\x16\x61\x26\x01\x09\x7c\xb8\x90\x9e\x55\x88\xd0\x18\xd9\x01\x55\xe2\xc4\x19\xe9\xec\xe5\x97\x33\x04\xa0\xc7\x6c\x0c\x4a\x8b\xc5\x00\xf4\x48\x04\xa3\xd5\xe0\x0d\x71\x91\x4a\xa3\x7f\xe6\x4c\x82\x2d\x18\x8b\x41\x7d\x68\x64\xd5\x90\xc9\x40\xf1\x30\x30\x7e\x93\xa4\xb4\xae\x76\x20\x9a\x62\xd8\x40\xee\x99\xa8\x50\xb3\xd9\x61\x6d\x6d\xd8\x90\xb4\xc3\xf2\x74\x01\xea\x3c\x34\xf5\x01\x2a\xb3\x92\xd0\xc7\xf5\x4d\x1c\x9e\x95\x40\xd9\x81\x49\x75\x49\x32\x48\x0f\x80\x4a\x75\xc0\x07\xc0\x8f\x33\xe4\x3a\xca\xa0\x66\x52\xc5\x18\x39\xa9\x50\x11\x06\x71\x1c\x82\x94\x68\x07\xe5\x45\x7c\xae\x2a\x7c\x6d\x5a\x56\x14\x0d\xd4\x67\x71\x93\x12\xa8\x1f\x0e\x15\x0f\xb9\x20\x47\x10\xb1\x95\x00\xe3\xe7\xca\xcd\x1e\x0c\x57\x32\x49\xb8\x8c\x35\xa0\x5f\xee\xba\x2a\x76\xc6\xab\xda\xdf\xca\x32\xdd\xda\xe5\x42\x62\xe5\x7d\xd7\x17\x8b\xc3\xb8\x82\xc2\xd0\x4a\x85\x70\x53\x37\x08\x90\x1e\xbd\x9e\xa1\x7d\x9b\x94\x55\x2c\xf7\x19\xe8\x04\x6c\xcb\xc6\x1b\xa9\x17\x27\xc2\xe4\xa2\x42\x34\x4a\x75\xc1\x4e\x24\xc0\x8d\x6f\x7b\xb1\xdb\x3c\x6f\x37\x6c\x62\x2d\x0e\x95\x04\x49\x08\x3b\xbb\x57\x90\xc6\x6c\x84\x1f\x3f\x45\xda\x84\x8b\xf6\x3f\xb3\xb4\x1e\x52\xef\x9c\xf1\x35\x72\x60\xaa\xf3\x56\x5a\x77\x73\x6d\x64\x1b\xf0\xb6\x57\x2e\xe1\x39\xc9\xfd\xb1\xa2\x8d\x10\xba\x83\x71\x26\xd4\xc4\xbb\x96\xa7\x7b\x9f\x05\xeb\xe2\x1a\xe2\xd4\x39\xe1\x77\x8b\x4f\xa4\x31\x51\x77\x14\xd1\xd4\xff\x82\xfe\x11\xf6\x8c\x74\x26\x4a\x39\xd0\x0a\x89\x02\xcc\x36\x84\x50\x05\x05\x08\x0f\x01\xaf\x77\x25\x91\x07\xc8\x97\xd0\x08\xa6\x18\x66\x65\x9c\x63\x38\xfb\xd8\x78\x67\x30\x27\xdc\x5e\x5d\x9b\x71\x41\x8e\xa4\x84\xc2\xe2\x78\xc7\x58\x09\x88\x1a\x89\x42\x00\xca\x33\x46\xcb\x53\x04\x52\x2a\x24\x82\xed\x9f\x04\x5c\x0b\xa2\x4e\x19\xe3\x6a\xf5\xaa\x50\x1e\xaa\x4c\x92\xef\x60\xfa\xde\xd9\xea\xfb\x89\xb6\xd6\x86\xac\x83\xb1\xe4\xb5\xdc\xcf\x67\xb6\xaf\xe4\x36\x92\xd5\x02\x5f\xe7\x38\xb3\xf8\xda\x0c\x72\xf3\xe0\x62\x09\x78\xe2\xf0\xbd\x0a\x43\x35\xd4\xac\xab\x38\x03\xb5\x3c\x49\xac\x2e\xab\xad\xa5\xca\x09\xcd\x18\x07\x1a\xf4\x0d\xa9\x18\xcf\x0a\x81\x30\x64\x1c\x04\x61\x4e\x51\x18\x01\x36\xaf\x05\x6a\xd6\x9f\x4e\x23\x49\x41\x91\x3b\xee\x68\x50\x55\xf1\xfd\x85\x87\x00\x4a\x85\x9d\xbd\x2e\x49\x45\xfc\x4e\xe3\xb0\xda\x88\x7a\xad\xab\xd5\xdc\x25\xda\x4c\x79\x16\x15\xb2\x67\x3a\x84\xf9\x06\x21\xa2\x33\x38\x20\xb1\x20\x75\xb4\x8e\xb9\xf7\xe4\x27\x57\xdf\xe0\xdc\x97\x71\xc5\xd5\xce\x77\xd3\x6f\x64\xeb\xc4\x2f\x2a\xbd\xec\x6d\x6c\xbd\xd5\x8f\xdb\xa9\x6a\x19\x6c\xe2\x5a\x0c\x95\x73\x0d\xc8\x08\x9d\xde\xd5\x24\x7f\x89\x08\x6d\xe8\xa8\x85\x3b\x74\x13\x11\xc7\xfb\x95\x22\x63\xe7\x6b\x47\xfd\xe8\x8a\x40\xa3\xd9\x91\xc9\x81\xef\x12\x49\xc6\xc9\x69\x44\xa1\xa2\x0b\x9d\xd1\x3d\x4b\xbc\xdb\xf5\x37\x72\x3f\x85\x15\xca\x30\xe3\x1e\x29\xc7\xb3\xb1\x34\x63\x5a\xa7\x10\x33\x25\xa5\xcf\xfb\x9f\x98\x78\x6c\x72\x4b\x4e\xdc\x41\x60\x63\x91\x2c\xb8\xc4\xb4\x8e\xed\x86\x09\x5c\xb7\x73\x3a\x34\x78\x9b\x39\x7f\x53\xd8\x83\xbc\xb7\x78\x44\xa2\x9d\x75\x7f\xe5\xca\x99\x4d\x90\x17\xc7\x70\xea\x16\xa0\x04\xb1\x6e\x05\x86\xfa\x47\x4f\xd3\x20\x7f\xcd\xb3\x73\x45\x2a\x60\xb5\x3b\xa2\x6c\x74\xc3\xe9\x89\x52\xed\x96\x33\xa0\x54\x0d\x69\xeb\xf4\x61\x54\xea\xd0\x62\x07\x15\x17\x93\x7b\x80\xe6\xed\x2d\x45\x54\xa2\x12\xc0\x4b\x82\x91\x0c\x15\x03\x57\x1c\xe8\xd6\x3c\x47\x0a\xb2\xee\x49\xcc\xa2\xf2\x6b\xa6\xee\xe2\x48\xa0\xb2\x84\x92\xc8\x2a\xa6\x8e\x49\x73\x28\xd1\xe9\xa2\x12\xb6\x25\xdf\x23\x52\xd6\x02\x32\x84\xbd\x61\xda\xa2\xa8\x18\x25\x8a\x39\xc3\x49\xdc\x92\x15\x7a\xce\x86\x65\x5b\x48\xa8\xbb\x30\x1b\xeb\xd8\xb3\x58\xcd\x12\xba\x34\xbc\xac\x42\x9e\x51\xd1\xb9\xde\xf6\x58\xcc\xb0\xe2\x84\x75\x01\xb2\x09\x3b\xe3\x51\x79\x90\x3e\x18\xe0\xfb\x4e\x3f\xe3\xac\x24\xf8\xb4\x16\x87\x98\xd1\x4e\xc8\x31\x06\x71\xa5\x05\x36\xe6\xd0\xb4\x23\x15\x57\x41\x67\x6d\x09\x9e\x08\xcd\xd9\xd3\x82\x05\xd7\x33\x25\x5e\x22\x0c\x56\x70\xbc\x56\xd0\x52\x09\x44\xa8\x5a\x7c\x33\x74\x2d\x5b\x57\xa4\xfe\xd1\x3e\x03\x29\x62\xc4\x05\x93\xbe\x2f\x2d\x60\x5e\x07\xef\x4f\x2a\xa8\x98\x70\x1a\xe0\x0a\x6f\xec\x42\x2c\x0e\xb0\x15\x52\x60\xd4\x85\x5b\x8f\xca\x18\x5f\xbf\xe3\x0f\x5f\xaa\x6d\xc3\x01\x89\x70\x54\xad\xe5\x1d\xd1\x57\x90\xa9\x33\x07\x27\xf3\x9d\x69\xe2\xef\x4e\x43\xbb\x0e\xef\xbd\x47\xc8\x7a\x47\x3d\x0d\xdd\xb4\x19\x58\xf3\x60\x7a\xc5\xa0\x37\xbc\x1e\xf0\x68\xf5\x61\x2c\xb0\x6f\x46\x59\x6d\xa3\x55\xec\xbd\xba\x5f\x6f\xff\x6d\xad\x6f\x1f\xd3\xb9\x9a\x02\xa4\x14\xc2\x87\xa8\xfe\x61\x61\xd1\x78\x45\x1c\x9a\x74\xb9\xce\x30\xd4\xa3\xfe\x89\x42\x7f\x13\x9b\xfd\x79\xf6\xd5\x3f\xf3\x0d\xbe\xaf\x6d\x51\x17\xe7\xf1\x88\x47\xa5\xbf\x80\xce\xde\x5a\x15\xe6\x3d\x80\xa6\x92\xe9\x59\xc2\x9c\x24\x97\x3e\xa4\xdd\x9a\xdb\xb0\x61\x8e\xff\xc4\x30\x93\xe9\xdc\x2d\xe1\x00\xf1\x9c\x5d\x59\x8b\xf6\x42\x9c\xe7\x7c\xc5\x60\x73\xf7\x61\xa6\x64\x98\x7b\x54\xf4\x4a\xb9\x76\x85\x1b\x58\xb7\x4e\xad\x3e\x63\x90\xee\xf4\x75\xbd\xc7\xff\x35\xfa\xc9\x5b\xfb\x86\x4f\x7a\x9a\x9c\x75\xfd\x30\xcf\xdc\xbb\x77\xf2\x5b\x43\x3e\x16\xa4\x7b\xa2\xa7\x45\xf7\xad\xde\x7a\xf9\xd4\xe8\x7c\x81\x6f\x9f\xf8\x0f\x2f\xe1\x3d\x97\x90\x1b\xfd\x67\xfb\x5f\x0b\x9b\x97\xcd\x9f\x01\x00\x00\xff\xff\x0b\x42\x15\x69\x2e\x35\x00\x00")
113
+
114
+func dataConfig_schema_v32JsonBytes() ([]byte, error) {
115
+	return bindataRead(
116
+		_dataConfig_schema_v32Json,
117
+		"data/config_schema_v3.2.json",
118
+	)
119
+}
120
+
121
+func dataConfig_schema_v32Json() (*asset, error) {
122
+	bytes, err := dataConfig_schema_v32JsonBytes()
123
+	if err != nil {
124
+		return nil, err
125
+	}
126
+
127
+	info := bindataFileInfo{name: "data/config_schema_v3.2.json", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
128
+	a := &asset{bytes: bytes, info: info}
129
+	return a, nil
130
+}
131
+
112 132
 // Asset loads and returns the asset for the given name.
113 133
 // It returns an error if the asset could not be found or
114 134
 // could not be loaded.
... ...
@@ -163,6 +184,7 @@ func AssetNames() []string {
163 163
 var _bindata = map[string]func() (*asset, error){
164 164
 	"data/config_schema_v3.0.json": dataConfig_schema_v30Json,
165 165
 	"data/config_schema_v3.1.json": dataConfig_schema_v31Json,
166
+	"data/config_schema_v3.2.json": dataConfig_schema_v32Json,
166 167
 }
167 168
 
168 169
 // AssetDir returns the file names below a certain
... ...
@@ -208,6 +230,7 @@ var _bintree = &bintree{nil, map[string]*bintree{
208 208
 	"data": &bintree{nil, map[string]*bintree{
209 209
 		"config_schema_v3.0.json": &bintree{dataConfig_schema_v30Json, map[string]*bintree{}},
210 210
 		"config_schema_v3.1.json": &bintree{dataConfig_schema_v31Json, map[string]*bintree{}},
211
+		"config_schema_v3.2.json": &bintree{dataConfig_schema_v32Json, map[string]*bintree{}},
211 212
 	}},
212 213
 }}
213 214
 
... ...
@@ -167,20 +167,8 @@
167 167
         "ports": {
168 168
           "type": "array",
169 169
           "items": {
170
-            "oneOf": [
171
-              {"type": "number", "format": "ports"},
172
-              {"type": "string", "format": "ports"},
173
-              {
174
-                "type": "object",
175
-                "properties": {
176
-                  "mode": {"type": "string"},
177
-                  "target": {"type": "integer"},
178
-                  "published": {"type": "integer"},
179
-                  "protocol": {"type": "string"}
180
-                },
181
-                "additionalProperties": false
182
-              }
183
-            ]
170
+            "type": ["string", "number"],
171
+            "format": "ports"
184 172
           },
185 173
           "uniqueItems": true
186 174
         },
... ...
@@ -235,37 +223,7 @@
235 235
         },
236 236
         "user": {"type": "string"},
237 237
         "userns_mode": {"type": "string"},
238
-        "volumes": {
239
-          "type": "array",
240
-          "items": {
241
-            "oneOf": [
242
-              {"type": "string"},
243
-              {
244
-                "type": "object",
245
-                "required": ["type"],
246
-                "properties": {
247
-                  "type": {"type": "string"},
248
-                  "source": {"type": "string"},
249
-                  "target": {"type": "string"},
250
-                  "read_only": {"type": "boolean"},
251
-                  "bind": {
252
-                    "type": "object",
253
-                    "properties": {
254
-                      "propagation": {"type": "string"}
255
-                    }
256
-                  },
257
-                  "volume": {
258
-                    "type": "object",
259
-                    "properties": {
260
-                      "nocopy": {"type": "boolean"}
261
-                    }
262
-                  }
263
-                }
264
-              }
265
-            ],
266
-            "uniqueItems": true
267
-          }
268
-        },
238
+        "volumes": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
269 239
         "working_dir": {"type": "string"}
270 240
       },
271 241
       "additionalProperties": false
... ...
@@ -380,7 +338,6 @@
380 380
           "additionalProperties": false
381 381
         },
382 382
         "internal": {"type": "boolean"},
383
-        "attachable": {"type": "boolean"},
384 383
         "labels": {"$ref": "#/definitions/list_or_dict"}
385 384
       },
386 385
       "additionalProperties": false
387 386
new file mode 100644
... ...
@@ -0,0 +1,473 @@
0
+{
1
+  "$schema": "http://json-schema.org/draft-04/schema#",
2
+  "id": "config_schema_v3.1.json",
3
+  "type": "object",
4
+  "required": ["version"],
5
+
6
+  "properties": {
7
+    "version": {
8
+      "type": "string"
9
+    },
10
+
11
+    "services": {
12
+      "id": "#/properties/services",
13
+      "type": "object",
14
+      "patternProperties": {
15
+        "^[a-zA-Z0-9._-]+$": {
16
+          "$ref": "#/definitions/service"
17
+        }
18
+      },
19
+      "additionalProperties": false
20
+    },
21
+
22
+    "networks": {
23
+      "id": "#/properties/networks",
24
+      "type": "object",
25
+      "patternProperties": {
26
+        "^[a-zA-Z0-9._-]+$": {
27
+          "$ref": "#/definitions/network"
28
+        }
29
+      }
30
+    },
31
+
32
+    "volumes": {
33
+      "id": "#/properties/volumes",
34
+      "type": "object",
35
+      "patternProperties": {
36
+        "^[a-zA-Z0-9._-]+$": {
37
+          "$ref": "#/definitions/volume"
38
+        }
39
+      },
40
+      "additionalProperties": false
41
+    },
42
+
43
+    "secrets": {
44
+      "id": "#/properties/secrets",
45
+      "type": "object",
46
+      "patternProperties": {
47
+        "^[a-zA-Z0-9._-]+$": {
48
+          "$ref": "#/definitions/secret"
49
+        }
50
+      },
51
+      "additionalProperties": false
52
+    }
53
+  },
54
+
55
+  "additionalProperties": false,
56
+
57
+  "definitions": {
58
+
59
+    "service": {
60
+      "id": "#/definitions/service",
61
+      "type": "object",
62
+
63
+      "properties": {
64
+        "deploy": {"$ref": "#/definitions/deployment"},
65
+        "build": {
66
+          "oneOf": [
67
+            {"type": "string"},
68
+            {
69
+              "type": "object",
70
+              "properties": {
71
+                "context": {"type": "string"},
72
+                "dockerfile": {"type": "string"},
73
+                "args": {"$ref": "#/definitions/list_or_dict"},
74
+                "cache_from": {"$ref": "#/definitions/list_of_strings"}
75
+              },
76
+              "additionalProperties": false
77
+            }
78
+          ]
79
+        },
80
+        "cap_add": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
81
+        "cap_drop": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
82
+        "cgroup_parent": {"type": "string"},
83
+        "command": {
84
+          "oneOf": [
85
+            {"type": "string"},
86
+            {"type": "array", "items": {"type": "string"}}
87
+          ]
88
+        },
89
+        "container_name": {"type": "string"},
90
+        "depends_on": {"$ref": "#/definitions/list_of_strings"},
91
+        "devices": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
92
+        "dns": {"$ref": "#/definitions/string_or_list"},
93
+        "dns_search": {"$ref": "#/definitions/string_or_list"},
94
+        "domainname": {"type": "string"},
95
+        "entrypoint": {
96
+          "oneOf": [
97
+            {"type": "string"},
98
+            {"type": "array", "items": {"type": "string"}}
99
+          ]
100
+        },
101
+        "env_file": {"$ref": "#/definitions/string_or_list"},
102
+        "environment": {"$ref": "#/definitions/list_or_dict"},
103
+
104
+        "expose": {
105
+          "type": "array",
106
+          "items": {
107
+            "type": ["string", "number"],
108
+            "format": "expose"
109
+          },
110
+          "uniqueItems": true
111
+        },
112
+
113
+        "external_links": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
114
+        "extra_hosts": {"$ref": "#/definitions/list_or_dict"},
115
+        "healthcheck": {"$ref": "#/definitions/healthcheck"},
116
+        "hostname": {"type": "string"},
117
+        "image": {"type": "string"},
118
+        "ipc": {"type": "string"},
119
+        "labels": {"$ref": "#/definitions/list_or_dict"},
120
+        "links": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
121
+
122
+        "logging": {
123
+            "type": "object",
124
+
125
+            "properties": {
126
+                "driver": {"type": "string"},
127
+                "options": {
128
+                  "type": "object",
129
+                  "patternProperties": {
130
+                    "^.+$": {"type": ["string", "number", "null"]}
131
+                  }
132
+                }
133
+            },
134
+            "additionalProperties": false
135
+        },
136
+
137
+        "mac_address": {"type": "string"},
138
+        "network_mode": {"type": "string"},
139
+
140
+        "networks": {
141
+          "oneOf": [
142
+            {"$ref": "#/definitions/list_of_strings"},
143
+            {
144
+              "type": "object",
145
+              "patternProperties": {
146
+                "^[a-zA-Z0-9._-]+$": {
147
+                  "oneOf": [
148
+                    {
149
+                      "type": "object",
150
+                      "properties": {
151
+                        "aliases": {"$ref": "#/definitions/list_of_strings"},
152
+                        "ipv4_address": {"type": "string"},
153
+                        "ipv6_address": {"type": "string"}
154
+                      },
155
+                      "additionalProperties": false
156
+                    },
157
+                    {"type": "null"}
158
+                  ]
159
+                }
160
+              },
161
+              "additionalProperties": false
162
+            }
163
+          ]
164
+        },
165
+        "pid": {"type": ["string", "null"]},
166
+
167
+        "ports": {
168
+          "type": "array",
169
+          "items": {
170
+            "oneOf": [
171
+              {"type": "number", "format": "ports"},
172
+              {"type": "string", "format": "ports"},
173
+              {
174
+                "type": "object",
175
+                "properties": {
176
+                  "mode": {"type": "string"},
177
+                  "target": {"type": "integer"},
178
+                  "published": {"type": "integer"},
179
+                  "protocol": {"type": "string"}
180
+                },
181
+                "additionalProperties": false
182
+              }
183
+            ]
184
+          },
185
+          "uniqueItems": true
186
+        },
187
+
188
+        "privileged": {"type": "boolean"},
189
+        "read_only": {"type": "boolean"},
190
+        "restart": {"type": "string"},
191
+        "security_opt": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
192
+        "shm_size": {"type": ["number", "string"]},
193
+        "secrets": {
194
+          "type": "array",
195
+          "items": {
196
+            "oneOf": [
197
+              {"type": "string"},
198
+              {
199
+                "type": "object",
200
+                "properties": {
201
+                  "source": {"type": "string"},
202
+                  "target": {"type": "string"},
203
+                  "uid": {"type": "string"},
204
+                  "gid": {"type": "string"},
205
+                  "mode": {"type": "number"}
206
+                }
207
+              }
208
+            ]
209
+          }
210
+        },
211
+        "sysctls": {"$ref": "#/definitions/list_or_dict"},
212
+        "stdin_open": {"type": "boolean"},
213
+        "stop_grace_period": {"type": "string", "format": "duration"},
214
+        "stop_signal": {"type": "string"},
215
+        "tmpfs": {"$ref": "#/definitions/string_or_list"},
216
+        "tty": {"type": "boolean"},
217
+        "ulimits": {
218
+          "type": "object",
219
+          "patternProperties": {
220
+            "^[a-z]+$": {
221
+              "oneOf": [
222
+                {"type": "integer"},
223
+                {
224
+                  "type":"object",
225
+                  "properties": {
226
+                    "hard": {"type": "integer"},
227
+                    "soft": {"type": "integer"}
228
+                  },
229
+                  "required": ["soft", "hard"],
230
+                  "additionalProperties": false
231
+                }
232
+              ]
233
+            }
234
+          }
235
+        },
236
+        "user": {"type": "string"},
237
+        "userns_mode": {"type": "string"},
238
+        "volumes": {
239
+          "type": "array",
240
+          "items": {
241
+            "oneOf": [
242
+              {"type": "string"},
243
+              {
244
+                "type": "object",
245
+                "required": ["type"],
246
+                "properties": {
247
+                  "type": {"type": "string"},
248
+                  "source": {"type": "string"},
249
+                  "target": {"type": "string"},
250
+                  "read_only": {"type": "boolean"},
251
+                  "bind": {
252
+                    "type": "object",
253
+                    "properties": {
254
+                      "propagation": {"type": "string"}
255
+                    }
256
+                  },
257
+                  "volume": {
258
+                    "type": "object",
259
+                    "properties": {
260
+                      "nocopy": {"type": "boolean"}
261
+                    }
262
+                  }
263
+                }
264
+              }
265
+            ],
266
+            "uniqueItems": true
267
+          }
268
+        },
269
+        "working_dir": {"type": "string"}
270
+      },
271
+      "additionalProperties": false
272
+    },
273
+
274
+    "healthcheck": {
275
+      "id": "#/definitions/healthcheck",
276
+      "type": "object",
277
+      "additionalProperties": false,
278
+      "properties": {
279
+        "disable": {"type": "boolean"},
280
+        "interval": {"type": "string"},
281
+        "retries": {"type": "number"},
282
+        "test": {
283
+          "oneOf": [
284
+            {"type": "string"},
285
+            {"type": "array", "items": {"type": "string"}}
286
+          ]
287
+        },
288
+        "timeout": {"type": "string"}
289
+      }
290
+    },
291
+    "deployment": {
292
+      "id": "#/definitions/deployment",
293
+      "type": ["object", "null"],
294
+      "properties": {
295
+        "mode": {"type": "string"},
296
+        "endpoint_mode": {"type": "string"},
297
+        "replicas": {"type": "integer"},
298
+        "labels": {"$ref": "#/definitions/list_or_dict"},
299
+        "update_config": {
300
+          "type": "object",
301
+          "properties": {
302
+            "parallelism": {"type": "integer"},
303
+            "delay": {"type": "string", "format": "duration"},
304
+            "failure_action": {"type": "string"},
305
+            "monitor": {"type": "string", "format": "duration"},
306
+            "max_failure_ratio": {"type": "number"}
307
+          },
308
+          "additionalProperties": false
309
+        },
310
+        "resources": {
311
+          "type": "object",
312
+          "properties": {
313
+            "limits": {"$ref": "#/definitions/resource"},
314
+            "reservations": {"$ref": "#/definitions/resource"}
315
+          }
316
+        },
317
+        "restart_policy": {
318
+          "type": "object",
319
+          "properties": {
320
+            "condition": {"type": "string"},
321
+            "delay": {"type": "string", "format": "duration"},
322
+            "max_attempts": {"type": "integer"},
323
+            "window": {"type": "string", "format": "duration"}
324
+          },
325
+          "additionalProperties": false
326
+        },
327
+        "placement": {
328
+          "type": "object",
329
+          "properties": {
330
+            "constraints": {"type": "array", "items": {"type": "string"}}
331
+          },
332
+          "additionalProperties": false
333
+        }
334
+      },
335
+      "additionalProperties": false
336
+    },
337
+
338
+    "resource": {
339
+      "id": "#/definitions/resource",
340
+      "type": "object",
341
+      "properties": {
342
+        "cpus": {"type": "string"},
343
+        "memory": {"type": "string"}
344
+      },
345
+      "additionalProperties": false
346
+    },
347
+
348
+    "network": {
349
+      "id": "#/definitions/network",
350
+      "type": ["object", "null"],
351
+      "properties": {
352
+        "driver": {"type": "string"},
353
+        "driver_opts": {
354
+          "type": "object",
355
+          "patternProperties": {
356
+            "^.+$": {"type": ["string", "number"]}
357
+          }
358
+        },
359
+        "ipam": {
360
+          "type": "object",
361
+          "properties": {
362
+            "driver": {"type": "string"},
363
+            "config": {
364
+              "type": "array",
365
+              "items": {
366
+                "type": "object",
367
+                "properties": {
368
+                  "subnet": {"type": "string"}
369
+                },
370
+                "additionalProperties": false
371
+              }
372
+            }
373
+          },
374
+          "additionalProperties": false
375
+        },
376
+        "external": {
377
+          "type": ["boolean", "object"],
378
+          "properties": {
379
+            "name": {"type": "string"}
380
+          },
381
+          "additionalProperties": false
382
+        },
383
+        "internal": {"type": "boolean"},
384
+        "attachable": {"type": "boolean"},
385
+        "labels": {"$ref": "#/definitions/list_or_dict"}
386
+      },
387
+      "additionalProperties": false
388
+    },
389
+
390
+    "volume": {
391
+      "id": "#/definitions/volume",
392
+      "type": ["object", "null"],
393
+      "properties": {
394
+        "driver": {"type": "string"},
395
+        "driver_opts": {
396
+          "type": "object",
397
+          "patternProperties": {
398
+            "^.+$": {"type": ["string", "number"]}
399
+          }
400
+        },
401
+        "external": {
402
+          "type": ["boolean", "object"],
403
+          "properties": {
404
+            "name": {"type": "string"}
405
+          },
406
+          "additionalProperties": false
407
+        },
408
+        "labels": {"$ref": "#/definitions/list_or_dict"}
409
+      },
410
+      "additionalProperties": false
411
+    },
412
+
413
+    "secret": {
414
+      "id": "#/definitions/secret",
415
+      "type": "object",
416
+      "properties": {
417
+        "file": {"type": "string"},
418
+        "external": {
419
+          "type": ["boolean", "object"],
420
+          "properties": {
421
+            "name": {"type": "string"}
422
+          }
423
+        },
424
+        "labels": {"$ref": "#/definitions/list_or_dict"}
425
+      },
426
+      "additionalProperties": false
427
+    },
428
+
429
+    "string_or_list": {
430
+      "oneOf": [
431
+        {"type": "string"},
432
+        {"$ref": "#/definitions/list_of_strings"}
433
+      ]
434
+    },
435
+
436
+    "list_of_strings": {
437
+      "type": "array",
438
+      "items": {"type": "string"},
439
+      "uniqueItems": true
440
+    },
441
+
442
+    "list_or_dict": {
443
+      "oneOf": [
444
+        {
445
+          "type": "object",
446
+          "patternProperties": {
447
+            ".+": {
448
+              "type": ["string", "number", "null"]
449
+            }
450
+          },
451
+          "additionalProperties": false
452
+        },
453
+        {"type": "array", "items": {"type": "string"}, "uniqueItems": true}
454
+      ]
455
+    },
456
+
457
+    "constraints": {
458
+      "service": {
459
+        "id": "#/definitions/constraints/service",
460
+        "anyOf": [
461
+          {"required": ["build"]},
462
+          {"required": ["image"]}
463
+        ],
464
+        "properties": {
465
+          "build": {
466
+            "required": ["context"]
467
+          }
468
+        }
469
+      }
470
+    }
471
+  }
472
+}
... ...
@@ -156,6 +156,7 @@ type DeployConfig struct {
156 156
 	Resources     Resources
157 157
 	RestartPolicy *RestartPolicy `mapstructure:"restart_policy"`
158 158
 	Placement     Placement
159
+	EndpointMode  string
159 160
 }
160 161
 
161 162
 // HealthCheckConfig the healthcheck configuration for a service