// Generated by the protocol buffer compiler.  DO NOT EDIT!
// source: SliderClusterProtocol.proto

package org.apache.slider.api.proto;

public final class SliderClusterAPI {
  private SliderClusterAPI() {}
  public static void registerAllExtensions(
      com.google.protobuf.ExtensionRegistry registry) {
  }
  /**
   * Protobuf service {@code org.apache.slider.api.SliderClusterProtocolPB}
   *
   * <pre>
   **
   * Protocol used from between Slider Client and AM
   * </pre>
   */
  public static abstract class SliderClusterProtocolPB
      implements com.google.protobuf.Service {
    protected SliderClusterProtocolPB() {}

    public interface Interface {
      /**
       * <code>rpc stopCluster(.org.apache.slider.api.StopClusterRequestProto) returns (.org.apache.slider.api.StopClusterResponseProto);</code>
       */
      public abstract void stopCluster(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.StopClusterRequestProto request,
          com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.StopClusterResponseProto> done);

      /**
       * <code>rpc flexCluster(.org.apache.slider.api.FlexClusterRequestProto) returns (.org.apache.slider.api.FlexClusterResponseProto);</code>
       *
       * <pre>
       **
       * Flex the cluster. 
       * </pre>
       */
      public abstract void flexCluster(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.FlexClusterRequestProto request,
          com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.FlexClusterResponseProto> done);

      /**
       * <code>rpc getJSONClusterStatus(.org.apache.slider.api.GetJSONClusterStatusRequestProto) returns (.org.apache.slider.api.GetJSONClusterStatusResponseProto);</code>
       *
       * <pre>
       **
       * Get the current cluster status
       * </pre>
       */
      public abstract void getJSONClusterStatus(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.GetJSONClusterStatusRequestProto request,
          com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.GetJSONClusterStatusResponseProto> done);

      /**
       * <code>rpc getInstanceDefinition(.org.apache.slider.api.GetInstanceDefinitionRequestProto) returns (.org.apache.slider.api.GetInstanceDefinitionResponseProto);</code>
       *
       * <pre>
       **
       * Get the instance definition
       * </pre>
       */
      public abstract void getInstanceDefinition(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.GetInstanceDefinitionRequestProto request,
          com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.GetInstanceDefinitionResponseProto> done);

      /**
       * <code>rpc listNodeUUIDsByRole(.org.apache.slider.api.ListNodeUUIDsByRoleRequestProto) returns (.org.apache.slider.api.ListNodeUUIDsByRoleResponseProto);</code>
       *
       * <pre>
       **
       * List all running nodes in a role
       * </pre>
       */
      public abstract void listNodeUUIDsByRole(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.ListNodeUUIDsByRoleRequestProto request,
          com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.ListNodeUUIDsByRoleResponseProto> done);

      /**
       * <code>rpc getNode(.org.apache.slider.api.GetNodeRequestProto) returns (.org.apache.slider.api.GetNodeResponseProto);</code>
       *
       * <pre>
       **
       * Get the details on a node
       * </pre>
       */
      public abstract void getNode(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.GetNodeRequestProto request,
          com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.GetNodeResponseProto> done);

      /**
       * <code>rpc getClusterNodes(.org.apache.slider.api.GetClusterNodesRequestProto) returns (.org.apache.slider.api.GetClusterNodesResponseProto);</code>
       *
       * <pre>
       **
       * Get the 
       * details on a list of nodes.
       * Unknown nodes are not returned
       * &lt;i&gt;Important: the order of the results are undefined&lt;/i&gt;
       * </pre>
       */
      public abstract void getClusterNodes(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.GetClusterNodesRequestProto request,
          com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.GetClusterNodesResponseProto> done);

      /**
       * <code>rpc echo(.org.apache.slider.api.EchoRequestProto) returns (.org.apache.slider.api.EchoResponseProto);</code>
       *
       * <pre>
       **
       * echo some text
       * </pre>
       */
      public abstract void echo(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.EchoRequestProto request,
          com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.EchoResponseProto> done);

      /**
       * <code>rpc killContainer(.org.apache.slider.api.KillContainerRequestProto) returns (.org.apache.slider.api.KillContainerResponseProto);</code>
       *
       * <pre>
       **
       * kill a container
       * </pre>
       */
      public abstract void killContainer(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.KillContainerRequestProto request,
          com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.KillContainerResponseProto> done);

      /**
       * <code>rpc amSuicide(.org.apache.slider.api.AMSuicideRequestProto) returns (.org.apache.slider.api.AMSuicideResponseProto);</code>
       *
       * <pre>
       **
       * kill the AM
       * </pre>
       */
      public abstract void amSuicide(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.AMSuicideRequestProto request,
          com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.AMSuicideResponseProto> done);

    }

    public static com.google.protobuf.Service newReflectiveService(
        final Interface impl) {
      return new SliderClusterProtocolPB() {
        @java.lang.Override
        public  void stopCluster(
            com.google.protobuf.RpcController controller,
            org.apache.slider.api.proto.Messages.StopClusterRequestProto request,
            com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.StopClusterResponseProto> done) {
          impl.stopCluster(controller, request, done);
        }

        @java.lang.Override
        public  void flexCluster(
            com.google.protobuf.RpcController controller,
            org.apache.slider.api.proto.Messages.FlexClusterRequestProto request,
            com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.FlexClusterResponseProto> done) {
          impl.flexCluster(controller, request, done);
        }

        @java.lang.Override
        public  void getJSONClusterStatus(
            com.google.protobuf.RpcController controller,
            org.apache.slider.api.proto.Messages.GetJSONClusterStatusRequestProto request,
            com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.GetJSONClusterStatusResponseProto> done) {
          impl.getJSONClusterStatus(controller, request, done);
        }

        @java.lang.Override
        public  void getInstanceDefinition(
            com.google.protobuf.RpcController controller,
            org.apache.slider.api.proto.Messages.GetInstanceDefinitionRequestProto request,
            com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.GetInstanceDefinitionResponseProto> done) {
          impl.getInstanceDefinition(controller, request, done);
        }

        @java.lang.Override
        public  void listNodeUUIDsByRole(
            com.google.protobuf.RpcController controller,
            org.apache.slider.api.proto.Messages.ListNodeUUIDsByRoleRequestProto request,
            com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.ListNodeUUIDsByRoleResponseProto> done) {
          impl.listNodeUUIDsByRole(controller, request, done);
        }

        @java.lang.Override
        public  void getNode(
            com.google.protobuf.RpcController controller,
            org.apache.slider.api.proto.Messages.GetNodeRequestProto request,
            com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.GetNodeResponseProto> done) {
          impl.getNode(controller, request, done);
        }

        @java.lang.Override
        public  void getClusterNodes(
            com.google.protobuf.RpcController controller,
            org.apache.slider.api.proto.Messages.GetClusterNodesRequestProto request,
            com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.GetClusterNodesResponseProto> done) {
          impl.getClusterNodes(controller, request, done);
        }

        @java.lang.Override
        public  void echo(
            com.google.protobuf.RpcController controller,
            org.apache.slider.api.proto.Messages.EchoRequestProto request,
            com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.EchoResponseProto> done) {
          impl.echo(controller, request, done);
        }

        @java.lang.Override
        public  void killContainer(
            com.google.protobuf.RpcController controller,
            org.apache.slider.api.proto.Messages.KillContainerRequestProto request,
            com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.KillContainerResponseProto> done) {
          impl.killContainer(controller, request, done);
        }

        @java.lang.Override
        public  void amSuicide(
            com.google.protobuf.RpcController controller,
            org.apache.slider.api.proto.Messages.AMSuicideRequestProto request,
            com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.AMSuicideResponseProto> done) {
          impl.amSuicide(controller, request, done);
        }

      };
    }

    public static com.google.protobuf.BlockingService
        newReflectiveBlockingService(final BlockingInterface impl) {
      return new com.google.protobuf.BlockingService() {
        public final com.google.protobuf.Descriptors.ServiceDescriptor
            getDescriptorForType() {
          return getDescriptor();
        }

        public final com.google.protobuf.Message callBlockingMethod(
            com.google.protobuf.Descriptors.MethodDescriptor method,
            com.google.protobuf.RpcController controller,
            com.google.protobuf.Message request)
            throws com.google.protobuf.ServiceException {
          if (method.getService() != getDescriptor()) {
            throw new java.lang.IllegalArgumentException(
              "Service.callBlockingMethod() given method descriptor for " +
              "wrong service type.");
          }
          switch(method.getIndex()) {
            case 0:
              return impl.stopCluster(controller, (org.apache.slider.api.proto.Messages.StopClusterRequestProto)request);
            case 1:
              return impl.flexCluster(controller, (org.apache.slider.api.proto.Messages.FlexClusterRequestProto)request);
            case 2:
              return impl.getJSONClusterStatus(controller, (org.apache.slider.api.proto.Messages.GetJSONClusterStatusRequestProto)request);
            case 3:
              return impl.getInstanceDefinition(controller, (org.apache.slider.api.proto.Messages.GetInstanceDefinitionRequestProto)request);
            case 4:
              return impl.listNodeUUIDsByRole(controller, (org.apache.slider.api.proto.Messages.ListNodeUUIDsByRoleRequestProto)request);
            case 5:
              return impl.getNode(controller, (org.apache.slider.api.proto.Messages.GetNodeRequestProto)request);
            case 6:
              return impl.getClusterNodes(controller, (org.apache.slider.api.proto.Messages.GetClusterNodesRequestProto)request);
            case 7:
              return impl.echo(controller, (org.apache.slider.api.proto.Messages.EchoRequestProto)request);
            case 8:
              return impl.killContainer(controller, (org.apache.slider.api.proto.Messages.KillContainerRequestProto)request);
            case 9:
              return impl.amSuicide(controller, (org.apache.slider.api.proto.Messages.AMSuicideRequestProto)request);
            default:
              throw new java.lang.AssertionError("Can't get here.");
          }
        }

        public final com.google.protobuf.Message
            getRequestPrototype(
            com.google.protobuf.Descriptors.MethodDescriptor method) {
          if (method.getService() != getDescriptor()) {
            throw new java.lang.IllegalArgumentException(
              "Service.getRequestPrototype() given method " +
              "descriptor for wrong service type.");
          }
          switch(method.getIndex()) {
            case 0:
              return org.apache.slider.api.proto.Messages.StopClusterRequestProto.getDefaultInstance();
            case 1:
              return org.apache.slider.api.proto.Messages.FlexClusterRequestProto.getDefaultInstance();
            case 2:
              return org.apache.slider.api.proto.Messages.GetJSONClusterStatusRequestProto.getDefaultInstance();
            case 3:
              return org.apache.slider.api.proto.Messages.GetInstanceDefinitionRequestProto.getDefaultInstance();
            case 4:
              return org.apache.slider.api.proto.Messages.ListNodeUUIDsByRoleRequestProto.getDefaultInstance();
            case 5:
              return org.apache.slider.api.proto.Messages.GetNodeRequestProto.getDefaultInstance();
            case 6:
              return org.apache.slider.api.proto.Messages.GetClusterNodesRequestProto.getDefaultInstance();
            case 7:
              return org.apache.slider.api.proto.Messages.EchoRequestProto.getDefaultInstance();
            case 8:
              return org.apache.slider.api.proto.Messages.KillContainerRequestProto.getDefaultInstance();
            case 9:
              return org.apache.slider.api.proto.Messages.AMSuicideRequestProto.getDefaultInstance();
            default:
              throw new java.lang.AssertionError("Can't get here.");
          }
        }

        public final com.google.protobuf.Message
            getResponsePrototype(
            com.google.protobuf.Descriptors.MethodDescriptor method) {
          if (method.getService() != getDescriptor()) {
            throw new java.lang.IllegalArgumentException(
              "Service.getResponsePrototype() given method " +
              "descriptor for wrong service type.");
          }
          switch(method.getIndex()) {
            case 0:
              return org.apache.slider.api.proto.Messages.StopClusterResponseProto.getDefaultInstance();
            case 1:
              return org.apache.slider.api.proto.Messages.FlexClusterResponseProto.getDefaultInstance();
            case 2:
              return org.apache.slider.api.proto.Messages.GetJSONClusterStatusResponseProto.getDefaultInstance();
            case 3:
              return org.apache.slider.api.proto.Messages.GetInstanceDefinitionResponseProto.getDefaultInstance();
            case 4:
              return org.apache.slider.api.proto.Messages.ListNodeUUIDsByRoleResponseProto.getDefaultInstance();
            case 5:
              return org.apache.slider.api.proto.Messages.GetNodeResponseProto.getDefaultInstance();
            case 6:
              return org.apache.slider.api.proto.Messages.GetClusterNodesResponseProto.getDefaultInstance();
            case 7:
              return org.apache.slider.api.proto.Messages.EchoResponseProto.getDefaultInstance();
            case 8:
              return org.apache.slider.api.proto.Messages.KillContainerResponseProto.getDefaultInstance();
            case 9:
              return org.apache.slider.api.proto.Messages.AMSuicideResponseProto.getDefaultInstance();
            default:
              throw new java.lang.AssertionError("Can't get here.");
          }
        }

      };
    }

    /**
     * <code>rpc stopCluster(.org.apache.slider.api.StopClusterRequestProto) returns (.org.apache.slider.api.StopClusterResponseProto);</code>
     */
    public abstract void stopCluster(
        com.google.protobuf.RpcController controller,
        org.apache.slider.api.proto.Messages.StopClusterRequestProto request,
        com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.StopClusterResponseProto> done);

    /**
     * <code>rpc flexCluster(.org.apache.slider.api.FlexClusterRequestProto) returns (.org.apache.slider.api.FlexClusterResponseProto);</code>
     *
     * <pre>
     **
     * Flex the cluster. 
     * </pre>
     */
    public abstract void flexCluster(
        com.google.protobuf.RpcController controller,
        org.apache.slider.api.proto.Messages.FlexClusterRequestProto request,
        com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.FlexClusterResponseProto> done);

    /**
     * <code>rpc getJSONClusterStatus(.org.apache.slider.api.GetJSONClusterStatusRequestProto) returns (.org.apache.slider.api.GetJSONClusterStatusResponseProto);</code>
     *
     * <pre>
     **
     * Get the current cluster status
     * </pre>
     */
    public abstract void getJSONClusterStatus(
        com.google.protobuf.RpcController controller,
        org.apache.slider.api.proto.Messages.GetJSONClusterStatusRequestProto request,
        com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.GetJSONClusterStatusResponseProto> done);

    /**
     * <code>rpc getInstanceDefinition(.org.apache.slider.api.GetInstanceDefinitionRequestProto) returns (.org.apache.slider.api.GetInstanceDefinitionResponseProto);</code>
     *
     * <pre>
     **
     * Get the instance definition
     * </pre>
     */
    public abstract void getInstanceDefinition(
        com.google.protobuf.RpcController controller,
        org.apache.slider.api.proto.Messages.GetInstanceDefinitionRequestProto request,
        com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.GetInstanceDefinitionResponseProto> done);

    /**
     * <code>rpc listNodeUUIDsByRole(.org.apache.slider.api.ListNodeUUIDsByRoleRequestProto) returns (.org.apache.slider.api.ListNodeUUIDsByRoleResponseProto);</code>
     *
     * <pre>
     **
     * List all running nodes in a role
     * </pre>
     */
    public abstract void listNodeUUIDsByRole(
        com.google.protobuf.RpcController controller,
        org.apache.slider.api.proto.Messages.ListNodeUUIDsByRoleRequestProto request,
        com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.ListNodeUUIDsByRoleResponseProto> done);

    /**
     * <code>rpc getNode(.org.apache.slider.api.GetNodeRequestProto) returns (.org.apache.slider.api.GetNodeResponseProto);</code>
     *
     * <pre>
     **
     * Get the details on a node
     * </pre>
     */
    public abstract void getNode(
        com.google.protobuf.RpcController controller,
        org.apache.slider.api.proto.Messages.GetNodeRequestProto request,
        com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.GetNodeResponseProto> done);

    /**
     * <code>rpc getClusterNodes(.org.apache.slider.api.GetClusterNodesRequestProto) returns (.org.apache.slider.api.GetClusterNodesResponseProto);</code>
     *
     * <pre>
     **
     * Get the 
     * details on a list of nodes.
     * Unknown nodes are not returned
     * &lt;i&gt;Important: the order of the results are undefined&lt;/i&gt;
     * </pre>
     */
    public abstract void getClusterNodes(
        com.google.protobuf.RpcController controller,
        org.apache.slider.api.proto.Messages.GetClusterNodesRequestProto request,
        com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.GetClusterNodesResponseProto> done);

    /**
     * <code>rpc echo(.org.apache.slider.api.EchoRequestProto) returns (.org.apache.slider.api.EchoResponseProto);</code>
     *
     * <pre>
     **
     * echo some text
     * </pre>
     */
    public abstract void echo(
        com.google.protobuf.RpcController controller,
        org.apache.slider.api.proto.Messages.EchoRequestProto request,
        com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.EchoResponseProto> done);

    /**
     * <code>rpc killContainer(.org.apache.slider.api.KillContainerRequestProto) returns (.org.apache.slider.api.KillContainerResponseProto);</code>
     *
     * <pre>
     **
     * kill a container
     * </pre>
     */
    public abstract void killContainer(
        com.google.protobuf.RpcController controller,
        org.apache.slider.api.proto.Messages.KillContainerRequestProto request,
        com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.KillContainerResponseProto> done);

    /**
     * <code>rpc amSuicide(.org.apache.slider.api.AMSuicideRequestProto) returns (.org.apache.slider.api.AMSuicideResponseProto);</code>
     *
     * <pre>
     **
     * kill the AM
     * </pre>
     */
    public abstract void amSuicide(
        com.google.protobuf.RpcController controller,
        org.apache.slider.api.proto.Messages.AMSuicideRequestProto request,
        com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.AMSuicideResponseProto> done);

    public static final
        com.google.protobuf.Descriptors.ServiceDescriptor
        getDescriptor() {
      return org.apache.slider.api.proto.SliderClusterAPI.getDescriptor().getServices().get(0);
    }
    public final com.google.protobuf.Descriptors.ServiceDescriptor
        getDescriptorForType() {
      return getDescriptor();
    }

    public final void callMethod(
        com.google.protobuf.Descriptors.MethodDescriptor method,
        com.google.protobuf.RpcController controller,
        com.google.protobuf.Message request,
        com.google.protobuf.RpcCallback<
          com.google.protobuf.Message> done) {
      if (method.getService() != getDescriptor()) {
        throw new java.lang.IllegalArgumentException(
          "Service.callMethod() given method descriptor for wrong " +
          "service type.");
      }
      switch(method.getIndex()) {
        case 0:
          this.stopCluster(controller, (org.apache.slider.api.proto.Messages.StopClusterRequestProto)request,
            com.google.protobuf.RpcUtil.<org.apache.slider.api.proto.Messages.StopClusterResponseProto>specializeCallback(
              done));
          return;
        case 1:
          this.flexCluster(controller, (org.apache.slider.api.proto.Messages.FlexClusterRequestProto)request,
            com.google.protobuf.RpcUtil.<org.apache.slider.api.proto.Messages.FlexClusterResponseProto>specializeCallback(
              done));
          return;
        case 2:
          this.getJSONClusterStatus(controller, (org.apache.slider.api.proto.Messages.GetJSONClusterStatusRequestProto)request,
            com.google.protobuf.RpcUtil.<org.apache.slider.api.proto.Messages.GetJSONClusterStatusResponseProto>specializeCallback(
              done));
          return;
        case 3:
          this.getInstanceDefinition(controller, (org.apache.slider.api.proto.Messages.GetInstanceDefinitionRequestProto)request,
            com.google.protobuf.RpcUtil.<org.apache.slider.api.proto.Messages.GetInstanceDefinitionResponseProto>specializeCallback(
              done));
          return;
        case 4:
          this.listNodeUUIDsByRole(controller, (org.apache.slider.api.proto.Messages.ListNodeUUIDsByRoleRequestProto)request,
            com.google.protobuf.RpcUtil.<org.apache.slider.api.proto.Messages.ListNodeUUIDsByRoleResponseProto>specializeCallback(
              done));
          return;
        case 5:
          this.getNode(controller, (org.apache.slider.api.proto.Messages.GetNodeRequestProto)request,
            com.google.protobuf.RpcUtil.<org.apache.slider.api.proto.Messages.GetNodeResponseProto>specializeCallback(
              done));
          return;
        case 6:
          this.getClusterNodes(controller, (org.apache.slider.api.proto.Messages.GetClusterNodesRequestProto)request,
            com.google.protobuf.RpcUtil.<org.apache.slider.api.proto.Messages.GetClusterNodesResponseProto>specializeCallback(
              done));
          return;
        case 7:
          this.echo(controller, (org.apache.slider.api.proto.Messages.EchoRequestProto)request,
            com.google.protobuf.RpcUtil.<org.apache.slider.api.proto.Messages.EchoResponseProto>specializeCallback(
              done));
          return;
        case 8:
          this.killContainer(controller, (org.apache.slider.api.proto.Messages.KillContainerRequestProto)request,
            com.google.protobuf.RpcUtil.<org.apache.slider.api.proto.Messages.KillContainerResponseProto>specializeCallback(
              done));
          return;
        case 9:
          this.amSuicide(controller, (org.apache.slider.api.proto.Messages.AMSuicideRequestProto)request,
            com.google.protobuf.RpcUtil.<org.apache.slider.api.proto.Messages.AMSuicideResponseProto>specializeCallback(
              done));
          return;
        default:
          throw new java.lang.AssertionError("Can't get here.");
      }
    }

    public final com.google.protobuf.Message
        getRequestPrototype(
        com.google.protobuf.Descriptors.MethodDescriptor method) {
      if (method.getService() != getDescriptor()) {
        throw new java.lang.IllegalArgumentException(
          "Service.getRequestPrototype() given method " +
          "descriptor for wrong service type.");
      }
      switch(method.getIndex()) {
        case 0:
          return org.apache.slider.api.proto.Messages.StopClusterRequestProto.getDefaultInstance();
        case 1:
          return org.apache.slider.api.proto.Messages.FlexClusterRequestProto.getDefaultInstance();
        case 2:
          return org.apache.slider.api.proto.Messages.GetJSONClusterStatusRequestProto.getDefaultInstance();
        case 3:
          return org.apache.slider.api.proto.Messages.GetInstanceDefinitionRequestProto.getDefaultInstance();
        case 4:
          return org.apache.slider.api.proto.Messages.ListNodeUUIDsByRoleRequestProto.getDefaultInstance();
        case 5:
          return org.apache.slider.api.proto.Messages.GetNodeRequestProto.getDefaultInstance();
        case 6:
          return org.apache.slider.api.proto.Messages.GetClusterNodesRequestProto.getDefaultInstance();
        case 7:
          return org.apache.slider.api.proto.Messages.EchoRequestProto.getDefaultInstance();
        case 8:
          return org.apache.slider.api.proto.Messages.KillContainerRequestProto.getDefaultInstance();
        case 9:
          return org.apache.slider.api.proto.Messages.AMSuicideRequestProto.getDefaultInstance();
        default:
          throw new java.lang.AssertionError("Can't get here.");
      }
    }

    public final com.google.protobuf.Message
        getResponsePrototype(
        com.google.protobuf.Descriptors.MethodDescriptor method) {
      if (method.getService() != getDescriptor()) {
        throw new java.lang.IllegalArgumentException(
          "Service.getResponsePrototype() given method " +
          "descriptor for wrong service type.");
      }
      switch(method.getIndex()) {
        case 0:
          return org.apache.slider.api.proto.Messages.StopClusterResponseProto.getDefaultInstance();
        case 1:
          return org.apache.slider.api.proto.Messages.FlexClusterResponseProto.getDefaultInstance();
        case 2:
          return org.apache.slider.api.proto.Messages.GetJSONClusterStatusResponseProto.getDefaultInstance();
        case 3:
          return org.apache.slider.api.proto.Messages.GetInstanceDefinitionResponseProto.getDefaultInstance();
        case 4:
          return org.apache.slider.api.proto.Messages.ListNodeUUIDsByRoleResponseProto.getDefaultInstance();
        case 5:
          return org.apache.slider.api.proto.Messages.GetNodeResponseProto.getDefaultInstance();
        case 6:
          return org.apache.slider.api.proto.Messages.GetClusterNodesResponseProto.getDefaultInstance();
        case 7:
          return org.apache.slider.api.proto.Messages.EchoResponseProto.getDefaultInstance();
        case 8:
          return org.apache.slider.api.proto.Messages.KillContainerResponseProto.getDefaultInstance();
        case 9:
          return org.apache.slider.api.proto.Messages.AMSuicideResponseProto.getDefaultInstance();
        default:
          throw new java.lang.AssertionError("Can't get here.");
      }
    }

    public static Stub newStub(
        com.google.protobuf.RpcChannel channel) {
      return new Stub(channel);
    }

    public static final class Stub extends org.apache.slider.api.proto.SliderClusterAPI.SliderClusterProtocolPB implements Interface {
      private Stub(com.google.protobuf.RpcChannel channel) {
        this.channel = channel;
      }

      private final com.google.protobuf.RpcChannel channel;

      public com.google.protobuf.RpcChannel getChannel() {
        return channel;
      }

      public  void stopCluster(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.StopClusterRequestProto request,
          com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.StopClusterResponseProto> done) {
        channel.callMethod(
          getDescriptor().getMethods().get(0),
          controller,
          request,
          org.apache.slider.api.proto.Messages.StopClusterResponseProto.getDefaultInstance(),
          com.google.protobuf.RpcUtil.generalizeCallback(
            done,
            org.apache.slider.api.proto.Messages.StopClusterResponseProto.class,
            org.apache.slider.api.proto.Messages.StopClusterResponseProto.getDefaultInstance()));
      }

      public  void flexCluster(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.FlexClusterRequestProto request,
          com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.FlexClusterResponseProto> done) {
        channel.callMethod(
          getDescriptor().getMethods().get(1),
          controller,
          request,
          org.apache.slider.api.proto.Messages.FlexClusterResponseProto.getDefaultInstance(),
          com.google.protobuf.RpcUtil.generalizeCallback(
            done,
            org.apache.slider.api.proto.Messages.FlexClusterResponseProto.class,
            org.apache.slider.api.proto.Messages.FlexClusterResponseProto.getDefaultInstance()));
      }

      public  void getJSONClusterStatus(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.GetJSONClusterStatusRequestProto request,
          com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.GetJSONClusterStatusResponseProto> done) {
        channel.callMethod(
          getDescriptor().getMethods().get(2),
          controller,
          request,
          org.apache.slider.api.proto.Messages.GetJSONClusterStatusResponseProto.getDefaultInstance(),
          com.google.protobuf.RpcUtil.generalizeCallback(
            done,
            org.apache.slider.api.proto.Messages.GetJSONClusterStatusResponseProto.class,
            org.apache.slider.api.proto.Messages.GetJSONClusterStatusResponseProto.getDefaultInstance()));
      }

      public  void getInstanceDefinition(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.GetInstanceDefinitionRequestProto request,
          com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.GetInstanceDefinitionResponseProto> done) {
        channel.callMethod(
          getDescriptor().getMethods().get(3),
          controller,
          request,
          org.apache.slider.api.proto.Messages.GetInstanceDefinitionResponseProto.getDefaultInstance(),
          com.google.protobuf.RpcUtil.generalizeCallback(
            done,
            org.apache.slider.api.proto.Messages.GetInstanceDefinitionResponseProto.class,
            org.apache.slider.api.proto.Messages.GetInstanceDefinitionResponseProto.getDefaultInstance()));
      }

      public  void listNodeUUIDsByRole(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.ListNodeUUIDsByRoleRequestProto request,
          com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.ListNodeUUIDsByRoleResponseProto> done) {
        channel.callMethod(
          getDescriptor().getMethods().get(4),
          controller,
          request,
          org.apache.slider.api.proto.Messages.ListNodeUUIDsByRoleResponseProto.getDefaultInstance(),
          com.google.protobuf.RpcUtil.generalizeCallback(
            done,
            org.apache.slider.api.proto.Messages.ListNodeUUIDsByRoleResponseProto.class,
            org.apache.slider.api.proto.Messages.ListNodeUUIDsByRoleResponseProto.getDefaultInstance()));
      }

      public  void getNode(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.GetNodeRequestProto request,
          com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.GetNodeResponseProto> done) {
        channel.callMethod(
          getDescriptor().getMethods().get(5),
          controller,
          request,
          org.apache.slider.api.proto.Messages.GetNodeResponseProto.getDefaultInstance(),
          com.google.protobuf.RpcUtil.generalizeCallback(
            done,
            org.apache.slider.api.proto.Messages.GetNodeResponseProto.class,
            org.apache.slider.api.proto.Messages.GetNodeResponseProto.getDefaultInstance()));
      }

      public  void getClusterNodes(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.GetClusterNodesRequestProto request,
          com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.GetClusterNodesResponseProto> done) {
        channel.callMethod(
          getDescriptor().getMethods().get(6),
          controller,
          request,
          org.apache.slider.api.proto.Messages.GetClusterNodesResponseProto.getDefaultInstance(),
          com.google.protobuf.RpcUtil.generalizeCallback(
            done,
            org.apache.slider.api.proto.Messages.GetClusterNodesResponseProto.class,
            org.apache.slider.api.proto.Messages.GetClusterNodesResponseProto.getDefaultInstance()));
      }

      public  void echo(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.EchoRequestProto request,
          com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.EchoResponseProto> done) {
        channel.callMethod(
          getDescriptor().getMethods().get(7),
          controller,
          request,
          org.apache.slider.api.proto.Messages.EchoResponseProto.getDefaultInstance(),
          com.google.protobuf.RpcUtil.generalizeCallback(
            done,
            org.apache.slider.api.proto.Messages.EchoResponseProto.class,
            org.apache.slider.api.proto.Messages.EchoResponseProto.getDefaultInstance()));
      }

      public  void killContainer(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.KillContainerRequestProto request,
          com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.KillContainerResponseProto> done) {
        channel.callMethod(
          getDescriptor().getMethods().get(8),
          controller,
          request,
          org.apache.slider.api.proto.Messages.KillContainerResponseProto.getDefaultInstance(),
          com.google.protobuf.RpcUtil.generalizeCallback(
            done,
            org.apache.slider.api.proto.Messages.KillContainerResponseProto.class,
            org.apache.slider.api.proto.Messages.KillContainerResponseProto.getDefaultInstance()));
      }

      public  void amSuicide(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.AMSuicideRequestProto request,
          com.google.protobuf.RpcCallback<org.apache.slider.api.proto.Messages.AMSuicideResponseProto> done) {
        channel.callMethod(
          getDescriptor().getMethods().get(9),
          controller,
          request,
          org.apache.slider.api.proto.Messages.AMSuicideResponseProto.getDefaultInstance(),
          com.google.protobuf.RpcUtil.generalizeCallback(
            done,
            org.apache.slider.api.proto.Messages.AMSuicideResponseProto.class,
            org.apache.slider.api.proto.Messages.AMSuicideResponseProto.getDefaultInstance()));
      }
    }

    public static BlockingInterface newBlockingStub(
        com.google.protobuf.BlockingRpcChannel channel) {
      return new BlockingStub(channel);
    }

    public interface BlockingInterface {
      public org.apache.slider.api.proto.Messages.StopClusterResponseProto stopCluster(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.StopClusterRequestProto request)
          throws com.google.protobuf.ServiceException;

      public org.apache.slider.api.proto.Messages.FlexClusterResponseProto flexCluster(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.FlexClusterRequestProto request)
          throws com.google.protobuf.ServiceException;

      public org.apache.slider.api.proto.Messages.GetJSONClusterStatusResponseProto getJSONClusterStatus(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.GetJSONClusterStatusRequestProto request)
          throws com.google.protobuf.ServiceException;

      public org.apache.slider.api.proto.Messages.GetInstanceDefinitionResponseProto getInstanceDefinition(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.GetInstanceDefinitionRequestProto request)
          throws com.google.protobuf.ServiceException;

      public org.apache.slider.api.proto.Messages.ListNodeUUIDsByRoleResponseProto listNodeUUIDsByRole(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.ListNodeUUIDsByRoleRequestProto request)
          throws com.google.protobuf.ServiceException;

      public org.apache.slider.api.proto.Messages.GetNodeResponseProto getNode(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.GetNodeRequestProto request)
          throws com.google.protobuf.ServiceException;

      public org.apache.slider.api.proto.Messages.GetClusterNodesResponseProto getClusterNodes(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.GetClusterNodesRequestProto request)
          throws com.google.protobuf.ServiceException;

      public org.apache.slider.api.proto.Messages.EchoResponseProto echo(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.EchoRequestProto request)
          throws com.google.protobuf.ServiceException;

      public org.apache.slider.api.proto.Messages.KillContainerResponseProto killContainer(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.KillContainerRequestProto request)
          throws com.google.protobuf.ServiceException;

      public org.apache.slider.api.proto.Messages.AMSuicideResponseProto amSuicide(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.AMSuicideRequestProto request)
          throws com.google.protobuf.ServiceException;
    }

    private static final class BlockingStub implements BlockingInterface {
      private BlockingStub(com.google.protobuf.BlockingRpcChannel channel) {
        this.channel = channel;
      }

      private final com.google.protobuf.BlockingRpcChannel channel;

      public org.apache.slider.api.proto.Messages.StopClusterResponseProto stopCluster(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.StopClusterRequestProto request)
          throws com.google.protobuf.ServiceException {
        return (org.apache.slider.api.proto.Messages.StopClusterResponseProto) channel.callBlockingMethod(
          getDescriptor().getMethods().get(0),
          controller,
          request,
          org.apache.slider.api.proto.Messages.StopClusterResponseProto.getDefaultInstance());
      }


      public org.apache.slider.api.proto.Messages.FlexClusterResponseProto flexCluster(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.FlexClusterRequestProto request)
          throws com.google.protobuf.ServiceException {
        return (org.apache.slider.api.proto.Messages.FlexClusterResponseProto) channel.callBlockingMethod(
          getDescriptor().getMethods().get(1),
          controller,
          request,
          org.apache.slider.api.proto.Messages.FlexClusterResponseProto.getDefaultInstance());
      }


      public org.apache.slider.api.proto.Messages.GetJSONClusterStatusResponseProto getJSONClusterStatus(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.GetJSONClusterStatusRequestProto request)
          throws com.google.protobuf.ServiceException {
        return (org.apache.slider.api.proto.Messages.GetJSONClusterStatusResponseProto) channel.callBlockingMethod(
          getDescriptor().getMethods().get(2),
          controller,
          request,
          org.apache.slider.api.proto.Messages.GetJSONClusterStatusResponseProto.getDefaultInstance());
      }


      public org.apache.slider.api.proto.Messages.GetInstanceDefinitionResponseProto getInstanceDefinition(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.GetInstanceDefinitionRequestProto request)
          throws com.google.protobuf.ServiceException {
        return (org.apache.slider.api.proto.Messages.GetInstanceDefinitionResponseProto) channel.callBlockingMethod(
          getDescriptor().getMethods().get(3),
          controller,
          request,
          org.apache.slider.api.proto.Messages.GetInstanceDefinitionResponseProto.getDefaultInstance());
      }


      public org.apache.slider.api.proto.Messages.ListNodeUUIDsByRoleResponseProto listNodeUUIDsByRole(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.ListNodeUUIDsByRoleRequestProto request)
          throws com.google.protobuf.ServiceException {
        return (org.apache.slider.api.proto.Messages.ListNodeUUIDsByRoleResponseProto) channel.callBlockingMethod(
          getDescriptor().getMethods().get(4),
          controller,
          request,
          org.apache.slider.api.proto.Messages.ListNodeUUIDsByRoleResponseProto.getDefaultInstance());
      }


      public org.apache.slider.api.proto.Messages.GetNodeResponseProto getNode(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.GetNodeRequestProto request)
          throws com.google.protobuf.ServiceException {
        return (org.apache.slider.api.proto.Messages.GetNodeResponseProto) channel.callBlockingMethod(
          getDescriptor().getMethods().get(5),
          controller,
          request,
          org.apache.slider.api.proto.Messages.GetNodeResponseProto.getDefaultInstance());
      }


      public org.apache.slider.api.proto.Messages.GetClusterNodesResponseProto getClusterNodes(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.GetClusterNodesRequestProto request)
          throws com.google.protobuf.ServiceException {
        return (org.apache.slider.api.proto.Messages.GetClusterNodesResponseProto) channel.callBlockingMethod(
          getDescriptor().getMethods().get(6),
          controller,
          request,
          org.apache.slider.api.proto.Messages.GetClusterNodesResponseProto.getDefaultInstance());
      }


      public org.apache.slider.api.proto.Messages.EchoResponseProto echo(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.EchoRequestProto request)
          throws com.google.protobuf.ServiceException {
        return (org.apache.slider.api.proto.Messages.EchoResponseProto) channel.callBlockingMethod(
          getDescriptor().getMethods().get(7),
          controller,
          request,
          org.apache.slider.api.proto.Messages.EchoResponseProto.getDefaultInstance());
      }


      public org.apache.slider.api.proto.Messages.KillContainerResponseProto killContainer(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.KillContainerRequestProto request)
          throws com.google.protobuf.ServiceException {
        return (org.apache.slider.api.proto.Messages.KillContainerResponseProto) channel.callBlockingMethod(
          getDescriptor().getMethods().get(8),
          controller,
          request,
          org.apache.slider.api.proto.Messages.KillContainerResponseProto.getDefaultInstance());
      }


      public org.apache.slider.api.proto.Messages.AMSuicideResponseProto amSuicide(
          com.google.protobuf.RpcController controller,
          org.apache.slider.api.proto.Messages.AMSuicideRequestProto request)
          throws com.google.protobuf.ServiceException {
        return (org.apache.slider.api.proto.Messages.AMSuicideResponseProto) channel.callBlockingMethod(
          getDescriptor().getMethods().get(9),
          controller,
          request,
          org.apache.slider.api.proto.Messages.AMSuicideResponseProto.getDefaultInstance());
      }

    }

    // @@protoc_insertion_point(class_scope:org.apache.slider.api.SliderClusterProtocolPB)
  }


