Browse code

Merge pull request #31535 from aaronlehmann/vendor-swarmkit-7fc7503

Vendor swarmkit d60ccf3

Tõnis Tiigi authored on 2017/03/09 02:52:28
Showing 29 changed files
... ...
@@ -5,6 +5,7 @@ package main
5 5
 import (
6 6
 	"encoding/json"
7 7
 	"fmt"
8
+	"io/ioutil"
8 9
 	"net"
9 10
 	"net/http"
10 11
 	"os"
... ...
@@ -13,6 +14,7 @@ import (
13 13
 	"sync"
14 14
 	"time"
15 15
 
16
+	"github.com/cloudflare/cfssl/helpers"
16 17
 	"github.com/docker/docker/api/types"
17 18
 	"github.com/docker/docker/api/types/container"
18 19
 	"github.com/docker/docker/api/types/swarm"
... ...
@@ -176,6 +178,24 @@ func (s *DockerSwarmSuite) TestAPISwarmPromoteDemote(c *check.C) {
176 176
 
177 177
 	waitAndAssert(c, defaultReconciliationTimeout, d2.CheckControlAvailable, checker.False)
178 178
 
179
+	// Wait for the role to change to worker in the cert. This is partially
180
+	// done because it's something worth testing in its own right, and
181
+	// partially because changing the role from manager to worker and then
182
+	// back to manager quickly might cause the node to pause for awhile
183
+	// while waiting for the role to change to worker, and the test can
184
+	// time out during this interval.
185
+	waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) {
186
+		certBytes, err := ioutil.ReadFile(filepath.Join(d2.Folder, "root", "swarm", "certificates", "swarm-node.crt"))
187
+		if err != nil {
188
+			return "", check.Commentf("error: %v", err)
189
+		}
190
+		certs, err := helpers.ParseCertificatesPEM(certBytes)
191
+		if err == nil && len(certs) > 0 && len(certs[0].Subject.OrganizationalUnit) > 0 {
192
+			return certs[0].Subject.OrganizationalUnit[0], nil
193
+		}
194
+		return "", check.Commentf("could not get organizational unit from certificate")
195
+	}, checker.Equals, "swarm-worker")
196
+
179 197
 	// Demoting last node should fail
180 198
 	node := d1.GetNode(c, d1.NodeID)
181 199
 	node.Spec.Role = swarm.NodeRoleWorker
... ...
@@ -38,7 +38,8 @@ func (s *DockerSwarmSuite) TestServiceLogs(c *check.C) {
38 38
 
39 39
 	// make sure task has been deployed.
40 40
 	waitAndAssert(c, defaultReconciliationTimeout,
41
-		d.CheckActiveContainerCount, checker.Equals, len(services))
41
+		d.CheckRunningTaskImages, checker.DeepEquals,
42
+		map[string]int{"busybox": len(services)})
42 43
 
43 44
 	for name, message := range services {
44 45
 		out, err := d.Cmd("service", "logs", name)
... ...
@@ -104,7 +104,7 @@ github.com/docker/containerd 665e84e6c28653a9c29a6db601636a92d46896f3
104 104
 github.com/tonistiigi/fifo 1405643975692217d6720f8b54aeee1bf2cd5cf4
105 105
 
106 106
 # cluster
107
-github.com/docker/swarmkit 46bbd41a00b996a13840607772f661a7f5096ca0
107
+github.com/docker/swarmkit d60ccf366a6758c7857db968857b72202cb2f902
108 108
 github.com/golang/mock bd3c8e81be01eef76d4b503f5e687d2d1354d2d9
109 109
 github.com/gogo/protobuf 8d70fb3182befc465c4a1eac8ad4d38ff49778e2
110 110
 github.com/cloudflare/cfssl 7fb22c8cba7ecaf98e4082d22d65800cf45e042a
... ...
@@ -266,6 +266,7 @@ func (a *Agent) run(ctx context.Context) {
266 266
 
267 267
 			subCtx, subCancel := context.WithCancel(ctx)
268 268
 			subscriptions[sub.ID] = subCancel
269
+			// TODO(dperny) we're tossing the error here, that seems wrong
269 270
 			go a.worker.Subscribe(subCtx, sub)
270 271
 		case <-registered:
271 272
 			log.G(ctx).Debugln("agent: registered")
... ...
@@ -487,10 +488,21 @@ func (a *Agent) Publisher(ctx context.Context, subscriptionID string) (exec.LogP
487 487
 		return nil, nil, err
488 488
 	}
489 489
 
490
+	// make little closure for ending the log stream
491
+	sendCloseMsg := func() {
492
+		// send a close message, to tell the manager our logs are done
493
+		publisher.Send(&api.PublishLogsMessage{
494
+			SubscriptionID: subscriptionID,
495
+			Close:          true,
496
+		})
497
+		// close the stream forreal
498
+		publisher.CloseSend()
499
+	}
500
+
490 501
 	return exec.LogPublisherFunc(func(ctx context.Context, message api.LogMessage) error {
491 502
 			select {
492 503
 			case <-ctx.Done():
493
-				publisher.CloseSend()
504
+				sendCloseMsg()
494 505
 				return ctx.Err()
495 506
 			default:
496 507
 			}
... ...
@@ -500,7 +512,7 @@ func (a *Agent) Publisher(ctx context.Context, subscriptionID string) (exec.LogP
500 500
 				Messages:       []api.LogMessage{message},
501 501
 			})
502 502
 		}), func() {
503
-			publisher.CloseSend()
503
+			sendCloseMsg()
504 504
 		}, nil
505 505
 }
506 506
 
... ...
@@ -195,6 +195,11 @@ type ListTasksRequest_Filters struct {
195 195
 	DesiredStates []TaskState       `protobuf:"varint,6,rep,packed,name=desired_states,json=desiredStates,enum=docker.swarmkit.v1.TaskState" json:"desired_states,omitempty"`
196 196
 	// NamePrefixes matches all objects with the given prefixes
197 197
 	NamePrefixes []string `protobuf:"bytes,7,rep,name=name_prefixes,json=namePrefixes" json:"name_prefixes,omitempty"`
198
+	// UpToDate matches tasks that are consistent with the current
199
+	// service definition.
200
+	// Note: this is intended for internal status reporting rather
201
+	// than being exposed to users. It may be removed in the future.
202
+	UpToDate bool `protobuf:"varint,8,opt,name=up_to_date,json=upToDate,proto3" json:"up_to_date,omitempty"`
198 203
 }
199 204
 
200 205
 func (m *ListTasksRequest_Filters) Reset()      { *m = ListTasksRequest_Filters{} }
... ...
@@ -3452,6 +3457,16 @@ func (m *ListTasksRequest_Filters) MarshalTo(dAtA []byte) (int, error) {
3452 3452
 			i += copy(dAtA[i:], s)
3453 3453
 		}
3454 3454
 	}
3455
+	if m.UpToDate {
3456
+		dAtA[i] = 0x40
3457
+		i++
3458
+		if m.UpToDate {
3459
+			dAtA[i] = 1
3460
+		} else {
3461
+			dAtA[i] = 0
3462
+		}
3463
+		i++
3464
+	}
3455 3465
 	return i, nil
3456 3466
 }
3457 3467
 
... ...
@@ -5997,6 +6012,9 @@ func (m *ListTasksRequest_Filters) Size() (n int) {
5997 5997
 			n += 1 + l + sovControl(uint64(l))
5998 5998
 		}
5999 5999
 	}
6000
+	if m.UpToDate {
6001
+		n += 2
6002
+	}
6000 6003
 	return n
6001 6004
 }
6002 6005
 
... ...
@@ -6719,6 +6737,7 @@ func (this *ListTasksRequest_Filters) String() string {
6719 6719
 		`NodeIDs:` + fmt.Sprintf("%v", this.NodeIDs) + `,`,
6720 6720
 		`DesiredStates:` + fmt.Sprintf("%v", this.DesiredStates) + `,`,
6721 6721
 		`NamePrefixes:` + fmt.Sprintf("%v", this.NamePrefixes) + `,`,
6722
+		`UpToDate:` + fmt.Sprintf("%v", this.UpToDate) + `,`,
6722 6723
 		`}`,
6723 6724
 	}, "")
6724 6725
 	return s
... ...
@@ -8998,6 +9017,26 @@ func (m *ListTasksRequest_Filters) Unmarshal(dAtA []byte) error {
8998 8998
 			}
8999 8999
 			m.NamePrefixes = append(m.NamePrefixes, string(dAtA[iNdEx:postIndex]))
9000 9000
 			iNdEx = postIndex
9001
+		case 8:
9002
+			if wireType != 0 {
9003
+				return fmt.Errorf("proto: wrong wireType = %d for field UpToDate", wireType)
9004
+			}
9005
+			var v int
9006
+			for shift := uint(0); ; shift += 7 {
9007
+				if shift >= 64 {
9008
+					return ErrIntOverflowControl
9009
+				}
9010
+				if iNdEx >= l {
9011
+					return io.ErrUnexpectedEOF
9012
+				}
9013
+				b := dAtA[iNdEx]
9014
+				iNdEx++
9015
+				v |= (int(b) & 0x7F) << shift
9016
+				if b < 0x80 {
9017
+					break
9018
+				}
9019
+			}
9020
+			m.UpToDate = bool(v != 0)
9001 9021
 		default:
9002 9022
 			iNdEx = preIndex
9003 9023
 			skippy, err := skipControl(dAtA[iNdEx:])
