package com.linkedin.thirdeye.dashboard.resources; import com.fasterxml.jackson.databind.ObjectMapper; import com.linkedin.thirdeye.client.DAORegistry; import com.linkedin.thirdeye.datalayer.bao.OverrideConfigManager; import com.linkedin.thirdeye.datalayer.dto.OverrideConfigDTO; import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.validation.constraints.NotNull; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Path("/dashboard") @Produces(MediaType.APPLICATION_JSON) public class OverrideConfigResource { private static final Logger LOG = LoggerFactory.getLogger(OverrideConfigResource.class); private static final DAORegistry DAO_REGISTRY = DAORegistry.getInstance(); private static ObjectMapper OBJECT_MAPPER = new ObjectMapper(); @GET @Path("/override-config/view") public List<OverrideConfigDTO> viewOverrideConfig ( @NotNull @QueryParam("startTime") long startTimeMillis, @NotNull @QueryParam("endTime") long endTimeMillis, @QueryParam("targetEntity") String targetEntity) { OverrideConfigManager overrideConfigDAO = DAO_REGISTRY.getOverrideConfigDAO(); if (StringUtils.isEmpty(targetEntity)) { return overrideConfigDAO.findAllConflict(startTimeMillis, endTimeMillis); } else { return overrideConfigDAO .findAllConflictByTargetType(targetEntity, startTimeMillis, endTimeMillis); } } @POST @Path("/override-config/create") public Response createOverrideConfig( @NotNull @QueryParam("startTime") long startTimeMillis, @NotNull @QueryParam("endTime") long endTimeMillis, @QueryParam("targetLevel") String targetLevelJson, @NotNull @QueryParam("targetEntity") String targetEntity, @QueryParam("overrideProperties") String overridePropertiesJson, @QueryParam("active") boolean active) { Map<String, List<String>> targetLevel; if (StringUtils.isEmpty(targetLevelJson)) { targetLevel = Collections.emptyMap(); } else { try { targetLevel = OBJECT_MAPPER.readValue(targetLevelJson, HashMap.class); } catch (IOException e) { LOG.error("Invalid JSON string {}", targetLevelJson); return Response.status(Response.Status.NOT_ACCEPTABLE).build(); } } if (StringUtils.isEmpty(targetEntity)) { LOG.error("Received null for one of the mandatory params \"targetEntity\": {}", targetEntity); return Response.status(Response.Status.NOT_ACCEPTABLE).build(); } Map<String, String> overrideProperties; if (StringUtils.isEmpty(overridePropertiesJson)) { overrideProperties = Collections.emptyMap(); } else { try { overrideProperties = OBJECT_MAPPER.readValue(overridePropertiesJson, HashMap.class); } catch (IOException e) { LOG.error("Invalid JSON string {}", overridePropertiesJson); return Response.status(Response.Status.NOT_ACCEPTABLE).build(); } } OverrideConfigDTO overrideConfigDTO = new OverrideConfigDTO(); overrideConfigDTO.setStartTime(startTimeMillis); overrideConfigDTO.setEndTime(endTimeMillis); overrideConfigDTO.setTargetLevel(targetLevel); overrideConfigDTO.setTargetEntity(targetEntity); overrideConfigDTO.setOverrideProperties(overrideProperties); overrideConfigDTO.setActive(active); OverrideConfigManager overrideConfigDAO = DAO_REGISTRY.getOverrideConfigDAO(); // Check if there exists any duplicate override config List<OverrideConfigDTO> existingOverrideConfigDTOs = overrideConfigDAO.findAllConflictByTargetType(targetEntity, startTimeMillis, endTimeMillis); for (OverrideConfigDTO existingOverrideConfig : existingOverrideConfigDTOs) { if (existingOverrideConfig.equals(overrideConfigDTO)) { LOG.error("Exists a duplicate override config: {}", existingOverrideConfig.toString()); return Response.status(Response.Status.NOT_ACCEPTABLE).build(); } } overrideConfigDAO.save(overrideConfigDTO); return Response.ok().build(); } @POST @Path("/override-config/update") public Response updateOverrideConfig( @NotNull @QueryParam("id") long id, @NotNull @QueryParam("startTime") long startTimeMillis, @NotNull @QueryParam("endTime") long endTimeMillis, @QueryParam("targetLevel") String targetLevelJson, @NotNull @QueryParam("targetEntity") String targetEntity, @QueryParam("overrideProperties") String overridePropertiesJson, @QueryParam("active") boolean active) { Map<String, List<String>> targetLevel; if (StringUtils.isEmpty(targetLevelJson)) { targetLevel = Collections.emptyMap(); } else { try { targetLevel = OBJECT_MAPPER.readValue(targetLevelJson, HashMap.class); } catch (IOException e) { LOG.error("Invalid JSON string {}", targetLevelJson); return Response.status(Response.Status.NOT_ACCEPTABLE).build(); } } if (StringUtils.isEmpty(targetEntity)) { LOG.error("Received null for one of the mandatory params \"targetEntity\": {}", targetEntity); return Response.status(Response.Status.NOT_ACCEPTABLE).build(); } Map<String, String> overrideProperties; if (StringUtils.isEmpty(overridePropertiesJson)) { overrideProperties = Collections.emptyMap(); } else { try { overrideProperties = OBJECT_MAPPER.readValue(overridePropertiesJson, HashMap.class); } catch (IOException e) { LOG.error("Invalid JSON string {}", overridePropertiesJson); return Response.status(Response.Status.NOT_ACCEPTABLE).build(); } } OverrideConfigManager overrideConfigDAO = DAO_REGISTRY.getOverrideConfigDAO(); OverrideConfigDTO overrideConfigDTO = overrideConfigDAO.findById(id); if (overrideConfigDTO == null) { LOG.error("Unable to find override config with id {}", id); return Response.status(Response.Status.NOT_ACCEPTABLE).build(); } overrideConfigDTO.setStartTime(startTimeMillis); overrideConfigDTO.setEndTime(endTimeMillis); overrideConfigDTO.setTargetLevel(targetLevel); overrideConfigDTO.setTargetEntity(targetEntity); overrideConfigDTO.setOverrideProperties(overrideProperties); overrideConfigDTO.setActive(active); overrideConfigDAO.update(overrideConfigDTO); return Response.ok().build(); } @DELETE @Path("/override-config/delete") public Response deleteOverrideConfig(@NotNull @QueryParam("id") long id) { OverrideConfigManager overrideConfigDAO = DAO_REGISTRY.getOverrideConfigDAO(); overrideConfigDAO.deleteById(id); return Response.ok().build(); } }