From 81f1091a4fd7d6a8405664009f61d381055fc71e Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Wed, 23 Dec 2020 12:28:47 +0200 Subject: [PATCH 1/4] Sync should be send only once or by force button --- .../thingsboard/server/service/edge/rpc/EdgeGrpcSession.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java index fe44d51d2f..a3206817a0 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java @@ -160,10 +160,11 @@ public final class EdgeGrpcSession implements Closeable { .build()); if (ConnectResponseCode.ACCEPTED != responseMsg.getResponseCode()) { outputStream.onError(new RuntimeException(responseMsg.getErrorMsg())); + } else { + connected = true; } } - if (!connected && requestMsg.getMsgType().equals(RequestMsgType.SYNC_REQUEST_RPC_MESSAGE)) { - connected = true; + if (connected && requestMsg.getMsgType().equals(RequestMsgType.SYNC_REQUEST_RPC_MESSAGE)) { ctx.getSyncEdgeService().sync(edge); } if (connected) { From df11b383c1625ce65870b82178676931a3548f80 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Wed, 23 Dec 2020 19:12:05 +0200 Subject: [PATCH 2/4] Naming conventions update --- .../server/controller/EdgeController.java | 10 ++--- .../controller/RuleChainController.java | 24 +++++------ .../update/DefaultDataUpdateService.java | 2 +- .../server/dao/rule/RuleChainService.java | 10 ++--- .../data/relation/RelationTypeGroup.java | 2 +- .../server/dao/edge/EdgeServiceImpl.java | 2 +- .../server/dao/rule/BaseRuleChainService.java | 42 +++++++++---------- .../dao/rule/CassandraRuleChainDao.java | 7 ++-- .../server/dao/rule/RuleChainDao.java | 4 +- .../server/dao/sql/rule/JpaRuleChainDao.java | 9 ++-- .../dao/service/BaseRuleChainServiceTest.java | 24 +++++------ .../thingsboard/rest/client/RestClient.java | 16 +++---- ui/src/app/api/rule-chain.service.js | 24 +++++------ ui/src/app/rulechain/rulechains.controller.js | 18 ++++---- ui/src/app/rulechain/rulechains.tpl.html | 2 +- 15 files changed, 98 insertions(+), 98 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/controller/EdgeController.java b/application/src/main/java/org/thingsboard/server/controller/EdgeController.java index 45c3e51b9d..6fc29a8976 100644 --- a/application/src/main/java/org/thingsboard/server/controller/EdgeController.java +++ b/application/src/main/java/org/thingsboard/server/controller/EdgeController.java @@ -92,10 +92,10 @@ public class EdgeController extends BaseController { edge.setTenantId(tenantId); boolean created = edge.getId() == null; - RuleChain defaultRootEdgeRuleChain = null; + RuleChain edgeTemplateRootRuleChain = null; if (created) { - defaultRootEdgeRuleChain = ruleChainService.getDefaultRootEdgeRuleChain(tenantId); - if (defaultRootEdgeRuleChain == null) { + edgeTemplateRootRuleChain = ruleChainService.getEdgeTemplateRootRuleChain(tenantId); + if (edgeTemplateRootRuleChain == null) { throw new DataValidationException("Root edge rule chain is not available!"); } } @@ -108,8 +108,8 @@ public class EdgeController extends BaseController { Edge savedEdge = checkNotNull(edgeService.saveEdge(edge)); if (created) { - ruleChainService.assignRuleChainToEdge(tenantId, defaultRootEdgeRuleChain.getId(), savedEdge.getId()); - edgeNotificationService.setEdgeRootRuleChain(tenantId, savedEdge, defaultRootEdgeRuleChain.getId()); + ruleChainService.assignRuleChainToEdge(tenantId, edgeTemplateRootRuleChain.getId(), savedEdge.getId()); + edgeNotificationService.setEdgeRootRuleChain(tenantId, savedEdge, edgeTemplateRootRuleChain.getId()); edgeService.assignDefaultRuleChainsToEdge(tenantId, savedEdge.getId()); } diff --git a/application/src/main/java/org/thingsboard/server/controller/RuleChainController.java b/application/src/main/java/org/thingsboard/server/controller/RuleChainController.java index 514498ac0e..ea8b7c2ac5 100644 --- a/application/src/main/java/org/thingsboard/server/controller/RuleChainController.java +++ b/application/src/main/java/org/thingsboard/server/controller/RuleChainController.java @@ -495,14 +495,14 @@ public class RuleChainController extends BaseController { } @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')") - @RequestMapping(value = "/ruleChain/{ruleChainId}/defaultRootEdge", method = RequestMethod.POST) + @RequestMapping(value = "/ruleChain/{ruleChainId}/edgeTemplateRoot", method = RequestMethod.POST) @ResponseBody - public RuleChain setDefaultRootEdgeRuleChain(@PathVariable(RULE_CHAIN_ID) String strRuleChainId) throws ThingsboardException { + public RuleChain setEdgeTemplateRootRuleChain(@PathVariable(RULE_CHAIN_ID) String strRuleChainId) throws ThingsboardException { checkParameter(RULE_CHAIN_ID, strRuleChainId); try { RuleChainId ruleChainId = new RuleChainId(toUUID(strRuleChainId)); RuleChain ruleChain = checkRuleChain(ruleChainId, Operation.WRITE); - ruleChainService.setDefaultRootEdgeRuleChain(getTenantId(), ruleChainId); + ruleChainService.setEdgeTemplateRootRuleChain(getTenantId(), ruleChainId); return ruleChain; } catch (Exception e) { logEntityAction(emptyId(EntityType.RULE_CHAIN), @@ -514,14 +514,14 @@ public class RuleChainController extends BaseController { } @PreAuthorize("hasAuthority('TENANT_ADMIN')") - @RequestMapping(value = "/ruleChain/{ruleChainId}/defaultEdge", method = RequestMethod.POST) + @RequestMapping(value = "/ruleChain/{ruleChainId}/autoAssignToEdge", method = RequestMethod.POST) @ResponseBody - public RuleChain addDefaultEdgeRuleChain(@PathVariable(RULE_CHAIN_ID) String strRuleChainId) throws ThingsboardException { + public RuleChain setAutoAssignToEdgeRuleChain(@PathVariable(RULE_CHAIN_ID) String strRuleChainId) throws ThingsboardException { checkParameter(RULE_CHAIN_ID, strRuleChainId); try { RuleChainId ruleChainId = new RuleChainId(toUUID(strRuleChainId)); RuleChain ruleChain = checkRuleChain(ruleChainId, Operation.WRITE); - ruleChainService.addDefaultEdgeRuleChain(getTenantId(), ruleChainId); + ruleChainService.setAutoAssignToEdgeRuleChain(getTenantId(), ruleChainId); return ruleChain; } catch (Exception e) { logEntityAction(emptyId(EntityType.RULE_CHAIN), @@ -533,14 +533,14 @@ public class RuleChainController extends BaseController { } @PreAuthorize("hasAuthority('TENANT_ADMIN')") - @RequestMapping(value = "/ruleChain/{ruleChainId}/defaultEdge", method = RequestMethod.DELETE) + @RequestMapping(value = "/ruleChain/{ruleChainId}/autoAssignToEdge", method = RequestMethod.DELETE) @ResponseBody - public RuleChain removeDefaultEdgeRuleChain(@PathVariable(RULE_CHAIN_ID) String strRuleChainId) throws ThingsboardException { + public RuleChain unsetAutoAssignToEdgeRuleChain(@PathVariable(RULE_CHAIN_ID) String strRuleChainId) throws ThingsboardException { checkParameter(RULE_CHAIN_ID, strRuleChainId); try { RuleChainId ruleChainId = new RuleChainId(toUUID(strRuleChainId)); RuleChain ruleChain = checkRuleChain(ruleChainId, Operation.WRITE); - ruleChainService.removeDefaultEdgeRuleChain(getTenantId(), ruleChainId); + ruleChainService.unsetAutoAssignToEdgeRuleChain(getTenantId(), ruleChainId); return ruleChain; } catch (Exception e) { logEntityAction(emptyId(EntityType.RULE_CHAIN), @@ -552,12 +552,12 @@ public class RuleChainController extends BaseController { } @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')") - @RequestMapping(value = "/ruleChain/defaultEdgeRuleChains", method = RequestMethod.GET) + @RequestMapping(value = "/ruleChain/autoAssignToEdgeRuleChains", method = RequestMethod.GET) @ResponseBody - public List getDefaultEdgeRuleChains() throws ThingsboardException { + public List getAutoAssignToEdgeRuleChains() throws ThingsboardException { try { TenantId tenantId = getCurrentUser().getTenantId(); - return checkNotNull(ruleChainService.findDefaultEdgeRuleChainsByTenantId(tenantId)).get(); + return checkNotNull(ruleChainService.findAutoAssignToEdgeRuleChainsByTenantId(tenantId)).get(); } catch (Exception e) { throw handleException(e); } diff --git a/application/src/main/java/org/thingsboard/server/service/install/update/DefaultDataUpdateService.java b/application/src/main/java/org/thingsboard/server/service/install/update/DefaultDataUpdateService.java index 77b356797c..981e83fbcd 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/update/DefaultDataUpdateService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/update/DefaultDataUpdateService.java @@ -89,7 +89,7 @@ public class DefaultDataUpdateService implements DataUpdateService { @Override protected void updateEntity(Tenant tenant) { try { - RuleChain defaultEdgeRuleChain = ruleChainService.getDefaultRootEdgeRuleChain(tenant.getId()); + RuleChain defaultEdgeRuleChain = ruleChainService.getEdgeTemplateRootRuleChain(tenant.getId()); if (defaultEdgeRuleChain == null) { installScripts.createDefaultEdgeRuleChains(tenant.getId()); } diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/rule/RuleChainService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/rule/RuleChainService.java index 6fd168c915..5abfa70bee 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/rule/RuleChainService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/rule/RuleChainService.java @@ -73,14 +73,14 @@ public interface RuleChainService { ListenableFuture> findRuleChainsByTenantIdAndEdgeId(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink); - RuleChain getDefaultRootEdgeRuleChain(TenantId tenantId); + RuleChain getEdgeTemplateRootRuleChain(TenantId tenantId); - boolean setDefaultRootEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId); + boolean setEdgeTemplateRootRuleChain(TenantId tenantId, RuleChainId ruleChainId); - boolean addDefaultEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId); + boolean setAutoAssignToEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId); - boolean removeDefaultEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId); + boolean unsetAutoAssignToEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId); - ListenableFuture> findDefaultEdgeRuleChainsByTenantId(TenantId tenantId); + ListenableFuture> findAutoAssignToEdgeRuleChainsByTenantId(TenantId tenantId); } diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/relation/RelationTypeGroup.java b/common/data/src/main/java/org/thingsboard/server/common/data/relation/RelationTypeGroup.java index 07315428e3..07901c5cbf 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/relation/RelationTypeGroup.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/relation/RelationTypeGroup.java @@ -23,6 +23,6 @@ public enum RelationTypeGroup { RULE_CHAIN, RULE_NODE, EDGE, - EDGE_DEFAULT_RULE_CHAIN + EDGE_AUTO_ASSIGN_RULE_CHAIN } diff --git a/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java index 92cb65ad08..2819cc9db4 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java @@ -340,7 +340,7 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic @Override public void assignDefaultRuleChainsToEdge(TenantId tenantId, EdgeId edgeId) { log.trace("Executing assignDefaultRuleChainsToEdge, tenantId [{}], edgeId [{}]", tenantId, edgeId); - ListenableFuture> future = ruleChainService.findDefaultEdgeRuleChainsByTenantId(tenantId); + ListenableFuture> future = ruleChainService.findAutoAssignToEdgeRuleChainsByTenantId(tenantId); Futures.addCallback(future, new FutureCallback>() { @Override public void onSuccess(List ruleChains) { diff --git a/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java b/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java index 8a0bc233cf..cc832c0826 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java @@ -484,21 +484,21 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC } @Override - public RuleChain getDefaultRootEdgeRuleChain(TenantId tenantId) { + public RuleChain getEdgeTemplateRootRuleChain(TenantId tenantId) { return getRootRuleChainByType(tenantId, RuleChainType.EDGE); } @Override - public boolean setDefaultRootEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId) { + public boolean setEdgeTemplateRootRuleChain(TenantId tenantId, RuleChainId ruleChainId) { RuleChain ruleChain = ruleChainDao.findById(tenantId, ruleChainId.getId()); - RuleChain previousDefaultRootEdgeRuleChain = getDefaultRootEdgeRuleChain(ruleChain.getTenantId()); - if (previousDefaultRootEdgeRuleChain == null || !previousDefaultRootEdgeRuleChain.getId().equals(ruleChain.getId())) { + RuleChain previousEdgeTemplateRootRuleChain = getEdgeTemplateRootRuleChain(ruleChain.getTenantId()); + if (previousEdgeTemplateRootRuleChain == null || !previousEdgeTemplateRootRuleChain.getId().equals(ruleChain.getId())) { try { - if (previousDefaultRootEdgeRuleChain != null) { - deleteRelation(tenantId, new EntityRelation(previousDefaultRootEdgeRuleChain.getTenantId(), previousDefaultRootEdgeRuleChain.getId(), + if (previousEdgeTemplateRootRuleChain != null) { + deleteRelation(tenantId, new EntityRelation(previousEdgeTemplateRootRuleChain.getTenantId(), previousEdgeTemplateRootRuleChain.getId(), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.RULE_CHAIN)); - previousDefaultRootEdgeRuleChain.setRoot(false); - ruleChainDao.save(tenantId, previousDefaultRootEdgeRuleChain); + previousEdgeTemplateRootRuleChain.setRoot(false); + ruleChainDao.save(tenantId, previousEdgeTemplateRootRuleChain); } createRelation(tenantId, new EntityRelation(ruleChain.getTenantId(), ruleChain.getId(), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.RULE_CHAIN)); @@ -506,7 +506,7 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC ruleChainDao.save(tenantId, ruleChain); return true; } catch (Exception e) { - log.warn("Failed to set default root edge rule chain, ruleChainId: [{}]", ruleChainId, e); + log.warn("Failed to set edge template root rule chain, ruleChainId: [{}]", ruleChainId, e); throw new RuntimeException(e); } } @@ -514,34 +514,34 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC } @Override - public boolean addDefaultEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId) { + public boolean setAutoAssignToEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId) { try { createRelation(tenantId, new EntityRelation(tenantId, ruleChainId, - EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_DEFAULT_RULE_CHAIN)); + EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_AUTO_ASSIGN_RULE_CHAIN)); return true; } catch (Exception e) { - log.warn("Failed to add default edge rule chain, ruleChainId: [{}]", ruleChainId, e); + log.warn("Failed to set auto assign to edge rule chain, ruleChainId: [{}]", ruleChainId, e); throw new RuntimeException(e); } } @Override - public boolean removeDefaultEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId) { + public boolean unsetAutoAssignToEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId) { try { deleteRelation(tenantId, new EntityRelation(tenantId, ruleChainId, - EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_DEFAULT_RULE_CHAIN)); + EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_AUTO_ASSIGN_RULE_CHAIN)); return true; } catch (Exception e) { - log.warn("Failed to remove default edge rule chain, ruleChainId: [{}]", ruleChainId, e); + log.warn("Failed to unset auto assign to edge rule chain, ruleChainId: [{}]", ruleChainId, e); throw new RuntimeException(e); } } @Override - public ListenableFuture> findDefaultEdgeRuleChainsByTenantId(TenantId tenantId) { - log.trace("Executing findDefaultEdgeRuleChainsByTenantId, tenantId [{}]", tenantId); + public ListenableFuture> findAutoAssignToEdgeRuleChainsByTenantId(TenantId tenantId) { + log.trace("Executing findAutoAssignToEdgeRuleChainsByTenantId, tenantId [{}]", tenantId); validateId(tenantId, INCORRECT_TENANT_ID + tenantId); - return ruleChainDao.findDefaultEdgeRuleChainsByTenantId(tenantId.getId()); + return ruleChainDao.findAutoAssignToEdgeRuleChainsByTenantId(tenantId.getId()); } @@ -592,9 +592,9 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC } } if (ruleChain.isRoot() && RuleChainType.EDGE.equals(ruleChain.getType())) { - RuleChain defaultRootEdgeRuleChain = getDefaultRootEdgeRuleChain(ruleChain.getTenantId()); - if (defaultRootEdgeRuleChain != null && !defaultRootEdgeRuleChain.getId().equals(ruleChain.getId())) { - throw new DataValidationException("Another default root edge rule chain is present in scope of current tenant!"); + RuleChain edgeTemplateRootRuleChain = getEdgeTemplateRootRuleChain(ruleChain.getTenantId()); + if (edgeTemplateRootRuleChain != null && !edgeTemplateRootRuleChain.getId().equals(ruleChain.getId())) { + throw new DataValidationException("Another edge template root rule chain is present in scope of current tenant!"); } } } diff --git a/dao/src/main/java/org/thingsboard/server/dao/rule/CassandraRuleChainDao.java b/dao/src/main/java/org/thingsboard/server/dao/rule/CassandraRuleChainDao.java index 9dfc869afd..b128572b2f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/rule/CassandraRuleChainDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/rule/CassandraRuleChainDao.java @@ -103,9 +103,10 @@ public class CassandraRuleChainDao extends CassandraAbstractSearchTextDao> findDefaultEdgeRuleChainsByTenantId(UUID tenantId) { - log.debug("Try to find default edge rule chains by tenantId [{}]", tenantId); - ListenableFuture> relations = relationDao.findAllByFromAndType(new TenantId(tenantId), new TenantId(tenantId), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_DEFAULT_RULE_CHAIN); + public ListenableFuture> findAutoAssignToEdgeRuleChainsByTenantId(UUID tenantId) { + log.debug("Try to find auto assign to edge rule chains by tenantId [{}]", tenantId); + ListenableFuture> relations = + relationDao.findAllByFromAndType(new TenantId(tenantId), new TenantId(tenantId), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_AUTO_ASSIGN_RULE_CHAIN); return Futures.transformAsync(relations, input -> { List> ruleChainFutures = new ArrayList<>(input.size()); for (EntityRelation relation : input) { diff --git a/dao/src/main/java/org/thingsboard/server/dao/rule/RuleChainDao.java b/dao/src/main/java/org/thingsboard/server/dao/rule/RuleChainDao.java index b883f13fa8..ac39792e87 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/rule/RuleChainDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/rule/RuleChainDao.java @@ -60,10 +60,10 @@ public interface RuleChainDao extends Dao { ListenableFuture> findRuleChainsByTenantIdAndEdgeId(UUID tenantId, UUID edgeId, TimePageLink pageLink); /** - * Find default edge rule chains by tenantId. + * Find auto assign to edge rule chains by tenantId. * * @param tenantId the tenantId * @return the list of rule chain objects */ - ListenableFuture> findDefaultEdgeRuleChainsByTenantId(UUID tenantId); + ListenableFuture> findAutoAssignToEdgeRuleChainsByTenantId(UUID tenantId); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaRuleChainDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaRuleChainDao.java index b6f2ac2421..33538c50b5 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaRuleChainDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaRuleChainDao.java @@ -25,9 +25,7 @@ import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.UUIDConverter; -import org.thingsboard.server.common.data.edge.Edge; import org.thingsboard.server.common.data.id.EdgeId; -import org.thingsboard.server.common.data.id.RuleChainId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.page.TimePageLink; @@ -107,9 +105,10 @@ public class JpaRuleChainDao extends JpaAbstractSearchTextDao> findDefaultEdgeRuleChainsByTenantId(UUID tenantId) { - log.debug("Try to find default edge rule chains by tenantId [{}]", tenantId); - ListenableFuture> relations = relationDao.findAllByFromAndType(new TenantId(tenantId), new TenantId(tenantId), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_DEFAULT_RULE_CHAIN); + public ListenableFuture> findAutoAssignToEdgeRuleChainsByTenantId(UUID tenantId) { + log.debug("Try to find auto assign to edge rule chains by tenantId [{}]", tenantId); + ListenableFuture> relations = + relationDao.findAllByFromAndType(new TenantId(tenantId), new TenantId(tenantId), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_AUTO_ASSIGN_RULE_CHAIN); return Futures.transformAsync(relations, input -> { List> ruleChainsFutures = new ArrayList<>(input.size()); for (EntityRelation relation : input) { diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/BaseRuleChainServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/BaseRuleChainServiceTest.java index 53dc55a0ec..f67c397ef1 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/BaseRuleChainServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/BaseRuleChainServiceTest.java @@ -331,24 +331,24 @@ public abstract class BaseRuleChainServiceTest extends AbstractServiceTest { @Test public void testGetDefaultEdgeRuleChains() throws Exception { - RuleChainId ruleChainId = saveRuleChainAndSetDefaultEdge("Default Edge Rule Chain 1"); - saveRuleChainAndSetDefaultEdge("Default Edge Rule Chain 2"); - List result = ruleChainService.findDefaultEdgeRuleChainsByTenantId(tenantId).get(); + RuleChainId ruleChainId = saveRuleChainAndSetAutoAssignToEdge("Default Edge Rule Chain 1"); + saveRuleChainAndSetAutoAssignToEdge("Default Edge Rule Chain 2"); + List result = ruleChainService.findAutoAssignToEdgeRuleChainsByTenantId(tenantId).get(); Assert.assertEquals(2, result.size()); - ruleChainService.removeDefaultEdgeRuleChain(tenantId, ruleChainId); + ruleChainService.unsetAutoAssignToEdgeRuleChain(tenantId, ruleChainId); - result = ruleChainService.findDefaultEdgeRuleChainsByTenantId(tenantId).get(); + result = ruleChainService.findAutoAssignToEdgeRuleChainsByTenantId(tenantId).get(); Assert.assertEquals(1, result.size()); } @Test - public void setDefaultRootEdgeRuleChain() throws Exception { - RuleChainId ruleChainId1 = saveRuleChainAndSetDefaultEdge("Default Edge Rule Chain 1"); - RuleChainId ruleChainId2 = saveRuleChainAndSetDefaultEdge("Default Edge Rule Chain 2"); + public void setEdgeTemplateRootRuleChain() throws Exception { + RuleChainId ruleChainId1 = saveRuleChainAndSetAutoAssignToEdge("Default Edge Rule Chain 1"); + RuleChainId ruleChainId2 = saveRuleChainAndSetAutoAssignToEdge("Default Edge Rule Chain 2"); - ruleChainService.setDefaultRootEdgeRuleChain(tenantId, ruleChainId1); - ruleChainService.setDefaultRootEdgeRuleChain(tenantId, ruleChainId2); + ruleChainService.setEdgeTemplateRootRuleChain(tenantId, ruleChainId1); + ruleChainService.setEdgeTemplateRootRuleChain(tenantId, ruleChainId2); RuleChain ruleChainById = ruleChainService.findRuleChainById(tenantId, ruleChainId1); Assert.assertFalse(ruleChainById.isRoot()); @@ -357,13 +357,13 @@ public abstract class BaseRuleChainServiceTest extends AbstractServiceTest { Assert.assertTrue(ruleChainById.isRoot()); } - private RuleChainId saveRuleChainAndSetDefaultEdge(String name) { + private RuleChainId saveRuleChainAndSetAutoAssignToEdge(String name) { RuleChain edgeRuleChain = new RuleChain(); edgeRuleChain.setTenantId(tenantId); edgeRuleChain.setType(RuleChainType.EDGE); edgeRuleChain.setName(name); RuleChain savedEdgeRuleChain = ruleChainService.saveRuleChain(edgeRuleChain); - ruleChainService.addDefaultEdgeRuleChain(tenantId, savedEdgeRuleChain.getId()); + ruleChainService.setAutoAssignToEdgeRuleChain(tenantId, savedEdgeRuleChain.getId()); return savedEdgeRuleChain.getId(); } diff --git a/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java b/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java index 9529a67052..fdde79359d 100644 --- a/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java +++ b/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java @@ -2262,9 +2262,9 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable { }, params).getBody(); } - public Optional addDefaultEdgeRuleChain(RuleChainId ruleChainId) { + public Optional setAutoAssignToEdgeRuleChain(RuleChainId ruleChainId) { try { - ResponseEntity ruleChain = restTemplate.postForEntity(baseURL + "/api/ruleChain/{ruleChainId}/defaultEdge", null, RuleChain.class, ruleChainId.getId()); + ResponseEntity ruleChain = restTemplate.postForEntity(baseURL + "/api/ruleChain/{ruleChainId}/autoAssignToEdge", null, RuleChain.class, ruleChainId.getId()); return Optional.ofNullable(ruleChain.getBody()); } catch (HttpClientErrorException exception) { if (exception.getStatusCode() == HttpStatus.NOT_FOUND) { @@ -2275,9 +2275,9 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable { } } - public Optional removeDefaultEdgeRuleChain(RuleChainId ruleChainId) { + public Optional unsetAutoAssignToEdgeRuleChain(RuleChainId ruleChainId) { try { - ResponseEntity ruleChain = restTemplate.exchange(baseURL + "/api/ruleChain/{ruleChainId}/defaultEdge", HttpMethod.DELETE, HttpEntity.EMPTY, RuleChain.class, ruleChainId.getId()); + ResponseEntity ruleChain = restTemplate.exchange(baseURL + "/api/ruleChain/{ruleChainId}/autoAssignToEdge", HttpMethod.DELETE, HttpEntity.EMPTY, RuleChain.class, ruleChainId.getId()); return Optional.ofNullable(ruleChain.getBody()); } catch (HttpClientErrorException exception) { if (exception.getStatusCode() == HttpStatus.NOT_FOUND) { @@ -2288,17 +2288,17 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable { } } - public List getDefaultEdgeRuleChains() { - return restTemplate.exchange(baseURL + "/api/ruleChain/defaultEdgeRuleChains", + public List getAutoAssignToEdgeRuleChains() { + return restTemplate.exchange(baseURL + "/api/ruleChain/autoAssignToEdgeRuleChains", HttpMethod.GET, HttpEntity.EMPTY, new ParameterizedTypeReference>() { }).getBody(); } - public Optional setDefaultRootEdgeRuleChain(RuleChainId ruleChainId) { + public Optional setRootEdgeTemplateRuleChain(RuleChainId ruleChainId) { try { - ResponseEntity ruleChain = restTemplate.postForEntity(baseURL + "/api/ruleChain/{ruleChainId}/defaultRootEdge", null, RuleChain.class, ruleChainId.getId()); + ResponseEntity ruleChain = restTemplate.postForEntity(baseURL + "/api/ruleChain/{ruleChainId}/edgeTemplateRoot", null, RuleChain.class, ruleChainId.getId()); return Optional.ofNullable(ruleChain.getBody()); } catch (HttpClientErrorException exception) { if (exception.getStatusCode() == HttpStatus.NOT_FOUND) { diff --git a/ui/src/app/api/rule-chain.service.js b/ui/src/app/api/rule-chain.service.js index ba91e9e748..a94b9bde52 100644 --- a/ui/src/app/api/rule-chain.service.js +++ b/ui/src/app/api/rule-chain.service.js @@ -40,10 +40,10 @@ function RuleChainService($http, $q, $filter, $ocLazyLoad, $translate, types, co getEdgesRuleChains: getEdgesRuleChains, assignRuleChainToEdge: assignRuleChainToEdge, unassignRuleChainFromEdge: unassignRuleChainFromEdge, - setDefaultRootEdgeRuleChain: setDefaultRootEdgeRuleChain, - addDefaultEdgeRuleChain: addDefaultEdgeRuleChain, - removeDefaultEdgeRuleChain: removeDefaultEdgeRuleChain, - getDefaultEdgeRuleChains: getDefaultEdgeRuleChains + setEdgeTemplateRootRuleChain: setEdgeTemplateRootRuleChain, + setAutoAssignToEdgeRuleChain: setAutoAssignToEdgeRuleChain, + unsetAutoAssignToEdgeRuleChain: unsetAutoAssignToEdgeRuleChain, + getAutoAssignToEdgeRuleChains: getAutoAssignToEdgeRuleChains }; return service; @@ -350,9 +350,9 @@ function RuleChainService($http, $q, $filter, $ocLazyLoad, $translate, types, co return deferred.promise; } - function setDefaultRootEdgeRuleChain(ruleChainId) { + function setEdgeTemplateRootRuleChain(ruleChainId) { var deferred = $q.defer(); - var url = '/api/ruleChain/' + ruleChainId + '/defaultRootEdge'; + var url = '/api/ruleChain/' + ruleChainId + '/edgeTemplateRoot'; $http.post(url).then(function success(response) { deferred.resolve(response.data); }, function fail() { @@ -361,9 +361,9 @@ function RuleChainService($http, $q, $filter, $ocLazyLoad, $translate, types, co return deferred.promise; } - function addDefaultEdgeRuleChain(ruleChainId) { + function setAutoAssignToEdgeRuleChain(ruleChainId) { var deferred = $q.defer(); - var url = '/api/ruleChain/' + ruleChainId + '/defaultEdge'; + var url = '/api/ruleChain/' + ruleChainId + '/autoAssignToEdge'; $http.post(url, null).then(function success(response) { deferred.resolve(response.data); }, function fail() { @@ -372,9 +372,9 @@ function RuleChainService($http, $q, $filter, $ocLazyLoad, $translate, types, co return deferred.promise; } - function removeDefaultEdgeRuleChain(ruleChainId) { + function unsetAutoAssignToEdgeRuleChain(ruleChainId) { var deferred = $q.defer(); - var url = '/api/ruleChain/' + ruleChainId + '/defaultEdge'; + var url = '/api/ruleChain/' + ruleChainId + '/autoAssignToEdge'; $http.delete(url).then(function success(response) { deferred.resolve(response.data); }, function fail() { @@ -383,9 +383,9 @@ function RuleChainService($http, $q, $filter, $ocLazyLoad, $translate, types, co return deferred.promise; } - function getDefaultEdgeRuleChains(config) { + function getAutoAssignToEdgeRuleChains(config) { var deferred = $q.defer(); - var url = '/api/ruleChain/defaultEdgeRuleChains'; + var url = '/api/ruleChain/autoAssignToEdgeRuleChains'; $http.get(url, config).then(function success(response) { deferred.resolve(response.data); }, function fail() { diff --git a/ui/src/app/rulechain/rulechains.controller.js b/ui/src/app/rulechain/rulechains.controller.js index 65eb62abbe..a457883b16 100644 --- a/ui/src/app/rulechain/rulechains.controller.js +++ b/ui/src/app/rulechain/rulechains.controller.js @@ -98,7 +98,7 @@ export default function RuleChainsController(ruleChainService, userService, impo vm.exportRuleChain = exportRuleChain; vm.setRootRuleChain = setRootRuleChain; vm.setDefaultEdgeRuleChain = setDefaultEdgeRuleChain; - vm.removeDefaultEdgeRuleChain = removeDefaultEdgeRuleChain; + vm.unsetAutoAssignToEdgeRuleChain = unsetAutoAssignToEdgeRuleChain; initController(); @@ -195,7 +195,7 @@ export default function RuleChainsController(ruleChainService, userService, impo ruleChainActionsList.push({ onAction: function ($event, item) { - removeDefaultEdgeRuleChain($event, item); + unsetAutoAssignToEdgeRuleChain($event, item); }, name: function() { return $translate.instant('rulechain.remove-default-edge') }, details: function() { return $translate.instant('rulechain.remove-default-edge') }, @@ -205,7 +205,7 @@ export default function RuleChainsController(ruleChainService, userService, impo ruleChainActionsList.push({ onAction: function ($event, item) { - setDefaultRootEdgeRuleChain($event, item); + setEdgeTemplateRootRuleChain($event, item); }, name: function() { return $translate.instant('rulechain.set-default-root-edge') }, details: function() { return $translate.instant('rulechain.set-default-root-edge') }, @@ -339,7 +339,7 @@ export default function RuleChainsController(ruleChainService, userService, impo function mapRuleChainsWithDefaultEdges(ruleChains) { var deferred = $q.defer(); - ruleChainService.getDefaultEdgeRuleChains(null).then( + ruleChainService.getAutoAssignToEdgeRuleChains(null).then( function success(response) { let defaultEdgeRuleChainIds = []; response.map(function (ruleChain) { @@ -481,7 +481,7 @@ export default function RuleChainsController(ruleChainService, userService, impo .cancel($translate.instant('action.no')) .ok($translate.instant('action.yes')); $mdDialog.show(confirm).then(function () { - ruleChainService.addDefaultEdgeRuleChain(ruleChain.id.id).then( + ruleChainService.setAutoAssignToEdgeRuleChain(ruleChain.id.id).then( () => { vm.grid.refreshList(); } @@ -489,7 +489,7 @@ export default function RuleChainsController(ruleChainService, userService, impo }); } - function removeDefaultEdgeRuleChain($event, ruleChain) { + function unsetAutoAssignToEdgeRuleChain($event, ruleChain) { $event.stopPropagation(); var confirm = $mdDialog.confirm() .targetEvent($event) @@ -499,7 +499,7 @@ export default function RuleChainsController(ruleChainService, userService, impo .cancel($translate.instant('action.no')) .ok($translate.instant('action.yes')); $mdDialog.show(confirm).then(function () { - ruleChainService.removeDefaultEdgeRuleChain(ruleChain.id.id).then( + ruleChainService.unsetAutoAssignToEdgeRuleChain(ruleChain.id.id).then( () => { vm.grid.refreshList(); } @@ -507,7 +507,7 @@ export default function RuleChainsController(ruleChainService, userService, impo }); } - function setDefaultRootEdgeRuleChain($event, ruleChain) { + function setEdgeTemplateRootRuleChain($event, ruleChain) { $event.stopPropagation(); var confirm = $mdDialog.confirm() .targetEvent($event) @@ -517,7 +517,7 @@ export default function RuleChainsController(ruleChainService, userService, impo .cancel($translate.instant('action.no')) .ok($translate.instant('action.yes')); $mdDialog.show(confirm).then(function () { - ruleChainService.setDefaultRootEdgeRuleChain(ruleChain.id.id).then( + ruleChainService.setEdgeTemplateRootRuleChain(ruleChain.id.id).then( () => { vm.grid.refreshList(); } diff --git a/ui/src/app/rulechain/rulechains.tpl.html b/ui/src/app/rulechain/rulechains.tpl.html index 0e03a4d8fe..fe9b9fdc64 100644 --- a/ui/src/app/rulechain/rulechains.tpl.html +++ b/ui/src/app/rulechain/rulechains.tpl.html @@ -29,7 +29,7 @@ rule-chains-scope="vm.ruleChainsScope" edge="vm.edge" on-set-default-edge-rule-chain="vm.setDefaultEdgeRuleChain(event, vm.grid.detailsConfig.currentItem)" - on-remove-default-edge-rule-chain="vm.removeDefaultEdgeRuleChain(event, vm.grid.detailsConfig.currentItem)" + on-remove-default-edge-rule-chain="vm.unsetAutoAssignToEdgeRuleChain(event, vm.grid.detailsConfig.currentItem)" on-set-root-rule-chain="vm.setRootRuleChain(event, vm.grid.detailsConfig.currentItem)" on-export-rule-chain="vm.exportRuleChain(event, vm.grid.detailsConfig.currentItem)" on-delete-rule-chain="vm.grid.deleteItem(event, vm.grid.detailsConfig.currentItem)"> From e58af8fb2266a16962151253c8eb43426b0dd90b Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Thu, 24 Dec 2020 13:39:24 +0200 Subject: [PATCH 3/4] Added findMissingToRelatedRuleChains method --- .../server/controller/EdgeController.java | 35 +++- .../edge/DefaultEdgeNotificationService.java | 5 - .../service/edge/EdgeContextComponent.java | 3 +- .../service/edge/EdgeNotificationService.java | 7 - .../service/edge/rpc/EdgeGrpcService.java | 4 +- .../service/edge/rpc/EdgeGrpcSession.java | 14 +- .../edge/rpc/init/DefaultSyncEdgeService.java | 165 +++++++++--------- .../edge/rpc/init/SyncEdgeService.java | 13 +- .../server/dao/edge/EdgeService.java | 2 + .../server/dao/edge/EdgeServiceImpl.java | 58 ++++++ .../thingsboard/rest/client/RestClient.java | 4 +- ui/src/app/api/edge.service.js | 4 +- ui/src/app/edge/edge.directive.js | 2 +- 13 files changed, 195 insertions(+), 121 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/controller/EdgeController.java b/application/src/main/java/org/thingsboard/server/controller/EdgeController.java index 6fc29a8976..60b10bb6fc 100644 --- a/application/src/main/java/org/thingsboard/server/controller/EdgeController.java +++ b/application/src/main/java/org/thingsboard/server/controller/EdgeController.java @@ -389,10 +389,12 @@ public class EdgeController extends BaseController { checkNotNull(query.getEdgeTypes()); checkEntityId(query.getParameters().getEntityId(), Operation.READ); try { - List edges = checkNotNull(edgeService.findEdgesByQuery(getCurrentUser().getTenantId(), query).get()); + SecurityUser user = getCurrentUser(); + TenantId tenantId = user.getTenantId(); + List edges = checkNotNull(edgeService.findEdgesByQuery(tenantId, query).get()); edges = edges.stream().filter(edge -> { try { - accessControlService.checkPermission(getCurrentUser(), Resource.EDGE, Operation.READ, edge.getId(), edge); + accessControlService.checkPermission(user, Resource.EDGE, Operation.READ, edge.getId(), edge); return true; } catch (ThingsboardException e) { return false; @@ -419,14 +421,18 @@ public class EdgeController extends BaseController { } @PreAuthorize("hasAuthority('TENANT_ADMIN')") - @RequestMapping(value = "/edge/sync", method = RequestMethod.POST) - public void syncEdge(@RequestBody EdgeId edgeId) throws ThingsboardException { + @RequestMapping(value = "/edge/sync/{edgeId}", method = RequestMethod.POST) + public void syncEdge(@PathVariable("edgeId") String strEdgeId) throws ThingsboardException { + checkParameter("edgeId", strEdgeId); try { - edgeId = checkNotNull(edgeId); if (isEdgesEnabled()) { - EdgeGrpcSession session = edgeGrpcService.getEdgeGrpcSessionById(edgeId); + EdgeId edgeId = new EdgeId(toUUID(strEdgeId)); + edgeId = checkNotNull(edgeId); + SecurityUser user = getCurrentUser(); + TenantId tenantId = user.getTenantId(); + EdgeGrpcSession session = edgeGrpcService.getEdgeGrpcSessionById(tenantId, edgeId); Edge edge = session.getEdge(); - syncEdgeService.sync(edge); + syncEdgeService.sync(tenantId, edge); } else { throw new ThingsboardException("Edges support disabled", ThingsboardErrorCode.GENERAL); } @@ -455,4 +461,19 @@ public class EdgeController extends BaseController { throw new ThingsboardException(e, ThingsboardErrorCode.SUBSCRIPTION_VIOLATION); } } + + @PreAuthorize("hasAuthority('TENANT_ADMIN')") + @RequestMapping(value = "/edge/missingToRelatedRuleChains/{edgeId}", method = RequestMethod.GET) + @ResponseBody + public String findMissingToRelatedRuleChains(@PathVariable("edgeId") String strEdgeId) throws ThingsboardException { + try { + EdgeId edgeId = new EdgeId(toUUID(strEdgeId)); + edgeId = checkNotNull(edgeId); + SecurityUser user = getCurrentUser(); + TenantId tenantId = user.getTenantId(); + return edgeService.findMissingToRelatedRuleChains(tenantId, edgeId); + } catch (Exception e) { + throw handleException(e); + } + } } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/DefaultEdgeNotificationService.java b/application/src/main/java/org/thingsboard/server/service/edge/DefaultEdgeNotificationService.java index 9d93bb0cbf..2e8676650d 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/DefaultEdgeNotificationService.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/DefaultEdgeNotificationService.java @@ -113,11 +113,6 @@ public class DefaultEdgeNotificationService implements EdgeNotificationService { } } - @Override - public TimePageData findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink) { - return edgeEventService.findEdgeEvents(tenantId, edgeId, pageLink, true); - } - @Override public Edge setEdgeRootRuleChain(TenantId tenantId, Edge edge, RuleChainId ruleChainId) throws IOException { edge.setRootRuleChainId(ruleChainId); diff --git a/application/src/main/java/org/thingsboard/server/service/edge/EdgeContextComponent.java b/application/src/main/java/org/thingsboard/server/service/edge/EdgeContextComponent.java index c90cc99965..0c0f49b53b 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/EdgeContextComponent.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/EdgeContextComponent.java @@ -28,6 +28,7 @@ import org.thingsboard.server.dao.customer.CustomerService; import org.thingsboard.server.dao.dashboard.DashboardService; import org.thingsboard.server.dao.device.DeviceCredentialsService; import org.thingsboard.server.dao.device.DeviceService; +import org.thingsboard.server.dao.edge.EdgeEventService; import org.thingsboard.server.dao.edge.EdgeService; import org.thingsboard.server.dao.entityview.EntityViewService; import org.thingsboard.server.dao.relation.RelationService; @@ -74,7 +75,7 @@ public class EdgeContextComponent { @Lazy @Autowired - private EdgeNotificationService edgeNotificationService; + private EdgeEventService edgeEventService; @Lazy @Autowired diff --git a/application/src/main/java/org/thingsboard/server/service/edge/EdgeNotificationService.java b/application/src/main/java/org/thingsboard/server/service/edge/EdgeNotificationService.java index 6f35d4c32c..1657e9bfca 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/EdgeNotificationService.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/EdgeNotificationService.java @@ -15,14 +15,9 @@ */ package org.thingsboard.server.service.edge; -import org.thingsboard.server.common.data.Event; import org.thingsboard.server.common.data.edge.Edge; -import org.thingsboard.server.common.data.edge.EdgeEvent; -import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.RuleChainId; import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.common.data.page.TimePageData; -import org.thingsboard.server.common.data.page.TimePageLink; import org.thingsboard.server.common.msg.queue.TbCallback; import org.thingsboard.server.gen.transport.TransportProtos; @@ -30,8 +25,6 @@ import java.io.IOException; public interface EdgeNotificationService { - TimePageData findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink); - Edge setEdgeRootRuleChain(TenantId tenantId, Edge edge, RuleChainId ruleChainId) throws IOException; void pushNotificationToEdge(TransportProtos.EdgeNotificationMsgProto edgeNotificationMsg, TbCallback callback); diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcService.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcService.java index 8fd335efea..3ccdd40a17 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcService.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcService.java @@ -28,6 +28,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Service; import org.thingsboard.common.util.ThingsBoardThreadFactory; import org.thingsboard.server.common.data.DataConstants; +import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.edge.Edge; import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.TenantId; @@ -186,11 +187,12 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase i scheduleEdgeEventsCheck(edgeGrpcSession); } - public EdgeGrpcSession getEdgeGrpcSessionById(EdgeId edgeId) { + public EdgeGrpcSession getEdgeGrpcSessionById(TenantId tenantId, EdgeId edgeId) { EdgeGrpcSession session = sessions.get(edgeId); if (session != null && session.isConnected()) { return session; } else { + log.error("[{}] Edge is not connected [{}]", tenantId, edgeId); throw new RuntimeException("Edge is not connected"); } } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java index a3206817a0..4b34b0c4a2 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java @@ -165,7 +165,7 @@ public final class EdgeGrpcSession implements Closeable { } } if (connected && requestMsg.getMsgType().equals(RequestMsgType.SYNC_REQUEST_RPC_MESSAGE)) { - ctx.getSyncEdgeService().sync(edge); + ctx.getSyncEdgeService().sync(edge.getTenantId(), edge); } if (connected) { if (requestMsg.getMsgType().equals(RequestMsgType.UPLINK_RPC_MESSAGE) && requestMsg.hasUplinkMsg()) { @@ -267,7 +267,7 @@ public final class EdgeGrpcSession implements Closeable { UUID ifOffset = null; boolean success = true; do { - pageData = ctx.getEdgeNotificationService().findEdgeEvents(edge.getTenantId(), edge.getId(), pageLink); + pageData = ctx.getEdgeEventService().findEdgeEvents(edge.getTenantId(), edge.getId(), pageLink, true); if (isConnected() && !pageData.getData().isEmpty()) { log.trace("[{}] [{}] event(s) are going to be processed.", this.sessionId, pageData.getData().size()); List downlinkMsgsPack = convertToDownlinkMsgsPack(pageData.getData()); @@ -899,27 +899,27 @@ public final class EdgeGrpcSession implements Closeable { } if (uplinkMsg.getRuleChainMetadataRequestMsgList() != null && !uplinkMsg.getRuleChainMetadataRequestMsgList().isEmpty()) { for (RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg : uplinkMsg.getRuleChainMetadataRequestMsgList()) { - result.add(ctx.getSyncEdgeService().processRuleChainMetadataRequestMsg(edge, ruleChainMetadataRequestMsg)); + result.add(ctx.getSyncEdgeService().processRuleChainMetadataRequestMsg(edge.getTenantId(), edge, ruleChainMetadataRequestMsg)); } } if (uplinkMsg.getAttributesRequestMsgList() != null && !uplinkMsg.getAttributesRequestMsgList().isEmpty()) { for (AttributesRequestMsg attributesRequestMsg : uplinkMsg.getAttributesRequestMsgList()) { - result.add(ctx.getSyncEdgeService().processAttributesRequestMsg(edge, attributesRequestMsg)); + result.add(ctx.getSyncEdgeService().processAttributesRequestMsg(edge.getTenantId(), edge, attributesRequestMsg)); } } if (uplinkMsg.getRelationRequestMsgList() != null && !uplinkMsg.getRelationRequestMsgList().isEmpty()) { for (RelationRequestMsg relationRequestMsg : uplinkMsg.getRelationRequestMsgList()) { - result.add(ctx.getSyncEdgeService().processRelationRequestMsg(edge, relationRequestMsg)); + result.add(ctx.getSyncEdgeService().processRelationRequestMsg(edge.getTenantId(), edge, relationRequestMsg)); } } if (uplinkMsg.getUserCredentialsRequestMsgList() != null && !uplinkMsg.getUserCredentialsRequestMsgList().isEmpty()) { for (UserCredentialsRequestMsg userCredentialsRequestMsg : uplinkMsg.getUserCredentialsRequestMsgList()) { - result.add(ctx.getSyncEdgeService().processUserCredentialsRequestMsg(edge, userCredentialsRequestMsg)); + result.add(ctx.getSyncEdgeService().processUserCredentialsRequestMsg(edge.getTenantId(), edge, userCredentialsRequestMsg)); } } if (uplinkMsg.getDeviceCredentialsRequestMsgList() != null && !uplinkMsg.getDeviceCredentialsRequestMsgList().isEmpty()) { for (DeviceCredentialsRequestMsg deviceCredentialsRequestMsg : uplinkMsg.getDeviceCredentialsRequestMsgList()) { - result.add(ctx.getSyncEdgeService().processDeviceCredentialsRequestMsg(edge, deviceCredentialsRequestMsg)); + result.add(ctx.getSyncEdgeService().processDeviceCredentialsRequestMsg(edge.getTenantId(), edge, deviceCredentialsRequestMsg)); } } if (uplinkMsg.getDeviceRpcCallMsgList() != null && !uplinkMsg.getDeviceRpcCallMsgList().isEmpty()) { diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/init/DefaultSyncEdgeService.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/init/DefaultSyncEdgeService.java index c67a8062a0..67828fa1ac 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/init/DefaultSyncEdgeService.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/init/DefaultSyncEdgeService.java @@ -33,7 +33,6 @@ import org.springframework.core.io.DefaultResourceLoader; import org.springframework.stereotype.Service; import org.thingsboard.server.common.data.AdminSettings; import org.thingsboard.server.common.data.DashboardInfo; -import org.thingsboard.server.common.data.DataConstants; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.EdgeUtils; import org.thingsboard.server.common.data.EntityType; @@ -146,37 +145,37 @@ public class DefaultSyncEdgeService implements SyncEdgeService { private TbClusterService tbClusterService; @Override - public void sync(Edge edge) { - log.trace("[{}][{}] Staring edge sync process", edge.getTenantId(), edge.getId()); + public void sync(TenantId tenantId, Edge edge) { + log.trace("[{}][{}] Staring edge sync process", tenantId, edge.getId()); try { - syncWidgetsBundleAndWidgetTypes(edge); - syncAdminSettings(edge); - syncRuleChains(edge, new TimePageLink(DEFAULT_LIMIT)); - syncUsers(edge, new TextPageLink(DEFAULT_LIMIT)); - syncDevices(edge, new TimePageLink(DEFAULT_LIMIT)); - syncAssets(edge, new TimePageLink(DEFAULT_LIMIT)); - syncEntityViews(edge, new TimePageLink(DEFAULT_LIMIT)); - syncDashboards(edge, new TimePageLink(DEFAULT_LIMIT)); + syncWidgetsBundleAndWidgetTypes(tenantId, edge); + syncAdminSettings(tenantId, edge); + syncRuleChains(tenantId, edge, new TimePageLink(DEFAULT_LIMIT)); + syncUsers(tenantId, edge, new TextPageLink(DEFAULT_LIMIT)); + syncDevices(tenantId, edge, new TimePageLink(DEFAULT_LIMIT)); + syncAssets(tenantId, edge, new TimePageLink(DEFAULT_LIMIT)); + syncEntityViews(tenantId, edge, new TimePageLink(DEFAULT_LIMIT)); + syncDashboards(tenantId, edge, new TimePageLink(DEFAULT_LIMIT)); } catch (Exception e) { - log.error("[{}][{}] Exception during sync process", edge.getTenantId(), edge.getId(), e); + log.error("[{}][{}] Exception during sync process", tenantId, edge.getId(), e); } } - private void syncRuleChains(Edge edge, TimePageLink pageLink) { - log.trace("[{}] syncRuleChains [{}] [{}]", edge.getTenantId(), edge.getName(), pageLink); + private void syncRuleChains(TenantId tenantId, Edge edge, TimePageLink pageLink) { + log.trace("[{}] syncRuleChains [{}] [{}]", tenantId, edge.getName(), pageLink); try { ListenableFuture> future = - ruleChainService.findRuleChainsByTenantIdAndEdgeId(edge.getTenantId(), edge.getId(), pageLink); + ruleChainService.findRuleChainsByTenantIdAndEdgeId(tenantId, edge.getId(), pageLink); Futures.addCallback(future, new FutureCallback>() { @Override public void onSuccess(@Nullable TimePageData pageData) { if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) { log.trace("[{}] [{}] rule chains(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size()); for (RuleChain ruleChain : pageData.getData()) { - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.RULE_CHAIN, EdgeEventActionType.ADDED, ruleChain.getId(), null); + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.RULE_CHAIN, EdgeEventActionType.ADDED, ruleChain.getId(), null); } if (pageData.hasNext()) { - syncRuleChains(edge, pageData.getNextPageLink()); + syncRuleChains(tenantId, edge, pageData.getNextPageLink()); } } } @@ -191,21 +190,21 @@ public class DefaultSyncEdgeService implements SyncEdgeService { } } - private void syncDevices(Edge edge, TimePageLink pageLink) { - log.trace("[{}] syncDevices [{}]", edge.getTenantId(), edge.getName()); + private void syncDevices(TenantId tenantId, Edge edge, TimePageLink pageLink) { + log.trace("[{}] syncDevices [{}]", tenantId, edge.getName()); try { ListenableFuture> future = - deviceService.findDevicesByTenantIdAndEdgeId(edge.getTenantId(), edge.getId(), pageLink); + deviceService.findDevicesByTenantIdAndEdgeId(tenantId, edge.getId(), pageLink); Futures.addCallback(future, new FutureCallback>() { @Override public void onSuccess(@Nullable TimePageData pageData) { if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) { log.trace("[{}] [{}] device(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size()); for (Device device : pageData.getData()) { - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.DEVICE, EdgeEventActionType.ADDED, device.getId(), null); + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.DEVICE, EdgeEventActionType.ADDED, device.getId(), null); } if (pageData.hasNext()) { - syncDevices(edge, pageData.getNextPageLink()); + syncDevices(tenantId, edge, pageData.getNextPageLink()); } } } @@ -220,20 +219,20 @@ public class DefaultSyncEdgeService implements SyncEdgeService { } } - private void syncAssets(Edge edge, TimePageLink pageLink) { - log.trace("[{}] syncAssets [{}]", edge.getTenantId(), edge.getName()); + private void syncAssets(TenantId tenantId, Edge edge, TimePageLink pageLink) { + log.trace("[{}] syncAssets [{}]", tenantId, edge.getName()); try { - ListenableFuture> future = assetService.findAssetsByTenantIdAndEdgeId(edge.getTenantId(), edge.getId(), pageLink); + ListenableFuture> future = assetService.findAssetsByTenantIdAndEdgeId(tenantId, edge.getId(), pageLink); Futures.addCallback(future, new FutureCallback>() { @Override public void onSuccess(@Nullable TimePageData pageData) { if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) { log.trace("[{}] [{}] asset(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size()); for (Asset asset : pageData.getData()) { - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.ASSET, EdgeEventActionType.ADDED, asset.getId(), null); + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ASSET, EdgeEventActionType.ADDED, asset.getId(), null); } if (pageData.hasNext()) { - syncAssets(edge, pageData.getNextPageLink()); + syncAssets(tenantId, edge, pageData.getNextPageLink()); } } } @@ -248,20 +247,20 @@ public class DefaultSyncEdgeService implements SyncEdgeService { } } - private void syncEntityViews(Edge edge, TimePageLink pageLink) { - log.trace("[{}] syncEntityViews [{}]", edge.getTenantId(), edge.getName()); + private void syncEntityViews(TenantId tenantId, Edge edge, TimePageLink pageLink) { + log.trace("[{}] syncEntityViews [{}]", tenantId, edge.getName()); try { - ListenableFuture> future = entityViewService.findEntityViewsByTenantIdAndEdgeId(edge.getTenantId(), edge.getId(), pageLink); + ListenableFuture> future = entityViewService.findEntityViewsByTenantIdAndEdgeId(tenantId, edge.getId(), pageLink); Futures.addCallback(future, new FutureCallback>() { @Override public void onSuccess(@Nullable TimePageData pageData) { if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) { log.trace("[{}] [{}] entity view(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size()); for (EntityView entityView : pageData.getData()) { - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.ENTITY_VIEW, EdgeEventActionType.ADDED, entityView.getId(), null); + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ENTITY_VIEW, EdgeEventActionType.ADDED, entityView.getId(), null); } if (pageData.hasNext()) { - syncEntityViews(edge, pageData.getNextPageLink()); + syncEntityViews(tenantId, edge, pageData.getNextPageLink()); } } } @@ -276,20 +275,20 @@ public class DefaultSyncEdgeService implements SyncEdgeService { } } - private void syncDashboards(Edge edge, TimePageLink pageLink) { - log.trace("[{}] syncDashboards [{}]", edge.getTenantId(), edge.getName()); + private void syncDashboards(TenantId tenantId, Edge edge, TimePageLink pageLink) { + log.trace("[{}] syncDashboards [{}]", tenantId, edge.getName()); try { - ListenableFuture> future = dashboardService.findDashboardsByTenantIdAndEdgeId(edge.getTenantId(), edge.getId(), pageLink); + ListenableFuture> future = dashboardService.findDashboardsByTenantIdAndEdgeId(tenantId, edge.getId(), pageLink); Futures.addCallback(future, new FutureCallback>() { @Override public void onSuccess(@Nullable TimePageData pageData) { if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) { log.trace("[{}] [{}] dashboard(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size()); for (DashboardInfo dashboardInfo : pageData.getData()) { - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.DASHBOARD, EdgeEventActionType.ADDED, dashboardInfo.getId(), null); + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.DASHBOARD, EdgeEventActionType.ADDED, dashboardInfo.getId(), null); } if (pageData.hasNext()) { - syncDashboards(edge, pageData.getNextPageLink()); + syncDashboards(tenantId, edge, pageData.getNextPageLink()); } } } @@ -304,31 +303,31 @@ public class DefaultSyncEdgeService implements SyncEdgeService { } } - private void syncUsers(Edge edge, TextPageLink pageLink) { - log.trace("[{}] syncUsers [{}]", edge.getTenantId(), edge.getName()); + private void syncUsers(TenantId tenantId, Edge edge, TextPageLink pageLink) { + log.trace("[{}] syncUsers [{}]", tenantId, edge.getName()); try { TextPageData pageData; do { - pageData = userService.findTenantAdmins(edge.getTenantId(), pageLink); - pushUsersToEdge(pageData, edge); + pageData = userService.findTenantAdmins(tenantId, pageLink); + pushUsersToEdge(tenantId, pageData, edge); if (pageData != null && pageData.hasNext()) { pageLink = pageData.getNextPageLink(); } } while (pageData != null && pageData.hasNext()); - syncCustomerUsers(edge); + syncCustomerUsers(tenantId, edge); } catch (Exception e) { log.error("Exception during loading edge user(s) on sync!", e); } } - private void syncCustomerUsers(Edge edge) { + private void syncCustomerUsers(TenantId tenantId, Edge edge) { if (edge.getCustomerId() != null && !EntityId.NULL_UUID.equals(edge.getCustomerId().getId())) { - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.CUSTOMER, EdgeEventActionType.ADDED, edge.getCustomerId(), null); + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.CUSTOMER, EdgeEventActionType.ADDED, edge.getCustomerId(), null); TextPageLink pageLink = new TextPageLink(DEFAULT_LIMIT); TextPageData pageData; do { - pageData = userService.findCustomerUsers(edge.getTenantId(), edge.getCustomerId(), pageLink); - pushUsersToEdge(pageData, edge); + pageData = userService.findCustomerUsers(tenantId, edge.getCustomerId(), pageLink); + pushUsersToEdge(tenantId, pageData, edge); if (pageData != null && pageData.hasNext()) { pageLink = pageData.getNextPageLink(); } @@ -336,45 +335,45 @@ public class DefaultSyncEdgeService implements SyncEdgeService { } } - private void pushUsersToEdge(TextPageData pageData, Edge edge) { + private void pushUsersToEdge(TenantId tenantId, TextPageData pageData, Edge edge) { if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) { log.trace("[{}] [{}] user(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size()); for (User user : pageData.getData()) { - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.USER, EdgeEventActionType.ADDED, user.getId(), null); + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.USER, EdgeEventActionType.ADDED, user.getId(), null); } } } - private void syncWidgetsBundleAndWidgetTypes(Edge edge) { - log.trace("[{}] syncWidgetsBundleAndWidgetTypes [{}]", edge.getTenantId(), edge.getName()); + private void syncWidgetsBundleAndWidgetTypes(TenantId tenantId, Edge edge) { + log.trace("[{}] syncWidgetsBundleAndWidgetTypes [{}]", tenantId, edge.getName()); List widgetsBundlesToPush = new ArrayList<>(); List widgetTypesToPush = new ArrayList<>(); - widgetsBundlesToPush.addAll(widgetsBundleService.findAllTenantWidgetsBundlesByTenantId(edge.getTenantId())); - widgetsBundlesToPush.addAll(widgetsBundleService.findSystemWidgetsBundles(edge.getTenantId())); + widgetsBundlesToPush.addAll(widgetsBundleService.findAllTenantWidgetsBundlesByTenantId(tenantId)); + widgetsBundlesToPush.addAll(widgetsBundleService.findSystemWidgetsBundles(tenantId)); try { for (WidgetsBundle widgetsBundle: widgetsBundlesToPush) { - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.WIDGETS_BUNDLE, EdgeEventActionType.ADDED, widgetsBundle.getId(), null); + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.WIDGETS_BUNDLE, EdgeEventActionType.ADDED, widgetsBundle.getId(), null); widgetTypesToPush.addAll(widgetTypeService.findWidgetTypesByTenantIdAndBundleAlias(widgetsBundle.getTenantId(), widgetsBundle.getAlias())); } for (WidgetType widgetType: widgetTypesToPush) { - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.WIDGET_TYPE, EdgeEventActionType.ADDED, widgetType.getId(), null); + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.WIDGET_TYPE, EdgeEventActionType.ADDED, widgetType.getId(), null); } } catch (Exception e) { log.error("Exception during loading widgets bundle(s) and widget type(s) on sync!", e); } } - private void syncAdminSettings(Edge edge) { - log.trace("[{}] syncAdminSettings [{}]", edge.getTenantId(), edge.getName()); + private void syncAdminSettings(TenantId tenantId, Edge edge) { + log.trace("[{}] syncAdminSettings [{}]", tenantId, edge.getName()); try { AdminSettings systemMailSettings = adminSettingsService.findAdminSettingsByKey(TenantId.SYS_TENANT_ID, "mail"); - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(systemMailSettings)); + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(systemMailSettings)); AdminSettings tenantMailSettings = convertToTenantAdminSettings(systemMailSettings.getKey(), (ObjectNode) systemMailSettings.getJsonValue()); - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(tenantMailSettings)); + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(tenantMailSettings)); AdminSettings systemMailTemplates = loadMailTemplates(); - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(systemMailTemplates)); + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(systemMailTemplates)); AdminSettings tenantMailTemplates = convertToTenantAdminSettings(systemMailTemplates.getKey(), (ObjectNode) systemMailTemplates.getJsonValue()); - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(tenantMailTemplates)); + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(tenantMailTemplates)); } catch (Exception e) { log.error("Can't load admin settings", e); } @@ -433,13 +432,13 @@ public class DefaultSyncEdgeService implements SyncEdgeService { } @Override - public ListenableFuture processRuleChainMetadataRequestMsg(Edge edge, RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg) { - log.trace("[{}] processRuleChainMetadataRequestMsg [{}][{}]", edge.getTenantId(), edge.getName(), ruleChainMetadataRequestMsg); + public ListenableFuture processRuleChainMetadataRequestMsg(TenantId tenantId, Edge edge, RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg) { + log.trace("[{}] processRuleChainMetadataRequestMsg [{}][{}]", tenantId, edge.getName(), ruleChainMetadataRequestMsg); SettableFuture futureToSet = SettableFuture.create(); if (ruleChainMetadataRequestMsg.getRuleChainIdMSB() != 0 && ruleChainMetadataRequestMsg.getRuleChainIdLSB() != 0) { RuleChainId ruleChainId = new RuleChainId(new UUID(ruleChainMetadataRequestMsg.getRuleChainIdMSB(), ruleChainMetadataRequestMsg.getRuleChainIdLSB())); - ListenableFuture future = saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.RULE_CHAIN_METADATA, EdgeEventActionType.ADDED, ruleChainId, null); + ListenableFuture future = saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.RULE_CHAIN_METADATA, EdgeEventActionType.ADDED, ruleChainId, null); Futures.addCallback(future, new FutureCallback() { @Override public void onSuccess(@Nullable EdgeEvent result) { @@ -457,8 +456,8 @@ public class DefaultSyncEdgeService implements SyncEdgeService { } @Override - public ListenableFuture processAttributesRequestMsg(Edge edge, AttributesRequestMsg attributesRequestMsg) { - log.trace("[{}] processAttributesRequestMsg [{}][{}]", edge.getTenantId(), edge.getName(), attributesRequestMsg); + public ListenableFuture processAttributesRequestMsg(TenantId tenantId, Edge edge, AttributesRequestMsg attributesRequestMsg) { + log.trace("[{}] processAttributesRequestMsg [{}][{}]", tenantId, edge.getName(), attributesRequestMsg); EntityId entityId = EntityIdFactory.getByTypeAndUuid( EntityType.valueOf(attributesRequestMsg.getEntityType()), new UUID(attributesRequestMsg.getEntityIdMSB(), attributesRequestMsg.getEntityIdLSB())); @@ -466,7 +465,7 @@ public class DefaultSyncEdgeService implements SyncEdgeService { if (type != null) { SettableFuture futureToSet = SettableFuture.create(); String scope = attributesRequestMsg.getScope(); - ListenableFuture> ssAttrFuture = attributesService.findAll(edge.getTenantId(), entityId, scope); + ListenableFuture> ssAttrFuture = attributesService.findAll(tenantId, entityId, scope); Futures.addCallback(ssAttrFuture, new FutureCallback>() { @Override public void onSuccess(@Nullable List ssAttributes) { @@ -489,7 +488,7 @@ public class DefaultSyncEdgeService implements SyncEdgeService { entityData.put("scope", scope); JsonNode body = mapper.valueToTree(entityData); log.debug("Sending attributes data msg, entityId [{}], attributes [{}]", entityId, body); - saveEdgeEvent(edge.getTenantId(), + saveEdgeEvent(tenantId, edge.getId(), type, EdgeEventActionType.ATTRIBUTES_UPDATED, @@ -500,7 +499,7 @@ public class DefaultSyncEdgeService implements SyncEdgeService { throw new RuntimeException("[" + edge.getName() + "] Failed to send attribute updates to the edge", e); } } else { - log.trace("[{}][{}] No attributes found for entity {} [{}]", edge.getTenantId(), + log.trace("[{}][{}] No attributes found for entity {} [{}]", tenantId, edge.getName(), entityId.getEntityType(), entityId.getId()); @@ -516,21 +515,21 @@ public class DefaultSyncEdgeService implements SyncEdgeService { }, dbCallbackExecutorService); return futureToSet; } else { - log.warn("[{}] Type doesn't supported {}", edge.getTenantId(), entityId.getEntityType()); + log.warn("[{}] Type doesn't supported {}", tenantId, entityId.getEntityType()); return Futures.immediateFuture(null); } } @Override - public ListenableFuture processRelationRequestMsg(Edge edge, RelationRequestMsg relationRequestMsg) { - log.trace("[{}] processRelationRequestMsg [{}][{}]", edge.getTenantId(), edge.getName(), relationRequestMsg); + public ListenableFuture processRelationRequestMsg(TenantId tenantId, Edge edge, RelationRequestMsg relationRequestMsg) { + log.trace("[{}] processRelationRequestMsg [{}][{}]", tenantId, edge.getName(), relationRequestMsg); EntityId entityId = EntityIdFactory.getByTypeAndUuid( EntityType.valueOf(relationRequestMsg.getEntityType()), new UUID(relationRequestMsg.getEntityIdMSB(), relationRequestMsg.getEntityIdLSB())); List>> futures = new ArrayList<>(); - futures.add(findRelationByQuery(edge, entityId, EntitySearchDirection.FROM)); - futures.add(findRelationByQuery(edge, entityId, EntitySearchDirection.TO)); + futures.add(findRelationByQuery(tenantId, edge, entityId, EntitySearchDirection.FROM)); + futures.add(findRelationByQuery(tenantId, edge, entityId, EntitySearchDirection.TO)); ListenableFuture>> relationsListFuture = Futures.allAsList(futures); SettableFuture futureToSet = SettableFuture.create(); Futures.addCallback(relationsListFuture, new FutureCallback>>() { @@ -544,7 +543,7 @@ public class DefaultSyncEdgeService implements SyncEdgeService { try { if (!relation.getFrom().getEntityType().equals(EntityType.EDGE) && !relation.getTo().getEntityType().equals(EntityType.EDGE)) { - saveEdgeEvent(edge.getTenantId(), + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.RELATION, EdgeEventActionType.ADDED, @@ -568,26 +567,26 @@ public class DefaultSyncEdgeService implements SyncEdgeService { @Override public void onFailure(Throwable t) { - log.error("[{}] Can't find relation by query. Entity id [{}]", edge.getTenantId(), entityId, t); + log.error("[{}] Can't find relation by query. Entity id [{}]", tenantId, entityId, t); futureToSet.setException(t); } }, dbCallbackExecutorService); return futureToSet; } - private ListenableFuture> findRelationByQuery(Edge edge, EntityId entityId, EntitySearchDirection direction) { + private ListenableFuture> findRelationByQuery(TenantId tenantId, Edge edge, EntityId entityId, EntitySearchDirection direction) { EntityRelationsQuery query = new EntityRelationsQuery(); query.setParameters(new RelationsSearchParameters(entityId, direction, -1, false)); - return relationService.findByQuery(edge.getTenantId(), query); + return relationService.findByQuery(tenantId, query); } @Override - public ListenableFuture processDeviceCredentialsRequestMsg(Edge edge, DeviceCredentialsRequestMsg deviceCredentialsRequestMsg) { - log.trace("[{}] processDeviceCredentialsRequestMsg [{}][{}]", edge.getTenantId(), edge.getName(), deviceCredentialsRequestMsg); + public ListenableFuture processDeviceCredentialsRequestMsg(TenantId tenantId, Edge edge, DeviceCredentialsRequestMsg deviceCredentialsRequestMsg) { + log.trace("[{}] processDeviceCredentialsRequestMsg [{}][{}]", tenantId, edge.getName(), deviceCredentialsRequestMsg); SettableFuture futureToSet = SettableFuture.create(); if (deviceCredentialsRequestMsg.getDeviceIdMSB() != 0 && deviceCredentialsRequestMsg.getDeviceIdLSB() != 0) { DeviceId deviceId = new DeviceId(new UUID(deviceCredentialsRequestMsg.getDeviceIdMSB(), deviceCredentialsRequestMsg.getDeviceIdLSB())); - ListenableFuture future = saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.DEVICE, EdgeEventActionType.CREDENTIALS_UPDATED, deviceId, null); + ListenableFuture future = saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.DEVICE, EdgeEventActionType.CREDENTIALS_UPDATED, deviceId, null); Futures.addCallback(future, new FutureCallback() { @Override public void onSuccess(@Nullable EdgeEvent result) { @@ -605,12 +604,12 @@ public class DefaultSyncEdgeService implements SyncEdgeService { } @Override - public ListenableFuture processUserCredentialsRequestMsg(Edge edge, UserCredentialsRequestMsg userCredentialsRequestMsg) { - log.trace("[{}] processUserCredentialsRequestMsg [{}][{}]", edge.getTenantId(), edge.getName(), userCredentialsRequestMsg); + public ListenableFuture processUserCredentialsRequestMsg(TenantId tenantId, Edge edge, UserCredentialsRequestMsg userCredentialsRequestMsg) { + log.trace("[{}] processUserCredentialsRequestMsg [{}][{}]", tenantId, edge.getName(), userCredentialsRequestMsg); SettableFuture futureToSet = SettableFuture.create(); if (userCredentialsRequestMsg.getUserIdMSB() != 0 && userCredentialsRequestMsg.getUserIdLSB() != 0) { UserId userId = new UserId(new UUID(userCredentialsRequestMsg.getUserIdMSB(), userCredentialsRequestMsg.getUserIdLSB())); - ListenableFuture future = saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.USER, EdgeEventActionType.CREDENTIALS_UPDATED, userId, null); + ListenableFuture future = saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.USER, EdgeEventActionType.CREDENTIALS_UPDATED, userId, null); Futures.addCallback(future, new FutureCallback() { @Override public void onSuccess(@Nullable EdgeEvent result) { diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/init/SyncEdgeService.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/init/SyncEdgeService.java index a4df4e227c..f301384246 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/init/SyncEdgeService.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/init/SyncEdgeService.java @@ -17,6 +17,7 @@ package org.thingsboard.server.service.edge.rpc.init; import com.google.common.util.concurrent.ListenableFuture; import org.thingsboard.server.common.data.edge.Edge; +import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.gen.edge.AttributesRequestMsg; import org.thingsboard.server.gen.edge.DeviceCredentialsRequestMsg; import org.thingsboard.server.gen.edge.RelationRequestMsg; @@ -25,15 +26,15 @@ import org.thingsboard.server.gen.edge.UserCredentialsRequestMsg; public interface SyncEdgeService { - void sync(Edge edge); + void sync(TenantId tenantId, Edge edge); - ListenableFuture processRuleChainMetadataRequestMsg(Edge edge, RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg); + ListenableFuture processRuleChainMetadataRequestMsg(TenantId tenantId, Edge edge, RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg); - ListenableFuture processAttributesRequestMsg(Edge edge, AttributesRequestMsg attributesRequestMsg); + ListenableFuture processAttributesRequestMsg(TenantId tenantId, Edge edge, AttributesRequestMsg attributesRequestMsg); - ListenableFuture processRelationRequestMsg(Edge edge, RelationRequestMsg relationRequestMsg); + ListenableFuture processRelationRequestMsg(TenantId tenantId, Edge edge, RelationRequestMsg relationRequestMsg); - ListenableFuture processDeviceCredentialsRequestMsg(Edge edge, DeviceCredentialsRequestMsg deviceCredentialsRequestMsg); + ListenableFuture processDeviceCredentialsRequestMsg(TenantId tenantId, Edge edge, DeviceCredentialsRequestMsg deviceCredentialsRequestMsg); - ListenableFuture processUserCredentialsRequestMsg(Edge edge, UserCredentialsRequestMsg userCredentialsRequestMsg); + ListenableFuture processUserCredentialsRequestMsg(TenantId tenantId, Edge edge, UserCredentialsRequestMsg userCredentialsRequestMsg); } diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeService.java index e29d5f3307..2bce018d12 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeService.java @@ -80,4 +80,6 @@ public interface EdgeService { Object checkInstance(Object request); Object activateInstance(String licenseSecret, String releaseDate); + + String findMissingToRelatedRuleChains(TenantId tenantId, EdgeId edgeId); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java index 2819cc9db4..0d4d45bec4 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java @@ -15,6 +15,9 @@ */ package org.thingsboard.server.dao.edge; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.common.base.Function; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; @@ -54,10 +57,13 @@ import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.common.data.page.TextPageData; import org.thingsboard.server.common.data.page.TextPageLink; +import org.thingsboard.server.common.data.page.TimePageData; +import org.thingsboard.server.common.data.page.TimePageLink; import org.thingsboard.server.common.data.relation.EntityRelation; import org.thingsboard.server.common.data.relation.EntitySearchDirection; import org.thingsboard.server.common.data.relation.RelationTypeGroup; import org.thingsboard.server.common.data.rule.RuleChain; +import org.thingsboard.server.common.data.rule.RuleChainConnectionInfo; import org.thingsboard.server.dao.customer.CustomerDao; import org.thingsboard.server.dao.entity.AbstractEntityService; import org.thingsboard.server.dao.exception.DataValidationException; @@ -100,6 +106,8 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic public static final String INCORRECT_CUSTOMER_ID = "Incorrect customerId "; public static final String INCORRECT_EDGE_ID = "Incorrect edgeId "; + private static final ObjectMapper mapper = new ObjectMapper(); + private static final int DEFAULT_LIMIT = 100; private RestTemplate restTemplate; @@ -575,6 +583,56 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic return this.restTemplate.postForEntity(EDGE_LICENSE_SERVER_ENDPOINT + "/api/license/activateInstance?licenseSecret={licenseSecret}&releaseDate={releaseDate}", (Object) null, Object.class, params); } + @Override + public String findMissingToRelatedRuleChains(TenantId tenantId, EdgeId edgeId) { + List edgeRuleChains = findEdgeRuleChains(tenantId, edgeId); + List edgeRuleChainIds = edgeRuleChains.stream().map(IdBased::getId).collect(Collectors.toList()); + ObjectNode result = mapper.createObjectNode(); + for (RuleChain edgeRuleChain : edgeRuleChains) { + List connectionInfos = + ruleChainService.loadRuleChainMetaData(edgeRuleChain.getTenantId(), edgeRuleChain.getId()).getRuleChainConnections(); + if (connectionInfos != null && !connectionInfos.isEmpty()) { + List connectedRuleChains = + connectionInfos.stream().map(RuleChainConnectionInfo::getTargetRuleChainId).collect(Collectors.toList()); + List missingRuleChains = new ArrayList<>(); + for (RuleChainId connectedRuleChain : connectedRuleChains) { + if (!edgeRuleChainIds.contains(connectedRuleChain)) { + RuleChain ruleChainById = ruleChainService.findRuleChainById(tenantId, connectedRuleChain); + missingRuleChains.add(ruleChainById.getName()); + } + } + if (!missingRuleChains.isEmpty()) { + ArrayNode array = mapper.createArrayNode(); + for (String missingRuleChain : missingRuleChains) { + array.add(missingRuleChain); + } + result.set(edgeRuleChain.getName(), array); + } + } + } + return result.toString(); + } + + private List findEdgeRuleChains(TenantId tenantId, EdgeId edgeId) { + List result = new ArrayList<>(); + TimePageLink pageLink = new TimePageLink(DEFAULT_LIMIT); + TimePageData pageData; + try { + do { + pageData = ruleChainService.findRuleChainsByTenantIdAndEdgeId(tenantId, edgeId, pageLink).get(); + if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) { + result.addAll(pageData.getData()); + if (pageData.hasNext()) { + pageLink = pageData.getNextPageLink(); + } + } + } while (pageData != null && pageData.hasNext()); + } catch (Exception e) { + log.error("[{}] Can't find edge rule chains [{}]", tenantId, edgeId, e); + } + return result; + } + private void initRestTemplate() { boolean jdkHttpClientEnabled = isNotEmpty(System.getProperty("tb.proxy.jdk")) && System.getProperty("tb.proxy.jdk").equalsIgnoreCase("true"); boolean systemProxyEnabled = isNotEmpty(System.getProperty("tb.proxy.system")) && System.getProperty("tb.proxy.system").equalsIgnoreCase("true"); diff --git a/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java b/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java index fdde79359d..cf214016d9 100644 --- a/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java +++ b/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java @@ -2384,7 +2384,9 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable { } public void syncEdge(EdgeId edgeId) { - restTemplate.postForEntity(baseURL + "/api/edge/sync", edgeId, EdgeId.class); + Map params = new HashMap<>(); + params.put("edgeId", edgeId.toString()); + restTemplate.postForEntity(baseURL + "/api/edge/sync/{edgeId}", null, EdgeId.class, params); } @Deprecated diff --git a/ui/src/app/api/edge.service.js b/ui/src/app/api/edge.service.js index e8abec1fd9..f5e43f7ef5 100644 --- a/ui/src/app/api/edge.service.js +++ b/ui/src/app/api/edge.service.js @@ -297,8 +297,8 @@ function EdgeService($http, $q, customerService) { function syncEdge(edgeId) { var deferred = $q.defer(); - var url = '/api/edge/sync'; - $http.post(url, edgeId).then(function success(response) { + var url = '/api/edge/sync/' + edgeId; + $http.post(url, null).then(function success(response) { deferred.resolve(response); }, function fail(response) { deferred.reject(response.data); diff --git a/ui/src/app/edge/edge.directive.js b/ui/src/app/edge/edge.directive.js index bdd3b44b67..e306a4d5d2 100644 --- a/ui/src/app/edge/edge.directive.js +++ b/ui/src/app/edge/edge.directive.js @@ -70,7 +70,7 @@ export default function EdgeDirective($compile, $templateCache, $translate, $mdD }; scope.onEdgeSync = function (edgeId) { - edgeService.syncEdge(edgeId).then( + edgeService.syncEdge(edgeId.id).then( function success() { toast.showSuccess($translate.instant('edge.sync-message'), 750, angular.element(element).parent().parent(), 'bottom left'); }, From af3a3683875fb07916ac79ac8a3f8c37181fe0c1 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Thu, 24 Dec 2020 14:45:37 +0200 Subject: [PATCH 4/4] Fixed sync test --- .../thingsboard/server/controller/BaseEdgeControllerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/src/test/java/org/thingsboard/server/controller/BaseEdgeControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseEdgeControllerTest.java index 16338584af..2340e822ac 100644 --- a/application/src/test/java/org/thingsboard/server/controller/BaseEdgeControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseEdgeControllerTest.java @@ -682,7 +682,7 @@ public abstract class BaseEdgeControllerTest extends AbstractControllerTest { edgeImitator.getDownlinkMsgs().clear(); edgeImitator.expectMessageAmount(4); - doPost("/api/edge/sync", edge.getId()); + doPost("/api/edge/sync/" + edge.getId()); edgeImitator.waitForMessages(); Assert.assertEquals(4, edgeImitator.getDownlinkMsgs().size());