Browse Source

Refactoring from multiple fields into one settings object

pull/12138/head
Andrii Shvaika 2 years ago
parent
commit
d92681cf71
  1. 18
      application/src/main/data/json/edge/rule_chains/edge_root_rule_chain.json
  2. 14
      application/src/main/data/json/tenant/device_profile/rule_chain_template.json
  3. 21
      application/src/main/data/json/tenant/rule_chains/root_rule_chain.json
  4. 7
      application/src/main/data/upgrade/3.8.1/schema_update.sql
  5. 7
      application/src/main/java/org/thingsboard/server/controller/SystemInfoController.java
  6. 3
      application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/BaseRuleChainMetadataConstructor.java
  7. 14
      application/src/main/resources/thingsboard.yml
  8. 72
      application/src/test/java/org/thingsboard/server/actors/rule/DefaultTbContextTest.java
  9. 3
      application/src/test/java/org/thingsboard/server/edge/AbstractEdgeTest.java
  10. 4
      application/src/test/java/org/thingsboard/server/edge/RuleChainEdgeTest.java
  11. 12
      application/src/test/java/org/thingsboard/server/rules/flow/AbstractRuleEngineFlowIntegrationTest.java
  12. 3
      application/src/test/java/org/thingsboard/server/rules/lifecycle/AbstractRuleEngineLifecycleIntegrationTest.java
  13. 5
      application/src/test/java/org/thingsboard/server/service/housekeeper/HousekeeperServiceTest.java
  14. 4
      application/src/test/java/org/thingsboard/server/service/sync/ie/ExportImportServiceSqlTest.java
  15. 9
      application/src/test/java/org/thingsboard/server/service/sync/vc/VersionControlTest.java
  16. 1
      common/dao-api/src/main/java/org/thingsboard/server/dao/tenant/TbTenantProfileCache.java
  17. 17
      common/data/src/main/java/org/thingsboard/server/common/data/HasDebugSettings.java
  18. 60
      common/data/src/main/java/org/thingsboard/server/common/data/debug/DebugSettings.java
  19. 33
      common/data/src/main/java/org/thingsboard/server/common/data/rule/RuleNode.java
  20. 7
      common/data/src/main/java/org/thingsboard/server/common/data/tenant/profile/DefaultTenantProfileConfiguration.java
  21. 2
      common/data/src/main/java/org/thingsboard/server/common/data/tenant/profile/TenantProfileConfiguration.java
  22. 3
      common/edge-api/src/main/proto/edge.proto
  23. 38
      common/util/src/main/java/org/thingsboard/common/util/DebugModeUtil.java
  24. 26
      dao/src/main/java/org/thingsboard/server/dao/entity/AbstractEntityService.java
  25. 3
      dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java
  26. 16
      dao/src/main/java/org/thingsboard/server/dao/model/sql/RuleNodeEntity.java
  27. 2
      dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java
  28. 3
      dao/src/main/resources/sql/schema-entities.sql
  29. 36
      monitoring/src/main/resources/root_rule_chain.json
  30. 6
      msa/black-box-tests/src/test/resources/MqttRuleNodeTestMetadata.json
  31. 6
      msa/black-box-tests/src/test/resources/RpcResponseRuleChainMetadata.json

18
application/src/main/data/json/edge/rule_chains/edge_root_rule_chain.json

@ -20,8 +20,6 @@
},
"type": "org.thingsboard.rule.engine.profile.TbDeviceProfileNode",
"name": "Device Profile Node",
"debugFailures": false,
"debugAll": false,
"configuration": {
"persistAlarmRulesState": false,
"fetchAlarmRulesStateOnStart": false
@ -35,8 +33,6 @@
},
"type": "org.thingsboard.rule.engine.telemetry.TbMsgTimeseriesNode",
"name": "Save Timeseries",
"debugFailures": false,
"debugAll": false,
"configuration": {
"defaultTTL": 0
},
@ -49,8 +45,6 @@
},
"type": "org.thingsboard.rule.engine.telemetry.TbMsgAttributesNode",
"name": "Save Client Attributes",
"debugFailures": false,
"debugAll": false,
"configurationVersion": 2,
"configuration": {
"scope": "CLIENT_SCOPE",
@ -67,8 +61,6 @@
},
"type": "org.thingsboard.rule.engine.filter.TbMsgTypeSwitchNode",
"name": "Message Type Switch",
"debugFailures": false,
"debugAll": false,
"configuration": {
"version": 0
},
@ -81,8 +73,6 @@
},
"type": "org.thingsboard.rule.engine.action.TbLogNode",
"name": "Log RPC from Device",
"debugFailures": false,
"debugAll": false,
"configuration": {
"scriptLang": "TBEL",
"jsScript": "return '\\nIncoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);",
@ -97,8 +87,6 @@
},
"type": "org.thingsboard.rule.engine.action.TbLogNode",
"name": "Log Other",
"debugFailures": false,
"debugAll": false,
"configuration": {
"scriptLang": "TBEL",
"jsScript": "return '\\nIncoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);",
@ -113,8 +101,6 @@
},
"type": "org.thingsboard.rule.engine.rpc.TbSendRPCRequestNode",
"name": "RPC Call Request",
"debugFailures": false,
"debugAll": false,
"configuration": {
"timeoutInSeconds": 60
},
@ -127,8 +113,6 @@
},
"type": "org.thingsboard.rule.engine.edge.TbMsgPushToCloudNode",
"name": "Push to cloud",
"debugFailures": false,
"debugAll": false,
"configuration": {
"scope": "SERVER_SCOPE"
},
@ -141,8 +125,6 @@
},
"type": "org.thingsboard.rule.engine.edge.TbMsgPushToCloudNode",
"name": "Push to cloud",
"debugFailures": false,
"debugAll": false,
"configuration": {
"scope": "SERVER_SCOPE"
},

14
application/src/main/data/json/tenant/device_profile/rule_chain_template.json

@ -19,8 +19,6 @@
},
"type": "org.thingsboard.rule.engine.telemetry.TbMsgTimeseriesNode",
"name": "Save Timeseries",
"debugFailures": false,
"debugAll": false,
"configuration": {
"defaultTTL": 0
}
@ -32,8 +30,6 @@
},
"type": "org.thingsboard.rule.engine.telemetry.TbMsgAttributesNode",
"name": "Save Client Attributes",
"debugFailures": false,
"debugAll": false,
"configurationVersion": 2,
"configuration": {
"scope": "CLIENT_SCOPE",
@ -49,8 +45,6 @@
},
"type": "org.thingsboard.rule.engine.filter.TbMsgTypeSwitchNode",
"name": "Message Type Switch",
"debugFailures": false,
"debugAll": false,
"configuration": {
"version": 0
}
@ -62,8 +56,6 @@
},
"type": "org.thingsboard.rule.engine.action.TbLogNode",
"name": "Log RPC from Device",
"debugFailures": false,
"debugAll": false,
"configuration": {
"scriptLang": "TBEL",
"jsScript": "return '\\nIncoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);",
@ -77,8 +69,6 @@
},
"type": "org.thingsboard.rule.engine.action.TbLogNode",
"name": "Log Other",
"debugFailures": false,
"debugAll": false,
"configuration": {
"scriptLang": "TBEL",
"jsScript": "return '\\nIncoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);",
@ -92,8 +82,6 @@
},
"type": "org.thingsboard.rule.engine.rpc.TbSendRPCRequestNode",
"name": "RPC Call Request",
"debugFailures": false,
"debugAll": false,
"configuration": {
"timeoutInSeconds": 60
}
@ -106,8 +94,6 @@
},
"type": "org.thingsboard.rule.engine.profile.TbDeviceProfileNode",
"name": "Device Profile Node",
"debugFailures": false,
"debugAll": false,
"configuration": {
"persistAlarmRulesState": false,
"fetchAlarmRulesStateOnStart": false

21
application/src/main/data/json/tenant/rule_chains/root_rule_chain.json

@ -18,9 +18,6 @@
},
"type": "org.thingsboard.rule.engine.telemetry.TbMsgTimeseriesNode",
"name": "Save Timeseries",
"debugFailures": false,
"debugAll": false,
"debugAllUntil": 0,
"configuration": {
"defaultTTL": 0
}
@ -32,9 +29,6 @@
},
"type": "org.thingsboard.rule.engine.telemetry.TbMsgAttributesNode",
"name": "Save Client Attributes",
"debugFailures": false,
"debugAll": false,
"debugAllUntil": 0,
"configurationVersion": 2,
"configuration": {
"scope": "CLIENT_SCOPE",
@ -50,9 +44,6 @@
},
"type": "org.thingsboard.rule.engine.filter.TbMsgTypeSwitchNode",
"name": "Message Type Switch",
"debugFailures": false,
"debugAll": false,
"debugAllUntil": 0,
"configuration": {
"version": 0
}
@ -64,9 +55,6 @@
},
"type": "org.thingsboard.rule.engine.action.TbLogNode",
"name": "Log RPC from Device",
"debugFailures": false,
"debugAll": false,
"debugAllUntil": 0,
"configuration": {
"scriptLang": "TBEL",
"jsScript": "return '\\nIncoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);",
@ -80,9 +68,6 @@
},
"type": "org.thingsboard.rule.engine.action.TbLogNode",
"name": "Log Other",
"debugFailures": false,
"debugAll": false,
"debugAllUntil": 0,
"configuration": {
"scriptLang": "TBEL",
"jsScript": "return '\\nIncoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);",
@ -96,9 +81,6 @@
},
"type": "org.thingsboard.rule.engine.rpc.TbSendRPCRequestNode",
"name": "RPC Call Request",
"debugFailures": false,
"debugAll": false,
"debugAllUntil": 0,
"configuration": {
"timeoutInSeconds": 60
}
@ -111,9 +93,6 @@
},
"type": "org.thingsboard.rule.engine.profile.TbDeviceProfileNode",
"name": "Device Profile Node",
"debugFailures": false,
"debugAll": false,
"debugAllUntil": 0,
"configuration": {
"persistAlarmRulesState": false,
"fetchAlarmRulesStateOnStart": false

7
application/src/main/data/upgrade/3.8.1/schema_update.sql

@ -27,14 +27,13 @@ UPDATE tb_user SET additional_info = (additional_info::jsonb - 'lastLoginTs' - '
-- UPDATE RULE NODE DEBUG MODE TO DEBUG STRATEGY START
ALTER TABLE rule_node ADD COLUMN IF NOT EXISTS debug_failures boolean DEFAULT false;
ALTER TABLE rule_node ADD COLUMN IF NOT EXISTS debug_all_until bigint NOT NULL DEFAULT 0;
ALTER TABLE rule_node ADD COLUMN IF NOT EXISTS debug_settings varchar(1024) DEFAULT null;
DO
$$
BEGIN
IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'rule_node' AND column_name = 'debug_mode')
IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'rule_node' AND column_name = 'debug_settings')
THEN
UPDATE rule_node SET debug_all_until = (extract(epoch from now()) + 3600) * 1000 WHERE debug_mode = true;
UPDATE rule_node SET debug_settings = '{"failuresEnabled": true, "allEnabledUntil": ' || (extract(epoch from now()) + 900) * 1000 || '}' WHERE debug_mode = true; -- 15 minutes according to thingsboard.yml default settings.
ALTER TABLE rule_node DROP COLUMN debug_mode;
END IF;
END

