// Copyright 2017 Istio Authors
//
// 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 config;

message VerifyKeyParams {
  // The name of the parameter where the API key is stored.
  string key_parameter = 1;

  string organization = 2;

  string environment = 3;
}

message ReportParams {

    // Stream is used to select between different logs output sinks.
    enum Stream {
        // STDERR refers to os.Stderr.
        STDERR = 0;
        // STDOUT refers to os.Stdout.
        STDOUT = 1;
    }

    // Selects which standard stream to write to for log entries.
    // STDERR is the default Stream.
    Stream log_stream = 1;

    string organization = 2;

    string environment = 3;

    string key = 4;

    string secret = 5;
}
