package com.hubspot.blazar.base;
import java.util.Objects;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.base.MoreObjects;
import com.google.common.base.Optional;
import com.hubspot.rosetta.annotations.StoredAsJson;
public class ModuleBuild {
public enum SimpleState { WAITING, RUNNING, COMPLETE }
public enum State {
QUEUED(SimpleState.WAITING),
WAITING_FOR_UPSTREAM_BUILD(SimpleState.WAITING),
LAUNCHING(SimpleState.RUNNING),
IN_PROGRESS(SimpleState.RUNNING),
SUCCEEDED(SimpleState.COMPLETE),
CANCELLED(SimpleState.COMPLETE),
FAILED(SimpleState.COMPLETE),
SKIPPED(SimpleState.COMPLETE);
private final SimpleState simpleState;
State(SimpleState simpleState) {
this.simpleState = simpleState;
}
public boolean isWaiting() {
return simpleState == SimpleState.WAITING;
}
public boolean isRunning() {
return simpleState == SimpleState.RUNNING;
}
public boolean isComplete() {
return simpleState == SimpleState.COMPLETE;
}
public SimpleState getSimpleState() {
return simpleState;
}
public boolean isFailed() {
return equals(CANCELLED) ||
equals(FAILED);
}
}
private final Optional<Long> id;
private final long repoBuildId;
private final int moduleId;
private final int buildNumber;
private final State state;
private final Optional<Long> startTimestamp;
private final Optional<Long> endTimestamp;
private final Optional<String> taskId;
@StoredAsJson
private final Optional<BuildConfig> buildConfig;
@StoredAsJson
private final Optional<BuildConfig> resolvedConfig;
/**
* The name of the cluster into which the module was build
*/
private final Optional<String> buildClusterName;
@JsonCreator
public ModuleBuild(@JsonProperty("id") Optional<Long> id,
@JsonProperty("repoBuildId") long repoBuildId,
@JsonProperty("moduleId") int moduleId,
@JsonProperty("buildNumber") int buildNumber,
@JsonProperty("state") State state,
@JsonProperty("startTimestamp") Optional<Long> startTimestamp,
@JsonProperty("endTimestamp") Optional<Long> endTimestamp,
@JsonProperty("taskId") Optional<String> taskId,
@JsonProperty("buildConfig") Optional<BuildConfig> buildConfig,
@JsonProperty("resolvedConfig") Optional<BuildConfig> resolvedConfig,
@JsonProperty("buildClusterName") Optional<String> buildClusterName) {
this.id = id;
this.repoBuildId = repoBuildId;
this.moduleId = moduleId;
this.buildNumber = buildNumber;
this.state = state;
this.startTimestamp = startTimestamp;
this.endTimestamp = endTimestamp;
this.taskId = taskId;
this.buildConfig = buildConfig;
this.resolvedConfig = resolvedConfig;
this.buildClusterName = buildClusterName;
}
public static ModuleBuild queuedBuild(RepositoryBuild repositoryBuild, Module module, int buildNumber, BuildConfig buildConfig, BuildConfig resolvedBuildConfig) {
return newBuilder(repositoryBuild.getId().get(), module.getId().get(), buildNumber, State.QUEUED)
.setBuildConfig(Optional.of(buildConfig))
.setResolvedConfig(Optional.of(resolvedBuildConfig))
.build();
}
public static ModuleBuild skippedBuild(RepositoryBuild repositoryBuild, Module module, int buildNumber) {
return newBuilder(repositoryBuild.getId().get(), module.getId().get(), buildNumber, State.SKIPPED).build();
}
public Optional<Long> getId() {
return id;
}
public long getRepoBuildId() {
return repoBuildId;
}
public int getModuleId() {
return moduleId;
}
public int getBuildNumber() {
return buildNumber;
}
public State getState() {
return state;
}
public Optional<Long> getStartTimestamp() {
return startTimestamp;
}
public Optional<Long> getEndTimestamp() {
return endTimestamp;
}
@JsonIgnore
public Optional<String> getRunId() {
return id.isPresent() ? Optional.of(String.valueOf(id.get())) : Optional.<String>absent();
}
public Optional<String> getTaskId() {
return taskId;
}
public Optional<BuildConfig> getBuildConfig() {
return buildConfig;
}
public Optional<BuildConfig> getResolvedConfig() {
return resolvedConfig;
}
public Optional<String> getBuildClusterName() {
return buildClusterName;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("id", id)
.add("moduleId", moduleId)
.add("repoBuildId", repoBuildId)
.add("state", state)
.add("buildClusterName", buildClusterName)
.toString();
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
ModuleBuild build = (ModuleBuild) o;
return Objects.equals(moduleId, build.moduleId) && Objects.equals(buildNumber, build.buildNumber);
}
@Override
public int hashCode() {
return Objects.hash(moduleId, buildNumber);
}
public Builder toBuilder() {
return new Builder(repoBuildId, moduleId, buildNumber, state)
.setId(id)
.setStartTimestamp(startTimestamp)
.setEndTimestamp(endTimestamp)
.setTaskId(taskId)
.setBuildConfig(buildConfig)
.setResolvedConfig(resolvedConfig)
.setBuildClusterName(buildClusterName);
}
public static Builder newBuilder(long repoBuildId, int moduleId, int buildNumber, State intialState) {
return new Builder(repoBuildId, moduleId, buildNumber, intialState);
}
public static class Builder {
private Optional<Long> id = Optional.absent();
private long repoBuildId;
private int moduleId;
private int buildNumber;
private State state;
private Optional<Long> startTimestamp = Optional.absent();
private Optional<Long> endTimestamp = Optional.absent();
private Optional<String> taskId = Optional.absent();
private Optional<BuildConfig> buildConfig = Optional.absent();
private Optional<BuildConfig> resolvedConfig = Optional.absent();
private Optional<String> buildClusterName = Optional.absent();
public Builder(long repoBuildId, int moduleId, int buildNumber, State intialState) {
this.repoBuildId = repoBuildId;
this.moduleId = moduleId;
this.buildNumber = buildNumber;
this.state = intialState;
}
public Builder setId(Optional<Long> id) {
this.id = id;
return this;
}
public Builder setRepoBuildId(long repoBuildId) {
this.repoBuildId = repoBuildId;
return this;
}
public Builder setModuleId(int moduleId) {
this.moduleId = moduleId;
return this;
}
public Builder setBuildNumber(int buildNumber) {
this.buildNumber = buildNumber;
return this;
}
public Builder setState(State state) {
this.state = state;
return this;
}
public Builder setStartTimestamp(Optional<Long> startTimestamp) {
this.startTimestamp = startTimestamp;
return this;
}
public Builder setEndTimestamp(Optional<Long> endTimestamp) {
this.endTimestamp = endTimestamp;
return this;
}
public Builder setTaskId(Optional<String> taskId) {
this.taskId = taskId;
return this;
}
public Builder setBuildConfig(Optional<BuildConfig> buildConfig) {
this.buildConfig = buildConfig;
return this;
}
public Builder setResolvedConfig(Optional<BuildConfig> resolvedConfig) {
this.resolvedConfig = resolvedConfig;
return this;
}
public Builder setBuildClusterName(Optional<String> buildClusterName) {
this.buildClusterName = buildClusterName;
return this;
}
public ModuleBuild build() {
return new ModuleBuild(id, repoBuildId, moduleId, buildNumber, state, startTimestamp, endTimestamp, taskId, buildConfig, resolvedConfig, buildClusterName);
}
}
}