/*
 * 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.
 */

/**
 * These .proto interfaces are private and stable.
 * Please see http://wiki.apache.org/hadoop/Compatibility
 * for what changes are allowed for a *stable* .proto interface.
 */

// This file contains protocol buffers that are used throughout HDFS -- i.e.
// by the client, server, and data transfer protocols.

option java_package = "org.apache.slider.api.proto";
option java_outer_classname = "SliderClusterAPI";
option java_generic_services = true;
option java_generate_equals_and_hash = true;
package org.apache.slider.api;

//import "Security.proto";
import "SliderClusterMessages.proto";


/**
 * Protocol used from between Slider Client and AM
 */
service SliderClusterProtocolPB {

  /**
   * Stop the cluster
   */

  rpc stopCluster(StopClusterRequestProto) 
    returns(StopClusterResponseProto);
    
  /**
   * Flex the cluster. 
   */
  rpc flexCluster(FlexClusterRequestProto) 
    returns(FlexClusterResponseProto);

  /**
   * Get the current cluster status
   */
  rpc getJSONClusterStatus(GetJSONClusterStatusRequestProto)
    returns(GetJSONClusterStatusResponseProto);
      
  /**
   * Get the instance definition
   */
  rpc getInstanceDefinition(GetInstanceDefinitionRequestProto)
   returns(GetInstanceDefinitionResponseProto);
      
  /**
   * List all running nodes in a role
   */
  rpc listNodeUUIDsByRole(ListNodeUUIDsByRoleRequestProto)
    returns(ListNodeUUIDsByRoleResponseProto);

  /**
   * Get the details on a node
   */
  rpc getNode(GetNodeRequestProto)
    returns(GetNodeResponseProto);

  /**
   * Get the 
   * details on a list of nodes.
   * Unknown nodes are not returned
   * <i>Important: the order of the results are undefined</i>
   */
  rpc getClusterNodes(GetClusterNodesRequestProto)
    returns(GetClusterNodesResponseProto);
    
   /**
    * echo some text
    */
   rpc echo(EchoRequestProto)
     returns(EchoResponseProto); 

   /**
    * kill a container
    */
   rpc killContainer(KillContainerRequestProto)
     returns(KillContainerResponseProto);
      
   /**
    * kill the AM
    */
   rpc amSuicide(AMSuicideRequestProto)
     returns(AMSuicideResponseProto);

}