... ...
@@ -13310,120 +13349,122 @@ var (
13310 13310
 func init() { proto.RegisterFile("control.proto", fileDescriptorControl) }
13311 13311
 
13312 13312
 var fileDescriptorControl = []byte{
13313
-	// 1838 bytes of a gzipped FileDescriptorProto
13314
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xcc, 0x5a, 0x4d, 0x4f, 0x1b, 0x57,
13315
-	0x17, 0xc6, 0x1f, 0x60, 0x73, 0x8c, 0x0d, 0x5c, 0x9c, 0xbc, 0x96, 0x93, 0x17, 0xd0, 0xe4, 0x0d,
13316
-	0x31, 0xaf, 0xa8, 0x69, 0x9c, 0x46, 0x4d, 0x53, 0xf5, 0x23, 0x40, 0x92, 0x3a, 0x24, 0x24, 0x1a,
13317
-	0x42, 0xd4, 0x1d, 0x1a, 0xec, 0x1b, 0x3a, 0xb1, 0xf1, 0xb8, 0x33, 0x03, 0x09, 0xea, 0xa6, 0xad,
13318
-	0xda, 0x9f, 0x50, 0xa9, 0xdb, 0x6e, 0x5b, 0xa9, 0x8b, 0xae, 0xfa, 0x13, 0xa2, 0xae, 0xba, 0xec,
13319
-	0x0a, 0x35, 0x96, 0x2a, 0x75, 0xd5, 0x9f, 0x50, 0x55, 0xf7, 0x6b, 0xbe, 0x7c, 0x67, 0xc6, 0x06,
13320
-	0x2a, 0xb2, 0xca, 0xcc, 0x9d, 0xe7, 0xdc, 0x73, 0xee, 0x3d, 0xcf, 0x7d, 0x7c, 0xee, 0x09, 0x90,
13321
-	0x6f, 0x18, 0x1d, 0xdb, 0x34, 0xda, 0xd5, 0xae, 0x69, 0xd8, 0x06, 0x42, 0x4d, 0xa3, 0xd1, 0xc2,
13322
-	0x66, 0xd5, 0x7a, 0xae, 0x99, 0x7b, 0x2d, 0xdd, 0xae, 0x1e, 0x5c, 0x2d, 0xe7, 0xac, 0x2e, 0x6e,
13323
-	0x58, 0x0c, 0x50, 0xce, 0x1b, 0x3b, 0xcf, 0x70, 0xc3, 0x16, 0xaf, 0x39, 0xfb, 0xb0, 0x8b, 0xc5,
13324
-	0x4b, 0x71, 0xd7, 0xd8, 0x35, 0xe8, 0xe3, 0x32, 0x79, 0xe2, 0xa3, 0x33, 0xdd, 0xf6, 0xfe, 0xae,
13325
-	0xde, 0x59, 0x66, 0xff, 0xb0, 0x41, 0xe5, 0x3a, 0x14, 0xee, 0x62, 0x7b, 0xc3, 0x68, 0x62, 0x15,
13326
-	0x7f, 0xba, 0x8f, 0x2d, 0x1b, 0x5d, 0x82, 0x4c, 0xc7, 0x68, 0xe2, 0x6d, 0xbd, 0x59, 0x4a, 0xcc,
13327
-	0x27, 0x2a, 0xe3, 0x2b, 0xd0, 0x3b, 0x9a, 0x1b, 0x23, 0x88, 0xfa, 0x9a, 0x3a, 0x46, 0x3e, 0xd5,
13328
-	0x9b, 0xca, 0x07, 0x30, 0xe9, 0x98, 0x59, 0x5d, 0xa3, 0x63, 0x61, 0xb4, 0x04, 0x69, 0xf2, 0x91,
13329
-	0x1a, 0xe5, 0x6a, 0xa5, 0x6a, 0xff, 0x02, 0xaa, 0x14, 0x4f, 0x51, 0xca, 0x51, 0x0a, 0xa6, 0xee,
13330
-	0xeb, 0x16, 0x9d, 0xc2, 0x12, 0xae, 0xef, 0x40, 0xe6, 0xa9, 0xde, 0xb6, 0xb1, 0x69, 0xf1, 0x59,
13331
-	0x96, 0x64, 0xb3, 0x04, 0xcd, 0xaa, 0x77, 0x98, 0x8d, 0x2a, 0x8c, 0xcb, 0x5f, 0xa4, 0x20, 0xc3,
13332
-	0x07, 0x51, 0x11, 0x46, 0x3b, 0xda, 0x1e, 0x26, 0x33, 0xa6, 0x2a, 0xe3, 0x2a, 0x7b, 0x41, 0xcb,
13333
-	0x90, 0xd3, 0x9b, 0xdb, 0x5d, 0x13, 0x3f, 0xd5, 0x5f, 0x60, 0xab, 0x94, 0x24, 0xdf, 0x56, 0x0a,
13334
-	0xbd, 0xa3, 0x39, 0xa8, 0xaf, 0x3d, 0xe2, 0xa3, 0x2a, 0xe8, 0x4d, 0xf1, 0x8c, 0x1e, 0xc1, 0x58,
13335
-	0x5b, 0xdb, 0xc1, 0x6d, 0xab, 0x94, 0x9a, 0x4f, 0x55, 0x72, 0xb5, 0x1b, 0xc3, 0x44, 0x56, 0xbd,
13336
-	0x4f, 0x4d, 0x6f, 0x77, 0x6c, 0xf3, 0x50, 0xe5, 0xf3, 0xa0, 0x3a, 0xe4, 0xf6, 0xf0, 0xde, 0x0e,
13337
-	0x36, 0xad, 0x4f, 0xf4, 0xae, 0x55, 0x4a, 0xcf, 0xa7, 0x2a, 0x85, 0xda, 0x95, 0xb0, 0x6d, 0xdb,
13338
-	0xec, 0xe2, 0x46, 0xf5, 0x81, 0x83, 0x57, 0xbd, 0xb6, 0xa8, 0x06, 0xa3, 0xa6, 0xd1, 0xc6, 0x56,
13339
-	0x69, 0x94, 0x4e, 0x72, 0x31, 0x74, 0xef, 0x8d, 0x36, 0x56, 0x19, 0x14, 0x5d, 0x82, 0x3c, 0xd9,
13340
-	0x0a, 0x77, 0x0f, 0xc6, 0xe8, 0xfe, 0x4c, 0x90, 0x41, 0xb1, 0xea, 0xf2, 0x3b, 0x90, 0xf3, 0x84,
13341
-	0x8e, 0xa6, 0x20, 0xd5, 0xc2, 0x87, 0x8c, 0x16, 0x2a, 0x79, 0x24, 0xbb, 0x7b, 0xa0, 0xb5, 0xf7,
13342
-	0x71, 0x29, 0x49, 0xc7, 0xd8, 0xcb, 0xcd, 0xe4, 0x8d, 0x84, 0xb2, 0x0a, 0xd3, 0x9e, 0xed, 0xe0,
13343
-	0x1c, 0xa9, 0xc2, 0x28, 0xc9, 0x3e, 0x4b, 0x46, 0x14, 0x49, 0x18, 0x4c, 0xf9, 0x3e, 0x01, 0xd3,
13344
-	0x5b, 0xdd, 0xa6, 0x66, 0xe3, 0x61, 0x19, 0x8a, 0xde, 0x87, 0x09, 0x0a, 0x3a, 0xc0, 0xa6, 0xa5,
13345
-	0x1b, 0x1d, 0x1a, 0x60, 0xae, 0x76, 0x41, 0xe6, 0xf1, 0x09, 0x83, 0xa8, 0x39, 0x62, 0xc0, 0x5f,
13346
-	0xd0, 0x9b, 0x90, 0x26, 0xc7, 0xad, 0x94, 0xa2, 0x76, 0x17, 0xa3, 0xf2, 0xa2, 0x52, 0xa4, 0xb2,
13347
-	0x02, 0xc8, 0x1b, 0xeb, 0xb1, 0x8e, 0xc5, 0x06, 0x4c, 0xab, 0x78, 0xcf, 0x38, 0x18, 0x7e, 0xbd,
13348
-	0x45, 0x18, 0x7d, 0x6a, 0x98, 0x0d, 0x96, 0x89, 0xac, 0xca, 0x5e, 0x94, 0x22, 0x20, 0xef, 0x7c,
13349
-	0x2c, 0x26, 0x7e, 0xe8, 0x1f, 0x6b, 0x56, 0xcb, 0xe3, 0xc2, 0xd6, 0xac, 0x56, 0xc0, 0x05, 0x41,
13350
-	0x10, 0x17, 0xe4, 0x93, 0x73, 0xe8, 0x99, 0x99, 0xbb, 0x3a, 0xf2, 0x31, 0x6a, 0x75, 0x14, 0x4f,
13351
-	0x51, 0xca, 0x0d, 0xb1, 0xba, 0xa1, 0x5d, 0x3b, 0xeb, 0xf0, 0x7a, 0x57, 0xfe, 0xe6, 0x22, 0x42,
13352
-	0x06, 0x8f, 0x21, 0x22, 0x5e, 0xb3, 0x7e, 0x11, 0xf9, 0xee, 0x0c, 0x45, 0x44, 0x16, 0x99, 0x54,
13353
-	0x44, 0x96, 0x21, 0x67, 0x61, 0xf3, 0x40, 0x6f, 0x10, 0x76, 0x30, 0x11, 0xe1, 0x21, 0x6c, 0xb2,
13354
-	0xe1, 0xfa, 0x9a, 0xa5, 0x02, 0x87, 0xd4, 0x9b, 0x16, 0x5a, 0x80, 0x2c, 0xe7, 0x12, 0x53, 0x8b,
13355
-	0xf1, 0x95, 0x5c, 0xef, 0x68, 0x2e, 0xc3, 0xc8, 0x64, 0xa9, 0x19, 0xc6, 0x26, 0x0b, 0xad, 0x41,
13356
-	0xa1, 0x89, 0x2d, 0xdd, 0xc4, 0xcd, 0x6d, 0xcb, 0xd6, 0x6c, 0xae, 0x0f, 0x85, 0xda, 0x7f, 0xc3,
13357
-	0x52, 0xbc, 0x49, 0x50, 0x6a, 0x9e, 0x1b, 0xd1, 0x37, 0x89, 0xc8, 0x64, 0xfe, 0x15, 0x91, 0xe1,
13358
-	0xdb, 0xe5, 0x8a, 0x0c, 0x61, 0x4d, 0xa4, 0xc8, 0x50, 0x1a, 0x31, 0x98, 0xb2, 0x0e, 0xc5, 0x55,
13359
-	0x13, 0x6b, 0x36, 0xe6, 0x5b, 0x26, 0x88, 0x74, 0x8d, 0x2b, 0x00, 0x63, 0xd1, 0x9c, 0x6c, 0x1a,
13360
-	0x6e, 0xe1, 0x11, 0x81, 0x0d, 0x38, 0x17, 0x98, 0x8c, 0x47, 0x75, 0x1d, 0x32, 0x3c, 0x0d, 0x7c,
13361
-	0xc2, 0x0b, 0x11, 0x13, 0xaa, 0x02, 0xab, 0xdc, 0x82, 0xe9, 0xbb, 0xd8, 0x0e, 0x44, 0xb6, 0x04,
13362
-	0xe0, 0x66, 0x9d, 0x9f, 0x9a, 0x7c, 0xef, 0x68, 0x6e, 0xdc, 0x49, 0xba, 0x3a, 0xee, 0xe4, 0x5c,
13363
-	0x59, 0x07, 0xe4, 0x9d, 0xe2, 0x64, 0xf1, 0xfc, 0x94, 0x84, 0x22, 0x53, 0xb9, 0x93, 0xc4, 0x84,
13364
-	0xd6, 0x60, 0x52, 0xa0, 0x87, 0x10, 0xe8, 0x02, 0xb7, 0x11, 0x1a, 0x7d, 0xcd, 0xa7, 0xd1, 0x83,
13365
-	0x65, 0x08, 0x3d, 0x80, 0xac, 0x69, 0xb4, 0xdb, 0x3b, 0x5a, 0xa3, 0x55, 0x4a, 0xcf, 0x27, 0x2a,
13366
-	0x85, 0xda, 0x55, 0x99, 0xa1, 0x6c, 0x91, 0x55, 0x95, 0x1b, 0xaa, 0xce, 0x14, 0x8a, 0x02, 0x59,
13367
-	0x31, 0x8a, 0xb2, 0x90, 0xde, 0x78, 0xb8, 0x71, 0x7b, 0x6a, 0x04, 0x4d, 0x40, 0xf6, 0x91, 0x7a,
13368
-	0xfb, 0x49, 0xfd, 0xe1, 0xd6, 0xe6, 0x54, 0x82, 0x90, 0x22, 0x30, 0xdd, 0xc9, 0x92, 0xb0, 0x06,
13369
-	0x45, 0xa6, 0x86, 0x27, 0xe2, 0xc5, 0x7f, 0xe0, 0x5c, 0x60, 0x16, 0x2e, 0xab, 0x7f, 0x26, 0x61,
13370
-	0x86, 0x1c, 0x2b, 0x3e, 0xee, 0x28, 0x6b, 0x3d, 0xa8, 0xac, 0xcb, 0x61, 0xfa, 0x15, 0xb0, 0xec,
13371
-	0x17, 0xd7, 0xaf, 0x93, 0xa7, 0x2e, 0xae, 0x9b, 0x01, 0x71, 0x7d, 0x77, 0xc8, 0xe0, 0xa4, 0xfa,
13372
-	0xda, 0x27, 0x60, 0xe9, 0xd3, 0x15, 0xb0, 0x87, 0x50, 0xf4, 0x87, 0xc4, 0x89, 0xf1, 0x36, 0x64,
13373
-	0x79, 0xa2, 0x84, 0x8c, 0x45, 0x32, 0xc3, 0x01, 0xbb, 0x62, 0xb6, 0x81, 0xed, 0xe7, 0x86, 0xd9,
13374
-	0x1a, 0x42, 0xcc, 0xb8, 0x85, 0x4c, 0xcc, 0x9c, 0xc9, 0x5c, 0xde, 0x76, 0xd8, 0x50, 0x14, 0x6f,
13375
-	0x85, 0x95, 0xc0, 0x2a, 0x5b, 0x54, 0xcc, 0x02, 0x91, 0x21, 0x48, 0x93, 0xdd, 0xe4, 0xfb, 0x45,
13376
-	0x9f, 0x09, 0x91, 0xb9, 0x0d, 0x21, 0x72, 0xd2, 0x25, 0x32, 0xb7, 0x25, 0x44, 0xe6, 0x00, 0x47,
13377
-	0xe0, 0x4e, 0x29, 0xc6, 0x8f, 0xc5, 0xd9, 0x3a, 0xf5, 0x30, 0x9d, 0xf3, 0x16, 0x88, 0xd4, 0x39,
13378
-	0x6f, 0x7c, 0xfc, 0x18, 0xe7, 0x2d, 0x60, 0xf9, 0x7a, 0x9d, 0xb7, 0x90, 0xe0, 0xce, 0xf2, 0xbc,
13379
-	0xb9, 0x21, 0xb9, 0xe7, 0x8d, 0x27, 0x2a, 0xf2, 0xbc, 0x89, 0xcc, 0x39, 0x60, 0xfe, 0xfb, 0xbc,
13380
-	0xda, 0xde, 0xb7, 0x6c, 0x6c, 0x7a, 0x74, 0xb8, 0xc1, 0x46, 0x02, 0x3a, 0xcc, 0x71, 0x84, 0x17,
13381
-	0x1c, 0xe0, 0xd0, 0xd7, 0x99, 0xc2, 0xa5, 0x2f, 0x87, 0x44, 0xd1, 0x57, 0x58, 0x09, 0xac, 0xc3,
13382
-	0x25, 0xfe, 0xe1, 0x18, 0x5c, 0x0a, 0x58, 0xbe, 0x5e, 0x5c, 0x0a, 0x09, 0xee, 0x2c, 0xb9, 0xe4,
13383
-	0x86, 0xe4, 0x72, 0x89, 0x67, 0x23, 0x92, 0x4b, 0x22, 0x75, 0x0e, 0x58, 0xf9, 0x26, 0x01, 0xb9,
13384
-	0x75, 0x7c, 0xa8, 0x1a, 0xb6, 0x66, 0x93, 0xf2, 0xe6, 0xff, 0x30, 0x4d, 0x48, 0x86, 0xcd, 0xed,
13385
-	0x67, 0x86, 0xde, 0xd9, 0xb6, 0x8d, 0x16, 0xee, 0xd0, 0xd0, 0xb2, 0xea, 0x24, 0xfb, 0x70, 0xcf,
13386
-	0xd0, 0x3b, 0x8f, 0xc9, 0x30, 0x5a, 0x02, 0xb4, 0xa7, 0x75, 0xb4, 0x5d, 0x3f, 0x98, 0xdd, 0x05,
13387
-	0xa7, 0xf8, 0x17, 0x29, 0x7a, 0xbf, 0xd3, 0x36, 0x1a, 0xad, 0x6d, 0xb2, 0xea, 0x94, 0x0f, 0xbd,
13388
-	0x45, 0x3f, 0xac, 0xe3, 0x43, 0xe5, 0x4b, 0xa7, 0xe6, 0x3b, 0x09, 0xcf, 0x49, 0xcd, 0x27, 0xd0,
13389
-	0xc3, 0xd4, 0x7c, 0xdc, 0x66, 0x88, 0x9a, 0x8f, 0x7b, 0xf7, 0xd4, 0x7c, 0xb7, 0x48, 0xcd, 0xc7,
13390
-	0x76, 0x95, 0xd6, 0x7c, 0x21, 0x86, 0x9e, 0xcd, 0x5f, 0x49, 0xbf, 0x3c, 0x9a, 0x1b, 0x51, 0x1d,
13391
-	0x33, 0xb7, 0x86, 0x3b, 0xa5, 0x83, 0xfa, 0x1e, 0x4c, 0xd1, 0xaa, 0xbc, 0x61, 0x62, 0x5b, 0xec,
13392
-	0xe7, 0x22, 0x8c, 0x5b, 0x74, 0xc0, 0xdd, 0xce, 0x89, 0xde, 0xd1, 0x5c, 0x96, 0xa1, 0xea, 0x6b,
13393
-	0xe4, 0x77, 0x9e, 0x3e, 0x35, 0x95, 0xbb, 0xfc, 0x5e, 0xc0, 0xcc, 0x79, 0x28, 0x35, 0x18, 0x63,
13394
-	0x00, 0x1e, 0x49, 0x59, 0x5e, 0x33, 0x50, 0x1b, 0x8e, 0x54, 0x7e, 0x4e, 0xc0, 0x8c, 0x28, 0x4e,
13395
-	0x8f, 0x17, 0x0b, 0x5a, 0x81, 0x02, 0x87, 0x0e, 0x91, 0xd7, 0x3c, 0x33, 0x11, 0x69, 0xad, 0xf9,
13396
-	0xd2, 0x3a, 0x1b, 0x1e, 0xb8, 0xa7, 0x3c, 0xb9, 0xe7, 0x5e, 0x45, 0x4e, 0xbc, 0x0d, 0x7f, 0x24,
13397
-	0x01, 0xb1, 0x4a, 0x8c, 0xbc, 0x3a, 0xb2, 0xf9, 0x51, 0x50, 0x36, 0xab, 0xe1, 0x55, 0xa5, 0xd7,
13398
-	0xb0, 0x5f, 0x35, 0xbf, 0x3a, 0x7d, 0xd5, 0x54, 0x03, 0xaa, 0x79, 0x73, 0xb8, 0xd8, 0xce, 0x44,
13399
-	0x34, 0xd7, 0xc5, 0xd5, 0x82, 0x47, 0xc4, 0x53, 0xf6, 0x16, 0xb9, 0x08, 0xd1, 0x21, 0x2e, 0x99,
13400
-	0x51, 0x39, 0x13, 0x50, 0xa5, 0x0e, 0x33, 0xe2, 0xb2, 0xed, 0xa5, 0x6e, 0xcd, 0x57, 0xeb, 0x0e,
13401
-	0xcc, 0x25, 0xff, 0x54, 0x27, 0xe0, 0xd2, 0x87, 0x30, 0x23, 0x2e, 0x56, 0xc7, 0x3c, 0xdd, 0xe7,
13402
-	0xdd, 0x0b, 0x9e, 0x37, 0x9a, 0xda, 0x0f, 0xe7, 0x21, 0xb3, 0xca, 0xfe, 0x9f, 0x00, 0xe9, 0x90,
13403
-	0xe1, 0x2d, 0x78, 0xa4, 0xc8, 0x82, 0xf2, 0xb7, 0xf5, 0xcb, 0x97, 0x22, 0x31, 0xbc, 0x12, 0x3d,
13404
-	0xf7, 0xcb, 0x8f, 0x7f, 0x7d, 0x9b, 0x9c, 0x84, 0x3c, 0x05, 0xbd, 0xc1, 0x7f, 0x09, 0x90, 0x01,
13405
-	0xe3, 0x4e, 0x2f, 0x17, 0xfd, 0x6f, 0x90, 0xce, 0x77, 0xf9, 0x72, 0x0c, 0x2a, 0xda, 0xa1, 0x09,
13406
-	0xe0, 0xb6, 0x52, 0xd1, 0xe5, 0xf0, 0xfb, 0xb9, 0x77, 0x85, 0x0b, 0x71, 0xb0, 0x58, 0x9f, 0x6e,
13407
-	0xab, 0x54, 0xee, 0xb3, 0xaf, 0x35, 0x2b, 0xf7, 0x29, 0xe9, 0xb8, 0x86, 0xf8, 0x64, 0x39, 0x7c,
13408
-	0xac, 0x59, 0xad, 0xd0, 0x1c, 0x7a, 0x5a, 0xa5, 0xa1, 0x39, 0xf4, 0x35, 0x45, 0xa3, 0x73, 0x48,
13409
-	0x5b, 0x65, 0xe1, 0x39, 0xf4, 0x36, 0x1e, 0xc3, 0x73, 0xe8, 0xeb, 0xb7, 0xc5, 0xee, 0x27, 0x5d,
13410
-	0x5e, 0xc4, 0x7e, 0x7a, 0x57, 0xb8, 0x10, 0x07, 0x8b, 0xf5, 0xe9, 0xb6, 0xba, 0xe4, 0x3e, 0xfb,
13411
-	0xba, 0x69, 0x72, 0x9f, 0xfd, 0x1d, 0xb3, 0x30, 0x9f, 0x2f, 0x60, 0xc2, 0x7b, 0x85, 0x47, 0x57,
13412
-	0x06, 0xec, 0x3b, 0x94, 0x2b, 0xf1, 0xc0, 0x68, 0xcf, 0x9f, 0x41, 0xde, 0xd7, 0x6b, 0x44, 0xd2,
13413
-	0x19, 0x65, 0xbd, 0xcd, 0xf2, 0xe2, 0x00, 0xc8, 0x58, 0xe7, 0xbe, 0x9e, 0x96, 0xdc, 0xb9, 0xac,
13414
-	0x8b, 0x26, 0x77, 0x2e, 0x6d, 0x90, 0x45, 0x38, 0xf7, 0xb5, 0xae, 0xe4, 0xce, 0x65, 0x3d, 0x32,
13415
-	0xb9, 0x73, 0x79, 0x1f, 0x2c, 0x92, 0x64, 0xfc, 0x2a, 0x18, 0x4a, 0x32, 0x7f, 0xfb, 0x20, 0x94,
13416
-	0x64, 0xc1, 0x5e, 0x40, 0x34, 0xc9, 0xc4, 0xbd, 0x35, 0x9c, 0x64, 0x81, 0xcb, 0x76, 0x38, 0xc9,
13417
-	0x82, 0x57, 0xe0, 0x58, 0x92, 0x89, 0x05, 0x47, 0x90, 0x2c, 0xb0, 0xe6, 0xc5, 0x01, 0x90, 0x03,
13418
-	0xe6, 0x39, 0xd2, 0xb9, 0xac, 0x5f, 0x13, 0x95, 0xe7, 0x01, 0x9d, 0xb3, 0x3c, 0xf3, 0xc2, 0x3d,
13419
-	0x34, 0xcf, 0xfe, 0x2b, 0x51, 0x68, 0x9e, 0x03, 0xb7, 0x86, 0x98, 0x3c, 0x8b, 0x3b, 0x65, 0x78,
13420
-	0x9e, 0x03, 0x17, 0xe1, 0xf0, 0x3c, 0x07, 0xaf, 0xa7, 0xb1, 0xe7, 0x59, 0x2c, 0x38, 0xe2, 0x3c,
13421
-	0x07, 0xd6, 0xbc, 0x38, 0x00, 0x32, 0xf6, 0xc7, 0xc9, 0xb9, 0xcd, 0xc8, 0x7f, 0x9c, 0x82, 0x77,
13422
-	0xa5, 0xf2, 0xe5, 0x18, 0x54, 0xec, 0x3e, 0x7b, 0xaf, 0x0e, 0xf2, 0x7d, 0x96, 0x5c, 0x8b, 0xca,
13423
-	0x95, 0x78, 0x60, 0xb4, 0xe7, 0x7d, 0xc8, 0x79, 0x0a, 0x60, 0xb4, 0x30, 0x58, 0xcd, 0x5e, 0xbe,
13424
-	0x12, 0x8b, 0x8b, 0x5d, 0xb0, 0xb7, 0xbe, 0x95, 0x2f, 0x58, 0x52, 0x4c, 0x97, 0x2b, 0xf1, 0xc0,
13425
-	0x58, 0xcf, 0xde, 0x5a, 0x56, 0xee, 0x59, 0x52, 0x2f, 0x97, 0x2b, 0xf1, 0xc0, 0x48, 0xcf, 0x2b,
13426
-	0xa5, 0x97, 0xaf, 0x66, 0x47, 0x7e, 0x7b, 0x35, 0x3b, 0xf2, 0x79, 0x6f, 0x36, 0xf1, 0xb2, 0x37,
13427
-	0x9b, 0xf8, 0xb5, 0x37, 0x9b, 0xf8, 0xbd, 0x37, 0x9b, 0xd8, 0x19, 0xa3, 0x7f, 0xfc, 0x72, 0xed,
13428
-	0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf7, 0xd5, 0x67, 0xd5, 0x75, 0x23, 0x00, 0x00,
13313
+	// 1865 bytes of a gzipped FileDescriptorProto
13314
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xcc, 0x5a, 0x4b, 0x6f, 0x1b, 0x47,
13315
+	0x12, 0x16, 0x1f, 0x12, 0xa9, 0xa2, 0x48, 0x49, 0x2d, 0xda, 0x4b, 0xd0, 0x5e, 0x49, 0x18, 0xaf,
13316
+	0x65, 0x6a, 0xa1, 0xa5, 0xd6, 0xf4, 0x1a, 0xeb, 0xf5, 0x62, 0x1f, 0x96, 0x68, 0x3b, 0xb4, 0x6c,
13317
+	0xd9, 0x18, 0x49, 0x46, 0x6e, 0x04, 0x45, 0xb6, 0x95, 0x31, 0x29, 0x0e, 0x33, 0x33, 0x94, 0x2d,
13318
+	0xe4, 0x92, 0x04, 0xc9, 0x4f, 0x08, 0x90, 0x43, 0x7e, 0x41, 0x02, 0xe4, 0x90, 0x53, 0x6e, 0xb9,
13319
+	0x1a, 0x39, 0xe5, 0x98, 0x93, 0x10, 0x13, 0x08, 0x90, 0x53, 0x7e, 0x43, 0xd0, 0xaf, 0x79, 0xb1,
13320
+	0x67, 0x86, 0x94, 0x04, 0xc8, 0x27, 0xcf, 0xf4, 0x7c, 0xd5, 0x55, 0xdd, 0xf5, 0xf5, 0xc7, 0xea,
13321
+	0xb2, 0x20, 0xdb, 0xd4, 0xbb, 0x96, 0xa1, 0x77, 0xca, 0x3d, 0x43, 0xb7, 0x74, 0x84, 0x5a, 0x7a,
13322
+	0xb3, 0x8d, 0x8d, 0xb2, 0xf9, 0xaa, 0x61, 0x1c, 0xb6, 0x35, 0xab, 0x7c, 0x74, 0xb3, 0x98, 0x31,
13323
+	0x7b, 0xb8, 0x69, 0x32, 0x40, 0x31, 0xab, 0xef, 0xbf, 0xc4, 0x4d, 0x4b, 0xbc, 0x66, 0xac, 0xe3,
13324
+	0x1e, 0x16, 0x2f, 0xf9, 0x03, 0xfd, 0x40, 0xa7, 0x8f, 0xeb, 0xe4, 0x89, 0x8f, 0x2e, 0xf4, 0x3a,
13325
+	0xfd, 0x03, 0xad, 0xbb, 0xce, 0xfe, 0x61, 0x83, 0xca, 0x6d, 0xc8, 0x3d, 0xc4, 0xd6, 0xb6, 0xde,
13326
+	0xc2, 0x2a, 0xfe, 0xb0, 0x8f, 0x4d, 0x0b, 0x5d, 0x83, 0x54, 0x57, 0x6f, 0xe1, 0xba, 0xd6, 0x2a,
13327
+	0xc4, 0x96, 0x63, 0xa5, 0xe9, 0x0d, 0x18, 0x9c, 0x2c, 0x4d, 0x11, 0x44, 0xad, 0xaa, 0x4e, 0x91,
13328
+	0x4f, 0xb5, 0x96, 0xf2, 0x3f, 0x98, 0xb5, 0xcd, 0xcc, 0x9e, 0xde, 0x35, 0x31, 0x5a, 0x83, 0x24,
13329
+	0xf9, 0x48, 0x8d, 0x32, 0x95, 0x42, 0x79, 0x78, 0x01, 0x65, 0x8a, 0xa7, 0x28, 0xe5, 0x24, 0x01,
13330
+	0x73, 0x8f, 0x35, 0x93, 0x4e, 0x61, 0x0a, 0xd7, 0x0f, 0x20, 0xf5, 0x42, 0xeb, 0x58, 0xd8, 0x30,
13331
+	0xf9, 0x2c, 0x6b, 0xb2, 0x59, 0xfc, 0x66, 0xe5, 0x07, 0xcc, 0x46, 0x15, 0xc6, 0xc5, 0x4f, 0x12,
13332
+	0x90, 0xe2, 0x83, 0x28, 0x0f, 0x93, 0xdd, 0xc6, 0x21, 0x26, 0x33, 0x26, 0x4a, 0xd3, 0x2a, 0x7b,
13333
+	0x41, 0xeb, 0x90, 0xd1, 0x5a, 0xf5, 0x9e, 0x81, 0x5f, 0x68, 0xaf, 0xb1, 0x59, 0x88, 0x93, 0x6f,
13334
+	0x1b, 0xb9, 0xc1, 0xc9, 0x12, 0xd4, 0xaa, 0xcf, 0xf8, 0xa8, 0x0a, 0x5a, 0x4b, 0x3c, 0xa3, 0x67,
13335
+	0x30, 0xd5, 0x69, 0xec, 0xe3, 0x8e, 0x59, 0x48, 0x2c, 0x27, 0x4a, 0x99, 0xca, 0x9d, 0x71, 0x22,
13336
+	0x2b, 0x3f, 0xa6, 0xa6, 0xf7, 0xbb, 0x96, 0x71, 0xac, 0xf2, 0x79, 0x50, 0x0d, 0x32, 0x87, 0xf8,
13337
+	0x70, 0x1f, 0x1b, 0xe6, 0x07, 0x5a, 0xcf, 0x2c, 0x24, 0x97, 0x13, 0xa5, 0x5c, 0xe5, 0x46, 0xd0,
13338
+	0xb6, 0xed, 0xf4, 0x70, 0xb3, 0xfc, 0xc4, 0xc6, 0xab, 0x6e, 0x5b, 0x54, 0x81, 0x49, 0x43, 0xef,
13339
+	0x60, 0xb3, 0x30, 0x49, 0x27, 0xb9, 0x1a, 0xb8, 0xf7, 0x7a, 0x07, 0xab, 0x0c, 0x8a, 0xae, 0x41,
13340
+	0x96, 0x6c, 0x85, 0xb3, 0x07, 0x53, 0x74, 0x7f, 0x66, 0xc8, 0xa0, 0x58, 0x75, 0xf1, 0x5f, 0x90,
13341
+	0x71, 0x85, 0x8e, 0xe6, 0x20, 0xd1, 0xc6, 0xc7, 0x8c, 0x16, 0x2a, 0x79, 0x24, 0xbb, 0x7b, 0xd4,
13342
+	0xe8, 0xf4, 0x71, 0x21, 0x4e, 0xc7, 0xd8, 0xcb, 0xdd, 0xf8, 0x9d, 0x98, 0xb2, 0x09, 0xf3, 0xae,
13343
+	0xed, 0xe0, 0x1c, 0x29, 0xc3, 0x24, 0xc9, 0x3e, 0x4b, 0x46, 0x18, 0x49, 0x18, 0x4c, 0xf9, 0x3a,
13344
+	0x06, 0xf3, 0x7b, 0xbd, 0x56, 0xc3, 0xc2, 0xe3, 0x32, 0x14, 0xfd, 0x17, 0x66, 0x28, 0xe8, 0x08,
13345
+	0x1b, 0xa6, 0xa6, 0x77, 0x69, 0x80, 0x99, 0xca, 0x15, 0x99, 0xc7, 0xe7, 0x0c, 0xa2, 0x66, 0x88,
13346
+	0x01, 0x7f, 0x41, 0x7f, 0x87, 0x24, 0x39, 0x6e, 0x85, 0x04, 0xb5, 0xbb, 0x1a, 0x96, 0x17, 0x95,
13347
+	0x22, 0x95, 0x0d, 0x40, 0xee, 0x58, 0x4f, 0x75, 0x2c, 0xb6, 0x61, 0x5e, 0xc5, 0x87, 0xfa, 0xd1,
13348
+	0xf8, 0xeb, 0xcd, 0xc3, 0xe4, 0x0b, 0xdd, 0x68, 0xb2, 0x4c, 0xa4, 0x55, 0xf6, 0xa2, 0xe4, 0x01,
13349
+	0xb9, 0xe7, 0x63, 0x31, 0xf1, 0x43, 0xbf, 0xdb, 0x30, 0xdb, 0x2e, 0x17, 0x56, 0xc3, 0x6c, 0xfb,
13350
+	0x5c, 0x10, 0x04, 0x71, 0x41, 0x3e, 0xd9, 0x87, 0x9e, 0x99, 0x39, 0xab, 0x23, 0x1f, 0xc3, 0x56,
13351
+	0x47, 0xf1, 0x14, 0xa5, 0xdc, 0x11, 0xab, 0x1b, 0xdb, 0xb5, 0xbd, 0x0e, 0xb7, 0x77, 0xe5, 0xab,
13352
+	0x24, 0x13, 0x11, 0x32, 0x78, 0x0a, 0x11, 0x71, 0x9b, 0x0d, 0x8b, 0xc8, 0x0f, 0x17, 0x28, 0x22,
13353
+	0xb2, 0xc8, 0xa4, 0x22, 0xb2, 0x0e, 0x19, 0x13, 0x1b, 0x47, 0x5a, 0x93, 0xb0, 0x83, 0x89, 0x08,
13354
+	0x0f, 0x61, 0x87, 0x0d, 0xd7, 0xaa, 0xa6, 0x0a, 0x1c, 0x52, 0x6b, 0x99, 0x68, 0x05, 0xd2, 0x9c,
13355
+	0x4b, 0x4c, 0x2d, 0xa6, 0x37, 0x32, 0x83, 0x93, 0xa5, 0x14, 0x23, 0x93, 0xa9, 0xa6, 0x18, 0x9b,
13356
+	0x4c, 0x54, 0x85, 0x5c, 0x0b, 0x9b, 0x9a, 0x81, 0x5b, 0x75, 0xd3, 0x6a, 0x58, 0x5c, 0x1f, 0x72,
13357
+	0x95, 0x3f, 0x07, 0xa5, 0x78, 0x87, 0xa0, 0xd4, 0x2c, 0x37, 0xa2, 0x6f, 0x12, 0x91, 0x49, 0x0d,
13358
+	0x8b, 0x0c, 0xba, 0x0a, 0xd0, 0xef, 0xd5, 0x2d, 0xbd, 0x4e, 0xce, 0x4e, 0x21, 0x4d, 0xe9, 0x9b,
13359
+	0xee, 0xf7, 0x76, 0xf5, 0x6a, 0xc3, 0xc2, 0xe7, 0x20, 0x41, 0x7c, 0x33, 0x1d, 0x09, 0x22, 0x9c,
13360
+	0x0a, 0x95, 0x20, 0x4a, 0x32, 0x06, 0x53, 0xb6, 0x20, 0xbf, 0x69, 0xe0, 0x86, 0x85, 0xf9, 0x86,
13361
+	0x0a, 0x9a, 0xdd, 0xe2, 0xfa, 0xc0, 0x38, 0xb6, 0x24, 0x9b, 0x86, 0x5b, 0xb8, 0x24, 0x62, 0x1b,
13362
+	0x2e, 0xf9, 0x26, 0xe3, 0x51, 0xdd, 0x86, 0x14, 0x4f, 0x12, 0x9f, 0xf0, 0x4a, 0xc8, 0x84, 0xaa,
13363
+	0xc0, 0x2a, 0xf7, 0x60, 0xfe, 0x21, 0xb6, 0x7c, 0x91, 0xad, 0x01, 0x38, 0x9c, 0xe0, 0x67, 0x2a,
13364
+	0x3b, 0x38, 0x59, 0x9a, 0xb6, 0x29, 0xa1, 0x4e, 0xdb, 0x8c, 0x50, 0xb6, 0x00, 0xb9, 0xa7, 0x38,
13365
+	0x5b, 0x3c, 0xdf, 0xc5, 0x21, 0xcf, 0x34, 0xf0, 0x2c, 0x31, 0xa1, 0x2a, 0xcc, 0x0a, 0xf4, 0x18,
13366
+	0xf2, 0x9d, 0xe3, 0x36, 0x42, 0xc1, 0x6f, 0x79, 0x14, 0x7c, 0xb4, 0x0c, 0xa1, 0x27, 0x90, 0x36,
13367
+	0xf4, 0x4e, 0x67, 0xbf, 0xd1, 0x6c, 0x17, 0x92, 0xcb, 0xb1, 0x52, 0xae, 0x72, 0x53, 0x66, 0x28,
13368
+	0x5b, 0x64, 0x59, 0xe5, 0x86, 0xaa, 0x3d, 0x85, 0xa2, 0x40, 0x5a, 0x8c, 0xa2, 0x34, 0x24, 0xb7,
13369
+	0x9f, 0x6e, 0xdf, 0x9f, 0x9b, 0x40, 0x33, 0x90, 0x7e, 0xa6, 0xde, 0x7f, 0x5e, 0x7b, 0xba, 0xb7,
13370
+	0x33, 0x17, 0x23, 0xa4, 0xf0, 0x4d, 0x77, 0xb6, 0x24, 0x54, 0x21, 0xcf, 0xb4, 0xf2, 0x4c, 0xbc,
13371
+	0xf8, 0x13, 0x5c, 0xf2, 0xcd, 0xc2, 0x45, 0xf7, 0xb7, 0x38, 0x2c, 0x90, 0x63, 0xc5, 0xc7, 0x6d,
13372
+	0xdd, 0xad, 0xf9, 0x75, 0x77, 0x3d, 0x48, 0xdd, 0x7c, 0x96, 0xc3, 0xd2, 0xfb, 0x79, 0xfc, 0xdc,
13373
+	0xa5, 0x77, 0xc7, 0x27, 0xbd, 0xff, 0x1e, 0x33, 0x38, 0xa9, 0xfa, 0x0e, 0xc9, 0x5b, 0xf2, 0x7c,
13374
+	0x6b, 0xa8, 0xa7, 0x90, 0xf7, 0x86, 0xc4, 0x89, 0xf1, 0x4f, 0x48, 0xf3, 0x44, 0x09, 0x19, 0x0b,
13375
+	0x65, 0x86, 0x0d, 0x76, 0xc4, 0x6c, 0x1b, 0x5b, 0xaf, 0x74, 0xa3, 0x3d, 0x86, 0x98, 0x71, 0x0b,
13376
+	0x99, 0x98, 0xd9, 0x93, 0x39, 0xbc, 0xed, 0xb2, 0xa1, 0x30, 0xde, 0x0a, 0x2b, 0x81, 0x55, 0xf6,
13377
+	0xa8, 0x98, 0xf9, 0x22, 0x43, 0x90, 0x24, 0xbb, 0xc9, 0xf7, 0x8b, 0x3e, 0x13, 0x22, 0x73, 0x1b,
13378
+	0x42, 0xe4, 0xb8, 0x43, 0x64, 0x6e, 0x4b, 0x88, 0xcc, 0x01, 0xb6, 0xc0, 0x9d, 0x53, 0x8c, 0xef,
13379
+	0x8b, 0xb3, 0x75, 0xee, 0x61, 0xda, 0xe7, 0xcd, 0x17, 0xa9, 0x7d, 0xde, 0xf8, 0xf8, 0x29, 0xce,
13380
+	0x9b, 0xcf, 0xf2, 0xdd, 0x3a, 0x6f, 0x01, 0xc1, 0x5d, 0xe4, 0x79, 0x73, 0x42, 0x72, 0xce, 0x1b,
13381
+	0x4f, 0x54, 0xe8, 0x79, 0x13, 0x99, 0xb3, 0xc1, 0xfc, 0xf7, 0x79, 0xb3, 0xd3, 0x37, 0x2d, 0x6c,
13382
+	0xb8, 0x74, 0xb8, 0xc9, 0x46, 0x7c, 0x3a, 0xcc, 0x71, 0x84, 0x17, 0x1c, 0x60, 0xd3, 0xd7, 0x9e,
13383
+	0xc2, 0xa1, 0x2f, 0x87, 0x84, 0xd1, 0x57, 0x58, 0x09, 0xac, 0xcd, 0x25, 0xfe, 0xe1, 0x14, 0x5c,
13384
+	0xf2, 0x59, 0xbe, 0x5b, 0x5c, 0x0a, 0x08, 0xee, 0x22, 0xb9, 0xe4, 0x84, 0xe4, 0x70, 0x89, 0x67,
13385
+	0x23, 0x94, 0x4b, 0x22, 0x75, 0x36, 0x58, 0xf9, 0x22, 0x06, 0x99, 0x2d, 0x7c, 0xac, 0xea, 0x56,
13386
+	0xc3, 0x22, 0xe5, 0xcd, 0x5f, 0x61, 0x9e, 0x90, 0x0c, 0x1b, 0xf5, 0x97, 0xba, 0xd6, 0xad, 0x5b,
13387
+	0x7a, 0x1b, 0x77, 0x69, 0x68, 0x69, 0x75, 0x96, 0x7d, 0x78, 0xa4, 0x6b, 0xdd, 0x5d, 0x32, 0x8c,
13388
+	0xd6, 0x00, 0x1d, 0x36, 0xba, 0x8d, 0x03, 0x2f, 0x98, 0xdd, 0x14, 0xe7, 0xf8, 0x17, 0x29, 0xba,
13389
+	0xdf, 0xed, 0xe8, 0xcd, 0x76, 0x9d, 0xac, 0x3a, 0xe1, 0x41, 0xef, 0xd1, 0x0f, 0x5b, 0xf8, 0x58,
13390
+	0xf9, 0xd4, 0xae, 0xf9, 0xce, 0xc2, 0x73, 0x52, 0xf3, 0x09, 0xf4, 0x38, 0x35, 0x1f, 0xb7, 0x19,
13391
+	0xa3, 0xe6, 0xe3, 0xde, 0x5d, 0x35, 0xdf, 0x3d, 0x52, 0xf3, 0xb1, 0x5d, 0xa5, 0x35, 0x5f, 0x80,
13392
+	0xa1, 0x6b, 0xf3, 0x37, 0x92, 0x6f, 0x4e, 0x96, 0x26, 0x54, 0xdb, 0xcc, 0xa9, 0xe1, 0xce, 0xe9,
13393
+	0xa0, 0xfe, 0x07, 0xe6, 0x68, 0x55, 0xde, 0x34, 0xb0, 0x25, 0xf6, 0x73, 0x15, 0xa6, 0x4d, 0x3a,
13394
+	0xe0, 0x6c, 0xe7, 0xcc, 0xe0, 0x64, 0x29, 0xcd, 0x50, 0xb5, 0x2a, 0xf9, 0x9d, 0xa7, 0x4f, 0x2d,
13395
+	0xe5, 0x21, 0xbf, 0x17, 0x30, 0x73, 0x1e, 0x4a, 0x05, 0xa6, 0x18, 0x80, 0x47, 0x52, 0x94, 0xd7,
13396
+	0x0c, 0xd4, 0x86, 0x23, 0x95, 0xef, 0x63, 0xb0, 0x20, 0x8a, 0xd3, 0xd3, 0xc5, 0x82, 0x36, 0x20,
13397
+	0xc7, 0xa1, 0x63, 0xe4, 0x35, 0xcb, 0x4c, 0x44, 0x5a, 0x2b, 0x9e, 0xb4, 0x2e, 0x06, 0x07, 0xee,
13398
+	0x2a, 0x4f, 0x1e, 0x39, 0x57, 0x91, 0x33, 0x6f, 0xc3, 0xaf, 0x71, 0x40, 0xac, 0x12, 0x23, 0xaf,
13399
+	0xb6, 0x6c, 0xbe, 0xe7, 0x97, 0xcd, 0x72, 0x70, 0x55, 0xe9, 0x36, 0x1c, 0x56, 0xcd, 0xcf, 0xce,
13400
+	0x5f, 0x35, 0x55, 0x9f, 0x6a, 0xde, 0x1d, 0x2f, 0xb6, 0x0b, 0x11, 0xcd, 0x2d, 0x71, 0xb5, 0xe0,
13401
+	0x11, 0xf1, 0x94, 0xfd, 0x83, 0x5c, 0x84, 0xe8, 0x10, 0x97, 0xcc, 0xb0, 0x9c, 0x09, 0xa8, 0x52,
13402
+	0x83, 0x05, 0x71, 0xd9, 0x76, 0x53, 0xb7, 0xe2, 0xa9, 0x75, 0x47, 0xe6, 0x92, 0x77, 0xaa, 0x33,
13403
+	0x70, 0xe9, 0xff, 0xb0, 0x20, 0x2e, 0x56, 0xa7, 0x3c, 0xdd, 0x97, 0x9d, 0x0b, 0x9e, 0x3b, 0x9a,
13404
+	0xca, 0x37, 0x97, 0x21, 0xb5, 0xc9, 0xfe, 0x17, 0x01, 0x69, 0x90, 0xe2, 0x0d, 0x7a, 0xa4, 0xc8,
13405
+	0x82, 0xf2, 0x36, 0xfd, 0x8b, 0xd7, 0x42, 0x31, 0xbc, 0x12, 0xbd, 0xf4, 0xe3, 0xb7, 0xbf, 0x7f,
13406
+	0x19, 0x9f, 0x85, 0x2c, 0x05, 0xfd, 0x8d, 0xff, 0x12, 0x20, 0x1d, 0xa6, 0xed, 0x4e, 0x2f, 0xfa,
13407
+	0xcb, 0x28, 0x7d, 0xf1, 0xe2, 0xf5, 0x08, 0x54, 0xb8, 0x43, 0x03, 0xc0, 0x69, 0xb4, 0xa2, 0xeb,
13408
+	0xc1, 0xf7, 0x73, 0xf7, 0x0a, 0x57, 0xa2, 0x60, 0x91, 0x3e, 0x9d, 0x46, 0xaa, 0xdc, 0xe7, 0x50,
13409
+	0xe3, 0x56, 0xee, 0x53, 0xd2, 0x8f, 0x0d, 0xf0, 0xc9, 0x72, 0xb8, 0xdb, 0x30, 0xdb, 0x81, 0x39,
13410
+	0x74, 0x35, 0x52, 0x03, 0x73, 0xe8, 0x69, 0x99, 0x86, 0xe7, 0x90, 0xb6, 0xca, 0x82, 0x73, 0xe8,
13411
+	0x6e, 0x4b, 0x06, 0xe7, 0xd0, 0xd3, 0x6f, 0x8b, 0xdc, 0x4f, 0xba, 0xbc, 0x90, 0xfd, 0x74, 0xaf,
13412
+	0x70, 0x25, 0x0a, 0x16, 0xe9, 0xd3, 0x69, 0x75, 0xc9, 0x7d, 0x0e, 0x75, 0xd3, 0xe4, 0x3e, 0x87,
13413
+	0x3b, 0x66, 0x41, 0x3e, 0x5f, 0xc3, 0x8c, 0xfb, 0x0a, 0x8f, 0x6e, 0x8c, 0xd8, 0x77, 0x28, 0x96,
13414
+	0xa2, 0x81, 0xe1, 0x9e, 0x3f, 0x82, 0xac, 0xa7, 0xd7, 0x88, 0xa4, 0x33, 0xca, 0x7a, 0x9b, 0xc5,
13415
+	0xd5, 0x11, 0x90, 0x91, 0xce, 0x3d, 0x3d, 0x2d, 0xb9, 0x73, 0x59, 0x17, 0x4d, 0xee, 0x5c, 0xda,
13416
+	0x20, 0x0b, 0x71, 0xee, 0x69, 0x5d, 0xc9, 0x9d, 0xcb, 0x7a, 0x64, 0x72, 0xe7, 0xf2, 0x3e, 0x58,
13417
+	0x28, 0xc9, 0xf8, 0x55, 0x30, 0x90, 0x64, 0xde, 0xf6, 0x41, 0x20, 0xc9, 0xfc, 0xbd, 0x80, 0x70,
13418
+	0x92, 0x89, 0x7b, 0x6b, 0x30, 0xc9, 0x7c, 0x97, 0xed, 0x60, 0x92, 0xf9, 0xaf, 0xc0, 0x91, 0x24,
13419
+	0x13, 0x0b, 0x0e, 0x21, 0x99, 0x6f, 0xcd, 0xab, 0x23, 0x20, 0x47, 0xcc, 0x73, 0xa8, 0x73, 0x59,
13420
+	0xbf, 0x26, 0x2c, 0xcf, 0x23, 0x3a, 0x67, 0x79, 0xe6, 0x85, 0x7b, 0x60, 0x9e, 0xbd, 0x57, 0xa2,
13421
+	0xc0, 0x3c, 0xfb, 0x6e, 0x0d, 0x11, 0x79, 0x16, 0x77, 0xca, 0xe0, 0x3c, 0xfb, 0x2e, 0xc2, 0xc1,
13422
+	0x79, 0xf6, 0x5f, 0x4f, 0x23, 0xcf, 0xb3, 0x58, 0x70, 0xc8, 0x79, 0xf6, 0xad, 0x79, 0x75, 0x04,
13423
+	0x64, 0xe4, 0x8f, 0x93, 0x7d, 0x9b, 0x91, 0xff, 0x38, 0xf9, 0xef, 0x4a, 0xc5, 0xeb, 0x11, 0xa8,
13424
+	0xc8, 0x7d, 0x76, 0x5f, 0x1d, 0xe4, 0xfb, 0x2c, 0xb9, 0x16, 0x15, 0x4b, 0xd1, 0xc0, 0x70, 0xcf,
13425
+	0x7d, 0xc8, 0xb8, 0x0a, 0x60, 0xb4, 0x32, 0x5a, 0xcd, 0x5e, 0xbc, 0x11, 0x89, 0x8b, 0x5c, 0xb0,
13426
+	0xbb, 0xbe, 0x95, 0x2f, 0x58, 0x52, 0x4c, 0x17, 0x4b, 0xd1, 0xc0, 0x48, 0xcf, 0xee, 0x5a, 0x56,
13427
+	0xee, 0x59, 0x52, 0x2f, 0x17, 0x4b, 0xd1, 0xc0, 0x50, 0xcf, 0x1b, 0x85, 0x37, 0x6f, 0x17, 0x27,
13428
+	0x7e, 0x7e, 0xbb, 0x38, 0xf1, 0xf1, 0x60, 0x31, 0xf6, 0x66, 0xb0, 0x18, 0xfb, 0x69, 0xb0, 0x18,
13429
+	0xfb, 0x65, 0xb0, 0x18, 0xdb, 0x9f, 0xa2, 0x7f, 0x1a, 0x73, 0xeb, 0x8f, 0x00, 0x00, 0x00, 0xff,
13430
+	0xff, 0xcc, 0x5c, 0xf3, 0xfa, 0x93, 0x23, 0x00, 0x00,
13429 13431
 }
... ...
@@ -191,6 +191,11 @@ message ListTasksRequest {
191 191
 		repeated docker.swarmkit.v1.TaskState desired_states = 6;
192 192
 		// NamePrefixes matches all objects with the given prefixes
193 193
 		repeated string name_prefixes = 7;
194
+		// UpToDate matches tasks that are consistent with the current
195
+		// service definition.
196
+		// Note: this is intended for internal status reporting rather
197
+		// than being exposed to users. It may be removed in the future.
198
+		bool up_to_date = 8;
194 199
 	}
195 200
 
196 201
 	Filters filters = 1;
... ...
@@ -190,6 +190,11 @@ type PublishLogsMessage struct {
190 190
 	SubscriptionID string `protobuf:"bytes,1,opt,name=subscription_id,json=subscriptionId,proto3" json:"subscription_id,omitempty"`
191 191
 	// Messages is the log message for publishing.
192 192
 	Messages []LogMessage `protobuf:"bytes,2,rep,name=messages" json:"messages"`
193
+	// Close is a boolean for whether or not the client has completed its log
194
+	// stream. When close is called, the manager can hang up the subscription.
195
+	// Any further logs from this subscription are an error condition. Any
196
+	// messages included when close is set can be discarded
197
+	Close bool `protobuf:"varint,3,opt,name=close,proto3" json:"close,omitempty"`
193 198
 }
194 199
 
195 200
 func (m *PublishLogsMessage) Reset()                    { *m = PublishLogsMessage{} }
... ...
@@ -1127,6 +1132,16 @@ func (m *PublishLogsMessage) MarshalTo(dAtA []byte) (int, error) {
1127 1127
 			i += n
1128 1128
 		}
1129 1129
 	}
