// Copyright 2015 The LUCI Authors. All rights reserved.
// Use of this source code is governed under the Apache License, Version 2.0
// that can be found in the LICENSE file.

syntax = "proto3";

package svcconfig;

option go_package = "go.chromium.org/luci/logdog/api/config/svcconfig";

import "go.chromium.org/luci/logdog/api/config/svcconfig/transport.proto";

import "google/protobuf/duration.proto";

// Config is the overall instance configuration.
message Config {
  // Configuration for the Butler's log transport.
  Transport transport = 10;
  // Coordinator is the coordinator service configuration.
  Coordinator coordinator = 20;

  reserved "storage", "collector", "archivist";
  reserved 11, 21, 22;
}

// Coordinator is the Coordinator service configuration.
message Coordinator {
  // The name of the authentication group for administrators.
  string admin_auth_group = 10;
  // The name of the authentication group for backend services.
  string service_auth_group = 11;

  // A list of origin URLs that are allowed to perform CORS RPC calls.
  repeated string rpc_allow_origins = 20;

  // The maximum amount of time after a prefix has been registered when log
  // streams may also be registered under that prefix.
  //
  // After the expiration period has passed, new log stream registration will
  // fail.
  //
  // Project configurations or stream prefix regitrations may override this by
  // providing >= 0 values for prefix expiration. The smallest configured
  // expiration will be applied.
  google.protobuf.Duration prefix_expiration = 21;

  reserved "archive_topic", "archive_settle_delay", "archive_delay_max";
  reserved 30, 31, 32;
}
