package com.hubspot.deploy; import java.util.List; import java.util.Objects; import javax.validation.constraints.NotNull; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.Optional; import com.hubspot.singularity.HealthcheckProtocol; import com.wordnik.swagger.annotations.ApiModelProperty; public class HealthcheckOptions { @NotNull private final String uri; private final Optional<Integer> portIndex; private final Optional<Long> portNumber; private final Optional<HealthcheckProtocol> protocol; private final Optional<Integer> startupTimeoutSeconds; private final Optional<Integer> startupDelaySeconds; private final Optional<Integer> startupIntervalSeconds; private final Optional<Integer> intervalSeconds; private final Optional<Integer> responseTimeoutSeconds; private final Optional<Integer> maxRetries; private final Optional<List<Integer>> failureStatusCodes; @JsonCreator public HealthcheckOptions(@JsonProperty("uri") String uri, @JsonProperty("portIndex") Optional<Integer> portIndex, @JsonProperty("portNumber") Optional<Long> portNumber, @JsonProperty("protocol") Optional<HealthcheckProtocol> protocol, @JsonProperty("startupTimeoutSeconds") Optional<Integer> startupTimeoutSeconds, @JsonProperty("startupDelaySeconds") Optional<Integer> startupDelaySeconds, @JsonProperty("startupIntervalSeconds") Optional<Integer> startupIntervalSeconds, @JsonProperty("intervalSeconds") Optional<Integer> intervalSeconds, @JsonProperty("responseTimeoutSeconds") Optional<Integer> responseTimeoutSeconds, @JsonProperty("maxRetries") Optional<Integer> maxRetries, @JsonProperty("failureStatusCodes") Optional<List<Integer>> failureStatusCodes) { this.uri = uri; this.portIndex = portIndex; this.portNumber = portNumber; this.protocol = protocol; this.startupTimeoutSeconds = startupTimeoutSeconds; this.startupDelaySeconds = startupDelaySeconds; this.startupIntervalSeconds = startupIntervalSeconds; this.intervalSeconds = intervalSeconds; this.responseTimeoutSeconds = responseTimeoutSeconds; this.maxRetries = maxRetries; this.failureStatusCodes = failureStatusCodes; } @JsonIgnore public HealthcheckOptionsBuilder toBuilder() { return new HealthcheckOptionsBuilder(uri) .setPortIndex(portIndex) .setPortNumber(portNumber) .setProtocol(protocol) .setStartupTimeoutSeconds(startupTimeoutSeconds) .setStartupDelaySeconds(startupDelaySeconds) .setStartupIntervalSeconds(startupIntervalSeconds) .setIntervalSeconds(intervalSeconds) .setResponseTimeoutSeconds(responseTimeoutSeconds) .setMaxRetries(maxRetries) .setFailureStatusCodes(failureStatusCodes); } @ApiModelProperty(required=true, value="Healthcheck uri to hit") public String getUri() { return uri; } @ApiModelProperty(required=false, value="Perform healthcheck on this dynamically allocated port (e.g. 0 for first port), defaults to first port") public Optional<Integer> getPortIndex() { return portIndex; } @ApiModelProperty(required=false, value="Perform healthcheck on this port (portIndex cannot also be used when using this setting)") public Optional<Long> getPortNumber() { return portNumber; } @ApiModelProperty(required=false, value="Healthcheck protocol - HTTP or HTTPS") public Optional<HealthcheckProtocol> getProtocol() { return protocol; } @ApiModelProperty(required=false, value="Consider the task unhealthy/failed if the app has not started responding to healthchecks in this amount of time") public Optional<Integer> getStartupTimeoutSeconds() { return startupTimeoutSeconds; } @ApiModelProperty(required=false, value="Wait this long before issuing the first healthcheck") public Optional<Integer> getStartupDelaySeconds() { return startupDelaySeconds; } @ApiModelProperty(required=false, value="Time to wait after a failed healthcheck to try again in seconds.") public Optional<Integer> getStartupIntervalSeconds() { return startupIntervalSeconds; } @ApiModelProperty(required=false, value="Time to wait after a valid but failed healthcheck response to try again in seconds.") public Optional<Integer> getIntervalSeconds() { return intervalSeconds; } @ApiModelProperty(required=false, value="Single healthcheck HTTP timeout in seconds.") public Optional<Integer> getResponseTimeoutSeconds() { return responseTimeoutSeconds; } @ApiModelProperty(required=false, value="Maximum number of times to retry an individual healthcheck before failing the deploy.") public Optional<Integer> getMaxRetries() { return maxRetries; } @ApiModelProperty(required=false, value="Fail the healthcheck with no further retries if one of these status codes is returned") public Optional<List<Integer>> getFailureStatusCodes() { return failureStatusCodes; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } HealthcheckOptions that = (HealthcheckOptions) o; return Objects.equals(uri, that.uri) && Objects.equals(portIndex, that.portIndex) && Objects.equals(portNumber, that.portNumber) && Objects.equals(protocol, that.protocol) && Objects.equals(startupTimeoutSeconds, that.startupTimeoutSeconds) && Objects.equals(startupDelaySeconds, that.startupDelaySeconds) && Objects.equals(startupIntervalSeconds, that.startupIntervalSeconds) && Objects.equals(intervalSeconds, that.intervalSeconds) && Objects.equals(responseTimeoutSeconds, that.responseTimeoutSeconds) && Objects.equals(maxRetries, that.maxRetries) && Objects.equals(failureStatusCodes, that.failureStatusCodes); } @Override public int hashCode() { return Objects.hash(uri, portIndex, portNumber, protocol, startupTimeoutSeconds, startupDelaySeconds, startupIntervalSeconds, intervalSeconds, responseTimeoutSeconds, maxRetries, failureStatusCodes); } @Override public String toString() { return "HealthcheckOptions{" + "uri='" + uri + '\'' + ", portIndex=" + portIndex + ", portNumber=" + portNumber + ", protocol=" + protocol + ", startupTimeoutSeconds=" + startupTimeoutSeconds + ", startupDelaySeconds=" + startupDelaySeconds + ", startupIntervalSeconds=" + startupIntervalSeconds + ", intervalSeconds=" + intervalSeconds + ", responseTimeoutSeconds=" + responseTimeoutSeconds + ", maxRetries=" + maxRetries + ", failureStatusCodes=" + failureStatusCodes + '}'; } }