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

  record ApplicationID {
    int id;
    long clusterTimeStamp;
  }

  record ContainerID {
    ApplicationID appID; // the application id to which this container belong.
    int id;// unique string for this application
  }

  error YarnRemoteException {
    union { null, string } message;
    union { null, string } trace; //stackTrace
    union { null, YarnRemoteException } cause;
  }
  
  record Resource {
    int memory;
    //int diskspace;
  }

  // State of the container on the ContainerManager.
  enum ContainerState {
    INTIALIZING,
    RUNNING,
    COMPLETE
  }

  record ContainerToken {
    bytes identifier;
    bytes password;
    string kind;
    string service;
  }

  record Container {
    ContainerID id;
    string hostName;
    Resource resource;
    ContainerState state;
    union {ContainerToken, null} containerToken;
  }

  enum ApplicationState {
    PENDING,
    ALLOCATING,
   	ALLOCATED,
   	EXPIRED_PENDING,
   	LAUNCHING,
   	LAUNCHED,
    RUNNING,
    PAUSED,
    CLEANUP,
    COMPLETED,
    KILLED,
    FAILED
  }
 
 record ApplicationStatus {
    int responseID; // TODO: This should be renamed as previousResponseID
    ApplicationID applicationId;
    float progress;
    long lastSeen;
  }
  
  record ApplicationMaster {
    ApplicationID applicationId;
    union { null, string } host;
    int rpcPort;
    int httpPort;
    ApplicationStatus status;
    ApplicationState state;
    union { null, string } clientToken;
  }

  record URL {
    string scheme;
    union { null, string } host;
    int port;
    string file;
  }

  enum LocalResourceVisibility {
    // accessible to applications from all users
    PUBLIC,
    // accessible only to applications from the submitting user
    PRIVATE,
    // accessible only to this application
    APPLICATION
  }

  enum LocalResourceType {
    // an archive to be expanded
    ARCHIVE,
    // uninterpreted file
    FILE
  }

  record LocalResource {
    URL resource;
    long size;
    long timestamp;
    LocalResourceType type;
    LocalResourceVisibility state;
  }
}
