Merge pull request #11194 from irynamatveieva/improvements/device-profile-node

Device profile node: improvements
This commit is contained in:
Viacheslav Klimov 2024-08-09 15:26:24 +03:00 committed by GitHub
commit a687e28324
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 61 additions and 1 deletions

View File

@ -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.page.PageLink;
import org.thingsboard.server.common.data.plugin.ComponentType; import org.thingsboard.server.common.data.plugin.ComponentType;
import org.thingsboard.server.common.data.rule.RuleNodeState; 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.TbMsg;
import org.thingsboard.server.common.msg.TbMsgMetaData; import org.thingsboard.server.common.msg.TbMsgMetaData;
import org.thingsboard.server.common.msg.queue.PartitionChangeMsg; import org.thingsboard.server.common.msg.queue.PartitionChangeMsg;
@ -52,6 +53,7 @@ import java.util.concurrent.TimeUnit;
name = "device profile", name = "device profile",
customRelations = true, customRelations = true,
relationTypes = {"Alarm Created", "Alarm Updated", "Alarm Severity Updated", "Alarm Cleared", "Success", "Failure"}, relationTypes = {"Alarm Created", "Alarm Updated", "Alarm Severity Updated", "Alarm Cleared", "Success", "Failure"},
version = 1,
configClazz = TbDeviceProfileNodeConfiguration.class, configClazz = TbDeviceProfileNodeConfiguration.class,
nodeDescription = "Process device messages based on device profile settings", 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 " + nodeDetails = "Create and clear alarms based on alarm rules defined in device profile. The output relation type is either " +
@ -241,4 +243,25 @@ public class TbDeviceProfileNode implements TbNode {
ctx.removeRuleNodeStateForEntity(deviceId); ctx.removeRuleNodeStateForEntity(deviceId);
} }
} }
@Override
public TbPair<Boolean, JsonNode> 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.get(persistAlarmRulesState).asBoolean()) {
hasChanges = true;
((ObjectNode) oldConfiguration).put(fetchAlarmRulesStateOnStart, false);
}
}
break;
default:
break;
}
return new TbPair<>(hasChanges, oldConfiguration);
}
} }

View File

@ -20,13 +20,17 @@ import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.params.provider.Arguments;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.junit.jupiter.MockitoExtension;
import org.thingsboard.common.util.JacksonUtil; 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.RuleEngineAlarmService;
import org.thingsboard.rule.engine.api.RuleEngineDeviceProfileCache; import org.thingsboard.rule.engine.api.RuleEngineDeviceProfileCache;
import org.thingsboard.rule.engine.api.TbContext; 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.TbNodeConfiguration;
import org.thingsboard.rule.engine.api.TbNodeException; import org.thingsboard.rule.engine.api.TbNodeException;
import org.thingsboard.server.common.data.AttributeScope; import org.thingsboard.server.common.data.AttributeScope;
@ -80,6 +84,7 @@ import java.util.Optional;
import java.util.TreeMap; import java.util.TreeMap;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
@ -87,8 +92,9 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class) @ExtendWith(MockitoExtension.class)
public class TbDeviceProfileNodeTest { public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
@Spy
private TbDeviceProfileNode node; private TbDeviceProfileNode node;
@Mock @Mock
@ -1723,4 +1729,35 @@ public class TbDeviceProfileNodeTest {
}); });
} }
private static Stream<Arguments> 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;
}
} }