diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/TbDeviceProfileNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/TbDeviceProfileNode.java index 9db629a37c..c029384473 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/TbDeviceProfileNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/TbDeviceProfileNode.java @@ -36,6 +36,7 @@ import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.plugin.ComponentType; import org.thingsboard.server.common.data.rule.RuleNodeState; +import org.thingsboard.server.common.data.util.TbPair; import org.thingsboard.server.common.msg.TbMsg; import org.thingsboard.server.common.msg.TbMsgMetaData; import org.thingsboard.server.common.msg.queue.PartitionChangeMsg; @@ -52,6 +53,7 @@ import java.util.concurrent.TimeUnit; name = "device profile", customRelations = true, relationTypes = {"Alarm Created", "Alarm Updated", "Alarm Severity Updated", "Alarm Cleared", "Success", "Failure"}, + version = 1, configClazz = TbDeviceProfileNodeConfiguration.class, nodeDescription = "Process device messages based on device profile settings", nodeDetails = "Create and clear alarms based on alarm rules defined in device profile. The output relation type is either " + @@ -241,4 +243,28 @@ public class TbDeviceProfileNode implements TbNode { ctx.removeRuleNodeStateForEntity(deviceId); } } + + @Override + public TbPair upgrade(int fromVersion, JsonNode oldConfiguration) throws TbNodeException { + boolean hasChanges = false; + switch (fromVersion) { + case 0: + String persistAlarmRulesState = "persistAlarmRulesState"; + String fetchAlarmRulesStateOnStart = "fetchAlarmRulesStateOnStart"; + if (oldConfiguration.has(persistAlarmRulesState)) { + + } + if (oldConfiguration.has(fetchAlarmRulesStateOnStart)) { + if (!oldConfiguration.get(persistAlarmRulesState).asBoolean()) { + hasChanges = true; + ((ObjectNode) oldConfiguration).put(fetchAlarmRulesStateOnStart, false); + } + } + break; + default: + break; + } + return new TbPair<>(hasChanges, oldConfiguration); + } + } diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/profile/TbDeviceProfileNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/profile/TbDeviceProfileNodeTest.java index 19eabf0bdc..04371c23a0 100644 --- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/profile/TbDeviceProfileNodeTest.java +++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/profile/TbDeviceProfileNodeTest.java @@ -20,13 +20,17 @@ import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.provider.Arguments; import org.mockito.Mock; import org.mockito.Mockito; +import org.mockito.Spy; import org.mockito.junit.jupiter.MockitoExtension; import org.thingsboard.common.util.JacksonUtil; +import org.thingsboard.rule.engine.AbstractRuleNodeUpgradeTest; import org.thingsboard.rule.engine.api.RuleEngineAlarmService; import org.thingsboard.rule.engine.api.RuleEngineDeviceProfileCache; import org.thingsboard.rule.engine.api.TbContext; +import org.thingsboard.rule.engine.api.TbNode; import org.thingsboard.rule.engine.api.TbNodeConfiguration; import org.thingsboard.rule.engine.api.TbNodeException; import org.thingsboard.server.common.data.AttributeScope; @@ -80,6 +84,7 @@ import java.util.Optional; import java.util.TreeMap; import java.util.UUID; import java.util.concurrent.TimeUnit; +import java.util.stream.Stream; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -87,8 +92,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) -public class TbDeviceProfileNodeTest { +public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest { + @Spy private TbDeviceProfileNode node; @Mock @@ -1723,4 +1729,35 @@ public class TbDeviceProfileNodeTest { }); } + private static Stream givenFromVersionAndConfig_whenUpgrade_thenVerifyHasChangesAndConfig() { + return Stream.of( + // default config for version 1 with upgrade from version 0 + Arguments.of(0, + "{\"persistAlarmRulesState\":false,\"fetchAlarmRulesStateOnStart\":false}", + true, + "{\"persistAlarmRulesState\":false,\"fetchAlarmRulesStateOnStart\":false}"), + // config for version 1 with upgrade from version 0 (persistAlarmRulesState and fetchAlarmRulesStateOnStart - true) + Arguments.of(0, + "{\"persistAlarmRulesState\":true,\"fetchAlarmRulesStateOnStart\":true}", + false, + "{\"persistAlarmRulesState\":true,\"fetchAlarmRulesStateOnStart\":true}"), + // config for version 1 with upgrade from version 0 (persistAlarmRulesState - true, fetchAlarmRulesStateOnStart - false) + Arguments.of(0, + "{\"persistAlarmRulesState\":true,\"fetchAlarmRulesStateOnStart\":false}", + false, + "{\"persistAlarmRulesState\":true,\"fetchAlarmRulesStateOnStart\":false}"), + // config for version 1 with upgrade from version 0 (persistAlarmRulesState - false, fetchAlarmRulesStateOnStart - true) + Arguments.of(0, + "{\"persistAlarmRulesState\":false,\"fetchAlarmRulesStateOnStart\":true}", + true, + "{\"persistAlarmRulesState\":false,\"fetchAlarmRulesStateOnStart\":false}") + ); + + } + + @Override + protected TbNode getTestNode() { + return node; + } + }