|
|
|
@ -68,6 +68,8 @@ import org.thingsboard.server.common.data.notification.rule.NotificationRule; |
|
|
|
import org.thingsboard.server.common.data.notification.rule.NotificationRuleInfo; |
|
|
|
import org.thingsboard.server.common.data.notification.rule.trigger.NewPlatformVersionTrigger; |
|
|
|
import org.thingsboard.server.common.data.notification.rule.trigger.RateLimitsTrigger; |
|
|
|
import org.thingsboard.server.common.data.notification.rule.trigger.ResourcesShortageTrigger; |
|
|
|
import org.thingsboard.server.common.data.notification.rule.trigger.ResourcesShortageTrigger.Resource; |
|
|
|
import org.thingsboard.server.common.data.notification.rule.trigger.config.AlarmAssignmentNotificationRuleTriggerConfig; |
|
|
|
import org.thingsboard.server.common.data.notification.rule.trigger.config.AlarmCommentNotificationRuleTriggerConfig; |
|
|
|
import org.thingsboard.server.common.data.notification.rule.trigger.config.AlarmNotificationRuleTriggerConfig; |
|
|
|
@ -78,6 +80,7 @@ import org.thingsboard.server.common.data.notification.rule.trigger.config.Entit |
|
|
|
import org.thingsboard.server.common.data.notification.rule.trigger.config.NewPlatformVersionNotificationRuleTriggerConfig; |
|
|
|
import org.thingsboard.server.common.data.notification.rule.trigger.config.NotificationRuleTriggerType; |
|
|
|
import org.thingsboard.server.common.data.notification.rule.trigger.config.RateLimitsNotificationRuleTriggerConfig; |
|
|
|
import org.thingsboard.server.common.data.notification.rule.trigger.config.ResourcesShortageNotificationRuleTriggerConfig; |
|
|
|
import org.thingsboard.server.common.data.notification.targets.NotificationTarget; |
|
|
|
import org.thingsboard.server.common.data.notification.targets.platform.AffectedTenantAdministratorsFilter; |
|
|
|
import org.thingsboard.server.common.data.notification.targets.platform.SystemAdministratorsFilter; |
|
|
|
@ -91,6 +94,7 @@ import org.thingsboard.server.common.data.rule.RuleChain; |
|
|
|
import org.thingsboard.server.common.data.rule.RuleChainMetaData; |
|
|
|
import org.thingsboard.server.common.data.security.Authority; |
|
|
|
import org.thingsboard.server.common.msg.notification.NotificationRuleProcessor; |
|
|
|
import org.thingsboard.server.controller.TbTestWebSocketClient; |
|
|
|
import org.thingsboard.server.dao.notification.DefaultNotifications; |
|
|
|
import org.thingsboard.server.dao.notification.NotificationRequestService; |
|
|
|
import org.thingsboard.server.dao.rule.RuleChainService; |
|
|
|
@ -98,8 +102,10 @@ import org.thingsboard.server.dao.service.DaoSqlTest; |
|
|
|
import org.thingsboard.server.queue.notification.DefaultNotificationDeduplicationService; |
|
|
|
import org.thingsboard.server.service.notification.rule.cache.DefaultNotificationRulesCache; |
|
|
|
import org.thingsboard.server.service.state.DeviceStateService; |
|
|
|
import org.thingsboard.server.service.system.DefaultSystemInfoService; |
|
|
|
import org.thingsboard.server.service.telemetry.AlarmSubscriptionService; |
|
|
|
|
|
|
|
import java.lang.reflect.Method; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.List; |
|
|
|
@ -134,6 +140,8 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { |
|
|
|
@SpyBean |
|
|
|
private AlarmSubscriptionService alarmSubscriptionService; |
|
|
|
@Autowired |
|
|
|
private DefaultSystemInfoService systemInfoService; |
|
|
|
@Autowired |
|
|
|
private NotificationRequestService notificationRequestService; |
|
|
|
@Autowired |
|
|
|
private RateLimitService rateLimitService; |
|
|
|
@ -254,7 +262,7 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { |
|
|
|
assertThat(info.getAlarmStatus()).isEqualTo(AlarmStatus.ACTIVE_UNACK); |
|
|
|
}); |
|
|
|
|
|
|
|
clients.values().forEach(wsClient -> wsClient.registerWaitForUpdate()); |
|
|
|
clients.values().forEach(TbTestWebSocketClient::registerWaitForUpdate); |
|
|
|
alarmSubscriptionService.acknowledgeAlarm(tenantId, alarm.getId(), System.currentTimeMillis()); |
|
|
|
AlarmStatus expectedStatus = AlarmStatus.ACTIVE_ACK; |
|
|
|
AlarmSeverity expectedSeverity = AlarmSeverity.CRITICAL; |
|
|
|
@ -638,7 +646,7 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { |
|
|
|
rule = saveNotificationRule(rule); |
|
|
|
|
|
|
|
NotificationRuleInfo ruleInfo = findNotificationRules().getData().get(0); |
|
|
|
assertThat(ruleInfo.getId()).isEqualTo(ruleInfo.getId()); |
|
|
|
assertThat(ruleInfo.getId()).isEqualTo(rule.getId()); |
|
|
|
assertThat(ruleInfo.getTemplateName()).isEqualTo(template.getName()); |
|
|
|
assertThat(ruleInfo.getDeliveryMethods()).containsOnly(deliveryMethods); |
|
|
|
} |
|
|
|
@ -780,6 +788,59 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testNotificationRuleProcessing_resourcesShortage() throws Exception { |
|
|
|
loginSysAdmin(); |
|
|
|
ResourcesShortageNotificationRuleTriggerConfig triggerConfig = ResourcesShortageNotificationRuleTriggerConfig.builder() |
|
|
|
.ramThreshold(0.01f) |
|
|
|
.cpuThreshold(1f) |
|
|
|
.storageThreshold(1f) |
|
|
|
.build(); |
|
|
|
createNotificationRule(triggerConfig, "Warning: ${resource} shortage", "${resource} shortage", createNotificationTarget(tenantAdminUserId).getId()); |
|
|
|
loginTenantAdmin(); |
|
|
|
|
|
|
|
Method method = DefaultSystemInfoService.class.getDeclaredMethod("saveCurrentMonolithSystemInfo"); |
|
|
|
method.setAccessible(true); |
|
|
|
method.invoke(systemInfoService); |
|
|
|
|
|
|
|
await().atMost(10, TimeUnit.SECONDS).until(() -> getMyNotifications(false, 100).size() == 1); |
|
|
|
Notification notification = getMyNotifications(false, 100).get(0); |
|
|
|
assertThat(notification.getSubject()).isEqualTo("Warning: RAM shortage"); |
|
|
|
assertThat(notification.getText()).isEqualTo("RAM shortage"); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testNotificationsDeduplication_resourcesShortage() throws Exception { |
|
|
|
loginSysAdmin(); |
|
|
|
ResourcesShortageNotificationRuleTriggerConfig triggerConfig = ResourcesShortageNotificationRuleTriggerConfig.builder() |
|
|
|
.ramThreshold(0.01f) |
|
|
|
.cpuThreshold(1f) |
|
|
|
.storageThreshold(1f) |
|
|
|
.build(); |
|
|
|
createNotificationRule(triggerConfig, "Warning: ${resource} shortage", "${resource} shortage", createNotificationTarget(tenantAdminUserId).getId());it a |
|
|
|
loginTenantAdmin(); |
|
|
|
|
|
|
|
assertThat(getMyNotifications(false, 100)).size().isZero(); |
|
|
|
for (int i = 0; i < 10; i++) { |
|
|
|
notificationRuleProcessor.process(ResourcesShortageTrigger.builder() |
|
|
|
.resource(Resource.RAM) |
|
|
|
.usage(15L) |
|
|
|
.build()); |
|
|
|
TimeUnit.MILLISECONDS.sleep(300); |
|
|
|
} |
|
|
|
await().atMost(10, TimeUnit.SECONDS).until(() -> getMyNotifications(false, 100).size() == 1); |
|
|
|
Notification notification = getMyNotifications(false, 100).get(0); |
|
|
|
assertThat(notification.getSubject()).isEqualTo("Warning: RAM shortage"); |
|
|
|
assertThat(notification.getText()).isEqualTo("RAM shortage"); |
|
|
|
|
|
|
|
// deduplication is 5 minute, no new message is exp
|
|
|
|
notificationRuleProcessor.process(ResourcesShortageTrigger.builder() |
|
|
|
.resource(Resource.RAM) |
|
|
|
.usage(5L) |
|
|
|
.build()); |
|
|
|
await("").atMost(5, TimeUnit.SECONDS).untilAsserted(() -> assertThat(getMyNotifications(false, 100)).size().isOne()); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testNotificationRuleDisabling() throws Exception { |
|
|
|
EntityActionNotificationRuleTriggerConfig triggerConfig = new EntityActionNotificationRuleTriggerConfig(); |
|
|
|
|