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