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

package org.apache.hadoop.yarn.api.records;

import org.apache.hadoop.classification.InterfaceAudience.Private;
import org.apache.hadoop.classification.InterfaceAudience.Public;
import org.apache.hadoop.classification.InterfaceStability.Unstable;
import org.apache.hadoop.yarn.util.Records;

/**
 * {@code ContainerReport} is a report of an container.
 * <p>
 * It includes details such as:
 * <ul>
 *   <li>{@link ContainerId} of the container.</li>
 *   <li>Allocated Resources to the container.</li>
 *   <li>Assigned Node id.</li>
 *   <li>Assigned Priority.</li>
 *   <li>Creation Time.</li>
 *   <li>Finish Time.</li>
 *   <li>Container Exit Status.</li>
 *   <li>{@link ContainerState} of the container.</li>
 *   <li>Diagnostic information in case of errors.</li>
 *   <li>Log URL.</li>
 *   <li>nodeHttpAddress</li>
 * </ul>
 */

@Public
@Unstable
public abstract class ContainerReport {
  @Private
  @Unstable
  public static ContainerReport newInstance(ContainerId containerId,
      Resource allocatedResource, NodeId assignedNode, Priority priority,
      long creationTime, long finishTime, String diagnosticInfo, String logUrl,
      int containerExitStatus, ContainerState containerState,
      String nodeHttpAddress) {
    ContainerReport report = Records.newRecord(ContainerReport.class);
    report.setContainerId(containerId);
    report.setAllocatedResource(allocatedResource);
    report.setAssignedNode(assignedNode);
    report.setPriority(priority);
    report.setCreationTime(creationTime);
    report.setFinishTime(finishTime);
    report.setDiagnosticsInfo(diagnosticInfo);
    report.setLogUrl(logUrl);
    report.setContainerExitStatus(containerExitStatus);
    report.setContainerState(containerState);
    report.setNodeHttpAddress(nodeHttpAddress);
    return report;
  }

  /**
   * Get the <code>ContainerId</code> of the container.
   * 
   * @return <code>ContainerId</code> of the container.
   */
  @Public
  @Unstable
  public abstract ContainerId getContainerId();

  @Public
  @Unstable
  public abstract void setContainerId(ContainerId containerId);

  /**
   * Get the allocated <code>Resource</code> of the container.
   * 
   * @return allocated <code>Resource</code> of the container.
   */
  @Public
  @Unstable
  public abstract Resource getAllocatedResource();

  @Public
  @Unstable
  public abstract void setAllocatedResource(Resource resource);

  /**
   * Get the allocated <code>NodeId</code> where container is running.
   * 
   * @return allocated <code>NodeId</code> where container is running.
   */
  @Public
  @Unstable
  public abstract NodeId getAssignedNode();

  @Public
  @Unstable
  public abstract void setAssignedNode(NodeId nodeId);

  /**
   * Get the allocated <code>Priority</code> of the container.
   * 
   * @return allocated <code>Priority</code> of the container.
   */
  @Public
  @Unstable
  public abstract Priority getPriority();

  @Public
  @Unstable
  public abstract void setPriority(Priority priority);

  /**
   * Get the creation time of the container.
   * 
   * @return creation time of the container
   */
  @Public
  @Unstable
  public abstract long getCreationTime();

  @Public
  @Unstable
  public abstract void setCreationTime(long creationTime);

  /**
   * Get the Finish time of the container.
   * 
   * @return Finish time of the container
   */
  @Public
  @Unstable
  public abstract long getFinishTime();

  @Public
  @Unstable
  public abstract void setFinishTime(long finishTime);

  /**
   * Get the DiagnosticsInfo of the container.
   * 
   * @return DiagnosticsInfo of the container
   */
  @Public
  @Unstable
  public abstract String getDiagnosticsInfo();

  @Public
  @Unstable
  public abstract void setDiagnosticsInfo(String diagnosticsInfo);

  /**
   * Get the LogURL of the container.
   * 
   * @return LogURL of the container
   */
  @Public
  @Unstable
  public abstract String getLogUrl();

  @Public
  @Unstable
  public abstract void setLogUrl(String logUrl);

  /**
   * Get the final <code>ContainerState</code> of the container.
   * 
   * @return final <code>ContainerState</code> of the container.
   */
  @Public
  @Unstable
  public abstract ContainerState getContainerState();

  @Public
  @Unstable
  public abstract void setContainerState(ContainerState containerState);

  /**
   * Get the final <code>exit status</code> of the container.
   * 
   * @return final <code>exit status</code> of the container.
   */
  @Public
  @Unstable
  public abstract int getContainerExitStatus();

  @Public
  @Unstable
  public abstract void setContainerExitStatus(int containerExitStatus);

  /**
   * Get the Node Http address of the container
   * 
   * @return the node http address of the container
   */
  @Public
  @Unstable
  public abstract String getNodeHttpAddress();

  @Private
  @Unstable
  public abstract void setNodeHttpAddress(String nodeHttpAddress);
}
