diff --git a/api/api.pb.txt b/api/api.pb.txt index bc756e4db9..29ae6d8583 100755 --- a/api/api.pb.txt +++ b/api/api.pb.txt @@ -7143,6 +7143,51 @@ file { json_name: "services" } } + message_type { + name: "ListServiceStatusesRequest" + field { + name: "services" + number: 1 + label: LABEL_REPEATED + type: TYPE_STRING + json_name: "services" + } + } + message_type { + name: "ListServiceStatusesResponse" + field { + name: "statuses" + number: 1 + label: LABEL_REPEATED + type: TYPE_MESSAGE + type_name: ".docker.swarmkit.v1.ListServiceStatusesResponse.ServiceStatus" + json_name: "statuses" + } + nested_type { + name: "ServiceStatus" + field { + name: "service_id" + number: 1 + label: LABEL_OPTIONAL + type: TYPE_STRING + json_name: "serviceId" + } + field { + name: "desired_tasks" + number: 2 + label: LABEL_OPTIONAL + type: TYPE_UINT64 + json_name: "desiredTasks" + } + field { + name: "running_tasks" + number: 3 + label: LABEL_OPTIONAL + type: TYPE_UINT64 + json_name: "runningTasks" + } + } + } message_type { name: "CreateNetworkRequest" field { @@ -8170,6 +8215,16 @@ file { } } } + method { + name: "ListServiceStatuses" + input_type: ".docker.swarmkit.v1.ListServiceStatusesRequest" + output_type: ".docker.swarmkit.v1.ListServiceStatusesResponse" + options { + 73626345 { + 1: "swarm-manager" + } + } + } method { name: "GetNetwork" input_type: ".docker.swarmkit.v1.GetNetworkRequest" diff --git a/api/ca.pb.go b/api/ca.pb.go index d0463aa888..6f8e35c179 100644 --- a/api/ca.pb.go +++ b/api/ca.pb.go @@ -51,6 +51,8 @@ RemoveServiceResponse ListServicesRequest ListServicesResponse + ListServiceStatusesRequest + ListServiceStatusesResponse CreateNetworkRequest CreateNetworkResponse GetNetworkRequest diff --git a/api/control.pb.go b/api/control.pb.go index f0514ace9e..64facf1927 100644 --- a/api/control.pb.go +++ b/api/control.pb.go @@ -321,13 +321,62 @@ func (m *ListServicesResponse) Reset() { *m = ListServicesRes func (*ListServicesResponse) ProtoMessage() {} func (*ListServicesResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{23} } +// ListServiceStatusesRequest is a request to get the aggregate status of a +// service by computing the number of running vs desired tasks. It includes +// only a service ID. +type ListServiceStatusesRequest struct { + // Services is a list of service IDs to get statuses for. + Services []string `protobuf:"bytes,1,rep,name=services" json:"services,omitempty"` +} + +func (m *ListServiceStatusesRequest) Reset() { *m = ListServiceStatusesRequest{} } +func (*ListServiceStatusesRequest) ProtoMessage() {} +func (*ListServiceStatusesRequest) Descriptor() ([]byte, []int) { + return fileDescriptorControl, []int{24} +} + +// ListServiceStatusesResponse is a response containing the aggregate status of +// a service, formed by computing the number of running vs desired tasks. The +// values returned are only valid for the point in time at which the request is +// made. +type ListServiceStatusesResponse struct { + Statuses []*ListServiceStatusesResponse_ServiceStatus `protobuf:"bytes,1,rep,name=statuses" json:"statuses,omitempty"` +} + +func (m *ListServiceStatusesResponse) Reset() { *m = ListServiceStatusesResponse{} } +func (*ListServiceStatusesResponse) ProtoMessage() {} +func (*ListServiceStatusesResponse) Descriptor() ([]byte, []int) { + return fileDescriptorControl, []int{25} +} + +type ListServiceStatusesResponse_ServiceStatus struct { + // ServiceID is the ID of the service this status describes + ServiceID string `protobuf:"bytes,1,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"` + // DesiredTasks is the number of tasks desired to be running according to the + // service definition at request time. It is a uint64 because that is what + // the replicas field on the service spec is + DesiredTasks uint64 `protobuf:"varint,2,opt,name=desired_tasks,json=desiredTasks,proto3" json:"desired_tasks,omitempty"` + // RunningTasks is the number of tasks currently in the Running state at + // request time. This may be larger than desired tasks if, for example, a + // service has been scaled down. + RunningTasks uint64 `protobuf:"varint,3,opt,name=running_tasks,json=runningTasks,proto3" json:"running_tasks,omitempty"` +} + +func (m *ListServiceStatusesResponse_ServiceStatus) Reset() { + *m = ListServiceStatusesResponse_ServiceStatus{} +} +func (*ListServiceStatusesResponse_ServiceStatus) ProtoMessage() {} +func (*ListServiceStatusesResponse_ServiceStatus) Descriptor() ([]byte, []int) { + return fileDescriptorControl, []int{25, 0} +} + type CreateNetworkRequest struct { Spec *NetworkSpec `protobuf:"bytes,1,opt,name=spec" json:"spec,omitempty"` } func (m *CreateNetworkRequest) Reset() { *m = CreateNetworkRequest{} } func (*CreateNetworkRequest) ProtoMessage() {} -func (*CreateNetworkRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{24} } +func (*CreateNetworkRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{26} } type CreateNetworkResponse struct { Network *Network `protobuf:"bytes,1,opt,name=network" json:"network,omitempty"` @@ -335,7 +384,7 @@ type CreateNetworkResponse struct { func (m *CreateNetworkResponse) Reset() { *m = CreateNetworkResponse{} } func (*CreateNetworkResponse) ProtoMessage() {} -func (*CreateNetworkResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{25} } +func (*CreateNetworkResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{27} } type GetNetworkRequest struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` @@ -344,7 +393,7 @@ type GetNetworkRequest struct { func (m *GetNetworkRequest) Reset() { *m = GetNetworkRequest{} } func (*GetNetworkRequest) ProtoMessage() {} -func (*GetNetworkRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{26} } +func (*GetNetworkRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{28} } type GetNetworkResponse struct { Network *Network `protobuf:"bytes,1,opt,name=network" json:"network,omitempty"` @@ -352,7 +401,7 @@ type GetNetworkResponse struct { func (m *GetNetworkResponse) Reset() { *m = GetNetworkResponse{} } func (*GetNetworkResponse) ProtoMessage() {} -func (*GetNetworkResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{27} } +func (*GetNetworkResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{29} } type RemoveNetworkRequest struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` @@ -361,14 +410,14 @@ type RemoveNetworkRequest struct { func (m *RemoveNetworkRequest) Reset() { *m = RemoveNetworkRequest{} } func (*RemoveNetworkRequest) ProtoMessage() {} -func (*RemoveNetworkRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{28} } +func (*RemoveNetworkRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{30} } type RemoveNetworkResponse struct { } func (m *RemoveNetworkResponse) Reset() { *m = RemoveNetworkResponse{} } func (*RemoveNetworkResponse) ProtoMessage() {} -func (*RemoveNetworkResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{29} } +func (*RemoveNetworkResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{31} } type ListNetworksRequest struct { Filters *ListNetworksRequest_Filters `protobuf:"bytes,1,opt,name=filters" json:"filters,omitempty"` @@ -376,7 +425,7 @@ type ListNetworksRequest struct { func (m *ListNetworksRequest) Reset() { *m = ListNetworksRequest{} } func (*ListNetworksRequest) ProtoMessage() {} -func (*ListNetworksRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{30} } +func (*ListNetworksRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{32} } type ListNetworksRequest_Filters struct { Names []string `protobuf:"bytes,1,rep,name=names" json:"names,omitempty"` @@ -389,7 +438,7 @@ type ListNetworksRequest_Filters struct { func (m *ListNetworksRequest_Filters) Reset() { *m = ListNetworksRequest_Filters{} } func (*ListNetworksRequest_Filters) ProtoMessage() {} func (*ListNetworksRequest_Filters) Descriptor() ([]byte, []int) { - return fileDescriptorControl, []int{30, 0} + return fileDescriptorControl, []int{32, 0} } type ListNetworksResponse struct { @@ -398,7 +447,7 @@ type ListNetworksResponse struct { func (m *ListNetworksResponse) Reset() { *m = ListNetworksResponse{} } func (*ListNetworksResponse) ProtoMessage() {} -func (*ListNetworksResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{31} } +func (*ListNetworksResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{33} } type GetClusterRequest struct { ClusterID string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` @@ -406,7 +455,7 @@ type GetClusterRequest struct { func (m *GetClusterRequest) Reset() { *m = GetClusterRequest{} } func (*GetClusterRequest) ProtoMessage() {} -func (*GetClusterRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{32} } +func (*GetClusterRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{34} } type GetClusterResponse struct { Cluster *Cluster `protobuf:"bytes,1,opt,name=cluster" json:"cluster,omitempty"` @@ -414,7 +463,7 @@ type GetClusterResponse struct { func (m *GetClusterResponse) Reset() { *m = GetClusterResponse{} } func (*GetClusterResponse) ProtoMessage() {} -func (*GetClusterResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{33} } +func (*GetClusterResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{35} } type ListClustersRequest struct { Filters *ListClustersRequest_Filters `protobuf:"bytes,1,opt,name=filters" json:"filters,omitempty"` @@ -422,7 +471,7 @@ type ListClustersRequest struct { func (m *ListClustersRequest) Reset() { *m = ListClustersRequest{} } func (*ListClustersRequest) ProtoMessage() {} -func (*ListClustersRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{34} } +func (*ListClustersRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{36} } type ListClustersRequest_Filters struct { Names []string `protobuf:"bytes,1,rep,name=names" json:"names,omitempty"` @@ -435,7 +484,7 @@ type ListClustersRequest_Filters struct { func (m *ListClustersRequest_Filters) Reset() { *m = ListClustersRequest_Filters{} } func (*ListClustersRequest_Filters) ProtoMessage() {} func (*ListClustersRequest_Filters) Descriptor() ([]byte, []int) { - return fileDescriptorControl, []int{34, 0} + return fileDescriptorControl, []int{36, 0} } type ListClustersResponse struct { @@ -444,7 +493,7 @@ type ListClustersResponse struct { func (m *ListClustersResponse) Reset() { *m = ListClustersResponse{} } func (*ListClustersResponse) ProtoMessage() {} -func (*ListClustersResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{35} } +func (*ListClustersResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{37} } // KeyRotation tells UpdateCluster what items to rotate type KeyRotation struct { @@ -458,7 +507,7 @@ type KeyRotation struct { func (m *KeyRotation) Reset() { *m = KeyRotation{} } func (*KeyRotation) ProtoMessage() {} -func (*KeyRotation) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{36} } +func (*KeyRotation) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{38} } type UpdateClusterRequest struct { // ClusterID is the cluster ID to update. @@ -473,7 +522,7 @@ type UpdateClusterRequest struct { func (m *UpdateClusterRequest) Reset() { *m = UpdateClusterRequest{} } func (*UpdateClusterRequest) ProtoMessage() {} -func (*UpdateClusterRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{37} } +func (*UpdateClusterRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{39} } type UpdateClusterResponse struct { Cluster *Cluster `protobuf:"bytes,1,opt,name=cluster" json:"cluster,omitempty"` @@ -481,7 +530,7 @@ type UpdateClusterResponse struct { func (m *UpdateClusterResponse) Reset() { *m = UpdateClusterResponse{} } func (*UpdateClusterResponse) ProtoMessage() {} -func (*UpdateClusterResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{38} } +func (*UpdateClusterResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{40} } // GetSecretRequest is the request to get a `Secret` object given a secret id. type GetSecretRequest struct { @@ -490,7 +539,7 @@ type GetSecretRequest struct { func (m *GetSecretRequest) Reset() { *m = GetSecretRequest{} } func (*GetSecretRequest) ProtoMessage() {} -func (*GetSecretRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{39} } +func (*GetSecretRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{41} } // GetSecretResponse contains the Secret corresponding to the id in // `GetSecretRequest`, but the `Secret.Spec.Data` field in each `Secret` @@ -501,7 +550,7 @@ type GetSecretResponse struct { func (m *GetSecretResponse) Reset() { *m = GetSecretResponse{} } func (*GetSecretResponse) ProtoMessage() {} -func (*GetSecretResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{40} } +func (*GetSecretResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{42} } type UpdateSecretRequest struct { // SecretID is the secret ID to update. @@ -515,7 +564,7 @@ type UpdateSecretRequest struct { func (m *UpdateSecretRequest) Reset() { *m = UpdateSecretRequest{} } func (*UpdateSecretRequest) ProtoMessage() {} -func (*UpdateSecretRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{41} } +func (*UpdateSecretRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{43} } type UpdateSecretResponse struct { Secret *Secret `protobuf:"bytes,1,opt,name=secret" json:"secret,omitempty"` @@ -523,7 +572,7 @@ type UpdateSecretResponse struct { func (m *UpdateSecretResponse) Reset() { *m = UpdateSecretResponse{} } func (*UpdateSecretResponse) ProtoMessage() {} -func (*UpdateSecretResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{42} } +func (*UpdateSecretResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{44} } // ListSecretRequest is the request to list all non-internal secrets in the secret store, // or all secrets filtered by (name or name prefix or id prefix) and labels. @@ -533,7 +582,7 @@ type ListSecretsRequest struct { func (m *ListSecretsRequest) Reset() { *m = ListSecretsRequest{} } func (*ListSecretsRequest) ProtoMessage() {} -func (*ListSecretsRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{43} } +func (*ListSecretsRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{45} } type ListSecretsRequest_Filters struct { Names []string `protobuf:"bytes,1,rep,name=names" json:"names,omitempty"` @@ -545,7 +594,7 @@ type ListSecretsRequest_Filters struct { func (m *ListSecretsRequest_Filters) Reset() { *m = ListSecretsRequest_Filters{} } func (*ListSecretsRequest_Filters) ProtoMessage() {} func (*ListSecretsRequest_Filters) Descriptor() ([]byte, []int) { - return fileDescriptorControl, []int{43, 0} + return fileDescriptorControl, []int{45, 0} } // ListSecretResponse contains a list of all the secrets that match the name or @@ -558,7 +607,7 @@ type ListSecretsResponse struct { func (m *ListSecretsResponse) Reset() { *m = ListSecretsResponse{} } func (*ListSecretsResponse) ProtoMessage() {} -func (*ListSecretsResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{44} } +func (*ListSecretsResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{46} } // CreateSecretRequest specifies a new secret (it will not update an existing // secret) to create. @@ -568,7 +617,7 @@ type CreateSecretRequest struct { func (m *CreateSecretRequest) Reset() { *m = CreateSecretRequest{} } func (*CreateSecretRequest) ProtoMessage() {} -func (*CreateSecretRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{45} } +func (*CreateSecretRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{47} } // CreateSecretResponse contains the newly created `Secret` corresponding to the // name in `CreateSecretRequest`. The `Secret.Spec.Data` field should be nil instead @@ -579,7 +628,7 @@ type CreateSecretResponse struct { func (m *CreateSecretResponse) Reset() { *m = CreateSecretResponse{} } func (*CreateSecretResponse) ProtoMessage() {} -func (*CreateSecretResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{46} } +func (*CreateSecretResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{48} } // RemoveSecretRequest contains the ID of the secret that should be removed. This // removes all versions of the secret. @@ -589,7 +638,7 @@ type RemoveSecretRequest struct { func (m *RemoveSecretRequest) Reset() { *m = RemoveSecretRequest{} } func (*RemoveSecretRequest) ProtoMessage() {} -func (*RemoveSecretRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{47} } +func (*RemoveSecretRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{49} } // RemoveSecretResponse is an empty object indicating the successful removal of // a secret. @@ -598,7 +647,7 @@ type RemoveSecretResponse struct { func (m *RemoveSecretResponse) Reset() { *m = RemoveSecretResponse{} } func (*RemoveSecretResponse) ProtoMessage() {} -func (*RemoveSecretResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{48} } +func (*RemoveSecretResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{50} } // GetConfigRequest is the request to get a `Config` object given a config id. type GetConfigRequest struct { @@ -607,7 +656,7 @@ type GetConfigRequest struct { func (m *GetConfigRequest) Reset() { *m = GetConfigRequest{} } func (*GetConfigRequest) ProtoMessage() {} -func (*GetConfigRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{49} } +func (*GetConfigRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{51} } // GetConfigResponse contains the Config corresponding to the id in // `GetConfigRequest`. @@ -617,7 +666,7 @@ type GetConfigResponse struct { func (m *GetConfigResponse) Reset() { *m = GetConfigResponse{} } func (*GetConfigResponse) ProtoMessage() {} -func (*GetConfigResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{50} } +func (*GetConfigResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{52} } type UpdateConfigRequest struct { // ConfigID is the config ID to update. @@ -631,7 +680,7 @@ type UpdateConfigRequest struct { func (m *UpdateConfigRequest) Reset() { *m = UpdateConfigRequest{} } func (*UpdateConfigRequest) ProtoMessage() {} -func (*UpdateConfigRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{51} } +func (*UpdateConfigRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{53} } type UpdateConfigResponse struct { Config *Config `protobuf:"bytes,1,opt,name=config" json:"config,omitempty"` @@ -639,7 +688,7 @@ type UpdateConfigResponse struct { func (m *UpdateConfigResponse) Reset() { *m = UpdateConfigResponse{} } func (*UpdateConfigResponse) ProtoMessage() {} -func (*UpdateConfigResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{52} } +func (*UpdateConfigResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{54} } // ListConfigRequest is the request to list all configs in the config store, // or all configs filtered by (name or name prefix or id prefix) and labels. @@ -649,7 +698,7 @@ type ListConfigsRequest struct { func (m *ListConfigsRequest) Reset() { *m = ListConfigsRequest{} } func (*ListConfigsRequest) ProtoMessage() {} -func (*ListConfigsRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{53} } +func (*ListConfigsRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{55} } type ListConfigsRequest_Filters struct { Names []string `protobuf:"bytes,1,rep,name=names" json:"names,omitempty"` @@ -661,7 +710,7 @@ type ListConfigsRequest_Filters struct { func (m *ListConfigsRequest_Filters) Reset() { *m = ListConfigsRequest_Filters{} } func (*ListConfigsRequest_Filters) ProtoMessage() {} func (*ListConfigsRequest_Filters) Descriptor() ([]byte, []int) { - return fileDescriptorControl, []int{53, 0} + return fileDescriptorControl, []int{55, 0} } // ListConfigResponse contains a list of all the configs that match the name or @@ -672,7 +721,7 @@ type ListConfigsResponse struct { func (m *ListConfigsResponse) Reset() { *m = ListConfigsResponse{} } func (*ListConfigsResponse) ProtoMessage() {} -func (*ListConfigsResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{54} } +func (*ListConfigsResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{56} } // CreateConfigRequest specifies a new config (it will not update an existing // config) to create. @@ -682,7 +731,7 @@ type CreateConfigRequest struct { func (m *CreateConfigRequest) Reset() { *m = CreateConfigRequest{} } func (*CreateConfigRequest) ProtoMessage() {} -func (*CreateConfigRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{55} } +func (*CreateConfigRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{57} } // CreateConfigResponse contains the newly created `Config` corresponding to the // name in `CreateConfigRequest`. @@ -692,7 +741,7 @@ type CreateConfigResponse struct { func (m *CreateConfigResponse) Reset() { *m = CreateConfigResponse{} } func (*CreateConfigResponse) ProtoMessage() {} -func (*CreateConfigResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{56} } +func (*CreateConfigResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{58} } // RemoveConfigRequest contains the ID of the config that should be removed. This // removes all versions of the config. @@ -702,7 +751,7 @@ type RemoveConfigRequest struct { func (m *RemoveConfigRequest) Reset() { *m = RemoveConfigRequest{} } func (*RemoveConfigRequest) ProtoMessage() {} -func (*RemoveConfigRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{57} } +func (*RemoveConfigRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{59} } // RemoveConfigResponse is an empty object indicating the successful removal of // a config. @@ -711,7 +760,7 @@ type RemoveConfigResponse struct { func (m *RemoveConfigResponse) Reset() { *m = RemoveConfigResponse{} } func (*RemoveConfigResponse) ProtoMessage() {} -func (*RemoveConfigResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{58} } +func (*RemoveConfigResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{60} } // CreateExtensionRequest creates a new extension as specified by the provided // parameters @@ -722,7 +771,7 @@ type CreateExtensionRequest struct { func (m *CreateExtensionRequest) Reset() { *m = CreateExtensionRequest{} } func (*CreateExtensionRequest) ProtoMessage() {} -func (*CreateExtensionRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{59} } +func (*CreateExtensionRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{61} } // CreateExtensionResponse contains the newly created `Extension` corresponding // to the parameters in the CreateExtensionRequest. @@ -732,7 +781,7 @@ type CreateExtensionResponse struct { func (m *CreateExtensionResponse) Reset() { *m = CreateExtensionResponse{} } func (*CreateExtensionResponse) ProtoMessage() {} -func (*CreateExtensionResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{60} } +func (*CreateExtensionResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{62} } // RemoveExtensionRequest contains the ID of the extension that should be removed. This // removes all versions of the extension. @@ -742,7 +791,7 @@ type RemoveExtensionRequest struct { func (m *RemoveExtensionRequest) Reset() { *m = RemoveExtensionRequest{} } func (*RemoveExtensionRequest) ProtoMessage() {} -func (*RemoveExtensionRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{61} } +func (*RemoveExtensionRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{63} } // RemoveExtensionResponse is an empty object indicating the successful removal // of an extension. @@ -751,7 +800,7 @@ type RemoveExtensionResponse struct { func (m *RemoveExtensionResponse) Reset() { *m = RemoveExtensionResponse{} } func (*RemoveExtensionResponse) ProtoMessage() {} -func (*RemoveExtensionResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{62} } +func (*RemoveExtensionResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{64} } // GetResourceRequest is the request to get a Extension object given a extension id. type GetExtensionRequest struct { @@ -760,7 +809,7 @@ type GetExtensionRequest struct { func (m *GetExtensionRequest) Reset() { *m = GetExtensionRequest{} } func (*GetExtensionRequest) ProtoMessage() {} -func (*GetExtensionRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{63} } +func (*GetExtensionRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{65} } // GetExtensionResponse contains the Extension corresponding to the id in // `GetExtensionRequest`. @@ -770,7 +819,7 @@ type GetExtensionResponse struct { func (m *GetExtensionResponse) Reset() { *m = GetExtensionResponse{} } func (*GetExtensionResponse) ProtoMessage() {} -func (*GetExtensionResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{64} } +func (*GetExtensionResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{66} } // CreateResourceRequest creates a new resource specified by the included // resource object. An existing resource will not be updated. @@ -782,7 +831,7 @@ type CreateResourceRequest struct { func (m *CreateResourceRequest) Reset() { *m = CreateResourceRequest{} } func (*CreateResourceRequest) ProtoMessage() {} -func (*CreateResourceRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{65} } +func (*CreateResourceRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{67} } // CreateResourceResponse contains the newly created `Resource` corresponding // to the resource in the CreateResourceRequest. @@ -792,7 +841,7 @@ type CreateResourceResponse struct { func (m *CreateResourceResponse) Reset() { *m = CreateResourceResponse{} } func (*CreateResourceResponse) ProtoMessage() {} -func (*CreateResourceResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{66} } +func (*CreateResourceResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{68} } // RemoveResourceRequest contains the ID of the resource that should be removed. This // removes all versions of the resource. @@ -802,7 +851,7 @@ type RemoveResourceRequest struct { func (m *RemoveResourceRequest) Reset() { *m = RemoveResourceRequest{} } func (*RemoveResourceRequest) ProtoMessage() {} -func (*RemoveResourceRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{67} } +func (*RemoveResourceRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{69} } // RemoveResourceResponse is an empty object indicating the successful removal // of a resource. @@ -811,7 +860,7 @@ type RemoveResourceResponse struct { func (m *RemoveResourceResponse) Reset() { *m = RemoveResourceResponse{} } func (*RemoveResourceResponse) ProtoMessage() {} -func (*RemoveResourceResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{68} } +func (*RemoveResourceResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{70} } // UpdateResourceRequest updates the resource specified by the given resource object. type UpdateResourceRequest struct { @@ -828,7 +877,7 @@ type UpdateResourceRequest struct { func (m *UpdateResourceRequest) Reset() { *m = UpdateResourceRequest{} } func (*UpdateResourceRequest) ProtoMessage() {} -func (*UpdateResourceRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{69} } +func (*UpdateResourceRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{71} } type UpdateResourceResponse struct { Resource *Resource `protobuf:"bytes,1,opt,name=resource" json:"resource,omitempty"` @@ -836,7 +885,7 @@ type UpdateResourceResponse struct { func (m *UpdateResourceResponse) Reset() { *m = UpdateResourceResponse{} } func (*UpdateResourceResponse) ProtoMessage() {} -func (*UpdateResourceResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{70} } +func (*UpdateResourceResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{72} } // GetResourceRequest is the request to get a Resource object given a resource id. type GetResourceRequest struct { @@ -845,7 +894,7 @@ type GetResourceRequest struct { func (m *GetResourceRequest) Reset() { *m = GetResourceRequest{} } func (*GetResourceRequest) ProtoMessage() {} -func (*GetResourceRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{71} } +func (*GetResourceRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{73} } // GetResourceResponse contains the Resource corresponding to the id in // `GetResourceRequest`. @@ -855,7 +904,7 @@ type GetResourceResponse struct { func (m *GetResourceResponse) Reset() { *m = GetResourceResponse{} } func (*GetResourceResponse) ProtoMessage() {} -func (*GetResourceResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{72} } +func (*GetResourceResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{74} } // ListResourcesRequest is the request to list all resources in the raft store, // or all resources filtered by (name or name prefix or id prefix), labels and extension. @@ -865,7 +914,7 @@ type ListResourcesRequest struct { func (m *ListResourcesRequest) Reset() { *m = ListResourcesRequest{} } func (*ListResourcesRequest) ProtoMessage() {} -func (*ListResourcesRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{73} } +func (*ListResourcesRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{75} } type ListResourcesRequest_Filters struct { Names []string `protobuf:"bytes,1,rep,name=names" json:"names,omitempty"` @@ -878,7 +927,7 @@ type ListResourcesRequest_Filters struct { func (m *ListResourcesRequest_Filters) Reset() { *m = ListResourcesRequest_Filters{} } func (*ListResourcesRequest_Filters) ProtoMessage() {} func (*ListResourcesRequest_Filters) Descriptor() ([]byte, []int) { - return fileDescriptorControl, []int{73, 0} + return fileDescriptorControl, []int{75, 0} } // ListResourcesResponse contains a list of all the resources that match the name or @@ -889,7 +938,7 @@ type ListResourcesResponse struct { func (m *ListResourcesResponse) Reset() { *m = ListResourcesResponse{} } func (*ListResourcesResponse) ProtoMessage() {} -func (*ListResourcesResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{74} } +func (*ListResourcesResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{76} } func init() { proto.RegisterType((*GetNodeRequest)(nil), "docker.swarmkit.v1.GetNodeRequest") @@ -919,6 +968,9 @@ func init() { proto.RegisterType((*ListServicesRequest)(nil), "docker.swarmkit.v1.ListServicesRequest") proto.RegisterType((*ListServicesRequest_Filters)(nil), "docker.swarmkit.v1.ListServicesRequest.Filters") proto.RegisterType((*ListServicesResponse)(nil), "docker.swarmkit.v1.ListServicesResponse") + proto.RegisterType((*ListServiceStatusesRequest)(nil), "docker.swarmkit.v1.ListServiceStatusesRequest") + proto.RegisterType((*ListServiceStatusesResponse)(nil), "docker.swarmkit.v1.ListServiceStatusesResponse") + proto.RegisterType((*ListServiceStatusesResponse_ServiceStatus)(nil), "docker.swarmkit.v1.ListServiceStatusesResponse.ServiceStatus") proto.RegisterType((*CreateNetworkRequest)(nil), "docker.swarmkit.v1.CreateNetworkRequest") proto.RegisterType((*CreateNetworkResponse)(nil), "docker.swarmkit.v1.CreateNetworkResponse") proto.RegisterType((*GetNetworkRequest)(nil), "docker.swarmkit.v1.GetNetworkRequest") @@ -1086,6 +1138,14 @@ func (p *authenticatedWrapperControlServer) RemoveService(ctx context.Context, r return p.local.RemoveService(ctx, r) } +func (p *authenticatedWrapperControlServer) ListServiceStatuses(ctx context.Context, r *ListServiceStatusesRequest) (*ListServiceStatusesResponse, error) { + + if err := p.authorize(ctx, []string{"swarm-manager"}); err != nil { + return nil, err + } + return p.local.ListServiceStatuses(ctx, r) +} + func (p *authenticatedWrapperControlServer) GetNetwork(ctx context.Context, r *GetNetworkRequest) (*GetNetworkResponse, error) { if err := p.authorize(ctx, []string{"swarm-manager"}); err != nil { @@ -1864,6 +1924,64 @@ func (m *ListServicesResponse) CopyFrom(src interface{}) { } +func (m *ListServiceStatusesRequest) Copy() *ListServiceStatusesRequest { + if m == nil { + return nil + } + o := &ListServiceStatusesRequest{} + o.CopyFrom(m) + return o +} + +func (m *ListServiceStatusesRequest) CopyFrom(src interface{}) { + + o := src.(*ListServiceStatusesRequest) + *m = *o + if o.Services != nil { + m.Services = make([]string, len(o.Services)) + copy(m.Services, o.Services) + } + +} + +func (m *ListServiceStatusesResponse) Copy() *ListServiceStatusesResponse { + if m == nil { + return nil + } + o := &ListServiceStatusesResponse{} + o.CopyFrom(m) + return o +} + +func (m *ListServiceStatusesResponse) CopyFrom(src interface{}) { + + o := src.(*ListServiceStatusesResponse) + *m = *o + if o.Statuses != nil { + m.Statuses = make([]*ListServiceStatusesResponse_ServiceStatus, len(o.Statuses)) + for i := range m.Statuses { + m.Statuses[i] = &ListServiceStatusesResponse_ServiceStatus{} + deepcopy.Copy(m.Statuses[i], o.Statuses[i]) + } + } + +} + +func (m *ListServiceStatusesResponse_ServiceStatus) Copy() *ListServiceStatusesResponse_ServiceStatus { + if m == nil { + return nil + } + o := &ListServiceStatusesResponse_ServiceStatus{} + o.CopyFrom(m) + return o +} + +func (m *ListServiceStatusesResponse_ServiceStatus) CopyFrom(src interface{}) { + + o := src.(*ListServiceStatusesResponse_ServiceStatus) + *m = *o +} + func (m *CreateNetworkRequest) Copy() *CreateNetworkRequest { if m == nil { return nil @@ -2993,6 +3111,13 @@ type ControlClient interface { CreateService(ctx context.Context, in *CreateServiceRequest, opts ...grpc.CallOption) (*CreateServiceResponse, error) UpdateService(ctx context.Context, in *UpdateServiceRequest, opts ...grpc.CallOption) (*UpdateServiceResponse, error) RemoveService(ctx context.Context, in *RemoveServiceRequest, opts ...grpc.CallOption) (*RemoveServiceResponse, error) + // ListServiceStatuses returns a `ListServiceStatusesResponse` with the + // status of the requested services, formed by computing the number of + // running vs desired tasks. It is provided as a shortcut or helper method, + // which allows a client to avoid having to calculate this value by listing + // all Tasks. If any service requested does not exist, it will be returned + // but with empty status values. + ListServiceStatuses(ctx context.Context, in *ListServiceStatusesRequest, opts ...grpc.CallOption) (*ListServiceStatusesResponse, error) GetNetwork(ctx context.Context, in *GetNetworkRequest, opts ...grpc.CallOption) (*GetNetworkResponse, error) ListNetworks(ctx context.Context, in *ListNetworksRequest, opts ...grpc.CallOption) (*ListNetworksResponse, error) CreateNetwork(ctx context.Context, in *CreateNetworkRequest, opts ...grpc.CallOption) (*CreateNetworkResponse, error) @@ -3222,6 +3347,15 @@ func (c *controlClient) RemoveService(ctx context.Context, in *RemoveServiceRequ return out, nil } +func (c *controlClient) ListServiceStatuses(ctx context.Context, in *ListServiceStatusesRequest, opts ...grpc.CallOption) (*ListServiceStatusesResponse, error) { + out := new(ListServiceStatusesResponse) + err := grpc.Invoke(ctx, "/docker.swarmkit.v1.Control/ListServiceStatuses", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *controlClient) GetNetwork(ctx context.Context, in *GetNetworkRequest, opts ...grpc.CallOption) (*GetNetworkResponse, error) { out := new(GetNetworkResponse) err := grpc.Invoke(ctx, "/docker.swarmkit.v1.Control/GetNetwork", in, out, c.cc, opts...) @@ -3462,6 +3596,13 @@ type ControlServer interface { CreateService(context.Context, *CreateServiceRequest) (*CreateServiceResponse, error) UpdateService(context.Context, *UpdateServiceRequest) (*UpdateServiceResponse, error) RemoveService(context.Context, *RemoveServiceRequest) (*RemoveServiceResponse, error) + // ListServiceStatuses returns a `ListServiceStatusesResponse` with the + // status of the requested services, formed by computing the number of + // running vs desired tasks. It is provided as a shortcut or helper method, + // which allows a client to avoid having to calculate this value by listing + // all Tasks. If any service requested does not exist, it will be returned + // but with empty status values. + ListServiceStatuses(context.Context, *ListServiceStatusesRequest) (*ListServiceStatusesResponse, error) GetNetwork(context.Context, *GetNetworkRequest) (*GetNetworkResponse, error) ListNetworks(context.Context, *ListNetworksRequest) (*ListNetworksResponse, error) CreateNetwork(context.Context, *CreateNetworkRequest) (*CreateNetworkResponse, error) @@ -3795,6 +3936,24 @@ func _Control_RemoveService_Handler(srv interface{}, ctx context.Context, dec fu return interceptor(ctx, in, info, handler) } +func _Control_ListServiceStatuses_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListServiceStatusesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).ListServiceStatuses(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/docker.swarmkit.v1.Control/ListServiceStatuses", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).ListServiceStatuses(ctx, req.(*ListServiceStatusesRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Control_GetNetwork_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetNetworkRequest) if err := dec(in); err != nil { @@ -4297,6 +4456,10 @@ var _Control_serviceDesc = grpc.ServiceDesc{ MethodName: "RemoveService", Handler: _Control_RemoveService_Handler, }, + { + MethodName: "ListServiceStatuses", + Handler: _Control_ListServiceStatuses_Handler, + }, { MethodName: "GetNetwork", Handler: _Control_GetNetwork_Handler, @@ -5431,6 +5594,103 @@ func (m *ListServicesResponse) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *ListServiceStatusesRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ListServiceStatusesRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Services) > 0 { + for _, s := range m.Services { + dAtA[i] = 0xa + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + return i, nil +} + +func (m *ListServiceStatusesResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ListServiceStatusesResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Statuses) > 0 { + for _, msg := range m.Statuses { + dAtA[i] = 0xa + i++ + i = encodeVarintControl(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *ListServiceStatusesResponse_ServiceStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ListServiceStatusesResponse_ServiceStatus) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.ServiceID) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintControl(dAtA, i, uint64(len(m.ServiceID))) + i += copy(dAtA[i:], m.ServiceID) + } + if m.DesiredTasks != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintControl(dAtA, i, uint64(m.DesiredTasks)) + } + if m.RunningTasks != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintControl(dAtA, i, uint64(m.RunningTasks)) + } + return i, nil +} + func (m *CreateNetworkRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -7819,6 +8079,41 @@ func (p *raftProxyControlServer) RemoveService(ctx context.Context, r *RemoveSer return resp, err } +func (p *raftProxyControlServer) ListServiceStatuses(ctx context.Context, r *ListServiceStatusesRequest) (*ListServiceStatusesResponse, error) { + + conn, err := p.connSelector.LeaderConn(ctx) + if err != nil { + if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } + return p.local.ListServiceStatuses(ctx, r) + } + return nil, err + } + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) + if err != nil { + return nil, err + } + + resp, err := NewControlClient(conn).ListServiceStatuses(modCtx, r) + if err != nil { + if !strings.Contains(err.Error(), "is closing") && !strings.Contains(err.Error(), "the connection is unavailable") && !strings.Contains(err.Error(), "connection error") { + return resp, err + } + conn, err := p.pollNewLeaderConn(ctx) + if err != nil { + if err == raftselector.ErrIsLeader { + return p.local.ListServiceStatuses(ctx, r) + } + return nil, err + } + return NewControlClient(conn).ListServiceStatuses(modCtx, r) + } + return resp, err +} + func (p *raftProxyControlServer) GetNetwork(ctx context.Context, r *GetNetworkRequest) (*GetNetworkResponse, error) { conn, err := p.connSelector.LeaderConn(ctx) @@ -9099,6 +9394,46 @@ func (m *ListServicesResponse) Size() (n int) { return n } +func (m *ListServiceStatusesRequest) Size() (n int) { + var l int + _ = l + if len(m.Services) > 0 { + for _, s := range m.Services { + l = len(s) + n += 1 + l + sovControl(uint64(l)) + } + } + return n +} + +func (m *ListServiceStatusesResponse) Size() (n int) { + var l int + _ = l + if len(m.Statuses) > 0 { + for _, e := range m.Statuses { + l = e.Size() + n += 1 + l + sovControl(uint64(l)) + } + } + return n +} + +func (m *ListServiceStatusesResponse_ServiceStatus) Size() (n int) { + var l int + _ = l + l = len(m.ServiceID) + if l > 0 { + n += 1 + l + sovControl(uint64(l)) + } + if m.DesiredTasks != 0 { + n += 1 + sovControl(uint64(m.DesiredTasks)) + } + if m.RunningTasks != 0 { + n += 1 + sovControl(uint64(m.RunningTasks)) + } + return n +} + func (m *CreateNetworkRequest) Size() (n int) { var l int _ = l @@ -10171,6 +10506,38 @@ func (this *ListServicesResponse) String() string { }, "") return s } +func (this *ListServiceStatusesRequest) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ListServiceStatusesRequest{`, + `Services:` + fmt.Sprintf("%v", this.Services) + `,`, + `}`, + }, "") + return s +} +func (this *ListServiceStatusesResponse) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ListServiceStatusesResponse{`, + `Statuses:` + strings.Replace(fmt.Sprintf("%v", this.Statuses), "ListServiceStatusesResponse_ServiceStatus", "ListServiceStatusesResponse_ServiceStatus", 1) + `,`, + `}`, + }, "") + return s +} +func (this *ListServiceStatusesResponse_ServiceStatus) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ListServiceStatusesResponse_ServiceStatus{`, + `ServiceID:` + fmt.Sprintf("%v", this.ServiceID) + `,`, + `DesiredTasks:` + fmt.Sprintf("%v", this.DesiredTasks) + `,`, + `RunningTasks:` + fmt.Sprintf("%v", this.RunningTasks) + `,`, + `}`, + }, "") + return s +} func (this *CreateNetworkRequest) String() string { if this == nil { return "nil" @@ -14068,6 +14435,283 @@ func (m *ListServicesResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *ListServiceStatusesRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowControl + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ListServiceStatusesRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ListServiceStatusesRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Services", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowControl + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthControl + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Services = append(m.Services, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipControl(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthControl + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ListServiceStatusesResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowControl + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ListServiceStatusesResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ListServiceStatusesResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Statuses", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowControl + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthControl + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Statuses = append(m.Statuses, &ListServiceStatusesResponse_ServiceStatus{}) + if err := m.Statuses[len(m.Statuses)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipControl(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthControl + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ListServiceStatusesResponse_ServiceStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowControl + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ServiceStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ServiceStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ServiceID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowControl + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthControl + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ServiceID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DesiredTasks", wireType) + } + m.DesiredTasks = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowControl + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.DesiredTasks |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RunningTasks", wireType) + } + m.RunningTasks = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowControl + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.RunningTasks |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipControl(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthControl + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *CreateNetworkRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -19981,171 +20625,177 @@ var ( func init() { proto.RegisterFile("github.com/docker/swarmkit/api/control.proto", fileDescriptorControl) } var fileDescriptorControl = []byte{ - // 2641 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5a, 0xc9, 0x6f, 0x1b, 0xc9, - 0xf5, 0x36, 0x29, 0x4a, 0x22, 0x1f, 0xb5, 0xb9, 0x2c, 0xdb, 0x1c, 0x8e, 0x7f, 0x92, 0xd1, 0xfe, - 0xd9, 0xa6, 0x1d, 0x87, 0x9c, 0xa1, 0x33, 0x19, 0xc7, 0x33, 0x93, 0xc4, 0xb2, 0xbc, 0xd0, 0x8b, - 0x6c, 0xb4, 0x6c, 0x23, 0x97, 0x40, 0x68, 0x91, 0x25, 0x4d, 0x9b, 0x54, 0x37, 0xd3, 0xdd, 0xf4, - 0x58, 0x08, 0x12, 0x64, 0x71, 0xfe, 0x84, 0x00, 0x41, 0x0e, 0x01, 0x72, 0x0a, 0x90, 0x43, 0x0e, - 0x39, 0xe5, 0x90, 0x3f, 0xc0, 0xc8, 0x29, 0xc7, 0x9c, 0x94, 0x8c, 0x80, 0x00, 0x39, 0xe5, 0x9a, - 0x63, 0x82, 0xda, 0x7a, 0x29, 0x56, 0x2f, 0x5c, 0x00, 0xcf, 0x49, 0x62, 0xf5, 0xf7, 0xea, 0xbd, - 0xaa, 0xf7, 0xd5, 0x57, 0xd5, 0xaf, 0x1a, 0xae, 0xed, 0x9b, 0xde, 0xe7, 0x83, 0xdd, 0x7a, 0xdb, - 0x3e, 0x68, 0x74, 0xec, 0x76, 0x17, 0x3b, 0x0d, 0xf7, 0x0b, 0xc3, 0x39, 0xe8, 0x9a, 0x5e, 0xc3, - 0xe8, 0x9b, 0x8d, 0xb6, 0x6d, 0x79, 0x8e, 0xdd, 0xab, 0xf7, 0x1d, 0xdb, 0xb3, 0x11, 0x62, 0x90, - 0xba, 0x80, 0xd4, 0x5f, 0x7d, 0x58, 0xbd, 0x9a, 0xd2, 0x83, 0xdb, 0xc7, 0x6d, 0x97, 0xd9, 0x57, - 0xd3, 0xbc, 0xd9, 0xbb, 0x2f, 0x71, 0xdb, 0x13, 0xe8, 0xb4, 0x9e, 0xbd, 0xc3, 0x3e, 0x16, 0xd8, - 0xd5, 0x7d, 0x7b, 0xdf, 0xa6, 0xff, 0x36, 0xc8, 0x7f, 0xbc, 0xf5, 0xbd, 0x7d, 0xdb, 0xde, 0xef, - 0xe1, 0x06, 0xfd, 0xb5, 0x3b, 0xd8, 0x6b, 0x18, 0xd6, 0x21, 0x7f, 0xf4, 0x71, 0x42, 0xe7, 0x3e, - 0xbc, 0xdf, 0x1b, 0xec, 0x9b, 0x16, 0xff, 0xc3, 0x0c, 0xb5, 0x8f, 0x60, 0xe9, 0x1e, 0xf6, 0xb6, - 0xec, 0x0e, 0xd6, 0xf1, 0x0f, 0x06, 0xd8, 0xf5, 0xd0, 0x05, 0x98, 0xb7, 0xec, 0x0e, 0xde, 0x31, - 0x3b, 0x95, 0xdc, 0xf9, 0x5c, 0xad, 0xb4, 0x01, 0xc7, 0x47, 0xeb, 0x73, 0x04, 0xd1, 0xda, 0xd4, - 0xe7, 0xc8, 0xa3, 0x56, 0x47, 0xfb, 0x0e, 0x2c, 0xfb, 0x66, 0x6e, 0xdf, 0xb6, 0x5c, 0x8c, 0xae, - 0x41, 0x81, 0x3c, 0xa4, 0x46, 0xe5, 0x66, 0xa5, 0x3e, 0x3c, 0xb9, 0x75, 0x8a, 0xa7, 0x28, 0xed, - 0xcd, 0x2c, 0xac, 0x3c, 0x32, 0x5d, 0xda, 0x85, 0x2b, 0x5c, 0xdf, 0x85, 0xf9, 0x3d, 0xb3, 0xe7, - 0x61, 0xc7, 0xe5, 0xbd, 0x5c, 0x53, 0xf5, 0x22, 0x9b, 0xd5, 0xef, 0x32, 0x1b, 0x5d, 0x18, 0x57, - 0x7f, 0x57, 0x80, 0x79, 0xde, 0x88, 0x56, 0x61, 0xd6, 0x32, 0x0e, 0x30, 0xe9, 0x71, 0xa6, 0x56, - 0xd2, 0xd9, 0x0f, 0xd4, 0x80, 0xb2, 0xd9, 0xd9, 0xe9, 0x3b, 0x78, 0xcf, 0x7c, 0x8d, 0xdd, 0x4a, - 0x9e, 0x3c, 0xdb, 0x58, 0x3a, 0x3e, 0x5a, 0x87, 0xd6, 0xe6, 0x53, 0xde, 0xaa, 0x83, 0xd9, 0x11, - 0xff, 0xa3, 0xa7, 0x30, 0xd7, 0x33, 0x76, 0x71, 0xcf, 0xad, 0xcc, 0x9c, 0x9f, 0xa9, 0x95, 0x9b, - 0x37, 0x46, 0x89, 0xac, 0xfe, 0x88, 0x9a, 0xde, 0xb1, 0x3c, 0xe7, 0x50, 0xe7, 0xfd, 0xa0, 0xc7, - 0x50, 0x3e, 0xc0, 0x07, 0xbb, 0xd8, 0x71, 0x3f, 0x37, 0xfb, 0x6e, 0xa5, 0x70, 0x7e, 0xa6, 0xb6, - 0xd4, 0xbc, 0x1c, 0x37, 0x6d, 0xdb, 0x7d, 0xdc, 0xae, 0x3f, 0xf6, 0xf1, 0x1b, 0xf9, 0x95, 0x13, - 0x7a, 0xd8, 0x1e, 0x7d, 0x13, 0x66, 0x1d, 0xbb, 0x87, 0xdd, 0xca, 0x2c, 0xed, 0xe8, 0x5c, 0xec, - 0xfc, 0xdb, 0x3d, 0x4c, 0xad, 0x19, 0x1c, 0x5d, 0x80, 0x45, 0x32, 0x25, 0xc1, 0x5c, 0xcc, 0xd1, - 0x79, 0x5a, 0x20, 0x8d, 0xfe, 0xe8, 0xbf, 0x0f, 0x65, 0xca, 0x09, 0x3e, 0x05, 0xf3, 0x74, 0x0a, - 0x3e, 0x1d, 0x69, 0x0a, 0x48, 0x63, 0x78, 0x1a, 0xc0, 0xf2, 0x1b, 0xaa, 0xdf, 0x82, 0x72, 0xe8, - 0x11, 0x5a, 0x81, 0x99, 0x2e, 0x3e, 0x64, 0xec, 0xd3, 0xc9, 0xbf, 0x24, 0x89, 0xaf, 0x8c, 0xde, - 0x00, 0x57, 0xf2, 0xb4, 0x8d, 0xfd, 0xb8, 0x99, 0xbf, 0x91, 0xab, 0x7e, 0x06, 0xcb, 0x52, 0xcf, - 0xa3, 0x98, 0x6b, 0xb7, 0xe1, 0x64, 0x28, 0x62, 0xce, 0xe4, 0x3a, 0xcc, 0x92, 0xe0, 0x18, 0x65, - 0x92, 0xa8, 0xcc, 0x60, 0xda, 0xef, 0x73, 0x70, 0xf2, 0x79, 0xbf, 0x63, 0x78, 0x78, 0xd4, 0x75, - 0x84, 0xbe, 0x0d, 0x0b, 0x14, 0xf4, 0x0a, 0x3b, 0xae, 0x69, 0x5b, 0x34, 0xc0, 0x72, 0xf3, 0x7d, - 0x95, 0xc7, 0x17, 0x0c, 0xa2, 0xd3, 0x4c, 0xf0, 0x1f, 0xe8, 0x03, 0x28, 0x10, 0x45, 0xaa, 0xcc, - 0x50, 0xbb, 0x73, 0x49, 0xec, 0xd1, 0x29, 0x52, 0xdb, 0x00, 0x14, 0x8e, 0x75, 0xac, 0xc5, 0xbb, - 0x05, 0x27, 0x75, 0x7c, 0x60, 0xbf, 0x1a, 0x7d, 0xbc, 0xab, 0x30, 0xbb, 0x67, 0x3b, 0x6d, 0x96, - 0x89, 0xa2, 0xce, 0x7e, 0x68, 0xab, 0x80, 0xc2, 0xfd, 0xb1, 0x98, 0xb8, 0x34, 0x3d, 0x33, 0xdc, - 0x6e, 0xc8, 0x85, 0x67, 0xb8, 0x5d, 0xc9, 0x05, 0x41, 0x10, 0x17, 0xe4, 0x91, 0x2f, 0x4d, 0xcc, - 0x2c, 0x18, 0x1d, 0x79, 0x98, 0x34, 0x3a, 0x8a, 0xa7, 0x28, 0xed, 0x86, 0x18, 0xdd, 0xc8, 0xae, - 0xfd, 0x71, 0x84, 0xbd, 0x6b, 0x7f, 0x2e, 0x30, 0xa9, 0x23, 0x8d, 0x63, 0x48, 0x5d, 0xd8, 0x6c, - 0x58, 0xea, 0xfe, 0x3e, 0xf3, 0xee, 0xa4, 0x4e, 0x15, 0x99, 0x52, 0xea, 0x1a, 0x50, 0x76, 0xb1, - 0xf3, 0xca, 0x6c, 0x13, 0x76, 0x30, 0xa9, 0xe3, 0x21, 0x6c, 0xb3, 0xe6, 0xd6, 0xa6, 0xab, 0x03, - 0x87, 0xb4, 0x3a, 0x2e, 0xba, 0x04, 0x45, 0xce, 0x25, 0xa6, 0x67, 0xa5, 0x8d, 0xf2, 0xf1, 0xd1, - 0xfa, 0x3c, 0x23, 0x93, 0xab, 0xcf, 0x33, 0x36, 0xb9, 0xe8, 0x3e, 0x2c, 0x75, 0xb0, 0x6b, 0x3a, - 0xb8, 0xb3, 0xe3, 0x7a, 0x86, 0xc7, 0xd5, 0x6b, 0xa9, 0xf9, 0x7f, 0x71, 0x29, 0xde, 0x26, 0x28, - 0x2a, 0x7f, 0x8b, 0xdc, 0x90, 0xb6, 0x28, 0x64, 0x70, 0x5e, 0x21, 0x83, 0xe7, 0x00, 0x06, 0xfd, - 0x1d, 0xcf, 0xde, 0x21, 0xeb, 0xa7, 0x52, 0xa4, 0x14, 0x2e, 0x0e, 0xfa, 0xcf, 0xec, 0x4d, 0xc3, - 0xc3, 0xa8, 0x0a, 0x45, 0x67, 0x60, 0x79, 0x26, 0xc9, 0x40, 0x89, 0x5a, 0xfb, 0xbf, 0x27, 0x50, - 0x38, 0x21, 0x51, 0x7c, 0xb2, 0x03, 0x89, 0x22, 0x9c, 0x4b, 0x94, 0x28, 0x4a, 0x42, 0x06, 0xd3, - 0x1e, 0xc2, 0xea, 0x6d, 0x07, 0x1b, 0x1e, 0xe6, 0x13, 0x2e, 0x68, 0x78, 0x9d, 0xeb, 0x07, 0xe3, - 0xe0, 0xba, 0xaa, 0x1b, 0x6e, 0x11, 0x92, 0x90, 0x2d, 0x38, 0x2d, 0x75, 0xc6, 0xa3, 0xfa, 0x08, - 0xe6, 0x79, 0x12, 0x79, 0x87, 0xef, 0x27, 0x74, 0xa8, 0x0b, 0xac, 0xf6, 0x12, 0x4e, 0xde, 0xc3, - 0x9e, 0x14, 0xd9, 0x35, 0x80, 0x80, 0x33, 0x7c, 0xcd, 0x2d, 0x1e, 0x1f, 0xad, 0x97, 0x7c, 0xca, - 0xe8, 0x25, 0x9f, 0x31, 0xe8, 0x32, 0x2c, 0x9b, 0x96, 0x8b, 0x1d, 0x6f, 0xa7, 0x83, 0xf7, 0x8c, - 0x41, 0xcf, 0x73, 0xb9, 0xc2, 0x2c, 0xb1, 0xe6, 0x4d, 0xde, 0xaa, 0x3d, 0x04, 0x14, 0xf6, 0x35, - 0x59, 0xe0, 0x7f, 0xcc, 0xc3, 0x2a, 0x13, 0xd3, 0x89, 0x82, 0xdf, 0x84, 0x65, 0x81, 0x1e, 0x61, - 0x1f, 0x58, 0xe2, 0x36, 0x62, 0x2b, 0xb8, 0x1e, 0xd9, 0x0a, 0xb2, 0xa5, 0x12, 0x3d, 0x86, 0xa2, - 0x63, 0xf7, 0x7a, 0xbb, 0x46, 0xbb, 0x5b, 0x29, 0x9c, 0xcf, 0xd5, 0x96, 0x9a, 0x1f, 0xaa, 0x0c, - 0x55, 0x83, 0xac, 0xeb, 0xdc, 0x50, 0xf7, 0xbb, 0xd0, 0x34, 0x28, 0x8a, 0x56, 0x54, 0x84, 0xc2, - 0xd6, 0x93, 0xad, 0x3b, 0x2b, 0x27, 0xd0, 0x02, 0x14, 0x9f, 0xea, 0x77, 0x5e, 0xb4, 0x9e, 0x3c, - 0xdf, 0x5e, 0xc9, 0x11, 0xf6, 0x48, 0xdd, 0x4d, 0x96, 0x84, 0x4d, 0x58, 0x65, 0xa2, 0x3b, 0x49, - 0x0e, 0xb4, 0xb3, 0x70, 0x5a, 0xea, 0x85, 0xab, 0xf7, 0x9b, 0x19, 0x38, 0x45, 0xd6, 0x1f, 0x6f, - 0xf7, 0x05, 0xbc, 0x25, 0x0b, 0x78, 0x23, 0x4e, 0x26, 0x25, 0xcb, 0x61, 0x0d, 0xff, 0x6d, 0x7e, - 0xea, 0x1a, 0xbe, 0x2d, 0x69, 0xf8, 0x27, 0x23, 0x06, 0xa7, 0x94, 0xf1, 0x21, 0x8d, 0x2c, 0x28, - 0x34, 0x32, 0xac, 0x82, 0xb3, 0xd3, 0x53, 0xc1, 0x27, 0xb0, 0x1a, 0x0d, 0x97, 0x93, 0xe6, 0x63, - 0x28, 0xf2, 0x24, 0x0a, 0x2d, 0x4c, 0x64, 0x8d, 0x0f, 0x0e, 0x14, 0x71, 0x0b, 0x7b, 0x5f, 0xd8, - 0x4e, 0x77, 0x04, 0x45, 0xe4, 0x16, 0x2a, 0x45, 0xf4, 0x3b, 0x0b, 0x38, 0x6d, 0xb1, 0xa6, 0x24, - 0x4e, 0x0b, 0x2b, 0x81, 0xd5, 0x9e, 0x53, 0x45, 0x94, 0x22, 0x43, 0x50, 0x20, 0x33, 0xcd, 0xe7, - 0x8b, 0xfe, 0x4f, 0x48, 0xce, 0x6d, 0x08, 0xc9, 0xf3, 0x01, 0xc9, 0xb9, 0x2d, 0x21, 0x39, 0x07, - 0xb4, 0x3a, 0x5c, 0xfc, 0xa6, 0x14, 0xe3, 0xf7, 0xc4, 0xba, 0x9b, 0x7a, 0x98, 0xfe, 0x5a, 0x94, - 0x22, 0xd5, 0xfe, 0x95, 0x67, 0x6b, 0x91, 0xb7, 0x8f, 0xb1, 0x16, 0x25, 0xcb, 0xe1, 0xb5, 0xf8, - 0x8b, 0x77, 0xb8, 0x16, 0x63, 0x82, 0x1b, 0x7b, 0x2d, 0x4e, 0x61, 0xbd, 0x05, 0x21, 0x05, 0xeb, - 0x8d, 0x27, 0x2a, 0x71, 0xbd, 0x89, 0xcc, 0xf9, 0x60, 0xed, 0x16, 0xa5, 0xf4, 0xed, 0xde, 0xc0, - 0xf5, 0xb0, 0x13, 0xd2, 0xe8, 0x36, 0x6b, 0x91, 0x34, 0x9a, 0xe3, 0x08, 0x2f, 0x38, 0xc0, 0xa7, - 0xaf, 0xdf, 0x45, 0x40, 0x5f, 0x0e, 0x49, 0xa2, 0xaf, 0xb0, 0x12, 0x58, 0x9f, 0x4b, 0xfc, 0xc1, - 0x18, 0x5c, 0x92, 0x2c, 0xbf, 0x5a, 0x5c, 0x8a, 0x09, 0xee, 0x5d, 0x72, 0x29, 0x08, 0x29, 0xe0, - 0x12, 0xcf, 0x46, 0x22, 0x97, 0x44, 0xea, 0x7c, 0xb0, 0xf6, 0xcb, 0x1c, 0x94, 0x1f, 0xe2, 0x43, - 0xdd, 0xf6, 0x0c, 0x8f, 0x1c, 0x7d, 0xae, 0xc2, 0x49, 0x42, 0x32, 0xec, 0xec, 0xbc, 0xb4, 0x4d, - 0x6b, 0xc7, 0xb3, 0xbb, 0xd8, 0xa2, 0xa1, 0x15, 0xf5, 0x65, 0xf6, 0xe0, 0x81, 0x6d, 0x5a, 0xcf, - 0x48, 0x33, 0xba, 0x06, 0xe8, 0xc0, 0xb0, 0x8c, 0xfd, 0x28, 0x98, 0x1d, 0x16, 0x57, 0xf8, 0x13, - 0x25, 0x7a, 0x60, 0xf5, 0xec, 0x76, 0x77, 0x87, 0x8c, 0x7a, 0x26, 0x82, 0x7e, 0x4e, 0x1f, 0x3c, - 0xc4, 0x87, 0xda, 0xcf, 0xfc, 0xf3, 0xe0, 0x24, 0x3c, 0x27, 0xe7, 0x41, 0x81, 0x1e, 0xe5, 0x3c, - 0xc8, 0x6d, 0x46, 0x38, 0x0f, 0x72, 0xef, 0xa1, 0xf3, 0xe0, 0x2d, 0x72, 0x1e, 0x64, 0xb3, 0x4a, - 0xcf, 0x83, 0x31, 0x86, 0xa1, 0xc9, 0xdf, 0x28, 0xbc, 0x3d, 0x5a, 0x3f, 0xa1, 0xfb, 0x66, 0xc1, - 0xf9, 0x6e, 0x4a, 0x0b, 0xf5, 0x33, 0x58, 0xa1, 0x27, 0xf6, 0xb6, 0x83, 0x3d, 0x31, 0x9f, 0x57, - 0xa0, 0xe4, 0xd2, 0x86, 0x60, 0x3a, 0x17, 0x8e, 0x8f, 0xd6, 0x8b, 0x0c, 0xd5, 0xda, 0x24, 0xfb, - 0x3c, 0xfd, 0xaf, 0xa3, 0xdd, 0xe3, 0x2f, 0x17, 0xcc, 0x9c, 0x87, 0xd2, 0x84, 0x39, 0x06, 0xe0, - 0x91, 0x54, 0xd5, 0x67, 0x06, 0x6a, 0xc3, 0x91, 0xda, 0x9f, 0x72, 0x70, 0x4a, 0x1c, 0x5c, 0xc7, - 0x8b, 0x05, 0x6d, 0xc0, 0x12, 0x87, 0x8e, 0x90, 0xd7, 0x45, 0x66, 0x22, 0xd2, 0xda, 0x8c, 0xa4, - 0x75, 0x2d, 0x3e, 0xf0, 0xd0, 0xf1, 0xe4, 0x41, 0xf0, 0x9a, 0x32, 0xf1, 0x34, 0xfc, 0x33, 0x0f, - 0x88, 0x9d, 0xc4, 0xc8, 0x4f, 0x5f, 0x36, 0xef, 0xcb, 0xb2, 0x59, 0x8f, 0x3f, 0x71, 0x86, 0x0d, - 0x87, 0x55, 0xf3, 0xcd, 0xf4, 0x55, 0x53, 0x97, 0x54, 0xf3, 0xe6, 0x68, 0xb1, 0xbd, 0x13, 0xd1, - 0x7c, 0x28, 0x5e, 0x3b, 0x78, 0x44, 0x3c, 0x65, 0xdf, 0x20, 0x2f, 0x49, 0xb4, 0x89, 0x4b, 0x66, - 0x52, 0xce, 0x04, 0x54, 0x6b, 0xc1, 0x29, 0xf1, 0xc6, 0x1e, 0xa6, 0x6e, 0x33, 0x72, 0xd6, 0xcd, - 0xcc, 0xa5, 0x68, 0x57, 0x13, 0x70, 0xe9, 0xbb, 0x70, 0x4a, 0xbc, 0x74, 0x8d, 0xb9, 0xba, 0xcf, - 0x04, 0x2f, 0x7f, 0xe1, 0x68, 0xb8, 0x68, 0xdc, 0xb6, 0xad, 0x3d, 0x73, 0x3f, 0xd4, 0x6d, 0x9b, - 0x36, 0x48, 0xdd, 0x32, 0x14, 0xe9, 0x96, 0x3d, 0xf6, 0x45, 0x43, 0x98, 0x07, 0x23, 0x64, 0x80, - 0xa4, 0x11, 0x72, 0x1b, 0x8e, 0x0c, 0x89, 0xc6, 0xb8, 0xb1, 0x10, 0xd1, 0xe0, 0xd0, 0x51, 0x44, - 0x83, 0x99, 0x8c, 0x20, 0x1a, 0xcc, 0xb3, 0x4a, 0x34, 0xa6, 0x30, 0x0d, 0x42, 0x34, 0x58, 0xf3, - 0x18, 0xa2, 0x11, 0x35, 0xfc, 0x6a, 0x89, 0x86, 0x3a, 0xb6, 0x77, 0x29, 0x1a, 0x7e, 0x44, 0x81, - 0x68, 0xb0, 0x44, 0x24, 0x8a, 0x06, 0xcf, 0x99, 0x80, 0x06, 0xa2, 0x11, 0xa5, 0x6e, 0x06, 0xd1, - 0x50, 0x71, 0x29, 0xda, 0xd5, 0x04, 0x5c, 0xf2, 0x45, 0x63, 0xec, 0xd5, 0xed, 0x8b, 0x46, 0x34, - 0x1a, 0xed, 0x47, 0x70, 0x86, 0x45, 0x79, 0xe7, 0xb5, 0x87, 0x2d, 0xba, 0x8e, 0x78, 0xe7, 0xb7, - 0xa0, 0x6c, 0x58, 0x16, 0x3f, 0xe1, 0xb8, 0x49, 0xb5, 0x81, 0x5b, 0x01, 0x4c, 0x0f, 0xdb, 0xa0, - 0xf3, 0x50, 0xee, 0x60, 0xb7, 0xed, 0x98, 0x7d, 0x4f, 0xac, 0xe1, 0x92, 0x1e, 0x6e, 0xd2, 0x5e, - 0xc0, 0xd9, 0x21, 0xf7, 0x7c, 0x9e, 0x3e, 0x81, 0x12, 0x16, 0x8d, 0xdc, 0xbb, 0xb2, 0xc4, 0x1d, - 0x58, 0x06, 0x78, 0xed, 0x11, 0x9c, 0x61, 0xc3, 0x1d, 0x1a, 0x56, 0x13, 0x16, 0x7c, 0x58, 0x30, - 0x6d, 0xcb, 0xc7, 0x47, 0xeb, 0x65, 0x1f, 0xdb, 0xda, 0xd4, 0xcb, 0x3e, 0xa8, 0xd5, 0xd1, 0xde, - 0x83, 0xb3, 0x43, 0xbd, 0xf1, 0xf9, 0x6b, 0xc1, 0xa9, 0x7b, 0xd8, 0x9b, 0x8a, 0x97, 0x6d, 0x58, - 0x8d, 0x76, 0x35, 0x8d, 0x89, 0xf8, 0x4d, 0x4e, 0x94, 0x69, 0x74, 0xec, 0xda, 0x03, 0x27, 0xa8, - 0x15, 0x4e, 0x21, 0xbf, 0x08, 0x0a, 0x5d, 0xd3, 0xe2, 0xc5, 0x0d, 0x9d, 0xfe, 0x8f, 0xea, 0x30, - 0xdf, 0x37, 0x0e, 0x7b, 0xb6, 0xd1, 0xe1, 0xca, 0xbb, 0x5a, 0x67, 0x57, 0xf8, 0x75, 0x71, 0x27, - 0x5f, 0xbf, 0x65, 0x1d, 0xea, 0x02, 0xa4, 0xe9, 0x82, 0x80, 0x41, 0x7c, 0x7c, 0xdc, 0x37, 0xa0, - 0xe8, 0xf0, 0x36, 0x1e, 0x9d, 0xf2, 0xae, 0xcf, 0xb7, 0xf3, 0xd1, 0xda, 0x7d, 0x51, 0x4c, 0x91, - 0xc7, 0xdc, 0x80, 0xb2, 0x00, 0x05, 0x59, 0xa1, 0x82, 0x28, 0x90, 0xad, 0x4d, 0x1d, 0x04, 0xa4, - 0xd5, 0xd1, 0x2a, 0x82, 0x47, 0x72, 0x74, 0xda, 0xcf, 0xf3, 0xe2, 0xcc, 0x3f, 0xa9, 0x13, 0x74, - 0x17, 0x56, 0x7c, 0x83, 0x11, 0xf6, 0xbb, 0x65, 0x61, 0x24, 0x76, 0x3c, 0x29, 0xa3, 0x33, 0x63, - 0x64, 0x34, 0x94, 0xbd, 0x42, 0xc6, 0xec, 0xc9, 0x93, 0x30, 0x71, 0xf6, 0xee, 0xd0, 0x92, 0xc7, - 0xc4, 0xa9, 0x7b, 0x42, 0x57, 0xe6, 0x14, 0xe3, 0xfa, 0x6f, 0x9e, 0xbd, 0xd3, 0x8b, 0x47, 0xfe, - 0x96, 0xfe, 0x40, 0xde, 0xd2, 0x3f, 0x88, 0xdb, 0x36, 0x65, 0xd3, 0xe1, 0x4d, 0xfd, 0xd7, 0xd3, - 0xdf, 0xd4, 0x9f, 0x49, 0x9b, 0xfa, 0xa7, 0xa3, 0x46, 0x37, 0x7e, 0x61, 0x5c, 0x08, 0xc4, 0x6c, - 0x20, 0x10, 0x93, 0x6c, 0xf5, 0xdb, 0x70, 0x5a, 0x8a, 0x93, 0x27, 0xf5, 0x26, 0x94, 0x44, 0x9a, - 0xc4, 0x76, 0x9f, 0x9c, 0xd5, 0x00, 0xde, 0xfc, 0x8f, 0x06, 0xf3, 0xb7, 0xd9, 0x37, 0x52, 0xc8, - 0x84, 0x79, 0xfe, 0x89, 0x0f, 0xd2, 0x54, 0xf6, 0xd1, 0xcf, 0x86, 0xaa, 0x17, 0x12, 0x31, 0x5c, - 0x28, 0x4e, 0xff, 0xe5, 0x0f, 0xff, 0xfe, 0x55, 0x7e, 0x19, 0x16, 0x29, 0xe8, 0xeb, 0xbc, 0x80, - 0x82, 0x6c, 0x28, 0xf9, 0x5f, 0x61, 0xa0, 0xff, 0xcf, 0xf2, 0x59, 0x49, 0xf5, 0x62, 0x0a, 0x2a, - 0xd9, 0xa1, 0x03, 0x10, 0x7c, 0x04, 0x81, 0x2e, 0xc6, 0x5f, 0x79, 0x85, 0x47, 0x78, 0x29, 0x0d, - 0x96, 0xea, 0x33, 0xf8, 0xc8, 0x41, 0xed, 0x73, 0xe8, 0xa3, 0x0a, 0xb5, 0x4f, 0xc5, 0xb7, 0x12, - 0x31, 0x3e, 0x59, 0x0e, 0x9f, 0x19, 0x6e, 0x37, 0x36, 0x87, 0xa1, 0x8f, 0x1c, 0x62, 0x73, 0x18, - 0xf9, 0x9c, 0x21, 0x39, 0x87, 0xf4, 0x9a, 0x3a, 0x3e, 0x87, 0xe1, 0x4f, 0x06, 0xe2, 0x73, 0x18, - 0xb9, 0xeb, 0x4e, 0x9d, 0x4f, 0x3a, 0xbc, 0x84, 0xf9, 0x0c, 0x8f, 0xf0, 0x52, 0x1a, 0x2c, 0xd5, - 0x67, 0x70, 0x7b, 0xac, 0xf6, 0x39, 0x74, 0x93, 0xad, 0xf6, 0x39, 0x7c, 0x09, 0x1d, 0xe7, 0xf3, - 0x35, 0x2c, 0x84, 0x6f, 0xbe, 0xd0, 0xe5, 0x8c, 0x57, 0x79, 0xd5, 0x5a, 0x3a, 0x30, 0xd9, 0xf3, - 0x0f, 0x61, 0x31, 0x72, 0xcf, 0x8f, 0x94, 0x3d, 0xaa, 0xbe, 0x2b, 0xa8, 0x5e, 0xc9, 0x80, 0x4c, - 0x75, 0x1e, 0xb9, 0x26, 0x56, 0x3b, 0x57, 0x5d, 0x4c, 0xab, 0x9d, 0x2b, 0xef, 0x9c, 0x13, 0x9c, - 0x47, 0x6e, 0x83, 0xd5, 0xce, 0x55, 0xd7, 0xce, 0x6a, 0xe7, 0xea, 0xab, 0xe5, 0x44, 0x92, 0xf1, - 0x1b, 0x94, 0x58, 0x92, 0x45, 0x6f, 0xdd, 0x62, 0x49, 0x26, 0x5f, 0xa1, 0x25, 0x93, 0x4c, 0x5c, - 0xf7, 0xc4, 0x93, 0x4c, 0xba, 0xa3, 0x8a, 0x27, 0x99, 0x7c, 0x73, 0x94, 0x4a, 0x32, 0x31, 0xe0, - 0x04, 0x92, 0x49, 0x63, 0xbe, 0x92, 0x01, 0x99, 0x31, 0xcf, 0x89, 0xce, 0x55, 0xd7, 0x9c, 0x49, - 0x79, 0xce, 0xe8, 0x9c, 0xe5, 0x99, 0xd7, 0xbb, 0x63, 0xf3, 0x1c, 0xbd, 0x49, 0x88, 0xcd, 0xb3, - 0x54, 0x6c, 0x4f, 0xc9, 0xb3, 0xb8, 0x8a, 0x89, 0xcf, 0xb3, 0x74, 0x7f, 0x14, 0x9f, 0x67, 0xf9, - 0x56, 0x27, 0x75, 0x3d, 0x8b, 0x01, 0x27, 0xac, 0x67, 0x69, 0xcc, 0x57, 0x32, 0x20, 0x53, 0x37, - 0x27, 0xff, 0x12, 0x40, 0xbd, 0x39, 0xc9, 0x57, 0x0c, 0xd5, 0x8b, 0x29, 0xa8, 0xd4, 0x79, 0x0e, - 0x57, 0xdc, 0xd5, 0xf3, 0xac, 0xb8, 0x4d, 0xa8, 0xd6, 0xd2, 0x81, 0xc9, 0x9e, 0x07, 0x50, 0x0e, - 0xd5, 0x8d, 0xd1, 0xa5, 0x6c, 0xa5, 0xee, 0xea, 0xe5, 0x54, 0x5c, 0xea, 0x80, 0xc3, 0x65, 0x61, - 0xf5, 0x80, 0x15, 0x35, 0xe8, 0x6a, 0x2d, 0x1d, 0x98, 0xea, 0x39, 0x5c, 0x02, 0x56, 0x7b, 0x56, - 0x94, 0x99, 0xab, 0xb5, 0x74, 0x60, 0x16, 0x56, 0xb1, 0x22, 0x52, 0x2c, 0xab, 0x22, 0x55, 0xaa, - 0x58, 0x56, 0x49, 0x95, 0xa8, 0x34, 0x56, 0x71, 0x9f, 0x09, 0xac, 0x8a, 0xba, 0xad, 0xa5, 0x03, - 0x33, 0xb1, 0x8a, 0x17, 0x16, 0xe3, 0x59, 0x15, 0xad, 0x85, 0xc6, 0xb3, 0x4a, 0xaa, 0x50, 0xa6, - 0xb2, 0x2a, 0x69, 0xc0, 0x8a, 0x22, 0x65, 0x12, 0xab, 0x32, 0x4f, 0x75, 0xb8, 0x46, 0x98, 0xc4, - 0xaa, 0x0c, 0x9e, 0x95, 0xe5, 0xc6, 0x78, 0xcf, 0xe1, 0xd2, 0x97, 0xda, 0xb3, 0xa2, 0xce, 0xa6, - 0xf6, 0xac, 0xaa, 0xa2, 0xc5, 0x79, 0xfe, 0x69, 0x0e, 0x96, 0xa5, 0x0a, 0x24, 0xba, 0x1a, 0x3f, - 0x91, 0x43, 0x01, 0x7c, 0x2d, 0x13, 0x36, 0x3d, 0x06, 0xa9, 0xbe, 0xa8, 0x8e, 0x41, 0x5d, 0xd2, - 0x54, 0xc7, 0x10, 0x57, 0xb0, 0x8c, 0x27, 0x7b, 0xa8, 0x5a, 0x82, 0xe2, 0xb6, 0x5c, 0xa9, 0x2a, - 0x53, 0xbd, 0x9c, 0x8a, 0x4b, 0x76, 0xfb, 0x63, 0x58, 0x8a, 0xd6, 0x8f, 0x50, 0xc2, 0xc6, 0x27, - 0x3b, 0xbf, 0x9a, 0x05, 0x9a, 0xba, 0x43, 0x47, 0x2a, 0x0a, 0xa8, 0x96, 0xb5, 0x38, 0xa2, 0xde, - 0xa1, 0x95, 0xe5, 0x89, 0x84, 0xc1, 0x47, 0x4b, 0x9f, 0x28, 0xe1, 0x74, 0x97, 0x69, 0xf0, 0xea, - 0x4a, 0x6a, 0x82, 0xff, 0x68, 0x71, 0x13, 0x25, 0x1c, 0xf0, 0x32, 0xf9, 0x8f, 0xa9, 0x95, 0xaa, - 0xfd, 0x6f, 0x54, 0xde, 0x7e, 0xb9, 0x76, 0xe2, 0x6f, 0x5f, 0xae, 0x9d, 0xf8, 0xc9, 0xf1, 0x5a, - 0xee, 0xed, 0xf1, 0x5a, 0xee, 0xaf, 0xc7, 0x6b, 0xb9, 0x7f, 0x1c, 0xaf, 0xe5, 0x76, 0xe7, 0x68, - 0xb5, 0xf1, 0xfa, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x0e, 0xa1, 0x5f, 0x52, 0xdc, 0x36, 0x00, - 0x00, + // 2744 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5a, 0x49, 0x6f, 0x1b, 0xc9, + 0x15, 0x36, 0x29, 0x4a, 0x22, 0x1f, 0xb5, 0xb9, 0x2c, 0xdb, 0x1c, 0xda, 0x91, 0x8c, 0xf6, 0x46, + 0x3b, 0x0e, 0x39, 0x43, 0x67, 0x32, 0x8e, 0x67, 0x9c, 0xc4, 0xb2, 0xbc, 0xd0, 0x8b, 0x6c, 0xb4, + 0x64, 0x23, 0x39, 0x04, 0x02, 0x45, 0x96, 0x34, 0x6d, 0x52, 0xdd, 0x4c, 0x77, 0xd3, 0x63, 0x21, + 0x48, 0x90, 0xc5, 0xc1, 0x9c, 0x72, 0x0c, 0x10, 0xe4, 0x10, 0x20, 0xa7, 0x00, 0x39, 0xe4, 0x90, + 0x53, 0x0e, 0xf9, 0x01, 0x46, 0x4e, 0x39, 0xe6, 0xa4, 0x64, 0x04, 0x04, 0xc8, 0x29, 0x7f, 0x21, + 0x83, 0xda, 0x7a, 0x29, 0x56, 0x2f, 0x5c, 0x00, 0xcf, 0x49, 0x62, 0xf5, 0xf7, 0xea, 0xbd, 0x7a, + 0xef, 0xf5, 0x57, 0xd5, 0xef, 0x15, 0x5c, 0xdb, 0x33, 0xdc, 0x4f, 0xfb, 0x3b, 0xd5, 0x96, 0xb5, + 0x5f, 0x6b, 0x5b, 0xad, 0x0e, 0xb6, 0x6b, 0xce, 0x67, 0x4d, 0x7b, 0xbf, 0x63, 0xb8, 0xb5, 0x66, + 0xcf, 0xa8, 0xb5, 0x2c, 0xd3, 0xb5, 0xad, 0x6e, 0xb5, 0x67, 0x5b, 0xae, 0x85, 0x10, 0x83, 0x54, + 0x05, 0xa4, 0xfa, 0xea, 0x83, 0xf2, 0xd5, 0x84, 0x19, 0x9c, 0x1e, 0x6e, 0x39, 0x4c, 0xbe, 0x9c, + 0xa4, 0xcd, 0xda, 0x79, 0x89, 0x5b, 0xae, 0x40, 0x27, 0xcd, 0xec, 0x1e, 0xf4, 0xb0, 0xc0, 0x2e, + 0xef, 0x59, 0x7b, 0x16, 0xfd, 0xb7, 0x46, 0xfe, 0xe3, 0xa3, 0xef, 0xed, 0x59, 0xd6, 0x5e, 0x17, + 0xd7, 0xe8, 0xaf, 0x9d, 0xfe, 0x6e, 0xad, 0x69, 0x1e, 0xf0, 0x47, 0x1f, 0xc5, 0x4c, 0xee, 0xc1, + 0x7b, 0xdd, 0xfe, 0x9e, 0x61, 0xf2, 0x3f, 0x4c, 0x50, 0xfb, 0x10, 0x16, 0xee, 0x63, 0x77, 0xc3, + 0x6a, 0x63, 0x1d, 0xff, 0xa8, 0x8f, 0x1d, 0x17, 0x9d, 0x87, 0x59, 0xd3, 0x6a, 0xe3, 0x6d, 0xa3, + 0x5d, 0xca, 0x9c, 0xcb, 0x54, 0x0a, 0x6b, 0x70, 0x74, 0xb8, 0x3a, 0x43, 0x10, 0x8d, 0x75, 0x7d, + 0x86, 0x3c, 0x6a, 0xb4, 0xb5, 0xef, 0xc2, 0xa2, 0x27, 0xe6, 0xf4, 0x2c, 0xd3, 0xc1, 0xe8, 0x1a, + 0xe4, 0xc8, 0x43, 0x2a, 0x54, 0xac, 0x97, 0xaa, 0x83, 0xce, 0xad, 0x52, 0x3c, 0x45, 0x69, 0x6f, + 0xa6, 0x61, 0xe9, 0xb1, 0xe1, 0xd0, 0x29, 0x1c, 0xa1, 0xfa, 0x1e, 0xcc, 0xee, 0x1a, 0x5d, 0x17, + 0xdb, 0x0e, 0x9f, 0xe5, 0x9a, 0x6a, 0x16, 0x59, 0xac, 0x7a, 0x8f, 0xc9, 0xe8, 0x42, 0xb8, 0xfc, + 0xc7, 0x1c, 0xcc, 0xf2, 0x41, 0xb4, 0x0c, 0xd3, 0x66, 0x73, 0x1f, 0x93, 0x19, 0xa7, 0x2a, 0x05, + 0x9d, 0xfd, 0x40, 0x35, 0x28, 0x1a, 0xed, 0xed, 0x9e, 0x8d, 0x77, 0x8d, 0xd7, 0xd8, 0x29, 0x65, + 0xc9, 0xb3, 0xb5, 0x85, 0xa3, 0xc3, 0x55, 0x68, 0xac, 0x3f, 0xe3, 0xa3, 0x3a, 0x18, 0x6d, 0xf1, + 0x3f, 0x7a, 0x06, 0x33, 0xdd, 0xe6, 0x0e, 0xee, 0x3a, 0xa5, 0xa9, 0x73, 0x53, 0x95, 0x62, 0xfd, + 0xc6, 0x30, 0x96, 0x55, 0x1f, 0x53, 0xd1, 0xbb, 0xa6, 0x6b, 0x1f, 0xe8, 0x7c, 0x1e, 0xf4, 0x04, + 0x8a, 0xfb, 0x78, 0x7f, 0x07, 0xdb, 0xce, 0xa7, 0x46, 0xcf, 0x29, 0xe5, 0xce, 0x4d, 0x55, 0x16, + 0xea, 0x97, 0xa3, 0xdc, 0xb6, 0xd9, 0xc3, 0xad, 0xea, 0x13, 0x0f, 0xbf, 0x96, 0x5d, 0x3a, 0xa6, + 0x07, 0xe5, 0xd1, 0xb7, 0x60, 0xda, 0xb6, 0xba, 0xd8, 0x29, 0x4d, 0xd3, 0x89, 0xce, 0x46, 0xfa, + 0xdf, 0xea, 0x62, 0x2a, 0xcd, 0xe0, 0xe8, 0x3c, 0xcc, 0x13, 0x97, 0xf8, 0xbe, 0x98, 0xa1, 0x7e, + 0x9a, 0x23, 0x83, 0xde, 0xea, 0x7f, 0x08, 0x45, 0x9a, 0x13, 0xdc, 0x05, 0xb3, 0xd4, 0x05, 0x9f, + 0x0c, 0xe5, 0x02, 0x32, 0x18, 0x74, 0x03, 0x98, 0xde, 0x40, 0xf9, 0xdb, 0x50, 0x0c, 0x3c, 0x42, + 0x4b, 0x30, 0xd5, 0xc1, 0x07, 0x2c, 0xfb, 0x74, 0xf2, 0x2f, 0x09, 0xe2, 0xab, 0x66, 0xb7, 0x8f, + 0x4b, 0x59, 0x3a, 0xc6, 0x7e, 0xdc, 0xcc, 0xde, 0xc8, 0x94, 0x6f, 0xc1, 0xa2, 0x34, 0xf3, 0x30, + 0xe2, 0xda, 0x1d, 0x38, 0x1e, 0xb0, 0x98, 0x67, 0x72, 0x15, 0xa6, 0x89, 0x71, 0x2c, 0x65, 0xe2, + 0x52, 0x99, 0xc1, 0xb4, 0x3f, 0x65, 0xe0, 0xf8, 0xf3, 0x5e, 0xbb, 0xe9, 0xe2, 0x61, 0xdf, 0x23, + 0xf4, 0x1d, 0x98, 0xa3, 0xa0, 0x57, 0xd8, 0x76, 0x0c, 0xcb, 0xa4, 0x06, 0x16, 0xeb, 0x67, 0x54, + 0x1a, 0x5f, 0x30, 0x88, 0x4e, 0x23, 0xc1, 0x7f, 0xa0, 0xf7, 0x21, 0x47, 0x18, 0xa9, 0x34, 0x45, + 0xe5, 0xce, 0xc6, 0x65, 0x8f, 0x4e, 0x91, 0xda, 0x1a, 0xa0, 0xa0, 0xad, 0x23, 0xbd, 0xbc, 0x1b, + 0x70, 0x5c, 0xc7, 0xfb, 0xd6, 0xab, 0xe1, 0xd7, 0xbb, 0x0c, 0xd3, 0xbb, 0x96, 0xdd, 0x62, 0x91, + 0xc8, 0xeb, 0xec, 0x87, 0xb6, 0x0c, 0x28, 0x38, 0x1f, 0xb3, 0x89, 0x53, 0xd3, 0x56, 0xd3, 0xe9, + 0x04, 0x54, 0xb8, 0x4d, 0xa7, 0x23, 0xa9, 0x20, 0x08, 0xa2, 0x82, 0x3c, 0xf2, 0xa8, 0x89, 0x89, + 0xf9, 0xab, 0x23, 0x0f, 0xe3, 0x56, 0x47, 0xf1, 0x14, 0xa5, 0xdd, 0x10, 0xab, 0x1b, 0x5a, 0xb5, + 0xb7, 0x8e, 0xa0, 0x76, 0xed, 0x6f, 0x39, 0x46, 0x75, 0x64, 0x70, 0x04, 0xaa, 0x0b, 0x8a, 0x0d, + 0x52, 0xdd, 0xbf, 0xa6, 0xde, 0x1d, 0xd5, 0xa9, 0x2c, 0x53, 0x52, 0x5d, 0x0d, 0x8a, 0x0e, 0xb6, + 0x5f, 0x19, 0x2d, 0x92, 0x1d, 0x8c, 0xea, 0xb8, 0x09, 0x9b, 0x6c, 0xb8, 0xb1, 0xee, 0xe8, 0xc0, + 0x21, 0x8d, 0xb6, 0x83, 0x2e, 0x41, 0x9e, 0xe7, 0x12, 0xe3, 0xb3, 0xc2, 0x5a, 0xf1, 0xe8, 0x70, + 0x75, 0x96, 0x25, 0x93, 0xa3, 0xcf, 0xb2, 0x6c, 0x72, 0xd0, 0x03, 0x58, 0x68, 0x63, 0xc7, 0xb0, + 0x71, 0x7b, 0xdb, 0x71, 0x9b, 0x2e, 0x67, 0xaf, 0x85, 0xfa, 0xd7, 0xa2, 0x42, 0xbc, 0x49, 0x50, + 0x94, 0xfe, 0xe6, 0xb9, 0x20, 0x1d, 0x51, 0xd0, 0xe0, 0xac, 0x82, 0x06, 0xcf, 0x02, 0xf4, 0x7b, + 0xdb, 0xae, 0xb5, 0x4d, 0xde, 0x9f, 0x52, 0x9e, 0xa6, 0x70, 0xbe, 0xdf, 0xdb, 0xb2, 0xd6, 0x9b, + 0x2e, 0x46, 0x65, 0xc8, 0xdb, 0x7d, 0xd3, 0x35, 0x48, 0x04, 0x0a, 0x54, 0xda, 0xfb, 0x3d, 0x06, + 0xc3, 0x09, 0x8a, 0xe2, 0xce, 0xf6, 0x29, 0x8a, 0xe4, 0x5c, 0x2c, 0x45, 0xd1, 0x24, 0x64, 0x30, + 0xed, 0x11, 0x2c, 0xdf, 0xb1, 0x71, 0xd3, 0xc5, 0xdc, 0xe1, 0x22, 0x0d, 0xaf, 0x73, 0xfe, 0x60, + 0x39, 0xb8, 0xaa, 0x9a, 0x86, 0x4b, 0x04, 0x28, 0x64, 0x03, 0x4e, 0x4a, 0x93, 0x71, 0xab, 0x3e, + 0x84, 0x59, 0x1e, 0x44, 0x3e, 0xe1, 0x99, 0x98, 0x09, 0x75, 0x81, 0xd5, 0x5e, 0xc2, 0xf1, 0xfb, + 0xd8, 0x95, 0x2c, 0xbb, 0x06, 0xe0, 0xe7, 0x0c, 0x7f, 0xe7, 0xe6, 0x8f, 0x0e, 0x57, 0x0b, 0x5e, + 0xca, 0xe8, 0x05, 0x2f, 0x63, 0xd0, 0x65, 0x58, 0x34, 0x4c, 0x07, 0xdb, 0xee, 0x76, 0x1b, 0xef, + 0x36, 0xfb, 0x5d, 0xd7, 0xe1, 0x0c, 0xb3, 0xc0, 0x86, 0xd7, 0xf9, 0xa8, 0xf6, 0x08, 0x50, 0x50, + 0xd7, 0x78, 0x86, 0xff, 0x25, 0x0b, 0xcb, 0x8c, 0x4c, 0xc7, 0x32, 0x7e, 0x1d, 0x16, 0x05, 0x7a, + 0x88, 0x7d, 0x60, 0x81, 0xcb, 0x88, 0xad, 0xe0, 0x7a, 0x68, 0x2b, 0x48, 0x17, 0x4a, 0xf4, 0x04, + 0xf2, 0xb6, 0xd5, 0xed, 0xee, 0x34, 0x5b, 0x9d, 0x52, 0xee, 0x5c, 0xa6, 0xb2, 0x50, 0xff, 0x40, + 0x25, 0xa8, 0x5a, 0x64, 0x55, 0xe7, 0x82, 0xba, 0x37, 0x85, 0xa6, 0x41, 0x5e, 0x8c, 0xa2, 0x3c, + 0xe4, 0x36, 0x9e, 0x6e, 0xdc, 0x5d, 0x3a, 0x86, 0xe6, 0x20, 0xff, 0x4c, 0xbf, 0xfb, 0xa2, 0xf1, + 0xf4, 0xf9, 0xe6, 0x52, 0x86, 0x64, 0x8f, 0x34, 0xdd, 0x78, 0x41, 0x58, 0x87, 0x65, 0x46, 0xba, + 0xe3, 0xc4, 0x40, 0x3b, 0x0d, 0x27, 0xa5, 0x59, 0x38, 0x7b, 0xbf, 0x99, 0x82, 0x13, 0xe4, 0xfd, + 0xe3, 0xe3, 0x1e, 0x81, 0x37, 0x64, 0x02, 0xaf, 0x45, 0xd1, 0xa4, 0x24, 0x39, 0xc8, 0xe1, 0x7f, + 0xc8, 0x4e, 0x9c, 0xc3, 0x37, 0x25, 0x0e, 0xff, 0x78, 0x48, 0xe3, 0x94, 0x34, 0x3e, 0xc0, 0x91, + 0x39, 0x05, 0x47, 0x06, 0x59, 0x70, 0x7a, 0x72, 0x2c, 0xf8, 0x14, 0x96, 0xc3, 0xe6, 0xf2, 0xa4, + 0xf9, 0x08, 0xf2, 0x3c, 0x88, 0x82, 0x0b, 0x63, 0xb3, 0xc6, 0x03, 0x6b, 0x37, 0xa0, 0x1c, 0x98, + 0x90, 0xec, 0x02, 0x7d, 0xc7, 0x8f, 0x6e, 0x59, 0x9a, 0xb6, 0x10, 0x90, 0xfc, 0x45, 0x16, 0xce, + 0x28, 0x45, 0xb9, 0x49, 0x3f, 0x80, 0xbc, 0xc3, 0xc7, 0xb8, 0x49, 0xb7, 0x12, 0xbc, 0x2f, 0x4f, + 0x51, 0x0d, 0x8d, 0xeb, 0xde, 0x74, 0xe5, 0xcf, 0x33, 0x30, 0x1f, 0x7a, 0x36, 0x24, 0xd3, 0x9c, + 0x07, 0xb1, 0xed, 0x6d, 0xb3, 0xed, 0x83, 0xf8, 0x39, 0xa7, 0xcf, 0xf1, 0x41, 0xba, 0xc7, 0x10, + 0x90, 0xdd, 0x37, 0x4d, 0xc3, 0xdc, 0xe3, 0xa0, 0x29, 0x06, 0xe2, 0x83, 0x5b, 0xe1, 0x0d, 0x65, + 0x03, 0xbb, 0x9f, 0x59, 0x76, 0x67, 0x88, 0x0d, 0x85, 0x4b, 0xa8, 0x36, 0x14, 0x6f, 0x32, 0x9f, + 0x12, 0x4c, 0x36, 0x14, 0x47, 0x09, 0x42, 0x4a, 0x60, 0xb5, 0xe7, 0x74, 0x43, 0x91, 0x2c, 0x43, + 0x90, 0x23, 0x89, 0xca, 0xd3, 0x8d, 0xfe, 0x4f, 0xbc, 0xc7, 0x65, 0x88, 0xf7, 0xb2, 0xbe, 0xf7, + 0xb8, 0x2c, 0xf1, 0x1e, 0x07, 0x34, 0xda, 0x7c, 0xef, 0x98, 0x90, 0x8d, 0xdf, 0x17, 0xb4, 0x35, + 0x71, 0x33, 0x3d, 0x2a, 0x93, 0x2c, 0xd5, 0xfe, 0x9b, 0x65, 0x54, 0xc6, 0xc7, 0x47, 0xa0, 0x32, + 0x49, 0x72, 0x90, 0xca, 0x7e, 0xf5, 0x0e, 0xa9, 0x2c, 0xc2, 0xb8, 0x91, 0xa9, 0x6c, 0x02, 0x74, + 0xe5, 0x9b, 0xe4, 0xd3, 0x15, 0x0f, 0x54, 0x2c, 0x5d, 0x89, 0xc8, 0x79, 0x60, 0xed, 0x36, 0x4d, + 0xe9, 0x3b, 0xdd, 0xbe, 0xe3, 0x62, 0x3b, 0xb0, 0xc5, 0xb5, 0xd8, 0x88, 0xf4, 0xf2, 0x73, 0x1c, + 0xc9, 0x0b, 0x0e, 0xf0, 0xd2, 0xd7, 0x9b, 0xc2, 0x4f, 0x5f, 0x0e, 0x89, 0x4b, 0x5f, 0x21, 0x25, + 0xb0, 0x5e, 0x2e, 0xf1, 0x07, 0x23, 0xe4, 0x92, 0x24, 0xf9, 0xd5, 0xca, 0xa5, 0x08, 0xe3, 0xde, + 0x65, 0x2e, 0xf9, 0x26, 0xf9, 0xb9, 0xc4, 0xa3, 0x11, 0x9b, 0x4b, 0x22, 0x74, 0x1e, 0x58, 0xfb, + 0x4d, 0x06, 0x8a, 0x8f, 0xf0, 0x81, 0x6e, 0xb9, 0x4d, 0x97, 0x9c, 0x1c, 0xaf, 0xc2, 0x71, 0x92, + 0x64, 0xd8, 0xde, 0x7e, 0x69, 0x19, 0xe6, 0xb6, 0x6b, 0x75, 0xb0, 0x49, 0x4d, 0xcb, 0xeb, 0x8b, + 0xec, 0xc1, 0x43, 0xcb, 0x30, 0xb7, 0xc8, 0x30, 0xba, 0x06, 0x68, 0xbf, 0x69, 0x36, 0xf7, 0xc2, + 0x60, 0x76, 0xd6, 0x5e, 0xe2, 0x4f, 0x94, 0xe8, 0xbe, 0xd9, 0xb5, 0x5a, 0x9d, 0x6d, 0xb2, 0xea, + 0xa9, 0x10, 0xfa, 0x39, 0x7d, 0xf0, 0x08, 0x1f, 0x90, 0x8d, 0x95, 0x1f, 0xa7, 0xc7, 0xc9, 0x73, + 0x72, 0x9c, 0x16, 0xe8, 0x61, 0x8e, 0xd3, 0x5c, 0x66, 0x88, 0xe3, 0x34, 0xd7, 0x1e, 0x38, 0x4e, + 0xdf, 0x26, 0xc7, 0x69, 0xe6, 0x55, 0x7a, 0x9c, 0x8e, 0x10, 0x0c, 0x38, 0x7f, 0x2d, 0xf7, 0xf6, + 0x70, 0xf5, 0x98, 0xee, 0x89, 0xf9, 0xc7, 0xe3, 0x09, 0xbd, 0xa8, 0xb7, 0x60, 0x89, 0x7e, 0xf0, + 0xb4, 0x6c, 0xec, 0x0a, 0x7f, 0x5e, 0x81, 0x82, 0x43, 0x07, 0x7c, 0x77, 0xce, 0x1d, 0x1d, 0xae, + 0xe6, 0x19, 0xaa, 0xb1, 0x4e, 0x0e, 0x3b, 0xf4, 0xbf, 0xb6, 0x76, 0x9f, 0x7f, 0x9b, 0x31, 0x71, + 0x6e, 0x4a, 0x1d, 0x66, 0x18, 0x80, 0x5b, 0x52, 0x56, 0x1f, 0xb9, 0xa8, 0x0c, 0x47, 0x6a, 0x7f, + 0xcd, 0xc0, 0x09, 0x71, 0xee, 0x1f, 0xcd, 0x16, 0xb4, 0x06, 0x0b, 0x1c, 0x3a, 0x44, 0x5c, 0xe7, + 0x99, 0x88, 0x08, 0x6b, 0x3d, 0x14, 0xd6, 0x95, 0x68, 0xc3, 0x03, 0xc7, 0x93, 0x87, 0xfe, 0x57, + 0xde, 0xd8, 0x6e, 0xf8, 0x4f, 0x16, 0x10, 0x3b, 0xf9, 0x91, 0x9f, 0x1e, 0x6d, 0x3e, 0x90, 0x69, + 0xb3, 0x1a, 0x7d, 0x64, 0x0c, 0x0a, 0x0e, 0xb2, 0xe6, 0x9b, 0xc9, 0xb3, 0xa6, 0x2e, 0xb1, 0xe6, + 0xcd, 0xe1, 0x6c, 0x7b, 0x27, 0xa4, 0xf9, 0x48, 0x7c, 0xb5, 0x71, 0x8b, 0x78, 0xc8, 0xbe, 0x49, + 0xbe, 0x31, 0xe9, 0x10, 0xa7, 0xcc, 0xb8, 0x98, 0x09, 0xa8, 0xd6, 0x80, 0x13, 0xa2, 0xe0, 0x11, + 0x4c, 0xdd, 0x7a, 0xe8, 0xac, 0x9b, 0x3a, 0x97, 0xc2, 0x53, 0x8d, 0x91, 0x4b, 0xdf, 0x83, 0x13, + 0xe2, 0x9b, 0x75, 0xc4, 0xb7, 0xfb, 0x94, 0xff, 0xed, 0x1c, 0xb4, 0x86, 0x93, 0xc6, 0x1d, 0xcb, + 0xdc, 0x35, 0xf6, 0x02, 0xd3, 0xb6, 0xe8, 0x80, 0x34, 0x2d, 0x43, 0x91, 0x69, 0xd9, 0x63, 0x8f, + 0x34, 0x84, 0xb8, 0xbf, 0x42, 0x06, 0x88, 0x5b, 0x21, 0x97, 0xe1, 0xc8, 0x00, 0x69, 0x8c, 0x6a, + 0x0b, 0x21, 0x0d, 0x0e, 0x1d, 0x86, 0x34, 0x98, 0xc8, 0x10, 0xa4, 0xc1, 0x34, 0xab, 0x48, 0x63, + 0x02, 0x6e, 0x10, 0xa4, 0xc1, 0x86, 0x47, 0x20, 0x8d, 0xb0, 0xe0, 0x57, 0x8b, 0x34, 0xd4, 0xb6, + 0xbd, 0x4b, 0xd2, 0xf0, 0x2c, 0xf2, 0x49, 0x83, 0x05, 0x22, 0x96, 0x34, 0x78, 0xcc, 0x04, 0xd4, + 0x27, 0x8d, 0x70, 0xea, 0xa6, 0x20, 0x0d, 0x55, 0x2e, 0x85, 0xa7, 0x1a, 0x23, 0x97, 0x3c, 0xd2, + 0x18, 0xf9, 0xed, 0xf6, 0x48, 0x23, 0x6c, 0x8d, 0xf6, 0x13, 0x38, 0xc5, 0xac, 0xbc, 0xfb, 0xda, + 0xc5, 0x26, 0x7d, 0x8f, 0xf8, 0xe4, 0xb7, 0xa1, 0xd8, 0x34, 0x4d, 0x7e, 0xc2, 0x71, 0xe2, 0x6a, + 0x03, 0xb7, 0x7d, 0x98, 0x1e, 0x94, 0x41, 0xe7, 0xa0, 0xd8, 0xc6, 0x4e, 0xcb, 0x36, 0x7a, 0xae, + 0x78, 0x87, 0x0b, 0x7a, 0x70, 0x48, 0x7b, 0x01, 0xa7, 0x07, 0xd4, 0x73, 0x3f, 0x7d, 0x0c, 0x05, + 0x2c, 0x06, 0xb9, 0x76, 0x65, 0x87, 0xc0, 0x97, 0xf4, 0xf1, 0xda, 0x63, 0x38, 0xc5, 0x96, 0x3b, + 0xb0, 0xac, 0x3a, 0xcc, 0x79, 0x30, 0xdf, 0x6d, 0x8b, 0x47, 0x87, 0xab, 0x45, 0x0f, 0xdb, 0x58, + 0xd7, 0x8b, 0x1e, 0xa8, 0xd1, 0xd6, 0xde, 0x83, 0xd3, 0x03, 0xb3, 0x71, 0xff, 0x35, 0xe0, 0xc4, + 0x7d, 0xec, 0x4e, 0x44, 0xcb, 0x26, 0x2c, 0x87, 0xa7, 0x9a, 0x84, 0x23, 0x7e, 0x9f, 0x11, 0x65, + 0x1a, 0x1d, 0x3b, 0x56, 0xdf, 0xf6, 0x4b, 0xad, 0x13, 0x88, 0x2f, 0x82, 0x5c, 0xc7, 0x30, 0x79, + 0x71, 0x43, 0xa7, 0xff, 0xa3, 0x2a, 0xcc, 0xf6, 0x9a, 0x07, 0x5d, 0xab, 0xd9, 0xe6, 0xcc, 0xbb, + 0x5c, 0x65, 0x37, 0x20, 0xaa, 0xe2, 0x4a, 0x43, 0xf5, 0xb6, 0x79, 0xa0, 0x0b, 0x90, 0xa6, 0x8b, + 0x04, 0xf4, 0xed, 0xe3, 0xeb, 0xbe, 0x01, 0x79, 0x9b, 0x8f, 0x71, 0xeb, 0x94, 0xad, 0x52, 0x4f, + 0xce, 0x43, 0x6b, 0x0f, 0x44, 0x31, 0x45, 0x5e, 0x73, 0x0d, 0x8a, 0x02, 0xe4, 0x47, 0x85, 0x12, + 0xa2, 0x40, 0x36, 0xd6, 0x75, 0x10, 0x90, 0x46, 0x5b, 0x2b, 0x89, 0x3c, 0x92, 0xad, 0xd3, 0x7e, + 0x99, 0x15, 0x67, 0xfe, 0x71, 0x95, 0xa0, 0x7b, 0xb0, 0xe4, 0x09, 0x0c, 0xb1, 0xdf, 0x2d, 0x0a, + 0x21, 0xb1, 0xe3, 0x49, 0x11, 0x9d, 0x1a, 0x21, 0xa2, 0x81, 0xe8, 0xe5, 0x52, 0x46, 0x4f, 0x76, + 0xc2, 0xd8, 0xd1, 0xbb, 0x4b, 0x4b, 0x1e, 0x63, 0x87, 0xee, 0x29, 0x7d, 0x33, 0x27, 0x68, 0xd7, + 0xff, 0xb3, 0xec, 0x9b, 0x5e, 0x3c, 0xf2, 0xb6, 0xf4, 0x87, 0xf2, 0x96, 0xfe, 0x7e, 0xd4, 0xb6, + 0x29, 0x8b, 0x0e, 0x6e, 0xea, 0xbf, 0x9b, 0xfc, 0xa6, 0xbe, 0x25, 0x6d, 0xea, 0x9f, 0x0c, 0x6b, + 0xdd, 0xe8, 0x7d, 0x05, 0x41, 0x10, 0xd3, 0x3e, 0x41, 0x8c, 0xb3, 0xd5, 0x6f, 0xc2, 0x49, 0xc9, + 0x4e, 0x1e, 0xd4, 0x9b, 0x50, 0x10, 0x61, 0x12, 0xdb, 0x7d, 0x7c, 0x54, 0x7d, 0x78, 0xfd, 0xf3, + 0x0b, 0x30, 0x7b, 0x87, 0x5d, 0x31, 0x43, 0x06, 0xcc, 0xf2, 0x1b, 0x52, 0x48, 0x53, 0xc9, 0x87, + 0x6f, 0x5d, 0x95, 0xcf, 0xc7, 0x62, 0x38, 0x51, 0x9c, 0xfc, 0xfb, 0x9f, 0xff, 0xf7, 0xdb, 0xec, + 0x22, 0xcc, 0x53, 0xd0, 0x37, 0x78, 0x01, 0x05, 0x59, 0x50, 0xf0, 0x2e, 0xb1, 0xa0, 0x0b, 0x69, + 0x6e, 0xe5, 0x94, 0x2f, 0x26, 0xa0, 0xe2, 0x15, 0xda, 0x00, 0xfe, 0x1d, 0x12, 0x74, 0x31, 0xba, + 0x63, 0x18, 0x5c, 0xe1, 0xa5, 0x24, 0x58, 0xa2, 0x4e, 0xff, 0x8e, 0x88, 0x5a, 0xe7, 0xc0, 0x9d, + 0x14, 0xb5, 0x4e, 0xc5, 0x55, 0x93, 0x08, 0x9d, 0x2c, 0x86, 0x5b, 0x4d, 0xa7, 0x13, 0x19, 0xc3, + 0xc0, 0x1d, 0x91, 0xc8, 0x18, 0x86, 0x6e, 0x83, 0xc4, 0xc7, 0x90, 0x75, 0x60, 0x2e, 0xa4, 0xb9, + 0x71, 0x11, 0x1d, 0xc3, 0xd0, 0x55, 0x81, 0x44, 0x7f, 0xd2, 0xe5, 0xc5, 0xf8, 0x33, 0xb8, 0xc2, + 0x4b, 0x49, 0xb0, 0x44, 0x9d, 0x7e, 0xf3, 0x5d, 0xad, 0x73, 0xe0, 0x22, 0x80, 0x5a, 0xe7, 0x60, + 0x0f, 0x3f, 0x4a, 0xe7, 0x6b, 0x98, 0x0b, 0x36, 0x0e, 0xd1, 0xe5, 0x94, 0x9d, 0xd0, 0x72, 0x25, + 0x19, 0x18, 0xaf, 0xf9, 0xc7, 0x30, 0x1f, 0xba, 0x26, 0x81, 0x94, 0x33, 0xaa, 0xae, 0x65, 0x94, + 0xaf, 0xa4, 0x40, 0x26, 0x2a, 0x0f, 0x75, 0xd9, 0xd5, 0xca, 0x55, 0x7d, 0x7d, 0xb5, 0x72, 0x65, + 0xcb, 0x3e, 0x46, 0x79, 0xa8, 0x99, 0xae, 0x56, 0xae, 0xea, 0xda, 0xab, 0x95, 0xab, 0x3b, 0xf3, + 0x11, 0xca, 0x7f, 0x9d, 0x09, 0x35, 0xec, 0x45, 0x6f, 0x15, 0x55, 0x53, 0x37, 0x61, 0x99, 0x25, + 0xb5, 0x21, 0x9b, 0xb6, 0xf1, 0x49, 0xcf, 0x3b, 0x3a, 0x91, 0x49, 0x1f, 0xee, 0x02, 0x46, 0x26, + 0xbd, 0xdc, 0xd2, 0x8b, 0x4f, 0x7a, 0xd1, 0x7e, 0x8a, 0x4e, 0x7a, 0xa9, 0x67, 0x16, 0x9d, 0xf4, + 0x72, 0x27, 0x2b, 0x31, 0xe9, 0xc5, 0x82, 0x63, 0x92, 0x5e, 0x5a, 0xf3, 0x95, 0x14, 0xc8, 0x94, + 0x79, 0x17, 0xab, 0x5c, 0xd5, 0x76, 0x8d, 0xcb, 0xbb, 0x94, 0xca, 0x59, 0x9c, 0x79, 0xfd, 0x3d, + 0x32, 0xce, 0xe1, 0xce, 0x46, 0x64, 0x9c, 0xa5, 0xe2, 0x7f, 0x42, 0x9c, 0x45, 0x6b, 0x28, 0x3a, + 0xce, 0x52, 0x3f, 0x2b, 0x3a, 0xce, 0x72, 0x97, 0x29, 0x91, 0x5f, 0xc4, 0x82, 0x63, 0xf8, 0x45, + 0x5a, 0xf3, 0x95, 0x14, 0xc8, 0xc4, 0xcd, 0xd2, 0x6b, 0x4a, 0xa8, 0x37, 0x4b, 0xb9, 0xe5, 0x51, + 0xbe, 0x98, 0x80, 0x4a, 0xf4, 0x73, 0xb0, 0x03, 0xa0, 0xf6, 0xb3, 0xa2, 0xbb, 0x51, 0xae, 0x24, + 0x03, 0xe3, 0x35, 0xf7, 0xa1, 0x18, 0xa8, 0x63, 0xa3, 0x4b, 0xe9, 0x4a, 0xef, 0xe5, 0xcb, 0x89, + 0xb8, 0xc4, 0x05, 0x07, 0xcb, 0xd4, 0xea, 0x05, 0x2b, 0x6a, 0xe2, 0xe5, 0x4a, 0x32, 0x30, 0x51, + 0x73, 0xb0, 0x24, 0xad, 0xd6, 0xac, 0x28, 0x7b, 0x97, 0x2b, 0xc9, 0xc0, 0x34, 0x59, 0xc5, 0x8a, + 0x5a, 0x91, 0x59, 0x15, 0xaa, 0x9a, 0x45, 0x66, 0x95, 0x54, 0x19, 0x4b, 0xca, 0x2a, 0xae, 0x33, + 0x26, 0xab, 0xc2, 0x6a, 0x2b, 0xc9, 0xc0, 0x54, 0x59, 0xc5, 0x0b, 0x9d, 0xd1, 0x59, 0x15, 0xae, + 0xcd, 0x46, 0x67, 0x95, 0x54, 0x31, 0x4d, 0xcc, 0xaa, 0xb8, 0x05, 0x2b, 0x8a, 0xa6, 0x71, 0x59, + 0x95, 0xda, 0xd5, 0xc1, 0x9a, 0x65, 0x5c, 0x56, 0xa5, 0xd0, 0xac, 0x2c, 0x7f, 0x46, 0x6b, 0x0e, + 0x96, 0xe2, 0xd4, 0x9a, 0x15, 0x75, 0x3f, 0xb5, 0x66, 0x55, 0x55, 0x2f, 0x4a, 0xf3, 0xcf, 0x33, + 0xb0, 0x28, 0x55, 0x44, 0xd1, 0xd5, 0x68, 0x47, 0x0e, 0x18, 0xf0, 0xf5, 0x54, 0xd8, 0x64, 0x1b, + 0xa4, 0x7a, 0xa7, 0xda, 0x06, 0x75, 0x89, 0x55, 0x6d, 0x43, 0x54, 0x01, 0x35, 0x3a, 0xd9, 0x03, + 0xd5, 0x1b, 0x14, 0xb5, 0xe5, 0x4a, 0x55, 0xa2, 0xf2, 0xe5, 0x44, 0x5c, 0xbc, 0xda, 0x9f, 0xc2, + 0x42, 0xb8, 0x9e, 0x85, 0x62, 0x36, 0x3e, 0x59, 0xf9, 0xd5, 0x34, 0xd0, 0xc4, 0x1d, 0x3a, 0x54, + 0xe1, 0x40, 0x95, 0xb4, 0xc5, 0x1a, 0xf5, 0x0e, 0xad, 0x2c, 0x97, 0xc4, 0x2c, 0x3e, 0x5c, 0x8a, + 0x45, 0x31, 0xa7, 0xbb, 0x54, 0x8b, 0x57, 0x57, 0x76, 0x63, 0xf4, 0x87, 0x8b, 0xad, 0x28, 0xe6, + 0x80, 0x97, 0x4a, 0x7f, 0x44, 0xed, 0x56, 0xad, 0x7f, 0xad, 0xf4, 0xf6, 0x8b, 0x95, 0x63, 0xff, + 0xfc, 0x62, 0xe5, 0xd8, 0xcf, 0x8e, 0x56, 0x32, 0x6f, 0x8f, 0x56, 0x32, 0xff, 0x38, 0x5a, 0xc9, + 0xfc, 0xfb, 0x68, 0x25, 0xb3, 0x33, 0x43, 0xab, 0x9f, 0xd7, 0xbf, 0x0c, 0x00, 0x00, 0xff, 0xff, + 0x83, 0x6a, 0xc0, 0xe5, 0xab, 0x38, 0x00, 0x00, } diff --git a/api/control.proto b/api/control.proto index 3ad4e63895..bda699cc6d 100644 --- a/api/control.proto +++ b/api/control.proto @@ -50,6 +50,16 @@ service Control { option (docker.protobuf.plugin.tls_authorization) = { roles: "swarm-manager" }; }; + // ListServiceStatuses returns a `ListServiceStatusesResponse` with the + // status of the requested services, formed by computing the number of + // running vs desired tasks. It is provided as a shortcut or helper method, + // which allows a client to avoid having to calculate this value by listing + // all Tasks. If any service requested does not exist, it will be returned + // but with empty status values. + rpc ListServiceStatuses(ListServiceStatusesRequest) returns (ListServiceStatusesResponse) { + option (docker.protobuf.plugin.tls_authorization) = { roles: "swarm-manager" }; + }; + rpc GetNetwork(GetNetworkRequest) returns (GetNetworkResponse) { option (docker.protobuf.plugin.tls_authorization) = { roles: "swarm-manager" }; }; @@ -397,6 +407,37 @@ message ListServicesResponse { repeated Service services = 1; } +// ListServiceStatusesRequest is a request to get the aggregate status of a +// service by computing the number of running vs desired tasks. It includes +// only a service ID. +message ListServiceStatusesRequest { + // Services is a list of service IDs to get statuses for. + repeated string services = 1; +} + +// ListServiceStatusesResponse is a response containing the aggregate status of +// a service, formed by computing the number of running vs desired tasks. The +// values returned are only valid for the point in time at which the request is +// made. +message ListServiceStatusesResponse { + message ServiceStatus { + // ServiceID is the ID of the service this status describes + string service_id = 1; + + // DesiredTasks is the number of tasks desired to be running according to the + // service definition at request time. It is a uint64 because that is what + // the replicas field on the service spec is + uint64 desired_tasks = 2; + + // RunningTasks is the number of tasks currently in the Running state at + // request time. This may be larger than desired tasks if, for example, a + // service has been scaled down. + uint64 running_tasks = 3; + } + + repeated ServiceStatus statuses = 1; +} + message CreateNetworkRequest { NetworkSpec spec = 1; } diff --git a/manager/controlapi/service.go b/manager/controlapi/service.go index 8296821beb..a9e4b35922 100644 --- a/manager/controlapi/service.go +++ b/manager/controlapi/service.go @@ -968,3 +968,67 @@ func (s *Server) ListServices(ctx context.Context, request *api.ListServicesRequ Services: services, }, nil } + +// ListServiceStatuses returns a `ListServiceStatusesResponse` with the status +// of the requested services, formed by computing the number of running vs +// desired tasks. It is provided as a shortcut or helper method, which allows a +// client to avoid having to calculate this value by listing all Tasks. If any +// service requested does not exist, it will be returned but with empty status +// values. +func (s *Server) ListServiceStatuses(ctx context.Context, req *api.ListServiceStatusesRequest) (*api.ListServiceStatusesResponse, error) { + resp := &api.ListServiceStatusesResponse{} + if req == nil { + return resp, nil + } + + s.store.View(func(tx store.ReadTx) { + for _, id := range req.Services { + status := &api.ListServiceStatusesResponse_ServiceStatus{ + ServiceID: id, + } + // no matter what, add this status to the list. + resp.Statuses = append(resp.Statuses, status) + + tasks, findErr := store.FindTasks(tx, store.ByServiceID(id)) + if findErr != nil { + // if there is another kind of error here (not sure what it + // could be) then still return 0/0 for this service. + continue + } + + // use a boolean to see global vs replicated. this avoids us having to + // iterate the task list twice. + global := false + service := store.GetService(tx, id) + // a service might be deleted, but it may still have tasks. in that + // case, we will be using 0 as the desired task count. + if service != nil { + // figure out how many tasks the service requires. for replicated + // services, this is easy: we can just check the replicas field. for + // global services, this is a bit harder and we'll need to do some + // numbercrunchin + if replicated := service.Spec.GetReplicated(); replicated != nil { + status.DesiredTasks = replicated.Replicas + } else { + global = true + } + } + + // now, figure out how many tasks are running. Pretty easy, and + // universal across both global and replicated services + for _, task := range tasks { + if task.Status.State == api.TaskStateRunning { + status.RunningTasks++ + } + // if the service is global, a shortcut for figuring out the + // number of tasks desired is to look at all tasks, and take a + // count of the ones whose desired state is not Shutdown. + if global && task.DesiredState == api.TaskStateRunning { + status.DesiredTasks++ + } + } + } + }) + + return resp, nil +} diff --git a/manager/controlapi/service_test.go b/manager/controlapi/service_test.go index 9ad9c75133..09e6d09f2b 100644 --- a/manager/controlapi/service_test.go +++ b/manager/controlapi/service_test.go @@ -3,11 +3,13 @@ package controlapi import ( "context" "fmt" + "reflect" "strings" "testing" "time" "github.com/docker/swarmkit/api" + "github.com/docker/swarmkit/identity" "github.com/docker/swarmkit/manager/state/store" "github.com/docker/swarmkit/testutils" gogotypes "github.com/gogo/protobuf/types" @@ -1383,3 +1385,216 @@ func TestListServices(t *testing.T) { assert.NoError(t, err) assert.Equal(t, 0, len(r.Services)) } + +func TestListServiceStatuses(t *testing.T) { + ts := newTestServer(t) + defer ts.Stop() + + // Test listing no services is empty and has no error + r, err := ts.Client.ListServiceStatuses( + context.Background(), + &api.ListServiceStatusesRequest{}, + ) + assert.NoError(t, err, "error when listing no services against an empty store") + assert.NotNil(t, r, "response against an empty store was nil") + assert.Empty(t, r.Statuses, "response statuses was not empty") + + // Test listing services that do not exist. We should still get a response, + // but both desired and actual should be 0 + r, err = ts.Client.ListServiceStatuses( + context.Background(), + &api.ListServiceStatusesRequest{Services: []string{"foo"}}, + ) + assert.NoError(t, err, "error listing services that do not exist") + assert.NotNil(t, r, "response for nonexistant services was nil") + assert.Len(t, r.Statuses, 1, "expected 1 status") + assert.Equal( + t, r.Statuses[0], + &api.ListServiceStatusesResponse_ServiceStatus{ServiceID: "foo"}, + ) + + // now test that listing service statuses actually works. + + // justRight will be converged + justRight := createService(t, ts, "justRight", "image", 3) + // notEnough will not have enough tasks in running + notEnough := createService(t, ts, "notEnough", "image", 7) + + // no shortcut for creating a global service + globalSpec := createSpec("global", "image", 0) + globalSpec.Mode = &api.ServiceSpec_Global{Global: &api.GlobalService{}} + + svcResp, svcErr := ts.Client.CreateService( + context.Background(), &api.CreateServiceRequest{Spec: globalSpec}, + ) + assert.NoError(t, svcErr) + + // global will have the right number of tasks + global := svcResp.Service + + global2Spec := globalSpec.Copy() + global2Spec.Annotations.Name = "global2" + + svcResp, svcErr = ts.Client.CreateService( + context.Background(), &api.CreateServiceRequest{Spec: global2Spec}, + ) + assert.NoError(t, svcErr) + + // global2 will not have enough tasks + global2 := svcResp.Service + + // over will have too many tasks running (as would be seen in a scale-down + over := createService(t, ts, "over", "image", 2) + + // now create some tasks. use a quick helper function for this + createTask := func(s *api.Service, actual api.TaskState, desired api.TaskState) *api.Task { + task := &api.Task{ + ID: identity.NewID(), + DesiredState: desired, + Spec: s.Spec.Task, + Status: api.TaskStatus{ + State: actual, + }, + ServiceID: s.ID, + } + + err := ts.Store.Update(func(tx store.Tx) error { + return store.CreateTask(tx, task) + }) + assert.NoError(t, err) + return task + } + + // alias task states for brevity + running := api.TaskStateRunning + shutdown := api.TaskStateShutdown + newt := api.TaskStateNew + failed := api.TaskStateFailed + + // create 3 running tasks for justRight + for i := 0; i < 3; i++ { + createTask(justRight, running, running) + } + // create 2 failed and 2 shutdown tasks + for i := 0; i < 2; i++ { + createTask(justRight, failed, shutdown) + createTask(justRight, shutdown, shutdown) + } + + // create 4 tasks for notEnough + for i := 0; i < 4; i++ { + createTask(notEnough, running, running) + } + // create 3 tasks in new state + for i := 0; i < 3; i++ { + createTask(notEnough, newt, running) + } + // create 1 failed and 1 shutdown task + createTask(notEnough, failed, shutdown) + createTask(notEnough, shutdown, shutdown) + + // create 2 tasks out of 2 desired for global + for i := 0; i < 2; i++ { + createTask(global, running, running) + } + // create 3 shutdown tasks for global + for i := 0; i < 3; i++ { + createTask(global, shutdown, shutdown) + } + + // create 4 out of 5 tasks for global2 + for i := 0; i < 4; i++ { + createTask(global2, running, running) + } + createTask(global2, newt, running) + + // create 6 failed tasks + for i := 0; i < 6; i++ { + createTask(global2, failed, shutdown) + } + + // create 4 out of 2 tasks. no shutdown or failed tasks. this would be the + // case if you did a call immediately after updating the service, before + // the orchestrator had updated the task desired states + for i := 0; i < 4; i++ { + createTask(over, running, running) + } + + // now, create a service that has already been deleted, but has dangling + // tasks + goneSpec := createSpec("gone", "image", 3) + gone := &api.Service{ + ID: identity.NewID(), + Spec: *goneSpec, + } + + for i := 0; i < 3; i++ { + createTask(gone, running, shutdown) + createTask(gone, shutdown, shutdown) + } + + // now list service statuses + r, err = ts.Client.ListServiceStatuses( + context.Background(), + &api.ListServiceStatusesRequest{Services: []string{ + justRight.ID, notEnough.ID, global.ID, global2.ID, over.ID, gone.ID, + }}, + ) + assert.NoError(t, err, "error getting service statuses") + assert.NotNil(t, r, "service status response is nil") + assert.Len(t, r.Statuses, 6) + + expected := map[string]*api.ListServiceStatusesResponse_ServiceStatus{ + "justRight": { + ServiceID: justRight.ID, + DesiredTasks: 3, + RunningTasks: 3, + }, + "notEnough": { + ServiceID: notEnough.ID, + DesiredTasks: 7, + RunningTasks: 4, + }, + "global": { + ServiceID: global.ID, + DesiredTasks: 2, + RunningTasks: 2, + }, + "global2": { + ServiceID: global2.ID, + DesiredTasks: 5, + RunningTasks: 4, + }, + "over": { + ServiceID: over.ID, + DesiredTasks: 2, + RunningTasks: 4, + }, + "gone": { + ServiceID: gone.ID, + DesiredTasks: 0, + RunningTasks: 3, + }, + } + + // compare expected and actual values. make sure all are used by keeping + // track of which we visited. i borrowed this pattern from + // assert.ElementsMatch, which is in a newer version of that library + visited := make([]bool, len(expected)) + for name, expect := range expected { + found := false + for i := 0; i < len(r.Statuses); i++ { + if visited[i] { + continue + } + if reflect.DeepEqual(expect, r.Statuses[i]) { + visited[i] = true + found = true + break + } + } + if !found { + t.Errorf("did not find status for %v in response", name) + } + } +}