use of com.epam.pipeline.entity.notification.NotificationSettings in project cloud-pipeline by epam.
the class NotificationManager method notifyIdleRuns.
/**
* Issues a notification of an idle Pipeline Run for multiple runs.
*
* @param pipelineCpuRatePairs a list of pairs of PipelineRun and Double cpu usage rate value
* @param notificationType a type of notification to be issued. Supported types are IDLE_RUN, IDLE_RUN_PAUSED,
* IDLE_RUN_STOPPED
* @throws IllegalArgumentException if notificationType is not from IDLE_RUN group
*/
@Transactional(propagation = Propagation.REQUIRED)
public void notifyIdleRuns(List<Pair<PipelineRun, Double>> pipelineCpuRatePairs, NotificationType notificationType) {
if (CollectionUtils.isEmpty(pipelineCpuRatePairs)) {
return;
}
Assert.isTrue(NotificationSettings.NotificationGroup.IDLE_RUN == notificationType.getGroup(), "Only IDLE_RUN group notification types are allowed");
NotificationSettings idleRunSettings = notificationSettingsManager.load(notificationType);
if (idleRunSettings == null || !idleRunSettings.isEnabled()) {
LOGGER.info("No template configured for idle pipeline run notifications or it was disabled!");
return;
}
List<Long> ccUserIds = getKeepInformedUserIds(idleRunSettings);
if (idleRunSettings.isKeepInformedAdmins()) {
ExtendedRole extendedRole = roleManager.loadRoleWithUsers(DefaultRoles.ROLE_ADMIN.getId());
ccUserIds.addAll(extendedRole.getUsers().stream().map(PipelineUser::getId).collect(Collectors.toList()));
}
double idleCpuLevel = preferenceManager.getPreference(SystemPreferences.SYSTEM_IDLE_CPU_THRESHOLD_PERCENT);
Map<String, PipelineUser> pipelineOwners = userManager.loadUsersByNames(pipelineCpuRatePairs.stream().map(p -> p.getLeft().getOwner()).collect(Collectors.toList())).stream().collect(Collectors.toMap(PipelineUser::getUserName, user -> user));
List<NotificationMessage> messages = pipelineCpuRatePairs.stream().map(pair -> {
NotificationMessage message = new NotificationMessage();
message.setTemplate(new NotificationTemplate(idleRunSettings.getTemplateId()));
message.setTemplateParameters(PipelineRunMapper.map(pair.getLeft(), null));
message.getTemplateParameters().put("idleCpuLevel", idleCpuLevel);
message.getTemplateParameters().put("cpuRate", pair.getRight() * PERCENT);
message.setToUserId(pipelineOwners.getOrDefault(pair.getLeft().getOwner(), new PipelineUser()).getId());
message.setCopyUserIds(ccUserIds);
return message;
}).collect(Collectors.toList());
monitoringNotificationDao.createMonitoringNotifications(messages);
}
use of com.epam.pipeline.entity.notification.NotificationSettings in project cloud-pipeline by epam.
the class NotificationSettingsManager method loadAll.
public List<NotificationSettings> loadAll() {
List<NotificationSettings> settings = notificationSettingsDao.loadAllNotificationsSettings();
Set<NotificationType> existingTemplateTypes = settings.stream().map(NotificationSettings::getType).collect(Collectors.toSet());
for (NotificationType type : NotificationType.values()) {
if (!existingTemplateTypes.contains(type)) {
NotificationSettings defaultSetting = NotificationSettings.getDefault(type);
settings.add(defaultSetting);
}
}
return settings;
}
use of com.epam.pipeline.entity.notification.NotificationSettings in project cloud-pipeline by epam.
the class PodMonitor method notifyIfExceedsThreshold.
private void notifyIfExceedsThreshold(PipelineRun run, Pod pod, NotificationType type) {
NotificationSettings settings = notificationSettingsManager.load(type);
if (settings == null || !settings.isEnabled()) {
LOGGER.warn(messageHelper.getMessage(MessageConstants.ERROR_NOTIFICATION_SETTINGS_NOT_FOUND, type));
return;
}
// get the diff measured in seconds
long threshold = settings.getThreshold();
long resendDelay = settings.getResendDelay();
boolean isClusterNode = pod.getMetadata() != null && pod.getMetadata().getLabels() != null && pod.getMetadata().getLabels().containsKey(CLUSTER_ID_LABEL);
if (threshold > 0 && !isClusterNode) {
long duration = Duration.between(run.getStartDate().toInstant(), DateUtils.now().toInstant()).abs().getSeconds();
if (duration >= threshold) {
Date lastNotificationDate = run.getLastNotificationTime();
if (checkNeedOfNotificationResend(lastNotificationDate, resendDelay)) {
notificationManager.notifyLongRunningTask(run, settings);
run.setLastNotificationTime(DateUtils.now());
pipelineRunManager.updatePipelineRunLastNotification(run);
}
}
}
}
use of com.epam.pipeline.entity.notification.NotificationSettings in project cloud-pipeline by epam.
the class NotificationSettingsManagerTest method testCreateAndUpdate.
@Test
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Throwable.class)
public void testCreateAndUpdate() {
NotificationTemplate template = createTemplate(1L, "template");
NotificationSettings settings = createSettings(NotificationType.LONG_RUNNING, template.getId(), 1L, 1L);
notificationSettingsManager.createOrUpdate(settings);
NotificationSettings loaded = notificationSettingsManager.load(NotificationType.LONG_RUNNING);
Assert.assertNotNull(loaded);
Assert.assertEquals(NotificationType.LONG_RUNNING, loaded.getType());
Assert.assertEquals(1L, loaded.getThreshold().longValue());
Assert.assertEquals(settings.isKeepInformedOwner(), loaded.isKeepInformedOwner());
settings.setThreshold(2L);
notificationSettingsManager.createOrUpdate(settings);
loaded = notificationSettingsManager.load(NotificationType.LONG_RUNNING);
Assert.assertNotNull(loaded);
Assert.assertEquals(2L, loaded.getThreshold().longValue());
}
use of com.epam.pipeline.entity.notification.NotificationSettings in project cloud-pipeline by epam.
the class NotificationManagerTest method createSettings.
private NotificationSettings createSettings(NotificationType type, long templateId, long threshold, long delay) {
NotificationSettings settings = new NotificationSettings();
settings.setType(type);
settings.setKeepInformedAdmins(true);
settings.setInformedUserIds(Collections.emptyList());
settings.setTemplateId(templateId);
settings.setThreshold(threshold);
settings.setResendDelay(delay);
settings.setEnabled(true);
settings.setKeepInformedOwner(true);
notificationSettingsDao.createNotificationSettings(settings);
return settings;
}
Aggregations