blob: 63336c8c96b09290b749bb4916f3f42e2d175e69 [file] [log] [blame]
Serge Bazanski6bd41592021-08-23 13:18:37 +02001syntax = "proto3";
2package metropolis.proto.api;
3option go_package = "source.monogon.dev/metropolis/proto/api";
4
Serge Bazanskibc671d02021-10-05 17:53:32 +02005import "metropolis/proto/common/common.proto";
Serge Bazanski9ffa1f92021-09-01 15:42:23 +02006import "metropolis/proto/ext/authorization.proto";
7
Serge Bazanski56114472021-10-11 14:47:54 +02008// Management service available to Cluster Managers, allowing operational work
9// to be performed on the cluster (eg. adding nodes, retrieving information
10// about a running cluster, etc.).
Serge Bazanski6bd41592021-08-23 13:18:37 +020011service Management {
12 // GetRegisterTicket retrieves the current RegisterTicket which is required
13 // for new nodes to register into the cluster. Presenting this ticket on
14 // registration does not automatically grant access to arbitrary node
15 // registration. Instead, it is used to guard the API surface of the
16 // Register RPC from potential denial of service attacks, and can be
17 // regenerated at any time in case it leaks.
Serge Bazanski9ffa1f92021-09-01 15:42:23 +020018 rpc GetRegisterTicket(GetRegisterTicketRequest) returns (GetRegisterTicketResponse) {
19 option (metropolis.proto.ext.authorization) = {
20 need: PERMISSION_GET_REGISTER_TICKET
21 };
22 }
Serge Bazanski56114472021-10-11 14:47:54 +020023
Serge Bazanskibc671d02021-10-05 17:53:32 +020024 // GetClusterInfo retrieves publicly available summary information about
25 // this cluster, notably data required for nodes to register into a cluster
26 // or join it (other than the Register Ticket, which is gated by an
27 // additional permission).
28 rpc GetClusterInfo(GetClusterInfoRequest) returns (GetClusterInfoResponse) {
29 option (metropolis.proto.ext.authorization) = {
30 need: PERMISSION_READ_CLUSTER_STATUS
31 };
32 }
Serge Bazanski56114472021-10-11 14:47:54 +020033
34 // GetNodes retrieves information about nodes in the cluster. Currently,
35 // it returns all available data about all nodes.
36 rpc GetNodes(GetNodesRequest) returns (stream Node) {
37 option (metropolis.proto.ext.authorization) = {
38 need: PERMISSION_READ_CLUSTER_STATUS
39 };
40 }
Serge Bazanski6bd41592021-08-23 13:18:37 +020041}
42
43message GetRegisterTicketRequest {
44}
45
46message GetRegisterTicketResponse {
47 // Opaque bytes that comprise the RegisterTicket.
48 bytes ticket = 1;
Serge Bazanski2893e982021-09-09 13:06:16 +020049}
Serge Bazanskibc671d02021-10-05 17:53:32 +020050
51message GetClusterInfoRequest {
52}
53
54message GetClusterInfoResponse {
55 // cluster_directory contains information about individual nodes in the
56 // cluster that can be used to dial the cluster's services.
57 metropolis.proto.common.ClusterDirectory cluster_directory = 1;
Serge Bazanski2f58ac02021-10-05 11:47:20 +020058
Serge Bazanskifbd38e22021-10-08 14:41:16 +020059 // ca_certificate is the x509 DER encoded CA certificate of the cluster.
60 bytes ca_certificate = 2;
Serge Bazanskibc671d02021-10-05 17:53:32 +020061}
Serge Bazanski56114472021-10-11 14:47:54 +020062
63message GetNodesRequest {
64}
65
66// Node in a Metropolis cluster, streamed by Management.GetNodes. For each node
67// in the cluster, this message will be emitted and will contain information
68// about that node.
69//
70// The fields contained are node fields that PERMISSION_READ_CLUSTER_STATUS
71// allows access to, ie. 'non-private' fields, ones that might be internal to
72// the cluster and possibly considered sensitive information about the
73// infrastructure, but whose knowledge does not allow to escalate privileges
74// within the cluster.
75message Node {
76 // Raw Ed25519 public key of this node, which can be used to generate
77 // the node's ID. This is always set.
78 bytes pubkey = 1;
79 // State of the node from the point of view of the cluster. This is
80 // always set.
81 metropolis.proto.common.NodeState state = 2;
82 // Last reported status by the Node, absent if a node hasn't yet reported
83 // its status.
84 metropolis.proto.common.NodeStatus status = 3;
85 // Roles assigned by the cluster. This is always set.
86 metropolis.proto.common.NodeRoles roles = 4;
87}