package com.hubspot.baragon.service.resources; import javax.ws.rs.DELETE; import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; import javax.ws.rs.HeaderParam; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.ResponseBuilder; import com.codahale.metrics.annotation.Timed; import com.google.common.base.Optional; import com.google.common.net.HttpHeaders; import com.google.inject.Inject; import com.hubspot.baragon.auth.NoAuth; import com.hubspot.baragon.cache.BaragonStateCache; import com.hubspot.baragon.cache.CachedBaragonState; import com.hubspot.baragon.models.BaragonResponse; import com.hubspot.baragon.models.BaragonServiceState; import com.hubspot.baragon.service.managers.ServiceManager; @Path("/state") @Produces(MediaType.APPLICATION_JSON) public class StateResource { private final ServiceManager serviceManager; private final BaragonStateCache stateCache; @HeaderParam(HttpHeaders.ACCEPT_ENCODING) private String acceptEncoding; @Inject public StateResource(ServiceManager serviceManager, BaragonStateCache stateCache) { this.serviceManager = serviceManager; this.stateCache = stateCache; } @GET @NoAuth @Timed public Response getAllServices() { CachedBaragonState state = stateCache.getState(); ResponseBuilder builder = Response.ok(); final byte[] entity; if (acceptEncoding != null && acceptEncoding.contains("gzip")) { builder.header(HttpHeaders.CONTENT_ENCODING, "gzip"); entity = state.getGzip(); } else { entity = state.getUncompressed(); } return builder.entity(entity).build(); } @GET @NoAuth @Path("/{serviceId}") public Optional<BaragonServiceState> getService(@PathParam("serviceId") String serviceId) { return serviceManager.getService(serviceId); } @POST @Path("/{serviceId}/reload") public BaragonResponse reloadConfigs(@PathParam("serviceId") String serviceId, @DefaultValue("false") @QueryParam("noValidate") boolean noValidate) { return serviceManager.enqueueReloadServiceConfigs(serviceId, noValidate); } @DELETE @Path("/{serviceId}") public BaragonResponse removeService(@PathParam("serviceId") String serviceId, @DefaultValue("false") @QueryParam("noValidate") boolean noValidate, @DefaultValue("false") @QueryParam("noReload") boolean noReload) { return serviceManager.enqueueRemoveService(serviceId, noValidate, noReload); } }