package com.hubspot.singularity; import java.util.Comparator; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.hubspot.mesos.JavaUtils; public class SingularityTaskId extends SingularityId implements SingularityHistoryItem { private final String requestId; private final String deployId; private final long startedAt; private final int instanceNo; private final String sanitizedHost; private final String sanitizedRackId; public static Comparator<SingularityTaskId> INSTANCE_NO_COMPARATOR = new Comparator<SingularityTaskId>() { @Override public int compare(SingularityTaskId o1, SingularityTaskId o2) { return Integer.compare(o1.instanceNo, o2.instanceNo); } }; public static Comparator<SingularityTaskId> STARTED_AT_COMPARATOR_DESC = new Comparator<SingularityTaskId>() { @Override public int compare(SingularityTaskId o1, SingularityTaskId o2) { return Long.compare(o2.startedAt, o1.startedAt); } }; public SingularityTaskId(String requestId, String deployId, long startedAt, int instanceNo, String sanitizedHost, String sanitizedRackId) { super(String.format("%s-%s-%s-%s-%s-%s", requestId, deployId, startedAt, instanceNo, sanitizedHost, sanitizedRackId)); this.requestId = requestId; this.deployId = deployId; this.startedAt = startedAt; this.instanceNo = instanceNo; this.sanitizedHost = sanitizedHost; this.sanitizedRackId = sanitizedRackId; } @JsonCreator public SingularityTaskId(@JsonProperty("requestId") String requestId, @JsonProperty("deployId") String deployId, @JsonProperty("nextRunAt") Long nextRunAt, @JsonProperty("startedAt") Long startedAt, @JsonProperty("instanceNo") int instanceNo, @JsonProperty("host") String host, @JsonProperty("sanitizedHost") String sanitizedHost, @JsonProperty("sanitizedRackId") String sanitizedRackId, @JsonProperty("rackId") String rackId) { this(requestId, deployId, startedAt != null ? startedAt : nextRunAt, instanceNo, sanitizedHost != null ? sanitizedHost : host, sanitizedRackId != null ? sanitizedRackId : rackId); } /** * @Deprecated use getSanitizedRackId() or matchesOriginalRackId() instead */ public String getRackId() { return getSanitizedRackId(); } public String getSanitizedRackId() { return sanitizedRackId; } @JsonIgnore public boolean matchesOriginalRackId(String unsanitizedRackId) { return sanitizedRackId.equals(JavaUtils.getReplaceHyphensWithUnderscores(unsanitizedRackId)); } public String getDeployId() { return deployId; } /** * @Deprecated use getSanitizedHost() or matchesOriginalHost() instead */ public String getHost() { return getSanitizedHost(); } public String getSanitizedHost() { return sanitizedHost; } @JsonIgnore public boolean matchesOriginalHost(String unsanitizedHost) { return sanitizedHost.equals(JavaUtils.getReplaceHyphensWithUnderscores(unsanitizedHost)); } public String getRequestId() { return requestId; } public long getStartedAt() { return startedAt; } public int getInstanceNo() { return instanceNo; } @Override @JsonIgnore public long getCreateTimestampForCalculatingHistoryAge() { return getStartedAt(); } public static SingularityTaskId valueOf(String string) throws InvalidSingularityTaskIdException { String[] splits = null; try { splits = JavaUtils.reverseSplit(string, 6, "-"); } catch (IllegalStateException ise) { throw new InvalidSingularityTaskIdException(String.format("TaskId %s was invalid (%s)", string, ise.getMessage())); } try { final String requestId = splits[0]; final String deployId = splits[1]; final long startedAt = Long.parseLong(splits[2]); final int instanceNo = Integer.parseInt(splits[3]); final String host = splits[4]; final String rackId = splits[5]; return new SingularityTaskId(requestId, deployId, startedAt, instanceNo, host, rackId); } catch (IllegalArgumentException e) { throw new InvalidSingularityTaskIdException(String.format("TaskId %s had an invalid parameter (%s)", string, e.getMessage())); } } @Override public String toString() { return getId(); } }