  public static com.google.protobuf.Descriptors.FileDescriptor
      getDescriptor() {
    return descriptor;
  }
  private static com.google.protobuf.Descriptors.FileDescriptor
      descriptor;
  static {
    java.lang.String[] descriptorData = {
      "\n\033SliderClusterProtocol.proto\022\025org.apach" +
      "e.slider.api\032\033SliderClusterMessages.prot" +
      "o2\270\t\n\027SliderClusterProtocolPB\022n\n\013stopClu" +
      "ster\022..org.apache.slider.api.StopCluster" +
      "RequestProto\032/.org.apache.slider.api.Sto" +
      "pClusterResponseProto\022n\n\013flexCluster\022..o" +
      "rg.apache.slider.api.FlexClusterRequestP" +
      "roto\032/.org.apache.slider.api.FlexCluster" +
      "ResponseProto\022\211\001\n\024getJSONClusterStatus\0227" +
      ".org.apache.slider.api.GetJSONClusterSta",
      "tusRequestProto\0328.org.apache.slider.api." +
      "GetJSONClusterStatusResponseProto\022\214\001\n\025ge" +
      "tInstanceDefinition\0228.org.apache.slider." +
      "api.GetInstanceDefinitionRequestProto\0329." +
      "org.apache.slider.api.GetInstanceDefinit" +
      "ionResponseProto\022\206\001\n\023listNodeUUIDsByRole" +
      "\0226.org.apache.slider.api.ListNodeUUIDsBy" +
      "RoleRequestProto\0327.org.apache.slider.api" +
      ".ListNodeUUIDsByRoleResponseProto\022b\n\007get" +
      "Node\022*.org.apache.slider.api.GetNodeRequ",
      "estProto\032+.org.apache.slider.api.GetNode" +
      "ResponseProto\022z\n\017getClusterNodes\0222.org.a" +
      "pache.slider.api.GetClusterNodesRequestP" +
      "roto\0323.org.apache.slider.api.GetClusterN" +
      "odesResponseProto\022Y\n\004echo\022\'.org.apache.s" +
      "lider.api.EchoRequestProto\032(.org.apache." +
      "slider.api.EchoResponseProto\022t\n\rkillCont" +
      "ainer\0220.org.apache.slider.api.KillContai" +
      "nerRequestProto\0321.org.apache.slider.api." +
      "KillContainerResponseProto\022h\n\tamSuicide\022",
      ",.org.apache.slider.api.AMSuicideRequest" +
      "Proto\032-.org.apache.slider.api.AMSuicideR" +
      "esponseProtoB5\n\033org.apache.slider.api.pr" +
      "otoB\020SliderClusterAPI\210\001\001\240\001\001"
    };
    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
      new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
        public com.google.protobuf.ExtensionRegistry assignDescriptors(
            com.google.protobuf.Descriptors.FileDescriptor root) {
          descriptor = root;
          return null;
        }
      };
    com.google.protobuf.Descriptors.FileDescriptor
      .internalBuildGeneratedFileFrom(descriptorData,
        new com.google.protobuf.Descriptors.FileDescriptor[] {
          org.apache.slider.api.proto.Messages.getDescriptor(),
        }, assigner);
  }

  // @@protoc_insertion_point(outer_class_scope)
}
