package com.sequenceiq.periscope.rest.controller;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import javax.inject.Inject;
import javax.transaction.Transactional;
import org.springframework.stereotype.Component;
import com.sequenceiq.periscope.api.endpoint.AlertEndpoint;
import com.sequenceiq.periscope.api.model.AlertRuleDefinitionEntry;
import com.sequenceiq.periscope.api.model.MetricAlertJson;
import com.sequenceiq.periscope.api.model.PrometheusAlertJson;
import com.sequenceiq.periscope.api.model.TimeAlertJson;
import com.sequenceiq.periscope.domain.MetricAlert;
import com.sequenceiq.periscope.domain.PrometheusAlert;
import com.sequenceiq.periscope.domain.TimeAlert;
import com.sequenceiq.periscope.rest.converter.MetricAlertConverter;
import com.sequenceiq.periscope.rest.converter.PrometheusAlertConverter;
import com.sequenceiq.periscope.rest.converter.TimeAlertConverter;
import com.sequenceiq.periscope.service.AlertService;
import com.sequenceiq.periscope.utils.DateUtils;
@Component
public class AlertController implements AlertEndpoint {
@Inject
private AlertService alertService;
@Inject
private MetricAlertConverter metricAlertConverter;
@Inject
private TimeAlertConverter timeAlertConverter;
@Inject
private PrometheusAlertConverter prometheusAlertConverter;
@Override
public MetricAlertJson createAlerts(Long clusterId, MetricAlertJson json) {
MetricAlert metricAlert = metricAlertConverter.convert(json);
return createMetricAlarmResponse(alertService.createMetricAlert(clusterId, metricAlert));
}
@Override
public MetricAlertJson updateAlerts(Long clusterId, Long alertId, MetricAlertJson json) {
MetricAlert metricAlert = metricAlertConverter.convert(json);
return createMetricAlarmResponse(alertService.updateMetricAlert(clusterId, alertId, metricAlert));
}
@Override
@Transactional
public List<MetricAlertJson> getAlerts(Long clusterId) {
return createAlarmsResponse(alertService.getMetricAlerts(clusterId));
}
@Override
public void deleteAlarm(Long clusterId, Long alertId) {
alertService.deleteMetricAlert(clusterId, alertId);
}
@Override
public List<Map<String, Object>> getAlertDefinitions(Long clusterId) {
return alertService.getAlertDefinitions(clusterId);
}
@Override
public TimeAlertJson createTimeAlert(Long clusterId, TimeAlertJson json) throws ParseException {
TimeAlert timeAlert = validateTimeAlert(json);
return createTimeAlertResponse(alertService.createTimeAlert(clusterId, timeAlert));
}
@Override
public TimeAlertJson setTimeAlert(Long clusterId, Long alertId, TimeAlertJson json)
throws ParseException {
TimeAlert timeAlert = validateTimeAlert(json);
return createTimeAlertResponse(alertService.updateTimeAlert(clusterId, alertId, timeAlert));
}
@Override
public List<TimeAlertJson> getTimeAlerts(Long clusterId) {
Set<TimeAlert> timeAlerts = alertService.getTimeAlerts(clusterId);
return createTimeAlertsResponse(timeAlerts);
}
@Override
public void deleteTimeAlert(Long clusterId, Long alertId) {
alertService.deleteTimeAlert(clusterId, alertId);
}
@Override
public PrometheusAlertJson createPrometheusAlert(Long clusterId, PrometheusAlertJson json) {
PrometheusAlert prometheusAlert = prometheusAlertConverter.convert(json);
return createPrometheusAlertResponse(alertService.createPrometheusAlert(clusterId, prometheusAlert));
}
@Override
public PrometheusAlertJson updatePrometheusAlert(Long clusterId, Long alertId, PrometheusAlertJson json) {
PrometheusAlert prometheusAlert = prometheusAlertConverter.convert(json);
return createPrometheusAlertResponse(alertService.updatePrometheusAlert(clusterId, alertId, prometheusAlert));
}
@Override
public List<PrometheusAlertJson> getPrometheusAlerts(Long clusterId) {
return alertService.getPrometheusAlerts(clusterId).stream()
.map(this::createPrometheusAlertResponse).collect(Collectors.toList());
}
@Override
public void deletePrometheusAlarm(Long clusterId, Long alertId) {
alertService.deletePrometheusAlert(clusterId, alertId);
}
@Override
public List<AlertRuleDefinitionEntry> getPrometheusDefinitions(Long clusterId) {
return alertService.getPrometheusAlertDefinitions();
}
private TimeAlert validateTimeAlert(TimeAlertJson json) throws ParseException {
TimeAlert alert = timeAlertConverter.convert(json);
DateUtils.getCronExpression(alert.getCron());
return alert;
}
private List<MetricAlertJson> createAlarmsResponse(Set<MetricAlert> alerts) {
List<MetricAlert> metricAlerts = new ArrayList<>();
metricAlerts.addAll(alerts);
return metricAlertConverter.convertAllToJson(metricAlerts);
}
private List<TimeAlertJson> createTimeAlertsResponse(Set<TimeAlert> alarms) {
List<TimeAlert> metricAlarms = new ArrayList<>();
metricAlarms.addAll(alarms);
return createTimeAlertsResponse(metricAlarms);
}
private MetricAlertJson createMetricAlarmResponse(MetricAlert alert) {
return metricAlertConverter.convert(alert);
}
private TimeAlertJson createTimeAlertResponse(TimeAlert alarm) {
return timeAlertConverter.convert(alarm);
}
private List<TimeAlertJson> createTimeAlertsResponse(List<TimeAlert> alarms) {
return timeAlertConverter.convertAllToJson(alarms);
}
private PrometheusAlertJson createPrometheusAlertResponse(PrometheusAlert alarm) {
return prometheusAlertConverter.convert(alarm);
}
}