Browse Source

Refactor: add guard for edge case in upgrade script

pull/8661/head
Dmytro Skarzhynets 3 years ago
parent
commit
5d493ca014
  1. 108
      application/src/main/java/org/thingsboard/server/service/install/update/DefaultDataUpdateService.java

108
application/src/main/java/org/thingsboard/server/service/install/update/DefaultDataUpdateService.java

@ -33,9 +33,9 @@ import org.thingsboard.rule.engine.metadata.TbFetchDeviceCredentialsNode;
import org.thingsboard.rule.engine.metadata.TbGetAttributesNode;
import org.thingsboard.rule.engine.metadata.TbGetCustomerAttributeNode;
import org.thingsboard.rule.engine.metadata.TbGetCustomerDetailsNode;
import org.thingsboard.rule.engine.metadata.TbGetRelatedDeviceAttrNode;
import org.thingsboard.rule.engine.metadata.TbGetOriginatorFieldsNode;
import org.thingsboard.rule.engine.metadata.TbGetRelatedAttributeNode;
import org.thingsboard.rule.engine.metadata.TbGetRelatedDeviceAttrNode;
import org.thingsboard.rule.engine.metadata.TbGetTenantAttributeNode;
import org.thingsboard.rule.engine.metadata.TbGetTenantDetailsNode;
import org.thingsboard.rule.engine.profile.TbDeviceProfileNode;
@ -228,19 +228,21 @@ public class DefaultDataUpdateService implements DataUpdateService {
private void updateEnrichmentRuleNodes() {
try {
var ruleNodeTypesToUpdate = List.of(
var fetchToDataNodes = List.of(TbGetAttributesNode.class.getName(), TbGetRelatedDeviceAttrNode.class.getName());
var addToMetadataNodes = List.of(TbGetCustomerDetailsNode.class.getName(), TbGetTenantDetailsNode.class.getName());
var fetchToMetadataNodes = List.of(TbFetchDeviceCredentialsNode.class.getName());
var hardCodeMetadataNodes = List.of(
TbGetOriginatorFieldsNode.class.getName(),
TbFetchDeviceCredentialsNode.class.getName(),
TbGetAttributesNode.class.getName(),
TbGetRelatedDeviceAttrNode.class.getName(),
TbGetRelatedAttributeNode.class.getName(),
TbGetTenantAttributeNode.class.getName(),
TbGetCustomerAttributeNode.class.getName(),
TbGetCustomerDetailsNode.class.getName(),
TbGetTenantDetailsNode.class.getName()
TbGetCustomerAttributeNode.class.getName()
);
var allNodesToUpdate = new ArrayList<>(hardCodeMetadataNodes);
allNodesToUpdate.addAll(fetchToDataNodes);
allNodesToUpdate.addAll(addToMetadataNodes);
allNodesToUpdate.addAll(fetchToMetadataNodes);
var ruleChainIdToTenantId = new HashMap<RuleChainId, TenantId>();
ruleNodeTypesToUpdate.forEach(ruleNodeType -> {
allNodesToUpdate.forEach(ruleNodeType -> {
var ruleNodes = new PageDataIterable<>(
pageLink -> ruleChainService.findAllRuleNodesByType(ruleNodeType, pageLink), 1024
);
@ -258,52 +260,80 @@ public class DefaultDataUpdateService implements DataUpdateService {
}
var configObjectNode = (ObjectNode) configuration;
var fetchTo = FetchTo.METADATA;
if (configObjectNode.has("fetchToMetadata")) {
var fetchToMetadata = configObjectNode.get("fetchToMetadata").asText();
if ("true".equals(fetchToMetadata)) {
fetchTo = FetchTo.METADATA;
} else if ("false".equals(fetchToMetadata)) {
fetchTo = FetchTo.DATA;
if (fetchToDataNodes.contains(ruleNodeType)) {
configObjectNode.remove("fetchToMetadata");
configObjectNode.remove("addToMetadata");
if (configObjectNode.has("fetchToData")) {
var fetchToData = configObjectNode.get("fetchToData").asText();
if ("true".equals(fetchToData)) {
fetchTo = FetchTo.DATA;
} else if ("false".equals(fetchToData)) {
fetchTo = FetchTo.METADATA;
} else {
log.error("Failed to updated rule node: [{}] with id: [{}] " +
"Reason: fetchToData property has unexpected value: {} Allowed values: true or false!",
ruleNodeType, ruleNode.getId(), fetchToData);
continue;
}
configObjectNode.remove("fetchToData");
} else {
log.error("Failed to updated rule node: [{}] with id: [{}] " +
"Reason: fetchToMetadata property has unexpected value: {} Allowed values: true or false!",
ruleNodeType, ruleNode.getId(), fetchToMetadata);
"Reason: fetchToData property is not present!", ruleNodeType, ruleNode.getId());
continue;
}
configObjectNode.remove("fetchToMetadata");
}
if (configObjectNode.has("fetchToData")) {
var fetchToData = configObjectNode.get("fetchToData").asText();
if ("true".equals(fetchToData)) {
fetchTo = FetchTo.DATA;
} else if ("false".equals(fetchToData)) {
fetchTo = FetchTo.METADATA;
} else if (fetchToMetadataNodes.contains(ruleNodeType)) {
configObjectNode.remove("fetchToData");
configObjectNode.remove("addToMetadata");
if (configObjectNode.has("fetchToMetadata")) {
var fetchToMetadata = configObjectNode.get("fetchToMetadata").asText();
if ("true".equals(fetchToMetadata)) {
fetchTo = FetchTo.METADATA;
} else if ("false".equals(fetchToMetadata)) {
fetchTo = FetchTo.DATA;
} else {
log.error("Failed to updated rule node: [{}] with id: [{}] " +
"Reason: fetchToMetadata property has unexpected value: {} Allowed values: true or false!",
ruleNodeType, ruleNode.getId(), fetchToMetadata);
continue;
}
configObjectNode.remove("fetchToMetadata");
} else {
log.error("Failed to updated rule node: [{}] with id: [{}] " +
"Reason: fetchToData property has unexpected value: {} Allowed values: true or false!",
ruleNodeType, ruleNode.getId(), fetchToData);
"Reason: fetchToMetadata property is not present!", ruleNodeType, ruleNode.getId());
continue;
}
} else if (addToMetadataNodes.contains(ruleNodeType)) {
configObjectNode.remove("fetchToData");
}
if (configObjectNode.has("addToMetadata")) {
var addToMetadata = configObjectNode.get("addToMetadata").asText();
if ("true".equals(addToMetadata)) {
fetchTo = FetchTo.METADATA;
} else if ("false".equals(addToMetadata)) {
fetchTo = FetchTo.DATA;
configObjectNode.remove("fetchToMetadata");
if (configObjectNode.has("addToMetadata")) {
var addToMetadata = configObjectNode.get("addToMetadata").asText();
if ("true".equals(addToMetadata)) {
fetchTo = FetchTo.METADATA;
} else if ("false".equals(addToMetadata)) {
fetchTo = FetchTo.DATA;
} else {
log.error("Failed to updated rule node: [{}] with id: [{}] " +
"Reason: addToMetadata property has unexpected value: {} Allowed values: true or false!",
ruleNodeType, ruleNode.getId(), addToMetadata);
continue;
}
configObjectNode.remove("addToMetadata");
} else {
log.error("Failed to updated rule node: [{}] with id: [{}] " +
"Reason: addToMetadata property has unexpected value: {} Allowed values: true or false!",
ruleNodeType, ruleNode.getId(), addToMetadata);
"Reason: addToMetadata property is not present!", ruleNodeType, ruleNode.getId());
continue;
}
configObjectNode.remove("addToMetadata");
} else {
log.error("Failed to updated rule node: [{}] with id: [{}] " +
"Reason: Unexpected rule node type!", ruleNodeType, ruleNode.getId());
continue;
}
configObjectNode.put("fetchTo", fetchTo.name());
ruleNode.setConfiguration(configObjectNode);
RuleChainId ruleChainId = ruleNode.getRuleChainId();
TenantId tenantId = ruleChainIdToTenantId.computeIfAbsent(ruleChainId,
var ruleChainId = ruleNode.getRuleChainId();
var tenantId = ruleChainIdToTenantId.computeIfAbsent(ruleChainId,
id -> {
RuleChain ruleChain = ruleChainService.findRuleChainById(TenantId.SYS_TENANT_ID, id);
if (ruleChain == null) {

Loading…
Cancel
Save