// Copyright 2021 Google LLC
//
// 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.

// Protobuf definitions for the instance configuration sent by an update manager
// to COS Policy Manager. It will translate the instance configuration to device
// policy that can help us to determine the state of other services.
syntax = "proto2";

package protos;
option go_package = "policy_manager/protos";

// HealthMonitorConfig contains all the necessary fields for policy manager to store any
// information related to the configuration of HealthMonitor logging/monitoring.
message  HealthMonitorConfig {
  // enforced is set to true if policy manager should enforce the HealthMonitoring logging and
  // monitoring to the instance.
  optional bool enforced = 1;

  // logging_enabled is set to true if the instance should report logs
  // to google cloud logging backend.
  optional bool logging_enabled = 2;

  // monitoring_enabled is set to true if the instance should report
  // monitoring statistics to google cloud monitoring backend.
  optional bool monitoring_enabled = 3;

  // used to enable fluent_bit as the logging agent instead of stackdriver
  optional bool logging_fluent_bit_enabled = 4;
}

// InstanceConfig contains the details necessary for configuring the instance.
// This proto is used in following places:
//  (1) In user specified GCE Metadata - User can specify JSON formatted
//      InstanceConfig in GCE metadata which is fetched and parsed by COS Policy
//      Manager.
//  (2) From Policy Manager to API Server - Policy Manager sends this InstanceConfig
//      as 'user_config' argument to the GetInstanceConfig() call.
//  (3) From API Server to COS Policy Manager client - in response to GetInstanceConfig()
//      call, the server sends the actual InstanceConfig to be applied on the
//      COS instance.
message InstanceConfig {
  // update_strategy specified configuration about update engine selected. The values can be
  // "update_disabled" or ""(default; will enable the update engine to run).
  optional string update_strategy = 1;

  // metrics_enabled specified configuration about metrics component used in crash reporter
  // service.
  optional bool metrics_enabled = 2;

  // health_monitor_config specifies configuration about health logging/monitoring.
  optional HealthMonitorConfig health_monitor_config = 3;

  // Next number: 4
}
