Merge pull request #7554 from dmytro-landiak/alarm-subscriptions
[3.4.2] Fix alarm subscriptions on rest api
This commit is contained in:
commit
1ed5e5b115
@ -40,6 +40,7 @@ import org.thingsboard.server.dao.edge.EdgeService;
|
|||||||
import org.thingsboard.server.dao.model.ModelConstants;
|
import org.thingsboard.server.dao.model.ModelConstants;
|
||||||
import org.thingsboard.server.service.executors.DbCallbackExecutorService;
|
import org.thingsboard.server.service.executors.DbCallbackExecutorService;
|
||||||
import org.thingsboard.server.service.sync.vc.EntitiesVersionControlService;
|
import org.thingsboard.server.service.sync.vc.EntitiesVersionControlService;
|
||||||
|
import org.thingsboard.server.service.telemetry.AlarmSubscriptionService;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@ -62,6 +63,8 @@ public abstract class AbstractTbEntityService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
protected AlarmService alarmService;
|
protected AlarmService alarmService;
|
||||||
@Autowired
|
@Autowired
|
||||||
|
protected AlarmSubscriptionService alarmSubscriptionService;
|
||||||
|
@Autowired
|
||||||
protected CustomerService customerService;
|
protected CustomerService customerService;
|
||||||
@Autowired
|
@Autowired
|
||||||
protected TbClusterService tbClusterService;
|
protected TbClusterService tbClusterService;
|
||||||
|
|||||||
@ -29,7 +29,6 @@ import org.thingsboard.server.common.data.audit.ActionType;
|
|||||||
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
||||||
import org.thingsboard.server.common.data.id.EdgeId;
|
import org.thingsboard.server.common.data.id.EdgeId;
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
import org.thingsboard.server.dao.alarm.AlarmOperationResult;
|
|
||||||
import org.thingsboard.server.service.entitiy.AbstractTbEntityService;
|
import org.thingsboard.server.service.entitiy.AbstractTbEntityService;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -43,7 +42,7 @@ public class DefaultTbAlarmService extends AbstractTbEntityService implements Tb
|
|||||||
ActionType actionType = alarm.getId() == null ? ActionType.ADDED : ActionType.UPDATED;
|
ActionType actionType = alarm.getId() == null ? ActionType.ADDED : ActionType.UPDATED;
|
||||||
TenantId tenantId = alarm.getTenantId();
|
TenantId tenantId = alarm.getTenantId();
|
||||||
try {
|
try {
|
||||||
Alarm savedAlarm = checkNotNull(alarmService.createOrUpdateAlarm(alarm).getAlarm());
|
Alarm savedAlarm = checkNotNull(alarmSubscriptionService.createOrUpdateAlarm(alarm));
|
||||||
notificationEntityService.notifyCreateOrUpdateAlarm(savedAlarm, actionType, user);
|
notificationEntityService.notifyCreateOrUpdateAlarm(savedAlarm, actionType, user);
|
||||||
return savedAlarm;
|
return savedAlarm;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@ -55,7 +54,7 @@ public class DefaultTbAlarmService extends AbstractTbEntityService implements Tb
|
|||||||
@Override
|
@Override
|
||||||
public ListenableFuture<Void> ack(Alarm alarm, User user) {
|
public ListenableFuture<Void> ack(Alarm alarm, User user) {
|
||||||
long ackTs = System.currentTimeMillis();
|
long ackTs = System.currentTimeMillis();
|
||||||
ListenableFuture<AlarmOperationResult> future = alarmService.ackAlarm(alarm.getTenantId(), alarm.getId(), ackTs);
|
ListenableFuture<Boolean> future = alarmSubscriptionService.ackAlarm(alarm.getTenantId(), alarm.getId(), ackTs);
|
||||||
return Futures.transform(future, result -> {
|
return Futures.transform(future, result -> {
|
||||||
alarm.setAckTs(ackTs);
|
alarm.setAckTs(ackTs);
|
||||||
alarm.setStatus(alarm.getStatus().isCleared() ? AlarmStatus.CLEARED_ACK : AlarmStatus.ACTIVE_ACK);
|
alarm.setStatus(alarm.getStatus().isCleared() ? AlarmStatus.CLEARED_ACK : AlarmStatus.ACTIVE_ACK);
|
||||||
@ -67,7 +66,7 @@ public class DefaultTbAlarmService extends AbstractTbEntityService implements Tb
|
|||||||
@Override
|
@Override
|
||||||
public ListenableFuture<Void> clear(Alarm alarm, User user) {
|
public ListenableFuture<Void> clear(Alarm alarm, User user) {
|
||||||
long clearTs = System.currentTimeMillis();
|
long clearTs = System.currentTimeMillis();
|
||||||
ListenableFuture<AlarmOperationResult> future = alarmService.clearAlarm(alarm.getTenantId(), alarm.getId(), null, clearTs);
|
ListenableFuture<Boolean> future = alarmSubscriptionService.clearAlarm(alarm.getTenantId(), alarm.getId(), null, clearTs);
|
||||||
return Futures.transform(future, result -> {
|
return Futures.transform(future, result -> {
|
||||||
alarm.setClearTs(clearTs);
|
alarm.setClearTs(clearTs);
|
||||||
alarm.setStatus(alarm.getStatus().isAck() ? AlarmStatus.CLEARED_ACK : AlarmStatus.CLEARED_UNACK);
|
alarm.setStatus(alarm.getStatus().isAck() ? AlarmStatus.CLEARED_ACK : AlarmStatus.CLEARED_UNACK);
|
||||||
@ -82,6 +81,6 @@ public class DefaultTbAlarmService extends AbstractTbEntityService implements Tb
|
|||||||
List<EdgeId> relatedEdgeIds = edgeService.findAllRelatedEdgeIds(tenantId, alarm.getOriginator());
|
List<EdgeId> relatedEdgeIds = edgeService.findAllRelatedEdgeIds(tenantId, alarm.getOriginator());
|
||||||
notificationEntityService.notifyDeleteAlarm(tenantId, alarm, alarm.getOriginator(), alarm.getCustomerId(),
|
notificationEntityService.notifyDeleteAlarm(tenantId, alarm, alarm.getOriginator(), alarm.getCustomerId(),
|
||||||
relatedEdgeIds, user, JacksonUtil.toString(alarm));
|
relatedEdgeIds, user, JacksonUtil.toString(alarm));
|
||||||
return alarmService.deleteAlarm(tenantId, alarm.getId()).isSuccessful();
|
return alarmSubscriptionService.deleteAlarm(tenantId, alarm.getId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -0,0 +1,115 @@
|
|||||||
|
/**
|
||||||
|
* Copyright © 2016-2022 The Thingsboard Authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.thingsboard.server.service.entitiy.alarm;
|
||||||
|
|
||||||
|
import com.google.common.util.concurrent.Futures;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.springframework.boot.test.mock.mockito.MockBean;
|
||||||
|
import org.springframework.boot.test.mock.mockito.SpyBean;
|
||||||
|
import org.springframework.test.context.ContextConfiguration;
|
||||||
|
import org.springframework.test.context.TestPropertySource;
|
||||||
|
import org.springframework.test.context.junit4.SpringRunner;
|
||||||
|
import org.thingsboard.server.cluster.TbClusterService;
|
||||||
|
import org.thingsboard.server.common.data.User;
|
||||||
|
import org.thingsboard.server.common.data.alarm.Alarm;
|
||||||
|
import org.thingsboard.server.common.data.alarm.AlarmStatus;
|
||||||
|
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
||||||
|
import org.thingsboard.server.dao.alarm.AlarmService;
|
||||||
|
import org.thingsboard.server.dao.customer.CustomerService;
|
||||||
|
import org.thingsboard.server.dao.edge.EdgeService;
|
||||||
|
import org.thingsboard.server.service.entitiy.TbNotificationEntityService;
|
||||||
|
import org.thingsboard.server.service.executors.DbCallbackExecutorService;
|
||||||
|
import org.thingsboard.server.service.sync.vc.EntitiesVersionControlService;
|
||||||
|
import org.thingsboard.server.service.telemetry.AlarmSubscriptionService;
|
||||||
|
|
||||||
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyLong;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyString;
|
||||||
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
|
import static org.mockito.Mockito.times;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@RunWith(SpringRunner.class)
|
||||||
|
@ContextConfiguration(classes = DefaultTbAlarmService.class)
|
||||||
|
@TestPropertySource(properties = {
|
||||||
|
"server.log_controller_error_stack_trace=false"
|
||||||
|
})
|
||||||
|
public class DefaultTbAlarmServiceTest {
|
||||||
|
|
||||||
|
@MockBean
|
||||||
|
protected DbCallbackExecutorService dbExecutor;
|
||||||
|
@MockBean
|
||||||
|
protected TbNotificationEntityService notificationEntityService;
|
||||||
|
@MockBean
|
||||||
|
protected EdgeService edgeService;
|
||||||
|
@MockBean
|
||||||
|
protected AlarmService alarmService;
|
||||||
|
@MockBean
|
||||||
|
protected AlarmSubscriptionService alarmSubscriptionService;
|
||||||
|
@MockBean
|
||||||
|
protected CustomerService customerService;
|
||||||
|
@MockBean
|
||||||
|
protected TbClusterService tbClusterService;
|
||||||
|
@MockBean
|
||||||
|
private EntitiesVersionControlService vcService;
|
||||||
|
|
||||||
|
@SpyBean
|
||||||
|
DefaultTbAlarmService service;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSave() throws ThingsboardException {
|
||||||
|
var alarm = new Alarm();
|
||||||
|
when(alarmSubscriptionService.createOrUpdateAlarm(alarm)).thenReturn(alarm);
|
||||||
|
service.save(alarm, new User());
|
||||||
|
|
||||||
|
verify(notificationEntityService, times(1)).notifyCreateOrUpdateAlarm(any(), any(), any());
|
||||||
|
verify(alarmSubscriptionService, times(1)).createOrUpdateAlarm(eq(alarm));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAck() {
|
||||||
|
var alarm = new Alarm();
|
||||||
|
alarm.setStatus(AlarmStatus.ACTIVE_UNACK);
|
||||||
|
when(alarmSubscriptionService.ackAlarm(any(), any(), anyLong())).thenReturn(Futures.immediateFuture(true));
|
||||||
|
service.ack(alarm, new User());
|
||||||
|
|
||||||
|
verify(notificationEntityService, times(1)).notifyCreateOrUpdateAlarm(any(), any(), any());
|
||||||
|
verify(alarmSubscriptionService, times(1)).ackAlarm(any(), any(), anyLong());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testClear() {
|
||||||
|
var alarm = new Alarm();
|
||||||
|
alarm.setStatus(AlarmStatus.ACTIVE_ACK);
|
||||||
|
when(alarmSubscriptionService.clearAlarm(any(), any(), any(), anyLong())).thenReturn(Futures.immediateFuture(true));
|
||||||
|
service.clear(alarm, new User());
|
||||||
|
|
||||||
|
verify(notificationEntityService, times(1)).notifyCreateOrUpdateAlarm(any(), any(), any());
|
||||||
|
verify(alarmSubscriptionService, times(1)).clearAlarm(any(), any(), any(), anyLong());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDelete() {
|
||||||
|
service.delete(new Alarm(), new User());
|
||||||
|
|
||||||
|
verify(notificationEntityService, times(1)).notifyDeleteAlarm(any(), any(), any(), any(), any(), any(), anyString());
|
||||||
|
verify(alarmSubscriptionService, times(1)).deleteAlarm(any(), any());
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user