bump swarmkit to 415dc72789e2b733ea884f09188c286ca187d8ec

relevant changes:

- swarmkit#2815 Extension and resource API declarations
- swarmkit#2816 Moving swap options into `ResourceRequirements` instead of `ContainerSpec`s
  - relates to moby#37872
- swarmkit#2821 allocator: use a map for network-IDs to prevent O(n2)
- swarmkit#2832 [api] Add created object to return types for extension and resource create apis
- swarmkit#2831 [controlapi] Extension api implementation
- swarmkit#2835 Resource controlapi Implemetation
- swarmkit#2802 Use custom gRPC dialer to override default proxy dialer
  - addresses moby#35395 Swarm worker cannot connect to master if proxy is configured
  - addresses moby#issues/36951 Swarm nodes cannot join as masters if http proxy is set
  - relates to swarmkit#2419 Provide custom gRPC dialer to override default proxy dialer

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
Sebastiaan van Stijn 2019-03-06 16:46:01 +01:00
parent fc01c2b481
commit 667e800b2c
No known key found for this signature in database
GPG Key ID: 76698F39D527CE8C
14 changed files with 5371 additions and 873 deletions

View File

@ -128,7 +128,7 @@ github.com/containerd/ttrpc 2a805f71863501300ae1976d29f0454ae003e85a
github.com/gogo/googleapis 08a7655d27152912db7aaf4f983275eaf8d128ef
# cluster
github.com/docker/swarmkit ebfb0aa1118ebfd35a224d72a5d337ce0addd907
github.com/docker/swarmkit 415dc72789e2b733ea884f09188c286ca187d8ec
github.com/gogo/protobuf v1.0.0
github.com/cloudflare/cfssl 1.3.2
github.com/fernet/fernet-go 1b2437bc582b3cfbb341ee5a29f8ef5b42912ff2

View File

@ -86,6 +86,22 @@
CreateConfigResponse
RemoveConfigRequest
RemoveConfigResponse
CreateExtensionRequest
CreateExtensionResponse
RemoveExtensionRequest
RemoveExtensionResponse
GetExtensionRequest
GetExtensionResponse
CreateResourceRequest
CreateResourceResponse
RemoveResourceRequest
RemoveResourceResponse
UpdateResourceRequest
UpdateResourceResponse
GetResourceRequest
GetResourceResponse
ListResourcesRequest
ListResourcesResponse
SessionRequest
SessionMessage
HeartbeatRequest

File diff suppressed because it is too large Load Diff

View File

