delete alarm api added (#1431)
* delete alarm api added * delete alarm api added
This commit is contained in:
parent
06f5dfd1da
commit
9aed06a37b
@ -92,6 +92,19 @@ public class AlarmController extends BaseController {
|
||||
}
|
||||
}
|
||||
|
||||
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
||||
@RequestMapping(value = "/alarm/{alarmId}", method = RequestMethod.DELETE)
|
||||
@ResponseBody
|
||||
public Boolean deleteAlarm(@PathVariable(ALARM_ID) String strAlarmId) throws ThingsboardException {
|
||||
checkParameter(ALARM_ID, strAlarmId);
|
||||
try {
|
||||
AlarmId alarmId = new AlarmId(toUUID(strAlarmId));
|
||||
return alarmService.deleteAlarm(getTenantId(), alarmId);
|
||||
} catch (Exception e) {
|
||||
throw handleException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
||||
@RequestMapping(value = "/alarm/{alarmId}/ack", method = RequestMethod.POST)
|
||||
@ResponseStatus(value = HttpStatus.OK)
|
||||
|
||||
@ -28,7 +28,7 @@ export LOADER_PATH=${BASE}/conf,${BASE}/extensions
|
||||
export SQL_DATA_FOLDER=${SQL_DATA_FOLDER:-/tmp}
|
||||
|
||||
|
||||
run_user=thingsboard
|
||||
run_user="$USER"
|
||||
|
||||
sudo -u "$run_user" -s /bin/sh -c "java -cp ${jarfile} $JAVA_OPTS -Dloader.main=org.thingsboard.server.ThingsboardInstallApplication \
|
||||
-Dinstall.data_dir=${installDir} \
|
||||
|
||||
@ -31,6 +31,8 @@ import java.util.UUID;
|
||||
*/
|
||||
public interface AlarmDao extends Dao<Alarm> {
|
||||
|
||||
Boolean deleteAlarm(TenantId tenantId, Alarm alarm);
|
||||
|
||||
ListenableFuture<Alarm> findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type);
|
||||
|
||||
ListenableFuture<Alarm> findAlarmByIdAsync(TenantId tenantId, UUID key);
|
||||
|
||||
@ -35,6 +35,8 @@ public interface AlarmService {
|
||||
|
||||
Alarm createOrUpdateAlarm(Alarm alarm);
|
||||
|
||||
Boolean deleteAlarm(TenantId tenantId, AlarmId alarmId);
|
||||
|
||||
ListenableFuture<Boolean> ackAlarm(TenantId tenantId, AlarmId alarmId, long ackTs);
|
||||
|
||||
ListenableFuture<Boolean> clearAlarm(TenantId tenantId, AlarmId alarmId, JsonNode details, long ackTs);
|
||||
|
||||
@ -24,6 +24,7 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.thingsboard.server.common.data.EntityType;
|
||||
import org.thingsboard.server.common.data.Tenant;
|
||||
import org.thingsboard.server.common.data.alarm.Alarm;
|
||||
import org.thingsboard.server.common.data.alarm.AlarmId;
|
||||
@ -118,6 +119,21 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
|
||||
return alarmDao.findLatestByOriginatorAndType(tenantId, originator, type);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean deleteAlarm(TenantId tenantId, AlarmId alarmId) {
|
||||
try {
|
||||
log.debug("Deleting Alarm Id: {}", alarmId);
|
||||
Alarm alarm = alarmDao.findAlarmByIdAsync(tenantId, alarmId.getId()).get();
|
||||
if (alarm == null) {
|
||||
return false;
|
||||
}
|
||||
deleteEntityRelations(tenantId, alarm.getId());
|
||||
return alarmDao.deleteAlarm(tenantId, alarm);
|
||||
} catch (ExecutionException | InterruptedException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
private Alarm createAlarm(Alarm alarm) throws InterruptedException, ExecutionException {
|
||||
log.debug("New Alarm : {}", alarm);
|
||||
Alarm saved = alarmDao.save(alarm.getTenantId(), alarm);
|
||||
@ -127,9 +143,7 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
|
||||
|
||||
private void createAlarmRelations(Alarm alarm) throws InterruptedException, ExecutionException {
|
||||
if (alarm.isPropagate()) {
|
||||
EntityRelationsQuery query = new EntityRelationsQuery();
|
||||
query.setParameters(new RelationsSearchParameters(alarm.getOriginator(), EntitySearchDirection.TO, Integer.MAX_VALUE));
|
||||
List<EntityId> parentEntities = relationService.findByQuery(alarm.getTenantId(), query).get().stream().map(EntityRelation::getFrom).collect(Collectors.toList());
|
||||
List<EntityId> parentEntities = getParentEntities(alarm);
|
||||
for (EntityId parentId : parentEntities) {
|
||||
createAlarmRelation(alarm.getTenantId(), parentId, alarm.getId(), alarm.getStatus(), true);
|
||||
}
|
||||
@ -137,6 +151,12 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
|
||||
createAlarmRelation(alarm.getTenantId(), alarm.getOriginator(), alarm.getId(), alarm.getStatus(), true);
|
||||
}
|
||||
|
||||
private List<EntityId> getParentEntities(Alarm alarm) throws InterruptedException, ExecutionException {
|
||||
EntityRelationsQuery query = new EntityRelationsQuery();
|
||||
query.setParameters(new RelationsSearchParameters(alarm.getOriginator(), EntitySearchDirection.TO, Integer.MAX_VALUE));
|
||||
return relationService.findByQuery(alarm.getTenantId(), query).get().stream().map(EntityRelation::getFrom).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private ListenableFuture<Alarm> updateAlarm(Alarm update) {
|
||||
alarmDataValidator.validate(update, Alarm::getTenantId);
|
||||
return getAndUpdate(update.getTenantId(), update.getId(), new Function<Alarm, Alarm>() {
|
||||
|
||||
@ -15,6 +15,7 @@
|
||||
*/
|
||||
package org.thingsboard.server.dao.alarm;
|
||||
|
||||
import com.datastax.driver.core.Statement;
|
||||
import com.datastax.driver.core.querybuilder.QueryBuilder;
|
||||
import com.datastax.driver.core.querybuilder.Select;
|
||||
import com.google.common.util.concurrent.Futures;
|
||||
@ -78,6 +79,17 @@ public class CassandraAlarmDao extends CassandraAbstractModelDao<AlarmEntity, Al
|
||||
return super.save(tenantId, alarm);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean deleteAlarm(TenantId tenantId, Alarm alarm) {
|
||||
Statement delete = QueryBuilder.delete().all().from(getColumnFamilyName()).where(eq(ModelConstants.ID_PROPERTY, alarm.getId().getId()))
|
||||
.and(eq(ALARM_TENANT_ID_PROPERTY, tenantId.getId()))
|
||||
.and(eq(ALARM_ORIGINATOR_ID_PROPERTY, alarm.getOriginator().getId()))
|
||||
.and(eq(ALARM_ORIGINATOR_TYPE_PROPERTY, alarm.getOriginator().getEntityType()))
|
||||
.and(eq(ALARM_TYPE_PROPERTY, alarm.getType()));
|
||||
log.debug("Remove request: {}", delete.toString());
|
||||
return executeWrite(tenantId, delete).wasApplied();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListenableFuture<Alarm> findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type) {
|
||||
Select select = select().from(ALARM_COLUMN_FAMILY_NAME);
|
||||
|
||||
@ -68,6 +68,11 @@ public class JpaAlarmDao extends JpaAbstractDao<AlarmEntity, Alarm> implements A
|
||||
return alarmRepository;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean deleteAlarm(TenantId tenantId, Alarm alarm) {
|
||||
return removeById(tenantId, alarm.getUuidId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListenableFuture<Alarm> findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type) {
|
||||
return service.submit(() -> {
|
||||
|
||||
@ -31,7 +31,9 @@ import org.thingsboard.server.common.data.id.TenantId;
|
||||
import org.thingsboard.server.common.data.page.TimePageData;
|
||||
import org.thingsboard.server.common.data.page.TimePageLink;
|
||||
import org.thingsboard.server.common.data.relation.EntityRelation;
|
||||
import org.thingsboard.server.common.data.relation.RelationTypeGroup;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
|
||||
public abstract class BaseAlarmServiceTest extends AbstractServiceTest {
|
||||
@ -184,4 +186,85 @@ public abstract class BaseAlarmServiceTest extends AbstractServiceTest {
|
||||
Assert.assertEquals(1, alarms.getData().size());
|
||||
Assert.assertEquals(created, alarms.getData().get(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteAlarm() throws ExecutionException, InterruptedException {
|
||||
AssetId parentId = new AssetId(UUIDs.timeBased());
|
||||
AssetId childId = new AssetId(UUIDs.timeBased());
|
||||
|
||||
EntityRelation relation = new EntityRelation(parentId, childId, EntityRelation.CONTAINS_TYPE);
|
||||
|
||||
Assert.assertTrue(relationService.saveRelationAsync(tenantId, relation).get());
|
||||
|
||||
long ts = System.currentTimeMillis();
|
||||
Alarm alarm = Alarm.builder().tenantId(tenantId).originator(childId)
|
||||
.type(TEST_ALARM)
|
||||
.propagate(true)
|
||||
.severity(AlarmSeverity.CRITICAL).status(AlarmStatus.ACTIVE_UNACK)
|
||||
.startTs(ts).build();
|
||||
|
||||
Alarm created = alarmService.createOrUpdateAlarm(alarm);
|
||||
|
||||
TimePageData<AlarmInfo> alarms = alarmService.findAlarms(tenantId, AlarmQuery.builder()
|
||||
.affectedEntityId(childId)
|
||||
.status(AlarmStatus.ACTIVE_UNACK).pageLink(
|
||||
new TimePageLink(1, 0L, System.currentTimeMillis(), false)
|
||||
).build()).get();
|
||||
Assert.assertNotNull(alarms.getData());
|
||||
Assert.assertEquals(1, alarms.getData().size());
|
||||
Assert.assertEquals(created, alarms.getData().get(0));
|
||||
|
||||
// Check parent relation
|
||||
alarms = alarmService.findAlarms(tenantId, AlarmQuery.builder()
|
||||
.affectedEntityId(parentId)
|
||||
.status(AlarmStatus.ACTIVE_UNACK).pageLink(
|
||||
new TimePageLink(1, 0L, System.currentTimeMillis(), false)
|
||||
).build()).get();
|
||||
Assert.assertNotNull(alarms.getData());
|
||||
Assert.assertEquals(1, alarms.getData().size());
|
||||
Assert.assertEquals(created, alarms.getData().get(0));
|
||||
|
||||
List<EntityRelation> toAlarmRelations = relationService.findByTo(tenantId, created.getId(), RelationTypeGroup.ALARM);
|
||||
Assert.assertEquals(8, toAlarmRelations.size());
|
||||
|
||||
List<EntityRelation> fromChildRelations = relationService.findByFrom(tenantId, childId, RelationTypeGroup.ALARM);
|
||||
Assert.assertEquals(4, fromChildRelations.size());
|
||||
|
||||
List<EntityRelation> fromParentRelations = relationService.findByFrom(tenantId, childId, RelationTypeGroup.ALARM);
|
||||
Assert.assertEquals(4, fromParentRelations.size());
|
||||
|
||||
|
||||
Assert.assertTrue("Alarm was not deleted when expected", alarmService.deleteAlarm(tenantId, created.getId()));
|
||||
|
||||
Alarm fetched = alarmService.findAlarmByIdAsync(tenantId, created.getId()).get();
|
||||
|
||||
Assert.assertNull("Alarm was returned when it was expected to be null", fetched);
|
||||
|
||||
alarms = alarmService.findAlarms(tenantId, AlarmQuery.builder()
|
||||
.affectedEntityId(childId)
|
||||
.status(AlarmStatus.ACTIVE_UNACK).pageLink(
|
||||
new TimePageLink(1, 0L, System.currentTimeMillis(), false)
|
||||
).build()).get();
|
||||
Assert.assertNotNull(alarms.getData());
|
||||
Assert.assertEquals(0, alarms.getData().size());
|
||||
|
||||
// Check parent relation
|
||||
alarms = alarmService.findAlarms(tenantId, AlarmQuery.builder()
|
||||
.affectedEntityId(parentId)
|
||||
.status(AlarmStatus.ACTIVE_UNACK).pageLink(
|
||||
new TimePageLink(1, 0L, System.currentTimeMillis(), false)
|
||||
).build()).get();
|
||||
Assert.assertNotNull(alarms.getData());
|
||||
Assert.assertEquals(0, alarms.getData().size());
|
||||
|
||||
toAlarmRelations = relationService.findByTo(tenantId, created.getId(), RelationTypeGroup.ALARM);
|
||||
Assert.assertEquals(0, toAlarmRelations.size());
|
||||
|
||||
fromChildRelations = relationService.findByFrom(tenantId, childId, RelationTypeGroup.ALARM);
|
||||
Assert.assertEquals(0, fromChildRelations.size());
|
||||
|
||||
fromParentRelations = relationService.findByFrom(tenantId, childId, RelationTypeGroup.ALARM);
|
||||
Assert.assertEquals(0, fromParentRelations.size());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
6
pom.xml
6
pom.xml
@ -756,12 +756,6 @@
|
||||
<artifactId>hsqldb</artifactId>
|
||||
<version>${hsqldb.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ru.yandex.qatools.embed</groupId>
|
||||
<artifactId>postgresql-embedded</artifactId>
|
||||
<version>2.2</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.data</groupId>
|
||||
<artifactId>spring-data-redis</artifactId>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user