/**
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License. See License.txt in the project root for
 * license information.
 *
 * Code generated by Microsoft (R) AutoRest Code Generator.
 */

package com.microsoft.azure.batch.protocol.models;

import org.joda.time.DateTime;
import com.fasterxml.jackson.annotation.JsonProperty;

/**
 * Information about a StartTask running on a Compute Node.
 */
public class StartTaskInformation {
    /**
     * The state of the StartTask on the Compute Node.
     * Possible values include: 'running', 'completed'.
     */
    @JsonProperty(value = "state", required = true)
    private StartTaskState state;

    /**
     * The time at which the StartTask started running.
     * This value is reset every time the Task is restarted or retried (that
     * is, this is the most recent time at which the StartTask started
     * running).
     */
    @JsonProperty(value = "startTime", required = true)
    private DateTime startTime;

    /**
     * The time at which the StartTask stopped running.
     * This is the end time of the most recent run of the StartTask, if that
     * run has completed (even if that run failed and a retry is pending). This
     * element is not present if the StartTask is currently running.
     */
    @JsonProperty(value = "endTime")
    private DateTime endTime;

    /**
     * The exit code of the program specified on the StartTask command line.
     * This property is set only if the StartTask is in the completed state. In
     * general, the exit code for a process reflects the specific convention
     * implemented by the application developer for that process. If you use
     * the exit code value to make decisions in your code, be sure that you
     * know the exit code convention used by the application process. However,
     * if the Batch service terminates the StartTask (due to timeout, or user
     * termination via the API) you may see an operating system-defined exit
     * code.
     */
    @JsonProperty(value = "exitCode")
    private Integer exitCode;

    /**
     * Information about the container under which the Task is executing.
     * This property is set only if the Task runs in a container context.
     */
    @JsonProperty(value = "containerInfo")
    private TaskContainerExecutionInformation containerInfo;

    /**
     * Information describing the Task failure, if any.
     * This property is set only if the Task is in the completed state and
     * encountered a failure.
     */
    @JsonProperty(value = "failureInfo")
    private TaskFailureInformation failureInfo;

    /**
     * The number of times the Task has been retried by the Batch service.
     * Task application failures (non-zero exit code) are retried,
     * pre-processing errors (the Task could not be run) and file upload errors
     * are not retried. The Batch service will retry the Task up to the limit
     * specified by the constraints.
     */
    @JsonProperty(value = "retryCount", required = true)
    private int retryCount;

    /**
     * The most recent time at which a retry of the Task started running.
     * This element is present only if the Task was retried (i.e. retryCount is
     * nonzero). If present, this is typically the same as startTime, but may
     * be different if the Task has been restarted for reasons other than
     * retry; for example, if the Compute Node was rebooted during a retry,
     * then the startTime is updated but the lastRetryTime is not.
     */
    @JsonProperty(value = "lastRetryTime")
    private DateTime lastRetryTime;

    /**
     * The result of the Task execution.
     * If the value is 'failed', then the details of the failure can be found
     * in the failureInfo property. Possible values include: 'success',
     * 'failure'.
     */
    @JsonProperty(value = "result")
    private TaskExecutionResult result;

    /**
     * Get possible values include: 'running', 'completed'.
     *
     * @return the state value
     */
    public StartTaskState state() {
        return this.state;
    }

    /**
     * Set possible values include: 'running', 'completed'.
     *
     * @param state the state value to set
     * @return the StartTaskInformation object itself.
     */
    public StartTaskInformation withState(StartTaskState state) {
        this.state = state;
        return this;
    }

    /**
     * Get this value is reset every time the Task is restarted or retried (that is, this is the most recent time at which the StartTask started running).
     *
     * @return the startTime value
     */
    public DateTime startTime() {
        return this.startTime;
    }

    /**
     * Set this value is reset every time the Task is restarted or retried (that is, this is the most recent time at which the StartTask started running).
     *
     * @param startTime the startTime value to set
     * @return the StartTaskInformation object itself.
     */
    public StartTaskInformation withStartTime(DateTime startTime) {
        this.startTime = startTime;
        return this;
    }

    /**
     * Get this is the end time of the most recent run of the StartTask, if that run has completed (even if that run failed and a retry is pending). This element is not present if the StartTask is currently running.
     *
     * @return the endTime value
     */
    public DateTime endTime() {
        return this.endTime;
    }

