package com.hubspot.baragon.service.managers;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.google.common.base.Optional;
import com.google.common.base.Throwables;
import com.google.inject.Inject;
import com.hubspot.baragon.data.BaragonStateDatastore;
import com.hubspot.baragon.models.BaragonRequest;
import com.hubspot.baragon.models.BaragonResponse;
import com.hubspot.baragon.models.BaragonService;
import com.hubspot.baragon.models.BaragonServiceState;
import com.hubspot.baragon.models.RequestAction;
import com.hubspot.baragon.models.UpstreamInfo;
public class ServiceManager {
private final BaragonStateDatastore stateDatastore;
private final RequestManager requestManager;
@Inject
public ServiceManager(BaragonStateDatastore stateDatastore, RequestManager requestManager) {
this.stateDatastore = stateDatastore;
this.requestManager = requestManager;
}
public Optional<BaragonServiceState> getService(String serviceId) {
final Optional<BaragonService> maybeServiceInfo = stateDatastore.getService(serviceId);
if (!maybeServiceInfo.isPresent()) {
return Optional.absent();
}
try {
return Optional.of(new BaragonServiceState(maybeServiceInfo.get(), stateDatastore.getUpstreams(serviceId)));
} catch (Exception e) {
throw Throwables.propagate(e);
}
}
public BaragonResponse enqueueReloadServiceConfigs(String serviceId, boolean noValidate) {
String requestId = String.format("%s-%s-%s", serviceId, System.currentTimeMillis(), "RELOAD");
Optional<BaragonService> maybeService = stateDatastore.getService(serviceId);
if (maybeService.isPresent()) {
try {
return requestManager.enqueueRequest(buildReloadRequest(maybeService.get(), requestId, noValidate));
} catch (Exception e) {
return BaragonResponse.failure(requestId, e.getMessage());
}
} else {
return BaragonResponse.serviceNotFound(requestId, serviceId);
}
}
public BaragonResponse enqueueRemoveService(String serviceId, boolean noValidate, boolean noReload) {
String requestId = String.format("%s-%s-%s", serviceId, System.currentTimeMillis(), "DELETE");
Optional<BaragonService> maybeService = stateDatastore.getService(serviceId);
if (maybeService.isPresent()) {
try {
return requestManager.enqueueRequest(buildRemoveRequest(maybeService.get(), requestId, noValidate, noReload));
} catch (Exception e) {
return BaragonResponse.failure(requestId, e.getMessage());
}
} else {
return BaragonResponse.serviceNotFound(requestId, serviceId);
}
}
private BaragonRequest buildRemoveRequest(BaragonService service, String requestId, boolean noValidate, boolean noReload) throws Exception {
List<UpstreamInfo> empty = Collections.emptyList();
List<UpstreamInfo> remove;
remove = new ArrayList<>(stateDatastore.getUpstreams(service.getServiceId()));
return new BaragonRequest(requestId, service, empty, remove, empty, Optional.<String>absent(), Optional.of(RequestAction.DELETE), noValidate, noReload);
}
private BaragonRequest buildReloadRequest(BaragonService service, String requestId, boolean noValidate) {
List<UpstreamInfo> empty = Collections.emptyList();
return new BaragonRequest(requestId, service, empty, empty, empty, Optional.<String>absent(), Optional.of(RequestAction.RELOAD), noValidate, false);
}
}