// 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 google.api;

option go_package = "google.golang.org/genproto/googleapis/api/configchange;configchange";
option java_multiple_files = true;
option java_outer_classname = "ConfigChangeProto";
option java_package = "com.google.api";
option objc_class_prefix = "GAPI";


// Output generated from semantically comparing two versions of a service
// configuration.
//
// Includes detailed information about a field that have changed with
// applicable advice about potential consequences for the change, such as
// backwards-incompatibility.
message ConfigChange {
  // Object hierarchy path to the change, with levels separated by a '.'
  // character. For repeated fields, an applicable unique identifier field is
  // used for the index (usually selector, name, or id). For maps, the term
  // 'key' is used. If the field has no unique identifier, the numeric index
  // is used.
  // Examples:
  // - visibility.rules[selector=="google.LibraryService.CreateBook"].restriction
  // - quota.metric_rules[selector=="google"].metric_costs[key=="reads"].value
  // - logging.producer_destinations[0]
  string element = 1;

  // Value of the changed object in the old Service configuration,
  // in JSON format. This field will not be populated if ChangeType == ADDED.
  string old_value = 2;

  // Value of the changed object in the new Service configuration,
  // in JSON format. This field will not be populated if ChangeType == REMOVED.
  string new_value = 3;

  // The type for this change, either ADDED, REMOVED, or MODIFIED.
  ChangeType change_type = 4;

  // Collection of advice provided for this change, useful for determining the
  // possible impact of this change.
  repeated Advice advices = 5;
}

// Generated advice about this change, used for providing more
// information about how a change will affect the existing service.
message Advice {
  // Useful description for why this advice was applied and what actions should
  // be taken to mitigate any implied risks.
  string description = 2;
}

// Classifies set of possible modifications to an object in the service
// configuration.
enum ChangeType {
  // No value was provided.
  CHANGE_TYPE_UNSPECIFIED = 0;

  // The changed object exists in the 'new' service configuration, but not
  // in the 'old' service configuration.
  ADDED = 1;

  // The changed object exists in the 'old' service configuration, but not
  // in the 'new' service configuration.
  REMOVED = 2;

  // The changed object exists in both service configurations, but its value
  // is different.
  MODIFIED = 3;
}
