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

  import idl "yarn/yarn-api/src/main/avro/yarn-types.genavro";

  record ContainerLaunchContext {
    ContainerID id;
    string user; // TODO: Shouldn't pass it like this.
    Resource resource; // TODO: Needs RM validation
    union {null, map<LocalResource>} resources;

    union {null, bytes} containerTokens; // FileSystem related and other application specific tokens.
    union {null, map<bytes>} serviceData;

    //env to be set before launching the command
    //KEY-> env variable name
    //VALUE -> env variable value.
    map<string> env;

    //commandline to launch the container. All resources are downloaded in the 
    //working directory of the command.
    array<string> command;
  }

  record ContainerStatus {
    ContainerID containerID;
    ContainerState state;
    int exitStatus;
  }

  void startContainer(ContainerLaunchContext container) throws YarnRemoteException;
  void stopContainer(ContainerID containerID) throws YarnRemoteException;
  void cleanupContainer(ContainerID containerID) throws YarnRemoteException;

  ContainerStatus getContainerStatus(ContainerID containerID) throws YarnRemoteException;

}