7
application/src/main/java/org/thingsboard/server/controller/SystemInfoController.java

@ -28,6 +28,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.thingsboard.common.util.DebugModeUtil;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.DashboardInfo;
import org.thingsboard.server.common.data.SystemParams;
@ -70,8 +71,8 @@ public class SystemInfoController extends BaseController {
@Value("${ui.dashboard.max_datapoints_limit}")
private long maxDatapointsLimit;
@Value("${debug_mode.max_duration:15}")
private int maxDebugModeDurationMinutes;
@Value("${debug.settings.default_duration:15}")
private int defaultDebugDurationMinutes;
@Value("${actors.rule.chain.debug_mode_rate_limits_per_tenant.enabled:true}")
private boolean ruleChainDebugPerTenantLimitsEnabled;
@ -150,7 +151,7 @@ public class SystemInfoController extends BaseController {
if (!currentUser.isSystemAdmin()) {
DefaultTenantProfileConfiguration tenantProfileConfiguration = tenantProfileCache.get(tenantId).getDefaultProfileConfiguration();
systemParams.setMaxResourceSize(tenantProfileConfiguration.getMaxResourceSize());
systemParams.setMaxDebugModeDurationMinutes(tenantProfileConfiguration.getMaxDebugModeDurationMinutes(maxDebugModeDurationMinutes));
systemParams.setMaxDebugModeDurationMinutes(DebugModeUtil.getMaxDebugAllDuration(tenantProfileConfiguration.getMaxDebugModeDurationMinutes(), defaultDebugDurationMinutes));
if (ruleChainDebugPerTenantLimitsEnabled) {
systemParams.setRuleChainDebugPerTenantLimitsConfiguration(ruleChainDebugPerTenantLimitsConfiguration);
}

3
application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/BaseRuleChainMetadataConstructor.java

@ -88,8 +88,7 @@ public abstract class BaseRuleChainMetadataConstructor implements RuleChainMetad
.setIdLSB(node.getId().getId().getLeastSignificantBits())
.setType(node.getType())
.setName(node.getName())
.setDebugFailures(node.isDebugFailures())
.setDebugAllUntil(node.getDebugAllUntil())
.setDebugSettings(JacksonUtil.toString(node.getDebugSettings()))
.setConfiguration(JacksonUtil.toString(node.getConfiguration()))
.setAdditionalInfo(JacksonUtil.toString(node.getAdditionalInfo()))
.setSingletonMode(node.isSingletonMode())

14
application/src/main/resources/thingsboard.yml

@ -465,7 +465,7 @@ actors:
debug_mode_rate_limits_per_tenant:
# Enable/Disable the rate limit of persisted debug events for all rule nodes per tenant
enabled: "${ACTORS_RULE_CHAIN_DEBUG_MODE_RATE_LIMITS_PER_TENANT_ENABLED:true}"
# The value of DEBUG mode rate limit. By default, no more then 50 thousand events per hour
# The value of DEBUG mode rate limit. By default, no more than 50 thousand events per hour
configuration: "${ACTORS_RULE_CHAIN_DEBUG_MODE_RATE_LIMITS_PER_TENANT_CONFIGURATION:50000:3600}"
node:
# Errors for particular actor are persisted once per specified amount of milliseconds
@ -494,13 +494,11 @@ actors:
# Actors statistic persistence frequency in milliseconds
persist_frequency: "${ACTORS_STATISTICS_PERSIST_FREQUENCY:3600000}"
debug_mode:
# Maximum duration (in minutes) for debug mode.
# Min value is 1 minute.
# If set in the tenant profile and valid, it will be used.
# Otherwise, the value from this setting is used.
# If value from this setting is invalid, the default value (15 minutes) will be used.
max_duration: "${DEBUG_MODE_MAX_DURATION_MINUTES:15}"
debug:
settings:
# Default duration (in minutes) for debug mode. Min value is 1 minute. Tenant profile settings override this one.
# If value from this setting is invalid, the default value (15 minutes) will be used.
default_duration: "${DEBUG_SETTINGS_DEFAULT_DURATION_MINUTES:15}"
# Cache settings parameters
cache:

72
application/src/test/java/org/thingsboard/server/actors/rule/DefaultTbContextTest.java

@ -26,6 +26,7 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import org.thingsboard.common.util.DebugModeUtil;
import org.thingsboard.server.actors.ActorSystemContext;
import org.thingsboard.server.actors.TbActorRef;
import org.thingsboard.server.actors.ruleChain.DefaultTbContext;
@ -34,6 +35,7 @@ import org.thingsboard.server.actors.ruleChain.RuleNodeCtx;
import org.thingsboard.server.actors.ruleChain.RuleNodeToRuleChainTellNextMsg;
import org.thingsboard.server.cluster.TbClusterService;
import org.thingsboard.server.common.data.DataConstants;
import org.thingsboard.server.common.data.debug.DebugSettings;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.RuleChainId;
import org.thingsboard.server.common.data.id.RuleNodeId;
@ -104,8 +106,7 @@ class DefaultTbContextTest {
var msg = getTbMsgWithCallback(callbackMock);
var ruleNode = new RuleNode(RULE_NODE_ID);
ruleNode.setRuleChainId(RULE_CHAIN_ID);
ruleNode.setDebugFailures(true);
ruleNode.setDebugAllUntil(0);
ruleNode.setDebugSettings(DebugSettings.failures());
given(nodeCtxMock.getSelf()).willReturn(ruleNode);
given(nodeCtxMock.getChainActor()).willReturn(chainActorMock);
@ -126,8 +127,7 @@ class DefaultTbContextTest {
var msg = getTbMsgWithCallback(callbackMock);
var ruleNode = new RuleNode(RULE_NODE_ID);
ruleNode.setRuleChainId(RULE_CHAIN_ID);
ruleNode.setDebugFailures(true);
ruleNode.setDebugAllUntil(0);
ruleNode.setDebugSettings(DebugSettings.failures());
given(nodeCtxMock.getSelf()).willReturn(ruleNode);
given(nodeCtxMock.getChainActor()).willReturn(chainActorMock);
@ -149,8 +149,7 @@ class DefaultTbContextTest {
var msg = getTbMsgWithCallback(callbackMock);
var ruleNode = new RuleNode(RULE_NODE_ID);
ruleNode.setRuleChainId(RULE_CHAIN_ID);
ruleNode.setDebugFailures(true);
ruleNode.setDebugAllUntil(0);
ruleNode.setDebugSettings(DebugSettings.failures());
given(nodeCtxMock.getTenantId()).willReturn(TENANT_ID);
given(nodeCtxMock.getSelf()).willReturn(ruleNode);
given(nodeCtxMock.getChainActor()).willReturn(chainActorMock);
@ -181,8 +180,7 @@ class DefaultTbContextTest {
var msg = getTbMsgWithCallback(callbackMock);
var ruleNode = new RuleNode(RULE_NODE_ID);
ruleNode.setRuleChainId(RULE_CHAIN_ID);
ruleNode.setDebugFailures(false);
ruleNode.setDebugAllUntil(0);
ruleNode.setDebugSettings(DebugSettings.off());
given(nodeCtxMock.getSelf()).willReturn(ruleNode);
given(nodeCtxMock.getChainActor()).willReturn(chainActorMock);
@ -212,8 +210,7 @@ class DefaultTbContextTest {
var msg = getTbMsgWithCallback(callbackMock);
var ruleNode = new RuleNode(RULE_NODE_ID);
ruleNode.setRuleChainId(RULE_CHAIN_ID);
ruleNode.setDebugFailures(false);
ruleNode.setDebugAllUntil(getUntilTime());
ruleNode.setDebugSettings(DebugSettings.until(getUntilTime()));
given(nodeCtxMock.getTenantId()).willReturn(TENANT_ID);
given(nodeCtxMock.getSelf()).willReturn(ruleNode);
given(nodeCtxMock.getChainActor()).willReturn(chainActorMock);
@ -240,8 +237,7 @@ class DefaultTbContextTest {
var msg = getTbMsgWithCallback(callbackMock);
var ruleNode = new RuleNode(RULE_NODE_ID);
ruleNode.setRuleChainId(RULE_CHAIN_ID);
ruleNode.setDebugFailures(false);
ruleNode.setDebugAllUntil(getUntilTime());
ruleNode.setDebugSettings(DebugSettings.until(getUntilTime()));
given(nodeCtxMock.getTenantId()).willReturn(TENANT_ID);
given(nodeCtxMock.getSelf()).willReturn(ruleNode);
given(nodeCtxMock.getChainActor()).willReturn(chainActorMock);
@ -270,8 +266,7 @@ class DefaultTbContextTest {
var msg = getTbMsgWithCallback(callbackMock);
var ruleNode = new RuleNode(RULE_NODE_ID);
ruleNode.setRuleChainId(RULE_CHAIN_ID);
ruleNode.setDebugFailures(false);
ruleNode.setDebugAllUntil(getUntilTime());
ruleNode.setDebugSettings(DebugSettings.until(getUntilTime()));
given(nodeCtxMock.getTenantId()).willReturn(TENANT_ID);
given(nodeCtxMock.getSelf()).willReturn(ruleNode);
given(nodeCtxMock.getChainActor()).willReturn(chainActorMock);
@ -298,8 +293,7 @@ class DefaultTbContextTest {
var msg = getTbMsgWithCallback(callbackMock);
var ruleNode = new RuleNode(RULE_NODE_ID);
ruleNode.setRuleChainId(RULE_CHAIN_ID);
ruleNode.setDebugFailures(true);
ruleNode.setDebugAllUntil(getUntilTime());
ruleNode.setDebugSettings(DebugSettings.failuresOrUntil(getUntilTime()));
given(nodeCtxMock.getTenantId()).willReturn(TENANT_ID);
given(nodeCtxMock.getSelf()).willReturn(ruleNode);
given(nodeCtxMock.getChainActor()).willReturn(chainActorMock);
@ -330,7 +324,7 @@ class DefaultTbContextTest {
var msgMock = mock(TbMsg.class);
var ruleNode = new RuleNode(RULE_NODE_ID);
ruleNode.setRuleChainId(RULE_CHAIN_ID);
ruleNode.setDebugFailures(true);
ruleNode.setDebugSettings(DebugSettings.failures());
given(msgMock.popFormStack()).willReturn(new TbMsgProcessingStackItem(RULE_CHAIN_ID, RULE_NODE_ID));
given(nodeCtxMock.getTenantId()).willReturn(TENANT_ID);
given(nodeCtxMock.getSelf()).willReturn(ruleNode);
@ -352,7 +346,7 @@ class DefaultTbContextTest {
var msgMock = mock(TbMsg.class);
var ruleNode = new RuleNode(RULE_NODE_ID);
ruleNode.setRuleChainId(RULE_CHAIN_ID);
ruleNode.setDebugFailures(true);
ruleNode.setDebugSettings(DebugSettings.failures());
given(msgMock.popFormStack()).willReturn(new TbMsgProcessingStackItem(RULE_CHAIN_ID, RULE_NODE_ID));
given(nodeCtxMock.getSelf()).willReturn(ruleNode);
given(nodeCtxMock.getChainActor()).willReturn(chainActorMock);
@ -373,8 +367,6 @@ class DefaultTbContextTest {
var msgMock = mock(TbMsg.class);
var ruleNode = new RuleNode(RULE_NODE_ID);
ruleNode.setRuleChainId(RULE_CHAIN_ID);
ruleNode.setDebugFailures(false);
ruleNode.setDebugAllUntil(0);
given(msgMock.popFormStack()).willReturn(new TbMsgProcessingStackItem(RULE_CHAIN_ID, RULE_NODE_ID));
given(nodeCtxMock.getSelf()).willReturn(ruleNode);
given(nodeCtxMock.getChainActor()).willReturn(chainActorMock);
@ -395,8 +387,7 @@ class DefaultTbContextTest {
var msgMock = mock(TbMsg.class);
var ruleNode = new RuleNode(RULE_NODE_ID);
ruleNode.setRuleChainId(RULE_CHAIN_ID);
ruleNode.setDebugFailures(false);
ruleNode.setDebugAllUntil(getUntilTime());
ruleNode.setDebugSettings(DebugSettings.until(getUntilTime()));
given(msgMock.popFormStack()).willReturn(new TbMsgProcessingStackItem(RULE_CHAIN_ID, RULE_NODE_ID));
given(nodeCtxMock.getTenantId()).willReturn(TENANT_ID);
given(nodeCtxMock.getSelf()).willReturn(ruleNode);
@ -419,8 +410,7 @@ class DefaultTbContextTest {
var msgMock = mock(TbMsg.class);
var ruleNode = new RuleNode(RULE_NODE_ID);
ruleNode.setRuleChainId(RULE_CHAIN_ID);
ruleNode.setDebugFailures(false);
ruleNode.setDebugAllUntil(getUntilTime());
ruleNode.setDebugSettings(DebugSettings.until(getUntilTime()));
given(msgMock.popFormStack()).willReturn(new TbMsgProcessingStackItem(RULE_CHAIN_ID, RULE_NODE_ID));
given(nodeCtxMock.getTenantId()).willReturn(TENANT_ID);
given(nodeCtxMock.getSelf()).willReturn(ruleNode);
@ -442,8 +432,6 @@ class DefaultTbContextTest {
var msgMock = mock(TbMsg.class);
var ruleNode = new RuleNode(RULE_NODE_ID);
ruleNode.setRuleChainId(RULE_CHAIN_ID);
ruleNode.setDebugFailures(false);
ruleNode.setDebugAllUntil(0);
given(msgMock.popFormStack()).willReturn(null);
TbMsgCallback callbackMock = mock(TbMsgCallback.class);
given(msgMock.getCallback()).willReturn(callbackMock);
@ -465,8 +453,7 @@ class DefaultTbContextTest {
var msgMock = mock(TbMsg.class);
var ruleNode = new RuleNode(RULE_NODE_ID);
ruleNode.setRuleChainId(RULE_CHAIN_ID);
ruleNode.setDebugFailures(false);
ruleNode.setDebugAllUntil(getUntilTime());
ruleNode.setDebugSettings(DebugSettings.until(getUntilTime()));
given(msgMock.popFormStack()).willReturn(null);
TbMsgCallback callbackMock = mock(TbMsgCallback.class);
given(msgMock.getCallback()).willReturn(callbackMock);
@ -490,8 +477,7 @@ class DefaultTbContextTest {
var msgMock = mock(TbMsg.class);
var ruleNode = new RuleNode(RULE_NODE_ID);
ruleNode.setRuleChainId(RULE_CHAIN_ID);
ruleNode.setDebugFailures(true);
ruleNode.setDebugAllUntil(getUntilTime());
ruleNode.setDebugSettings(DebugSettings.failuresOrUntil(getUntilTime()));
given(msgMock.popFormStack()).willReturn(null);
TbMsgCallback callbackMock = mock(TbMsgCallback.class);
given(msgMock.getCallback()).willReturn(callbackMock);
@ -516,7 +502,7 @@ class DefaultTbContextTest {
var tpi = new TopicPartitionInfo(DataConstants.MAIN_QUEUE_TOPIC, TENANT_ID, 0, true);
var ruleNode = new RuleNode(RULE_NODE_ID);
ruleNode.setRuleChainId(RULE_CHAIN_ID);
ruleNode.setDebugFailures(true);
ruleNode.setDebugSettings(DebugSettings.failures());
var tbClusterServiceMock = mock(TbClusterService.class);
given(nodeCtxMock.getTenantId()).willReturn(TENANT_ID);
@ -549,8 +535,6 @@ class DefaultTbContextTest {
var tpi = new TopicPartitionInfo(DataConstants.MAIN_QUEUE_TOPIC, TENANT_ID, 0, true);
var ruleNode = new RuleNode(RULE_NODE_ID);
ruleNode.setRuleChainId(RULE_CHAIN_ID);
ruleNode.setDebugFailures(false);
ruleNode.setDebugAllUntil(0);
var tbClusterServiceMock = mock(TbClusterService.class);
given(nodeCtxMock.getTenantId()).willReturn(TENANT_ID);
@ -577,8 +561,7 @@ class DefaultTbContextTest {
var tpi = new TopicPartitionInfo(DataConstants.MAIN_QUEUE_TOPIC, TENANT_ID, 0, true);
var ruleNode = new RuleNode(RULE_NODE_ID);
ruleNode.setRuleChainId(RULE_CHAIN_ID);
ruleNode.setDebugFailures(false);
ruleNode.setDebugAllUntil(getUntilTime());
ruleNode.setDebugSettings(DebugSettings.until(getUntilTime()));
var tbClusterServiceMock = mock(TbClusterService.class);
given(nodeCtxMock.getTenantId()).willReturn(TENANT_ID);
@ -641,8 +624,7 @@ class DefaultTbContextTest {
var tpi = new TopicPartitionInfo(DataConstants.MAIN_QUEUE_TOPIC, TENANT_ID, 0, true);
var ruleNode = new RuleNode(RULE_NODE_ID);
ruleNode.setRuleChainId(RULE_CHAIN_ID);
ruleNode.setDebugFailures(debugFailures);
ruleNode.setDebugAllUntil(debugAllUntil);
ruleNode.setDebugSettings(new DebugSettings(debugFailures, debugAllUntil));
var tbClusterServiceMock = mock(TbClusterService.class);
given(nodeCtxMock.getTenantId()).willReturn(TENANT_ID);
@ -696,8 +678,7 @@ class DefaultTbContextTest {
var ruleNode = new RuleNode(RULE_NODE_ID);
ruleNode.setQueueName(DataConstants.MAIN_QUEUE_NAME);
ruleNode.setRuleChainId(RULE_CHAIN_ID);
ruleNode.setDebugFailures(debugFailures);
ruleNode.setDebugAllUntil(debugAllUntil);
ruleNode.setDebugSettings(new DebugSettings(debugFailures, debugAllUntil));
var tbClusterServiceMock = mock(TbClusterService.class);
given(nodeCtxMock.getTenantId()).willReturn(TENANT_ID);
@ -746,8 +727,7 @@ class DefaultTbContextTest {
var msg = getTbMsg();
var ruleNode = new RuleNode(RULE_NODE_ID);
ruleNode.setRuleChainId(RULE_CHAIN_ID);
ruleNode.setDebugFailures(true);
ruleNode.setDebugAllUntil(0);
ruleNode.setDebugSettings(DebugSettings.failures());
given(nodeCtxMock.getTenantId()).willReturn(TENANT_ID);
given(nodeCtxMock.getSelf()).willReturn(ruleNode);
given(nodeCtxMock.getChainActor()).willReturn(chainActorMock);
@ -777,8 +757,6 @@ class DefaultTbContextTest {
var msg = getTbMsg();
var ruleNode = new RuleNode(RULE_NODE_ID);
ruleNode.setRuleChainId(RULE_CHAIN_ID);
ruleNode.setDebugFailures(false);
ruleNode.setDebugAllUntil(0);
given(nodeCtxMock.getSelf()).willReturn(ruleNode);
given(nodeCtxMock.getChainActor()).willReturn(chainActorMock);
@ -806,8 +784,7 @@ class DefaultTbContextTest {
var msg = getTbMsg();
var ruleNode = new RuleNode(RULE_NODE_ID);
ruleNode.setRuleChainId(RULE_CHAIN_ID);
ruleNode.setDebugFailures(false);
ruleNode.setDebugAllUntil(getUntilTime());
ruleNode.setDebugSettings(DebugSettings.until(getUntilTime()));
given(nodeCtxMock.getTenantId()).willReturn(TENANT_ID);
given(nodeCtxMock.getSelf()).willReturn(ruleNode);
given(nodeCtxMock.getChainActor()).willReturn(chainActorMock);
@ -843,8 +820,7 @@ class DefaultTbContextTest {
var msg = getTbMsgWithCallback(callbackMock);
var ruleNode = new RuleNode(RULE_NODE_ID);
ruleNode.setRuleChainId(RULE_CHAIN_ID);
ruleNode.setDebugFailures(debugFailures);
ruleNode.setDebugAllUntil(debugAllUntil);
ruleNode.setDebugSettings(new DebugSettings(debugFailures, debugAllUntil));
if (shouldPersist) {
given(nodeCtxMock.getTenantId()).willReturn(TENANT_ID);
}
@ -861,7 +837,7 @@ class DefaultTbContextTest {
// GIVEN
Mockito.clearInvocations(mainCtxMock);
ruleNode.setDebugAllUntil(0);
ruleNode.setDebugSettings(new DebugSettings(ruleNode.getDebugSettings().isDebugFailures(), 0));
// WHEN
defaultTbContext.tellNext(msg, connection);

3
application/src/test/java/org/thingsboard/server/edge/AbstractEdgeTest.java

@ -44,6 +44,7 @@ import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.alarm.AlarmSeverity;
import org.thingsboard.server.common.data.asset.Asset;
import org.thingsboard.server.common.data.asset.AssetProfile;
import org.thingsboard.server.common.data.debug.DebugSettings;
import org.thingsboard.server.common.data.device.profile.AlarmCondition;
import org.thingsboard.server.common.data.device.profile.AlarmConditionFilter;
import org.thingsboard.server.common.data.device.profile.AlarmConditionFilterKey;
@ -208,7 +209,7 @@ abstract public class AbstractEdgeTest extends AbstractControllerTest {
protected void updateRootRuleChainMetadata() throws Exception {
RuleChainId rootRuleChainId = getEdgeRootRuleChainId();
RuleChainMetaData rootRuleChainMetadata = doGet("/api/ruleChain/" + rootRuleChainId.getId().toString() + "/metadata", RuleChainMetaData.class);
rootRuleChainMetadata.getNodes().forEach(n -> n.setDebugAll(true));
rootRuleChainMetadata.getNodes().forEach(n -> n.setDebugSettings(DebugSettings.all()));
doPost("/api/ruleChain/metadata", rootRuleChainMetadata, RuleChainMetaData.class);
}

4
application/src/test/java/org/thingsboard/server/edge/RuleChainEdgeTest.java

@ -21,6 +21,7 @@ import org.junit.Test;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rule.engine.metadata.TbGetAttributesNodeConfiguration;
import org.thingsboard.rule.engine.util.TbMsgSource;
import org.thingsboard.server.common.data.debug.DebugSettings;
import org.thingsboard.server.common.data.edge.Edge;
import org.thingsboard.server.common.data.id.RuleChainId;
import org.thingsboard.server.common.data.rule.RuleChain;
@ -38,6 +39,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@ -228,7 +230,7 @@ public class RuleChainEdgeTest extends AbstractEdgeTest {
// update metadata for root rule chain
edgeImitator.expectMessageAmount(1);
metaData.getNodes().forEach(n -> n.setDebugAll(true));
metaData.getNodes().forEach(n -> n.setDebugSettings(DebugSettings.all()));
doPost("/api/ruleChain/metadata", metaData, RuleChainMetaData.class);
Assert.assertTrue(edgeImitator.waitForMessages());
ruleChainUpdateMsgOpt = edgeImitator.findMessageByType(RuleChainUpdateMsg.class);

12
application/src/test/java/org/thingsboard/server/rules/flow/AbstractRuleEngineFlowIntegrationTest.java

@ -37,6 +37,7 @@ import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.EventInfo;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.debug.DebugSettings;
import org.thingsboard.server.common.data.event.Event;
import org.thingsboard.server.common.data.kv.BaseAttributeKvEntry;
import org.thingsboard.server.common.data.kv.StringDataEntry;
@ -59,6 +60,7 @@ import org.thingsboard.server.dao.event.EventService;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import static org.mockito.Mockito.spy;
@ -142,7 +144,7 @@ public abstract class AbstractRuleEngineFlowIntegrationTest extends AbstractRule
ruleNode1.setName("Simple Rule Node 1");
ruleNode1.setType(org.thingsboard.rule.engine.metadata.TbGetAttributesNode.class.getName());
ruleNode1.setConfigurationVersion(TbGetAttributesNode.class.getAnnotation(org.thingsboard.rule.engine.api.RuleNode.class).version());
ruleNode1.setDebugAll(true);
ruleNode1.setDebugSettings(DebugSettings.all());
TbGetAttributesNodeConfiguration configuration1 = new TbGetAttributesNodeConfiguration();
configuration1.setFetchTo(TbMsgSource.METADATA);
configuration1.setServerAttributeNames(Collections.singletonList("serverAttributeKey1"));
@ -152,7 +154,7 @@ public abstract class AbstractRuleEngineFlowIntegrationTest extends AbstractRule
ruleNode2.setName("Simple Rule Node 2");
ruleNode2.setType(org.thingsboard.rule.engine.metadata.TbGetAttributesNode.class.getName());
ruleNode2.setConfigurationVersion(TbGetAttributesNode.class.getAnnotation(org.thingsboard.rule.engine.api.RuleNode.class).version());
ruleNode2.setDebugAll(true);
ruleNode2.setDebugSettings(DebugSettings.all());
TbGetAttributesNodeConfiguration configuration2 = new TbGetAttributesNodeConfiguration();
configuration2.setFetchTo(TbMsgSource.METADATA);
configuration2.setServerAttributeNames(Collections.singletonList("serverAttributeKey2"));
@ -248,7 +250,7 @@ public abstract class AbstractRuleEngineFlowIntegrationTest extends AbstractRule
ruleNode1.setName("Simple Rule Node 1");
ruleNode1.setType(org.thingsboard.rule.engine.metadata.TbGetAttributesNode.class.getName());
ruleNode1.setConfigurationVersion(TbGetAttributesNode.class.getAnnotation(org.thingsboard.rule.engine.api.RuleNode.class).version());
ruleNode1.setDebugAll(true);
ruleNode1.setDebugSettings(DebugSettings.all());
TbGetAttributesNodeConfiguration configuration1 = new TbGetAttributesNodeConfiguration();
configuration1.setFetchTo(TbMsgSource.METADATA);
configuration1.setServerAttributeNames(Collections.singletonList("serverAttributeKey1"));
@ -257,7 +259,7 @@ public abstract class AbstractRuleEngineFlowIntegrationTest extends AbstractRule
RuleNode ruleNode12 = new RuleNode();
ruleNode12.setName("Simple Rule Node 1");
ruleNode12.setType(org.thingsboard.rule.engine.flow.TbRuleChainInputNode.class.getName());
ruleNode12.setDebugAll(true);
ruleNode12.setDebugSettings(DebugSettings.all());
TbRuleChainInputNodeConfiguration configuration12 = new TbRuleChainInputNodeConfiguration();
configuration12.setRuleChainId(secondaryRuleChain.getId().getId().toString());
ruleNode12.setConfiguration(JacksonUtil.valueToTree(configuration12));
@ -282,7 +284,7 @@ public abstract class AbstractRuleEngineFlowIntegrationTest extends AbstractRule
ruleNode2.setName("Simple Rule Node 2");
ruleNode2.setType(org.thingsboard.rule.engine.metadata.TbGetAttributesNode.class.getName());
ruleNode2.setConfigurationVersion(TbGetAttributesNode.class.getAnnotation(org.thingsboard.rule.engine.api.RuleNode.class).version());
ruleNode2.setDebugAll(true);
ruleNode2.setDebugSettings(DebugSettings.all());
TbGetAttributesNodeConfiguration configuration2 = new TbGetAttributesNodeConfiguration();
configuration2.setFetchTo(TbMsgSource.METADATA);
configuration2.setServerAttributeNames(Collections.singletonList("serverAttributeKey2"));

3
application/src/test/java/org/thingsboard/server/rules/lifecycle/AbstractRuleEngineLifecycleIntegrationTest.java

@ -32,6 +32,7 @@ import org.thingsboard.server.common.data.AttributeScope;
import org.thingsboard.server.common.data.DataConstants;
import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.EventInfo;
import org.thingsboard.server.common.data.debug.DebugSettings;
import org.thingsboard.server.common.data.event.EventType;
import org.thingsboard.server.common.data.kv.BaseAttributeKvEntry;
import org.thingsboard.server.common.data.kv.StringDataEntry;
@ -97,7 +98,7 @@ public abstract class AbstractRuleEngineLifecycleIntegrationTest extends Abstrac
ruleNode.setName("Simple Rule Node");
ruleNode.setType(org.thingsboard.rule.engine.metadata.TbGetAttributesNode.class.getName());
ruleNode.setConfigurationVersion(TbGetAttributesNode.class.getAnnotation(org.thingsboard.rule.engine.api.RuleNode.class).version());
ruleNode.setDebugAll(true);
ruleNode.setDebugSettings(DebugSettings.all());
TbGetAttributesNodeConfiguration configuration = new TbGetAttributesNodeConfiguration();
configuration.setFetchTo(TbMsgSource.METADATA);
configuration.setServerAttributeNames(Collections.singletonList("serverAttributeKey"));

5
application/src/test/java/org/thingsboard/server/service/housekeeper/HousekeeperServiceTest.java

@ -38,6 +38,7 @@ import org.thingsboard.server.common.data.alarm.Alarm;
import org.thingsboard.server.common.data.alarm.AlarmSeverity;
import org.thingsboard.server.common.data.alarm.EntityAlarm;
import org.thingsboard.server.common.data.asset.Asset;
import org.thingsboard.server.common.data.debug.DebugSettings;
import org.thingsboard.server.common.data.event.EventType;
import org.thingsboard.server.common.data.event.LifecycleEvent;
import org.thingsboard.server.common.data.housekeeper.HousekeeperTask;
@ -496,7 +497,7 @@ public class HousekeeperServiceTest extends AbstractControllerTest {
ruleNode1.setName("Simple Rule Node 1");
ruleNode1.setType(org.thingsboard.rule.engine.metadata.TbGetAttributesNode.class.getName());
ruleNode1.setConfigurationVersion(TbGetAttributesNode.class.getAnnotation(org.thingsboard.rule.engine.api.RuleNode.class).version());
ruleNode1.setDebugAll(true);
ruleNode1.setDebugSettings(DebugSettings.all());
TbGetAttributesNodeConfiguration configuration1 = new TbGetAttributesNodeConfiguration();
configuration1.setServerAttributeNames(Collections.singletonList("serverAttributeKey1"));
ruleNode1.setConfiguration(JacksonUtil.valueToTree(configuration1));
@ -505,7 +506,7 @@ public class HousekeeperServiceTest extends AbstractControllerTest {
ruleNode2.setName("Simple Rule Node 2");
ruleNode2.setType(org.thingsboard.rule.engine.metadata.TbGetAttributesNode.class.getName());
ruleNode2.setConfigurationVersion(TbGetAttributesNode.class.getAnnotation(org.thingsboard.rule.engine.api.RuleNode.class).version());
ruleNode2.setDebugAll(true);
ruleNode2.setDebugSettings(DebugSettings.all());
TbGetAttributesNodeConfiguration configuration2 = new TbGetAttributesNodeConfiguration();
configuration2.setServerAttributeNames(Collections.singletonList("serverAttributeKey2"));
ruleNode2.setConfiguration(JacksonUtil.valueToTree(configuration2));

4
application/src/test/java/org/thingsboard/server/service/sync/ie/ExportImportServiceSqlTest.java

@ -471,7 +471,6 @@ public class ExportImportServiceSqlTest extends AbstractControllerTest {
RuleNode ruleNode1 = new RuleNode();
ruleNode1.setName("Generator 1");
ruleNode1.setType(TbMsgGeneratorNode.class.getName());
ruleNode1.setDebugAllUntil(System.currentTimeMillis());
TbMsgGeneratorNodeConfiguration configuration1 = new TbMsgGeneratorNodeConfiguration();
configuration1.setOriginatorType(originatorId.getEntityType());
configuration1.setOriginatorId(originatorId.getId().toString());
@ -481,7 +480,6 @@ public class ExportImportServiceSqlTest extends AbstractControllerTest {
ruleNode2.setName("Simple Rule Node 2");
ruleNode2.setType(org.thingsboard.rule.engine.metadata.TbGetAttributesNode.class.getName());
ruleNode2.setConfigurationVersion(TbGetAttributesNode.class.getAnnotation(org.thingsboard.rule.engine.api.RuleNode.class).version());
ruleNode2.setDebugAllUntil(System.currentTimeMillis());
TbGetAttributesNodeConfiguration configuration2 = new TbGetAttributesNodeConfiguration();
configuration2.setServerAttributeNames(Collections.singletonList("serverAttributeKey2"));
ruleNode2.setConfiguration(JacksonUtil.valueToTree(configuration2));
@ -510,7 +508,6 @@ public class ExportImportServiceSqlTest extends AbstractControllerTest {
ruleNode1.setName("Simple Rule Node 1");
ruleNode1.setType(org.thingsboard.rule.engine.metadata.TbGetAttributesNode.class.getName());
ruleNode1.setConfigurationVersion(TbGetAttributesNode.class.getAnnotation(org.thingsboard.rule.engine.api.RuleNode.class).version());
ruleNode1.setDebugAllUntil(System.currentTimeMillis());
TbGetAttributesNodeConfiguration configuration1 = new TbGetAttributesNodeConfiguration();
configuration1.setServerAttributeNames(Collections.singletonList("serverAttributeKey1"));
ruleNode1.setConfiguration(JacksonUtil.valueToTree(configuration1));
@ -519,7 +516,6 @@ public class ExportImportServiceSqlTest extends AbstractControllerTest {
ruleNode2.setName("Simple Rule Node 2");
ruleNode2.setType(org.thingsboard.rule.engine.metadata.TbGetAttributesNode.class.getName());
ruleNode2.setConfigurationVersion(TbGetAttributesNode.class.getAnnotation(org.thingsboard.rule.engine.api.RuleNode.class).version());
ruleNode2.setDebugAllUntil(System.currentTimeMillis());
TbGetAttributesNodeConfiguration configuration2 = new TbGetAttributesNodeConfiguration();
configuration2.setServerAttributeNames(Collections.singletonList("serverAttributeKey2"));
ruleNode2.setConfiguration(JacksonUtil.valueToTree(configuration2));

9
application/src/test/java/org/thingsboard/server/service/sync/vc/VersionControlTest.java

@ -44,6 +44,7 @@ import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.asset.Asset;
import org.thingsboard.server.common.data.asset.AssetProfile;
import org.thingsboard.server.common.data.debug.DebugSettings;
import org.thingsboard.server.common.data.device.data.DefaultDeviceTransportConfiguration;
import org.thingsboard.server.common.data.device.data.DeviceData;
import org.thingsboard.server.common.data.device.profile.DefaultDeviceProfileConfiguration;
@ -870,7 +871,7 @@ public class VersionControlTest extends AbstractControllerTest {
RuleNode ruleNode1 = new RuleNode();
ruleNode1.setName("Generator 1");
ruleNode1.setType(TbMsgGeneratorNode.class.getName());
ruleNode1.setDebugAll(true);
ruleNode1.setDebugSettings(DebugSettings.all());
TbMsgGeneratorNodeConfiguration configuration1 = new TbMsgGeneratorNodeConfiguration();
configuration1.setOriginatorType(originatorId.getEntityType());
configuration1.setOriginatorId(originatorId.getId().toString());
@ -880,7 +881,7 @@ public class VersionControlTest extends AbstractControllerTest {
ruleNode2.setName("Simple Rule Node 2");
ruleNode2.setType(org.thingsboard.rule.engine.metadata.TbGetAttributesNode.class.getName());
ruleNode2.setConfigurationVersion(TbGetAttributesNode.class.getAnnotation(org.thingsboard.rule.engine.api.RuleNode.class).version());
ruleNode2.setDebugAll(true);
ruleNode2.setDebugSettings(DebugSettings.all());
TbGetAttributesNodeConfiguration configuration2 = new TbGetAttributesNodeConfiguration();
configuration2.setServerAttributeNames(Collections.singletonList("serverAttributeKey2"));
ruleNode2.setConfiguration(JacksonUtil.valueToTree(configuration2));
@ -908,7 +909,7 @@ public class VersionControlTest extends AbstractControllerTest {
ruleNode1.setName("Simple Rule Node 1");
ruleNode1.setType(org.thingsboard.rule.engine.metadata.TbGetAttributesNode.class.getName());
ruleNode1.setConfigurationVersion(TbGetAttributesNode.class.getAnnotation(org.thingsboard.rule.engine.api.RuleNode.class).version());
ruleNode1.setDebugAll(true);
ruleNode1.setDebugSettings(DebugSettings.all());
TbGetAttributesNodeConfiguration configuration1 = new TbGetAttributesNodeConfiguration();
configuration1.setServerAttributeNames(Collections.singletonList("serverAttributeKey1"));
ruleNode1.setConfiguration(JacksonUtil.valueToTree(configuration1));
@ -917,7 +918,7 @@ public class VersionControlTest extends AbstractControllerTest {
ruleNode2.setName("Simple Rule Node 2");
ruleNode2.setType(org.thingsboard.rule.engine.metadata.TbGetAttributesNode.class.getName());
ruleNode2.setConfigurationVersion(TbGetAttributesNode.class.getAnnotation(org.thingsboard.rule.engine.api.RuleNode.class).version());
ruleNode2.setDebugAll(true);
ruleNode2.setDebugSettings(DebugSettings.all());
TbGetAttributesNodeConfiguration configuration2 = new TbGetAttributesNodeConfiguration();
configuration2.setServerAttributeNames(Collections.singletonList("serverAttributeKey2"));
ruleNode2.setConfiguration(JacksonUtil.valueToTree(configuration2));

1
common/dao-api/src/main/java/org/thingsboard/server/dao/tenant/TbTenantProfileCache.java

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.dao.tenant;
import org.thingsboard.server.common.data.SystemParams;
import org.thingsboard.server.common.data.TenantProfile;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.TenantId;

17
common/data/src/main/java/org/thingsboard/server/common/data/HasDebugMode.java → common/data/src/main/java/org/thingsboard/server/common/data/HasDebugSettings.java

@ -15,19 +15,18 @@
*/
package org.thingsboard.server.common.data;
import io.swagger.v3.oas.annotations.media.Schema;
import org.thingsboard.server.common.data.debug.DebugSettings;
public interface HasDebugMode {
public interface HasDebugSettings {
boolean isDebugFailures();
@Deprecated
boolean isDebugMode();
void setDebugFailures(boolean debugFailures);
@Deprecated
void setDebugMode(boolean debugMode);
boolean isDebugAll();
DebugSettings getDebugSettings();
void setDebugAll(boolean debugAll);
void setDebugSettings(DebugSettings debugSettings);
long getDebugAllUntil();
void setDebugAllUntil(long debugAllUntil);
}

60
common/data/src/main/java/org/thingsboard/server/common/data/debug/DebugSettings.java

@ -0,0 +1,60 @@
/**
* Copyright © 2016-2024 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.common.data.debug;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
public class DebugSettings {
private static DebugSettings DEBUG_OFF = new DebugSettings(false, 0);
private static DebugSettings DEBUG_FAILURES = new DebugSettings(true, 0);
public DebugSettings(boolean debugFailures, long debugAllUntil) {
this.debugFailures = debugFailures;
this.debugAll = false;
this.debugAllUntil = debugAllUntil;
}
@Schema(description = "Debug failures. ", example = "false")
private boolean debugFailures;
@Schema(description = "Debug All. Used as a trigger for updating debugAllUntil.", example = "false")
private boolean debugAll;
@Schema(description = "Timestamp of the end time for the processing debug events.")
private long debugAllUntil;
public static DebugSettings off() {return DebugSettings.DEBUG_OFF;}
public static DebugSettings failures() {return DebugSettings.DEBUG_FAILURES;}
public static DebugSettings until(long ts) {return new DebugSettings(false, ts);}
public static DebugSettings failuresOrUntil(long ts) {return new DebugSettings(true, ts);}
public static DebugSettings all() {
var ds = new DebugSettings();
ds.setDebugAll(true);
return ds;
}
public DebugSettings copy(long maxDebugAllUntil) {
return new DebugSettings(debugFailures, debugAll ? maxDebugAllUntil : Math.min(debugAllUntil, maxDebugAllUntil));
}
}

33
common/data/src/main/java/org/thingsboard/server/common/data/rule/RuleNode.java

@ -17,14 +17,16 @@ package org.thingsboard.server.common.data.rule;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonSetter;
import com.fasterxml.jackson.databind.JsonNode;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j;
import org.thingsboard.server.common.data.BaseDataWithAdditionalInfo;
import org.thingsboard.server.common.data.HasDebugMode;
import org.thingsboard.server.common.data.HasDebugSettings;
import org.thingsboard.server.common.data.HasName;
import org.thingsboard.server.common.data.debug.DebugSettings;
import org.thingsboard.server.common.data.id.RuleChainId;
import org.thingsboard.server.common.data.id.RuleNodeId;
import org.thingsboard.server.common.data.validation.Length;
@ -35,7 +37,7 @@ import org.thingsboard.server.common.data.validation.NoXss;
@EqualsAndHashCode(callSuper = true)
@Slf4j
@JsonIgnoreProperties(ignoreUnknown = true)
public class RuleNode extends BaseDataWithAdditionalInfo<RuleNodeId> implements HasName, HasDebugMode {
public class RuleNode extends BaseDataWithAdditionalInfo<RuleNodeId> implements HasName, HasDebugSettings {
private static final long serialVersionUID = -5656679015121235465L;
@ -48,12 +50,11 @@ public class RuleNode extends BaseDataWithAdditionalInfo<RuleNodeId> implements
@Length(fieldName = "name")
@Schema(description = "User defined name of the rule node. Used on UI and for logging. ", example = "Process sensor reading")
private String name;
@Schema(description = "Debug failures. ", example = "false")
private boolean debugFailures;
@Schema(description = "Debug All. Used as a trigger for updating debugAllUntil.", example = "false")
private boolean debugAll;
@Schema(description = "Timestamp of the end time for the processing debug events.")
private long debugAllUntil;
@Deprecated
@Schema(description = "Enable/disable debug. ", example = "false", deprecated = true)
private boolean debugMode;
@Schema(description = "Debug settings object.")
private DebugSettings debugSettings;
@Schema(description = "Enable/disable singleton mode. ", example = "false")
private boolean singletonMode;
@Schema(description = "Queue name. ", example = "Main")
@ -80,9 +81,7 @@ public class RuleNode extends BaseDataWithAdditionalInfo<RuleNodeId> implements
this.ruleChainId = ruleNode.getRuleChainId();
this.type = ruleNode.getType();
this.name = ruleNode.getName();
this.debugFailures = ruleNode.isDebugFailures();
this.debugAll = ruleNode.isDebugAll();
this.debugAllUntil = ruleNode.getDebugAllUntil();
this.debugSettings = ruleNode.getDebugSettings();
this.singletonMode = ruleNode.isSingletonMode();
this.setConfiguration(ruleNode.getConfiguration());
this.externalId = ruleNode.getExternalId();
@ -121,4 +120,16 @@ public class RuleNode extends BaseDataWithAdditionalInfo<RuleNodeId> implements
public JsonNode getAdditionalInfo() {
return super.getAdditionalInfo();
}
// Getter is ignored for serialization
@JsonIgnore
public boolean isDebugMode() {
return debugMode;
}
// Setter is annotated for deserialization
@JsonSetter
public void setDebugMode(boolean debugMode) {
this.debugMode = debugMode;
}
}

7
common/data/src/main/java/org/thingsboard/server/common/data/tenant/profile/DefaultTenantProfileConfiguration.java

@ -36,8 +36,6 @@ public class DefaultTenantProfileConfiguration implements TenantProfileConfigura
@Serial
private static final long serialVersionUID = -7134932690332578595L;
private static final int DEBUG_MODE_DEFAULT_DURATION_MINUTES = 15;
private long maxDevices;
private long maxAssets;
private long maxCustomers;
@ -206,8 +204,7 @@ public class DefaultTenantProfileConfiguration implements TenantProfileConfigura
}
@Override
public int getMaxDebugModeDurationMinutes(int systemMaxDebugModeDurationMinutes) {
return maxDebugModeDurationMinutes > 0 ? maxDebugModeDurationMinutes : systemMaxDebugModeDurationMinutes > 0 ?
systemMaxDebugModeDurationMinutes : DEBUG_MODE_DEFAULT_DURATION_MINUTES;
public int getMaxDebugModeDurationMinutes() {
return maxDebugModeDurationMinutes;
}
}

2
common/data/src/main/java/org/thingsboard/server/common/data/tenant/profile/TenantProfileConfiguration.java

@ -52,6 +52,6 @@ public interface TenantProfileConfiguration extends Serializable {
int getMaxRuleNodeExecsPerMessage();
@JsonIgnore
int getMaxDebugModeDurationMinutes(int systemMaxDebugModeDurationMinutes);
int getMaxDebugModeDurationMinutes();
}

3
common/edge-api/src/main/proto/edge.proto

@ -173,8 +173,7 @@ message RuleNodeProto {
string additionalInfo = 7;
bool singletonMode = 8;
int32 configurationVersion = 9;
bool debugFailures = 10;
int64 debugAllUntil = 11;
string debugSettings = 10;
}
message NodeConnectionInfoProto {

38
common/util/src/main/java/org/thingsboard/common/util/DebugModeUtil.java

@ -15,29 +15,47 @@
*/
package org.thingsboard.common.util;
import org.thingsboard.server.common.data.HasDebugMode;
import org.thingsboard.server.common.data.HasDebugSettings;
import org.thingsboard.server.common.data.debug.DebugSettings;
import org.thingsboard.server.common.data.msg.TbNodeConnectionType;
import java.util.Set;
public final class DebugModeUtil {
private static final int DEBUG_MODE_DEFAULT_DURATION_MINUTES = 15;
private DebugModeUtil() {
}
public static boolean isDebugAllAvailable(HasDebugMode debugMode) {
return debugMode.getDebugAllUntil() > System.currentTimeMillis();
public static int getMaxDebugAllDuration(int tenantProfileDuration, int systemDefaultDuration) {
if (tenantProfileDuration > 0) {
return tenantProfileDuration;
} else {
return systemDefaultDuration > 0 ? systemDefaultDuration : DEBUG_MODE_DEFAULT_DURATION_MINUTES;
}
}
public static boolean isDebugAvailable(HasDebugMode debugMode, String nodeConnection) {
return isDebugAllAvailable(debugMode) || debugMode.isDebugFailures() && TbNodeConnectionType.FAILURE.equals(nodeConnection);
public static boolean isDebugAllAvailable(HasDebugSettings debugSettingsAware) {
var debugSettings = debugSettingsAware.getDebugSettings();
return debugSettings != null && debugSettings.getDebugAllUntil() > System.currentTimeMillis();
}
public static boolean isDebugFailuresAvailable(HasDebugMode debugMode, Set<String> nodeConnections) {
return isDebugFailuresAvailable(debugMode) && nodeConnections.contains(TbNodeConnectionType.FAILURE);
public static boolean isDebugAvailable(HasDebugSettings debugSettingsAware, String nodeConnection) {
if (isDebugAllAvailable(debugSettingsAware)) {
return true;
} else {
var debugSettings = debugSettingsAware.getDebugSettings();
return debugSettings != null && debugSettings.isDebugFailures() && TbNodeConnectionType.FAILURE.equals(nodeConnection);
}
}
private static boolean isDebugFailuresAvailable(HasDebugMode debugMode) {
return debugMode.isDebugFailures() || isDebugAllAvailable(debugMode);
public static boolean isDebugFailuresAvailable(HasDebugSettings debugSettingsAware, Set<String> nodeConnections) {
if (isDebugAllAvailable(debugSettingsAware)) {
return true;
} else {
var debugSettings = debugSettingsAware.getDebugSettings();
return debugSettings != null && nodeConnections != null && debugSettings.isDebugFailures() && nodeConnections.contains(TbNodeConnectionType.FAILURE);
}
}
}

26
dao/src/main/java/org/thingsboard/server/dao/entity/AbstractEntityService.java

@ -21,9 +21,11 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.annotation.Lazy;
import org.thingsboard.common.util.DebugModeUtil;
import org.thingsboard.server.common.data.EntityView;
import org.thingsboard.server.common.data.HasDebugMode;
import org.thingsboard.server.common.data.HasDebugSettings;
import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.debug.DebugSettings;
import org.thingsboard.server.common.data.id.EdgeId;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.TenantId;
@ -76,8 +78,8 @@ public abstract class AbstractEntityService {
@Lazy
private TbTenantProfileCache tbTenantProfileCache;
@Value("${debug_mode.max_duration:15}")
private int maxDebugModeDurationMinutes;
@Value("${debug.settings.default_duration:15}")
private int defaultDebugDurationMinutes;
protected void createRelation(TenantId tenantId, EntityRelation relation) {
log.debug("Creating relation: {}", relation);
@ -136,14 +138,16 @@ public abstract class AbstractEntityService {
}
}
protected void setDebugAllUntil(TenantId tenantId, HasDebugMode entity, long now) {
int debugDuration = tbTenantProfileCache.get(tenantId).getDefaultProfileConfiguration().getMaxDebugModeDurationMinutes(maxDebugModeDurationMinutes);
long debugUntil = now + TimeUnit.MINUTES.toMillis(debugDuration);
if (entity.isDebugAll()) {
entity.setDebugAllUntil(debugUntil);
} else if (entity.getDebugAllUntil() > debugUntil) {
throw new DataValidationException("Unable to update 'debugAllUntil' property. To reset the debug duration, please modify the 'debugAll' property instead.");
protected void updateDebugSettings(TenantId tenantId, HasDebugSettings entity, long now) {
if (entity.getDebugSettings() != null) {
entity.setDebugSettings(entity.getDebugSettings().copy(getMaxDebugAllUntil(tenantId, now)));
} else if (entity.isDebugMode()) {
entity.setDebugSettings(DebugSettings.failuresOrUntil(getMaxDebugAllUntil(tenantId, now)));
entity.setDebugMode(false);
}
}
private long getMaxDebugAllUntil(TenantId tenantId, long now) {
return now + TimeUnit.MINUTES.toMillis(DebugModeUtil.getMaxDebugAllDuration(tbTenantProfileCache.get(tenantId).getDefaultProfileConfiguration().getMaxDebugModeDurationMinutes(), defaultDebugDurationMinutes));
}
}

3
dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java

@ -398,8 +398,7 @@ public class ModelConstants {
public static final String EVENT_MESSAGE_COLUMN_NAME = "e_message";
public static final String DEBUG_MODE = "debug_mode";
public static final String DEBUG_FAILURES = "debug_failures";
public static final String DEBUG__ALL_UNTIL = "debug_all_until";
public static final String DEBUG_SETTINGS = "debug_settings";
public static final String SINGLETON_MODE = "singleton_mode";
public static final String QUEUE_NAME = "queue_name";

16
dao/src/main/java/org/thingsboard/server/dao/model/sql/RuleNodeEntity.java

@ -22,6 +22,9 @@ import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.debug.DebugSettings;
import org.thingsboard.server.common.data.id.RuleChainId;
import org.thingsboard.server.common.data.id.RuleNodeId;
import org.thingsboard.server.common.data.rule.RuleNode;
@ -58,11 +61,8 @@ public class RuleNodeEntity extends BaseSqlEntity<RuleNode> {
@Column(name = ModelConstants.ADDITIONAL_INFO_PROPERTY)
private JsonNode additionalInfo;
@Column(name = ModelConstants.DEBUG_FAILURES)
private boolean debugFailures;
@Column(name = ModelConstants.DEBUG__ALL_UNTIL)
private long debugAllUntil;
@Column(name = ModelConstants.DEBUG_SETTINGS)
private String debugSettings;
@Column(name = ModelConstants.SINGLETON_MODE)
private boolean singletonMode;
@ -86,8 +86,7 @@ public class RuleNodeEntity extends BaseSqlEntity<RuleNode> {
}
this.type = ruleNode.getType();
this.name = ruleNode.getName();
this.debugFailures = ruleNode.isDebugFailures();
this.debugAllUntil = ruleNode.getDebugAllUntil();
this.debugSettings = JacksonUtil.toString(ruleNode.getDebugSettings());
this.singletonMode = ruleNode.isSingletonMode();
this.queueName = ruleNode.getQueueName();
this.configurationVersion = ruleNode.getConfigurationVersion();
@ -107,8 +106,7 @@ public class RuleNodeEntity extends BaseSqlEntity<RuleNode> {
}
ruleNode.setType(type);
ruleNode.setName(name);
ruleNode.setDebugFailures(debugFailures);
ruleNode.setDebugAllUntil(debugAllUntil);
ruleNode.setDebugSettings(JacksonUtil.fromString(debugSettings, DebugSettings.class));
ruleNode.setSingletonMode(singletonMode);
ruleNode.setQueueName(queueName);
ruleNode.setConfigurationVersion(configurationVersion);

2
dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java

@ -219,7 +219,7 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC
node.setRuleChainId(ruleChainId);
node = ruleNodeUpdater.apply(node);
setDebugAllUntil(tenantId, node, now);
updateDebugSettings(tenantId, node, now);
RuleChainDataValidator.validateRuleNode(node);
RuleNode savedNode = ruleNodeDao.save(tenantId, node);

3
dao/src/main/resources/sql/schema-entities.sql

@ -181,8 +181,7 @@ CREATE TABLE IF NOT EXISTS rule_node (
configuration varchar(10000000),
type varchar(255),
name varchar(255),
debug_failures boolean,
debug_all_until bigint NOT NULL,
debug_settings varchar(1024),
singleton_mode boolean,
queue_name varchar(255),
external_id uuid

36
monitoring/src/main/resources/root_rule_chain.json

@ -20,8 +20,6 @@
},
"type": "org.thingsboard.rule.engine.telemetry.TbMsgTimeseriesNode",
"name": "Save Timeseries",
"debugFailures": false,
"debugAll": true,
"singletonMode": false,
"configurationVersion": 0,
"configuration": {
@ -36,8 +34,6 @@
},
"type": "org.thingsboard.rule.engine.telemetry.TbMsgAttributesNode",
"name": "Save Attributes",
"debugFailures": false,
"debugAll": false,
"singletonMode": false,
"configurationVersion": 1,
"configuration": {
@ -55,8 +51,6 @@
},
"type": "org.thingsboard.rule.engine.filter.TbMsgTypeSwitchNode",
"name": "Message Type Switch",
"debugFailures": false,
"debugAll": false,
"singletonMode": false,
"configurationVersion": 0,
"configuration": {
@ -71,8 +65,6 @@
},
"type": "org.thingsboard.rule.engine.action.TbLogNode",
"name": "Log RPC from Device",
"debugFailures": false,
"debugAll": false,
"singletonMode": false,
"configurationVersion": 0,
"configuration": {
@ -89,8 +81,6 @@
},
"type": "org.thingsboard.rule.engine.action.TbLogNode",
"name": "Log Other",
"debugFailures": false,
"debugAll": false,
"singletonMode": false,
"configurationVersion": 0,
"configuration": {
@ -107,8 +97,6 @@
},
"type": "org.thingsboard.rule.engine.rpc.TbSendRPCRequestNode",
"name": "RPC Call Request",
"debugFailures": false,
"debugAll": false,
"singletonMode": false,
"configurationVersion": 0,
"configuration": {
@ -123,8 +111,6 @@
},
"type": "org.thingsboard.rule.engine.filter.TbOriginatorTypeFilterNode",
"name": "Is Entity Group",
"debugFailures": false,
"debugAll": false,
"singletonMode": false,
"configurationVersion": 0,
"configuration": {
@ -141,8 +127,6 @@
},
"type": "org.thingsboard.rule.engine.filter.TbMsgTypeFilterNode",
"name": "Post attributes or RPC request",
"debugFailures": false,
"debugAll": false,
"singletonMode": false,
"configurationVersion": 0,
"configuration": {
@ -160,8 +144,6 @@
},
"type": "org.thingsboard.rule.engine.transform.TbDuplicateMsgToGroupNode",
"name": "Duplicate To Group Entities",
"debugFailures": false,
"debugAll": false,
"singletonMode": false,
"configurationVersion": 0,
"configuration": {
@ -178,8 +160,6 @@
},
"type": "org.thingsboard.rule.engine.profile.TbDeviceProfileNode",
"name": "Device Profile Node",
"debugFailures": false,
"debugAll": true,
"singletonMode": false,
"configurationVersion": 0,
"configuration": {
@ -196,8 +176,6 @@
},
"type": "org.thingsboard.rule.engine.filter.TbJsFilterNode",
"name": "Test JS script",
"debugFailures": false,
"debugAll": false,
"singletonMode": false,
"configurationVersion": 0,
"configuration": {
@ -215,8 +193,6 @@
},
"type": "org.thingsboard.rule.engine.filter.TbJsFilterNode",
"name": "Test TBEL script",
"debugFailures": false,
"debugAll": false,
"singletonMode": false,
"configurationVersion": 0,
"configuration": {
@ -234,8 +210,6 @@
},
"type": "org.thingsboard.rule.engine.transform.TbTransformMsgNode",
"name": "Add arrival timestamp",
"debugFailures": false,
"debugAll": false,
"singletonMode": false,
"configurationVersion": 0,
"configuration": {
@ -253,8 +227,6 @@
},
"type": "org.thingsboard.rule.engine.transform.TbTransformMsgNode",
"name": "Calculate additional latencies",
"debugFailures": false,
"debugAll": true,
"singletonMode": false,
"configurationVersion": 0,
"configuration": {
@ -272,8 +244,6 @@
},
"type": "org.thingsboard.rule.engine.transform.TbChangeOriginatorNode",
"name": "To latencies asset",
"debugFailures": false,
"debugAll": false,
"singletonMode": false,
"configurationVersion": 0,
"configuration": {
@ -302,8 +272,6 @@
},
"type": "org.thingsboard.rule.engine.telemetry.TbMsgTimeseriesNode",
"name": "Save Timeseries",
"debugFailures": false,
"debugAll": true,
"singletonMode": false,
"configurationVersion": 0,
"configuration": {
@ -319,8 +287,6 @@
},
"type": "org.thingsboard.rule.engine.filter.TbCheckMessageNode",
"name": "Has testData",
"debugFailures": false,
"debugAll": false,
"singletonMode": false,
"configurationVersion": 0,
"configuration": {
@ -340,8 +306,6 @@
},
"type": "org.thingsboard.rule.engine.telemetry.TbMsgTimeseriesNode",
"name": "Save Timeseries with TTL",
"debugFailures": false,
"debugAll": true,
"singletonMode": false,
"configurationVersion": 0,
"configuration": {

6
msa/black-box-tests/src/test/resources/MqttRuleNodeTestMetadata.json

@ -9,8 +9,6 @@
},
"type": "org.thingsboard.rule.engine.mqtt.TbMqttNode",
"name": "test mqtt",
"debugFailures": false,
"debugAll": true,
"singletonMode": true,
"queueName": "HighPriority",
"configurationVersion": 0,
@ -37,8 +35,6 @@
},
"type": "org.thingsboard.rule.engine.telemetry.TbMsgTimeseriesNode",
"name": "save timeseries",
"debugFailures": false,
"debugAll": true,
"singletonMode": false,
"configurationVersion": 0,
"configuration": {
@ -56,8 +52,6 @@
},
"type": "org.thingsboard.rule.engine.filter.TbMsgTypeSwitchNode",
"name": "switch",
"debugFailures": false,
"debugAll": false,
"singletonMode": false,
"configurationVersion": 0,
"configuration": {

6
msa/black-box-tests/src/test/resources/RpcResponseRuleChainMetadata.json

@ -8,8 +8,6 @@
},
"type": "org.thingsboard.rule.engine.filter.TbMsgTypeSwitchNode",
"name": "msgTypeSwitch",
"debugFailures": false,
"debugAll": true,
"configuration": {
"version": 0
}
@ -21,8 +19,6 @@
},
"type": "org.thingsboard.rule.engine.transform.TbTransformMsgNode",
"name": "formResponse",
"debugFailures": false,
"debugAll": true,
"configuration": {
"jsScript": "if (msg.method == \"getResponse\") {\n return {msg: {\"response\": \"requestReceived\"}, metadata: metadata, msgType: msgType};\n}\n\nreturn {msg: msg, metadata: metadata, msgType: msgType};"
}
@ -34,8 +30,6 @@
},
"type": "org.thingsboard.rule.engine.rpc.TbSendRPCReplyNode",
"name": "rpcReply",
"debugFailures": false,
"debugAll": true,
"configuration": {
"requestIdMetaDataAttribute": "requestId"
}

Loading…
Cancel
Save