// Copyright 2020 The Monogon Project Authors.
//
// SPDX-License-Identifier: Apache-2.0
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";
option go_package = "source.monogon.dev/metropolis/proto/private";
package metropolis.proto.private;

// Node describes a single node's state in etcd
message Node {
    // Node's public key..
    bytes public_key = 1;
    // Node's individual cluster part of the data partition encryption key. It
    // is combined with the Node Unlock Key (NUK) kept within
    // SealedConfiguration.
    bytes cluster_unlock_key = 2;

    // TODO(q3k): document this based on cluster lifecycle design doc once this
    // fully stabilizes.
    enum FSMState {
        FSM_STATE_INVALID = 0;
        FSM_STATE_NEW = 1;
        FSM_STATE_STANDBY = 2;
        FSM_STATE_UP = 3;
        FSM_STATE_DISOWNED = 4;
    };
    FSMState fsm_state = 3;

    message Roles {
        message ConsensusMember {
            // Used to be: consensus member name, can be deduced from
            // Certificate/Pubkey/ID.
            reserved 1;
        }
        ConsensusMember consensus_member = 1;
        message KubernetesWorker {
            // Used to be: node name, can be deduced from
            // Certificate/Pubkey/ID.
            reserved 1;
        }
        KubernetesWorker kubernetes_worker = 2;
    }
    Roles roles = 4;
}

// SealedConfiguration is all configuration kept in a TPM-sealed (ie.
// confidential and tamper-resistant) blob within the node's ESP (EFI)
// partition. It contains everything that the node needs to join an existing
// cluster after rebooting.
message SealedConfiguration {
    // node_unlock_key (NUK) is the node's part of the key required to unlock
    // the node's data partition(s). It is combined with the Cluster Unlock Key
    // (CUK) that's stored in etcd to create a key which is then used to mount
    // the data partition. The NUK and CUK are generated on bootstrap and
    // registration.
    bytes node_unlock_key = 1;
}
