@namespace("org.apache.hadoop.yarn")
protocol AMRMProtocol {

  import idl "yarn/yarn-api/src/main/avro/yarn-types.genavro";
  
   // Scheduler
   record Priority {
     int priority;
   }
  
   record ResourceRequest {
    Priority priority;
    string hostName;
    Resource capability;
    int numContainers;
  }
  record AMResponse {
    boolean reboot;
    int responseId;
    array<Container> containers;
  }
  
  void registerApplicationMaster(ApplicationMaster applicationMaster) throws YarnRemoteException;
  void finishApplicationMaster(ApplicationMaster applicationMaster) throws YarnRemoteException;
  AMResponse allocate(ApplicationStatus status, array<ResourceRequest> ask, array<Container> release) throws YarnRemoteException;
  
 }
