/**
 * 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;
package hadoop.common;

/**
 * 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);
}