1130
+	if m.Close {
1131
+		dAtA[i] = 0x18
1132
+		i++
1133
+		if m.Close {
1134
+			dAtA[i] = 1
1135
+		} else {
1136
+			dAtA[i] = 0
1137
+		}
1138
+		i++
1139
+	}
1130 1140
 	return i, nil
1131 1141
 }
1132 1142
 
... ...
@@ -1629,6 +1644,9 @@ func (m *PublishLogsMessage) Size() (n int) {
1629 1629
 			n += 1 + l + sovLogbroker(uint64(l))
1630 1630
 		}
1631 1631
 	}
1632
+	if m.Close {
1633
+		n += 2
1634
+	}
1632 1635
 	return n
1633 1636
 }
1634 1637
 
... ...
@@ -1751,6 +1769,7 @@ func (this *PublishLogsMessage) String() string {
1751 1751
 	s := strings.Join([]string{`&PublishLogsMessage{`,
1752 1752
 		`SubscriptionID:` + fmt.Sprintf("%v", this.SubscriptionID) + `,`,
1753 1753
 		`Messages:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Messages), "LogMessage", "LogMessage", 1), `&`, ``, 1) + `,`,
1754
+		`Close:` + fmt.Sprintf("%v", this.Close) + `,`,
1754 1755
 		`}`,
1755 1756
 	}, "")
1756 1757
 	return s
... ...
@@ -2894,6 +2913,26 @@ func (m *PublishLogsMessage) Unmarshal(dAtA []byte) error {
2894 2894
 				return err
2895 2895
 			}
2896 2896
 			iNdEx = postIndex
2897
+		case 3:
2898
+			if wireType != 0 {
2899
+				return fmt.Errorf("proto: wrong wireType = %d for field Close", wireType)
2900
+			}
2901
+			var v int
2902
+			for shift := uint(0); ; shift += 7 {
2903
+				if shift >= 64 {
2904
+					return ErrIntOverflowLogbroker
2905
+				}
2906
+				if iNdEx >= l {
2907
+					return io.ErrUnexpectedEOF
2908
+				}
2909
+				b := dAtA[iNdEx]
2910
+				iNdEx++
2911
+				v |= (int(b) & 0x7F) << shift
2912
+				if b < 0x80 {
2913
+					break
2914
+				}
2915
+			}
2916
+			m.Close = bool(v != 0)
2897 2917
 		default:
2898 2918
 			iNdEx = preIndex
2899 2919
 			skippy, err := skipLogbroker(dAtA[iNdEx:])
... ...
@@ -3073,14 +3112,14 @@ var (
3073 3073
 func init() { proto.RegisterFile("logbroker.proto", fileDescriptorLogbroker) }
3074 3074
 
3075 3075
 var fileDescriptorLogbroker = []byte{
3076
-	// 881 bytes of a gzipped FileDescriptorProto
3076
+	// 886 bytes of a gzipped FileDescriptorProto
3077 3077
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xa4, 0x95, 0x4f, 0x8f, 0xdb, 0x44,
3078 3078
 	0x18, 0xc6, 0x33, 0xce, 0x36, 0x7f, 0xde, 0x74, 0xff, 0x74, 0xb2, 0x5d, 0x45, 0x11, 0xb5, 0x23,
3079 3079
 	0x57, 0x2a, 0xd1, 0xaa, 0x24, 0x25, 0x08, 0x81, 0x54, 0x09, 0x41, 0x48, 0x85, 0x22, 0xd2, 0x5d,
3080 3080
 	0x34, 0xc9, 0x0a, 0x6e, 0x2b, 0x27, 0x9e, 0x1a, 0x2b, 0x8e, 0x27, 0x78, 0x9c, 0x2e, 0x07, 0x0e,
3081
-	0x1c, 0x8a, 0x84, 0x7a, 0xe0, 0x82, 0x90, 0xe0, 0xd0, 0x13, 0xbd, 0x21, 0xc1, 0x9d, 0x0f, 0x80,
3081
+	0x1c, 0x8a, 0x84, 0x7a, 0xe0, 0x86, 0x04, 0x87, 0x9e, 0xe8, 0x05, 0x21, 0xc1, 0x9d, 0x0f, 0x80,
3082 3082
 	0x56, 0x9c, 0xe0, 0xc6, 0x29, 0xa2, 0xfe, 0x00, 0x7c, 0x06, 0xe4, 0x99, 0x89, 0xe3, 0x25, 0x49,
3083
-	0x8b, 0xb6, 0x97, 0x64, 0xc6, 0xf3, 0xbc, 0x9e, 0xdf, 0xfb, 0xcc, 0x33, 0x09, 0xec, 0x7a, 0xcc,
3083
+	0x8b, 0xb6, 0x97, 0x64, 0xc6, 0xf3, 0xbc, 0x9e, 0xdf, 0x3c, 0xf3, 0xbc, 0x09, 0xec, 0x7a, 0xcc,
3084 3084
 	0x19, 0x06, 0x6c, 0x4c, 0x83, 0xc6, 0x34, 0x60, 0x21, 0xc3, 0xd8, 0x66, 0xa3, 0x78, 0xc6, 0xcf,
3085 3085
 	0xac, 0x60, 0x32, 0x76, 0xc3, 0xc6, 0xc3, 0xd7, 0xab, 0xfb, 0x0e, 0x73, 0x98, 0x58, 0x6e, 0xc6,
3086 3086
 	0x23, 0xa9, 0xac, 0x1a, 0x0e, 0x63, 0x8e, 0x47, 0x9b, 0x62, 0x36, 0x9c, 0x3d, 0x68, 0x86, 0xee,
... ...
@@ -3090,44 +3129,44 @@ var fileDescriptorLogbroker = []byte{
3090 3090
 	0x9d, 0xd6, 0x8d, 0xc6, 0x2a, 0x4c, 0x23, 0x2e, 0x16, 0x2a, 0xb2, 0x50, 0xe3, 0x03, 0xc8, 0x3d,
3091 3091
 	0x60, 0x9e, 0xc7, 0xce, 0x2a, 0x5a, 0x0d, 0xd5, 0x0b, 0x44, 0xcd, 0x30, 0x86, 0xad, 0xd0, 0x72,
3092 3092
 	0xbd, 0x4a, 0xb6, 0x86, 0xea, 0x59, 0x22, 0xc6, 0xf8, 0x0e, 0x5c, 0xe1, 0xae, 0x3f, 0xa2, 0x95,
3093
-	0xad, 0x1a, 0xaa, 0x97, 0x5a, 0xd5, 0x86, 0xec, 0xa2, 0xb1, 0xe8, 0xa2, 0x31, 0x58, 0x74, 0x41,
3094
-	0xa4, 0xd0, 0xfc, 0x06, 0x41, 0x29, 0xde, 0x94, 0x7a, 0x74, 0x14, 0xb2, 0x00, 0x37, 0xa1, 0xc4,
3095
-	0x69, 0xf0, 0xd0, 0x1d, 0xd1, 0x53, 0xd7, 0x96, 0xa8, 0xc5, 0xf6, 0x4e, 0x34, 0x37, 0xa0, 0x2f,
3096
-	0x1f, 0x77, 0x3b, 0x9c, 0x80, 0x92, 0x74, 0x6d, 0x8e, 0x6f, 0x41, 0xc1, 0x67, 0xb6, 0x54, 0x6b,
3097
-	0x42, 0x5d, 0x8a, 0xe6, 0x46, 0xfe, 0x88, 0xd9, 0x42, 0x9a, 0x8f, 0x17, 0x95, 0x2e, 0xb4, 0xf8,
3098
-	0x58, 0xe8, 0xb2, 0x4b, 0xdd, 0xc0, 0xe2, 0x63, 0xa1, 0x8b, 0x17, 0xbb, 0x36, 0x37, 0x1f, 0x21,
3099
-	0x80, 0x1e, 0x73, 0xde, 0x67, 0x7e, 0x48, 0x3f, 0x0f, 0xf1, 0x6d, 0x80, 0x25, 0x4f, 0x05, 0xd5,
3100
-	0x50, 0xbd, 0xd8, 0xde, 0x8e, 0xe6, 0x46, 0x31, 0xc1, 0x21, 0xc5, 0x84, 0x06, 0xdf, 0x84, 0xbc,
3101
-	0x82, 0x11, 0x66, 0x15, 0xdb, 0x10, 0xcd, 0x8d, 0x9c, 0x64, 0x21, 0x39, 0x89, 0x12, 0x8b, 0x14,
3102
-	0x89, 0xf0, 0x4e, 0x89, 0x24, 0x08, 0xc9, 0x49, 0x0e, 0xf3, 0x4f, 0x89, 0x71, 0x9f, 0x72, 0x6e,
3103
-	0x39, 0x14, 0xbf, 0x03, 0xf9, 0x91, 0x24, 0x12, 0x0c, 0xa5, 0x96, 0xbe, 0xe1, 0xf4, 0x14, 0x77,
3104
-	0x7b, 0xeb, 0x7c, 0x6e, 0x64, 0xc8, 0xa2, 0x08, 0xbf, 0x0d, 0xc5, 0x24, 0x40, 0x02, 0xed, 0xf9,
3105
-	0x87, 0xb3, 0x14, 0xe3, 0x37, 0x21, 0x27, 0x93, 0x20, 0x60, 0x5f, 0x18, 0x1b, 0x25, 0x8e, 0xd3,
3106
-	0x61, 0x5b, 0xa1, 0x25, 0x82, 0x70, 0x95, 0x88, 0xb1, 0xf9, 0x03, 0x82, 0x7d, 0x15, 0xcd, 0x21,
3107
-	0xed, 0x31, 0x87, 0x13, 0xfa, 0xd9, 0x8c, 0xf2, 0x10, 0xdf, 0x85, 0x02, 0x57, 0x01, 0x50, 0xed,
3108
-	0x19, 0x9b, 0x76, 0x51, 0x32, 0x92, 0x14, 0xe0, 0x0e, 0xe4, 0x99, 0xcc, 0xb8, 0x6a, 0xec, 0x70,
3109
-	0x53, 0xed, 0xea, 0xad, 0x20, 0x8b, 0x52, 0xf3, 0x93, 0xff, 0xa0, 0x2d, 0x8c, 0x7f, 0x17, 0x0a,
3110
-	0x13, 0x39, 0x94, 0x61, 0xdc, 0xec, 0xbc, 0xaa, 0x50, 0xce, 0x27, 0x55, 0xe6, 0x2b, 0x50, 0xed,
3111
-	0xb9, 0x3c, 0xa4, 0x7e, 0x7a, 0xff, 0x45, 0xeb, 0xe6, 0x6f, 0x08, 0xca, 0xe9, 0x85, 0xc5, 0xbe,
3112
-	0x07, 0xa0, 0x25, 0x79, 0xcb, 0x45, 0x73, 0x43, 0xeb, 0x76, 0x88, 0xe6, 0xda, 0x17, 0xac, 0xd2,
3113
-	0x5e, 0xc2, 0xaa, 0xec, 0xa5, 0xad, 0xc2, 0xfb, 0x70, 0x65, 0xe4, 0x31, 0x2e, 0x2f, 0x79, 0x81,
3114
-	0xc8, 0x89, 0xf9, 0x2d, 0x02, 0xfc, 0xd1, 0x6c, 0xe8, 0xb9, 0xfc, 0xd3, 0xb4, 0x7f, 0x77, 0x61,
3115
-	0x97, 0xa7, 0x5e, 0xb6, 0xbc, 0x44, 0x38, 0x9a, 0x1b, 0x3b, 0xe9, 0x7d, 0xba, 0x1d, 0xb2, 0x93,
3116
-	0x96, 0x76, 0xed, 0x0b, 0xe6, 0x6b, 0x97, 0x32, 0xff, 0x3a, 0x94, 0x53, 0x50, 0x84, 0xf2, 0x29,
3117
-	0xf3, 0x39, 0x3d, 0x7c, 0x8a, 0xa0, 0x98, 0x64, 0x16, 0xdf, 0x06, 0xdc, 0x3b, 0xfe, 0xe0, 0xb4,
3118
-	0x3f, 0x20, 0xf7, 0xde, 0xbb, 0x7f, 0x7a, 0x72, 0xf4, 0xe1, 0xd1, 0xf1, 0xc7, 0x47, 0x7b, 0x99,
3119
-	0xea, 0xfe, 0xe3, 0x27, 0xb5, 0xbd, 0x44, 0x76, 0xe2, 0x8f, 0x7d, 0x76, 0xe6, 0xe3, 0x43, 0xb8,
3120
-	0x96, 0x52, 0xf7, 0x07, 0x9d, 0xe3, 0x93, 0xc1, 0x1e, 0xaa, 0x96, 0x1f, 0x3f, 0xa9, 0xed, 0x26,
3121
-	0xe2, 0x7e, 0x68, 0xb3, 0x59, 0xb8, 0xaa, 0xbd, 0x47, 0xc8, 0x9e, 0xb6, 0xaa, 0xa5, 0x41, 0x50,
3122
-	0xbd, 0xf6, 0xf5, 0x8f, 0x7a, 0xe6, 0xd7, 0xa7, 0xfa, 0x12, 0xac, 0xf5, 0x08, 0xc1, 0x56, 0xcc,
3123
-	0x8d, 0xbf, 0x80, 0xed, 0x0b, 0xe9, 0xc4, 0xf5, 0x75, 0x3e, 0xac, 0xbb, 0x5b, 0xd5, 0x17, 0x2b,
3124
-	0x95, 0x77, 0xe6, 0xf5, 0xdf, 0x7f, 0xfe, 0xe7, 0x7b, 0x6d, 0x17, 0xb6, 0x85, 0xf2, 0xb5, 0x89,
3125
-	0xe5, 0x5b, 0x0e, 0x0d, 0xee, 0xa0, 0xd6, 0x4f, 0x9a, 0x70, 0xab, 0x2d, 0xfe, 0xc9, 0xf0, 0x77,
3126
-	0x08, 0xca, 0x6b, 0x02, 0x8d, 0x1b, 0x6b, 0x8f, 0x66, 0x63, 0xf2, 0xab, 0xaf, 0x3e, 0x07, 0x2c,
3127
-	0x7d, 0x15, 0xcc, 0x9b, 0x82, 0xeb, 0x06, 0x5c, 0x95, 0x5c, 0x67, 0x2c, 0x18, 0xd3, 0x60, 0x85,
3128
-	0x12, 0x7f, 0x85, 0xa0, 0x94, 0x3a, 0x6b, 0x7c, 0x6b, 0xdd, 0xfb, 0x57, 0x13, 0xba, 0x9e, 0x63,
3129
-	0x4d, 0x68, 0xfe, 0x17, 0x47, 0x1d, 0xb5, 0x2b, 0xe7, 0xcf, 0xf4, 0xcc, 0x5f, 0xcf, 0xf4, 0xcc,
3130
-	0x97, 0x91, 0x8e, 0xce, 0x23, 0x1d, 0xfd, 0x11, 0xe9, 0xe8, 0xef, 0x48, 0x47, 0xc3, 0x9c, 0xf8,
3131
-	0xa5, 0x7d, 0xe3, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x11, 0x82, 0x16, 0xad, 0x17, 0x08, 0x00,
3132
-	0x00,
3093
+	0xad, 0x1a, 0xaa, 0x97, 0x5a, 0xd5, 0x86, 0x3c, 0x45, 0x63, 0x71, 0x8a, 0xc6, 0x60, 0x71, 0x0a,
3094
+	0x22, 0x85, 0xe6, 0x37, 0x08, 0x4a, 0xf1, 0xa6, 0xd4, 0xa3, 0xa3, 0x90, 0x05, 0xb8, 0x09, 0x25,
3095
+	0x4e, 0x83, 0x87, 0xee, 0x88, 0x9e, 0xba, 0xb6, 0x44, 0x2d, 0xb6, 0x77, 0xa2, 0xb9, 0x01, 0x7d,
3096
+	0xf9, 0xb8, 0xdb, 0xe1, 0x04, 0x94, 0xa4, 0x6b, 0x73, 0x7c, 0x0b, 0x0a, 0x3e, 0xb3, 0xa5, 0x5a,
3097
+	0x13, 0xea, 0x52, 0x34, 0x37, 0xf2, 0x47, 0xcc, 0x16, 0xd2, 0x7c, 0xbc, 0xa8, 0x74, 0xa1, 0xc5,
3098
+	0xc7, 0x42, 0x97, 0x5d, 0xea, 0x06, 0x16, 0x1f, 0x0b, 0x5d, 0xbc, 0xd8, 0xb5, 0xb9, 0xf9, 0x08,
3099
+	0x01, 0xf4, 0x98, 0xf3, 0x3e, 0xf3, 0x43, 0xfa, 0x79, 0x88, 0x6f, 0x03, 0x2c, 0x79, 0x2a, 0xa8,
3100
+	0x86, 0xea, 0xc5, 0xf6, 0x76, 0x34, 0x37, 0x8a, 0x09, 0x0e, 0x29, 0x26, 0x34, 0xf8, 0x26, 0xe4,
3101
+	0x15, 0x8c, 0x30, 0xab, 0xd8, 0x86, 0x68, 0x6e, 0xe4, 0x24, 0x0b, 0xc9, 0x49, 0x94, 0x58, 0xa4,
3102
+	0x48, 0x84, 0x77, 0x4a, 0x24, 0x41, 0x48, 0x4e, 0x72, 0x98, 0x7f, 0x4a, 0x8c, 0xfb, 0x94, 0x73,
3103
+	0xcb, 0xa1, 0xf8, 0x1d, 0xc8, 0x8f, 0x24, 0x91, 0x60, 0x28, 0xb5, 0xf4, 0x0d, 0xb7, 0xa7, 0xb8,
3104
+	0xdb, 0x5b, 0xe7, 0x73, 0x23, 0x43, 0x16, 0x45, 0xf8, 0x6d, 0x28, 0x26, 0x01, 0x12, 0x68, 0xcf,
3105
+	0xbf, 0x9c, 0xa5, 0x18, 0xbf, 0x09, 0x39, 0x99, 0x04, 0x01, 0xfb, 0xc2, 0xd8, 0x28, 0x71, 0x9c,
3106
+	0x0e, 0xdb, 0x0a, 0x2d, 0x11, 0x84, 0xab, 0x44, 0x8c, 0xcd, 0xef, 0x11, 0xec, 0xab, 0x68, 0x0e,
3107
+	0x69, 0x8f, 0x39, 0x9c, 0xd0, 0xcf, 0x66, 0x94, 0x87, 0xf8, 0x2e, 0x14, 0xb8, 0x0a, 0x80, 0x3a,
3108
+	0x9e, 0xb1, 0x69, 0x17, 0x25, 0x23, 0x49, 0x01, 0xee, 0x40, 0x9e, 0xc9, 0x8c, 0xab, 0x83, 0x1d,
3109
+	0x6e, 0xaa, 0x5d, 0xed, 0x0a, 0xb2, 0x28, 0x35, 0x3f, 0xf9, 0x0f, 0xda, 0xc2, 0xf8, 0x77, 0xa1,
3110
+	0x30, 0x91, 0x43, 0x19, 0xc6, 0xcd, 0xce, 0xab, 0x0a, 0xe5, 0x7c, 0x52, 0x65, 0xbe, 0x02, 0xd5,
3111
+	0x9e, 0xcb, 0x43, 0xea, 0xa7, 0xf7, 0x5f, 0x1c, 0xdd, 0xfc, 0x0d, 0x41, 0x39, 0xbd, 0xb0, 0xd8,
3112
+	0xf7, 0x00, 0xb4, 0x24, 0x6f, 0xb9, 0x68, 0x6e, 0x68, 0xdd, 0x0e, 0xd1, 0x5c, 0xfb, 0x82, 0x55,
3113
+	0xda, 0x4b, 0x58, 0x95, 0xbd, 0xb4, 0x55, 0x78, 0x1f, 0xae, 0x8c, 0x3c, 0xc6, 0x65, 0x93, 0x17,
3114
+	0x88, 0x9c, 0x98, 0x3f, 0x22, 0xc0, 0x1f, 0xcd, 0x86, 0x9e, 0xcb, 0x3f, 0x4d, 0xfb, 0x77, 0x17,
3115
+	0x76, 0x79, 0xea, 0x65, 0xcb, 0x26, 0xc2, 0xd1, 0xdc, 0xd8, 0x49, 0xef, 0xd3, 0xed, 0x90, 0x9d,
3116
+	0xb4, 0xb4, 0x6b, 0x5f, 0x30, 0x5f, 0xbb, 0x8c, 0xf9, 0x4b, 0xd6, 0x6c, 0x9a, 0xf5, 0x3a, 0x94,
3117
+	0x53, 0xa8, 0x84, 0xf2, 0x29, 0xf3, 0x39, 0x3d, 0x7c, 0x8a, 0xa0, 0x98, 0x24, 0x19, 0xdf, 0x06,
3118
+	0xdc, 0x3b, 0xfe, 0xe0, 0xb4, 0x3f, 0x20, 0xf7, 0xde, 0xbb, 0x7f, 0x7a, 0x72, 0xf4, 0xe1, 0xd1,
3119
+	0xf1, 0xc7, 0x47, 0x7b, 0x99, 0xea, 0xfe, 0xe3, 0x27, 0xb5, 0xbd, 0x44, 0x76, 0xe2, 0x8f, 0x7d,
3120
+	0x76, 0xe6, 0xe3, 0x43, 0xb8, 0x96, 0x52, 0xf7, 0x07, 0x9d, 0xe3, 0x93, 0xc1, 0x1e, 0xaa, 0x96,
3121
+	0x1f, 0x3f, 0xa9, 0xed, 0x26, 0xe2, 0x7e, 0x68, 0xb3, 0x59, 0xb8, 0xaa, 0xbd, 0x47, 0xc8, 0x9e,
3122
+	0xb6, 0xaa, 0xa5, 0x41, 0x50, 0xbd, 0xf6, 0xf5, 0x0f, 0x7a, 0xe6, 0xd7, 0xa7, 0xfa, 0x12, 0xac,
3123
+	0xf5, 0x08, 0xc1, 0x56, 0xcc, 0x8d, 0xbf, 0x80, 0xed, 0x0b, 0x99, 0xc5, 0xf5, 0x75, 0xee, 0xac,
3124
+	0xeb, 0xb8, 0xea, 0x8b, 0x95, 0xca, 0x51, 0xf3, 0xfa, 0xef, 0x3f, 0xff, 0xf3, 0x9d, 0xb6, 0x0b,
3125
+	0xdb, 0x42, 0xf9, 0xda, 0xc4, 0xf2, 0x2d, 0x87, 0x06, 0x77, 0x50, 0xeb, 0x27, 0x4d, 0xb8, 0xd5,
3126
+	0x16, 0xff, 0x6f, 0xf8, 0x5b, 0x04, 0xe5, 0x35, 0x31, 0xc7, 0x8d, 0xb5, 0x17, 0xb6, 0xb1, 0x1f,
3127
+	0xaa, 0xaf, 0x3e, 0x07, 0x2c, 0xdd, 0x20, 0xe6, 0x4d, 0xc1, 0x75, 0x03, 0xae, 0x4a, 0xae, 0x33,
3128
+	0x16, 0x8c, 0x69, 0xb0, 0x42, 0x89, 0xbf, 0x42, 0x50, 0x4a, 0xdd, 0x35, 0xbe, 0xb5, 0xee, 0xfd,
3129
+	0xab, 0xb9, 0x5d, 0xcf, 0xb1, 0x26, 0x34, 0xff, 0x8b, 0xa3, 0x8e, 0xda, 0x95, 0xf3, 0x67, 0x7a,
3130
+	0xe6, 0xaf, 0x67, 0x7a, 0xe6, 0xcb, 0x48, 0x47, 0xe7, 0x91, 0x8e, 0xfe, 0x88, 0x74, 0xf4, 0x77,
3131
+	0xa4, 0xa3, 0x61, 0x4e, 0xfc, 0xfe, 0xbe, 0xf1, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa3, 0x37,
3132
+	0x34, 0x6f, 0x2d, 0x08, 0x00, 0x00,
3133 3133
 }
... ...
@@ -167,6 +167,12 @@ message PublishLogsMessage {
167 167
 
168 168
 	// Messages is the log message for publishing.
169 169
 	repeated LogMessage messages = 2 [(gogoproto.nullable) = false];
170
+
171
+	// Close is a boolean for whether or not the client has completed its log
172
+	// stream. When close is called, the manager can hang up the subscription.
173
+	// Any further logs from this subscription are an error condition. Any
174
+	// messages included when close is set can be discarded
175
+	bool close = 3;
170 176
 }
171 177
 
172 178
 message PublishLogsResponse { }
... ...
@@ -106,7 +106,7 @@ func (x EndpointSpec_ResolutionMode) String() string {
106 106
 	return proto.EnumName(EndpointSpec_ResolutionMode_name, int32(x))
107 107
 }
108 108
 func (EndpointSpec_ResolutionMode) EnumDescriptor() ([]byte, []int) {
109
-	return fileDescriptorSpecs, []int{8, 0}
109
+	return fileDescriptorSpecs, []int{7, 0}
110 110
 }
111 111
 
112 112
 type NodeSpec struct {
... ...
@@ -289,7 +289,6 @@ type TaskSpec struct {
289 289
 	// Types that are valid to be assigned to Runtime:
290 290
 	//	*TaskSpec_Attachment
291 291
 	//	*TaskSpec_Container
292
-	//	*TaskSpec_Plugin
293 292
 	Runtime isTaskSpec_Runtime `protobuf_oneof:"runtime"`
294 293
 	// Resource requirements for the container.
295 294
 	Resources *ResourceRequirements `protobuf:"bytes,2,opt,name=resources" json:"resources,omitempty"`
... ...
@@ -327,13 +326,9 @@ type TaskSpec_Attachment struct {
327 327
 type TaskSpec_Container struct {
328 328
 	Container *ContainerSpec `protobuf:"bytes,1,opt,name=container,oneof"`
329 329
 }
330
-type TaskSpec_Plugin struct {
331
-	Plugin *PluginSpec `protobuf:"bytes,10,opt,name=plugin,oneof"`
332
-}
333 330
 
334 331
 func (*TaskSpec_Attachment) isTaskSpec_Runtime() {}
335 332
 func (*TaskSpec_Container) isTaskSpec_Runtime()  {}
336
-func (*TaskSpec_Plugin) isTaskSpec_Runtime()     {}
337 333
 
338 334
 func (m *TaskSpec) GetRuntime() isTaskSpec_Runtime {
339 335
 	if m != nil {
... ...
@@ -356,19 +351,11 @@ func (m *TaskSpec) GetContainer() *ContainerSpec {
356 356
 	return nil
357 357
 }
358 358
 
359
-func (m *TaskSpec) GetPlugin() *PluginSpec {
360
-	if x, ok := m.GetRuntime().(*TaskSpec_Plugin); ok {
361
-		return x.Plugin
362
-	}
363
-	return nil
364
-}
365
-
366 359
 // XXX_OneofFuncs is for the internal use of the proto package.
367 360
 func (*TaskSpec) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
368 361
 	return _TaskSpec_OneofMarshaler, _TaskSpec_OneofUnmarshaler, _TaskSpec_OneofSizer, []interface{}{
369 362
 		(*TaskSpec_Attachment)(nil),
370 363
 		(*TaskSpec_Container)(nil),
371
-		(*TaskSpec_Plugin)(nil),
372 364
 	}
373 365
 }
374 366
 
... ...
@@ -386,11 +373,6 @@ func _TaskSpec_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
386 386
 		if err := b.EncodeMessage(x.Container); err != nil {
387 387
 			return err
388 388
 		}
389
-	case *TaskSpec_Plugin:
390
-		_ = b.EncodeVarint(10<<3 | proto.WireBytes)
391
-		if err := b.EncodeMessage(x.Plugin); err != nil {
392
-			return err
393
-		}
394 389
 	case nil:
395 390
 	default:
396 391
 		return fmt.Errorf("TaskSpec.Runtime has unexpected type %T", x)
... ...
@@ -417,14 +399,6 @@ func _TaskSpec_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffe
417 417
 		err := b.DecodeMessage(msg)
418 418
 		m.Runtime = &TaskSpec_Container{msg}
419 419
 		return true, err
420
-	case 10: // runtime.plugin
421
-		if wire != proto.WireBytes {
422
-			return true, proto.ErrInternalBadWireType
423
-		}
424
-		msg := new(PluginSpec)
425
-		err := b.DecodeMessage(msg)
426
-		m.Runtime = &TaskSpec_Plugin{msg}
427
-		return true, err
428 420
 	default:
429 421
 		return false, nil
430 422
 	}
... ...
@@ -444,11 +418,6 @@ func _TaskSpec_OneofSizer(msg proto.Message) (n int) {
444 444
 		n += proto.SizeVarint(1<<3 | proto.WireBytes)
445 445
 		n += proto.SizeVarint(uint64(s))
446 446
 		n += s
447
-	case *TaskSpec_Plugin:
448
-		s := proto.Size(x.Plugin)
449
-		n += proto.SizeVarint(10<<3 | proto.WireBytes)
450
-		n += proto.SizeVarint(uint64(s))
451
-		n += s
452 447
 	case nil:
453 448
 	default:
454 449
 		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
... ...
@@ -590,18 +559,6 @@ func (m *ContainerSpec_DNSConfig) Reset()                    { *m = ContainerSpe
590 590
 func (*ContainerSpec_DNSConfig) ProtoMessage()               {}
591 591
 func (*ContainerSpec_DNSConfig) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{6, 2} }
592 592
 
593
-// PluginSpec specifies runtime parameters for a plugin.
594
-type PluginSpec struct {
595
-	// image defines the image reference, as specified in the
596
-	// distribution/reference package. This may include a registry host, name,
597
-	// tag or digest.
598
-	Image string `protobuf:"bytes,1,opt,name=image,proto3" json:"image,omitempty"`
599
-}
600
-
601
-func (m *PluginSpec) Reset()                    { *m = PluginSpec{} }
602
-func (*PluginSpec) ProtoMessage()               {}
603
-func (*PluginSpec) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{7} }
604
-
605 593
 // EndpointSpec defines the properties that can be configured to
606 594
 // access and loadbalance the service.
607 595
 type EndpointSpec struct {
... ...
@@ -613,7 +570,7 @@ type EndpointSpec struct {
613 613
 
614 614
 func (m *EndpointSpec) Reset()                    { *m = EndpointSpec{} }
615 615
 func (*EndpointSpec) ProtoMessage()               {}
616
-func (*EndpointSpec) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{8} }
616
+func (*EndpointSpec) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{7} }
617 617
 
618 618
 // NetworkSpec specifies user defined network parameters.
619 619
 type NetworkSpec struct {
... ...
@@ -638,7 +595,7 @@ type NetworkSpec struct {
638 638
 
639 639
 func (m *NetworkSpec) Reset()                    { *m = NetworkSpec{} }
640 640
 func (*NetworkSpec) ProtoMessage()               {}
641
-func (*NetworkSpec) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{9} }
641
+func (*NetworkSpec) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{8} }
642 642
 
643 643
 // ClusterSpec specifies global cluster settings.
644 644
 type ClusterSpec struct {
... ...
@@ -663,7 +620,7 @@ type ClusterSpec struct {
663 663
 
664 664
 func (m *ClusterSpec) Reset()                    { *m = ClusterSpec{} }
665 665
 func (*ClusterSpec) ProtoMessage()               {}
666
-func (*ClusterSpec) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{10} }
666
+func (*ClusterSpec) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{9} }
667 667
 
668 668
 // SecretSpec specifies a user-provided secret.
669 669
 type SecretSpec struct {
... ...
@@ -674,7 +631,7 @@ type SecretSpec struct {
674 674
 
675 675
 func (m *SecretSpec) Reset()                    { *m = SecretSpec{} }
676 676
 func (*SecretSpec) ProtoMessage()               {}
677
-func (*SecretSpec) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{11} }
677
+func (*SecretSpec) Descriptor() ([]byte, []int) { return fileDescriptorSpecs, []int{10} }
678 678
 
679 679
 func init() {
680 680
 	proto.RegisterType((*NodeSpec)(nil), "docker.swarmkit.v1.NodeSpec")
... ...
@@ -686,7 +643,6 @@ func init() {
686 686
 	proto.RegisterType((*ContainerSpec)(nil), "docker.swarmkit.v1.ContainerSpec")
687 687
 	proto.RegisterType((*ContainerSpec_PullOptions)(nil), "docker.swarmkit.v1.ContainerSpec.PullOptions")
688 688
 	proto.RegisterType((*ContainerSpec_DNSConfig)(nil), "docker.swarmkit.v1.ContainerSpec.DNSConfig")
689
-	proto.RegisterType((*PluginSpec)(nil), "docker.swarmkit.v1.PluginSpec")
690 689
 	proto.RegisterType((*EndpointSpec)(nil), "docker.swarmkit.v1.EndpointSpec")
691 690
 	proto.RegisterType((*NetworkSpec)(nil), "docker.swarmkit.v1.NetworkSpec")
692 691
 	proto.RegisterType((*ClusterSpec)(nil), "docker.swarmkit.v1.ClusterSpec")
... ...
@@ -842,12 +798,6 @@ func (m *TaskSpec) CopyFrom(src interface{}) {
842 842
 			}
843 843
 			github_com_docker_swarmkit_api_deepcopy.Copy(v.Container, o.GetContainer())
844 844
 			m.Runtime = &v
845
-		case *TaskSpec_Plugin:
846
-			v := TaskSpec_Plugin{
847
-				Plugin: &PluginSpec{},
848
-			}
849
-			github_com_docker_swarmkit_api_deepcopy.Copy(v.Plugin, o.GetPlugin())
850
-			m.Runtime = &v
851 845
 		}
852 846
 	}
853 847
 
... ...
@@ -991,21 +941,6 @@ func (m *ContainerSpec_DNSConfig) CopyFrom(src interface{}) {
991 991
 
992 992
 }
993 993
 
994
-func (m *PluginSpec) Copy() *PluginSpec {
995
-	if m == nil {
996
-		return nil
997
-	}
998
-	o := &PluginSpec{}
999
-	o.CopyFrom(m)
1000
-	return o
1001
-}
1002
-
1003
-func (m *PluginSpec) CopyFrom(src interface{}) {
1004
-
1005
-	o := src.(*PluginSpec)
1006
-	*m = *o
1007
-}
1008
-
1009 994
 func (m *EndpointSpec) Copy() *EndpointSpec {
1010 995
 	if m == nil {
1011 996
 		return nil
... ...
@@ -1395,20 +1330,6 @@ func (m *TaskSpec_Attachment) MarshalTo(dAtA []byte) (int, error) {
1395 1395
 	}
1396 1396
 	return i, nil
1397 1397
 }
1398
-func (m *TaskSpec_Plugin) MarshalTo(dAtA []byte) (int, error) {
1399
-	i := 0
1400
-	if m.Plugin != nil {
1401
-		dAtA[i] = 0x52
1402
-		i++
1403
-		i = encodeVarintSpecs(dAtA, i, uint64(m.Plugin.Size()))
1404
-		n17, err := m.Plugin.MarshalTo(dAtA[i:])
1405
-		if err != nil {
1406
-			return 0, err
1407
-		}
1408
-		i += n17
1409
-	}
1410
-	return i, nil
1411
-}
1412 1398
 func (m *NetworkAttachmentSpec) Marshal() (dAtA []byte, err error) {
1413 1399
 	size := m.Size()
1414 1400
 	dAtA = make([]byte, size)
... ...
@@ -1544,21 +1465,21 @@ func (m *ContainerSpec) MarshalTo(dAtA []byte) (int, error) {
1544 1544
 		dAtA[i] = 0x4a
1545 1545
 		i++
1546 1546
 		i = encodeVarintSpecs(dAtA, i, uint64(m.StopGracePeriod.Size()))
1547
-		n18, err := m.StopGracePeriod.MarshalTo(dAtA[i:])
1547
+		n17, err := m.StopGracePeriod.MarshalTo(dAtA[i:])
1548 1548
 		if err != nil {
1549 1549
 			return 0, err
1550 1550
 		}
1551
-		i += n18
1551
+		i += n17
1552 1552
 	}
1553 1553
 	if m.PullOptions != nil {
1554 1554
 		dAtA[i] = 0x52
1555 1555
 		i++
1556 1556
 		i = encodeVarintSpecs(dAtA, i, uint64(m.PullOptions.Size()))
1557
-		n19, err := m.PullOptions.MarshalTo(dAtA[i:])
1557
+		n18, err := m.PullOptions.MarshalTo(dAtA[i:])
1558 1558
 		if err != nil {
1559 1559
 			return 0, err
1560 1560
 		}
1561
-		i += n19
1561
+		i += n18
1562 1562
 	}
1563 1563
 	if len(m.Groups) > 0 {
1564 1564
 		for _, s := range m.Groups {
... ...
@@ -1607,11 +1528,11 @@ func (m *ContainerSpec) MarshalTo(dAtA []byte) (int, error) {
1607 1607
 		dAtA[i] = 0x7a
1608 1608
 		i++
1609 1609
 		i = encodeVarintSpecs(dAtA, i, uint64(m.DNSConfig.Size()))
1610
-		n20, err := m.DNSConfig.MarshalTo(dAtA[i:])
1610
+		n19, err := m.DNSConfig.MarshalTo(dAtA[i:])
1611 1611
 		if err != nil {
1612 1612
 			return 0, err
1613 1613
 		}
1614
-		i += n20
1614
+		i += n19
1615 1615
 	}
1616 1616
 	if m.Healthcheck != nil {
1617 1617
 		dAtA[i] = 0x82
... ...
@@ -1619,11 +1540,11 @@ func (m *ContainerSpec) MarshalTo(dAtA []byte) (int, error) {
1619 1619
 		dAtA[i] = 0x1
1620 1620
 		i++
1621 1621
 		i = encodeVarintSpecs(dAtA, i, uint64(m.Healthcheck.Size()))
1622
-		n21, err := m.Healthcheck.MarshalTo(dAtA[i:])
1622
+		n20, err := m.Healthcheck.MarshalTo(dAtA[i:])
1623 1623
 		if err != nil {
1624 1624
 			return 0, err
1625 1625
 		}
1626
-		i += n21
1626
+		i += n20
1627 1627
 	}
1628 1628
 	if len(m.Hosts) > 0 {
1629 1629
 		for _, s := range m.Hosts {
... ...
@@ -1766,30 +1687,6 @@ func (m *ContainerSpec_DNSConfig) MarshalTo(dAtA []byte) (int, error) {
1766 1766
 	return i, nil
1767 1767
 }
1768 1768
 
1769
-func (m *PluginSpec) Marshal() (dAtA []byte, err error) {
1770
-	size := m.Size()
1771
-	dAtA = make([]byte, size)
1772
-	n, err := m.MarshalTo(dAtA)
1773
-	if err != nil {
1774
-		return nil, err
1775
-	}
1776
-	return dAtA[:n], nil
1777
-}
1778
-
1779
-func (m *PluginSpec) MarshalTo(dAtA []byte) (int, error) {
1780
-	var i int
1781
-	_ = i
1782
-	var l int
1783
-	_ = l
1784
-	if len(m.Image) > 0 {
1785
-		dAtA[i] = 0xa
1786
-		i++
1787
-		i = encodeVarintSpecs(dAtA, i, uint64(len(m.Image)))
1788
-		i += copy(dAtA[i:], m.Image)
1789
-	}
1790
-	return i, nil
1791
-}
1792
-
1793 1769
 func (m *EndpointSpec) Marshal() (dAtA []byte, err error) {
1794 1770
 	size := m.Size()
1795 1771
 	dAtA = make([]byte, size)
... ...
@@ -1843,20 +1740,20 @@ func (m *NetworkSpec) MarshalTo(dAtA []byte) (int, error) {
1843 1843
 	dAtA[i] = 0xa
1844 1844
 	i++
1845 1845
 	i = encodeVarintSpecs(dAtA, i, uint64(m.Annotations.Size()))
1846
-	n22, err := m.Annotations.MarshalTo(dAtA[i:])
1846
+	n21, err := m.Annotations.MarshalTo(dAtA[i:])
1847 1847
 	if err != nil {
1848 1848
 		return 0, err
1849 1849
 	}
1850
-	i += n22
1850
+	i += n21
1851 1851
 	if m.DriverConfig != nil {
1852 1852
 		dAtA[i] = 0x12
1853 1853
 		i++
1854 1854
 		i = encodeVarintSpecs(dAtA, i, uint64(m.DriverConfig.Size()))
1855
-		n23, err := m.DriverConfig.MarshalTo(dAtA[i:])
1855
+		n22, err := m.DriverConfig.MarshalTo(dAtA[i:])
1856 1856
 		if err != nil {
1857 1857
 			return 0, err
1858 1858
 		}
1859
-		i += n23
1859
+		i += n22
1860 1860
 	}
1861 1861
 	if m.Ipv6Enabled {
1862 1862
 		dAtA[i] = 0x18
... ...
@@ -1882,11 +1779,11 @@ func (m *NetworkSpec) MarshalTo(dAtA []byte) (int, error) {
1882 1882
 		dAtA[i] = 0x2a
1883 1883
 		i++
1884 1884
 		i = encodeVarintSpecs(dAtA, i, uint64(m.IPAM.Size()))
1885
-		n24, err := m.IPAM.MarshalTo(dAtA[i:])
1885
+		n23, err := m.IPAM.MarshalTo(dAtA[i:])
1886 1886
 		if err != nil {
1887 1887
 			return 0, err
1888 1888
 		}
1889
-		i += n24
1889
+		i += n23
1890 1890
 	}
1891 1891
 	if m.Attachable {
1892 1892
 		dAtA[i] = 0x30
... ...
@@ -1919,67 +1816,67 @@ func (m *ClusterSpec) MarshalTo(dAtA []byte) (int, error) {
1919 1919
 	dAtA[i] = 0xa
1920 1920
 	i++
1921 1921
 	i = encodeVarintSpecs(dAtA, i, uint64(m.Annotations.Size()))
1922
-	n25, err := m.Annotations.MarshalTo(dAtA[i:])
1922
+	n24, err := m.Annotations.MarshalTo(dAtA[i:])
1923 1923
 	if err != nil {
1924 1924
 		return 0, err
1925 1925
 	}
1926
-	i += n25
1926
+	i += n24
1927 1927
 	dAtA[i] = 0x12
1928 1928
 	i++
1929 1929
 	i = encodeVarintSpecs(dAtA, i, uint64(m.AcceptancePolicy.Size()))
1930
-	n26, err := m.AcceptancePolicy.MarshalTo(dAtA[i:])
1930
+	n25, err := m.AcceptancePolicy.MarshalTo(dAtA[i:])
1931 1931
 	if err != nil {
1932 1932
 		return 0, err
1933 1933
 	}
1934
-	i += n26
1934
+	i += n25
1935 1935
 	dAtA[i] = 0x1a
1936 1936
 	i++
1937 1937
 	i = encodeVarintSpecs(dAtA, i, uint64(m.Orchestration.Size()))
1938
-	n27, err := m.Orchestration.MarshalTo(dAtA[i:])
1938
+	n26, err := m.Orchestration.MarshalTo(dAtA[i:])
1939 1939
 	if err != nil {
1940 1940
 		return 0, err
1941 1941
 	}
1942
-	i += n27
1942
+	i += n26
1943 1943
 	dAtA[i] = 0x22
1944 1944
 	i++
1945 1945
 	i = encodeVarintSpecs(dAtA, i, uint64(m.Raft.Size()))
1946
-	n28, err := m.Raft.MarshalTo(dAtA[i:])
1946
+	n27, err := m.Raft.MarshalTo(dAtA[i:])
1947 1947
 	if err != nil {
1948 1948
 		return 0, err
1949 1949
 	}
1950
-	i += n28
1950
+	i += n27
1951 1951
 	dAtA[i] = 0x2a
1952 1952
 	i++
1953 1953
 	i = encodeVarintSpecs(dAtA, i, uint64(m.Dispatcher.Size()))
1954
-	n29, err := m.Dispatcher.MarshalTo(dAtA[i:])
1954
+	n28, err := m.Dispatcher.MarshalTo(dAtA[i:])
1955 1955
 	if err != nil {
1956 1956
 		return 0, err
1957 1957
 	}
1958
-	i += n29
1958
+	i += n28
1959 1959
 	dAtA[i] = 0x32
1960 1960
 	i++
1961 1961
 	i = encodeVarintSpecs(dAtA, i, uint64(m.CAConfig.Size()))
1962
-	n30, err := m.CAConfig.MarshalTo(dAtA[i:])
1962
+	n29, err := m.CAConfig.MarshalTo(dAtA[i:])
1963 1963
 	if err != nil {
1964 1964
 		return 0, err
1965 1965
 	}
1966
-	i += n30
1966
+	i += n29
1967 1967
 	dAtA[i] = 0x3a
1968 1968
 	i++
1969 1969
 	i = encodeVarintSpecs(dAtA, i, uint64(m.TaskDefaults.Size()))
1970
-	n31, err := m.TaskDefaults.MarshalTo(dAtA[i:])
1970
+	n30, err := m.TaskDefaults.MarshalTo(dAtA[i:])
1971 1971
 	if err != nil {
1972 1972
 		return 0, err
1973 1973
 	}
1974
-	i += n31
1974
+	i += n30
1975 1975
 	dAtA[i] = 0x42
1976 1976
 	i++
1977 1977
 	i = encodeVarintSpecs(dAtA, i, uint64(m.EncryptionConfig.Size()))
1978
-	n32, err := m.EncryptionConfig.MarshalTo(dAtA[i:])
1978
+	n31, err := m.EncryptionConfig.MarshalTo(dAtA[i:])
1979 1979
 	if err != nil {
1980 1980
 		return 0, err
1981 1981
 	}
1982
-	i += n32
1982
+	i += n31
1983 1983
 	return i, nil
1984 1984
 }
1985 1985
 
... ...
@@ -2001,11 +1898,11 @@ func (m *SecretSpec) MarshalTo(dAtA []byte) (int, error) {
2001 2001
 	dAtA[i] = 0xa
2002 2002
 	i++
2003 2003
 	i = encodeVarintSpecs(dAtA, i, uint64(m.Annotations.Size()))
2004
-	n33, err := m.Annotations.MarshalTo(dAtA[i:])
2004
+	n32, err := m.Annotations.MarshalTo(dAtA[i:])
2005 2005
 	if err != nil {
2006 2006
 		return 0, err
2007 2007
 	}
2008
-	i += n33
2008
+	i += n32
2009 2009
 	if len(m.Data) > 0 {
2010 2010
 		dAtA[i] = 0x12
2011 2011
 		i++
... ...
@@ -2176,15 +2073,6 @@ func (m *TaskSpec_Attachment) Size() (n int) {
2176 2176
 	}
2177 2177
 	return n
2178 2178
 }
2179
-func (m *TaskSpec_Plugin) Size() (n int) {
2180
-	var l int
2181
-	_ = l
2182
-	if m.Plugin != nil {
2183
-		l = m.Plugin.Size()
2184
-		n += 1 + l + sovSpecs(uint64(l))
2185
-	}
2186
-	return n
2187
-}
2188 2179
 func (m *NetworkAttachmentSpec) Size() (n int) {
2189 2180
 	var l int
2190 2181
 	_ = l
... ...
@@ -2330,16 +2218,6 @@ func (m *ContainerSpec_DNSConfig) Size() (n int) {
2330 2330
 	return n
2331 2331
 }
2332 2332
 
2333
-func (m *PluginSpec) Size() (n int) {
2334
-	var l int
2335
-	_ = l
2336
-	l = len(m.Image)
2337
-	if l > 0 {
2338
-		n += 1 + l + sovSpecs(uint64(l))
2339
-	}
2340
-	return n
2341
-}
2342
-
2343 2333
 func (m *EndpointSpec) Size() (n int) {
2344 2334
 	var l int
2345 2335
 	_ = l
... ...
@@ -2531,16 +2409,6 @@ func (this *TaskSpec_Attachment) String() string {
2531 2531
 	}, "")
2532 2532
 	return s
2533 2533
 }
2534
-func (this *TaskSpec_Plugin) String() string {
2535
-	if this == nil {
2536
-		return "nil"
2537
-	}
2538
-	s := strings.Join([]string{`&TaskSpec_Plugin{`,
2539
-		`Plugin:` + strings.Replace(fmt.Sprintf("%v", this.Plugin), "PluginSpec", "PluginSpec", 1) + `,`,
2540
-		`}`,
2541
-	}, "")
2542
-	return s
2543
-}
2544 2534
 func (this *NetworkAttachmentSpec) String() string {
2545 2535
 	if this == nil {
2546 2536
 		return "nil"
... ...
@@ -2612,16 +2480,6 @@ func (this *ContainerSpec_DNSConfig) String() string {
2612 2612
 	}, "")
2613 2613
 	return s
2614 2614
 }
2615
-func (this *PluginSpec) String() string {
2616
-	if this == nil {
2617
-		return "nil"
2618
-	}
2619
-	s := strings.Join([]string{`&PluginSpec{`,
2620
-		`Image:` + fmt.Sprintf("%v", this.Image) + `,`,
2621
-		`}`,
2622
-	}, "")
2623
-	return s
2624
-}
2625 2615
 func (this *EndpointSpec) String() string {
2626 2616
 	if this == nil {
2627 2617
 		return "nil"
... ...
@@ -3519,38 +3377,6 @@ func (m *TaskSpec) Unmarshal(dAtA []byte) error {
3519 3519
 					break
3520 3520
 				}
3521 3521
 			}
3522
-		case 10:
3523
-			if wireType != 2 {
3524
-				return fmt.Errorf("proto: wrong wireType = %d for field Plugin", wireType)
3525
-			}
3526
-			var msglen int
3527
-			for shift := uint(0); ; shift += 7 {
3528
-				if shift >= 64 {
3529
-					return ErrIntOverflowSpecs
3530
-				}
3531
-				if iNdEx >= l {
3532
-					return io.ErrUnexpectedEOF
3533
-				}
3534
-				b := dAtA[iNdEx]
3535
-				iNdEx++
3536
-				msglen |= (int(b) & 0x7F) << shift
3537
-				if b < 0x80 {
3538
-					break
3539
-				}
3540
-			}
3541
-			if msglen < 0 {
3542
-				return ErrInvalidLengthSpecs
3543
-			}
3544
-			postIndex := iNdEx + msglen
3545
-			if postIndex > l {
3546
-				return io.ErrUnexpectedEOF
3547
-			}
3548
-			v := &PluginSpec{}
3549
-			if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
3550
-				return err
3551
-			}
3552
-			m.Runtime = &TaskSpec_Plugin{v}
3553
-			iNdEx = postIndex
3554 3522
 		default:
3555 3523
 			iNdEx = preIndex
3556 3524
 			skippy, err := skipSpecs(dAtA[iNdEx:])
... ...
@@ -4577,85 +4403,6 @@ func (m *ContainerSpec_DNSConfig) Unmarshal(dAtA []byte) error {
4577 4577
 	}
4578 4578
 	return nil
4579 4579
 }
4580
-func (m *PluginSpec) Unmarshal(dAtA []byte) error {
4581
-	l := len(dAtA)
4582
-	iNdEx := 0
4583
-	for iNdEx < l {
4584
-		preIndex := iNdEx
4585
-		var wire uint64
4586
-		for shift := uint(0); ; shift += 7 {
4587
-			if shift >= 64 {
4588
-				return ErrIntOverflowSpecs
4589
-			}
4590
-			if iNdEx >= l {
4591
-				return io.ErrUnexpectedEOF
4592
-			}
4593
-			b := dAtA[iNdEx]
4594
-			iNdEx++
4595
-			wire |= (uint64(b) & 0x7F) << shift
4596
-			if b < 0x80 {
4597
-				break
4598
-			}
4599
-		}
4600
-		fieldNum := int32(wire >> 3)
4601
-		wireType := int(wire & 0x7)
4602
-		if wireType == 4 {
4603
-			return fmt.Errorf("proto: PluginSpec: wiretype end group for non-group")
4604
-		}
4605
-		if fieldNum <= 0 {
4606
-			return fmt.Errorf("proto: PluginSpec: illegal tag %d (wire type %d)", fieldNum, wire)
4607
-		}
4608
-		switch fieldNum {
4609
-		case 1:
4610
-			if wireType != 2 {
4611
-				return fmt.Errorf("proto: wrong wireType = %d for field Image", wireType)
4612
-			}
4613
-			var stringLen uint64
4614
-			for shift := uint(0); ; shift += 7 {
4615
-				if shift >= 64 {
4616
-					return ErrIntOverflowSpecs
4617
-				}
4618
-				if iNdEx >= l {
4619
-					return io.ErrUnexpectedEOF
4620
-				}
4621
-				b := dAtA[iNdEx]
4622
-				iNdEx++
4623
-				stringLen |= (uint64(b) & 0x7F) << shift
4624
-				if b < 0x80 {
4625
-					break
4626
-				}
4627
-			}
4628
-			intStringLen := int(stringLen)
4629
-			if intStringLen < 0 {
4630
-				return ErrInvalidLengthSpecs
4631
-			}
4632
-			postIndex := iNdEx + intStringLen
4633
-			if postIndex > l {
4634
-				return io.ErrUnexpectedEOF
4635
-			}
4636
-			m.Image = string(dAtA[iNdEx:postIndex])
4637
-			iNdEx = postIndex
4638
-		default:
4639
-			iNdEx = preIndex
4640
-			skippy, err := skipSpecs(dAtA[iNdEx:])
4641
-			if err != nil {
4642
-				return err
4643
-			}
4644
-			if skippy < 0 {
4645
-				return ErrInvalidLengthSpecs
4646
-			}
4647
-			if (iNdEx + skippy) > l {
4648
-				return io.ErrUnexpectedEOF
4649
-			}
4650
-			iNdEx += skippy
4651
-		}
4652
-	}
4653
-
4654
-	if iNdEx > l {
4655
-		return io.ErrUnexpectedEOF
4656
-	}
4657
-	return nil
4658
-}
4659 4580
 func (m *EndpointSpec) Unmarshal(dAtA []byte) error {
4660 4581
 	l := len(dAtA)
4661 4582
 	iNdEx := 0
... ...
@@ -5471,114 +5218,112 @@ var (
5471 5471
 func init() { proto.RegisterFile("specs.proto", fileDescriptorSpecs) }
5472 5472
 
5473 5473
 var fileDescriptorSpecs = []byte{
5474
-	// 1730 bytes of a gzipped FileDescriptorProto
5474
+	// 1707 bytes of a gzipped FileDescriptorProto
5475 5475
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x57, 0x41, 0x73, 0x1b, 0xb7,
5476
-	0x15, 0x26, 0x25, 0x8a, 0x5a, 0xbe, 0xa5, 0x6c, 0x0a, 0x4d, 0xd2, 0x35, 0xdd, 0x90, 0x34, 0xe3,
5476
+	0x15, 0x26, 0x25, 0x8a, 0x5a, 0xbe, 0xa5, 0x6c, 0x1a, 0x75, 0xd2, 0x35, 0xdd, 0x90, 0x34, 0xe3,
5477 5477
 	0xa6, 0x4a, 0x33, 0xa5, 0xa6, 0x6a, 0x27, 0x75, 0xea, 0x66, 0x5a, 0x52, 0x64, 0x65, 0x55, 0x95,
5478 5478
 	0xcc, 0x01, 0x15, 0x77, 0x7c, 0xe2, 0x80, 0xbb, 0x10, 0xb9, 0xa3, 0xe5, 0x62, 0x0b, 0x60, 0x99,
5479
-	0xe1, 0xad, 0xc7, 0x8c, 0xcf, 0xbd, 0x6a, 0x7a, 0xe8, 0x6f, 0xe8, 0x7f, 0xf0, 0xb1, 0xc7, 0x9e,
5480
-	0x34, 0x0d, 0xff, 0x42, 0x7f, 0x40, 0x3b, 0xc0, 0x82, 0xe4, 0x32, 0x59, 0xc5, 0x9e, 0xa9, 0x6f,
5481
-	0xc0, 0xdb, 0xef, 0x7b, 0x78, 0x78, 0xf8, 0xf0, 0xf0, 0x16, 0x6c, 0x11, 0x51, 0x57, 0xb4, 0x22,
5482
-	0xce, 0x24, 0x43, 0xc8, 0x63, 0xee, 0x35, 0xe5, 0x2d, 0xf1, 0x15, 0xe1, 0xd3, 0x6b, 0x5f, 0xb6,
5483
-	0x66, 0x3f, 0xaf, 0xda, 0x72, 0x1e, 0x51, 0x03, 0xa8, 0xbe, 0x37, 0x66, 0x63, 0xa6, 0x87, 0x87,
5484
-	0x6a, 0x64, 0xac, 0xb5, 0x31, 0x63, 0xe3, 0x80, 0x1e, 0xea, 0xd9, 0x28, 0xbe, 0x3a, 0xf4, 0x62,
5485
-	0x4e, 0xa4, 0xcf, 0xc2, 0xe4, 0x7b, 0xf3, 0xa6, 0x00, 0xd6, 0x05, 0xf3, 0xe8, 0x20, 0xa2, 0x2e,
5486
-	0x3a, 0x01, 0x9b, 0x84, 0x21, 0x93, 0x1a, 0x20, 0x9c, 0x7c, 0x23, 0x7f, 0x60, 0x1f, 0xd5, 0x5b,
5487
-	0xdf, 0x5d, 0xb9, 0xd5, 0x5e, 0xc3, 0x3a, 0x85, 0xd7, 0xb7, 0xf5, 0x1c, 0x4e, 0x33, 0xd1, 0x6f,
5488
-	0xa1, 0xec, 0x51, 0xe1, 0x73, 0xea, 0x0d, 0x39, 0x0b, 0xa8, 0xb3, 0xd5, 0xc8, 0x1f, 0xdc, 0x3b,
5489
-	0xfa, 0x51, 0x96, 0x27, 0xb5, 0x38, 0x66, 0x01, 0xc5, 0xb6, 0x61, 0xa8, 0x09, 0x3a, 0x01, 0x98,
5490
-	0xd2, 0xe9, 0x88, 0x72, 0x31, 0xf1, 0x23, 0x67, 0x5b, 0xd3, 0x7f, 0x72, 0x17, 0x5d, 0xc5, 0xde,
5491
-	0x3a, 0x5f, 0xc1, 0x71, 0x8a, 0x8a, 0xce, 0xa1, 0x4c, 0x66, 0xc4, 0x0f, 0xc8, 0xc8, 0x0f, 0x7c,
5492
-	0x39, 0x77, 0x0a, 0xda, 0xd5, 0x27, 0xdf, 0xeb, 0xaa, 0x9d, 0x22, 0xe0, 0x0d, 0x7a, 0xd3, 0x03,
5493
-	0x58, 0x2f, 0x84, 0x3e, 0x86, 0xdd, 0x7e, 0xef, 0xa2, 0x7b, 0x7a, 0x71, 0x52, 0xc9, 0x55, 0x1f,
5494
-	0xbc, 0xba, 0x69, 0xbc, 0xaf, 0x7c, 0xac, 0x01, 0x7d, 0x1a, 0x7a, 0x7e, 0x38, 0x46, 0x07, 0x60,
5495
-	0xb5, 0x8f, 0x8f, 0x7b, 0xfd, 0xcb, 0x5e, 0xb7, 0x92, 0xaf, 0x56, 0x5f, 0xdd, 0x34, 0x3e, 0xd8,
5496
-	0x04, 0xb6, 0x5d, 0x97, 0x46, 0x92, 0x7a, 0xd5, 0xc2, 0xd7, 0x7f, 0xaf, 0xe5, 0x9a, 0x5f, 0xe7,
5497
-	0xa1, 0x9c, 0x0e, 0x02, 0x7d, 0x0c, 0xc5, 0xf6, 0xf1, 0xe5, 0xe9, 0x8b, 0x5e, 0x25, 0xb7, 0xa6,
5498
-	0xa7, 0x11, 0x6d, 0x57, 0xfa, 0x33, 0x8a, 0x1e, 0xc3, 0x4e, 0xbf, 0xfd, 0xe5, 0xa0, 0x57, 0xc9,
5499
-	0xaf, 0xc3, 0x49, 0xc3, 0xfa, 0x24, 0x16, 0x1a, 0xd5, 0xc5, 0xed, 0xd3, 0x8b, 0xca, 0x56, 0x36,
5500
-	0xaa, 0xcb, 0x89, 0x1f, 0x9a, 0x50, 0xfe, 0x56, 0x00, 0x7b, 0x40, 0xf9, 0xcc, 0x77, 0xdf, 0xb1,
5501
-	0x44, 0x3e, 0x83, 0x82, 0x24, 0xe2, 0x5a, 0x4b, 0xc3, 0xce, 0x96, 0xc6, 0x25, 0x11, 0xd7, 0x6a,
5502
-	0x51, 0x43, 0xd7, 0x78, 0xa5, 0x0c, 0x4e, 0xa3, 0xc0, 0x77, 0x89, 0xa4, 0x9e, 0x56, 0x86, 0x7d,
5503
-	0xf4, 0xe3, 0x2c, 0x36, 0x5e, 0xa1, 0x4c, 0xfc, 0xcf, 0x72, 0x38, 0x45, 0x45, 0x4f, 0xa1, 0x38,
5504
-	0x0e, 0xd8, 0x88, 0x04, 0x5a, 0x13, 0xf6, 0xd1, 0xa3, 0x2c, 0x27, 0x27, 0x1a, 0xb1, 0x76, 0x60,
5505
-	0x28, 0xe8, 0x09, 0x14, 0xe3, 0xc8, 0x23, 0x92, 0x3a, 0x45, 0x4d, 0x6e, 0x64, 0x91, 0xbf, 0xd4,
5506
-	0x88, 0x63, 0x16, 0x5e, 0xf9, 0x63, 0x6c, 0xf0, 0xe8, 0x0c, 0xac, 0x90, 0xca, 0xaf, 0x18, 0xbf,
5507
-	0x16, 0xce, 0x6e, 0x63, 0xfb, 0xc0, 0x3e, 0xfa, 0x34, 0x53, 0x8c, 0x09, 0xa6, 0x2d, 0x25, 0x71,
5508
-	0x27, 0x53, 0x1a, 0xca, 0xc4, 0x4d, 0x67, 0xcb, 0xc9, 0xe3, 0x95, 0x03, 0xf4, 0x1b, 0xb0, 0x68,
5509
-	0xe8, 0x45, 0xcc, 0x0f, 0xa5, 0x63, 0xdd, 0x1d, 0x48, 0xcf, 0x60, 0x54, 0x32, 0xf1, 0x8a, 0xa1,
5510
-	0xd8, 0x9c, 0x05, 0xc1, 0x88, 0xb8, 0xd7, 0x4e, 0xe9, 0x2d, 0xb7, 0xb1, 0x62, 0x74, 0x8a, 0x50,
5511
-	0x98, 0x32, 0x8f, 0x36, 0x0f, 0x61, 0xff, 0x3b, 0xa9, 0x46, 0x55, 0xb0, 0x4c, 0xaa, 0x13, 0x8d,
5512
-	0x14, 0xf0, 0x6a, 0xde, 0xbc, 0x0f, 0x7b, 0x1b, 0x69, 0x6d, 0xbe, 0x2e, 0x80, 0xb5, 0x3c, 0x6b,
5513
-	0xd4, 0x86, 0x92, 0xcb, 0x42, 0x49, 0xfc, 0x90, 0x72, 0x23, 0xaf, 0xcc, 0x93, 0x39, 0x5e, 0x82,
5514
-	0x14, 0xeb, 0x59, 0x0e, 0xaf, 0x59, 0xe8, 0xf7, 0x50, 0xe2, 0x54, 0xb0, 0x98, 0xbb, 0x54, 0x18,
5515
-	0x7d, 0x1d, 0x64, 0x2b, 0x24, 0x01, 0x61, 0xfa, 0xe7, 0xd8, 0xe7, 0x54, 0x65, 0x59, 0xe0, 0x35,
5516
-	0x15, 0x3d, 0x85, 0x5d, 0x4e, 0x85, 0x24, 0x5c, 0x7e, 0x9f, 0x44, 0x70, 0x02, 0xe9, 0xb3, 0xc0,
5517
-	0x77, 0xe7, 0x78, 0xc9, 0x40, 0x4f, 0xa1, 0x14, 0x05, 0xc4, 0xd5, 0x5e, 0x9d, 0x1d, 0x4d, 0xff,
5518
-	0x30, 0x8b, 0xde, 0x5f, 0x82, 0xf0, 0x1a, 0x8f, 0x3e, 0x07, 0x08, 0xd8, 0x78, 0xe8, 0x71, 0x7f,
5519
-	0x46, 0xb9, 0x91, 0x58, 0x35, 0x8b, 0xdd, 0xd5, 0x08, 0x5c, 0x0a, 0xd8, 0x38, 0x19, 0xa2, 0x93,
5520
-	0xff, 0x4b, 0x5f, 0x29, 0x6d, 0x9d, 0x01, 0x90, 0xd5, 0x57, 0xa3, 0xae, 0x4f, 0xde, 0xca, 0x95,
5521
-	0x39, 0x91, 0x14, 0x1d, 0x3d, 0x82, 0xf2, 0x15, 0xe3, 0x2e, 0x1d, 0x9a, 0x5b, 0x53, 0xd2, 0x9a,
5522
-	0xb0, 0xb5, 0x2d, 0xd1, 0x97, 0xba, 0x52, 0x51, 0x10, 0x8f, 0xfd, 0xd0, 0x01, 0xbd, 0x56, 0x2d,
5523
-	0x3b, 0x5b, 0x0a, 0x61, 0x16, 0x30, 0xf8, 0x4e, 0x09, 0x76, 0x79, 0x1c, 0x4a, 0x7f, 0x4a, 0x9b,
5524
-	0x67, 0xf0, 0x7e, 0x66, 0x38, 0xe8, 0x08, 0xca, 0x2b, 0x81, 0x0c, 0x7d, 0x4f, 0x2b, 0xab, 0xd4,
5525
-	0xb9, 0xbf, 0xb8, 0xad, 0xdb, 0x2b, 0x25, 0x9d, 0x76, 0xb1, 0xbd, 0x02, 0x9d, 0x7a, 0xcd, 0xbf,
5526
-	0x5a, 0xb0, 0xb7, 0x21, 0x33, 0xf4, 0x1e, 0xec, 0xf8, 0x53, 0x32, 0xa6, 0x09, 0x1d, 0x27, 0x13,
5527
-	0xd4, 0x83, 0x62, 0x40, 0x46, 0x34, 0x50, 0x62, 0x53, 0x09, 0xff, 0xd9, 0x1b, 0xf5, 0xda, 0xfa,
5528
-	0xa3, 0xc6, 0xf7, 0x42, 0xc9, 0xe7, 0xd8, 0x90, 0x91, 0x03, 0xbb, 0x2e, 0x9b, 0x4e, 0x49, 0xa8,
5529
-	0xca, 0xda, 0xf6, 0x41, 0x09, 0x2f, 0xa7, 0x08, 0x41, 0x81, 0xf0, 0xb1, 0x70, 0x0a, 0xda, 0xac,
5530
-	0xc7, 0xa8, 0x02, 0xdb, 0x34, 0x9c, 0x39, 0x3b, 0xda, 0xa4, 0x86, 0xca, 0xe2, 0xf9, 0x89, 0x5a,
5531
-	0x4a, 0x58, 0x0d, 0x15, 0x2f, 0x16, 0x94, 0x3b, 0xbb, 0xda, 0xa4, 0xc7, 0xe8, 0x57, 0x50, 0x9c,
5532
-	0xb2, 0x38, 0x94, 0xc2, 0xb1, 0x74, 0xb0, 0x0f, 0xb2, 0x82, 0x3d, 0x57, 0x08, 0x53, 0x76, 0x0d,
5533
-	0x1c, 0xf5, 0x60, 0x5f, 0x48, 0x16, 0x0d, 0xc7, 0x9c, 0xb8, 0x74, 0x18, 0x51, 0xee, 0x33, 0xcf,
5534
-	0x94, 0x8d, 0x07, 0xad, 0xa4, 0xcb, 0x68, 0x2d, 0xbb, 0x8c, 0x56, 0xd7, 0x74, 0x19, 0xf8, 0xbe,
5535
-	0xe2, 0x9c, 0x28, 0x4a, 0x5f, 0x33, 0x50, 0x1f, 0xca, 0x51, 0x1c, 0x04, 0x43, 0x16, 0x25, 0x2f,
5536
-	0x48, 0x72, 0xd8, 0x6f, 0x91, 0xb2, 0x7e, 0x1c, 0x04, 0xcf, 0x13, 0x12, 0xb6, 0xa3, 0xf5, 0x04,
5537
-	0x7d, 0x00, 0xc5, 0x31, 0x67, 0x71, 0x24, 0x1c, 0x5b, 0x27, 0xc3, 0xcc, 0xd0, 0x17, 0xb0, 0x2b,
5538
-	0xa8, 0xcb, 0xa9, 0x14, 0x4e, 0x59, 0x6f, 0xf5, 0xa3, 0xac, 0x45, 0x06, 0x1a, 0x82, 0xe9, 0x15,
5539
-	0xe5, 0x34, 0x74, 0x29, 0x5e, 0x72, 0xd0, 0x03, 0xd8, 0x96, 0x72, 0xee, 0xec, 0x35, 0xf2, 0x07,
5540
-	0x56, 0x67, 0x77, 0x71, 0x5b, 0xdf, 0xbe, 0xbc, 0x7c, 0x89, 0x95, 0x4d, 0x55, 0xb7, 0x09, 0x13,
5541
-	0x32, 0x24, 0x53, 0xea, 0xdc, 0xd3, 0xb9, 0x5d, 0xcd, 0xd1, 0x4b, 0x00, 0x2f, 0x14, 0x43, 0x57,
5542
-	0x5f, 0x27, 0xe7, 0xbe, 0xde, 0xdd, 0xa7, 0x6f, 0xde, 0x5d, 0xf7, 0x62, 0x60, 0x2a, 0xfc, 0xde,
5543
-	0xe2, 0xb6, 0x5e, 0x5a, 0x4d, 0x71, 0xc9, 0x0b, 0x45, 0x32, 0x44, 0x1d, 0xb0, 0x27, 0x94, 0x04,
5544
-	0x72, 0xe2, 0x4e, 0xa8, 0x7b, 0xed, 0x54, 0xee, 0x2e, 0xd9, 0xcf, 0x34, 0xcc, 0x78, 0x48, 0x93,
5545
-	0x94, 0x82, 0x55, 0xa8, 0xc2, 0xd9, 0xd7, 0xb9, 0x4a, 0x26, 0xe8, 0x43, 0x00, 0x16, 0xd1, 0x70,
5546
-	0x28, 0xa4, 0xe7, 0x87, 0x0e, 0x52, 0x5b, 0xc6, 0x25, 0x65, 0x19, 0x28, 0x03, 0x7a, 0xa8, 0x0a,
5547
-	0x2a, 0xf1, 0x86, 0x2c, 0x0c, 0xe6, 0xce, 0x0f, 0xf4, 0x57, 0x4b, 0x19, 0x9e, 0x87, 0xc1, 0x1c,
5548
-	0xd5, 0xc1, 0xd6, 0xba, 0x10, 0xfe, 0x38, 0x24, 0x81, 0xf3, 0x9e, 0xce, 0x07, 0x28, 0xd3, 0x40,
5549
-	0x5b, 0xaa, 0x9f, 0x83, 0x9d, 0x92, 0xbb, 0x92, 0xe9, 0x35, 0x9d, 0x9b, 0x1b, 0xa4, 0x86, 0x2a,
5550
-	0xa6, 0x19, 0x09, 0xe2, 0xa4, 0x4d, 0x2c, 0xe1, 0x64, 0xf2, 0xeb, 0xad, 0x27, 0xf9, 0xea, 0x11,
5551
-	0xd8, 0xa9, 0x63, 0x47, 0x1f, 0xc1, 0x1e, 0xa7, 0x63, 0x5f, 0x48, 0x3e, 0x1f, 0x92, 0x58, 0x4e,
5552
-	0x9c, 0xdf, 0x69, 0x42, 0x79, 0x69, 0x6c, 0xc7, 0x72, 0x52, 0x1d, 0xc2, 0x3a, 0x7b, 0xa8, 0x01,
5553
-	0xb6, 0x3a, 0x15, 0x41, 0xf9, 0x8c, 0x72, 0xf5, 0x14, 0xa9, 0x4d, 0xa7, 0x4d, 0x4a, 0x3d, 0x82,
5554
-	0x12, 0xee, 0x4e, 0xf4, 0xe5, 0x2d, 0x61, 0x33, 0x53, 0xb7, 0x71, 0x29, 0x51, 0x73, 0x1b, 0xcd,
5555
-	0xb4, 0xd9, 0x04, 0x58, 0x97, 0xa1, 0xec, 0x92, 0xd0, 0xfc, 0x4f, 0x1e, 0xca, 0xe9, 0x57, 0x17,
5556
-	0x1d, 0x27, 0xaf, 0xa5, 0x46, 0xdd, 0x3b, 0x3a, 0x7c, 0xd3, 0x2b, 0xad, 0xdf, 0xa6, 0x20, 0x56,
5557
-	0x0b, 0x9e, 0xab, 0x06, 0x59, 0x93, 0xd1, 0x2f, 0x61, 0x27, 0x62, 0x5c, 0x2e, 0xeb, 0x4c, 0x76,
5558
-	0x85, 0x64, 0x7c, 0x59, 0xcb, 0x13, 0x70, 0x73, 0x02, 0xf7, 0x36, 0xbd, 0xa1, 0xc7, 0xb0, 0xfd,
5559
-	0xe2, 0xb4, 0x5f, 0xc9, 0x55, 0x1f, 0xbe, 0xba, 0x69, 0xfc, 0x70, 0xf3, 0xe3, 0x0b, 0x9f, 0xcb,
5560
-	0x98, 0x04, 0xa7, 0x7d, 0xf4, 0x53, 0xd8, 0xe9, 0x5e, 0x0c, 0x30, 0xae, 0xe4, 0xab, 0xf5, 0x57,
5561
-	0x37, 0x8d, 0x87, 0x9b, 0x38, 0xf5, 0x89, 0xc5, 0xa1, 0x87, 0xd9, 0x68, 0xd5, 0x2c, 0xfe, 0x63,
5562
-	0x0b, 0x6c, 0x53, 0x7e, 0xdf, 0xf5, 0xff, 0xc4, 0x5e, 0xf2, 0x16, 0x2e, 0xef, 0xd5, 0xd6, 0x1b,
5563
-	0x9f, 0xc4, 0x72, 0x42, 0x30, 0x3a, 0x78, 0x04, 0x65, 0x3f, 0x9a, 0x7d, 0x36, 0xa4, 0x21, 0x19,
5564
-	0x05, 0xa6, 0x6f, 0xb4, 0xb0, 0xad, 0x6c, 0xbd, 0xc4, 0xa4, 0x2e, 0xb5, 0x1f, 0x4a, 0xca, 0x43,
5565
-	0xd3, 0x11, 0x5a, 0x78, 0x35, 0x47, 0x5f, 0x40, 0xc1, 0x8f, 0xc8, 0xd4, 0xbc, 0xe3, 0x99, 0x3b,
5566
-	0x38, 0xed, 0xb7, 0xcf, 0x8d, 0x4e, 0x3b, 0xd6, 0xe2, 0xb6, 0x5e, 0x50, 0x06, 0xac, 0x69, 0xa8,
5567
-	0xb6, 0x7c, 0x4a, 0xd5, 0x4a, 0xba, 0x40, 0x5b, 0x38, 0x65, 0x69, 0xfe, 0xb7, 0x00, 0xf6, 0x71,
5568
-	0x10, 0x0b, 0x69, 0x9e, 0x99, 0x77, 0x96, 0xb7, 0x97, 0xb0, 0x4f, 0xf4, 0xaf, 0x05, 0x09, 0x55,
5569
-	0xcd, 0xd6, 0x2d, 0x8a, 0xc9, 0xdd, 0xe3, 0x4c, 0x77, 0x2b, 0x70, 0xd2, 0xce, 0x74, 0x8a, 0xca,
5570
-	0xa7, 0x93, 0xc7, 0x15, 0xf2, 0xad, 0x2f, 0x68, 0x00, 0x7b, 0x8c, 0xbb, 0x13, 0x2a, 0x64, 0x52,
5571
-	0xe9, 0x4d, 0x2b, 0x9e, 0xf9, 0x93, 0xf6, 0x3c, 0x0d, 0x34, 0x65, 0x2e, 0x89, 0x76, 0xd3, 0x07,
5572
-	0x7a, 0x02, 0x05, 0x4e, 0xae, 0x96, 0xed, 0x56, 0xa6, 0xbe, 0x31, 0xb9, 0x92, 0x1b, 0x2e, 0x34,
5573
-	0x03, 0xfd, 0x01, 0xc0, 0xf3, 0x45, 0x44, 0xa4, 0x3b, 0xa1, 0xdc, 0x9c, 0x53, 0xe6, 0x16, 0xbb,
5574
-	0x2b, 0xd4, 0x86, 0x97, 0x14, 0x1b, 0x9d, 0x41, 0xc9, 0x25, 0x4b, 0xa5, 0x15, 0xef, 0xfe, 0x3f,
5575
-	0x39, 0x6e, 0x1b, 0x17, 0x15, 0xe5, 0x62, 0x71, 0x5b, 0xb7, 0x96, 0x16, 0x6c, 0xb9, 0xc4, 0x28,
5576
-	0xef, 0x0c, 0xf6, 0xd4, 0x7f, 0xcb, 0xd0, 0xa3, 0x57, 0x24, 0x0e, 0xa4, 0xd0, 0x8f, 0xf1, 0x1d,
5577
-	0x65, 0x5b, 0x35, 0xc1, 0x5d, 0x83, 0x33, 0x71, 0x95, 0x65, 0xca, 0x86, 0xfe, 0x04, 0xfb, 0x34,
5578
-	0x74, 0xf9, 0x5c, 0xeb, 0x6c, 0x19, 0xa1, 0x75, 0xf7, 0x66, 0x7b, 0x2b, 0xf0, 0xc6, 0x66, 0x2b,
5579
-	0xf4, 0x5b, 0xf6, 0xa6, 0x0f, 0x90, 0x3c, 0x84, 0xef, 0x56, 0x7f, 0x08, 0x0a, 0x1e, 0x91, 0x44,
5580
-	0x4b, 0xae, 0x8c, 0xf5, 0xb8, 0xe3, 0xbc, 0xfe, 0xa6, 0x96, 0xfb, 0xd7, 0x37, 0xb5, 0xdc, 0x5f,
5581
-	0x16, 0xb5, 0xfc, 0xeb, 0x45, 0x2d, 0xff, 0xcf, 0x45, 0x2d, 0xff, 0xef, 0x45, 0x2d, 0x3f, 0x2a,
5582
-	0xea, 0xf6, 0xe1, 0x17, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x91, 0xbf, 0x5e, 0xca, 0xf8, 0x10,
5583
-	0x00, 0x00,
5479
+	0xe1, 0xad, 0xc7, 0x8c, 0x0f, 0x3d, 0xf5, 0xaa, 0xe9, 0xa1, 0xbf, 0xa1, 0xff, 0xc1, 0xc7, 0x1e,
5480
+	0x7b, 0xd2, 0x34, 0xfc, 0x0b, 0xfd, 0x01, 0xed, 0x00, 0x0b, 0x92, 0xcb, 0x64, 0x15, 0x7b, 0x26,
5481
+	0xbe, 0xe1, 0xbd, 0xfd, 0xbe, 0x07, 0xe0, 0xe1, 0xc3, 0xc3, 0x5b, 0xb0, 0x45, 0x44, 0x5d, 0xd1,
5482
+	0x8a, 0x38, 0x93, 0x0c, 0x21, 0x8f, 0xb9, 0x57, 0x94, 0xb7, 0xc4, 0x97, 0x84, 0x4f, 0xaf, 0x7c,
5483
+	0xd9, 0x9a, 0xfd, 0xbc, 0x6a, 0xcb, 0x79, 0x44, 0x0d, 0xa0, 0x7a, 0x7f, 0xcc, 0xc6, 0x4c, 0x0f,
5484
+	0x0f, 0xd4, 0xc8, 0x78, 0x6b, 0x63, 0xc6, 0xc6, 0x01, 0x3d, 0xd0, 0xd6, 0x28, 0xbe, 0x3c, 0xf0,
5485
+	0x62, 0x4e, 0xa4, 0xcf, 0xc2, 0xe4, 0x7b, 0xf3, 0xba, 0x00, 0xd6, 0x39, 0xf3, 0xe8, 0x20, 0xa2,
5486
+	0x2e, 0x3a, 0x06, 0x9b, 0x84, 0x21, 0x93, 0x1a, 0x20, 0x9c, 0x7c, 0x23, 0xbf, 0x6f, 0x1f, 0xd6,
5487
+	0x5b, 0xdf, 0x9e, 0xb9, 0xd5, 0x5e, 0xc3, 0x3a, 0x85, 0xd7, 0x37, 0xf5, 0x1c, 0x4e, 0x33, 0xd1,
5488
+	0x6f, 0xa1, 0xec, 0x51, 0xe1, 0x73, 0xea, 0x0d, 0x39, 0x0b, 0xa8, 0xb3, 0xd5, 0xc8, 0xef, 0xdf,
5489
+	0x39, 0xfc, 0x51, 0x56, 0x24, 0x35, 0x39, 0x66, 0x01, 0xc5, 0xb6, 0x61, 0x28, 0x03, 0x1d, 0x03,
5490
+	0x4c, 0xe9, 0x74, 0x44, 0xb9, 0x98, 0xf8, 0x91, 0xb3, 0xad, 0xe9, 0x3f, 0xb9, 0x8d, 0xae, 0xd6,
5491
+	0xde, 0x3a, 0x5b, 0xc1, 0x71, 0x8a, 0x8a, 0xce, 0xa0, 0x4c, 0x66, 0xc4, 0x0f, 0xc8, 0xc8, 0x0f,
5492
+	0x7c, 0x39, 0x77, 0x0a, 0x3a, 0xd4, 0xc7, 0xdf, 0x19, 0xaa, 0x9d, 0x22, 0xe0, 0x0d, 0x7a, 0xd3,
5493
+	0x03, 0x58, 0x4f, 0x84, 0x3e, 0x82, 0xdd, 0x7e, 0xef, 0xbc, 0x7b, 0x72, 0x7e, 0x5c, 0xc9, 0x55,
5494
+	0x1f, 0xbc, 0xba, 0x6e, 0xbc, 0xa7, 0x62, 0xac, 0x01, 0x7d, 0x1a, 0x7a, 0x7e, 0x38, 0x46, 0xfb,
5495
+	0x60, 0xb5, 0x8f, 0x8e, 0x7a, 0xfd, 0x8b, 0x5e, 0xb7, 0x92, 0xaf, 0x56, 0x5f, 0x5d, 0x37, 0xde,
5496
+	0xdf, 0x04, 0xb6, 0x5d, 0x97, 0x46, 0x92, 0x7a, 0xd5, 0xc2, 0x57, 0xff, 0xa8, 0xe5, 0x9a, 0x5f,
5497
+	0xe5, 0xa1, 0x9c, 0x5e, 0x04, 0xfa, 0x08, 0x8a, 0xed, 0xa3, 0x8b, 0x93, 0x17, 0xbd, 0x4a, 0x6e,
5498
+	0x4d, 0x4f, 0x23, 0xda, 0xae, 0xf4, 0x67, 0x14, 0x3d, 0x86, 0x9d, 0x7e, 0xfb, 0x8b, 0x41, 0xaf,
5499
+	0x92, 0x5f, 0x2f, 0x27, 0x0d, 0xeb, 0x93, 0x58, 0x68, 0x54, 0x17, 0xb7, 0x4f, 0xce, 0x2b, 0x5b,
5500
+	0xd9, 0xa8, 0x2e, 0x27, 0x7e, 0x68, 0x96, 0xf2, 0xf7, 0x02, 0xd8, 0x03, 0xca, 0x67, 0xbe, 0xfb,
5501
+	0x8e, 0x25, 0xf2, 0x29, 0x14, 0x24, 0x11, 0x57, 0x5a, 0x1a, 0x76, 0xb6, 0x34, 0x2e, 0x88, 0xb8,
5502
+	0x52, 0x93, 0x1a, 0xba, 0xc6, 0x2b, 0x65, 0x70, 0x1a, 0x05, 0xbe, 0x4b, 0x24, 0xf5, 0xb4, 0x32,
5503
+	0xec, 0xc3, 0x1f, 0x67, 0xb1, 0xf1, 0x0a, 0x65, 0xd6, 0xff, 0x2c, 0x87, 0x53, 0x54, 0xf4, 0x14,
5504
+	0x8a, 0xe3, 0x80, 0x8d, 0x48, 0xa0, 0x35, 0x61, 0x1f, 0x3e, 0xca, 0x0a, 0x72, 0xac, 0x11, 0xeb,
5505
+	0x00, 0x86, 0x82, 0x9e, 0x40, 0x31, 0x8e, 0x3c, 0x22, 0xa9, 0x53, 0xd4, 0xe4, 0x46, 0x16, 0xf9,
5506
+	0x0b, 0x8d, 0x38, 0x62, 0xe1, 0xa5, 0x3f, 0xc6, 0x06, 0x8f, 0x4e, 0xc1, 0x0a, 0xa9, 0xfc, 0x92,
5507
+	0xf1, 0x2b, 0xe1, 0xec, 0x36, 0xb6, 0xf7, 0xed, 0xc3, 0x4f, 0x32, 0xc5, 0x98, 0x60, 0xda, 0x52,
5508
+	0x12, 0x77, 0x32, 0xa5, 0xa1, 0x4c, 0xc2, 0x74, 0xb6, 0x9c, 0x3c, 0x5e, 0x05, 0x40, 0xbf, 0x01,
5509
+	0x8b, 0x86, 0x5e, 0xc4, 0xfc, 0x50, 0x3a, 0xd6, 0xed, 0x0b, 0xe9, 0x19, 0x8c, 0x4a, 0x26, 0x5e,
5510
+	0x31, 0x14, 0x9b, 0xb3, 0x20, 0x18, 0x11, 0xf7, 0xca, 0x29, 0xbd, 0xe5, 0x36, 0x56, 0x8c, 0x4e,
5511
+	0x11, 0x0a, 0x53, 0xe6, 0xd1, 0xe6, 0x01, 0xdc, 0xfb, 0x56, 0xaa, 0x51, 0x15, 0x2c, 0x93, 0xea,
5512
+	0x44, 0x23, 0x05, 0xbc, 0xb2, 0x9b, 0x77, 0x61, 0x6f, 0x23, 0xad, 0xcd, 0xbf, 0x16, 0xc0, 0x5a,
5513
+	0x9e, 0x35, 0x6a, 0x43, 0xc9, 0x65, 0xa1, 0x24, 0x7e, 0x48, 0xb9, 0x91, 0x57, 0xe6, 0xc9, 0x1c,
5514
+	0x2d, 0x41, 0x8a, 0xf5, 0x2c, 0x87, 0xd7, 0x2c, 0xf4, 0x7b, 0x28, 0x71, 0x2a, 0x58, 0xcc, 0x5d,
5515
+	0x2a, 0x8c, 0xbe, 0xf6, 0xb3, 0x15, 0x92, 0x80, 0x30, 0xfd, 0x73, 0xec, 0x73, 0xaa, 0xb2, 0x2c,
5516
+	0xf0, 0x9a, 0x8a, 0x9e, 0xc2, 0x2e, 0xa7, 0x42, 0x12, 0x2e, 0xbf, 0x4b, 0x22, 0x38, 0x81, 0xf4,
5517
+	0x59, 0xe0, 0xbb, 0x73, 0xbc, 0x64, 0xa0, 0xa7, 0x50, 0x8a, 0x02, 0xe2, 0xea, 0xa8, 0xce, 0x8e,
5518
+	0xa6, 0x7f, 0x90, 0x45, 0xef, 0x2f, 0x41, 0x78, 0x8d, 0x47, 0x9f, 0x01, 0x04, 0x6c, 0x3c, 0xf4,
5519
+	0xb8, 0x3f, 0xa3, 0xdc, 0x48, 0xac, 0x9a, 0xc5, 0xee, 0x6a, 0x04, 0x2e, 0x05, 0x6c, 0x9c, 0x0c,
5520
+	0xd1, 0xf1, 0xf7, 0xd2, 0x57, 0x4a, 0x5b, 0xa7, 0x00, 0x64, 0xf5, 0xd5, 0xa8, 0xeb, 0xe3, 0xb7,
5521
+	0x0a, 0x65, 0x4e, 0x24, 0x45, 0x47, 0x8f, 0xa0, 0x7c, 0xc9, 0xb8, 0x4b, 0x87, 0xe6, 0xd6, 0x94,
5522
+	0xb4, 0x26, 0x6c, 0xed, 0x4b, 0xf4, 0xd5, 0x29, 0xc1, 0x2e, 0x8f, 0x43, 0xe9, 0x4f, 0x69, 0xf3,
5523
+	0x14, 0xde, 0xcb, 0x0c, 0x8a, 0x0e, 0xa1, 0xbc, 0x3a, 0xe6, 0xa1, 0xef, 0x69, 0x7d, 0x94, 0x3a,
5524
+	0x77, 0x17, 0x37, 0x75, 0x7b, 0xa5, 0x87, 0x93, 0x2e, 0xb6, 0x57, 0xa0, 0x13, 0xaf, 0xf9, 0x37,
5525
+	0x0b, 0xf6, 0x36, 0xc4, 0x82, 0xee, 0xc3, 0x8e, 0x3f, 0x25, 0x63, 0x9a, 0xd0, 0x71, 0x62, 0xa0,
5526
+	0x1e, 0x14, 0x03, 0x32, 0xa2, 0x81, 0x92, 0x8c, 0x4a, 0xdb, 0xcf, 0xde, 0xa8, 0xba, 0xd6, 0x1f,
5527
+	0x35, 0xbe, 0x17, 0x4a, 0x3e, 0xc7, 0x86, 0x8c, 0x1c, 0xd8, 0x75, 0xd9, 0x74, 0x4a, 0x42, 0x55,
5528
+	0x9c, 0xb6, 0xf7, 0x4b, 0x78, 0x69, 0x22, 0x04, 0x05, 0xc2, 0xc7, 0xc2, 0x29, 0x68, 0xb7, 0x1e,
5529
+	0xa3, 0x0a, 0x6c, 0xd3, 0x70, 0xe6, 0xec, 0x68, 0x97, 0x1a, 0x2a, 0x8f, 0xe7, 0x27, 0x67, 0x5e,
5530
+	0xc2, 0x6a, 0xa8, 0x78, 0xb1, 0xa0, 0xdc, 0xd9, 0xd5, 0x2e, 0x3d, 0x46, 0xbf, 0x82, 0xe2, 0x94,
5531
+	0xc5, 0xa1, 0x14, 0x8e, 0xa5, 0x17, 0xfb, 0x20, 0x6b, 0xb1, 0x67, 0x0a, 0x61, 0x8a, 0xa7, 0x81,
5532
+	0xa3, 0x1e, 0xdc, 0x13, 0x92, 0x45, 0xc3, 0x31, 0x27, 0x2e, 0x1d, 0x46, 0x94, 0xfb, 0xcc, 0x33,
5533
+	0x97, 0xff, 0x41, 0x2b, 0xe9, 0x15, 0x5a, 0xcb, 0x5e, 0xa1, 0xd5, 0x35, 0xbd, 0x02, 0xbe, 0xab,
5534
+	0x38, 0xc7, 0x8a, 0xd2, 0xd7, 0x0c, 0xd4, 0x87, 0x72, 0x14, 0x07, 0xc1, 0x90, 0x45, 0xc9, 0x3b,
5535
+	0x00, 0x3a, 0xc2, 0x5b, 0xa4, 0xac, 0x1f, 0x07, 0xc1, 0xf3, 0x84, 0x84, 0xed, 0x68, 0x6d, 0xa0,
5536
+	0xf7, 0xa1, 0x38, 0xe6, 0x2c, 0x8e, 0x84, 0x63, 0xeb, 0x64, 0x18, 0x0b, 0x7d, 0x0e, 0xbb, 0x82,
5537
+	0xba, 0x9c, 0x4a, 0xe1, 0x94, 0xf5, 0x56, 0x3f, 0xcc, 0x9a, 0x64, 0xa0, 0x21, 0x98, 0x5e, 0x52,
5538
+	0x4e, 0x43, 0x97, 0xe2, 0x25, 0x07, 0x3d, 0x80, 0x6d, 0x29, 0xe7, 0xce, 0x5e, 0x23, 0xbf, 0x6f,
5539
+	0x75, 0x76, 0x17, 0x37, 0xf5, 0xed, 0x8b, 0x8b, 0x97, 0x58, 0xf9, 0x54, 0x8d, 0x9a, 0x30, 0x21,
5540
+	0x43, 0x32, 0xa5, 0xce, 0x1d, 0x9d, 0xdb, 0x95, 0x8d, 0x5e, 0x02, 0x78, 0xa1, 0x18, 0xba, 0xfa,
5541
+	0x52, 0x38, 0x77, 0xf5, 0xee, 0x3e, 0x79, 0xf3, 0xee, 0xba, 0xe7, 0x03, 0x53, 0xa7, 0xf7, 0x16,
5542
+	0x37, 0xf5, 0xd2, 0xca, 0xc4, 0x25, 0x2f, 0x14, 0xc9, 0x10, 0x75, 0xc0, 0x9e, 0x50, 0x12, 0xc8,
5543
+	0x89, 0x3b, 0xa1, 0xee, 0x95, 0x53, 0xb9, 0xbd, 0xf0, 0x3e, 0xd3, 0x30, 0x13, 0x21, 0x4d, 0x52,
5544
+	0x0a, 0x56, 0x4b, 0x15, 0xce, 0x3d, 0x9d, 0xab, 0xc4, 0x40, 0x1f, 0x00, 0xb0, 0x88, 0x86, 0x43,
5545
+	0x21, 0x3d, 0x3f, 0x74, 0x90, 0xda, 0x32, 0x2e, 0x29, 0xcf, 0x40, 0x39, 0xd0, 0x43, 0x55, 0x16,
5546
+	0x89, 0x37, 0x64, 0x61, 0x30, 0x77, 0x7e, 0xa0, 0xbf, 0x5a, 0xca, 0xf1, 0x3c, 0x0c, 0xe6, 0xa8,
5547
+	0x0e, 0xb6, 0xd6, 0x85, 0xf0, 0xc7, 0x21, 0x09, 0x9c, 0xfb, 0x3a, 0x1f, 0xa0, 0x5c, 0x03, 0xed,
5548
+	0xa9, 0x7e, 0x06, 0x76, 0x4a, 0xee, 0x4a, 0xa6, 0x57, 0x74, 0x6e, 0x6e, 0x90, 0x1a, 0xaa, 0x35,
5549
+	0xcd, 0x48, 0x10, 0x27, 0xcd, 0x5e, 0x09, 0x27, 0xc6, 0xaf, 0xb7, 0x9e, 0xe4, 0xab, 0x87, 0x60,
5550
+	0xa7, 0x8e, 0x1d, 0x7d, 0x08, 0x7b, 0x9c, 0x8e, 0x7d, 0x21, 0xf9, 0x7c, 0x48, 0x62, 0x39, 0x71,
5551
+	0x7e, 0xa7, 0x09, 0xe5, 0xa5, 0xb3, 0x1d, 0xcb, 0x49, 0x75, 0x08, 0xeb, 0xec, 0xa1, 0x06, 0xd8,
5552
+	0xea, 0x54, 0x04, 0xe5, 0x33, 0xca, 0xd5, 0x83, 0xa2, 0x36, 0x9d, 0x76, 0x29, 0xf5, 0x08, 0x4a,
5553
+	0xb8, 0x3b, 0xd1, 0x97, 0xb7, 0x84, 0x8d, 0xa5, 0x6e, 0xe3, 0x52, 0xa2, 0xe6, 0x36, 0x1a, 0xb3,
5554
+	0xf9, 0xdf, 0x3c, 0x94, 0xd3, 0xef, 0x22, 0x3a, 0x4a, 0xde, 0x33, 0xbd, 0xa5, 0x3b, 0x87, 0x07,
5555
+	0x6f, 0x7a, 0x47, 0xf5, 0xeb, 0x11, 0xc4, 0x2a, 0xd8, 0x99, 0x6a, 0x61, 0x35, 0x19, 0xfd, 0x12,
5556
+	0x76, 0x22, 0xc6, 0xe5, 0xb2, 0x86, 0xd4, 0x32, 0x2b, 0x3e, 0xe3, 0xcb, 0x6a, 0x9b, 0x80, 0x9b,
5557
+	0x13, 0xb8, 0xb3, 0x19, 0x0d, 0x3d, 0x86, 0xed, 0x17, 0x27, 0xfd, 0x4a, 0xae, 0xfa, 0xf0, 0xd5,
5558
+	0x75, 0xe3, 0x87, 0x9b, 0x1f, 0x5f, 0xf8, 0x5c, 0xc6, 0x24, 0x38, 0xe9, 0xa3, 0x9f, 0xc2, 0x4e,
5559
+	0xf7, 0x7c, 0x80, 0x71, 0x25, 0x5f, 0xad, 0xbf, 0xba, 0x6e, 0x3c, 0xdc, 0xc4, 0xa9, 0x4f, 0x2c,
5560
+	0x0e, 0x3d, 0xcc, 0x46, 0xab, 0x76, 0xee, 0x9f, 0x5b, 0x60, 0x9b, 0xd2, 0xfa, 0xae, 0x3b, 0xfe,
5561
+	0xbd, 0xe4, 0xb5, 0x5a, 0xde, 0x99, 0xad, 0x37, 0x3e, 0x5a, 0xe5, 0x84, 0x60, 0xce, 0xf8, 0x11,
5562
+	0x94, 0xfd, 0x68, 0xf6, 0xe9, 0x90, 0x86, 0x64, 0x14, 0x98, 0xce, 0xce, 0xc2, 0xb6, 0xf2, 0xf5,
5563
+	0x12, 0x97, 0xba, 0xb0, 0x7e, 0x28, 0x29, 0x0f, 0x4d, 0xcf, 0x66, 0xe1, 0x95, 0x8d, 0x3e, 0x87,
5564
+	0x82, 0x1f, 0x91, 0xa9, 0x79, 0x69, 0x33, 0x77, 0x70, 0xd2, 0x6f, 0x9f, 0x19, 0x0d, 0x76, 0xac,
5565
+	0xc5, 0x4d, 0xbd, 0xa0, 0x1c, 0x58, 0xd3, 0x50, 0x6d, 0xf9, 0xd8, 0xa9, 0x99, 0x74, 0xf1, 0xb5,
5566
+	0x70, 0xca, 0xd3, 0xfc, 0x5f, 0x01, 0xec, 0xa3, 0x20, 0x16, 0xd2, 0x3c, 0x21, 0xef, 0x2c, 0x6f,
5567
+	0x2f, 0xe1, 0x1e, 0xd1, 0xcd, 0x3f, 0x09, 0x55, 0x3d, 0xd6, 0x4d, 0x84, 0xc9, 0xdd, 0xe3, 0xcc,
5568
+	0x70, 0x2b, 0x70, 0xd2, 0x70, 0x74, 0x8a, 0x2a, 0xa6, 0x93, 0xc7, 0x15, 0xf2, 0x8d, 0x2f, 0x68,
5569
+	0x00, 0x7b, 0x8c, 0xbb, 0x13, 0x2a, 0x64, 0x52, 0xc5, 0x4d, 0xb3, 0x9c, 0xf9, 0x1b, 0xf5, 0x3c,
5570
+	0x0d, 0x34, 0x25, 0x2c, 0x59, 0xed, 0x66, 0x0c, 0xf4, 0x04, 0x0a, 0x9c, 0x5c, 0x2e, 0x1b, 0xa2,
5571
+	0x4c, 0x7d, 0x63, 0x72, 0x29, 0x37, 0x42, 0x68, 0x06, 0xfa, 0x03, 0x80, 0xe7, 0x8b, 0x88, 0x48,
5572
+	0x77, 0x42, 0xb9, 0x39, 0xa7, 0xcc, 0x2d, 0x76, 0x57, 0xa8, 0x8d, 0x28, 0x29, 0x36, 0x3a, 0x85,
5573
+	0x92, 0x4b, 0x96, 0x4a, 0x2b, 0xde, 0xfe, 0x07, 0x71, 0xd4, 0x36, 0x21, 0x2a, 0x2a, 0xc4, 0xe2,
5574
+	0xa6, 0x6e, 0x2d, 0x3d, 0xd8, 0x72, 0x89, 0x51, 0xde, 0x29, 0xec, 0xa9, 0x3f, 0x8b, 0xa1, 0x47,
5575
+	0x2f, 0x49, 0x1c, 0x48, 0xa1, 0x1f, 0xda, 0x5b, 0x4a, 0xb2, 0x6a, 0x53, 0xbb, 0x06, 0x67, 0xd6,
5576
+	0x55, 0x96, 0x29, 0x1f, 0xfa, 0x13, 0xdc, 0xa3, 0xa1, 0xcb, 0xe7, 0x5a, 0x67, 0xcb, 0x15, 0x5a,
5577
+	0xb7, 0x6f, 0xb6, 0xb7, 0x02, 0x6f, 0x6c, 0xb6, 0x42, 0xbf, 0xe1, 0x6f, 0xfa, 0x00, 0xc9, 0x23,
5578
+	0xf7, 0x6e, 0xf5, 0x87, 0xa0, 0xe0, 0x11, 0x49, 0xb4, 0xe4, 0xca, 0x58, 0x8f, 0x3b, 0xce, 0xeb,
5579
+	0xaf, 0x6b, 0xb9, 0x7f, 0x7f, 0x5d, 0xcb, 0xfd, 0x65, 0x51, 0xcb, 0xbf, 0x5e, 0xd4, 0xf2, 0xff,
5580
+	0x5a, 0xd4, 0xf2, 0xff, 0x59, 0xd4, 0xf2, 0xa3, 0xa2, 0x6e, 0x0d, 0x7e, 0xf1, 0xff, 0x00, 0x00,
5581
+	0x00, 0xff, 0xff, 0xed, 0xbe, 0x26, 0xe6, 0x9a, 0x10, 0x00, 0x00,
5584 5582
 }
... ...
@@ -101,7 +101,6 @@ message TaskSpec {
101 101
 	oneof runtime {
102 102
 		NetworkAttachmentSpec attachment = 8;
103 103
 		ContainerSpec container = 1;
104
-		PluginSpec plugin = 10;
105 104
 	}
106 105
 
107 106
 	// Resource requirements for the container.
... ...
@@ -267,14 +266,6 @@ message ContainerSpec {
267 267
 	HealthConfig healthcheck = 16;
268 268
 }
269 269
 
270
-// PluginSpec specifies runtime parameters for a plugin.
271
-message PluginSpec {
272
-	// image defines the image reference, as specified in the
273
-	// distribution/reference package. This may include a registry host, name,
274
-	// tag or digest.
275
-	string image = 1;
276
-}
277
-
278 270
 // EndpointSpec defines the properties that can be configured to
279 271
 // access and loadbalance the service.
280 272
 message EndpointSpec {
... ...
@@ -72,7 +72,6 @@
72 72
 		TaskSpec
73 73
 		NetworkAttachmentSpec
74 74
 		ContainerSpec
75
-		PluginSpec
76 75
 		EndpointSpec
77 76
 		NetworkSpec
78 77
 		ClusterSpec
... ...
@@ -5,7 +5,7 @@ import (
5 5
 	"crypto"
6 6
 	"crypto/ecdsa"
7 7
 	"crypto/elliptic"
8
-	"crypto/rand"
8
+	cryptorand "crypto/rand"
9 9
 	"crypto/rsa"
10 10
 	"crypto/tls"
11 11
 	"crypto/x509"
... ...
@@ -100,18 +100,29 @@ type CertPaths struct {
100 100
 	Cert, Key string
101 101
 }
102 102
 
103
-// RootCA is the representation of everything we need to sign certificates
104
-type RootCA struct {
103
+// LocalSigner is a signer that can sign CSRs
104
+type LocalSigner struct {
105
+	cfsigner.Signer
106
+
105 107
 	// Key will only be used by the original manager to put the private
106 108
 	// key-material in raft, no signing operations depend on it.
107 109
 	Key []byte
108
-	// Cert includes the PEM encoded Certificate for the Root CA
110
+}
111
+
112
+// RootCA is the representation of everything we need to sign certificates
113
+type RootCA struct {
114
+	// Cert contains a bundle of PEM encoded Certificate for the Root CA, the first one of which
115
+	// must correspond to the key in the local signer, if provided
109 116
 	Cert []byte
117
+
118
+	// Pool is the root pool used to validate TLS certificates
110 119
 	Pool *x509.CertPool
111
-	// Digest of the serialized bytes of the certificate
120
+
121
+	// Digest of the serialized bytes of the certificate(s)
112 122
 	Digest digest.Digest
123
+
113 124
 	// This signer will be nil if the node doesn't have the appropriate key material
114
-	Signer cfsigner.Signer
125
+	Signer *LocalSigner
115 126
 }
116 127
 
117 128
 // CanSign ensures that the signer has all three necessary elements needed to operate
... ...
@@ -154,25 +165,6 @@ func (rca *RootCA) IssueAndSaveNewCertificates(kw KeyWriter, cn, ou, org string)
154 154
 	return &tlsKeyPair, nil
155 155
 }
156 156
 
157
-// Normally we can just call cert.Verify(opts), but since we actually want more information about
158
-// whether a certificate is not yet valid or expired, we also need to perform the expiry checks ourselves.
159
-func verifyCertificate(cert *x509.Certificate, opts x509.VerifyOptions, allowExpired bool) error {
160
-	_, err := cert.Verify(opts)
161
-	if invalidErr, ok := err.(x509.CertificateInvalidError); ok && invalidErr.Reason == x509.Expired {
162
-		now := time.Now().UTC()
163
-		if now.Before(cert.NotBefore) {
164
-			return errors.Wrapf(err, "certificate not valid before %s, and it is currently %s",
165
-				cert.NotBefore.UTC().Format(time.RFC1123), now.Format(time.RFC1123))
166
-		}
167
-		if allowExpired {
168
-			return nil
169
-		}
170
-		return errors.Wrapf(err, "certificate expires at %s, and it is currently %s",
171
-			cert.NotAfter.UTC().Format(time.RFC1123), now.Format(time.RFC1123))
172
-	}
173
-	return err
174
-}
175
-
176 157
 // RequestAndSaveNewCertificates gets new certificates issued, either by signing them locally if a signer is
177 158
 // available, or by requesting them from the remote server at remoteAddr.
178 159
 func (rca *RootCA) RequestAndSaveNewCertificates(ctx context.Context, kw KeyWriter, config CertificateRequestConfig) (*tls.Certificate, error) {
... ...
@@ -208,20 +200,9 @@ func (rca *RootCA) RequestAndSaveNewCertificates(ctx context.Context, kw KeyWrit
208 208
 	// Доверяй, но проверяй.
209 209
 	// Before we overwrite our local key + certificate, let's make sure the server gave us one that is valid
210 210
 	// Create an X509Cert so we can .Verify()
211
-	certBlock, _ := pem.Decode(signedCert)
212
-	if certBlock == nil {
213
-		return nil, errors.New("failed to parse certificate PEM")
214
-	}
215
-	X509Cert, err := x509.ParseCertificate(certBlock.Bytes)
216
-	if err != nil {
217
-		return nil, err
218
-	}
219
-	// Include our current root pool
220
-	opts := x509.VerifyOptions{
221
-		Roots: rca.Pool,
222
-	}
223 211
 	// Check to see if this certificate was signed by our CA, and isn't expired
224
-	if err := verifyCertificate(X509Cert, opts, false); err != nil {
212
+	parsedCerts, err := ValidateCertChain(rca.Pool, signedCert, false)
213
+	if err != nil {
225 214
 		return nil, err
226 215
 	}
227 216
 
... ...
@@ -233,7 +214,8 @@ func (rca *RootCA) RequestAndSaveNewCertificates(ctx context.Context, kw KeyWrit
233 233
 
234 234
 	var kekUpdate *KEKData
235 235
 	for i := 0; i < 5; i++ {
236
-		kekUpdate, err = rca.getKEKUpdate(ctx, X509Cert, tlsKeyPair, config.ConnBroker)
236
+		// ValidateCertChain will always return at least 1 cert, so indexing at 0 is safe
237
+		kekUpdate, err = rca.getKEKUpdate(ctx, parsedCerts[0], tlsKeyPair, config.ConnBroker)
237 238
 		if err == nil {
238 239
 			break
239 240
 		}
... ...
@@ -412,7 +394,104 @@ func NewRootCA(certBytes, keyBytes []byte, certExpiry time.Duration) (RootCA, er
412 412
 		}
413 413
 	}
414 414
 
415
-	return RootCA{Signer: signer, Key: keyBytes, Digest: digest, Cert: certBytes, Pool: pool}, nil
415
+	return RootCA{Signer: &LocalSigner{Signer: signer, Key: keyBytes}, Digest: digest, Cert: certBytes, Pool: pool}, nil
416
+}
417
+
418
+// ValidateCertChain checks checks that the certificates provided chain up to the root pool provided.  In addition
419
+// it also enforces that every cert in the bundle certificates form a chain, each one certifying the one above,
420
+// as per RFC5246 section 7.4.2, and that every certificate (whether or not it is necessary to form a chain to the root
421
+// pool) is currently valid and not yet expired (unless allowExpiry is set to true).
422
+// This is additional validation not required by go's Certificate.Verify (which allows invalid certs in the
423
+// intermediate pool), because this function is intended to be used when reading certs from untrusted locations such as
424
+// from disk or over a network when a CSR is signed, so it is extra pedantic.
425
+// This function always returns all the parsed certificates in the bundle in order, which means there will always be
426
+// at least 1 certificate if there is no error.
427
+func ValidateCertChain(rootPool *x509.CertPool, certs []byte, allowExpired bool) ([]*x509.Certificate, error) {
428
+	// Parse all the certificates in the cert bundle
429
+	parsedCerts, err := helpers.ParseCertificatesPEM(certs)
430
+	if err != nil {
431
+		return nil, err
432
+	}
433
+	if len(parsedCerts) == 0 {
434
+		return nil, errors.New("no certificates to validate")
435
+	}
436
+	now := time.Now()
437
+	// ensure that they form a chain, each one being signed by the one after it
438
+	var intermediatePool *x509.CertPool
439
+	for i, cert := range parsedCerts {
440
+		// Manual expiry validation because we want more information on which certificate in the chain is expired, and
441
+		// because this is an easier way to allow expired certs.
442
+		if now.Before(cert.NotBefore) {
443
+			return nil, errors.Wrapf(
444
+				x509.CertificateInvalidError{
445
+					Cert:   cert,
446
+					Reason: x509.Expired,
447
+				},
448
+				"certificate (%d - %s) not valid before %s, and it is currently %s",
449
+				i+1, cert.Subject.CommonName, cert.NotBefore.UTC().Format(time.RFC1123), now.Format(time.RFC1123))
450
+		}
451
+		if !allowExpired && now.After(cert.NotAfter) {
452
+			return nil, errors.Wrapf(
453
+				x509.CertificateInvalidError{
454
+					Cert:   cert,
455
+					Reason: x509.Expired,
456
+				},
457
+				"certificate (%d - %s) not valid after %s, and it is currently %s",
458
+				i+1, cert.Subject.CommonName, cert.NotAfter.UTC().Format(time.RFC1123), now.Format(time.RFC1123))
459
+		}
460
+
461
+		if i > 0 {
462
+			// check that the previous cert was signed by this cert
463
+			prevCert := parsedCerts[i-1]
464
+			if err := prevCert.CheckSignatureFrom(cert); err != nil {
465
+				return nil, errors.Wrapf(err, "certificates do not form a chain: (%d - %s) is not signed by (%d - %s)",
466
+					i, prevCert.Subject.CommonName, i+1, cert.Subject.CommonName)
467
+			}
468
+
469
+			if intermediatePool == nil {
470
+				intermediatePool = x509.NewCertPool()
471
+			}
472
+			intermediatePool.AddCert(cert)
473
+
474
+		}
475
+	}
476
+
477
+	verifyOpts := x509.VerifyOptions{
478
+		Roots:         rootPool,
479
+		Intermediates: intermediatePool,
480
+		CurrentTime:   now,
481
+	}
482
+
483
+	// If we accept expired certs, try to build a valid cert chain using some subset of the certs.  We start off using the
484
+	// first certificate's NotAfter as the current time, thus ensuring that the first cert is not expired. If the chain
485
+	// still fails to validate due to expiry issues, continue iterating over the rest of the certs.
486
+	// If any of the other certs has an earlier NotAfter time, use that time as the current time instead. This insures that
487
+	// particular cert, and any that came before it, are not expired.  Note that the root that the certs chain up to
488
+	// should also not be expired at that "current" time.
489
+	if allowExpired {
490
+		verifyOpts.CurrentTime = parsedCerts[0].NotAfter.Add(time.Hour)
491
+		for _, cert := range parsedCerts {
492
+			if !cert.NotAfter.Before(verifyOpts.CurrentTime) {
493
+				continue
494
+			}
495
+			verifyOpts.CurrentTime = cert.NotAfter
496
+
497
+			_, err = parsedCerts[0].Verify(verifyOpts)
498
+			if err == nil {
499
+				return parsedCerts, nil
500
+			}
501
+		}
502
+		if invalid, ok := err.(x509.CertificateInvalidError); ok && invalid.Reason == x509.Expired {
503
+			return nil, errors.New("there is no time span for which all of the certificates, including a root, are valid")
504
+		}
505
+		return nil, err
506
+	}
507
+
508
+	_, err = parsedCerts[0].Verify(verifyOpts)
509
+	if err != nil {
510
+		return nil, err
511
+	}
512
+	return parsedCerts, nil
416 513
 }
417 514
 
418 515
 func ensureCertKeyMatch(cert *x509.Certificate, key crypto.PublicKey) error {
... ...
@@ -666,17 +745,11 @@ func saveRootCA(rootCA RootCA, paths CertPaths) error {
666 666
 }
667 667
 
668 668
 // GenerateNewCSR returns a newly generated key and CSR signed with said key
669
-func GenerateNewCSR() (csr, key []byte, err error) {
669
+func GenerateNewCSR() ([]byte, []byte, error) {
670 670
 	req := &cfcsr.CertificateRequest{
671 671
 		KeyRequest: cfcsr.NewBasicKeyRequest(),
672 672
 	}
673
-
674
-	csr, key, err = cfcsr.ParseRequest(req)
675
-	if err != nil {
676
-		return
677
-	}
678
-
679
-	return
673
+	return cfcsr.ParseRequest(req)
680 674
 }
681 675
 
682 676
 // EncryptECPrivateKey receives a PEM encoded private key and returns an encrypted
... ...
@@ -692,7 +765,7 @@ func EncryptECPrivateKey(key []byte, passphraseStr string) ([]byte, error) {
692 692
 		return nil, errors.New("error while decoding PEM key")
693 693
 	}
694 694
 
695
-	encryptedPEMBlock, err := x509.EncryptPEMBlock(rand.Reader,
695
+	encryptedPEMBlock, err := x509.EncryptPEMBlock(cryptorand.Reader,
696 696
 		"EC PRIVATE KEY",
697 697
 		keyBlock.Bytes,
698 698
 		passphrase,
... ...
@@ -4,7 +4,6 @@ import (
4 4
 	cryptorand "crypto/rand"
5 5
 	"crypto/tls"
6 6
 	"crypto/x509"
7
-	"encoding/pem"
8 7
 	"fmt"
9 8
 	"math/big"
10 9
 	"math/rand"
... ...
@@ -112,6 +111,11 @@ func (s *SecurityConfig) RootCA() *RootCA {
112 112
 	return s.rootCA
113 113
 }
114 114
 
115
+// ExternalCA returns the external CA.
116
+func (s *SecurityConfig) ExternalCA() *ExternalCA {
117
+	return s.externalCA
118
+}
119
+
115 120
 // KeyWriter returns the object that can write keys to disk
116 121
 func (s *SecurityConfig) KeyWriter() KeyWriter {
117 122
 	return s.keyReadWriter
... ...
@@ -129,11 +133,45 @@ func (s *SecurityConfig) UpdateRootCA(cert, key []byte, certExpiry time.Duration
129 129
 	defer s.mu.Unlock()
130 130
 
131 131
 	rootCA, err := NewRootCA(cert, key, certExpiry)
132
-	if err == nil {
133
-		s.rootCA = &rootCA
132
+	if err != nil {
133
+		return err
134
+	}
135
+
136
+	s.rootCA = &rootCA
137
+	clientTLSConfig := s.ClientTLSCreds.Config()
138
+	return s.updateTLSCredentials(clientTLSConfig.Certificates)
139
+}
140
+
141
+// updateTLSCredentials updates the client, server, and TLS credentials on a security config.  This function expects
142
+// something else to have taken out a lock on the SecurityConfig.
143
+func (s *SecurityConfig) updateTLSCredentials(certificates []tls.Certificate) error {
144
+	clientConfig, err := NewClientTLSConfig(certificates, s.rootCA.Pool, ManagerRole)
145
+	if err != nil {
146
+		return errors.Wrap(err, "failed to create a new client config using the new root CA")
147
+	}
148
+
149
+	serverConfig, err := NewServerTLSConfig(certificates, s.rootCA.Pool)
150
+	if err != nil {
151
+		return errors.Wrap(err, "failed to create a new server config using the new root CA")
152
+	}
153
+
154
+	if err := s.ClientTLSCreds.loadNewTLSConfig(clientConfig); err != nil {
155
+		return errors.Wrap(err, "failed to update the client credentials")
134 156
 	}
135 157
 
136
-	return err
158
+	// Update the external CA to use the new client TLS
159
+	// config using a copy without a serverName specified.
160
+	s.externalCA.UpdateTLSConfig(&tls.Config{
161
+		Certificates: certificates,
162
+		RootCAs:      s.rootCA.Pool,
163
+		MinVersion:   tls.VersionTLS12,
164
+	})
165
+
166
+	if err := s.ServerTLSCreds.loadNewTLSConfig(serverConfig); err != nil {
167
+		return errors.Wrap(err, "failed to update the server TLS credentials")
168
+	}
169
+
170
+	return nil
137 171
 }
138 172
 
139 173
 // SigningPolicy creates a policy used by the signer to ensure that the only fields
... ...
@@ -263,25 +301,8 @@ func LoadSecurityConfig(ctx context.Context, rootCA RootCA, krw *KeyReadWriter,
263 263
 		return nil, err
264 264
 	}
265 265
 
266
-	// Create an x509 certificate out of the contents on disk
267
-	certBlock, _ := pem.Decode([]byte(cert))
268
-	if certBlock == nil {
269
-		return nil, errors.New("failed to parse certificate PEM")
270
-	}
271
-
272
-	// Create an X509Cert so we can .Verify()
273
-	X509Cert, err := x509.ParseCertificate(certBlock.Bytes)
274
-	if err != nil {
275
-		return nil, err
276
-	}
277
-
278
-	// Include our root pool
279
-	opts := x509.VerifyOptions{
280
-		Roots: rootCA.Pool,
281
-	}
282
-
283 266
 	// Check to see if this certificate was signed by our CA, and isn't expired
284
-	if err := verifyCertificate(X509Cert, opts, allowExpired); err != nil {
267
+	if _, err := ValidateCertChain(rootCA.Pool, cert, allowExpired); err != nil {
285 268
 		return nil, err
286 269
 	}
287 270
 
... ...
@@ -415,37 +436,9 @@ func RenewTLSConfigNow(ctx context.Context, s *SecurityConfig, connBroker *conne
415 415
 		log.WithError(err).Errorf("failed to renew the certificate")
416 416
 		return err
417 417
 	}
418
-
419
-	clientTLSConfig, err := NewClientTLSConfig(tlsKeyPair, rootCA.Pool, CARole)
420
-	if err != nil {
421
-		log.WithError(err).Errorf("failed to create a new client config")
422
-		return err
423
-	}
424
-	serverTLSConfig, err := NewServerTLSConfig(tlsKeyPair, rootCA.Pool)
425
-	if err != nil {
426
-		log.WithError(err).Errorf("failed to create a new server config")
427
-		return err
428
-	}
429
-
430
-	if err = s.ClientTLSCreds.LoadNewTLSConfig(clientTLSConfig); err != nil {
431
-		log.WithError(err).Errorf("failed to update the client credentials")
432
-		return err
433
-	}
434
-
435
-	// Update the external CA to use the new client TLS
436
-	// config using a copy without a serverName specified.
437
-	s.externalCA.UpdateTLSConfig(&tls.Config{
438
-		Certificates: clientTLSConfig.Certificates,
439
-		RootCAs:      clientTLSConfig.RootCAs,
440
-		MinVersion:   tls.VersionTLS12,
441
-	})
442
-
443
-	if err = s.ServerTLSCreds.LoadNewTLSConfig(serverTLSConfig); err != nil {
444
-		log.WithError(err).Errorf("failed to update the server TLS credentials")
445
-		return err
446
-	}
447
-
448
-	return nil
418
+	s.mu.Lock()
419
+	defer s.mu.Unlock()
420
+	return s.updateTLSCredentials([]tls.Certificate{*tlsKeyPair})
449 421
 }
450 422
 
451 423
 // RenewTLSConfig will continuously monitor for the necessity of renewing the local certificates, either by
... ...
@@ -565,13 +558,13 @@ func calculateRandomExpiry(validFrom, validUntil time.Time) time.Duration {
565 565
 
566 566
 // NewServerTLSConfig returns a tls.Config configured for a TLS Server, given a tls.Certificate
567 567
 // and the PEM-encoded root CA Certificate
568
-func NewServerTLSConfig(cert *tls.Certificate, rootCAPool *x509.CertPool) (*tls.Config, error) {
568
+func NewServerTLSConfig(certs []tls.Certificate, rootCAPool *x509.CertPool) (*tls.Config, error) {
569 569
 	if rootCAPool == nil {
570 570
 		return nil, errors.New("valid root CA pool required")
571 571
 	}
572 572
 
573 573
 	return &tls.Config{
574
-		Certificates: []tls.Certificate{*cert},
574
+		Certificates: certs,
575 575
 		// Since we're using the same CA server to issue Certificates to new nodes, we can't
576 576
 		// use tls.RequireAndVerifyClientCert
577 577
 		ClientAuth:               tls.VerifyClientCertIfGiven,
... ...
@@ -584,14 +577,14 @@ func NewServerTLSConfig(cert *tls.Certificate, rootCAPool *x509.CertPool) (*tls.
584 584
 
585 585
 // NewClientTLSConfig returns a tls.Config configured for a TLS Client, given a tls.Certificate
586 586
 // the PEM-encoded root CA Certificate, and the name of the remote server the client wants to connect to.
587
-func NewClientTLSConfig(cert *tls.Certificate, rootCAPool *x509.CertPool, serverName string) (*tls.Config, error) {
587
+func NewClientTLSConfig(certs []tls.Certificate, rootCAPool *x509.CertPool, serverName string) (*tls.Config, error) {
588 588
 	if rootCAPool == nil {
589 589
 		return nil, errors.New("valid root CA pool required")
590 590
 	}
591 591
 
592 592
 	return &tls.Config{
593 593
 		ServerName:   serverName,
594
-		Certificates: []tls.Certificate{*cert},
594
+		Certificates: certs,
595 595
 		RootCAs:      rootCAPool,
596 596
 		MinVersion:   tls.VersionTLS12,
597 597
 	}, nil
... ...
@@ -600,7 +593,7 @@ func NewClientTLSConfig(cert *tls.Certificate, rootCAPool *x509.CertPool, server
600 600
 // NewClientTLSCredentials returns GRPC credentials for a TLS GRPC client, given a tls.Certificate
601 601
 // a PEM-Encoded root CA Certificate, and the name of the remote server the client wants to connect to.
602 602
 func (rootCA *RootCA) NewClientTLSCredentials(cert *tls.Certificate, serverName string) (*MutableTLSCreds, error) {
603
-	tlsConfig, err := NewClientTLSConfig(cert, rootCA.Pool, serverName)
603
+	tlsConfig, err := NewClientTLSConfig([]tls.Certificate{*cert}, rootCA.Pool, serverName)
604 604
 	if err != nil {
605 605
 		return nil, err
606 606
 	}
... ...
@@ -613,7 +606,7 @@ func (rootCA *RootCA) NewClientTLSCredentials(cert *tls.Certificate, serverName
613 613
 // NewServerTLSCredentials returns GRPC credentials for a TLS GRPC client, given a tls.Certificate
614 614
 // a PEM-Encoded root CA Certificate, and the name of the remote server the client wants to connect to.
615 615
 func (rootCA *RootCA) NewServerTLSCredentials(cert *tls.Certificate) (*MutableTLSCreds, error) {
616
-	tlsConfig, err := NewServerTLSConfig(cert, rootCA.Pool)
616
+	tlsConfig, err := NewServerTLSConfig([]tls.Certificate{*cert}, rootCA.Pool)
617 617
 	if err != nil {
618 618
 		return nil, err
619 619
 	}
... ...
@@ -1,7 +1,7 @@
1 1
 package ca
2 2
 
3 3
 import (
4
-	"crypto/rand"
4
+	cryptorand "crypto/rand"
5 5
 	"crypto/x509"
6 6
 	"encoding/pem"
7 7
 	"io/ioutil"
... ...
@@ -345,7 +345,7 @@ func (k *KeyReadWriter) readKey() (*pem.Block, error) {
345 345
 // writing it to disk.  If the kek is nil, writes it to disk unencrypted.
346 346
 func (k *KeyReadWriter) writeKey(keyBlock *pem.Block, kekData KEKData, pkh PEMKeyHeaders) error {
347 347
 	if kekData.KEK != nil {
348
-		encryptedPEMBlock, err := x509.EncryptPEMBlock(rand.Reader,
348
+		encryptedPEMBlock, err := x509.EncryptPEMBlock(cryptorand.Reader,
349 349
 			keyBlock.Type,
350 350
 			keyBlock.Bytes,
351 351
 			kekData.KEK,
... ...
@@ -392,14 +392,12 @@ func (s *Server) Run(ctx context.Context) error {
392 392
 			if len(clusters) != 1 {
393 393
 				return errors.New("could not find cluster object")
394 394
 			}
395
-			s.updateCluster(ctx, clusters[0])
396
-
395
+			s.UpdateRootCA(ctx, clusters[0]) // call once to ensure that the join tokens are always set
397 396
 			nodes, err = store.FindNodes(readTx, store.All)
398 397
 			return err
399 398
 		},
400 399
 		state.EventCreateNode{},
401 400
 		state.EventUpdateNode{},
402
-		state.EventUpdateCluster{},
403 401
 	)
404 402
 
405 403
 	// Do this after updateCluster has been called, so isRunning never
... ...
@@ -435,6 +433,12 @@ func (s *Server) Run(ctx context.Context) error {
435 435
 	// to the cluster
436 436
 	for {
437 437
 		select {
438
+		case <-ctx.Done():
439
+			return nil
440
+		default:
441
+		}
442
+
443
+		select {
438 444
 		case event := <-updates:
439 445
 			switch v := event.(type) {
440 446
 			case state.EventCreateNode:
... ...
@@ -445,8 +449,6 @@ func (s *Server) Run(ctx context.Context) error {
445 445
 				if !isFinalState(v.Node.Certificate.Status) {
446 446
 					s.evaluateAndSignNodeCert(ctx, v.Node)
447 447
 				}
448
-			case state.EventUpdateCluster:
449
-				s.updateCluster(ctx, v.Cluster)
450 448
 			}
451 449
 		case <-ticker.C:
452 450
 			for _, node := range s.pending {
... ...
@@ -512,9 +514,10 @@ func (s *Server) isRunning() bool {
512 512
 	return true
513 513
 }
514 514
 
515
-// updateCluster is called when there are cluster changes, and it ensures that the local RootCA is
516
-// always aware of changes in clusterExpiry and the Root CA key material
517
-func (s *Server) updateCluster(ctx context.Context, cluster *api.Cluster) {
515
+// UpdateRootCA is called when there are cluster changes, and it ensures that the local RootCA is
516
+// always aware of changes in clusterExpiry and the Root CA key material - this can be called by
517
+// anything to update the root CA material
518
+func (s *Server) UpdateRootCA(ctx context.Context, cluster *api.Cluster) {
518 519
 	s.mu.Lock()
519 520
 	s.joinTokens = cluster.RootCA.JoinTokens.Copy()
520 521
 	s.mu.Unlock()
... ...
@@ -120,8 +120,8 @@ func (c *MutableTLSCreds) ServerHandshake(rawConn net.Conn) (net.Conn, credentia
120 120
 	return conn, credentials.TLSInfo{State: conn.ConnectionState()}, nil
121 121
 }
122 122
 
123
-// LoadNewTLSConfig replaces the currently loaded TLS config with a new one
124
-func (c *MutableTLSCreds) LoadNewTLSConfig(newConfig *tls.Config) error {
123
+// loadNewTLSConfig replaces the currently loaded TLS config with a new one
124
+func (c *MutableTLSCreds) loadNewTLSConfig(newConfig *tls.Config) error {
125 125
 	newSubject, err := GetAndValidateCertificateSubject(newConfig.Certificates)
126 126
 	if err != nil {
127 127
 		return err
... ...
@@ -1,7 +1,7 @@
1 1
 package identity
2 2
 
3 3
 import (
4
-	"crypto/rand"
4
+	cryptorand "crypto/rand"
5 5
 	"fmt"
6 6
 	"io"
7 7
 	"math/big"
... ...
@@ -10,7 +10,7 @@ import (
10 10
 var (
11 11
 	// idReader is used for random id generation. This declaration allows us to
12 12
 	// replace it for testing.
13
-	idReader = rand.Reader
13
+	idReader = cryptorand.Reader
14 14
 )
15 15
 
16 16
 // parameters for random identifier generation. We can tweak this when there is
... ...
@@ -454,7 +454,7 @@ func (na *NetworkAllocator) releaseEndpoints(networks []*api.NetworkAttachment)
454 454
 func (na *NetworkAllocator) allocateVIP(vip *api.Endpoint_VirtualIP) error {
455 455
 	localNet := na.getNetwork(vip.NetworkID)
456 456
 	if localNet == nil {
457
-		return fmt.Errorf("networkallocator: could not find local network state")
457
+		return errors.New("networkallocator: could not find local network state")
458 458
 	}
459 459
 
460 460
 	// If this IP is already allocated in memory we don't need to
... ...
@@ -682,7 +682,7 @@ func (na *NetworkAllocator) resolveDriver(n *api.Network) (driverapi.Driver, str
682 682
 func (na *NetworkAllocator) loadDriver(name string) error {
683 683
 	pg := na.drvRegistry.GetPluginGetter()
684 684
 	if pg == nil {
685
-		return fmt.Errorf("plugin store is uninitialized")
685
+		return errors.New("plugin store is uninitialized")
686 686
 	}
687 687
 	_, err := pg.Get(name, driverapi.NetworkPluginEndpointType, plugingetter.Lookup)
688 688
 	return err
... ...
@@ -739,7 +739,7 @@ func (na *NetworkAllocator) allocatePools(n *api.Network) (map[string]string, er
739 739
 	}
740 740
 
741 741
 	// We don't support user defined address spaces yet so just
742
-	// retrive default address space names for the driver.
742
+	// retrieve default address space names for the driver.
743 743
 	_, asName, err := na.drvRegistry.IPAMDefaultAddressSpaces(dName)
744 744
 	if err != nil {
745 745
 		return nil, err
... ...
@@ -94,6 +94,10 @@ func validateDriver(driver *api.Driver, pg plugingetter.PluginGetter, pluginType
94 94
 		return nil
95 95
 	}
96 96
 
97
+	if pg == nil {
98
+		return grpc.Errorf(codes.InvalidArgument, "plugin %s not supported", driver.Name)
99
+	}
100
+
97 101
 	p, err := pg.Get(driver.Name, pluginType, plugingetter.Lookup)
98 102
 	if err != nil {
99 103
 		return grpc.Errorf(codes.InvalidArgument, "error during lookup of plugin %s", driver.Name)
... ...
@@ -117,29 +117,7 @@ func validateUpdate(uc *api.UpdateConfig) error {
117 117
 	return nil
118 118
 }
119 119
 
120
-func validateContainerSpec(taskSpec api.TaskSpec) error {
121
-	// Building a empty/dummy Task to validate the templating and
122
-	// the resulting container spec as well. This is a *best effort*
123
-	// validation.
124
-	container, err := template.ExpandContainerSpec(&api.Task{
125
-		Spec:      taskSpec,
126
-		ServiceID: "serviceid",
127
-		Slot:      1,
128
-		NodeID:    "nodeid",
129
-		Networks:  []*api.NetworkAttachment{},
130
-		Annotations: api.Annotations{
131
-			Name: "taskname",
132
-		},
133
-		ServiceAnnotations: api.Annotations{
134
-			Name: "servicename",
135
-		},
136
-		Endpoint:  &api.Endpoint{},
137
-		LogDriver: taskSpec.LogDriver,
138
-	})
139
-	if err != nil {
140
-		return grpc.Errorf(codes.InvalidArgument, err.Error())
141
-	}
142
-
120
+func validateContainerSpec(container *api.ContainerSpec) error {
143 121
 	if container == nil {
144 122
 		return grpc.Errorf(codes.InvalidArgument, "ContainerSpec: missing in service spec")
145 123
 	}
... ...
@@ -163,18 +141,6 @@ func validateContainerSpec(taskSpec api.TaskSpec) error {
163 163
 	return nil
164 164
 }
165 165
 
166
-func validatePluginSpec(plugin *api.PluginSpec) error {
167
-	if plugin.Image == "" {
168
-		return grpc.Errorf(codes.InvalidArgument, "PluginSpec: image reference must be provided")
169
-	}
170
-
171
-	if _, err := reference.ParseNormalizedNamed(plugin.Image); err != nil {
172
-		return grpc.Errorf(codes.InvalidArgument, "PluginSpec: %q is not a valid repository/tag", plugin.Image)
173
-	}
174
-
175
-	return nil
176
-}
177
-
178 166
 func validateTaskSpec(taskSpec api.TaskSpec) error {
179 167
 	if err := validateResourceRequirements(taskSpec.Resources); err != nil {
180 168
 		return err
... ...
@@ -197,18 +163,36 @@ func validateTaskSpec(taskSpec api.TaskSpec) error {
197 197
 		return grpc.Errorf(codes.InvalidArgument, "TaskSpec: missing runtime")
198 198
 	}
199 199
 
200
-	switch taskSpec.GetRuntime().(type) {
201
-	case *api.TaskSpec_Container:
202
-		if err := validateContainerSpec(taskSpec); err != nil {
203
-			return err
204
-		}
205
-	case *api.TaskSpec_Plugin:
206
-		if err := validatePluginSpec(taskSpec.GetPlugin()); err != nil {
207
-			return err
208
-		}
209
-	default:
200
+	_, ok := taskSpec.GetRuntime().(*api.TaskSpec_Container)
201
+	if !ok {
210 202
 		return grpc.Errorf(codes.Unimplemented, "RuntimeSpec: unimplemented runtime in service spec")
211 203
 	}
204
+
205
+	// Building a empty/dummy Task to validate the templating and
206
+	// the resulting container spec as well. This is a *best effort*
207
+	// validation.
208
+	preparedSpec, err := template.ExpandContainerSpec(&api.Task{
209
+		Spec:      taskSpec,
210
+		ServiceID: "serviceid",
211
+		Slot:      1,
212
+		NodeID:    "nodeid",
213
+		Networks:  []*api.NetworkAttachment{},
214
+		Annotations: api.Annotations{
215
+			Name: "taskname",
216
+		},
217
+		ServiceAnnotations: api.Annotations{
218
+			Name: "servicename",
219
+		},
220
+		Endpoint:  &api.Endpoint{},
221
+		LogDriver: taskSpec.LogDriver,
222
+	})
223
+	if err != nil {
224
+		return grpc.Errorf(codes.InvalidArgument, err.Error())
225
+	}
226
+	if err := validateContainerSpec(preparedSpec); err != nil {
227
+		return err
228
+	}
229
+
212 230
 	return nil
213 231
 }
214 232
 
... ...
@@ -3,6 +3,7 @@ package controlapi
3 3
 import (
4 4
 	"github.com/docker/swarmkit/api"
5 5
 	"github.com/docker/swarmkit/api/naming"
6
+	"github.com/docker/swarmkit/manager/orchestrator"
6 7
 	"github.com/docker/swarmkit/manager/state/store"
7 8
 	"golang.org/x/net/context"
8 9
 	"google.golang.org/grpc"
... ...
@@ -97,12 +98,11 @@ func (s *Server) ListTasks(ctx context.Context, request *api.ListTasksRequest) (
97 97
 		default:
98 98
 			tasks, err = store.FindTasks(tx, store.All)
99 99
 		}
100
-	})
101
-	if err != nil {
102
-		return nil, err
103
-	}
104 100
 
105
-	if request.Filters != nil {
101
+		if err != nil || request.Filters == nil {
102
+			return
103
+		}
104
+
106 105
 		tasks = filterTasks(tasks,
107 106
 			func(e *api.Task) bool {
108 107
 				return filterContains(naming.Task(e), request.Filters.Names)
... ...
@@ -133,7 +133,23 @@ func (s *Server) ListTasks(ctx context.Context, request *api.ListTasksRequest) (
133 133
 				}
134 134
 				return false
135 135
 			},
136
+			func(e *api.Task) bool {
137
+				if !request.Filters.UpToDate {
138
+					return true
139
+				}
140
+
141
+				service := store.GetService(tx, e.ServiceID)
142
+				if service == nil {
143
+					return false
144
+				}
145
+
146
+				return !orchestrator.IsTaskDirty(service, e)
147
+			},
136 148
 		)
149
+	})
150
+
151
+	if err != nil {
152
+		return nil, err
137 153
 	}
138 154
 
139 155
 	return &api.ListTasksResponse{
... ...
@@ -1,7 +1,7 @@
1 1
 package encryption
2 2
 
3 3
 import (
4
-	"crypto/rand"
4
+	cryptorand "crypto/rand"
5 5
 	"encoding/base64"
6 6
 	"fmt"
7 7
 	"io"
... ...
@@ -105,7 +105,7 @@ func Defaults(key []byte) (Encrypter, Decrypter) {
105 105
 // using this package
106 106
 func GenerateSecretKey() []byte {
107 107
 	secretData := make([]byte, naclSecretboxKeySize)
108
-	if _, err := io.ReadFull(rand.Reader, secretData); err != nil {
108
+	if _, err := io.ReadFull(cryptorand.Reader, secretData); err != nil {
109 109
 		// panic if we can't read random data
110 110
 		panic(errors.Wrap(err, "failed to read random bytes"))
111 111
 	}
... ...
@@ -1,7 +1,7 @@
1 1
 package encryption
2 2
 
3 3
 import (
4
-	"crypto/rand"
4
+	cryptorand "crypto/rand"
5 5
 	"fmt"
6 6
 	"io"
7 7
 
... ...
@@ -37,7 +37,7 @@ func (n NACLSecretbox) Algorithm() api.MaybeEncryptedRecord_Algorithm {
37 37
 // Encrypt encrypts some bytes and returns an encrypted record
38 38
 func (n NACLSecretbox) Encrypt(data []byte) (*api.MaybeEncryptedRecord, error) {
39 39
 	var nonce [24]byte
40
-	if _, err := io.ReadFull(rand.Reader, nonce[:]); err != nil {
40
+	if _, err := io.ReadFull(cryptorand.Reader, nonce[:]); err != nil {
41 41
 		return nil, err
42 42
 	}
43 43
 
... ...
@@ -6,7 +6,7 @@ package keymanager
6 6
 // which is used to exchange service discovery and overlay network control
7 7
 // plane information. It can also be used to encrypt overlay data traffic.
8 8
 import (
9
-	"crypto/rand"
9
+	cryptorand "crypto/rand"
10 10
 	"encoding/binary"
11 11
 	"sync"
12 12
 	"time"
... ...
@@ -95,7 +95,7 @@ func New(store *store.MemoryStore, config *Config) *KeyManager {
95 95
 func (k *KeyManager) allocateKey(ctx context.Context, subsys string) *api.EncryptionKey {
96 96
 	key := make([]byte, k.config.Keylen)
97 97
 
98
-	_, err := rand.Read(key)
98
+	_, err := cryptorand.Read(key)
99 99
 	if err != nil {
100 100
 		panic(errors.Wrap(err, "key generated failed"))
101 101
 	}
... ...
@@ -232,7 +232,7 @@ func (k *KeyManager) Stop() error {
232 232
 // genSkew generates a random uint64 number between 0 and 65535
233 233
 func genSkew() uint64 {
234 234
 	b := make([]byte, 2)
235
-	if _, err := rand.Read(b); err != nil {
235
+	if _, err := cryptorand.Read(b); err != nil {
236 236
 		panic(err)
237 237
 	}
238 238
 	return uint64(binary.BigEndian.Uint16(b))
... ...
@@ -360,7 +360,7 @@ func (lb *LogBroker) PublishLogs(stream api.LogBroker_PublishLogsServer) (err er
360 360
 	}()
361 361
 
362 362
 	for {
363
-		log, err := stream.Recv()
363
+		logMsg, err := stream.Recv()
364 364
 		if err == io.EOF {
365 365
 			return stream.SendAndClose(&api.PublishLogsResponse{})
366 366
 		}
... ...
@@ -368,28 +368,37 @@ func (lb *LogBroker) PublishLogs(stream api.LogBroker_PublishLogsServer) (err er
368 368
 			return err
369 369
 		}
370 370
 
371
-		if log.SubscriptionID == "" {
371
+		if logMsg.SubscriptionID == "" {
372 372
 			return grpc.Errorf(codes.InvalidArgument, "missing subscription ID")
373 373
 		}
374 374
 
375 375
 		if currentSubscription == nil {
376
-			currentSubscription = lb.getSubscription(log.SubscriptionID)
376
+			currentSubscription = lb.getSubscription(logMsg.SubscriptionID)
377 377
 			if currentSubscription == nil {
378 378
 				return grpc.Errorf(codes.NotFound, "unknown subscription ID")
379 379
 			}
380 380
 		} else {
381
-			if log.SubscriptionID != currentSubscription.message.ID {
381
+			if logMsg.SubscriptionID != currentSubscription.message.ID {
382 382
 				return grpc.Errorf(codes.InvalidArgument, "different subscription IDs in the same session")
383 383
 			}
384 384
 		}
385 385
 
386
+		// if we have a close message, close out the subscription
387
+		if logMsg.Close {
388
+			// Mark done and then set to nil so if we error after this point,
389
+			// we don't try to close again in the defer
390
+			currentSubscription.Done(remote.NodeID, err)
391
+			currentSubscription = nil
392
+			return nil
393
+		}
394
+
386 395
 		// Make sure logs are emitted using the right Node ID to avoid impersonation.
387
-		for _, msg := range log.Messages {
396
+		for _, msg := range logMsg.Messages {
388 397
 			if msg.Context.NodeID != remote.NodeID {
389 398
 				return grpc.Errorf(codes.PermissionDenied, "invalid NodeID: expected=%s;received=%s", remote.NodeID, msg.Context.NodeID)
390 399
 			}
391 400
 		}
392 401
 
393
-		lb.publish(log)
402
+		lb.publish(logMsg)
394 403
 	}
395 404
 }
... ...
@@ -182,6 +182,10 @@ func (s *subscription) match() {
182 182
 				continue
183 183
 			}
184 184
 			for _, task := range tasks {
185
+				// if we're not following, don't add tasks that aren't running yet
186
+				if !s.follow() && task.Status.State < api.TaskStateRunning {
187
+					continue
188
+				}
185 189
 				add(task)
186 190
 			}
187 191
 		}
... ...
@@ -514,7 +514,7 @@ func (m *Manager) Run(parent context.Context) error {
514 514
 	}
515 515
 	raftConfig := c.Spec.Raft
516 516
 
517
-	if err := m.watchForKEKChanges(ctx); err != nil {
517
+	if err := m.watchForClusterChanges(ctx); err != nil {
518 518
 		return err
519 519
 	}
520 520
 
... ...
@@ -679,7 +679,7 @@ func (m *Manager) updateKEK(ctx context.Context, cluster *api.Cluster) error {
679 679
 	return nil
680 680
 }
681 681
 
682
-func (m *Manager) watchForKEKChanges(ctx context.Context) error {
682
+func (m *Manager) watchForClusterChanges(ctx context.Context) error {
683 683
 	clusterID := m.config.SecurityConfig.ClientTLSCreds.Organization()
684 684
 	clusterWatch, clusterWatchCancel, err := store.ViewAndWatch(m.raftNode.MemoryStore(),
685 685
 		func(tx store.ReadTx) error {
... ...
@@ -687,6 +687,7 @@ func (m *Manager) watchForKEKChanges(ctx context.Context) error {
687 687
 			if cluster == nil {
688 688
 				return fmt.Errorf("unable to get current cluster")
689 689
 			}
690
+			m.caserver.UpdateRootCA(ctx, cluster)
690 691
 			return m.updateKEK(ctx, cluster)
691 692
 		},
692 693
 		state.EventUpdateCluster{
... ...
@@ -702,6 +703,7 @@ func (m *Manager) watchForKEKChanges(ctx context.Context) error {
702 702
 			select {
703 703
 			case event := <-clusterWatch:
704 704
 				clusterEvent := event.(state.EventUpdateCluster)
705
+				m.caserver.UpdateRootCA(ctx, clusterEvent.Cluster)
705 706
 				m.updateKEK(ctx, clusterEvent.Cluster)
706 707
 			case <-ctx.Done():
707 708
 				clusterWatchCancel()
... ...
@@ -1030,6 +1032,10 @@ func defaultClusterObject(
1030 1030
 	encryptionConfig api.EncryptionConfig,
1031 1031
 	initialUnlockKeys []*api.EncryptionKey,
1032 1032
 	rootCA *ca.RootCA) *api.Cluster {
1033
+	var caKey []byte
1034
+	if rootCA.Signer != nil {
1035
+		caKey = rootCA.Signer.Key
1036
+	}
1033 1037
 
1034 1038
 	return &api.Cluster{
1035 1039
 		ID: clusterID,
... ...
@@ -1048,7 +1054,7 @@ func defaultClusterObject(
1048 1048
 			EncryptionConfig: encryptionConfig,
1049 1049
 		},
1050 1050
 		RootCA: api.RootCA{
1051
-			CAKey:      rootCA.Key,
1051
+			CAKey:      caKey,
1052 1052
 			CACert:     rootCA.Cert,
1053 1053
 			CACertHash: rootCA.Digest.String(),
1054 1054
 			JoinTokens: api.JoinTokens{
... ...
@@ -132,14 +132,6 @@ func (p *peer) resolveAddr(ctx context.Context, id uint64) (string, error) {
132 132
 	return resp.Addr, nil
133 133
 }
134 134
 
135
-func (p *peer) reportSnapshot(failure bool) {
136
-	if failure {
137
-		p.tr.config.ReportSnapshot(p.id, raft.SnapshotFailure)
138
-		return
139
-	}
140
-	p.tr.config.ReportSnapshot(p.id, raft.SnapshotFinish)
141
-}
142
-
143 135
 func (p *peer) sendProcessMessage(ctx context.Context, m raftpb.Message) error {
144 136
 	ctx, cancel := context.WithTimeout(ctx, p.tr.config.SendTimeout)
145 137
 	defer cancel()
... ...
@@ -151,9 +143,9 @@ func (p *peer) sendProcessMessage(ctx context.Context, m raftpb.Message) error {
151 151
 		if err != nil {
152 152
 			p.tr.config.ReportSnapshot(m.To, raft.SnapshotFailure)
153 153
 		} else {
154
+			p.tr.config.ReportSnapshot(m.To, raft.SnapshotFinish)
154 155
 		}
155 156
 	}
156
-	p.reportSnapshot(err != nil)
157 157
 	if err != nil {
158 158
 		p.tr.config.ReportUnreachable(m.To)
159 159
 		return err
... ...
@@ -33,7 +33,10 @@ import (
33 33
 	"google.golang.org/grpc/credentials"
34 34
 )
35 35
 
36
-const stateFilename = "state.json"
36
+const (
37
+	stateFilename     = "state.json"
38
+	roleChangeTimeout = 16 * time.Second
39
+)
37 40
 
38 41
 var (
39 42
 	errNodeStarted    = errors.New("node: already started")
... ...
@@ -269,12 +272,11 @@ func (n *Node) run(ctx context.Context) (err error) {
269 269
 				}
270 270
 				n.Lock()
271 271
 				// If we got a role change, renew
272
-				lastRole := n.role
273 272
 				role := ca.WorkerRole
274 273
 				if node.Role == api.NodeRoleManager {
275 274
 					role = ca.ManagerRole
276 275
 				}
277
-				if lastRole == role {
276
+				if n.role == role {
278 277
 					n.Unlock()
279 278
 					continue
280 279
 				}
... ...
@@ -284,23 +286,23 @@ func (n *Node) run(ctx context.Context) (err error) {
284 284
 		}
285 285
 	}()
286 286
 
287
+	var wg sync.WaitGroup
288
+	wg.Add(3)
289
+
287 290
 	updates := ca.RenewTLSConfig(ctx, securityConfig, n.connBroker, forceCertRenewal)
288 291
 	go func() {
289
-		for {
290
-			select {
291
-			case certUpdate := <-updates:
292
-				if certUpdate.Err != nil {
293
-					logrus.Warnf("error renewing TLS certificate: %v", certUpdate.Err)
294
-					continue
295
-				}
296
-				n.Lock()
297
-				n.role = certUpdate.Role
298
-				n.roleCond.Broadcast()
299
-				n.Unlock()
300
-			case <-ctx.Done():
301
-				return
292
+		for certUpdate := range updates {
293
+			if certUpdate.Err != nil {
294
+				logrus.Warnf("error renewing TLS certificate: %v", certUpdate.Err)
295
+				continue
302 296
 			}
297
+			n.Lock()
298
+			n.role = certUpdate.Role
299
+			n.roleCond.Broadcast()
300
+			n.Unlock()
303 301
 		}
302
+
303
+		wg.Done()
304 304
 	}()
305 305
 
306 306
 	role := n.role
... ...
@@ -309,10 +311,8 @@ func (n *Node) run(ctx context.Context) (err error) {
309 309
 	agentReady := make(chan struct{})
310 310
 	var managerErr error
311 311
 	var agentErr error
312
-	var wg sync.WaitGroup
313
-	wg.Add(2)
314 312
 	go func() {
315
-		managerErr = n.superviseManager(ctx, securityConfig, managerReady) // store err and loop
313
+		managerErr = n.superviseManager(ctx, securityConfig, managerReady, forceCertRenewal) // store err and loop
316 314
 		wg.Done()
317 315
 		cancel()
318 316
 	}()
... ...
@@ -703,7 +703,7 @@ func (n *Node) waitRole(ctx context.Context, role string) error {
703 703
 	return nil
704 704
 }
705 705
 
706
-func (n *Node) runManager(ctx context.Context, securityConfig *ca.SecurityConfig, ready chan struct{}, workerRole <-chan struct{}) error {
706
+func (n *Node) runManager(ctx context.Context, securityConfig *ca.SecurityConfig, ready chan struct{}, workerRole <-chan struct{}) (bool, error) {
707 707
 	var remoteAPI *manager.RemoteAddrs
708 708
 	if n.config.ListenRemoteAPI != "" {
709 709
 		remoteAPI = &manager.RemoteAddrs{
... ...
@@ -729,7 +729,7 @@ func (n *Node) runManager(ctx context.Context, securityConfig *ca.SecurityConfig
729 729
 		PluginGetter:     n.config.PluginGetter,
730 730
 	})
731 731
 	if err != nil {
732
-		return err
732
+		return false, err
733 733
 	}
734 734
 	done := make(chan struct{})
735 735
 	var runErr error
... ...
@@ -762,7 +762,7 @@ func (n *Node) runManager(ctx context.Context, securityConfig *ca.SecurityConfig
762 762
 	// wait for manager stop or for role change
763 763
 	select {
764 764
 	case <-done:
765
-		return runErr
765
+		return false, runErr
766 766
 	case <-workerRole:
767 767
 		log.G(ctx).Info("role changed to worker, stopping manager")
768 768
 		clearData = true
... ...
@@ -770,12 +770,12 @@ func (n *Node) runManager(ctx context.Context, securityConfig *ca.SecurityConfig
770 770
 		log.G(ctx).Info("manager removed from raft cluster, stopping manager")
771 771
 		clearData = true
772 772
 	case <-ctx.Done():
773
-		return ctx.Err()
773
+		return false, ctx.Err()
774 774
 	}
775
-	return nil
775
+	return clearData, nil
776 776
 }
777 777
 
778
-func (n *Node) superviseManager(ctx context.Context, securityConfig *ca.SecurityConfig, ready chan struct{}) error {
778
+func (n *Node) superviseManager(ctx context.Context, securityConfig *ca.SecurityConfig, ready chan struct{}, forceCertRenewal chan struct{}) error {
779 779
 	for {
780 780
 		if err := n.waitRole(ctx, ca.ManagerRole); err != nil {
781 781
 			return err
... ...
@@ -789,7 +789,8 @@ func (n *Node) superviseManager(ctx context.Context, securityConfig *ca.Security
789 789
 			}
790 790
 		}()
791 791
 
792
-		if err := n.runManager(ctx, securityConfig, ready, workerRole); err != nil {
792
+		wasRemoved, err := n.runManager(ctx, securityConfig, ready, workerRole)
793
+		if err != nil {
793 794
 			waitRoleCancel()
794 795
 			return errors.Wrap(err, "manager stopped")
795 796
 		}
... ...
@@ -798,18 +799,60 @@ func (n *Node) superviseManager(ctx context.Context, securityConfig *ca.Security
798 798
 		// "manager", it's possible that the manager was demoted and
799 799
 		// the agent hasn't realized this yet. We should wait for the
800 800
 		// role to change instead of restarting the manager immediately.
801
-		timer := time.NewTimer(16 * time.Second)
802
-		select {
803
-		case <-timer.C:
804
-			log.G(ctx).Warn("failed to get worker role after manager stop, restarting manager")
805
-		case <-workerRole:
806
-		case <-ctx.Done():
807
-			timer.Stop()
808
-			waitRoleCancel()
809
-			return ctx.Err()
801
+		err = func() error {
802
+			timer := time.NewTimer(roleChangeTimeout)
803
+			defer timer.Stop()
804
+			defer waitRoleCancel()
805
+
806
+			select {
807
+			case <-timer.C:
808
+			case <-workerRole:
809
+				return nil
810
+			case <-ctx.Done():
811
+				return ctx.Err()
812
+			}
813
+
814
+			if !wasRemoved {
815
+				log.G(ctx).Warn("failed to get worker role after manager stop, restarting manager")
816
+				return nil
817
+			}
818
+			// We need to be extra careful about restarting the
819
+			// manager. It may cause the node to wrongly join under
820
+			// a new Raft ID. Since we didn't see a role change
821
+			// yet, force a certificate renewal. If the certificate
822
+			// comes back with a worker role, we know we shouldn't
823
+			// restart the manager. However, if we don't see
824
+			// workerRole get closed, it means we didn't switch to
825
+			// a worker certificate, either because we couldn't
826
+			// contact a working CA, or because we've been
827
+			// re-promoted. In this case, we must assume we were
828
+			// re-promoted, and restart the manager.
829
+			log.G(ctx).Warn("failed to get worker role after manager stop, forcing certificate renewal")
830
+			timer.Reset(roleChangeTimeout)
831
+
832
+			select {
833
+			case forceCertRenewal <- struct{}{}:
834
+			case <-timer.C:
835
+				log.G(ctx).Warn("failed to trigger certificate renewal after manager stop, restarting manager")
836
+				return nil
837
+			case <-ctx.Done():
838
+				return ctx.Err()
839
+			}
840
+
841
+			// Now that the renewal request has been sent to the
842
+			// renewal goroutine, wait for a change in role.
843
+			select {
844
+			case <-timer.C:
845
+				log.G(ctx).Warn("failed to get worker role after manager stop, restarting manager")
846
+			case <-workerRole:
847
+			case <-ctx.Done():
848
+				return ctx.Err()
849
+			}
850
+			return nil
851
+		}()
852
+		if err != nil {
853
+			return err
810 854
 		}
811
-		timer.Stop()
812
-		waitRoleCancel()
813 855
 
814 856
 		ready = nil
815 857
 	}