Browse Source

Fix RuleChainMetadata for older Edge versions

- refactoring
pull/12843/head
Yevhenii 2 years ago
parent
commit
d602333d98
  1. 74
      application/src/main/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtils.java
  2. 8
      application/src/main/java/org/thingsboard/server/service/edge/rpc/utils/EdgeVersionUtils.java
  3. 45
      application/src/test/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtilsTest.java

74
application/src/main/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtils.java

@ -119,7 +119,6 @@ import org.thingsboard.server.gen.edge.v1.UserUpdateMsg;
import org.thingsboard.server.gen.edge.v1.WidgetTypeUpdateMsg;
import org.thingsboard.server.gen.edge.v1.WidgetsBundleUpdateMsg;
import org.thingsboard.server.gen.transport.TransportProtos;
import org.thingsboard.server.service.edge.rpc.utils.EdgeVersionUtils;
import java.util.Iterator;
import java.util.List;
@ -128,17 +127,30 @@ import java.util.Set;
import java.util.UUID;
@Slf4j
public class EdgeMsgConstructorUtils {
public static final Map<String, String> NODE_TO_IGNORED_PARAM_FOR_OLD_EDGE_VERSION = Map.of(
TbMsgTimeseriesNode.class.getName(), "processingSettings",
TbMsgAttributesNode.class.getName(), "processingSettings",
TbSaveToCustomCassandraTableNode.class.getName(), "defaultTtl"
public static final Map<EdgeVersion, Map<String, String>> VERSION_TO_IGNORED_PARAM = Map.of(
EdgeVersion.V_3_8_0,
Map.of(
TbMsgTimeseriesNode.class.getName(), "processingSettings",
TbMsgAttributesNode.class.getName(), "processingSettings",
TbSaveToCustomCassandraTableNode.class.getName(), "defaultTtl"
),
EdgeVersion.V_3_7_0,
Map.of(
TbMsgTimeseriesNode.class.getName(), "processingSettings",
TbMsgAttributesNode.class.getName(), "processingSettings",
TbSaveToCustomCassandraTableNode.class.getName(), "defaultTtl"
)
);
//added in edge version 3.8.0
public static final Set<String> MISSING_NODES_IN_VERSION_37 = Set.of(
TbSendRestApiCallReplyNode.class.getName(),
TbAwsLambdaNode.class.getName()
//these nodes added in edge version 3.8.0
public static final Map<EdgeVersion, Set<String>> VERSION_TO_MISSING_NODES = Map.of(
EdgeVersion.V_3_7_0,
Set.of(
TbSendRestApiCallReplyNode.class.getName(),
TbAwsLambdaNode.class.getName()
)
);
public static AlarmUpdateMsg constructAlarmUpdatedMsg(UpdateMsgType msgType, Alarm alarm) {
@ -452,33 +464,35 @@ public class EdgeMsgConstructorUtils {
JsonNode jsonNode = JacksonUtil.valueToTree(ruleChainMetaData);
JsonNode nodes = jsonNode.get("nodes");
if (EdgeVersionUtils.isEdgeOlderThan_3_8_0(edgeVersion)) {
Iterator<JsonNode> iterator = nodes.iterator();
while (iterator.hasNext()) {
JsonNode node = iterator.next();
changeConfigForOldEdgeVersions(nodes, edgeVersion);
removeMissingNodeOldForEdge(nodes, edgeVersion);
String type = node.get("type").asText();
if (MISSING_NODES_IN_VERSION_37.contains(type)) {
iterator.remove();
}
}
}
return JacksonUtil.toString(jsonNode);
}
if (EdgeVersionUtils.isEdgeOlderThan_3_9_0(edgeVersion)) {
nodes.forEach(EdgeMsgConstructorUtils::changeRuleNodeConfigForOldEdgeVersion);
private static void changeConfigForOldEdgeVersions(JsonNode nodes, EdgeVersion edgeVersion) {
nodes.forEach(node -> {
if (node.isObject() && node.has("configuration")) {
String nodeType = node.get("type").asText();
Map<String, String> ignoredParams = VERSION_TO_IGNORED_PARAM.get(edgeVersion);
return JacksonUtil.toString(jsonNode);
} else {
return JacksonUtil.toString(ruleChainMetaData);
}
if (ignoredParams != null && ignoredParams.containsKey(nodeType)) {
((ObjectNode) node.get("configuration")).remove(ignoredParams.get(nodeType));
}
}
});
}
private static void changeRuleNodeConfigForOldEdgeVersion(JsonNode node) {
if (node.isObject()) {
String nodeType = node.get("type").asText();
private static void removeMissingNodeOldForEdge(JsonNode nodes, EdgeVersion edgeVersion) {
Iterator<JsonNode> iterator = nodes.iterator();
while (iterator.hasNext()) {
JsonNode node = iterator.next();
String type = node.get("type").asText();
Set<String> missNodes = VERSION_TO_MISSING_NODES.get(edgeVersion);
if (node.isObject() && node.has("configuration") && NODE_TO_IGNORED_PARAM_FOR_OLD_EDGE_VERSION.containsKey(nodeType)) {
((ObjectNode) node.get("configuration")).remove(NODE_TO_IGNORED_PARAM_FOR_OLD_EDGE_VERSION.get(nodeType));
if (missNodes != null && missNodes.contains(type)) {
iterator.remove();
}
}
}

8
application/src/main/java/org/thingsboard/server/service/edge/rpc/utils/EdgeVersionUtils.java

@ -25,12 +25,4 @@ public final class EdgeVersionUtils {
return currentVersion.ordinal() < requiredVersion.ordinal();
}
public static boolean isEdgeOlderThan_3_9_0(EdgeVersion currentVersion) {
return isEdgeVersionOlderThan(currentVersion, EdgeVersion.V_3_9_0);
}
public static boolean isEdgeOlderThan_3_8_0(EdgeVersion currentVersion) {
return isEdgeVersionOlderThan(currentVersion, EdgeVersion.V_3_8_0);
}
}

45
application/src/test/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtilsTest.java

@ -34,15 +34,14 @@ import org.thingsboard.server.common.data.rule.RuleChainMetaData;
import org.thingsboard.server.common.data.rule.RuleNode;
import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.service.edge.rpc.utils.EdgeVersionUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import static org.thingsboard.server.service.edge.EdgeMsgConstructorUtils.MISSING_NODES_IN_VERSION_37;
import static org.thingsboard.server.service.edge.EdgeMsgConstructorUtils.NODE_TO_IGNORED_PARAM_FOR_OLD_EDGE_VERSION;
import static org.thingsboard.server.service.edge.EdgeMsgConstructorUtils.VERSION_TO_IGNORED_PARAM;
import static org.thingsboard.server.service.edge.EdgeMsgConstructorUtils.VERSION_TO_MISSING_NODES;
@Slf4j
public class EdgeMsgConstructorUtilsTest {
@ -93,13 +92,11 @@ public class EdgeMsgConstructorUtilsTest {
List<RuleNode> ruleNodes = extractRuleNodesFromUpdateMsg(metaData, edgeVersion);
// THEN
boolean isOldEdge = EdgeVersionUtils.isEdgeOlderThan_3_8_0(edgeVersion);
int leftNode = VERSION_TO_MISSING_NODES.containsKey(edgeVersion) ?
CONFIG_TO_MISS_NODE_FOR_OLD_EDGE.size() - VERSION_TO_MISSING_NODES.get(edgeVersion).size() :
CONFIG_TO_MISS_NODE_FOR_OLD_EDGE.size();
if (isOldEdge) {
Assert.assertTrue("Rule Node must be empty", ruleNodes.isEmpty());
} else {
Assert.assertEquals(MISSING_NODES_IN_VERSION_37.size(), ruleNodes.size());
}
Assert.assertEquals(leftNode, ruleNodes.size());
});
}
@ -129,6 +126,7 @@ public class EdgeMsgConstructorUtilsTest {
EdgeMsgConstructorUtils.constructRuleChainMetadataUpdatedMsg(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, metaData, edgeVersion).getEntity();
RuleChainMetaData ruleChainMetaData = JacksonUtil.fromString(ruleChainMetadataUpdateMsg, RuleChainMetaData.class, true);
Assert.assertNotNull("RuleChainMetaData is null", ruleChainMetaData);
return ruleChainMetaData.getNodes();
@ -136,29 +134,18 @@ public class EdgeMsgConstructorUtilsTest {
private void assertRuleNodeConfig(List<RuleNode> ruleNodes, EdgeVersion edgeVersion) {
ruleNodes.forEach(ruleNode -> {
int configParamCount = NODE_TO_CONFIG_PARAMS_COUNT.get(ruleNode.getName());
int configParamCount = NODE_TO_CONFIG_PARAMS_COUNT.get(ruleNode.getType());
boolean isLegacyEdgeVersion = EdgeVersionUtils.isEdgeOlderThan_3_9_0(edgeVersion);
int expectedConfigAmount = isLegacyEdgeVersion ? configParamCount - 1 : configParamCount;
boolean includeConfigParam = !isLegacyEdgeVersion;
boolean isOldEdgeVersion = VERSION_TO_IGNORED_PARAM.keySet().stream()
.anyMatch(version -> version.equals(edgeVersion));
int expectedConfigAmount = isOldEdgeVersion ? configParamCount - 1 : configParamCount;
validateParams(ruleNode, expectedConfigAmount, includeConfigParam);
Assert.assertEquals(
String.format("Expected %d config params for ruleNode '%s', but found %d",
expectedConfigAmount, ruleNode.getName(), ruleNode.getConfiguration().size()),
expectedConfigAmount, ruleNode.getConfiguration().size()
);
});
}
private void validateParams(RuleNode ruleNode, int expectedConfigAmount, boolean includeConfigParam) {
String ignoreConfigParam = NODE_TO_IGNORED_PARAM_FOR_OLD_EDGE_VERSION.get(ruleNode.getName());
Assert.assertEquals(
String.format("Expected %d config params for ruleNode '%s', but found %d", expectedConfigAmount, ruleNode.getName(), ruleNode.getConfiguration().size()),
expectedConfigAmount, ruleNode.getConfiguration().size()
);
boolean hasIgnoredField = ruleNode.getConfiguration().has(ignoreConfigParam);
Assert.assertEquals(
String.format("Field '%s' for ruleNode '%s' should %s be present", ignoreConfigParam, ruleNode.getName(), includeConfigParam ? "not" : ""),
includeConfigParam, hasIgnoredField
);
}
}

Loading…
Cancel
Save