// Copyright 2016 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.appengine.v1;

import "google/api/annotations.proto";

option go_package = "google.golang.org/genproto/googleapis/appengine/v1;appengine";
option java_multiple_files = true;
option java_outer_classname = "ServiceProto";
option java_package = "com.google.appengine.v1";


// A Service resource is a logical component of an application that can share
// state and communicate in a secure fashion with other services.
// For example, an application that handles customer requests might
// include separate services to handle tasks such as backend data
// analysis or API requests from mobile devices. Each service has a
// collection of versions that define a specific set of code used to
// implement the functionality of that service.
message Service {
  // Full path to the Service resource in the API.
  // Example: `apps/myapp/services/default`.
  //
  // @OutputOnly
  string name = 1;

  // Relative name of the service within the application.
  // Example: `default`.
  //
  // @OutputOnly
  string id = 2;

  // Mapping that defines fractional HTTP traffic diversion to
  // different versions within the service.
  TrafficSplit split = 3;
}

// Traffic routing configuration for versions within a single service. Traffic
// splits define how traffic directed to the service is assigned to versions.
message TrafficSplit {
  // Available sharding mechanisms.
  enum ShardBy {
    // Diversion method unspecified.
    UNSPECIFIED = 0;

    // Diversion based on a specially named cookie, "GOOGAPPUID." The cookie
    // must be set by the application itself or no diversion will occur.
    COOKIE = 1;

    // Diversion based on applying the modulus operation to a fingerprint
    // of the IP address.
    IP = 2;
  }

  // Mechanism used to determine which version a request is sent to.
  // The traffic selection algorithm will
  // be stable for either type until allocations are changed.
  ShardBy shard_by = 1;

  // Mapping from version IDs within the service to fractional
  // (0.000, 1] allocations of traffic for that version. Each version can
  // be specified only once, but some versions in the service may not
  // have any traffic allocation. Services that have traffic allocated
  // cannot be deleted until either the service is deleted or
  // their traffic allocation is removed. Allocations must sum to 1.
  // Up to two decimal place precision is supported for IP-based splits and
  // up to three decimal places is supported for cookie-based splits.
  map<string, double> allocations = 2;
}
