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