@ -6,6 +6,7 @@ import "github.com/docker/swarmkit/api/specs.proto";
import "github.com/docker/swarmkit/api/objects.proto";
import "github.com/docker/swarmkit/api/types.proto";
import "gogoproto/gogo.proto";
import "google/protobuf/any.proto";
import "github.com/docker/swarmkit/protobuf/plugin/plugin.proto";
// Control defines the RPC methods for controlling a cluster.
@ -161,6 +162,80 @@ service Control {
rpc RemoveConfig(RemoveConfigRequest) returns (RemoveConfigResponse) {
option (docker.protobuf.plugin.tls_authorization) = { roles: "swarm-manager" };
}
// --- extension APIs ---
// GetExtension returns a `GetExtensionResponse` with a `Extension` with the same
// id as `GetExtensionRequest.ExtensionId`
// - Returns `NotFound` if the Extension with the given id is not found.
// - Returns `InvalidArgument` if the `GetExtensionRequest.ExtensionId` is empty.
// - Returns an error if the get fails.
rpc GetExtension(GetExtensionRequest) returns (GetExtensionResponse) {
option (docker.protobuf.plugin.tls_authorization) = { roles: "swarm-manager" };
}
// CreateExtension creates an `Extension` based on the provided `CreateExtensionRequest.Extension`
// and returns a `CreateExtensionResponse`.
// - Returns `InvalidArgument` if the `CreateExtensionRequest.Extension` is malformed,
// or fails validation.
// - Returns an error if the creation fails.
rpc CreateExtension(CreateExtensionRequest) returns (CreateExtensionResponse) {
option (docker.protobuf.plugin.tls_authorization) = { roles: "swarm-manager" };
}
// RemoveExtension removes the extension referenced by `RemoveExtensionRequest.ID`.
// - Returns `InvalidArgument` if `RemoveExtensionRequest.ExtensionId` is empty.
// - Returns `NotFound` if the an extension named `RemoveExtensionRequest.ExtensionId` is not found.
// - Returns an error if the deletion fails.
rpc RemoveExtension(RemoveExtensionRequest) returns (RemoveExtensionResponse) {
option (docker.protobuf.plugin.tls_authorization) = { roles: "swarm-manager" };
}
// --- resource APIs ---
// GetResource returns a `GetResourceResponse` with a `Resource` with the same
// id as `GetResourceRequest.Resource`
// - Returns `NotFound` if the Resource with the given id is not found.
// - Returns `InvalidArgument` if the `GetResourceRequest.Resource` is empty.
// - Returns an error if getting fails.
rpc GetResource(GetResourceRequest) returns (GetResourceResponse) {
option (docker.protobuf.plugin.tls_authorization) = { roles: "swarm-manager" };
}
// UpdateResource updates the resource with the given `UpdateResourceRequest.Resource.Id` using the given `UpdateResourceRequest.Resource` and returns a `UpdateResourceResponse`.
// - Returns `NotFound` if the Resource with the given `UpdateResourceRequest.Resource.Id` is not found.
// - Returns `InvalidArgument` if the UpdateResourceRequest.Resource.Id` is empty.
// - Returns an error if updating fails.
rpc UpdateResource(UpdateResourceRequest) returns (UpdateResourceResponse) {
option (docker.protobuf.plugin.tls_authorization) = { roles: "swarm-manager" };
}
// ListResources returns a `ListResourcesResponse` with a list of `Resource`s stored in the raft store,
// or all resources matching any name in `ListConfigsRequest.Names`, any
// name prefix in `ListResourcesRequest.NamePrefixes`, any id in
// `ListResourcesRequest.ResourceIDs`, or any id prefix in `ListResourcesRequest.IDPrefixes`,
// extension name equal to `ListResourcesRequest.Extension`.
// - Returns an error if listing fails.
rpc ListResources(ListResourcesRequest) returns (ListResourcesResponse) {
option (docker.protobuf.plugin.tls_authorization) = { roles: "swarm-manager" };
}
// CreateResource returns a `CreateResourceResponse` after creating a `Resource` based
// on the provided `CreateResourceRequest.Resource`.
// - Returns `InvalidArgument` if the `CreateResourceRequest.Resource` is malformed,
// or if the config data is too long or contains invalid characters.
// - Returns an error if the creation fails.
rpc CreateResource(CreateResourceRequest) returns (CreateResourceResponse) {
option (docker.protobuf.plugin.tls_authorization) = { roles: "swarm-manager" };
}
// RemoveResource removes the `Resource` referenced by `RemoveResourceRequest.ResourceID`.
// - Returns `InvalidArgument` if `RemoveResourceRequest.ResourceID` is empty.
// - Returns `NotFound` if the a resource named `RemoveResourceRequest.ResourceID` is not found.
// - Returns an error if the deletion fails.
rpc RemoveResource(RemoveResourceRequest) returns (RemoveResourceResponse) {
option (docker.protobuf.plugin.tls_authorization) = { roles: "swarm-manager" };
}
}
message GetNodeRequest {
@ -556,3 +631,111 @@ message RemoveConfigRequest {
// RemoveConfigResponse is an empty object indicating the successful removal of
// a config.
message RemoveConfigResponse {}
// CreateExtensionRequest creates a new extension as specified by the provided
// parameters
message CreateExtensionRequest {
Annotations annotations = 1;
string description = 2;
}
// CreateExtensionResponse contains the newly created `Extension` corresponding
// to the parameters in the CreateExtensionRequest.
message CreateExtensionResponse {
Extension extension = 1;
}
// RemoveExtensionRequest contains the ID of the extension that should be removed. This
// removes all versions of the extension.
message RemoveExtensionRequest {
string extension_id = 1;
}
// RemoveExtensionResponse is an empty object indicating the successful removal
// of an extension.
message RemoveExtensionResponse {
}
// GetResourceRequest is the request to get a Extension object given a extension id.
message GetExtensionRequest {
string extension_id = 1;
}
// GetExtensionResponse contains the Extension corresponding to the id in
// `GetExtensionRequest`.
message GetExtensionResponse {
Extension extension = 1;
}
// CreateResourceRequest creates a new resource specified by the included
// resource object. An existing resource will not be updated.
message CreateResourceRequest {
Annotations annotations = 1;
string kind = 2;
google.protobuf.Any payload = 3;
}
// CreateResourceResponse contains the newly created `Resource` corresponding
// to the resource in the CreateResourceRequest.
message CreateResourceResponse {
Resource resource = 1;
}
// RemoveResourceRequest contains the ID of the resource that should be removed. This
// removes all versions of the resource.
message RemoveResourceRequest {
string resource_id = 1;
}
// RemoveResourceResponse is an empty object indicating the successful removal
// of a resource.
message RemoveResourceResponse {
}
// UpdateResourceRequest updates the resource specified by the given resource object.
message UpdateResourceRequest {
string resource_id = 1;
Version resource_version = 2;
// Annotations describes the annotations to update. If the Annotations should
// be unchanged, then this field should be left empty. Note that the name of
// a Resource cannot be changed, only its labels.
Annotations annotations = 3;
// Payload describes the new payload of the resource. If the Payload should
// be unchanged, then this field should be left empty.
google.protobuf.Any payload = 4;
}
message UpdateResourceResponse {
Resource resource = 1;
}
// GetResourceRequest is the request to get a Resource object given a resource id.
message GetResourceRequest {
string resource_id = 1;
}
// GetResourceResponse contains the Resource corresponding to the id in
// `GetResourceRequest`.
message GetResourceResponse {
Resource resource = 1;
}
// 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.
message ListResourcesRequest {
message Filters {
repeated string names = 1;
repeated string id_prefixes = 2;
map<string, string> labels = 3;
repeated string name_prefixes = 4;
string kind = 5;
}
Filters filters = 1;
}
// ListResourcesResponse contains a list of all the resources that match the name or
// name prefix filters provided in `ListResourcesRequest`.
message ListResourcesResponse {
repeated Resource resources = 1;
}

View File

@ -8,7 +8,7 @@ import fmt "fmt"
import math "math"
import google_protobuf "github.com/gogo/protobuf/types"
import _ "github.com/gogo/protobuf/gogoproto"
import google_protobuf3 "github.com/gogo/protobuf/types"
import google_protobuf4 "github.com/gogo/protobuf/types"
import _ "github.com/docker/swarmkit/protobuf/plugin"
import deepcopy "github.com/docker/swarmkit/api/deepcopy"
@ -357,7 +357,7 @@ type Resource struct {
Kind string `protobuf:"bytes,4,opt,name=kind,proto3" json:"kind,omitempty"`
// Payload bytes. This data is not interpreted in any way by SwarmKit.
// By convention, it should be a marshalled protocol buffers message.
Payload *google_protobuf3.Any `protobuf:"bytes,5,opt,name=payload" json:"payload,omitempty"`
Payload *google_protobuf4.Any `protobuf:"bytes,5,opt,name=payload" json:"payload,omitempty"`
}
func (m *Resource) Reset() { *m = Resource{} }
@ -749,7 +749,7 @@ func (m *Resource) CopyFrom(src interface{}) {
deepcopy.Copy(&m.Meta, &o.Meta)
deepcopy.Copy(&m.Annotations, &o.Annotations)
if o.Payload != nil {
m.Payload = &google_protobuf3.Any{}
m.Payload = &google_protobuf4.Any{}
deepcopy.Copy(m.Payload, o.Payload)
}
}
@ -4958,7 +4958,7 @@ func (this *Resource) String() string {
`Meta:` + strings.Replace(strings.Replace(this.Meta.String(), "Meta", "Meta", 1), `&`, ``, 1) + `,`,
`Annotations:` + strings.Replace(strings.Replace(this.Annotations.String(), "Annotations", "Annotations", 1), `&`, ``, 1) + `,`,
`Kind:` + fmt.Sprintf("%v", this.Kind) + `,`,
`Payload:` + strings.Replace(fmt.Sprintf("%v", this.Payload), "Any", "google_protobuf3.Any", 1) + `,`,
`Payload:` + strings.Replace(fmt.Sprintf("%v", this.Payload), "Any", "google_protobuf4.Any", 1) + `,`,
`}`,
}, "")
return s
@ -7976,7 +7976,7 @@ func (m *Resource) Unmarshal(dAtA []byte) error {
return io.ErrUnexpectedEOF
}
if m.Payload == nil {
m.Payload = &google_protobuf3.Any{}
m.Payload = &google_protobuf4.Any{}
}
if err := m.Payload.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err

View File

@ -8,8 +8,8 @@ import fmt "fmt"
import math "math"
import _ "github.com/gogo/protobuf/gogoproto"
import google_protobuf1 "github.com/gogo/protobuf/types"
import google_protobuf3 "github.com/gogo/protobuf/types"
import google_protobuf4 "github.com/gogo/protobuf/types"
import google_protobuf2 "github.com/gogo/protobuf/types"
import deepcopy "github.com/docker/swarmkit/api/deepcopy"
@ -506,7 +506,7 @@ func (*ResourceReference) Descriptor() ([]byte, []int) { return fileDescriptorSp
type GenericRuntimeSpec struct {
Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"`
Payload *google_protobuf3.Any `protobuf:"bytes,2,opt,name=payload" json:"payload,omitempty"`
Payload *google_protobuf4.Any `protobuf:"bytes,2,opt,name=payload" json:"payload,omitempty"`
}
func (m *GenericRuntimeSpec) Reset() { *m = GenericRuntimeSpec{} }
@ -572,7 +572,7 @@ type ContainerSpec struct {
// Privileges specifies security configuration/permissions.
Privileges *Privileges `protobuf:"bytes,22,opt,name=privileges" json:"privileges,omitempty"`
// Init declares that a custom init will be running inside the container, if null, use the daemon's configured settings
Init *google_protobuf4.BoolValue `protobuf:"bytes,23,opt,name=init" json:"init,omitempty"`
Init *google_protobuf2.BoolValue `protobuf:"bytes,23,opt,name=init" json:"init,omitempty"`
// TTY declares that a TTY should be attached to the standard streams,
// including stdin if it is still open.
TTY bool `protobuf:"varint,13,opt,name=tty,proto3" json:"tty,omitempty"`
@ -636,12 +636,6 @@ type ContainerSpec struct {
//
// https://docs.docker.com/engine/reference/commandline/run/#configure-namespaced-kernel-parameters-sysctls-at-runtime
Sysctls map[string]string `protobuf:"bytes,26,rep,name=sysctls" json:"sysctls,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
// Swap limit equal to memory plus swap: '-1' to enable unlimited swap
MemorySwap int64 `protobuf:"varint,27,opt,name=memory_swap,json=memorySwap,proto3" json:"memory_swap,omitempty"`
// Tune container memory swappiness (0 to 100) - if not specified, defaults
// to the container OS's default - generally 60, or the value predefined in
// the image; set to -1 to unset a previously set value
MemorySwappiness *google_protobuf4.Int64Value `protobuf:"bytes,28,opt,name=memory_swappiness,json=memorySwappiness" json:"memory_swappiness,omitempty"`
}
func (m *ContainerSpec) Reset() { *m = ContainerSpec{} }
@ -1084,7 +1078,7 @@ func (m *GenericRuntimeSpec) CopyFrom(src interface{}) {
o := src.(*GenericRuntimeSpec)
*m = *o
if o.Payload != nil {
m.Payload = &google_protobuf3.Any{}
m.Payload = &google_protobuf4.Any{}
deepcopy.Copy(m.Payload, o.Payload)
}
}
@ -1149,7 +1143,7 @@ func (m *ContainerSpec) CopyFrom(src interface{}) {
deepcopy.Copy(m.Privileges, o.Privileges)
}
if o.Init != nil {
m.Init = &google_protobuf4.BoolValue{}
m.Init = &google_protobuf2.BoolValue{}
deepcopy.Copy(m.Init, o.Init)
}
if o.Mounts != nil {
@ -1203,10 +1197,6 @@ func (m *ContainerSpec) CopyFrom(src interface{}) {
}
}
if o.MemorySwappiness != nil {
m.MemorySwappiness = &google_protobuf4.Int64Value{}
deepcopy.Copy(m.MemorySwappiness, o.MemorySwappiness)
}
}
func (m *ContainerSpec_PullOptions) Copy() *ContainerSpec_PullOptions {
@ -2114,25 +2104,6 @@ func (m *ContainerSpec) MarshalTo(dAtA []byte) (int, error) {
i += copy(dAtA[i:], v)
}
}
if m.MemorySwap != 0 {
dAtA[i] = 0xd8
i++
dAtA[i] = 0x1
i++
i = encodeVarintSpecs(dAtA, i, uint64(m.MemorySwap))
}
if m.MemorySwappiness != nil {
dAtA[i] = 0xe2
i++
dAtA[i] = 0x1
i++
i = encodeVarintSpecs(dAtA, i, uint64(m.MemorySwappiness.Size()))
n25, err := m.MemorySwappiness.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n25
}
return i, nil
}
@ -2278,20 +2249,20 @@ func (m *NetworkSpec) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintSpecs(dAtA, i, uint64(m.Annotations.Size()))
n26, err := m.Annotations.MarshalTo(dAtA[i:])
n25, err := m.Annotations.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n26
i += n25
if m.DriverConfig != nil {
dAtA[i] = 0x12
i++
i = encodeVarintSpecs(dAtA, i, uint64(m.DriverConfig.Size()))
n27, err := m.DriverConfig.MarshalTo(dAtA[i:])
n26, err := m.DriverConfig.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n27
i += n26
}
if m.Ipv6Enabled {
dAtA[i] = 0x18
@ -2317,11 +2288,11 @@ func (m *NetworkSpec) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2a
i++
i = encodeVarintSpecs(dAtA, i, uint64(m.IPAM.Size()))
n28, err := m.IPAM.MarshalTo(dAtA[i:])
n27, err := m.IPAM.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n28
i += n27
}
if m.Attachable {
dAtA[i] = 0x30
@ -2344,11 +2315,11 @@ func (m *NetworkSpec) MarshalTo(dAtA []byte) (int, error) {
i++
}
if m.ConfigFrom != nil {
nn29, err := m.ConfigFrom.MarshalTo(dAtA[i:])
nn28, err := m.ConfigFrom.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += nn29
i += nn28
}
return i, nil
}
@ -2379,67 +2350,67 @@ func (m *ClusterSpec) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintSpecs(dAtA, i, uint64(m.Annotations.Size()))
n30, err := m.Annotations.MarshalTo(dAtA[i:])
n29, err := m.Annotations.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n29
dAtA[i] = 0x12
i++
i = encodeVarintSpecs(dAtA, i, uint64(m.AcceptancePolicy.Size()))
n30, err := m.AcceptancePolicy.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n30
dAtA[i] = 0x12
dAtA[i] = 0x1a
i++
i = encodeVarintSpecs(dAtA, i, uint64(m.AcceptancePolicy.Size()))
n31, err := m.AcceptancePolicy.MarshalTo(dAtA[i:])
i = encodeVarintSpecs(dAtA, i, uint64(m.Orchestration.Size()))
n31, err := m.Orchestration.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n31
dAtA[i] = 0x1a
dAtA[i] = 0x22
i++
i = encodeVarintSpecs(dAtA, i, uint64(m.Orchestration.Size()))
n32, err := m.Orchestration.MarshalTo(dAtA[i:])
i = encodeVarintSpecs(dAtA, i, uint64(m.Raft.Size()))
n32, err := m.Raft.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n32
dAtA[i] = 0x22
dAtA[i] = 0x2a
i++
i = encodeVarintSpecs(dAtA, i, uint64(m.Raft.Size()))
n33, err := m.Raft.MarshalTo(dAtA[i:])
i = encodeVarintSpecs(dAtA, i, uint64(m.Dispatcher.Size()))
n33, err := m.Dispatcher.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n33
dAtA[i] = 0x2a
dAtA[i] = 0x32
i++
i = encodeVarintSpecs(dAtA, i, uint64(m.Dispatcher.Size()))
n34, err := m.Dispatcher.MarshalTo(dAtA[i:])
i = encodeVarintSpecs(dAtA, i, uint64(m.CAConfig.Size()))
n34, err := m.CAConfig.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n34
dAtA[i] = 0x32
dAtA[i] = 0x3a
i++
i = encodeVarintSpecs(dAtA, i, uint64(m.CAConfig.Size()))
n35, err := m.CAConfig.MarshalTo(dAtA[i:])
i = encodeVarintSpecs(dAtA, i, uint64(m.TaskDefaults.Size()))
n35, err := m.TaskDefaults.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n35
dAtA[i] = 0x3a
dAtA[i] = 0x42
i++
i = encodeVarintSpecs(dAtA, i, uint64(m.TaskDefaults.Size()))
n36, err := m.TaskDefaults.MarshalTo(dAtA[i:])
i = encodeVarintSpecs(dAtA, i, uint64(m.EncryptionConfig.Size()))
n36, err := m.EncryptionConfig.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n36
dAtA[i] = 0x42
i++
i = encodeVarintSpecs(dAtA, i, uint64(m.EncryptionConfig.Size()))
n37, err := m.EncryptionConfig.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n37
return i, nil
}
@ -2461,11 +2432,11 @@ func (m *SecretSpec) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintSpecs(dAtA, i, uint64(m.Annotations.Size()))
n38, err := m.Annotations.MarshalTo(dAtA[i:])
n37, err := m.Annotations.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n38
i += n37
if len(m.Data) > 0 {
dAtA[i] = 0x12
i++
@ -2476,21 +2447,21 @@ func (m *SecretSpec) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1a
i++
i = encodeVarintSpecs(dAtA, i, uint64(m.Templating.Size()))
n39, err := m.Templating.MarshalTo(dAtA[i:])
n38, err := m.Templating.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n39
i += n38
}
if m.Driver != nil {
dAtA[i] = 0x22
i++
i = encodeVarintSpecs(dAtA, i, uint64(m.Driver.Size()))
n40, err := m.Driver.MarshalTo(dAtA[i:])
n39, err := m.Driver.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n40
i += n39
}
return i, nil
}
@ -2513,11 +2484,11 @@ func (m *ConfigSpec) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintSpecs(dAtA, i, uint64(m.Annotations.Size()))
n41, err := m.Annotations.MarshalTo(dAtA[i:])
n40, err := m.Annotations.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n41
i += n40
if len(m.Data) > 0 {
dAtA[i] = 0x12
i++
@ -2528,11 +2499,11 @@ func (m *ConfigSpec) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1a
i++
i = encodeVarintSpecs(dAtA, i, uint64(m.Templating.Size()))
n42, err := m.Templating.MarshalTo(dAtA[i:])
n41, err := m.Templating.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n42
i += n41
}
return i, nil
}
@ -2858,13 +2829,6 @@ func (m *ContainerSpec) Size() (n int) {
n += mapEntrySize + 2 + sovSpecs(uint64(mapEntrySize))
}
}
if m.MemorySwap != 0 {
n += 2 + sovSpecs(uint64(m.MemorySwap))
}
if m.MemorySwappiness != nil {
l = m.MemorySwappiness.Size()
n += 2 + l + sovSpecs(uint64(l))
}
return n
}
@ -3158,7 +3122,7 @@ func (this *GenericRuntimeSpec) String() string {
}
s := strings.Join([]string{`&GenericRuntimeSpec{`,
`Kind:` + fmt.Sprintf("%v", this.Kind) + `,`,
`Payload:` + strings.Replace(fmt.Sprintf("%v", this.Payload), "Any", "google_protobuf3.Any", 1) + `,`,
`Payload:` + strings.Replace(fmt.Sprintf("%v", this.Payload), "Any", "google_protobuf4.Any", 1) + `,`,
`}`,
}, "")
return s
@ -3220,12 +3184,10 @@ func (this *ContainerSpec) String() string {
`StopSignal:` + fmt.Sprintf("%v", this.StopSignal) + `,`,
`Configs:` + strings.Replace(fmt.Sprintf("%v", this.Configs), "ConfigReference", "ConfigReference", 1) + `,`,
`Privileges:` + strings.Replace(fmt.Sprintf("%v", this.Privileges), "Privileges", "Privileges", 1) + `,`,
`Init:` + strings.Replace(fmt.Sprintf("%v", this.Init), "BoolValue", "google_protobuf4.BoolValue", 1) + `,`,
`Init:` + strings.Replace(fmt.Sprintf("%v", this.Init), "BoolValue", "google_protobuf2.BoolValue", 1) + `,`,
`Isolation:` + fmt.Sprintf("%v", this.Isolation) + `,`,
`PidsLimit:` + fmt.Sprintf("%v", this.PidsLimit) + `,`,
`Sysctls:` + mapStringForSysctls + `,`,
`MemorySwap:` + fmt.Sprintf("%v", this.MemorySwap) + `,`,
`MemorySwappiness:` + strings.Replace(fmt.Sprintf("%v", this.MemorySwappiness), "Int64Value", "google_protobuf4.Int64Value", 1) + `,`,
`}`,
}, "")
return s
@ -4442,7 +4404,7 @@ func (m *GenericRuntimeSpec) Unmarshal(dAtA []byte) error {
return io.ErrUnexpectedEOF
}
if m.Payload == nil {
m.Payload = &google_protobuf3.Any{}
m.Payload = &google_protobuf4.Any{}
}
if err := m.Payload.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
@ -5330,7 +5292,7 @@ func (m *ContainerSpec) Unmarshal(dAtA []byte) error {
return io.ErrUnexpectedEOF
}
if m.Init == nil {
m.Init = &google_protobuf4.BoolValue{}
m.Init = &google_protobuf2.BoolValue{}
}
if err := m.Init.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
@ -5492,58 +5454,6 @@ func (m *ContainerSpec) Unmarshal(dAtA []byte) error {
}
m.Sysctls[mapkey] = mapvalue
iNdEx = postIndex
case 27:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field MemorySwap", wireType)
}
m.MemorySwap = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowSpecs
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.MemorySwap |= (int64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
case 28:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field MemorySwappiness", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowSpecs
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= (int(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthSpecs
}
postIndex := iNdEx + msglen
if postIndex > l {
return io.ErrUnexpectedEOF
}
if m.MemorySwappiness == nil {
m.MemorySwappiness = &google_protobuf4.Int64Value{}
}
if err := m.MemorySwappiness.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipSpecs(dAtA[iNdEx:])
@ -6855,144 +6765,141 @@ var (
func init() { proto.RegisterFile("github.com/docker/swarmkit/api/specs.proto", fileDescriptorSpecs) }
var fileDescriptorSpecs = []byte{
// 2213 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0xcf, 0x6f, 0x1b, 0xb9,
0xf5, 0xb7, 0x6c, 0x59, 0x3f, 0xde, 0xc8, 0x89, 0xcc, 0xcd, 0xee, 0x8e, 0x95, 0xac, 0xad, 0xd5,
0x66, 0xf3, 0xf5, 0xee, 0xe2, 0x2b, 0xa3, 0x6e, 0x90, 0x66, 0x93, 0x6e, 0x5b, 0xc9, 0xd2, 0xda,
0x6a, 0x12, 0x5b, 0xa0, 0x1c, 0xb7, 0x01, 0x0a, 0x08, 0xf4, 0x0c, 0x2d, 0x0d, 0x3c, 0x1a, 0x4e,
0x49, 0xca, 0x81, 0x6e, 0x3d, 0x2e, 0xdc, 0xbf, 0xc1, 0xe8, 0xa1, 0xe8, 0xbd, 0xfd, 0x2f, 0x72,
0x6c, 0x6f, 0xed, 0xc5, 0xe8, 0xfa, 0x5f, 0xe8, 0xad, 0x97, 0x16, 0xe4, 0x70, 0xa4, 0x91, 0x2d,
0xc7, 0x29, 0x9a, 0x43, 0x6f, 0xe4, 0x9b, 0xcf, 0xe7, 0x91, 0x7c, 0xfc, 0xf0, 0xf1, 0x71, 0xe0,
0xcb, 0x9e, 0x27, 0xfb, 0xc3, 0xc3, 0xaa, 0xc3, 0x06, 0x1b, 0x2e, 0x73, 0x8e, 0x29, 0xdf, 0x10,
0xaf, 0x09, 0x1f, 0x1c, 0x7b, 0x72, 0x83, 0x84, 0xde, 0x86, 0x08, 0xa9, 0x23, 0xaa, 0x21, 0x67,
0x92, 0x21, 0x14, 0x01, 0xaa, 0x31, 0xa0, 0x7a, 0xf2, 0x83, 0xd2, 0x4d, 0x7c, 0x39, 0x0a, 0xa9,
0xe1, 0x97, 0xee, 0xf4, 0x58, 0x8f, 0xe9, 0xe6, 0x86, 0x6a, 0x19, 0xeb, 0x6a, 0x8f, 0xb1, 0x9e,
0x4f, 0x37, 0x74, 0xef, 0x70, 0x78, 0xb4, 0xe1, 0x0e, 0x39, 0x91, 0x1e, 0x0b, 0xcc, 0xf7, 0x95,
0xcb, 0xdf, 0x49, 0x30, 0xba, 0x8e, 0xfa, 0x9a, 0x93, 0x30, 0xa4, 0xdc, 0x0c, 0x58, 0x39, 0x4b,
0x43, 0x6e, 0x97, 0xb9, 0xb4, 0x13, 0x52, 0x07, 0x6d, 0x83, 0x45, 0x82, 0x80, 0x49, 0xed, 0x5b,
0xd8, 0xa9, 0x72, 0x6a, 0xdd, 0xda, 0x5c, 0xab, 0x5e, 0x5d, 0x53, 0xb5, 0x36, 0x81, 0xd5, 0xd3,
0x6f, 0xce, 0xd7, 0xe6, 0x70, 0x92, 0x89, 0x7e, 0x0a, 0x05, 0x97, 0x0a, 0x8f, 0x53, 0xb7, 0xcb,
0x99, 0x4f, 0xed, 0xf9, 0x72, 0x6a, 0xfd, 0xd6, 0xe6, 0xbd, 0x59, 0x9e, 0xd4, 0xe0, 0x98, 0xf9,
0x14, 0x5b, 0x86, 0xa1, 0x3a, 0x68, 0x1b, 0x60, 0x40, 0x07, 0x87, 0x94, 0x8b, 0xbe, 0x17, 0xda,
0x0b, 0x9a, 0xfe, 0x7f, 0xd7, 0xd1, 0xd5, 0xdc, 0xab, 0x2f, 0xc6, 0x70, 0x9c, 0xa0, 0xa2, 0x17,
0x50, 0x20, 0x27, 0xc4, 0xf3, 0xc9, 0xa1, 0xe7, 0x7b, 0x72, 0x64, 0xa7, 0xb5, 0xab, 0x2f, 0xde,
0xea, 0xaa, 0x96, 0x20, 0xe0, 0x29, 0x7a, 0xc5, 0x05, 0x98, 0x0c, 0x84, 0x1e, 0x40, 0xb6, 0xdd,
0xdc, 0x6d, 0xb4, 0x76, 0xb7, 0x8b, 0x73, 0xa5, 0x95, 0xd3, 0xb3, 0xf2, 0x87, 0xca, 0xc7, 0x04,
0xd0, 0xa6, 0x81, 0xeb, 0x05, 0x3d, 0xb4, 0x0e, 0xb9, 0xda, 0xd6, 0x56, 0xb3, 0xbd, 0xdf, 0x6c,
0x14, 0x53, 0xa5, 0xd2, 0xe9, 0x59, 0xf9, 0xa3, 0x69, 0x60, 0xcd, 0x71, 0x68, 0x28, 0xa9, 0x5b,
0x4a, 0x7f, 0xf7, 0xfb, 0xd5, 0xb9, 0xca, 0x77, 0x29, 0x28, 0x24, 0x27, 0x81, 0x1e, 0x40, 0xa6,
0xb6, 0xb5, 0xdf, 0x3a, 0x68, 0x16, 0xe7, 0x26, 0xf4, 0x24, 0xa2, 0xe6, 0x48, 0xef, 0x84, 0xa2,
0xfb, 0xb0, 0xd8, 0xae, 0xbd, 0xec, 0x34, 0x8b, 0xa9, 0xc9, 0x74, 0x92, 0xb0, 0x36, 0x19, 0x0a,
0x8d, 0x6a, 0xe0, 0x5a, 0x6b, 0xb7, 0x38, 0x3f, 0x1b, 0xd5, 0xe0, 0xc4, 0x0b, 0xcc, 0x54, 0x7e,
0x97, 0x06, 0xab, 0x43, 0xf9, 0x89, 0xe7, 0xbc, 0x67, 0x89, 0x3c, 0x82, 0xb4, 0x24, 0xe2, 0x58,
0x4b, 0xc3, 0x9a, 0x2d, 0x8d, 0x7d, 0x22, 0x8e, 0xd5, 0xa0, 0x86, 0xae, 0xf1, 0x4a, 0x19, 0x9c,
0x86, 0xbe, 0xe7, 0x10, 0x49, 0x5d, 0xad, 0x0c, 0x6b, 0xf3, 0xf3, 0x59, 0x6c, 0x3c, 0x46, 0x99,
0xf9, 0xef, 0xcc, 0xe1, 0x04, 0x15, 0x3d, 0x85, 0x4c, 0xcf, 0x67, 0x87, 0xc4, 0xd7, 0x9a, 0xb0,
0x36, 0x3f, 0x9d, 0xe5, 0x64, 0x5b, 0x23, 0x26, 0x0e, 0x0c, 0x05, 0x3d, 0x86, 0xcc, 0x30, 0x74,
0x89, 0xa4, 0x76, 0x46, 0x93, 0xcb, 0xb3, 0xc8, 0x2f, 0x35, 0x62, 0x8b, 0x05, 0x47, 0x5e, 0x0f,
0x1b, 0x3c, 0x7a, 0x06, 0xb9, 0x80, 0xca, 0xd7, 0x8c, 0x1f, 0x0b, 0x3b, 0x5b, 0x5e, 0x58, 0xb7,
0x36, 0xbf, 0x9a, 0x29, 0xc6, 0x08, 0x53, 0x93, 0x92, 0x38, 0xfd, 0x01, 0x0d, 0x64, 0xe4, 0xa6,
// 2166 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0x4d, 0x6f, 0x1b, 0xc9,
0xd1, 0x16, 0x25, 0x8a, 0x1f, 0x35, 0x94, 0x4d, 0xf5, 0xda, 0xde, 0x11, 0x6d, 0x4b, 0x34, 0xd7,
0xeb, 0x57, 0xbb, 0x8b, 0x97, 0x42, 0x94, 0xc5, 0xc6, 0x6b, 0x67, 0x93, 0x90, 0x22, 0x57, 0x62,
0x6c, 0x4b, 0x44, 0x53, 0x56, 0x62, 0x20, 0x00, 0xd1, 0x9a, 0x69, 0x91, 0x03, 0x0d, 0xa7, 0x27,
0xdd, 0x4d, 0x19, 0xbc, 0xe5, 0xb8, 0x50, 0x7e, 0x83, 0x90, 0x43, 0x90, 0x7b, 0xf2, 0x2f, 0x7c,
0xcc, 0x31, 0xb9, 0x08, 0x59, 0x1d, 0xf2, 0x07, 0x72, 0xcb, 0x25, 0x41, 0xf7, 0xf4, 0xf0, 0x43,
0x1e, 0x59, 0x0e, 0xe2, 0x43, 0x6e, 0xdd, 0x35, 0xcf, 0x53, 0xfd, 0xf5, 0x54, 0x75, 0xf5, 0xc0,
0xe7, 0x3d, 0x4f, 0xf6, 0x87, 0x87, 0x55, 0x87, 0x0d, 0x36, 0x5c, 0xe6, 0x1c, 0x53, 0xbe, 0x21,
0x5e, 0x13, 0x3e, 0x38, 0xf6, 0xe4, 0x06, 0x09, 0xbd, 0x0d, 0x11, 0x52, 0x47, 0x54, 0x43, 0xce,
0x24, 0x43, 0x28, 0x02, 0x54, 0x63, 0x40, 0xf5, 0xe4, 0x07, 0xa5, 0xeb, 0xf8, 0x72, 0x14, 0x52,
0xc3, 0x2f, 0xdd, 0xea, 0xb1, 0x1e, 0xd3, 0xcd, 0x0d, 0xd5, 0x32, 0xd6, 0xd5, 0x1e, 0x63, 0x3d,
0x9f, 0x6e, 0xe8, 0xde, 0xe1, 0xf0, 0x68, 0xc3, 0x1d, 0x72, 0x22, 0x3d, 0x16, 0x98, 0xef, 0x2b,
0x97, 0xbf, 0x93, 0x60, 0x74, 0x15, 0xf5, 0x35, 0x27, 0x61, 0x48, 0xb9, 0x19, 0xb0, 0x72, 0x96,
0x86, 0xdc, 0x2e, 0x73, 0x69, 0x27, 0xa4, 0x0e, 0xda, 0x06, 0x8b, 0x04, 0x01, 0x93, 0xda, 0xb7,
0xb0, 0x53, 0xe5, 0xd4, 0xba, 0xb5, 0xb9, 0x56, 0x7d, 0x7b, 0x4d, 0xd5, 0xda, 0x04, 0x56, 0x4f,
0xbf, 0x39, 0x5f, 0x9b, 0xc3, 0xd3, 0x4c, 0xf4, 0x53, 0x28, 0xb8, 0x54, 0x78, 0x9c, 0xba, 0x5d,
0xce, 0x7c, 0x6a, 0xcf, 0x97, 0x53, 0xeb, 0x37, 0x36, 0xef, 0x25, 0x79, 0x52, 0x83, 0x63, 0xe6,
0x53, 0x6c, 0x19, 0x86, 0xea, 0xa0, 0x6d, 0x80, 0x01, 0x1d, 0x1c, 0x52, 0x2e, 0xfa, 0x5e, 0x68,
0x2f, 0x68, 0xfa, 0xff, 0x5d, 0x45, 0x57, 0x73, 0xaf, 0xbe, 0x18, 0xc3, 0xf1, 0x14, 0x15, 0xbd,
0x80, 0x02, 0x39, 0x21, 0x9e, 0x4f, 0x0e, 0x3d, 0xdf, 0x93, 0x23, 0x3b, 0xad, 0x5d, 0x7d, 0xf6,
0x4e, 0x57, 0xb5, 0x29, 0x02, 0x9e, 0xa1, 0x57, 0x5c, 0x80, 0xc9, 0x40, 0xe8, 0x11, 0x64, 0xdb,
0xcd, 0xdd, 0x46, 0x6b, 0x77, 0xbb, 0x38, 0x57, 0x5a, 0x39, 0x3d, 0x2b, 0xdf, 0x56, 0x3e, 0x26,
0x80, 0x36, 0x0d, 0x5c, 0x2f, 0xe8, 0xa1, 0x75, 0xc8, 0xd5, 0xb6, 0xb6, 0x9a, 0xed, 0xfd, 0x66,
0xa3, 0x98, 0x2a, 0x95, 0x4e, 0xcf, 0xca, 0x77, 0x66, 0x81, 0x35, 0xc7, 0xa1, 0xa1, 0xa4, 0x6e,
0x29, 0xfd, 0xdd, 0xef, 0x57, 0xe7, 0x2a, 0xdf, 0xa5, 0xa0, 0x30, 0x3d, 0x09, 0xf4, 0x08, 0x32,
0xb5, 0xad, 0xfd, 0xd6, 0x41, 0xb3, 0x38, 0x37, 0xa1, 0x4f, 0x23, 0x6a, 0x8e, 0xf4, 0x4e, 0x28,
0x7a, 0x08, 0x8b, 0xed, 0xda, 0xcb, 0x4e, 0xb3, 0x98, 0x9a, 0x4c, 0x67, 0x1a, 0xd6, 0x26, 0x43,
0xa1, 0x51, 0x0d, 0x5c, 0x6b, 0xed, 0x16, 0xe7, 0x93, 0x51, 0x0d, 0x4e, 0xbc, 0xc0, 0x4c, 0xe5,
0x77, 0x69, 0xb0, 0x3a, 0x94, 0x9f, 0x78, 0xce, 0x07, 0x96, 0xc8, 0x57, 0x90, 0x96, 0x44, 0x1c,
0x6b, 0x69, 0x58, 0xc9, 0xd2, 0xd8, 0x27, 0xe2, 0x58, 0x0d, 0x6a, 0xe8, 0x1a, 0xaf, 0x94, 0xc1,
0x69, 0xe8, 0x7b, 0x0e, 0x91, 0xd4, 0xd5, 0xca, 0xb0, 0x36, 0x3f, 0x4d, 0x62, 0xe3, 0x31, 0xca,
0xcc, 0x7f, 0x67, 0x0e, 0x4f, 0x51, 0xd1, 0x53, 0xc8, 0xf4, 0x7c, 0x76, 0x48, 0x7c, 0xad, 0x09,
0x6b, 0xf3, 0x41, 0x92, 0x93, 0x6d, 0x8d, 0x98, 0x38, 0x30, 0x14, 0xf4, 0x18, 0x32, 0xc3, 0xd0,
0x25, 0x92, 0xda, 0x19, 0x4d, 0x2e, 0x27, 0x91, 0x5f, 0x6a, 0xc4, 0x16, 0x0b, 0x8e, 0xbc, 0x1e,
0x36, 0x78, 0xf4, 0x0c, 0x72, 0x01, 0x95, 0xaf, 0x19, 0x3f, 0x16, 0x76, 0xb6, 0xbc, 0xb0, 0x6e,
0x6d, 0x7e, 0x91, 0x28, 0xc6, 0x08, 0x53, 0x93, 0x92, 0x38, 0xfd, 0x01, 0x0d, 0x64, 0xe4, 0xa6,
0x3e, 0x6f, 0xa7, 0xf0, 0xd8, 0x01, 0xfa, 0x31, 0xe4, 0x68, 0xe0, 0x86, 0xcc, 0x0b, 0xa4, 0x9d,
0xbb, 0x7e, 0x22, 0x4d, 0x83, 0x51, 0xc1, 0xc4, 0x63, 0x86, 0x62, 0x73, 0xe6, 0xfb, 0x87, 0xc4,
0x39, 0xb6, 0xf3, 0xef, 0xb8, 0x8c, 0x31, 0xa3, 0x9e, 0x81, 0xf4, 0x80, 0xb9, 0xb4, 0xb2, 0x01,
0xcb, 0x57, 0x42, 0x8d, 0x4a, 0x90, 0x33, 0xa1, 0x8e, 0x34, 0x92, 0xc6, 0xe3, 0x7e, 0xe5, 0x36,
0x2c, 0x4d, 0x85, 0xb5, 0xf2, 0xc7, 0x45, 0xc8, 0xc5, 0x7b, 0x8d, 0x6a, 0x90, 0x77, 0x58, 0x20,
0x89, 0x17, 0x50, 0x6e, 0xe4, 0x35, 0x73, 0x67, 0xb6, 0x62, 0x90, 0x62, 0xed, 0xcc, 0xe1, 0x09,
0x0b, 0x7d, 0x0b, 0x79, 0x4e, 0x05, 0x1b, 0x72, 0x87, 0x0a, 0xa3, 0xaf, 0xf5, 0xd9, 0x0a, 0x89,
0x40, 0x98, 0xfe, 0x7a, 0xe8, 0x71, 0xaa, 0xa2, 0x2c, 0xf0, 0x84, 0x8a, 0x9e, 0x42, 0x96, 0x53,
0x21, 0x09, 0x97, 0x6f, 0x93, 0x08, 0x8e, 0x20, 0x6d, 0xe6, 0x7b, 0xce, 0x08, 0xc7, 0x0c, 0xf4,
0x14, 0xf2, 0xa1, 0x4f, 0x1c, 0xed, 0xd5, 0x5e, 0xd4, 0xf4, 0x4f, 0x66, 0xd1, 0xdb, 0x31, 0x08,
0x4f, 0xf0, 0xe8, 0x6b, 0x00, 0x9f, 0xf5, 0xba, 0x2e, 0xf7, 0x4e, 0x28, 0x37, 0x12, 0x2b, 0xcd,
0x62, 0x37, 0x34, 0x02, 0xe7, 0x7d, 0xd6, 0x8b, 0x9a, 0x68, 0xfb, 0xbf, 0xd2, 0x57, 0x42, 0x5b,
0xcf, 0x00, 0xc8, 0xf8, 0xab, 0x51, 0xd7, 0x17, 0xef, 0xe4, 0xca, 0xec, 0x48, 0x82, 0x8e, 0x3e,
0x85, 0xc2, 0x11, 0xe3, 0x0e, 0xed, 0x9a, 0x53, 0x93, 0xd7, 0x9a, 0xb0, 0xb4, 0x2d, 0xd2, 0x17,
0xaa, 0x43, 0xb6, 0x47, 0x03, 0xca, 0x3d, 0xc7, 0x06, 0x3d, 0xd8, 0x83, 0x99, 0x07, 0x32, 0x82,
0xe0, 0x61, 0x20, 0xbd, 0x01, 0x35, 0x23, 0xc5, 0x44, 0xf4, 0x2b, 0xf8, 0x20, 0xde, 0xbe, 0x2e,
0xa7, 0x47, 0x94, 0xd3, 0x40, 0x69, 0xc0, 0xd2, 0x71, 0xf8, 0xfc, 0xed, 0x1a, 0x30, 0x68, 0x93,
0xbb, 0x7a, 0x22, 0x4d, 0x83, 0x51, 0x9b, 0x89, 0xc7, 0x0c, 0xc5, 0xe6, 0xcc, 0xf7, 0x0f, 0x89,
0x73, 0x6c, 0xe7, 0xdf, 0x73, 0x19, 0x63, 0x46, 0x3d, 0x03, 0xe9, 0x01, 0x73, 0x69, 0x65, 0x03,
0x96, 0xdf, 0xda, 0x6a, 0x54, 0x82, 0x9c, 0xd9, 0xea, 0x48, 0x23, 0x69, 0x3c, 0xee, 0x57, 0x6e,
0xc2, 0xd2, 0xcc, 0xb6, 0x56, 0xfe, 0xb8, 0x08, 0xb9, 0xf8, 0xac, 0x51, 0x0d, 0xf2, 0x0e, 0x0b,
0x24, 0xf1, 0x02, 0xca, 0x8d, 0xbc, 0x12, 0x4f, 0x66, 0x2b, 0x06, 0x29, 0xd6, 0xce, 0x1c, 0x9e,
0xb0, 0xd0, 0xb7, 0x90, 0xe7, 0x54, 0xb0, 0x21, 0x77, 0xa8, 0x30, 0xfa, 0x5a, 0x4f, 0x56, 0x48,
0x04, 0xc2, 0xf4, 0xd7, 0x43, 0x8f, 0x53, 0xb5, 0xcb, 0x02, 0x4f, 0xa8, 0xe8, 0x29, 0x64, 0x39,
0x15, 0x92, 0x70, 0xf9, 0x2e, 0x89, 0xe0, 0x08, 0xd2, 0x66, 0xbe, 0xe7, 0x8c, 0x70, 0xcc, 0x40,
0x4f, 0x21, 0x1f, 0xfa, 0xc4, 0xd1, 0x5e, 0xed, 0x45, 0x4d, 0xbf, 0x9f, 0x44, 0x6f, 0xc7, 0x20,
0x3c, 0xc1, 0xa3, 0xaf, 0x01, 0x7c, 0xd6, 0xeb, 0xba, 0xdc, 0x3b, 0xa1, 0xdc, 0x48, 0xac, 0x94,
0xc4, 0x6e, 0x68, 0x04, 0xce, 0xfb, 0xac, 0x17, 0x35, 0xd1, 0xf6, 0x7f, 0xa5, 0xaf, 0x29, 0x6d,
0x3d, 0x03, 0x20, 0xe3, 0xaf, 0x46, 0x5d, 0x9f, 0xbd, 0x97, 0x2b, 0x73, 0x22, 0x53, 0x74, 0xf4,
0x00, 0x0a, 0x47, 0x8c, 0x3b, 0xb4, 0x6b, 0xa2, 0x26, 0xaf, 0x35, 0x61, 0x69, 0x5b, 0xa4, 0x2f,
0x54, 0x87, 0x6c, 0x8f, 0x06, 0x94, 0x7b, 0x8e, 0x0d, 0x7a, 0xb0, 0x47, 0x89, 0x01, 0x19, 0x41,
0xf0, 0x30, 0x90, 0xde, 0x80, 0x9a, 0x91, 0x62, 0x22, 0xfa, 0x15, 0x7c, 0x14, 0x1f, 0x5f, 0x97,
0xd3, 0x23, 0xca, 0x69, 0xa0, 0x34, 0x60, 0xe9, 0x7d, 0xf8, 0xf4, 0xdd, 0x1a, 0x30, 0x68, 0x93,
0x6c, 0x10, 0xbf, 0xfc, 0x41, 0xd4, 0xf3, 0x90, 0xe5, 0xd1, 0xb8, 0x95, 0xdf, 0xa6, 0x94, 0xea,
0x2f, 0x21, 0xd0, 0x06, 0x58, 0xe3, 0xe1, 0x3d, 0x57, 0xab, 0x37, 0x5f, 0xbf, 0x75, 0x71, 0xbe,
0x2f, 0x21, 0xd0, 0x06, 0x58, 0xe3, 0xe1, 0x3d, 0x57, 0xab, 0x37, 0x5f, 0xbf, 0x71, 0x71, 0xbe,
0x06, 0x31, 0xb6, 0xd5, 0x50, 0x39, 0xc8, 0xb4, 0x5d, 0xd4, 0x84, 0xa5, 0x31, 0x41, 0x95, 0x01,
0xe6, 0xa2, 0x2c, 0xbf, 0x6d, 0xa6, 0xfb, 0xa3, 0x90, 0xe2, 0x02, 0x4f, 0xf4, 0x2a, 0xbf, 0x04,
0x74, 0x35, 0x2e, 0x08, 0x41, 0xfa, 0xd8, 0x0b, 0xcc, 0x34, 0xb0, 0x6e, 0xa3, 0x2a, 0x64, 0x43,
0x32, 0xf2, 0x19, 0x71, 0xcd, 0xc1, 0xb8, 0x53, 0x8d, 0x0a, 0x84, 0x6a, 0x5c, 0x20, 0x54, 0x6b,
0xc1, 0x08, 0xc7, 0xa0, 0xca, 0x33, 0xf8, 0x70, 0xe6, 0xf6, 0xa2, 0x4d, 0x28, 0x8c, 0x0f, 0xdc,
0x64, 0xad, 0xb7, 0x2f, 0xce, 0xd7, 0xac, 0xf1, 0xc9, 0x6c, 0x35, 0xb0, 0x35, 0x06, 0xb5, 0xdc,
0xca, 0x5f, 0x96, 0x60, 0x69, 0xea, 0xd8, 0xa2, 0x3b, 0xb0, 0xe8, 0x0d, 0x48, 0x8f, 0x9a, 0x39,
0x46, 0x1d, 0xd4, 0x84, 0x8c, 0x4f, 0x0e, 0xa9, 0xaf, 0x0e, 0xaf, 0xda, 0xb8, 0xff, 0xbf, 0xf1,
0xfc, 0x57, 0x9f, 0x6b, 0x7c, 0x33, 0x90, 0x7c, 0x84, 0x0d, 0x19, 0xd9, 0x90, 0x75, 0xd8, 0x60,
0x40, 0x02, 0x75, 0x4d, 0x2c, 0xac, 0xe7, 0x71, 0xdc, 0x55, 0x91, 0x21, 0xbc, 0x27, 0xec, 0xb4,
0x36, 0xeb, 0x36, 0x2a, 0xc2, 0x02, 0x0d, 0x4e, 0xec, 0x45, 0x6d, 0x52, 0x4d, 0x65, 0x71, 0xbd,
0xe8, 0xf4, 0xe5, 0xb1, 0x6a, 0x2a, 0xde, 0x50, 0x50, 0x6e, 0x67, 0xa3, 0x88, 0xaa, 0x36, 0xfa,
0x11, 0x64, 0x06, 0x6c, 0x18, 0x48, 0x61, 0xe7, 0xf4, 0x64, 0x57, 0x66, 0x4d, 0xf6, 0x85, 0x42,
0x18, 0x65, 0x19, 0x38, 0x6a, 0xc2, 0xb2, 0x90, 0x2c, 0xec, 0xf6, 0x38, 0x71, 0x68, 0x37, 0xa4,
0xdc, 0x63, 0xae, 0x49, 0xc3, 0x2b, 0x57, 0x36, 0xa5, 0x61, 0x0a, 0x3e, 0x7c, 0x5b, 0x71, 0xb6,
0x15, 0xa5, 0xad, 0x19, 0xa8, 0x0d, 0x85, 0x70, 0xe8, 0xfb, 0x5d, 0x16, 0x46, 0x37, 0x72, 0x74,
0x76, 0xde, 0x21, 0x64, 0xed, 0xa1, 0xef, 0xef, 0x45, 0x24, 0x6c, 0x85, 0x93, 0x0e, 0xfa, 0x08,
0x32, 0x3d, 0xce, 0x86, 0x61, 0x74, 0x6e, 0xf2, 0xd8, 0xf4, 0xd0, 0x37, 0x90, 0x15, 0xd4, 0xe1,
0x54, 0x0a, 0xbb, 0xa0, 0x97, 0xfa, 0xd9, 0xac, 0x41, 0x3a, 0x1a, 0x32, 0x3e, 0x13, 0x38, 0xe6,
0xa0, 0x15, 0x58, 0x90, 0x72, 0x64, 0x2f, 0x95, 0x53, 0xeb, 0xb9, 0x7a, 0xf6, 0xe2, 0x7c, 0x6d,
0x61, 0x7f, 0xff, 0x15, 0x56, 0x36, 0x75, 0x5b, 0xf4, 0x99, 0x90, 0x01, 0x19, 0x50, 0xfb, 0x96,
0x8e, 0xed, 0xb8, 0x8f, 0x5e, 0x01, 0xb8, 0x81, 0xe8, 0x3a, 0x3a, 0x3d, 0xd9, 0xb7, 0xf5, 0xea,
0xbe, 0xba, 0x79, 0x75, 0x8d, 0xdd, 0x8e, 0xb9, 0x31, 0x97, 0x2e, 0xce, 0xd7, 0xf2, 0xe3, 0x2e,
0xce, 0xbb, 0x81, 0x88, 0x9a, 0xa8, 0x0e, 0x56, 0x9f, 0x12, 0x5f, 0xf6, 0x9d, 0x3e, 0x75, 0x8e,
0xed, 0xe2, 0xf5, 0x57, 0xe0, 0x8e, 0x86, 0x19, 0x0f, 0x49, 0x92, 0x52, 0xb0, 0x9a, 0xaa, 0xb0,
0x97, 0x75, 0xac, 0xa2, 0x0e, 0xfa, 0x04, 0x80, 0x85, 0x34, 0xe8, 0x0a, 0xe9, 0x7a, 0x81, 0x8d,
0xd4, 0x92, 0x71, 0x5e, 0x59, 0x3a, 0xca, 0x80, 0xee, 0xaa, 0x0b, 0x8a, 0xb8, 0x5d, 0x16, 0xf8,
0x23, 0xfb, 0x03, 0xfd, 0x35, 0xa7, 0x0c, 0x7b, 0x81, 0x3f, 0x42, 0x6b, 0x60, 0x69, 0x5d, 0x08,
0xaf, 0x17, 0x10, 0xdf, 0xbe, 0xa3, 0xe3, 0x01, 0xca, 0xd4, 0xd1, 0x16, 0xb5, 0x0f, 0x51, 0x34,
0x84, 0xfd, 0xe1, 0xf5, 0xfb, 0x60, 0x26, 0x3b, 0xd9, 0x07, 0xc3, 0x41, 0x3f, 0x01, 0x08, 0xb9,
0x77, 0xe2, 0xf9, 0xb4, 0x47, 0x85, 0xfd, 0x91, 0x5e, 0xf4, 0xea, 0xcc, 0x9b, 0x69, 0x8c, 0xc2,
0x09, 0x06, 0xaa, 0x42, 0xda, 0x0b, 0x3c, 0x69, 0x7f, 0x6c, 0x6e, 0xa5, 0xcb, 0x52, 0xad, 0x33,
0xe6, 0x1f, 0x10, 0x7f, 0x48, 0xb1, 0xc6, 0xa1, 0x16, 0xe4, 0x3d, 0xc1, 0x7c, 0x2d, 0x5f, 0xdb,
0xd6, 0xf9, 0xed, 0x1d, 0xf6, 0xaf, 0x15, 0x53, 0xf0, 0x84, 0x8d, 0xee, 0x41, 0x3e, 0xf4, 0x5c,
0xf1, 0xdc, 0x1b, 0x78, 0xd2, 0x5e, 0x29, 0xa7, 0xd6, 0x17, 0xf0, 0xc4, 0x80, 0x76, 0x20, 0x2b,
0x46, 0xc2, 0x91, 0xbe, 0xb0, 0x4b, 0x3a, 0x2e, 0xd5, 0x9b, 0x87, 0xe9, 0x44, 0x84, 0x28, 0x71,
0xc4, 0x74, 0xb5, 0x05, 0x03, 0x3a, 0x60, 0x7c, 0xd4, 0x15, 0xaf, 0x49, 0x68, 0xdf, 0xd5, 0x23,
0x41, 0x64, 0xea, 0xbc, 0x26, 0x21, 0xda, 0x81, 0xe5, 0x04, 0x20, 0xf4, 0x02, 0x2a, 0x84, 0x7d,
0x4f, 0x07, 0xe4, 0xee, 0x95, 0x80, 0xb4, 0x02, 0xf9, 0xe8, 0x61, 0x14, 0x91, 0xe2, 0xc4, 0x47,
0x44, 0x2a, 0x7d, 0x0d, 0x56, 0x22, 0x77, 0xa9, 0x9c, 0x73, 0x4c, 0x47, 0x26, 0x1d, 0xaa, 0xa6,
0x12, 0xd8, 0x89, 0xe2, 0xea, 0x7c, 0x9d, 0xc7, 0x51, 0xe7, 0xc9, 0xfc, 0xe3, 0x54, 0x69, 0x13,
0xac, 0xc4, 0x19, 0x46, 0x9f, 0xa9, 0xbb, 0xa4, 0xe7, 0x09, 0xc9, 0x47, 0x5d, 0x32, 0x94, 0x7d,
0xfb, 0x67, 0x9a, 0x50, 0x88, 0x8d, 0xb5, 0xa1, 0xec, 0x97, 0xba, 0x30, 0x39, 0x0a, 0xa8, 0x0c,
0x96, 0x3a, 0x62, 0x82, 0xf2, 0x13, 0xca, 0x55, 0x9d, 0xa6, 0x14, 0x9c, 0x34, 0xa9, 0x54, 0x20,
0x28, 0xe1, 0x4e, 0x5f, 0x67, 0xe2, 0x3c, 0x36, 0x3d, 0x95, 0x5a, 0xe3, 0x7c, 0x63, 0x52, 0xab,
0xe9, 0x96, 0x9e, 0x40, 0x21, 0x19, 0xd3, 0xff, 0x64, 0x41, 0x95, 0x3f, 0xa5, 0x20, 0x3f, 0xde,
0x77, 0xf4, 0x10, 0x96, 0x5b, 0x9d, 0xbd, 0xe7, 0xb5, 0xfd, 0xd6, 0xde, 0x6e, 0xb7, 0xd1, 0xfc,
0xb6, 0xf6, 0xf2, 0xf9, 0x7e, 0x71, 0xae, 0xf4, 0xc9, 0xe9, 0x59, 0x79, 0x65, 0x72, 0xc5, 0xc4,
0xf0, 0x06, 0x3d, 0x22, 0x43, 0x5f, 0x4e, 0xb3, 0xda, 0x78, 0x6f, 0xab, 0xd9, 0xe9, 0x14, 0x53,
0xd7, 0xb1, 0xda, 0x9c, 0x39, 0x54, 0x08, 0xb4, 0x09, 0xc5, 0x09, 0x6b, 0xe7, 0x55, 0xbb, 0x89,
0x0f, 0x8a, 0xf3, 0xa5, 0x7b, 0xa7, 0x67, 0x65, 0xfb, 0x2a, 0x69, 0x67, 0x14, 0x52, 0x7e, 0x60,
0xde, 0x47, 0xff, 0x48, 0x41, 0x21, 0x59, 0x5e, 0xa3, 0xad, 0xa8, 0x2c, 0xd6, 0x2b, 0xbe, 0xb5,
0xb9, 0x71, 0x53, 0x39, 0xae, 0xaf, 0x75, 0x7f, 0xa8, 0xfc, 0xbe, 0x50, 0x2f, 0x61, 0x4d, 0x46,
0x0f, 0x61, 0x31, 0x64, 0x5c, 0xc6, 0x17, 0xe0, 0xec, 0xe3, 0xc9, 0x78, 0x5c, 0xb4, 0x45, 0xe0,
0x4a, 0x1f, 0x6e, 0x4d, 0x7b, 0x43, 0xf7, 0x61, 0xe1, 0xa0, 0xd5, 0x2e, 0xce, 0x95, 0xee, 0x9e,
0x9e, 0x95, 0x3f, 0x9e, 0xfe, 0x78, 0xe0, 0x71, 0x39, 0x24, 0x7e, 0xab, 0x8d, 0xbe, 0x84, 0xc5,
0xc6, 0x6e, 0x07, 0xe3, 0x62, 0xaa, 0xb4, 0x76, 0x7a, 0x56, 0xbe, 0x3b, 0x8d, 0x53, 0x9f, 0xd8,
0x30, 0x70, 0x31, 0x3b, 0x1c, 0xbf, 0x0a, 0xff, 0x39, 0x0f, 0x96, 0xa9, 0x0b, 0xde, 0xf7, 0x8f,
0x83, 0xa5, 0xa8, 0xe8, 0x8d, 0x13, 0xfe, 0xfc, 0x8d, 0xb5, 0x6f, 0x21, 0x22, 0x18, 0x4d, 0x7f,
0x0a, 0x05, 0x2f, 0x3c, 0x79, 0xd4, 0xa5, 0x01, 0x39, 0xf4, 0xcd, 0x03, 0x31, 0x87, 0x2d, 0x65,
0x6b, 0x46, 0x26, 0x75, 0xdb, 0x78, 0x81, 0xa4, 0x3c, 0x30, 0x4f, 0xbf, 0x1c, 0x1e, 0xf7, 0xd1,
0x37, 0x90, 0xf6, 0x42, 0x32, 0x30, 0x05, 0xfb, 0xcc, 0x15, 0xb4, 0xda, 0xb5, 0x17, 0xe6, 0xcc,
0xd5, 0x73, 0x17, 0xe7, 0x6b, 0x69, 0x65, 0xc0, 0x9a, 0x86, 0x56, 0xe3, 0x9a, 0x59, 0x8d, 0xa4,
0x2b, 0x87, 0x1c, 0x4e, 0x58, 0xd4, 0xb9, 0xf1, 0x82, 0x1e, 0x57, 0xd9, 0x22, 0xab, 0x3f, 0xc6,
0x5d, 0x54, 0x82, 0xac, 0xa9, 0xbc, 0x75, 0xa9, 0x9d, 0x57, 0x55, 0xad, 0x31, 0xd4, 0x97, 0xc0,
0x8a, 0xa2, 0xd1, 0x3d, 0xe2, 0x6c, 0x50, 0xf9, 0x57, 0x1a, 0xac, 0x2d, 0x7f, 0x28, 0xa4, 0x29,
0xa2, 0xde, 0x5b, 0xf0, 0x5f, 0xc1, 0x32, 0xd1, 0x3f, 0x22, 0x48, 0xa0, 0x2a, 0x12, 0xfd, 0xa0,
0x31, 0x1b, 0x70, 0x7f, 0xa6, 0xbb, 0x31, 0x38, 0x7a, 0xfc, 0xd4, 0x33, 0xca, 0xa7, 0x9d, 0xc2,
0x45, 0x72, 0xe9, 0x0b, 0xea, 0xc0, 0x12, 0xe3, 0x4e, 0x9f, 0x0a, 0x19, 0xd5, 0x31, 0xe6, 0xe1,
0x3e, 0xf3, 0x97, 0xce, 0x5e, 0x12, 0x68, 0x2e, 0xf1, 0x68, 0xb6, 0xd3, 0x3e, 0xd0, 0x63, 0x48,
0x73, 0x72, 0x14, 0x3f, 0xce, 0x66, 0x1e, 0x12, 0x4c, 0x8e, 0xe4, 0x94, 0x0b, 0xcd, 0x40, 0x3f,
0x07, 0x70, 0x3d, 0x11, 0x12, 0xe9, 0xf4, 0x29, 0x37, 0x9b, 0x3d, 0x73, 0x89, 0x8d, 0x31, 0x6a,
0xca, 0x4b, 0x82, 0x8d, 0x9e, 0x41, 0xde, 0x21, 0xb1, 0x5c, 0x33, 0xd7, 0xff, 0xcd, 0xd8, 0xaa,
0x19, 0x17, 0x45, 0xe5, 0xe2, 0xe2, 0x7c, 0x2d, 0x17, 0x5b, 0x70, 0xce, 0x21, 0x46, 0xbe, 0xcf,
0x60, 0x49, 0x12, 0x71, 0xdc, 0x75, 0xa3, 0x74, 0x16, 0xc9, 0xe4, 0x9a, 0xa2, 0x44, 0x3d, 0x99,
0x4d, 0xda, 0x8b, 0xb7, 0xb3, 0x20, 0x13, 0x36, 0xf4, 0x0b, 0x58, 0xa6, 0x81, 0xc3, 0x47, 0x5a,
0xac, 0xf1, 0x0c, 0x73, 0xd7, 0x2f, 0xb6, 0x39, 0x06, 0x4f, 0x2d, 0xb6, 0x48, 0x2f, 0xd9, 0x2b,
0x7f, 0x4b, 0x01, 0x44, 0x75, 0xde, 0xfb, 0x15, 0x20, 0x82, 0xb4, 0x4b, 0x24, 0xd1, 0x9a, 0x2b,
0x60, 0xdd, 0x46, 0x4f, 0x00, 0x24, 0x1d, 0x84, 0x2a, 0xf5, 0x06, 0x3d, 0x23, 0x9b, 0xb7, 0xa5,
0x83, 0x04, 0x1a, 0x6d, 0x42, 0xc6, 0x3c, 0xa1, 0xd3, 0x37, 0xf2, 0x0c, 0xb2, 0xf2, 0x87, 0x14,
0x40, 0xb4, 0xcc, 0xff, 0xe9, 0xb5, 0xd5, 0xed, 0x37, 0xdf, 0xaf, 0xce, 0xfd, 0xf5, 0xfb, 0xd5,
0xb9, 0xdf, 0x5c, 0xac, 0xa6, 0xde, 0x5c, 0xac, 0xa6, 0xfe, 0x7c, 0xb1, 0x9a, 0xfa, 0xfb, 0xc5,
0x6a, 0xea, 0x30, 0xa3, 0x2b, 0x8f, 0x1f, 0xfe, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x67, 0x32, 0x8c,
0x8f, 0xb8, 0x16, 0x00, 0x00,
0xe6, 0xa2, 0x2c, 0xbf, 0x6b, 0xa6, 0xfb, 0xa3, 0x90, 0xe2, 0x02, 0x9f, 0xea, 0x55, 0x7e, 0x09,
0xe8, 0xed, 0x7d, 0x41, 0x08, 0xd2, 0xc7, 0x5e, 0x60, 0xa6, 0x81, 0x75, 0x1b, 0x55, 0x21, 0x1b,
0x92, 0x91, 0xcf, 0x88, 0x6b, 0x02, 0xe3, 0x56, 0x35, 0x2a, 0x10, 0xaa, 0x71, 0x81, 0x50, 0xad,
0x05, 0x23, 0x1c, 0x83, 0x2a, 0xcf, 0xe0, 0x76, 0xe2, 0xf1, 0xa2, 0x4d, 0x28, 0x8c, 0x03, 0x6e,
0xb2, 0xd6, 0x9b, 0x17, 0xe7, 0x6b, 0xd6, 0x38, 0x32, 0x5b, 0x0d, 0x6c, 0x8d, 0x41, 0x2d, 0xb7,
0xf2, 0xf7, 0x02, 0x2c, 0xcd, 0x84, 0x2d, 0xba, 0x05, 0x8b, 0xde, 0x80, 0xf4, 0xa8, 0x99, 0x63,
0xd4, 0x41, 0x4d, 0xc8, 0xf8, 0xe4, 0x90, 0xfa, 0x2a, 0x78, 0xd5, 0xc1, 0xfd, 0xff, 0xb5, 0xf1,
0x5f, 0x7d, 0xae, 0xf1, 0xcd, 0x40, 0xf2, 0x11, 0x36, 0x64, 0x64, 0x43, 0xd6, 0x61, 0x83, 0x01,
0x09, 0xd4, 0x35, 0xb1, 0xb0, 0x9e, 0xc7, 0x71, 0x57, 0xed, 0x0c, 0xe1, 0x3d, 0x61, 0xa7, 0xb5,
0x59, 0xb7, 0x51, 0x11, 0x16, 0x68, 0x70, 0x62, 0x2f, 0x6a, 0x93, 0x6a, 0x2a, 0x8b, 0xeb, 0x45,
0xd1, 0x97, 0xc7, 0xaa, 0xa9, 0x78, 0x43, 0x41, 0xb9, 0x9d, 0x8d, 0x76, 0x54, 0xb5, 0xd1, 0x8f,
0x20, 0x33, 0x60, 0xc3, 0x40, 0x0a, 0x3b, 0xa7, 0x27, 0xbb, 0x92, 0x34, 0xd9, 0x17, 0x0a, 0x61,
0x94, 0x65, 0xe0, 0xa8, 0x09, 0xcb, 0x42, 0xb2, 0xb0, 0xdb, 0xe3, 0xc4, 0xa1, 0xdd, 0x90, 0x72,
0x8f, 0xb9, 0x26, 0x0d, 0xaf, 0xbc, 0x75, 0x28, 0x0d, 0x53, 0xf0, 0xe1, 0x9b, 0x8a, 0xb3, 0xad,
0x28, 0x6d, 0xcd, 0x40, 0x6d, 0x28, 0x84, 0x43, 0xdf, 0xef, 0xb2, 0x30, 0xba, 0x91, 0xa3, 0xd8,
0x79, 0x8f, 0x2d, 0x6b, 0x0f, 0x7d, 0x7f, 0x2f, 0x22, 0x61, 0x2b, 0x9c, 0x74, 0xd0, 0x1d, 0xc8,
0xf4, 0x38, 0x1b, 0x86, 0x51, 0xdc, 0xe4, 0xb1, 0xe9, 0xa1, 0x6f, 0x20, 0x2b, 0xa8, 0xc3, 0xa9,
0x14, 0x76, 0x41, 0x2f, 0xf5, 0x93, 0xa4, 0x41, 0x3a, 0x1a, 0x32, 0x8e, 0x09, 0x1c, 0x73, 0xd0,
0x0a, 0x2c, 0x48, 0x39, 0xb2, 0x97, 0xca, 0xa9, 0xf5, 0x5c, 0x3d, 0x7b, 0x71, 0xbe, 0xb6, 0xb0,
0xbf, 0xff, 0x0a, 0x2b, 0x9b, 0xba, 0x2d, 0xfa, 0x4c, 0xc8, 0x80, 0x0c, 0xa8, 0x7d, 0x43, 0xef,
0xed, 0xb8, 0x8f, 0x5e, 0x01, 0xb8, 0x81, 0xe8, 0x3a, 0x3a, 0x3d, 0xd9, 0x37, 0xf5, 0xea, 0xbe,
0xb8, 0x7e, 0x75, 0x8d, 0xdd, 0x8e, 0xb9, 0x31, 0x97, 0x2e, 0xce, 0xd7, 0xf2, 0xe3, 0x2e, 0xce,
0xbb, 0x81, 0x88, 0x9a, 0xa8, 0x0e, 0x56, 0x9f, 0x12, 0x5f, 0xf6, 0x9d, 0x3e, 0x75, 0x8e, 0xed,
0xe2, 0xd5, 0x57, 0xe0, 0x8e, 0x86, 0x19, 0x0f, 0xd3, 0x24, 0xa5, 0x60, 0x35, 0x55, 0x61, 0x2f,
0xeb, 0xbd, 0x8a, 0x3a, 0xe8, 0x3e, 0x00, 0x0b, 0x69, 0xd0, 0x15, 0xd2, 0xf5, 0x02, 0x1b, 0xa9,
0x25, 0xe3, 0xbc, 0xb2, 0x74, 0x94, 0x01, 0xdd, 0x55, 0x17, 0x14, 0x71, 0xbb, 0x2c, 0xf0, 0x47,
0xf6, 0x47, 0xfa, 0x6b, 0x4e, 0x19, 0xf6, 0x02, 0x7f, 0x84, 0xd6, 0xc0, 0xd2, 0xba, 0x10, 0x5e,
0x2f, 0x20, 0xbe, 0x7d, 0x4b, 0xef, 0x07, 0x28, 0x53, 0x47, 0x5b, 0xd4, 0x39, 0x44, 0xbb, 0x21,
0xec, 0xdb, 0x57, 0x9f, 0x83, 0x99, 0xec, 0xe4, 0x1c, 0x0c, 0x07, 0xfd, 0x04, 0x20, 0xe4, 0xde,
0x89, 0xe7, 0xd3, 0x1e, 0x15, 0xf6, 0x1d, 0xbd, 0xe8, 0xd5, 0xc4, 0x9b, 0x69, 0x8c, 0xc2, 0x53,
0x0c, 0x54, 0x85, 0xb4, 0x17, 0x78, 0xd2, 0xfe, 0xd8, 0xdc, 0x4a, 0x97, 0xa5, 0x5a, 0x67, 0xcc,
0x3f, 0x20, 0xfe, 0x90, 0x62, 0x8d, 0x43, 0x2d, 0xc8, 0x7b, 0x82, 0xf9, 0x5a, 0xbe, 0xb6, 0xad,
0xf3, 0xdb, 0x7b, 0x9c, 0x5f, 0x2b, 0xa6, 0xe0, 0x09, 0x1b, 0xdd, 0x83, 0x7c, 0xe8, 0xb9, 0xe2,
0xb9, 0x37, 0xf0, 0xa4, 0xbd, 0x52, 0x4e, 0xad, 0x2f, 0xe0, 0x89, 0x01, 0xed, 0x40, 0x56, 0x8c,
0x84, 0x23, 0x7d, 0x61, 0x97, 0xf4, 0xbe, 0x54, 0xaf, 0x1f, 0xa6, 0x13, 0x11, 0xa2, 0xc4, 0x11,
0xd3, 0x4b, 0x5f, 0x83, 0x35, 0x95, 0x50, 0x54, 0x22, 0x38, 0xa6, 0x23, 0x93, 0xa3, 0x54, 0x53,
0x9d, 0xfa, 0x89, 0x5a, 0xa2, 0x4e, 0xa2, 0x79, 0x1c, 0x75, 0x9e, 0xcc, 0x3f, 0x4e, 0x95, 0x36,
0xc1, 0x9a, 0x0a, 0x2c, 0xf4, 0x89, 0x4a, 0xf0, 0x3d, 0x4f, 0x48, 0x3e, 0xea, 0x92, 0xa1, 0xec,
0xdb, 0x3f, 0xd3, 0x84, 0x42, 0x6c, 0xac, 0x0d, 0x65, 0xbf, 0xd4, 0x85, 0x89, 0x3e, 0x51, 0x19,
0x2c, 0xa5, 0x7b, 0x41, 0xf9, 0x09, 0xe5, 0xaa, 0x78, 0x52, 0xb2, 0x9a, 0x36, 0xa9, 0xf8, 0x14,
0x94, 0x70, 0xa7, 0xaf, 0xd3, 0x63, 0x1e, 0x9b, 0x9e, 0xca, 0x77, 0x71, 0x12, 0x30, 0xf9, 0xce,
0x74, 0x4b, 0x4f, 0xa0, 0x30, 0xbd, 0xd0, 0xff, 0x64, 0x41, 0x95, 0x3f, 0xa5, 0x20, 0x3f, 0x3e,
0x0c, 0xf4, 0x25, 0x2c, 0xb7, 0x3a, 0x7b, 0xcf, 0x6b, 0xfb, 0xad, 0xbd, 0xdd, 0x6e, 0xa3, 0xf9,
0x6d, 0xed, 0xe5, 0xf3, 0xfd, 0xe2, 0x5c, 0xe9, 0xfe, 0xe9, 0x59, 0x79, 0x65, 0x92, 0xf7, 0x63,
0x78, 0x83, 0x1e, 0x91, 0xa1, 0x2f, 0x67, 0x59, 0x6d, 0xbc, 0xb7, 0xd5, 0xec, 0x74, 0x8a, 0xa9,
0xab, 0x58, 0x6d, 0xce, 0x1c, 0x2a, 0x04, 0xda, 0x84, 0xe2, 0x84, 0xb5, 0xf3, 0xaa, 0xdd, 0xc4,
0x07, 0xc5, 0xf9, 0xd2, 0xbd, 0xd3, 0xb3, 0xb2, 0xfd, 0x36, 0x69, 0x67, 0x14, 0x52, 0x7e, 0x60,
0x1e, 0x2d, 0xff, 0x48, 0x41, 0x61, 0xba, 0xe6, 0x45, 0x5b, 0x51, 0xad, 0xaa, 0x57, 0x7c, 0x63,
0x73, 0xe3, 0xba, 0x1a, 0x59, 0xdf, 0xb5, 0xfe, 0x50, 0xf9, 0x7d, 0xa1, 0x9e, 0xa7, 0x9a, 0x8c,
0xbe, 0x84, 0xc5, 0x90, 0x71, 0x19, 0xdf, 0x4a, 0xc9, 0x31, 0xc3, 0x78, 0x5c, 0x49, 0x45, 0xe0,
0x4a, 0x1f, 0x6e, 0xcc, 0x7a, 0x43, 0x0f, 0x61, 0xe1, 0xa0, 0xd5, 0x2e, 0xce, 0x95, 0xee, 0x9e,
0x9e, 0x95, 0x3f, 0x9e, 0xfd, 0x78, 0xe0, 0x71, 0x39, 0x24, 0x7e, 0xab, 0x8d, 0x3e, 0x87, 0xc5,
0xc6, 0x6e, 0x07, 0xe3, 0x62, 0xaa, 0xb4, 0x76, 0x7a, 0x56, 0xbe, 0x3b, 0x8b, 0x53, 0x9f, 0xd8,
0x30, 0x70, 0x31, 0x3b, 0x1c, 0x3f, 0xd5, 0xfe, 0x39, 0x0f, 0x96, 0xb9, 0xac, 0x3f, 0xf4, 0x6b,
0x7e, 0x29, 0xaa, 0x44, 0xe3, 0x2c, 0x3c, 0x7f, 0x6d, 0x41, 0x5a, 0x88, 0x08, 0x46, 0xd3, 0x0f,
0xa0, 0xe0, 0x85, 0x27, 0x5f, 0x75, 0x69, 0x40, 0x0e, 0x7d, 0xf3, 0x6a, 0xcb, 0x61, 0x4b, 0xd9,
0x9a, 0x91, 0x49, 0x5d, 0x01, 0x5e, 0x20, 0x29, 0x0f, 0xcc, 0x7b, 0x2c, 0x87, 0xc7, 0x7d, 0xf4,
0x0d, 0xa4, 0xbd, 0x90, 0x0c, 0x4c, 0x15, 0x9d, 0xb8, 0x82, 0x56, 0xbb, 0xf6, 0xc2, 0xc4, 0x5c,
0x3d, 0x77, 0x71, 0xbe, 0x96, 0x56, 0x06, 0xac, 0x69, 0x68, 0x35, 0x2e, 0x64, 0xd5, 0x48, 0xfa,
0x3a, 0xcf, 0xe1, 0x29, 0x8b, 0x8a, 0x1b, 0x2f, 0xe8, 0x71, 0x2a, 0x84, 0xbe, 0xd8, 0x73, 0x38,
0xee, 0xa2, 0x12, 0x64, 0x4d, 0x39, 0xac, 0xeb, 0xdf, 0xbc, 0x2a, 0x35, 0x8d, 0xa1, 0xbe, 0x04,
0x56, 0xb4, 0x1b, 0xdd, 0x23, 0xce, 0x06, 0x95, 0x7f, 0xa5, 0xc1, 0xda, 0xf2, 0x87, 0x42, 0x9a,
0xca, 0xe6, 0x83, 0x6d, 0xfe, 0x2b, 0x58, 0x26, 0xfa, 0xef, 0x00, 0x09, 0x54, 0x99, 0xa0, 0x5f,
0x19, 0xe6, 0x00, 0x1e, 0x26, 0xba, 0x1b, 0x83, 0xa3, 0x17, 0x49, 0x3d, 0xa3, 0x7c, 0xda, 0x29,
0x5c, 0x24, 0x97, 0xbe, 0xa0, 0x0e, 0x2c, 0x31, 0xee, 0xf4, 0xa9, 0x90, 0x51, 0x71, 0x61, 0x5e,
0xd3, 0x89, 0xff, 0x59, 0xf6, 0xa6, 0x81, 0xe6, 0x66, 0x8d, 0x66, 0x3b, 0xeb, 0x03, 0x3d, 0x86,
0x34, 0x27, 0x47, 0xf1, 0x8b, 0x29, 0x31, 0x48, 0x30, 0x39, 0x92, 0x33, 0x2e, 0x34, 0x03, 0xfd,
0x1c, 0xc0, 0xf5, 0x44, 0x48, 0xa4, 0xd3, 0xa7, 0xdc, 0x1c, 0x76, 0xe2, 0x12, 0x1b, 0x63, 0xd4,
0x8c, 0x97, 0x29, 0x36, 0x7a, 0x06, 0x79, 0x87, 0xc4, 0x72, 0xcd, 0x5c, 0xfd, 0x8b, 0x61, 0xab,
0x66, 0x5c, 0x14, 0x95, 0x8b, 0x8b, 0xf3, 0xb5, 0x5c, 0x6c, 0xc1, 0x39, 0x87, 0x18, 0xf9, 0x3e,
0x83, 0x25, 0x49, 0xc4, 0x71, 0xd7, 0x8d, 0xd2, 0x59, 0x24, 0x93, 0x2b, 0x2a, 0x05, 0xf5, 0x8e,
0x35, 0x69, 0x2f, 0x3e, 0xce, 0x82, 0x9c, 0xb2, 0xa1, 0x5f, 0xc0, 0x32, 0x0d, 0x1c, 0x3e, 0xd2,
0x62, 0x8d, 0x67, 0x98, 0xbb, 0x7a, 0xb1, 0xcd, 0x31, 0x78, 0x66, 0xb1, 0x45, 0x7a, 0xc9, 0x5e,
0xf9, 0x6b, 0x0a, 0x20, 0x2a, 0xbe, 0x3e, 0xac, 0x00, 0x11, 0xa4, 0x5d, 0x22, 0x89, 0xd6, 0x5c,
0x01, 0xeb, 0x36, 0x7a, 0x02, 0x20, 0xe9, 0x20, 0x54, 0xa9, 0x37, 0xe8, 0x19, 0xd9, 0xbc, 0x2b,
0x1d, 0x4c, 0xa1, 0xd1, 0x26, 0x64, 0xcc, 0xbb, 0x36, 0x7d, 0x2d, 0xcf, 0x20, 0x2b, 0x7f, 0x48,
0x01, 0x44, 0xcb, 0xfc, 0x9f, 0x5e, 0x5b, 0xdd, 0x7e, 0xf3, 0xfd, 0xea, 0xdc, 0x5f, 0xbe, 0x5f,
0x9d, 0xfb, 0xcd, 0xc5, 0x6a, 0xea, 0xcd, 0xc5, 0x6a, 0xea, 0xcf, 0x17, 0xab, 0xa9, 0xbf, 0x5d,
0xac, 0xa6, 0x0e, 0x33, 0xba, 0x3e, 0xfa, 0xe1, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x32, 0x89,
0x54, 0x8a, 0x4d, 0x16, 0x00, 0x00,
}

View File

@ -333,14 +333,6 @@ message ContainerSpec {
//
// https://docs.docker.com/engine/reference/commandline/run/#configure-namespaced-kernel-parameters-sysctls-at-runtime
map<string, string> sysctls = 26;
// Swap limit equal to memory plus swap: '-1' to enable unlimited swap
int64 memory_swap = 27;
// Tune container memory swappiness (0 to 100) - if not specified, defaults
// to the container OS's default - generally 60, or the value predefined in
// the image; set to -1 to unset a previously set value
google.protobuf.Int64Value memory_swappiness = 28;
}
// EndpointSpec defines the properties that can be configured to

File diff suppressed because it is too large Load Diff

View File

@ -4,6 +4,7 @@ package docker.swarmkit.v1;
import "google/protobuf/timestamp.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/wrappers.proto";
import "gogoproto/gogo.proto";
// This file contains types that are common to objects and spec or that are not
@ -77,6 +78,17 @@ message Resources {
message ResourceRequirements {
Resources limits = 1;
Resources reservations = 2;
// Amount of swap in bytes - can only be used together with a memory limit
// -1 means unlimited
// a null pointer indicates that the default behaviour of granting twice
// the memory is maintained
google.protobuf.Int64Value swap_bytes = 3;
// Tune container memory swappiness (0 to 100) - if not specified, defaults
// to the container OS's default - generally 60, or the value predefined in
// the image; set to -1 to unset a previously set value
google.protobuf.Int64Value memory_swappiness = 4;
}
message Platform {

View File

@ -989,8 +989,11 @@ func (a *Allocator) allocateNode(ctx context.Context, node *api.Node, existingAd
nc := a.netCtx
var nwIDs = make(map[string]struct{}, len(networks))
// go through all of the networks we've passed in
for _, network := range networks {
nwIDs[network.ID] = struct{}{}
// for each one, create space for an attachment. then, search through
// all of the attachments already on the node. if the attachment
@ -1049,17 +1052,8 @@ func (a *Allocator) allocateNode(ctx context.Context, node *api.Node, existingAd
// https://github.com/golang/go/wiki/SliceTricks#filtering-without-allocating
attachments := node.Attachments[:0]
for _, attach := range node.Attachments {
// for every attachment, go through every network. if the attachment
// belongs to one of the networks, then go to the next attachment. if
// no network matches, then the the attachment should be removed.
attachmentBelongs := false
for _, network := range networks {
if network.ID == attach.Network.ID {
attachmentBelongs = true
break
}
}
if attachmentBelongs {
if _, ok := nwIDs[attach.Network.ID]; ok {
// attachment belongs to one of the networks, so keep it
attachments = append(attachments, attach)
} else {
// free the attachment and remove it from the node's attachments by

View File

@ -0,0 +1,133 @@
package controlapi
import (
"context"
"strings"
"github.com/docker/swarmkit/api"
"github.com/docker/swarmkit/identity"
"github.com/docker/swarmkit/log"
"github.com/docker/swarmkit/manager/state/store"
"github.com/sirupsen/logrus"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
// CreateExtension creates an `Extension` based on the provided `CreateExtensionRequest.Extension`
// and returns a `CreateExtensionResponse`.
// - Returns `InvalidArgument` if the `CreateExtensionRequest.Extension` is malformed,
// or fails validation.
// - Returns an error if the creation fails.
func (s *Server) CreateExtension(ctx context.Context, request *api.CreateExtensionRequest) (*api.CreateExtensionResponse, error) {
if request.Annotations == nil || request.Annotations.Name == "" {
return nil, status.Errorf(codes.InvalidArgument, "extension name must be provided")
}
extension := &api.Extension{
ID: identity.NewID(),
Annotations: *request.Annotations,
Description: request.Description,
}
err := s.store.Update(func(tx store.Tx) error {
return store.CreateExtension(tx, extension)
})
switch err {
case store.ErrNameConflict:
return nil, status.Errorf(codes.AlreadyExists, "extension %s already exists", request.Annotations.Name)
case nil:
log.G(ctx).WithFields(logrus.Fields{
"extension.Name": request.Annotations.Name,
"method": "CreateExtension",
}).Debugf("extension created")
return &api.CreateExtensionResponse{Extension: extension}, nil
default:
return nil, status.Errorf(codes.Internal, "could not create extension: %v", err.Error())
}
}
// GetExtension returns a `GetExtensionResponse` with a `Extension` with the same
// id as `GetExtensionRequest.extension_id`
// - Returns `NotFound` if the Extension with the given id is not found.
// - Returns `InvalidArgument` if the `GetExtensionRequest.extension_id` is empty.
// - Returns an error if the get fails.
func (s *Server) GetExtension(ctx context.Context, request *api.GetExtensionRequest) (*api.GetExtensionResponse, error) {
if request.ExtensionID == "" {
return nil, status.Errorf(codes.InvalidArgument, "extension ID must be provided")
}
var extension *api.Extension
s.store.View(func(tx store.ReadTx) {
extension = store.GetExtension(tx, request.ExtensionID)
})
if extension == nil {
return nil, status.Errorf(codes.NotFound, "extension %s not found", request.ExtensionID)
}
return &api.GetExtensionResponse{Extension: extension}, nil
}
// RemoveExtension removes the extension referenced by `RemoveExtensionRequest.ID`.
// - Returns `InvalidArgument` if `RemoveExtensionRequest.extension_id` is empty.
// - Returns `NotFound` if the an extension named `RemoveExtensionRequest.extension_id` is not found.
// - Returns an error if the deletion fails.
func (s *Server) RemoveExtension(ctx context.Context, request *api.RemoveExtensionRequest) (*api.RemoveExtensionResponse, error) {
if request.ExtensionID == "" {
return nil, status.Errorf(codes.InvalidArgument, "extension ID must be provided")
}
err := s.store.Update(func(tx store.Tx) error {
// Check if the extension exists
extension := store.GetExtension(tx, request.ExtensionID)
if extension == nil {
return status.Errorf(codes.NotFound, "could not find extension %s", request.ExtensionID)
}
// Check if any resources of this type present in the store, return error if so
resources, err := store.FindResources(tx, store.ByKind(request.ExtensionID))
if err != nil {
return status.Errorf(codes.Internal, "could not find resources using extension %s: %v", request.ExtensionID, err)
}
if len(resources) != 0 {
resourceNames := make([]string, 0, len(resources))
// Number of resources for an extension could be quite large.
// Show a limited number of resources for debugging.
attachedResourceForDebug := 10
for _, resource := range resources {
resourceNames = append(resourceNames, resource.Annotations.Name)
attachedResourceForDebug = attachedResourceForDebug - 1
if attachedResourceForDebug == 0 {
break
}
}
extensionName := extension.Annotations.Name
resourceNameStr := strings.Join(resourceNames, ", ")
resourceStr := "resources"
if len(resourceNames) == 1 {
resourceStr = "resource"
}
return status.Errorf(codes.InvalidArgument, "extension '%s' is in use by the following %s: %v", extensionName, resourceStr, resourceNameStr)
}
return store.DeleteExtension(tx, request.ExtensionID)
})
switch err {
case store.ErrNotExist:
return nil, status.Errorf(codes.NotFound, "extension %s not found", request.ExtensionID)
case nil:
log.G(ctx).WithFields(logrus.Fields{
"extension.ID": request.ExtensionID,
"method": "RemoveExtension",
}).Debugf("extension removed")
return &api.RemoveExtensionResponse{}, nil
default:
return nil, err
}
}

View File

@ -0,0 +1,226 @@
package controlapi
import (
"context"
"github.com/sirupsen/logrus"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"github.com/docker/swarmkit/api"
"github.com/docker/swarmkit/identity"
"github.com/docker/swarmkit/log"
"github.com/docker/swarmkit/manager/state/store"
)
// CreateResource returns a `CreateResourceResponse` after creating a `Resource` based
// on the provided `CreateResourceRequest.Resource`.
// - Returns `InvalidArgument` if the `CreateResourceRequest.Resource` is malformed,
// or if the config data is too long or contains invalid characters.
// - Returns an error if the creation fails.
func (s *Server) CreateResource(ctx context.Context, request *api.CreateResourceRequest) (*api.CreateResourceResponse, error) {
if request.Annotations == nil || request.Annotations.Name == "" {
return nil, status.Errorf(codes.InvalidArgument, "Resource must have a name")
}
// finally, validate that Kind is not an emptystring. We know that creating
// with Kind as empty string should fail at the store level, but to make
// errors clearer, special case this.
if request.Kind == "" {
return nil, status.Errorf(codes.InvalidArgument, "Resource must belong to an Extension")
}
r := &api.Resource{
ID: identity.NewID(),
Annotations: *request.Annotations,
Kind: request.Kind,
Payload: request.Payload,
}
err := s.store.Update(func(tx store.Tx) error {
return store.CreateResource(tx, r)
})
switch err {
case store.ErrNoKind:
return nil, status.Errorf(codes.InvalidArgument, "Kind %v is not registered", r.Kind)
case store.ErrNameConflict:
return nil, status.Errorf(
codes.AlreadyExists,
"A resource with name %v already exists",
r.Annotations.Name,
)
case nil:
log.G(ctx).WithFields(logrus.Fields{
"resource.Name": r.Annotations.Name,
"method": "CreateResource",
}).Debugf("resource created")
return &api.CreateResourceResponse{Resource: r}, nil
default:
return nil, err
}
}
// GetResource returns a `GetResourceResponse` with a `Resource` with the same
// id as `GetResourceRequest.Resource`
// - Returns `NotFound` if the Resource with the given id is not found.
// - Returns `InvalidArgument` if the `GetResourceRequest.Resource` is empty.
// - Returns an error if getting fails.
func (s *Server) GetResource(ctx context.Context, request *api.GetResourceRequest) (*api.GetResourceResponse, error) {
if request.ResourceID == "" {
return nil, status.Errorf(codes.InvalidArgument, "resource ID must be present")
}
var resource *api.Resource
s.store.View(func(tx store.ReadTx) {
resource = store.GetResource(tx, request.ResourceID)
})
if resource == nil {
return nil, status.Errorf(codes.NotFound, "resource %s not found", request.ResourceID)
}
return &api.GetResourceResponse{Resource: resource}, nil
}
// RemoveResource removes the `Resource` referenced by `RemoveResourceRequest.ResourceID`.
// - Returns `InvalidArgument` if `RemoveResourceRequest.ResourceID` is empty.
// - Returns `NotFound` if the a resource named `RemoveResourceRequest.ResourceID` is not found.
// - Returns an error if the deletion fails.
func (s *Server) RemoveResource(ctx context.Context, request *api.RemoveResourceRequest) (*api.RemoveResourceResponse, error) {
if request.ResourceID == "" {
return nil, status.Errorf(codes.InvalidArgument, "resource ID must be present")
}
err := s.store.Update(func(tx store.Tx) error {
return store.DeleteResource(tx, request.ResourceID)
})
switch err {
case store.ErrNotExist:
return nil, status.Errorf(codes.NotFound, "resource %s not found", request.ResourceID)
case nil:
return &api.RemoveResourceResponse{}, nil
default:
return nil, err
}
}
// ListResources returns a `ListResourcesResponse` with a list of `Resource`s stored in the raft store,
// or all resources matching any name in `ListConfigsRequest.Names`, any
// name prefix in `ListResourcesRequest.NamePrefixes`, any id in
// `ListResourcesRequest.ResourceIDs`, or any id prefix in `ListResourcesRequest.IDPrefixes`.
// - Returns an error if listing fails.
func (s *Server) ListResources(ctx context.Context, request *api.ListResourcesRequest) (*api.ListResourcesResponse, error) {
var (
resources []*api.Resource
respResources []*api.Resource
err error
byFilters []store.By
by store.By
labels map[string]string
)
// andKind is set to true if the Extension filter is not the only filter
// being used. If this is the case, we do not have to compare by strings,
// which could be slow.
var andKind bool
if request.Filters != nil {
for _, name := range request.Filters.Names {
byFilters = append(byFilters, store.ByName(name))
}
for _, prefix := range request.Filters.NamePrefixes {
byFilters = append(byFilters, store.ByNamePrefix(prefix))
}
for _, prefix := range request.Filters.IDPrefixes {
byFilters = append(byFilters, store.ByIDPrefix(prefix))
}
labels = request.Filters.Labels
if request.Filters.Kind != "" {
// if we're filtering on Extensions, then set this to true. If Kind is
// the _only_ kind of filter, we'll set this to false below.
andKind = true
}
}
switch len(byFilters) {
case 0:
// NOTE(dperny): currently, filtering using store.ByKind would apply an
// Or operation, which means that filtering by kind would return a
// union. However, for Kind filters, we actually want the
// _intersection_; that is, _only_ objects of the specified kind. we
// could dig into the db code to figure out how to write and use an
// efficient And combinator, but I don't have the time nor expertise to
// do so at the moment. instead, we'll filter by kind after the fact.
// however, if there are no other kinds of filters, and we're ONLY
// listing by Kind, we can set that to be the only filter.
if andKind {
by = store.ByKind(request.Filters.Kind)
andKind = false
} else {
by = store.All
}
case 1:
by = byFilters[0]
default:
by = store.Or(byFilters...)
}
s.store.View(func(tx store.ReadTx) {
resources, err = store.FindResources(tx, by)
})
if err != nil {
return nil, err
}
// filter by label and extension
for _, resource := range resources {
if !filterMatchLabels(resource.Annotations.Labels, labels) {
continue
}
if andKind && resource.Kind != request.Filters.Kind {
continue
}
respResources = append(respResources, resource)
}
return &api.ListResourcesResponse{Resources: respResources}, nil
}
// UpdateResource updates the resource with the given `UpdateResourceRequest.Resource.Id` using the given `UpdateResourceRequest.Resource` and returns a `UpdateResourceResponse`.
// - Returns `NotFound` if the Resource with the given `UpdateResourceRequest.Resource.Id` is not found.
// - Returns `InvalidArgument` if the UpdateResourceRequest.Resource.Id` is empty.
// - Returns an error if updating fails.
func (s *Server) UpdateResource(ctx context.Context, request *api.UpdateResourceRequest) (*api.UpdateResourceResponse, error) {
if request.ResourceID == "" || request.ResourceVersion == nil {
return nil, status.Errorf(codes.InvalidArgument, "must include ID and version")
}
var r *api.Resource
err := s.store.Update(func(tx store.Tx) error {
r = store.GetResource(tx, request.ResourceID)
if r == nil {
return status.Errorf(codes.NotFound, "resource %v not found", request.ResourceID)
}
if request.Annotations != nil {
if r.Annotations.Name != request.Annotations.Name {
return status.Errorf(codes.InvalidArgument, "cannot change resource name")
}
r.Annotations = *request.Annotations
}
r.Meta.Version = *request.ResourceVersion
// only alter the payload if the
if request.Payload != nil {
r.Payload = request.Payload
}
return store.UpdateResource(tx, r)
})
switch err {
case store.ErrSequenceConflict:
return nil, status.Errorf(codes.InvalidArgument, "update out of sequence")
case nil:
return &api.UpdateResourceResponse{
Resource: r,
}, nil
default:
return nil, err
}
}

View File

@ -2,6 +2,7 @@ package raft
import (
"context"
"net"
"time"
"github.com/docker/swarmkit/api"
@ -14,11 +15,15 @@ import (
// dial returns a grpc client connection
func dial(addr string, protocol string, creds credentials.TransportCredentials, timeout time.Duration) (*grpc.ClientConn, error) {
// gRPC dialer connects to proxy first. Provide a custom dialer here avoid that.
grpcOptions := []grpc.DialOption{
grpc.WithBackoffMaxDelay(2 * time.Second),
grpc.WithTransportCredentials(creds),
grpc.WithUnaryInterceptor(grpc_prometheus.UnaryClientInterceptor),
grpc.WithStreamInterceptor(grpc_prometheus.StreamClientInterceptor),
grpc.WithDialer(func(addr string, timeout time.Duration) (net.Conn, error) {
return net.DialTimeout("tcp", addr, timeout)
}),
}
if timeout != 0 {

View File

@ -1,6 +1,8 @@
package store
import (
"strings"
"github.com/docker/swarmkit/api"
memdb "github.com/hashicorp/go-memdb"
"github.com/pkg/errors"
@ -8,6 +10,12 @@ import (
const tableResource = "resource"
var (
// ErrNoKind is returned by resource create operations if the provided Kind
// of the resource does not exist
ErrNoKind = errors.New("object kind is unregistered")
)
func init() {
register(ObjectStoreConfig{
Table: &memdb.TableSchema{
@ -87,17 +95,26 @@ func confirmExtension(tx Tx, r *api.Resource) error {
return errors.Wrap(err, "failed to query extensions")
}
if len(extensions) == 0 {
return errors.Errorf("object kind %s is unregistered", r.Kind)
return ErrNoKind
}
return nil
}
// CreateResource adds a new resource object to the store.
// Returns ErrExist if the ID is already taken.
// Returns ErrNameConflict if a Resource with this Name already exists
// Returns ErrNoKind if the specified Kind does not exist
func CreateResource(tx Tx, r *api.Resource) error {
if err := confirmExtension(tx, r); err != nil {
return err
}
// TODO(dperny): currently the "name" index is unique, which means only one
// Resource of _any_ Kind can exist with that name. This isn't a problem
// right now, but the ideal case would be for names to be namespaced to the
// kind.
if tx.lookup(tableResource, indexName, strings.ToLower(r.Annotations.Name)) != nil {
return ErrNameConflict
}
return tx.create(tableResource, resourceEntry{r})
}
@ -130,7 +147,7 @@ func GetResource(tx ReadTx, id string) *api.Resource {
func FindResources(tx ReadTx, by By) ([]*api.Resource, error) {
checkType := func(by By) error {
switch by.(type) {
case byIDPrefix, byName, byKind, byCustom, byCustomPrefix:
case byIDPrefix, byName, byNamePrefix, byKind, byCustom, byCustomPrefix:
return nil
default:
return ErrInvalidFindBy