/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */

option java_package = "org.apache.hadoop.ipc.protobuf";
option java_outer_classname = "ProtocolInfoProtos";
option java_generic_services = true;
option java_generate_equals_and_hash = true;

/**
 * Request to get protocol versions for all supported rpc kinds.
 */
message GetProtocolVersionsRequestProto {
  required string protocol = 1; // Protocol name
}

/**
 * Protocol version with corresponding rpc kind.
 */
message ProtocolVersionProto {
  required string rpcKind = 1; //RPC kind
  repeated uint64 versions = 2; //Protocol version corresponding to the rpc kind.
}

/**
 * Get protocol version response.
 */
message GetProtocolVersionsResponseProto { 
  repeated ProtocolVersionProto protocolVersions = 1;
}

/**
 * Get protocol signature request.
 */
message GetProtocolSignatureRequestProto {
  required string protocol = 1; // Protocol name
  required string rpcKind = 2; // RPC kind
}

/**
 * Get protocol signature response.
 */ 
message GetProtocolSignatureResponseProto {
  repeated ProtocolSignatureProto protocolSignature = 1;
}

message ProtocolSignatureProto {
  required uint64 version = 1;
  repeated uint32 methods = 2;
}

/**
 * Protocol to get information about protocols.
 */
service ProtocolInfoService {
  /**
   * Return protocol version corresponding to protocol interface for each
   * supported rpc kind.
   */
  rpc getProtocolVersions(GetProtocolVersionsRequestProto) 
      returns (GetProtocolVersionsResponseProto);

  /**
   * Return protocol version corresponding to protocol interface.
   */
  rpc getProtocolSignature(GetProtocolSignatureRequestProto) 
      returns (GetProtocolSignatureResponseProto);
}
