init commit
This commit is contained in:
parent
1b5a8ac6fc
commit
dd64749075
@ -270,9 +270,16 @@ public class CassandraDatabaseUpgradeService implements DatabaseUpgradeService {
|
|||||||
case "2.4.1":
|
case "2.4.1":
|
||||||
log.info("Updating schema ...");
|
log.info("Updating schema ...");
|
||||||
String updateAssetTableStmt = "alter table asset add label text";
|
String updateAssetTableStmt = "alter table asset add label text";
|
||||||
|
String updateAlarmTableStmt = "alter table alarm add propagate_relation_types text";
|
||||||
try {
|
try {
|
||||||
|
log.info("Updating assets ...");
|
||||||
cluster.getSession().execute(updateAssetTableStmt);
|
cluster.getSession().execute(updateAssetTableStmt);
|
||||||
Thread.sleep(2500);
|
Thread.sleep(2500);
|
||||||
|
log.info("Assets updated.");
|
||||||
|
log.info("Updating alarms ...");
|
||||||
|
cluster.getSession().execute(updateAlarmTableStmt);
|
||||||
|
Thread.sleep(2500);
|
||||||
|
log.info("Alarms updated.");
|
||||||
} catch (InvalidQueryException e) {}
|
} catch (InvalidQueryException e) {}
|
||||||
log.info("Schema updated.");
|
log.info("Schema updated.");
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -193,6 +193,9 @@ public class SqlDatabaseUpgradeService implements DatabaseUpgradeService {
|
|||||||
try {
|
try {
|
||||||
conn.createStatement().execute("ALTER TABLE asset ADD CONSTRAINT asset_name_unq_key UNIQUE (tenant_id, name)"); //NOSONAR, ignoring because method used to execute thingsboard database upgrade script
|
conn.createStatement().execute("ALTER TABLE asset ADD CONSTRAINT asset_name_unq_key UNIQUE (tenant_id, name)"); //NOSONAR, ignoring because method used to execute thingsboard database upgrade script
|
||||||
} catch (Exception e) {}
|
} catch (Exception e) {}
|
||||||
|
try {
|
||||||
|
conn.createStatement().execute("ALTER TABLE alarm ADD COLUMN propagate_relation_types varchar"); //NOSONAR, ignoring because method used to execute thingsboard database upgrade script
|
||||||
|
} catch (Exception e) {}
|
||||||
log.info("Schema updated.");
|
log.info("Schema updated.");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -26,6 +26,8 @@ import org.thingsboard.server.common.data.HasTenantId;
|
|||||||
import org.thingsboard.server.common.data.id.EntityId;
|
import org.thingsboard.server.common.data.id.EntityId;
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by ashvayka on 11.05.17.
|
* Created by ashvayka on 11.05.17.
|
||||||
*/
|
*/
|
||||||
@ -45,6 +47,7 @@ public class Alarm extends BaseData<AlarmId> implements HasName, HasTenantId {
|
|||||||
private long clearTs;
|
private long clearTs;
|
||||||
private transient JsonNode details;
|
private transient JsonNode details;
|
||||||
private boolean propagate;
|
private boolean propagate;
|
||||||
|
private List<String> propagateRelationTypes;
|
||||||
|
|
||||||
public Alarm() {
|
public Alarm() {
|
||||||
super();
|
super();
|
||||||
@ -68,6 +71,7 @@ public class Alarm extends BaseData<AlarmId> implements HasName, HasTenantId {
|
|||||||
this.clearTs = alarm.getClearTs();
|
this.clearTs = alarm.getClearTs();
|
||||||
this.details = alarm.getDetails();
|
this.details = alarm.getDetails();
|
||||||
this.propagate = alarm.isPropagate();
|
this.propagate = alarm.isPropagate();
|
||||||
|
this.propagateRelationTypes = alarm.getPropagateRelationTypes();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -23,8 +23,8 @@ import com.google.common.util.concurrent.ListenableFuture;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
import org.springframework.util.StringUtils;
|
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.Tenant;
|
||||||
import org.thingsboard.server.common.data.alarm.Alarm;
|
import org.thingsboard.server.common.data.alarm.Alarm;
|
||||||
import org.thingsboard.server.common.data.alarm.AlarmId;
|
import org.thingsboard.server.common.data.alarm.AlarmId;
|
||||||
@ -52,6 +52,7 @@ import javax.annotation.Nullable;
|
|||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
import javax.annotation.PreDestroy;
|
import javax.annotation.PreDestroy;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@ -59,6 +60,7 @@ import java.util.concurrent.ExecutionException;
|
|||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import static org.thingsboard.server.dao.service.Validator.validateId;
|
import static org.thingsboard.server.dao.service.Validator.validateId;
|
||||||
|
|
||||||
@ -154,8 +156,16 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
|
|||||||
|
|
||||||
private List<EntityId> getParentEntities(Alarm alarm) throws InterruptedException, ExecutionException {
|
private List<EntityId> getParentEntities(Alarm alarm) throws InterruptedException, ExecutionException {
|
||||||
EntityRelationsQuery query = new EntityRelationsQuery();
|
EntityRelationsQuery query = new EntityRelationsQuery();
|
||||||
query.setParameters(new RelationsSearchParameters(alarm.getOriginator(), EntitySearchDirection.TO, Integer.MAX_VALUE, false));
|
RelationsSearchParameters parameters = new RelationsSearchParameters(alarm.getOriginator(), EntitySearchDirection.TO, Integer.MAX_VALUE, false);
|
||||||
return relationService.findByQuery(alarm.getTenantId(), query).get().stream().map(EntityRelation::getFrom).collect(Collectors.toList());
|
query.setParameters(parameters);
|
||||||
|
List<String> propagateRelationTypes = alarm.getPropagateRelationTypes();
|
||||||
|
if (!CollectionUtils.isEmpty(propagateRelationTypes)) {
|
||||||
|
return relationService.findByQuery(alarm.getTenantId(), query).get().stream()
|
||||||
|
.filter(entityRelation -> propagateRelationTypes.contains(entityRelation.getType()))
|
||||||
|
.map(EntityRelation::getFrom).collect(Collectors.toList());
|
||||||
|
} else {
|
||||||
|
return relationService.findByQuery(alarm.getTenantId(), query).get().stream().map(EntityRelation::getFrom).collect(Collectors.toList());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private ListenableFuture<Alarm> updateAlarm(Alarm update) {
|
private ListenableFuture<Alarm> updateAlarm(Alarm update) {
|
||||||
@ -360,13 +370,28 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
|
|||||||
existing.setSeverity(alarm.getSeverity());
|
existing.setSeverity(alarm.getSeverity());
|
||||||
existing.setDetails(alarm.getDetails());
|
existing.setDetails(alarm.getDetails());
|
||||||
existing.setPropagate(existing.isPropagate() || alarm.isPropagate());
|
existing.setPropagate(existing.isPropagate() || alarm.isPropagate());
|
||||||
|
List<String> existingPropagateRelationTypes = existing.getPropagateRelationTypes();
|
||||||
|
List<String> newRelationTypes = alarm.getPropagateRelationTypes();
|
||||||
|
if (!CollectionUtils.isEmpty(existingPropagateRelationTypes) && !CollectionUtils.isEmpty(newRelationTypes)) {
|
||||||
|
existing.setPropagateRelationTypes(Stream.concat(existingPropagateRelationTypes.stream(), newRelationTypes.stream())
|
||||||
|
.distinct()
|
||||||
|
.collect(Collectors.toList()));
|
||||||
|
} else {
|
||||||
|
existing.setPropagateRelationTypes(Collections.emptyList());
|
||||||
|
}
|
||||||
return existing;
|
return existing;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateRelations(Alarm alarm, AlarmStatus oldStatus, AlarmStatus newStatus) {
|
private void updateRelations(Alarm alarm, AlarmStatus oldStatus, AlarmStatus newStatus) {
|
||||||
try {
|
try {
|
||||||
List<EntityRelation> relations = relationService.findByToAsync(alarm.getTenantId(), alarm.getId(), RelationTypeGroup.ALARM).get();
|
List<EntityRelation> relations = relationService.findByToAsync(alarm.getTenantId(), alarm.getId(), RelationTypeGroup.ALARM).get();
|
||||||
Set<EntityId> parents = relations.stream().map(EntityRelation::getFrom).collect(Collectors.toSet());
|
Set<EntityId> parents;
|
||||||
|
List<String> propagateRelationTypes = alarm.getPropagateRelationTypes();
|
||||||
|
if (!CollectionUtils.isEmpty(propagateRelationTypes)) {
|
||||||
|
parents = relations.stream().filter(entityRelation -> propagateRelationTypes.contains(entityRelation.getType())).map(EntityRelation::getFrom).collect(Collectors.toSet());
|
||||||
|
} else {
|
||||||
|
parents = relations.stream().map(EntityRelation::getFrom).collect(Collectors.toSet());
|
||||||
|
}
|
||||||
for (EntityId parentId : parents) {
|
for (EntityId parentId : parents) {
|
||||||
updateAlarmRelation(alarm.getTenantId(), parentId, alarm.getId(), oldStatus, newStatus);
|
updateAlarmRelation(alarm.getTenantId(), parentId, alarm.getId(), oldStatus, newStatus);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -231,6 +231,7 @@ public class ModelConstants {
|
|||||||
public static final String ALARM_ACK_TS_PROPERTY = "ack_ts";
|
public static final String ALARM_ACK_TS_PROPERTY = "ack_ts";
|
||||||
public static final String ALARM_CLEAR_TS_PROPERTY = "clear_ts";
|
public static final String ALARM_CLEAR_TS_PROPERTY = "clear_ts";
|
||||||
public static final String ALARM_PROPAGATE_PROPERTY = "propagate";
|
public static final String ALARM_PROPAGATE_PROPERTY = "propagate";
|
||||||
|
public static final String ALARM_PROPAGATE_RELATION_TYPES = "propagate_relation_types";
|
||||||
|
|
||||||
public static final String ALARM_BY_ID_VIEW_NAME = "alarm_by_id";
|
public static final String ALARM_BY_ID_VIEW_NAME = "alarm_by_id";
|
||||||
|
|
||||||
|
|||||||
@ -23,6 +23,8 @@ import com.datastax.driver.mapping.annotations.Table;
|
|||||||
import com.fasterxml.jackson.databind.JsonNode;
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
import org.thingsboard.server.common.data.EntityType;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
import org.thingsboard.server.common.data.alarm.Alarm;
|
import org.thingsboard.server.common.data.alarm.Alarm;
|
||||||
import org.thingsboard.server.common.data.alarm.AlarmId;
|
import org.thingsboard.server.common.data.alarm.AlarmId;
|
||||||
@ -36,6 +38,7 @@ import org.thingsboard.server.dao.model.type.AlarmStatusCodec;
|
|||||||
import org.thingsboard.server.dao.model.type.EntityTypeCodec;
|
import org.thingsboard.server.dao.model.type.EntityTypeCodec;
|
||||||
import org.thingsboard.server.dao.model.type.JsonCodec;
|
import org.thingsboard.server.dao.model.type.JsonCodec;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_ACK_TS_PROPERTY;
|
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_ACK_TS_PROPERTY;
|
||||||
@ -46,6 +49,7 @@ import static org.thingsboard.server.dao.model.ModelConstants.ALARM_END_TS_PROPE
|
|||||||
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_ORIGINATOR_ID_PROPERTY;
|
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_ORIGINATOR_ID_PROPERTY;
|
||||||
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_ORIGINATOR_TYPE_PROPERTY;
|
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_ORIGINATOR_TYPE_PROPERTY;
|
||||||
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_PROPAGATE_PROPERTY;
|
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_PROPAGATE_PROPERTY;
|
||||||
|
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_PROPAGATE_RELATION_TYPES;
|
||||||
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_SEVERITY_PROPERTY;
|
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_SEVERITY_PROPERTY;
|
||||||
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_START_TS_PROPERTY;
|
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_START_TS_PROPERTY;
|
||||||
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_STATUS_PROPERTY;
|
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_STATUS_PROPERTY;
|
||||||
@ -102,6 +106,9 @@ public final class AlarmEntity implements BaseEntity<Alarm> {
|
|||||||
@Column(name = ALARM_PROPAGATE_PROPERTY)
|
@Column(name = ALARM_PROPAGATE_PROPERTY)
|
||||||
private Boolean propagate;
|
private Boolean propagate;
|
||||||
|
|
||||||
|
@Column(name = ALARM_PROPAGATE_RELATION_TYPES)
|
||||||
|
private String propagateRelationTypes;
|
||||||
|
|
||||||
public AlarmEntity() {
|
public AlarmEntity() {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
@ -125,6 +132,12 @@ public final class AlarmEntity implements BaseEntity<Alarm> {
|
|||||||
this.ackTs = alarm.getAckTs();
|
this.ackTs = alarm.getAckTs();
|
||||||
this.clearTs = alarm.getClearTs();
|
this.clearTs = alarm.getClearTs();
|
||||||
this.details = alarm.getDetails();
|
this.details = alarm.getDetails();
|
||||||
|
this.details = alarm.getDetails();
|
||||||
|
if (!CollectionUtils.isEmpty(alarm.getPropagateRelationTypes())) {
|
||||||
|
this.propagateRelationTypes = String.join(",", alarm.getPropagateRelationTypes());
|
||||||
|
} else {
|
||||||
|
this.propagateRelationTypes = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public UUID getId() {
|
public UUID getId() {
|
||||||
@ -231,6 +244,10 @@ public final class AlarmEntity implements BaseEntity<Alarm> {
|
|||||||
this.propagate = propagate;
|
this.propagate = propagate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getPropagateRelationTypes() { return propagateRelationTypes; }
|
||||||
|
|
||||||
|
public void setPropagateRelationTypes(String propagateRelationTypes) { this.propagateRelationTypes = propagateRelationTypes; }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Alarm toData() {
|
public Alarm toData() {
|
||||||
Alarm alarm = new Alarm(new AlarmId(id));
|
Alarm alarm = new Alarm(new AlarmId(id));
|
||||||
@ -248,6 +265,9 @@ public final class AlarmEntity implements BaseEntity<Alarm> {
|
|||||||
alarm.setAckTs(ackTs);
|
alarm.setAckTs(ackTs);
|
||||||
alarm.setClearTs(clearTs);
|
alarm.setClearTs(clearTs);
|
||||||
alarm.setDetails(details);
|
alarm.setDetails(details);
|
||||||
|
if(!StringUtils.isEmpty(propagateRelationTypes)) {
|
||||||
|
alarm.setPropagateRelationTypes(Arrays.asList(propagateRelationTypes.split(",")));
|
||||||
|
}
|
||||||
return alarm;
|
return alarm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -21,6 +21,8 @@ import lombok.Data;
|
|||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import org.hibernate.annotations.Type;
|
import org.hibernate.annotations.Type;
|
||||||
import org.hibernate.annotations.TypeDef;
|
import org.hibernate.annotations.TypeDef;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
import org.thingsboard.server.common.data.EntityType;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
import org.thingsboard.server.common.data.UUIDConverter;
|
import org.thingsboard.server.common.data.UUIDConverter;
|
||||||
import org.thingsboard.server.common.data.alarm.Alarm;
|
import org.thingsboard.server.common.data.alarm.Alarm;
|
||||||
@ -40,6 +42,8 @@ import javax.persistence.EnumType;
|
|||||||
import javax.persistence.Enumerated;
|
import javax.persistence.Enumerated;
|
||||||
import javax.persistence.Table;
|
import javax.persistence.Table;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_ACK_TS_PROPERTY;
|
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_ACK_TS_PROPERTY;
|
||||||
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_CLEAR_TS_PROPERTY;
|
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_CLEAR_TS_PROPERTY;
|
||||||
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_COLUMN_FAMILY_NAME;
|
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_COLUMN_FAMILY_NAME;
|
||||||
@ -47,6 +51,7 @@ import static org.thingsboard.server.dao.model.ModelConstants.ALARM_END_TS_PROPE
|
|||||||
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_ORIGINATOR_ID_PROPERTY;
|
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_ORIGINATOR_ID_PROPERTY;
|
||||||
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_ORIGINATOR_TYPE_PROPERTY;
|
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_ORIGINATOR_TYPE_PROPERTY;
|
||||||
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_PROPAGATE_PROPERTY;
|
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_PROPAGATE_PROPERTY;
|
||||||
|
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_PROPAGATE_RELATION_TYPES;
|
||||||
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_SEVERITY_PROPERTY;
|
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_SEVERITY_PROPERTY;
|
||||||
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_START_TS_PROPERTY;
|
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_START_TS_PROPERTY;
|
||||||
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_STATUS_PROPERTY;
|
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_STATUS_PROPERTY;
|
||||||
@ -99,6 +104,9 @@ public final class AlarmEntity extends BaseSqlEntity<Alarm> implements BaseEntit
|
|||||||
@Column(name = ALARM_PROPAGATE_PROPERTY)
|
@Column(name = ALARM_PROPAGATE_PROPERTY)
|
||||||
private Boolean propagate;
|
private Boolean propagate;
|
||||||
|
|
||||||
|
@Column(name = ALARM_PROPAGATE_RELATION_TYPES)
|
||||||
|
private String propagateRelationTypes;
|
||||||
|
|
||||||
public AlarmEntity() {
|
public AlarmEntity() {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
@ -122,6 +130,12 @@ public final class AlarmEntity extends BaseSqlEntity<Alarm> implements BaseEntit
|
|||||||
this.ackTs = alarm.getAckTs();
|
this.ackTs = alarm.getAckTs();
|
||||||
this.clearTs = alarm.getClearTs();
|
this.clearTs = alarm.getClearTs();
|
||||||
this.details = alarm.getDetails();
|
this.details = alarm.getDetails();
|
||||||
|
if (!CollectionUtils.isEmpty(alarm.getPropagateRelationTypes())) {
|
||||||
|
this.propagateRelationTypes = String.join(",", alarm.getPropagateRelationTypes());
|
||||||
|
} else {
|
||||||
|
this.propagateRelationTypes = null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -141,6 +155,9 @@ public final class AlarmEntity extends BaseSqlEntity<Alarm> implements BaseEntit
|
|||||||
alarm.setAckTs(ackTs);
|
alarm.setAckTs(ackTs);
|
||||||
alarm.setClearTs(clearTs);
|
alarm.setClearTs(clearTs);
|
||||||
alarm.setDetails(details);
|
alarm.setDetails(details);
|
||||||
|
if(!StringUtils.isEmpty(propagateRelationTypes)) {
|
||||||
|
alarm.setPropagateRelationTypes(Arrays.asList(propagateRelationTypes.split(",")));
|
||||||
|
}
|
||||||
return alarm;
|
return alarm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -306,6 +306,7 @@ CREATE TABLE IF NOT EXISTS thingsboard.alarm (
|
|||||||
clear_ts bigint,
|
clear_ts bigint,
|
||||||
details text,
|
details text,
|
||||||
propagate boolean,
|
propagate boolean,
|
||||||
|
propagate_relation_types text,
|
||||||
PRIMARY KEY ((tenant_id, originator_id, originator_type), type, id)
|
PRIMARY KEY ((tenant_id, originator_id, originator_type), type, id)
|
||||||
) WITH CLUSTERING ORDER BY ( type ASC, id DESC);
|
) WITH CLUSTERING ORDER BY ( type ASC, id DESC);
|
||||||
|
|
||||||
|
|||||||
@ -34,6 +34,7 @@ CREATE TABLE IF NOT EXISTS alarm (
|
|||||||
start_ts bigint,
|
start_ts bigint,
|
||||||
status varchar(255),
|
status varchar(255),
|
||||||
tenant_id varchar(31),
|
tenant_id varchar(31),
|
||||||
|
propagate_relation_types varchar,
|
||||||
type varchar(255)
|
type varchar(255)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -21,11 +21,11 @@ import com.google.common.base.Function;
|
|||||||
import com.google.common.util.concurrent.Futures;
|
import com.google.common.util.concurrent.Futures;
|
||||||
import com.google.common.util.concurrent.ListenableFuture;
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.thingsboard.rule.engine.api.util.TbNodeUtils;
|
|
||||||
import org.thingsboard.rule.engine.api.RuleNode;
|
import org.thingsboard.rule.engine.api.RuleNode;
|
||||||
import org.thingsboard.rule.engine.api.TbContext;
|
import org.thingsboard.rule.engine.api.TbContext;
|
||||||
import org.thingsboard.rule.engine.api.TbNodeConfiguration;
|
import org.thingsboard.rule.engine.api.TbNodeConfiguration;
|
||||||
import org.thingsboard.rule.engine.api.TbNodeException;
|
import org.thingsboard.rule.engine.api.TbNodeException;
|
||||||
|
import org.thingsboard.rule.engine.api.util.TbNodeUtils;
|
||||||
import org.thingsboard.server.common.data.alarm.Alarm;
|
import org.thingsboard.server.common.data.alarm.Alarm;
|
||||||
import org.thingsboard.server.common.data.alarm.AlarmStatus;
|
import org.thingsboard.server.common.data.alarm.AlarmStatus;
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
@ -33,6 +33,8 @@ import org.thingsboard.server.common.data.plugin.ComponentType;
|
|||||||
import org.thingsboard.server.common.msg.TbMsg;
|
import org.thingsboard.server.common.msg.TbMsg;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@RuleNode(
|
@RuleNode(
|
||||||
@ -56,7 +58,11 @@ public class TbCreateAlarmNode extends TbAbstractAlarmNode<TbCreateAlarmNodeConf
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected TbCreateAlarmNodeConfiguration loadAlarmNodeConfig(TbNodeConfiguration configuration) throws TbNodeException {
|
protected TbCreateAlarmNodeConfiguration loadAlarmNodeConfig(TbNodeConfiguration configuration) throws TbNodeException {
|
||||||
return TbNodeUtils.convert(configuration, TbCreateAlarmNodeConfiguration.class);
|
TbCreateAlarmNodeConfiguration nodeConfiguration = TbNodeUtils.convert(configuration, TbCreateAlarmNodeConfiguration.class);
|
||||||
|
if(nodeConfiguration.getRelationTypes() == null) {
|
||||||
|
nodeConfiguration.setRelationTypes(Collections.emptyList());
|
||||||
|
}
|
||||||
|
return nodeConfiguration;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -66,6 +72,7 @@ public class TbCreateAlarmNode extends TbAbstractAlarmNode<TbCreateAlarmNodeConf
|
|||||||
|
|
||||||
if (!config.isUseMessageAlarmData()) {
|
if (!config.isUseMessageAlarmData()) {
|
||||||
alarmType = TbNodeUtils.processPattern(this.config.getAlarmType(), msg.getMetaData());
|
alarmType = TbNodeUtils.processPattern(this.config.getAlarmType(), msg.getMetaData());
|
||||||
|
|
||||||
msgAlarm = null;
|
msgAlarm = null;
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
@ -98,6 +105,9 @@ public class TbCreateAlarmNode extends TbAbstractAlarmNode<TbCreateAlarmNodeConf
|
|||||||
if (msgAlarm.getStatus() == null) {
|
if (msgAlarm.getStatus() == null) {
|
||||||
msgAlarm.setStatus(AlarmStatus.ACTIVE_UNACK);
|
msgAlarm.setStatus(AlarmStatus.ACTIVE_UNACK);
|
||||||
}
|
}
|
||||||
|
if (msgAlarm.getPropagateRelationTypes() == null) {
|
||||||
|
msgAlarm.setPropagateRelationTypes(Collections.emptyList());
|
||||||
|
}
|
||||||
return msgAlarm;
|
return msgAlarm;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,9 +135,15 @@ public class TbCreateAlarmNode extends TbAbstractAlarmNode<TbCreateAlarmNodeConf
|
|||||||
if (msgAlarm != null) {
|
if (msgAlarm != null) {
|
||||||
existingAlarm.setSeverity(msgAlarm.getSeverity());
|
existingAlarm.setSeverity(msgAlarm.getSeverity());
|
||||||
existingAlarm.setPropagate(msgAlarm.isPropagate());
|
existingAlarm.setPropagate(msgAlarm.isPropagate());
|
||||||
|
existingAlarm.setPropagateRelationTypes(msgAlarm.getPropagateRelationTypes());
|
||||||
} else {
|
} else {
|
||||||
existingAlarm.setSeverity(config.getSeverity());
|
existingAlarm.setSeverity(config.getSeverity());
|
||||||
existingAlarm.setPropagate(config.isPropagate());
|
existingAlarm.setPropagate(config.isPropagate());
|
||||||
|
if(config.getRelationTypes() == null) {
|
||||||
|
existingAlarm.setPropagateRelationTypes(Collections.emptyList());
|
||||||
|
} else {
|
||||||
|
existingAlarm.setPropagateRelationTypes(config.getRelationTypes());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
existingAlarm.setDetails(details);
|
existingAlarm.setDetails(details);
|
||||||
existingAlarm.setEndTs(System.currentTimeMillis());
|
existingAlarm.setEndTs(System.currentTimeMillis());
|
||||||
@ -138,6 +154,10 @@ public class TbCreateAlarmNode extends TbAbstractAlarmNode<TbCreateAlarmNodeConf
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Alarm buildAlarm(TbMsg msg, JsonNode details, TenantId tenantId) {
|
private Alarm buildAlarm(TbMsg msg, JsonNode details, TenantId tenantId) {
|
||||||
|
List<String> relationTypes = this.config.getRelationTypes();
|
||||||
|
if (relationTypes == null) {
|
||||||
|
relationTypes = Collections.emptyList();
|
||||||
|
}
|
||||||
return Alarm.builder()
|
return Alarm.builder()
|
||||||
.tenantId(tenantId)
|
.tenantId(tenantId)
|
||||||
.originator(msg.getOriginator())
|
.originator(msg.getOriginator())
|
||||||
@ -145,6 +165,7 @@ public class TbCreateAlarmNode extends TbAbstractAlarmNode<TbCreateAlarmNodeConf
|
|||||||
.severity(config.getSeverity())
|
.severity(config.getSeverity())
|
||||||
.propagate(config.isPropagate())
|
.propagate(config.isPropagate())
|
||||||
.type(TbNodeUtils.processPattern(this.config.getAlarmType(), msg.getMetaData()))
|
.type(TbNodeUtils.processPattern(this.config.getAlarmType(), msg.getMetaData()))
|
||||||
|
.propagateRelationTypes(relationTypes)
|
||||||
//todo-vp: alarm date should be taken from Message or current Time should be used?
|
//todo-vp: alarm date should be taken from Message or current Time should be used?
|
||||||
// .startTs(System.currentTimeMillis())
|
// .startTs(System.currentTimeMillis())
|
||||||
// .endTs(System.currentTimeMillis())
|
// .endTs(System.currentTimeMillis())
|
||||||
|
|||||||
@ -19,6 +19,9 @@ import lombok.Data;
|
|||||||
import org.thingsboard.rule.engine.api.NodeConfiguration;
|
import org.thingsboard.rule.engine.api.NodeConfiguration;
|
||||||
import org.thingsboard.server.common.data.alarm.AlarmSeverity;
|
import org.thingsboard.server.common.data.alarm.AlarmSeverity;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public class TbCreateAlarmNodeConfiguration extends TbAbstractAlarmNodeConfiguration implements NodeConfiguration<TbCreateAlarmNodeConfiguration> {
|
public class TbCreateAlarmNodeConfiguration extends TbAbstractAlarmNodeConfiguration implements NodeConfiguration<TbCreateAlarmNodeConfiguration> {
|
||||||
|
|
||||||
@ -26,18 +29,21 @@ public class TbCreateAlarmNodeConfiguration extends TbAbstractAlarmNodeConfigura
|
|||||||
private boolean propagate;
|
private boolean propagate;
|
||||||
private boolean useMessageAlarmData;
|
private boolean useMessageAlarmData;
|
||||||
|
|
||||||
|
private List<String> relationTypes;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TbCreateAlarmNodeConfiguration defaultConfiguration() {
|
public TbCreateAlarmNodeConfiguration defaultConfiguration() {
|
||||||
TbCreateAlarmNodeConfiguration configuration = new TbCreateAlarmNodeConfiguration();
|
TbCreateAlarmNodeConfiguration configuration = new TbCreateAlarmNodeConfiguration();
|
||||||
configuration.setAlarmDetailsBuildJs("var details = {};\n" +
|
configuration.setAlarmDetailsBuildJs("var details = {};\n" +
|
||||||
"if (metadata.prevAlarmDetails) {\n" +
|
"if (metadata.prevAlarmDetails) {\n" +
|
||||||
" details = JSON.parse(metadata.prevAlarmDetails);\n" +
|
" details = JSON.parse(metadata.prevAlarmDetails);\n" +
|
||||||
"}\n"+
|
"}\n" +
|
||||||
"return details;");
|
"return details;");
|
||||||
configuration.setAlarmType("General Alarm");
|
configuration.setAlarmType("General Alarm");
|
||||||
configuration.setSeverity(AlarmSeverity.CRITICAL);
|
configuration.setSeverity(AlarmSeverity.CRITICAL);
|
||||||
configuration.setPropagate(false);
|
configuration.setPropagate(false);
|
||||||
configuration.setUseMessageAlarmData(false);
|
configuration.setUseMessageAlarmData(false);
|
||||||
|
configuration.setRelationTypes(Collections.emptyList());
|
||||||
return configuration;
|
return configuration;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user