/*
Copyright 2017 Google Inc.

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 Apigee organization -- required
  string organization = 1;
  // The name of the Apigee environment -- required
  string environment = 2;
  // A URL to use to contact the verification service. Will be
  // constructed from the organization and environment name if not
  // specified, and assumes that the service runs at production "apigee.net".
  string verificationURL = 3;
}

message RejectParams {
   // An optional error message to return
  string message = 1;
}

message ReportParams {
  // The name of the Apigee organization -- required
  string organization = 1;
  // The name of the Apigee environment -- required
  string environment = 2;
  // A URL to use to contact the collection service. Will be
  // constructed from the organization and environment name if not
  // specified, and assumes that the service runs at production "apigee.net".
  string collectionURL = 3;
  // The key required to collect analytics, from "edgemicro configure"
  string key = 4;
  // The secret required to collect analytics, from "edgemicro configure"
  string secret = 5;
}
