From 6b153ee2addb5ab993a6c8367efe202b60560511 Mon Sep 17 00:00:00 2001 From: Bohdan Smetaniuk Date: Thu, 9 Jul 2020 13:57:04 +0300 Subject: [PATCH] bug with alarms fixed --- .../service/edge/rpc/EdgeGrpcSession.java | 6 +-- .../rule/engine/edge/TbMsgPushToEdgeNode.java | 51 ++++++++++++------- 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java index f1f4aa1f95..85cddcf750 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java @@ -962,18 +962,18 @@ public final class EdgeGrpcSession implements Closeable { switch (alarmUpdateMsg.getMsgType()) { case ENTITY_CREATED_RPC_MESSAGE: case ENTITY_UPDATED_RPC_MESSAGE: - if (existentAlarm == null) { + if (existentAlarm == null || existentAlarm.getStatus().isCleared()) { existentAlarm = new Alarm(); existentAlarm.setTenantId(edge.getTenantId()); existentAlarm.setType(alarmUpdateMsg.getName()); existentAlarm.setOriginator(originatorId); existentAlarm.setSeverity(AlarmSeverity.valueOf(alarmUpdateMsg.getSeverity())); - existentAlarm.setStatus(AlarmStatus.valueOf(alarmUpdateMsg.getStatus())); existentAlarm.setStartTs(alarmUpdateMsg.getStartTs()); - existentAlarm.setAckTs(alarmUpdateMsg.getAckTs()); existentAlarm.setClearTs(alarmUpdateMsg.getClearTs()); existentAlarm.setPropagate(alarmUpdateMsg.getPropagate()); } + existentAlarm.setStatus(AlarmStatus.valueOf(alarmUpdateMsg.getStatus())); + existentAlarm.setAckTs(alarmUpdateMsg.getAckTs()); existentAlarm.setEndTs(alarmUpdateMsg.getEndTs()); existentAlarm.setDetails(mapper.readTree(alarmUpdateMsg.getDetails())); ctx.getAlarmService().createOrUpdateAlarm(existentAlarm); diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/edge/TbMsgPushToEdgeNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/edge/TbMsgPushToEdgeNode.java index 0e1ba938e3..6208976e55 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/edge/TbMsgPushToEdgeNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/edge/TbMsgPushToEdgeNode.java @@ -16,6 +16,7 @@ package org.thingsboard.rule.engine.edge; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; @@ -46,6 +47,7 @@ import org.thingsboard.server.common.msg.session.SessionMsgType; import javax.annotation.Nullable; import java.util.List; +import java.util.UUID; import static org.thingsboard.rule.engine.api.TbRelationTypes.SUCCESS; @@ -84,14 +86,10 @@ public class TbMsgPushToEdgeNode implements TbNode { Futures.addCallback(getEdgeIdFuture, new FutureCallback() { @Override public void onSuccess(@Nullable EdgeId edgeId) { - EdgeEventType edgeEventTypeByEntityType = EdgeUtils.getEdgeEventTypeByEntityType(msg.getOriginator().getEntityType()); - if (edgeEventTypeByEntityType == null) { - log.debug("Edge event type is null. Entity Type {}", msg.getOriginator().getEntityType()); - ctx.tellFailure(msg, new RuntimeException("Edge event type is null. Entity Type '" + msg.getOriginator().getEntityType() + "'")); - } EdgeEvent edgeEvent = null; try { - edgeEvent = buildEdgeEvent(ctx, msg, edgeId, edgeEventTypeByEntityType); + edgeEvent = buildEdgeEvent(msg, ctx); + edgeEvent.setEdgeId(edgeId); } catch (JsonProcessingException e) { log.error("Failed to build edge event", e); } @@ -124,17 +122,35 @@ public class TbMsgPushToEdgeNode implements TbNode { } } - private EdgeEvent buildEdgeEvent(TbContext ctx, TbMsg msg, EdgeId edgeId, EdgeEventType edgeEventTypeByEntityType) throws JsonProcessingException { + private EdgeEvent buildEdgeEvent(TbMsg msg, TbContext ctx) throws JsonProcessingException { + if (DataConstants.ALARM.equals(msg.getType())) { + return buildEdgeEvent(ctx.getTenantId(), ActionType.ADDED, getUUIDFromMsgData(msg), EdgeEventType.ALARM, null); + } else { + EdgeEventType edgeEventTypeByEntityType = EdgeUtils.getEdgeEventTypeByEntityType(msg.getOriginator().getEntityType()); + if (edgeEventTypeByEntityType == null) { + log.debug("Edge event type is null. Entity Type {}", msg.getOriginator().getEntityType()); + ctx.tellFailure(msg, new RuntimeException("Edge event type is null. Entity Type '" + msg.getOriginator().getEntityType() + "'")); + } + return buildEdgeEvent(ctx.getTenantId(), getActionTypeByMsgType(msg.getType()), msg.getOriginator().getId(), edgeEventTypeByEntityType, json.readTree(msg.getData())); + } + } + + private EdgeEvent buildEdgeEvent(TenantId tenantId, ActionType edgeEventAction, UUID entityId, EdgeEventType edgeEventType, JsonNode entityBody) { EdgeEvent edgeEvent = new EdgeEvent(); - edgeEvent.setTenantId(ctx.getTenantId()); - edgeEvent.setEdgeId(edgeId); - edgeEvent.setEdgeEventAction(getActionTypeByMsgType(msg.getType()).name()); - edgeEvent.setEntityId(msg.getOriginator().getId()); - edgeEvent.setEdgeEventType(edgeEventTypeByEntityType); - edgeEvent.setEntityBody(json.readTree(msg.getData())); + edgeEvent.setTenantId(tenantId); + edgeEvent.setEdgeEventAction(edgeEventAction.name()); + edgeEvent.setEntityId(entityId); + edgeEvent.setEdgeEventType(edgeEventType); + edgeEvent.setEntityBody(entityBody); return edgeEvent; } + private UUID getUUIDFromMsgData(TbMsg msg) throws JsonProcessingException { + JsonNode data = json.readTree(msg.getData()).get("id"); + String id = json.treeToValue(data.get("id"), String.class); + return UUID.fromString(id); + } + private ActionType getActionTypeByMsgType(String msgType) { ActionType actionType; if (SessionMsgType.POST_TELEMETRY_REQUEST.name().equals(msgType)) { @@ -161,14 +177,11 @@ public class TbMsgPushToEdgeNode implements TbNode { } private boolean isSupportedMsgType(String msgType) { - if (SessionMsgType.POST_TELEMETRY_REQUEST.name().equals(msgType) + return SessionMsgType.POST_TELEMETRY_REQUEST.name().equals(msgType) || SessionMsgType.POST_ATTRIBUTES_REQUEST.name().equals(msgType) || DataConstants.ATTRIBUTES_UPDATED.equals(msgType) - || DataConstants.ATTRIBUTES_DELETED.equals(msgType)) { - return true; - } else { - return false; - } + || DataConstants.ATTRIBUTES_DELETED.equals(msgType) + || DataConstants.ALARM.equals(msgType); } private ListenableFuture getEdgeIdByOriginatorId(TbContext ctx, TenantId tenantId, EntityId originatorId) {