From d602333d98a7347410a9077adc5e876b358893a1 Mon Sep 17 00:00:00 2001 From: Yevhenii Date: Wed, 19 Mar 2025 19:30:01 +0200 Subject: [PATCH] Fix RuleChainMetadata for older Edge versions - refactoring --- .../service/edge/EdgeMsgConstructorUtils.java | 74 +++++++++++-------- .../edge/rpc/utils/EdgeVersionUtils.java | 8 -- .../edge/EdgeMsgConstructorUtilsTest.java | 45 ++++------- 3 files changed, 60 insertions(+), 67 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtils.java b/application/src/main/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtils.java index 85471f6211..d9c9bee9df 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtils.java +++ b/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 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> 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 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> 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 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 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 iterator = nodes.iterator(); + + while (iterator.hasNext()) { + JsonNode node = iterator.next(); + String type = node.get("type").asText(); + Set 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(); } } } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/utils/EdgeVersionUtils.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/utils/EdgeVersionUtils.java index 2ae6e91f34..9902118eb2 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/utils/EdgeVersionUtils.java +++ b/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); - } - } diff --git a/application/src/test/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtilsTest.java b/application/src/test/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtilsTest.java index 937a6709c5..690deac0ec 100644 --- a/application/src/test/java/org/thingsboard/server/service/edge/EdgeMsgConstructorUtilsTest.java +++ b/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 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 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 - ); - } - }