// 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";
package metropolis.proto.api;
option go_package = "source.monogon.dev/metropolis/proto/api";

// EnrolmentConfig is the single Metropolis node boot configuration file
// contained in the ESP. It configures the way the node will start up (what
// cluster it will join/enroll into/create).
message EnrolmentConfig {
    // Debug/temporary cluster enrolment method. If set, the node will attempt to enroll into the
    // cluster that this ticket was generated for. Otherwise, a new cluster will be created.
    GoldenTicket golden_ticket = 1;

    // Filled in by node after it is enrolled
    string node_id = 2;
}

// GoldenTicket is a ticket that allows any node to enroll into a cluster, bypassing any integrity
// checks.
//
// Currently, enrolling into a cluster does not use a TPM-based workflow, and instead
// bases on a simplified workflow of joining consensus by being started with a
// TLS client certificate. This is a short-circuit fix to allow multi-node
// clusters for testing before we design the final cluster node lifecycle system.
message GoldenTicket {
    // Etcd peer CA certificate.
    bytes etcd_ca_cert = 1;
    // Etcd peer client certificate.
    bytes etcd_client_cert = 2;
    // Etcd peer client key.
    bytes etcd_client_key = 3;
    // Initial etcd peer CRL.
    bytes etcd_crl = 4;

    message EtcdPeer {
        string name = 1;
        string address = 2;
    }
    // All other current etcd peers in the cluster.
    repeated EtcdPeer peers = 5;
    // The peer that this node should start running.
    EtcdPeer this = 6;

    // Node configuration. Currently unused (in the future, this will be used to run a node
    // management service separate from etcd clustering).
    string node_id = 7;
    bytes node_cert = 8;
    bytes node_key = 9;
}
