package com.linkedin.thirdeye.dashboard.resources; import java.text.SimpleDateFormat; import java.util.List; import java.util.concurrent.TimeUnit; import javax.validation.constraints.NotNull; import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import org.apache.commons.lang3.StringUtils; import org.codehaus.jackson.node.ObjectNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.linkedin.thirdeye.client.DAORegistry; import com.linkedin.thirdeye.dashboard.Utils; import com.linkedin.thirdeye.datalayer.bao.IngraphDashboardConfigManager; import com.linkedin.thirdeye.datalayer.dto.DatasetConfigDTO; import com.linkedin.thirdeye.datalayer.dto.IngraphDashboardConfigDTO; import com.linkedin.thirdeye.util.JsonResponseUtil; @Path(value = "/thirdeye-admin/ingraph-dashboard-config") @Produces(MediaType.APPLICATION_JSON) public class IngraphDashboardConfigResource { private static final Logger LOG = LoggerFactory.getLogger(IngraphDashboardConfigResource.class); private static final DAORegistry DAO_REGISTRY = DAORegistry.getInstance(); private IngraphDashboardConfigManager ingraphDashboardConfigDAO; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); public IngraphDashboardConfigResource() { this.ingraphDashboardConfigDAO = DAO_REGISTRY.getIngraphDashboardConfigDAO(); } @GET @Path("/create") public String createDashboardConfig(@QueryParam("name") String name, @QueryParam("fabricGroup") String fabricGroup, @QueryParam("active") boolean active, @QueryParam("bootstrap") boolean bootstrap, @QueryParam("fromIngraphDashboard") boolean fromIngraphDashboard, @QueryParam("startTime") String bootstrapStartTime, @QueryParam("endTime") String bootstrapEndTime, @QueryParam("fetchIntervalPeriod") String fetchIntervalPeriod, @QueryParam("mergeNumAvroRecords") String mergeNumAvroRecords, @QueryParam("granularitySize") String granularitySize, @QueryParam("granularityUnit") String granularityUnit) { try { IngraphDashboardConfigDTO ingraphDashboardConfigDTO = new IngraphDashboardConfigDTO(); ingraphDashboardConfigDTO.setName(name); ingraphDashboardConfigDTO.setFabricGroup(fabricGroup); if (StringUtils.isNotBlank(fetchIntervalPeriod)) { ingraphDashboardConfigDTO.setFetchIntervalPeriod(Long.valueOf(fetchIntervalPeriod)); } if (StringUtils.isNotBlank(mergeNumAvroRecords)) { ingraphDashboardConfigDTO.setMergeNumAvroRecords(Integer.valueOf(mergeNumAvroRecords)); } if (StringUtils.isNotBlank(granularitySize)) { ingraphDashboardConfigDTO.setGranularitySize(Integer.valueOf(granularitySize)); } if (StringUtils.isNotBlank(granularityUnit)) { ingraphDashboardConfigDTO.setGranularityUnit(TimeUnit.valueOf(granularityUnit)); } Boolean isActive = Boolean.valueOf(active); ingraphDashboardConfigDTO.setActive(isActive); Boolean isFromIngraphDashboard = Boolean.valueOf(fromIngraphDashboard); ingraphDashboardConfigDTO.setFromIngraphDashboard(isFromIngraphDashboard); Boolean needBootstrap = Boolean.valueOf(bootstrap); ingraphDashboardConfigDTO.setBootstrap(needBootstrap); if (needBootstrap) { long startTimeInMs = sdf.parse(bootstrapStartTime).getTime(); long endTimeInMs = sdf.parse(bootstrapEndTime).getTime(); ingraphDashboardConfigDTO.setBootstrapStartTime(startTimeInMs); ingraphDashboardConfigDTO.setBootstrapEndTime(endTimeInMs); } Long id = ingraphDashboardConfigDAO.save(ingraphDashboardConfigDTO); ingraphDashboardConfigDTO.setId(id); return JsonResponseUtil.buildResponseJSON(ingraphDashboardConfigDTO).toString(); } catch (Exception e) { LOG.error("Failed to create dashboard:{}", name, e); return JsonResponseUtil.buildErrorResponseJSON("Failed to create dashboard:" + name).toString(); } } @GET @Path("/update") public String updateDashboardConfig(@NotNull @QueryParam("id") long ingraphDashboardConfigId, @QueryParam("name") String name, @QueryParam("fabricGroup") String fabricGroup, @QueryParam("active") boolean active, @QueryParam("bootstrap") boolean bootstrap , @QueryParam("fromIngraphDashboard") boolean fromIngraphDashboard, @QueryParam("startTime") String bootstrapStartTime, @QueryParam("endTime") String bootstrapEndTime, @QueryParam("fetchIntervalPeriod") String fetchIntervalPeriod, @QueryParam("mergeNumAvroRecords") String mergeNumAvroRecords, @QueryParam("granularitySize") String granularitySize, @QueryParam("granularityUnit") String granularityUnit) { try { IngraphDashboardConfigDTO ingraphDashboardConfigDTO = ingraphDashboardConfigDAO.findById(ingraphDashboardConfigId); ingraphDashboardConfigDTO.setName(name); ingraphDashboardConfigDTO.setFabricGroup(fabricGroup); if (StringUtils.isNotBlank(fetchIntervalPeriod)) { ingraphDashboardConfigDTO.setFetchIntervalPeriod(Long.valueOf(fetchIntervalPeriod)); } if (StringUtils.isNotBlank(mergeNumAvroRecords)) { ingraphDashboardConfigDTO.setMergeNumAvroRecords(Integer.valueOf(mergeNumAvroRecords)); } if (StringUtils.isNotBlank(granularitySize)) { ingraphDashboardConfigDTO.setGranularitySize(Integer.valueOf(granularitySize)); } if (StringUtils.isNotBlank(granularityUnit)) { ingraphDashboardConfigDTO.setGranularityUnit(TimeUnit.valueOf(granularityUnit)); } Boolean isActive = Boolean.valueOf(active); ingraphDashboardConfigDTO.setActive(isActive); Boolean isFromIngraphDashboard = Boolean.valueOf(fromIngraphDashboard); ingraphDashboardConfigDTO.setFromIngraphDashboard(isFromIngraphDashboard); Boolean needBootstrap = Boolean.valueOf(bootstrap); ingraphDashboardConfigDTO.setBootstrap(needBootstrap); if (needBootstrap) { long startTimeInMs = sdf.parse(bootstrapStartTime).getTime(); long endTimeInMs = sdf.parse(bootstrapEndTime).getTime(); ingraphDashboardConfigDTO.setBootstrapStartTime(startTimeInMs); ingraphDashboardConfigDTO.setBootstrapEndTime(endTimeInMs); } int numRowsUpdated = ingraphDashboardConfigDAO.update(ingraphDashboardConfigDTO); if (numRowsUpdated == 1) { return JsonResponseUtil.buildResponseJSON(ingraphDashboardConfigDTO).toString(); } else { return JsonResponseUtil.buildErrorResponseJSON("Failed to update dashboard id:" + ingraphDashboardConfigId).toString(); } } catch (Exception e) { return JsonResponseUtil.buildErrorResponseJSON("Failed to update dashboard id:" + ingraphDashboardConfigId + ". Exception:" + e.getMessage()).toString(); } } @GET @Path("/delete") public String deleteDashboardConfig(@NotNull @QueryParam("dashboard") String dashboard, @NotNull @QueryParam("id") Long dashboardConfigId) { ingraphDashboardConfigDAO.deleteById(dashboardConfigId); return JsonResponseUtil.buildSuccessResponseJSON("Successully deleted " + dashboardConfigId).toString(); } @GET @Path("/list") @Produces(MediaType.APPLICATION_JSON) public String viewDashboardConfigs(@DefaultValue("0") @QueryParam("jtStartIndex") int jtStartIndex, @DefaultValue("100") @QueryParam("jtPageSize") int jtPageSize) { List<IngraphDashboardConfigDTO> ingraphDashboardConfigDTOs = ingraphDashboardConfigDAO.findAll(); List<IngraphDashboardConfigDTO> subList = Utils.sublist(ingraphDashboardConfigDTOs, jtStartIndex, jtPageSize); ObjectNode rootNode = JsonResponseUtil.buildResponseJSON(subList); return rootNode.toString(); } }