    /**
     * Set this is the end time of the most recent run of the StartTask, if that run has completed (even if that run failed and a retry is pending). This element is not present if the StartTask is currently running.
     *
     * @param endTime the endTime value to set
     * @return the StartTaskInformation object itself.
     */
    public StartTaskInformation withEndTime(DateTime endTime) {
        this.endTime = endTime;
        return this;
    }

    /**
     * Get this property is set only if the StartTask is in the completed state. In general, the exit code for a process reflects the specific convention implemented by the application developer for that process. If you use the exit code value to make decisions in your code, be sure that you know the exit code convention used by the application process. However, if the Batch service terminates the StartTask (due to timeout, or user termination via the API) you may see an operating system-defined exit code.
     *
     * @return the exitCode value
     */
    public Integer exitCode() {
        return this.exitCode;
    }

    /**
     * Set this property is set only if the StartTask is in the completed state. In general, the exit code for a process reflects the specific convention implemented by the application developer for that process. If you use the exit code value to make decisions in your code, be sure that you know the exit code convention used by the application process. However, if the Batch service terminates the StartTask (due to timeout, or user termination via the API) you may see an operating system-defined exit code.
     *
     * @param exitCode the exitCode value to set
     * @return the StartTaskInformation object itself.
     */
    public StartTaskInformation withExitCode(Integer exitCode) {
        this.exitCode = exitCode;
        return this;
    }

    /**
     * Get this property is set only if the Task runs in a container context.
     *
     * @return the containerInfo value
     */
    public TaskContainerExecutionInformation containerInfo() {
        return this.containerInfo;
    }

    /**
     * Set this property is set only if the Task runs in a container context.
     *
     * @param containerInfo the containerInfo value to set
     * @return the StartTaskInformation object itself.
     */
    public StartTaskInformation withContainerInfo(TaskContainerExecutionInformation containerInfo) {
        this.containerInfo = containerInfo;
        return this;
    }

    /**
     * Get this property is set only if the Task is in the completed state and encountered a failure.
     *
     * @return the failureInfo value
     */
    public TaskFailureInformation failureInfo() {
        return this.failureInfo;
    }

    /**
     * Set this property is set only if the Task is in the completed state and encountered a failure.
     *
     * @param failureInfo the failureInfo value to set
     * @return the StartTaskInformation object itself.
     */
    public StartTaskInformation withFailureInfo(TaskFailureInformation failureInfo) {
        this.failureInfo = failureInfo;
        return this;
    }

    /**
     * Get task application failures (non-zero exit code) are retried, pre-processing errors (the Task could not be run) and file upload errors are not retried. The Batch service will retry the Task up to the limit specified by the constraints.
     *
     * @return the retryCount value
     */
    public int retryCount() {
        return this.retryCount;
    }

    /**
     * Set task application failures (non-zero exit code) are retried, pre-processing errors (the Task could not be run) and file upload errors are not retried. The Batch service will retry the Task up to the limit specified by the constraints.
     *
     * @param retryCount the retryCount value to set
     * @return the StartTaskInformation object itself.
     */
    public StartTaskInformation withRetryCount(int retryCount) {
        this.retryCount = retryCount;
        return this;
    }

    /**
     * Get this element is present only if the Task was retried (i.e. retryCount is nonzero). If present, this is typically the same as startTime, but may be different if the Task has been restarted for reasons other than retry; for example, if the Compute Node was rebooted during a retry, then the startTime is updated but the lastRetryTime is not.
     *
     * @return the lastRetryTime value
     */
    public DateTime lastRetryTime() {
        return this.lastRetryTime;
    }

    /**
     * Set this element is present only if the Task was retried (i.e. retryCount is nonzero). If present, this is typically the same as startTime, but may be different if the Task has been restarted for reasons other than retry; for example, if the Compute Node was rebooted during a retry, then the startTime is updated but the lastRetryTime is not.
     *
     * @param lastRetryTime the lastRetryTime value to set
     * @return the StartTaskInformation object itself.
     */
    public StartTaskInformation withLastRetryTime(DateTime lastRetryTime) {
        this.lastRetryTime = lastRetryTime;
        return this;
    }

    /**
     * Get if the value is 'failed', then the details of the failure can be found in the failureInfo property. Possible values include: 'success', 'failure'.
     *
     * @return the result value
     */
    public TaskExecutionResult result() {
        return this.result;
    }

    /**
     * Set if the value is 'failed', then the details of the failure can be found in the failureInfo property. Possible values include: 'success', 'failure'.
     *
     * @param result the result value to set
     * @return the StartTaskInformation object itself.
     */
    public StartTaskInformation withResult(TaskExecutionResult result) {
        this.result = result;
        return this;
    }

}
