package com.hubspot.baragon.models;
import java.util.Collections;
import java.util.List;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.base.MoreObjects;
import com.google.common.base.Optional;
import com.google.common.collect.Lists;
@JsonIgnoreProperties( ignoreUnknown = true )
public class BaragonRequest {
@NotNull
@Pattern(regexp = "[^\\s/|]+", message = "cannot contain whitespace, '/', or '|'", flags = Pattern.Flag.MULTILINE)
private final String loadBalancerRequestId;
@NotNull
@Valid
private final BaragonService loadBalancerService;
@NotNull
@Valid
private final List<UpstreamInfo> addUpstreams;
@NotNull
@Valid
private final List<UpstreamInfo> removeUpstreams;
private final Optional<String> replaceServiceId;
private final Optional<RequestAction> action;
@Valid
private final List<UpstreamInfo> replaceUpstreams;
@NotNull
private final boolean noValidate;
@NotNull
private final boolean noReload;
@JsonCreator
public BaragonRequest(@JsonProperty("loadBalancerRequestId") String loadBalancerRequestId,
@JsonProperty("loadBalancerService") BaragonService loadBalancerService,
@JsonProperty("addUpstreams") List<UpstreamInfo> addUpstreams,
@JsonProperty("removeUpstreams") List<UpstreamInfo> removeUpstreams,
@JsonProperty("replaceUpstreams") List<UpstreamInfo> replaceUpstreams,
@JsonProperty("replaceServiceId") Optional<String> replaceServiceId,
@JsonProperty("action") Optional<RequestAction> action,
@JsonProperty("noValidate") boolean noValidate,
@JsonProperty("noReload") boolean noReload) {
this.loadBalancerRequestId = loadBalancerRequestId;
this.loadBalancerService = loadBalancerService;
this.addUpstreams = addRequestId(addUpstreams, loadBalancerRequestId);
this.removeUpstreams = addRequestId(removeUpstreams, loadBalancerRequestId);
this.replaceServiceId = replaceServiceId;
this.action = action;
this.replaceUpstreams = MoreObjects.firstNonNull(replaceUpstreams, Collections.<UpstreamInfo>emptyList());
this.noValidate = MoreObjects.firstNonNull(noValidate, false);
this.noReload = noReload;
}
public BaragonRequest(String loadBalancerRequestId, BaragonService loadBalancerService, List<UpstreamInfo> addUpstreams, List<UpstreamInfo> removeUpstreams, List<UpstreamInfo> replaceUpstreams, Optional<String> replaceServiceId, Optional<RequestAction> action) {
this(loadBalancerRequestId, loadBalancerService, addUpstreams, removeUpstreams, replaceUpstreams, replaceServiceId, action, false, false);
}
public BaragonRequest(String loadBalancerRequestId, BaragonService loadBalancerService, List<UpstreamInfo> addUpstreams, List<UpstreamInfo> removeUpstreams) {
this(loadBalancerRequestId, loadBalancerService, addUpstreams, removeUpstreams, Collections.<UpstreamInfo>emptyList(),Optional.<String>absent(), Optional.of(RequestAction.UPDATE), false, false);
}
public BaragonRequest(String loadBalancerRequestId, BaragonService loadBalancerService, List<UpstreamInfo> addUpstreams, List<UpstreamInfo> removeUpstreams, Optional<String> replaceServiceId) {
this(loadBalancerRequestId, loadBalancerService, addUpstreams, removeUpstreams, Collections.<UpstreamInfo>emptyList(), replaceServiceId, Optional.of(RequestAction.UPDATE), false, false);
}
public String getLoadBalancerRequestId() {
return loadBalancerRequestId;
}
public BaragonService getLoadBalancerService() {
return loadBalancerService;
}
public List<UpstreamInfo> getAddUpstreams() {
return addUpstreams;
}
public List<UpstreamInfo> getRemoveUpstreams() {
return removeUpstreams;
}
public List<UpstreamInfo> getReplaceUpstreams() {
return replaceUpstreams;
}
public Optional<String> getReplaceServiceId() {
return replaceServiceId;
}
public Optional<RequestAction> getAction() {
return action;
}
private List<UpstreamInfo> addRequestId(List<UpstreamInfo> upstreams, String requestId) {
if (upstreams == null || requestId == null) {
return upstreams;
}
List<UpstreamInfo> upstreamsWithRequestId = Lists.newArrayListWithCapacity(upstreams.size());
for (UpstreamInfo upstream : upstreams) {
upstreamsWithRequestId.add(addRequestId(upstream, requestId));
}
return upstreamsWithRequestId;
}
private UpstreamInfo addRequestId(UpstreamInfo upstream, String requestId) {
if (!upstream.getRequestId().isPresent()) {
return new UpstreamInfo(upstream.getUpstream(), Optional.of(requestId), upstream.getRackId(), Optional.of(upstream.getGroup()));
} else {
return upstream;
}
}
public boolean isNoValidate() {
return noValidate;
}
public boolean isNoReload() {
return noReload;
}
@Override
public String toString() {
return "BaragonRequest [" +
"loadBalancerRequestId='" + loadBalancerRequestId + '\'' +
", loadBalancerService=" + loadBalancerService +
", addUpstreams=" + addUpstreams +
", removeUpstreams=" + removeUpstreams +
", replaceServiceId=" + replaceServiceId +
", action=" + action +
", noValidate=" + noValidate +
", noReload=" + noReload +
']';
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
BaragonRequest request = (BaragonRequest) o;
if (!addUpstreams.equals(request.addUpstreams)) {
return false;
}
if (!loadBalancerRequestId.equals(request.loadBalancerRequestId)) {
return false;
}
if (!loadBalancerService.equals(request.loadBalancerService)) {
return false;
}
if (!removeUpstreams.equals(request.removeUpstreams)) {
return false;
}
if (!replaceServiceId.equals(request.replaceServiceId)) {
return false;
}
if (!action.equals(request.getAction())) {
return false;
}
if (!noValidate == request.noValidate) {
return false;
}
if (!noReload == request.noReload) {
return false;
}
return true;
}
@Override
public int hashCode() {
int result = loadBalancerRequestId.hashCode();
result = 31 * result + loadBalancerService.hashCode();
result = 31 * result + addUpstreams.hashCode();
result = 31 * result + removeUpstreams.hashCode();
result = 31 * result + replaceServiceId.hashCode();
result = 31 * result + action.hashCode();
result = 31 * result + (noValidate ? 1 : 0);
result = 31 * result + (noReload ? 1 : 0);
return result;
}
}