2017-04-17 18:08:24 -04:00
|
|
|
syntax = "proto3";
|
|
|
|
|
|
|
|
package docker.swarmkit.v1;
|
|
|
|
|
|
|
|
import "objects.proto";
|
|
|
|
import "types.proto";
|
|
|
|
import "github.com/coreos/etcd/raft/raftpb/raft.proto";
|
|
|
|
import weak "gogoproto/gogo.proto";
|
|
|
|
import weak "plugin/plugin.proto";
|
|
|
|
|
|
|
|
// Raft defines the RPC communication between raft nodes.
|
|
|
|
service Raft {
|
|
|
|
// ProcessRaftMessage sends a raft message to be processed on a raft member, it is
|
|
|
|
// called from the RaftMember willing to send a message to its destination ('To' field)
|
|
|
|
rpc ProcessRaftMessage(ProcessRaftMessageRequest) returns (ProcessRaftMessageResponse) {
|
|
|
|
option (docker.protobuf.plugin.tls_authorization) = { roles: "swarm-manager" };
|
|
|
|
};
|
|
|
|
|
|
|
|
// ResolveAddress returns the address where the node with the given ID can be reached.
|
|
|
|
rpc ResolveAddress(ResolveAddressRequest) returns (ResolveAddressResponse) {
|
|
|
|
option (docker.protobuf.plugin.tls_authorization) = { roles: "swarm-manager" };
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
// RaftMembership defines RPCs for adding and removing members from the
|
|
|
|
// cluster. These RPCs must always run on the leader, so they are in a separate
|
|
|
|
// service to support the raft proxy.
|
|
|
|
service RaftMembership {
|
|
|
|
// Join adds a RaftMember to the raft cluster.
|
|
|
|
rpc Join(JoinRequest) returns (JoinResponse) {
|
|
|
|
option (docker.protobuf.plugin.tls_authorization) = { roles: "swarm-manager" };
|
|
|
|
};
|
|
|
|
|
|
|
|
// Leave removes a RaftMember from the raft cluster.
|
|
|
|
rpc Leave(LeaveRequest) returns (LeaveResponse) {
|
|
|
|
option (docker.protobuf.plugin.tls_authorization) = { roles: "swarm-manager" };
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
message RaftMember {
|
|
|
|
// RaftID specifies the internal ID used by the manager in a raft context, it can never be modified
|
|
|
|
// and is used only for information purposes
|
|
|
|
uint64 raft_id = 1;
|
|
|
|
|
|
|
|
// NodeID is the node's ID.
|
|
|
|
string node_id = 2;
|
|
|
|
|
|
|
|
// Addr specifies the address of the member
|
|
|
|
string addr = 3;
|
|
|
|
|
|
|
|
// Status provides the current status of the manager from the perspective of another manager.
|
|
|
|
RaftMemberStatus status = 4 [(gogoproto.nullable) = false];
|
|
|
|
}
|
|
|
|
|
|
|
|
message JoinRequest {
|
|
|
|
// Addr specifies the address of the member
|
|
|
|
string addr = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
message JoinResponse {
|
|
|
|
// RaftID is the ID assigned to the new member.
|
|
|
|
uint64 raft_id = 1;
|
|
|
|
|
|
|
|
// Members is the membership set of the cluster.
|
|
|
|
repeated RaftMember members = 2;
|
|
|
|
|
|
|
|
// RemovedMembers is a list of members that have been removed from
|
|
|
|
// the cluster, so the new node can avoid communicating with them.
|
2017-05-16 13:03:55 -04:00
|
|
|
repeated uint64 removed_members = 3 [packed=false];
|
2017-04-17 18:08:24 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
message LeaveRequest {
|
|
|
|
RaftMember node = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
message LeaveResponse {}
|
|
|
|
|
|
|
|
message ProcessRaftMessageRequest {
|
|
|
|
option (docker.protobuf.plugin.deepcopy) = false;
|
|
|
|
raftpb.Message message = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
message ProcessRaftMessageResponse {}
|
|
|
|
|
|
|
|
message ResolveAddressRequest {
|
|
|
|
// raft_id is the ID to resolve to an address.
|
|
|
|
uint64 raft_id = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
message ResolveAddressResponse {
|
|
|
|
// Addr specifies the address of the member
|
|
|
|
string addr = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Contains one of many protobuf encoded objects to replicate
|
|
|
|
// over the raft backend with a request ID to track when the
|
|
|
|
// action is effectively applied
|
|
|
|
message InternalRaftRequest {
|
|
|
|
uint64 id = 1;
|
|
|
|
|
|
|
|
repeated StoreAction action = 2 [(gogoproto.nullable) = false];
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO(stevvooe): Storage actions may belong in another protobuf file. They
|
|
|
|
// aren't necessarily first-class "types" in the cluster schema.
|
|
|
|
|
|
|
|
// StoreActionKind defines the operation to take on the store for the target of
|
|
|
|
// a storage action.
|
|
|
|
enum StoreActionKind {
|
|
|
|
option (gogoproto.goproto_enum_prefix) = false;
|
|
|
|
option (gogoproto.enum_customname) = "StoreActionKind";
|
|
|
|
UNKNOWN = 0 [(gogoproto.enumvalue_customname) = "StoreActionKindUnknown"]; // default value, invalid
|
|
|
|
STORE_ACTION_CREATE = 1 [(gogoproto.enumvalue_customname) = "StoreActionKindCreate"];
|
|
|
|
STORE_ACTION_UPDATE = 2 [(gogoproto.enumvalue_customname) = "StoreActionKindUpdate"];
|
|
|
|
STORE_ACTION_REMOVE = 3 [(gogoproto.enumvalue_customname) = "StoreActionKindRemove"];
|
|
|
|
}
|
|
|
|
|
|
|
|
// StoreAction defines a target and operation to apply on the storage system.
|
|
|
|
message StoreAction {
|
|
|
|
StoreActionKind action = 1;
|
|
|
|
oneof target {
|
|
|
|
Node node = 2;
|
|
|
|
Service service = 3;
|
|
|
|
Task task = 4;
|
|
|
|
Network network = 5;
|
|
|
|
Cluster cluster = 6;
|
|
|
|
Secret secret = 7;
|
|
|
|
Resource resource = 8;
|
|
|
|
Extension extension = 9;
|
|
|
|
Config config = 10;
|
|
|
|
}
|
|
|
|
}
|