/*
 * Copyright 2024 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.
 *
 * Author: Yongbing Chen yongbingchen@google.com
 */

syntax = "proto3";

package third_party_voyager;

import "voyager_telemetry.proto";

message ConfigGroup {
  repeated string req_fqp_names = 1;
}

message ReqFqpConfig {
  repeated RequestFqp req_fqp = 1;
}

/* ServerConfig is the root telemetry configuration container maintained on
 * the server. This is typically applied OOB as a configuration file. It can
 * also be applied as an idempotent "replace configuration" RPC that the server
 * accepts (not defined here).req_fqp
 */
message ServerConfig {
  /* Top-level configuration groups, use a name like
   * "repairability_basic_cfg_group" to select a ConfigGroup, which may
   * contains a vector of names like "thermal_sensors", "mem_metrics",
   * "proc_metrics", "fan", "proc_info", "mem_info", each then can be used
   * to select a vector of event sources defined as RequestFqp, these
   * RequestFqp will have FqpType as FQP_TYPE_NOT_SET, so they have a full
   * Redfish odata.id to uniquely address an event source.
   * Each RequestFqp also has a threshold_config defined to select one
   * ThresholdConfig from its entry at ServerThresholdsConfig, as its initial
   * threshold_config.
   */
  map<string, ConfigGroup> cfg_groups = 1;
  /* Second-level configurations, keys are names like "thermal_sensors", "fan"
   * "mem_metrics", etc.
   */
  map<string, ReqFqpConfig> req_fqp_configs = 2;
  /*
   * threshold_config is a map from resource ID to its Thresholds config.
   */
  map <string, Thresholds> threshold_config = 3;
}
