package com.hubspot.blazar.config; import static com.hubspot.blazar.config.SingularityClusterConfiguration.BuildStrategy.ALWAYS; import java.util.Collections; import java.util.Set; import javax.validation.constraints.NotNull; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.CharMatcher; import com.google.common.base.MoreObjects; import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.base.Strings; import com.hubspot.singularity.SingularityClientCredentials; public class SingularityClusterConfiguration { public enum BuildStrategy { BLACKLIST, // Build in this cluster only if the built module is NOT in a repository that is included in the provided repositories. WHITELIST, // Build in this cluster only if the built module is in a repository that is included in the provided whitelist EXCLUSIVE_WHITELIST, // Build the repositories provided in the whitelist exclusively in this cluster and nowhere else ALWAYS, // This cluster is available for any build EMERGENCY, // Only build in this cluster if there is an emergency, i.e. other clusters are unavailable EMERGENCY_AND_WHITELIST, EMERGENCY_AND_EXCLUSIVE_WHITELIST } @NotNull private final String host; @NotNull private final String request; private final Optional<String> path; private final Optional<SingularityClientCredentials> credentials; private final int slaveHttpPort; /** * An instruction on how to use this cluster when building */ private final BuildStrategy buildStrategy; /** * A set of repositories that are allowed/disallowed (depending on the selected build strategy) to build in this cluster. * The name should be in the form of <git-host>-<organization>-<repository name> */ private final Set<String> repositories; @JsonCreator public SingularityClusterConfiguration(@JsonProperty("host") String host, @JsonProperty("request") String request, @JsonProperty("path") Optional<String> path, @JsonProperty("credentials") Optional<SingularityClientCredentials> credentials, @JsonProperty("slaveHttpPort") int slaveHttpPort, @JsonProperty("buildStrategy") BuildStrategy buildStrategy, @JsonProperty("repositories") Set<String> repositories) { Preconditions.checkArgument(!Strings.isNullOrEmpty(host)); this.host = host; this.request = request; this.path = trimSlashes(path); // singularity client adds leading and trailing slashes this.credentials = credentials; this.slaveHttpPort = slaveHttpPort; this.buildStrategy = MoreObjects.firstNonNull(buildStrategy, ALWAYS); this.repositories = MoreObjects.firstNonNull(repositories, Collections.emptySet()); } public String getHost() { return host; } public String getRequest() { return request; } public Optional<String> getPath() { return path; } public Optional<SingularityClientCredentials> getCredentials() { return credentials; } public int getSlaveHttpPort() { return slaveHttpPort; } public BuildStrategy getBuildStrategy() { return buildStrategy; } public Set<String> getRepositories() { return repositories; } private static Optional<String> trimSlashes(Optional<String> s) { if (s.isPresent()) { return Optional.of(CharMatcher.is('/').trimFrom(s.get())); } else { return s; } } }