Browse Source

Refactor: add guard for edge case in upgrade script

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

Loading…
Cancel
Save