Commit 59abb2bcf3ce76572a569a07ff41283a4f7ea4a2

Authored by Artem Babak
2 parents 633de573 af3a3683

Merge with origin develop/2.6-edge

Showing 26 changed files with 311 additions and 236 deletions
... ... @@ -92,10 +92,10 @@ public class EdgeController extends BaseController {
92 92 edge.setTenantId(tenantId);
93 93 boolean created = edge.getId() == null;
94 94
95   - RuleChain defaultRootEdgeRuleChain = null;
  95 + RuleChain edgeTemplateRootRuleChain = null;
96 96 if (created) {
97   - defaultRootEdgeRuleChain = ruleChainService.getDefaultRootEdgeRuleChain(tenantId);
98   - if (defaultRootEdgeRuleChain == null) {
  97 + edgeTemplateRootRuleChain = ruleChainService.getEdgeTemplateRootRuleChain(tenantId);
  98 + if (edgeTemplateRootRuleChain == null) {
99 99 throw new DataValidationException("Root edge rule chain is not available!");
100 100 }
101 101 }
... ... @@ -108,8 +108,8 @@ public class EdgeController extends BaseController {
108 108 Edge savedEdge = checkNotNull(edgeService.saveEdge(edge));
109 109
110 110 if (created) {
111   - ruleChainService.assignRuleChainToEdge(tenantId, defaultRootEdgeRuleChain.getId(), savedEdge.getId());
112   - edgeNotificationService.setEdgeRootRuleChain(tenantId, savedEdge, defaultRootEdgeRuleChain.getId());
  111 + ruleChainService.assignRuleChainToEdge(tenantId, edgeTemplateRootRuleChain.getId(), savedEdge.getId());
  112 + edgeNotificationService.setEdgeRootRuleChain(tenantId, savedEdge, edgeTemplateRootRuleChain.getId());
113 113 edgeService.assignDefaultRuleChainsToEdge(tenantId, savedEdge.getId());
114 114 }
115 115
... ... @@ -389,10 +389,12 @@ public class EdgeController extends BaseController {
389 389 checkNotNull(query.getEdgeTypes());
390 390 checkEntityId(query.getParameters().getEntityId(), Operation.READ);
391 391 try {
392   - List<Edge> edges = checkNotNull(edgeService.findEdgesByQuery(getCurrentUser().getTenantId(), query).get());
  392 + SecurityUser user = getCurrentUser();
  393 + TenantId tenantId = user.getTenantId();
  394 + List<Edge> edges = checkNotNull(edgeService.findEdgesByQuery(tenantId, query).get());
393 395 edges = edges.stream().filter(edge -> {
394 396 try {
395   - accessControlService.checkPermission(getCurrentUser(), Resource.EDGE, Operation.READ, edge.getId(), edge);
  397 + accessControlService.checkPermission(user, Resource.EDGE, Operation.READ, edge.getId(), edge);
396 398 return true;
397 399 } catch (ThingsboardException e) {
398 400 return false;
... ... @@ -419,14 +421,18 @@ public class EdgeController extends BaseController {
419 421 }
420 422
421 423 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
422   - @RequestMapping(value = "/edge/sync", method = RequestMethod.POST)
423   - public void syncEdge(@RequestBody EdgeId edgeId) throws ThingsboardException {
  424 + @RequestMapping(value = "/edge/sync/{edgeId}", method = RequestMethod.POST)
  425 + public void syncEdge(@PathVariable("edgeId") String strEdgeId) throws ThingsboardException {
  426 + checkParameter("edgeId", strEdgeId);
424 427 try {
425   - edgeId = checkNotNull(edgeId);
426 428 if (isEdgesEnabled()) {
427   - EdgeGrpcSession session = edgeGrpcService.getEdgeGrpcSessionById(edgeId);
  429 + EdgeId edgeId = new EdgeId(toUUID(strEdgeId));
  430 + edgeId = checkNotNull(edgeId);
  431 + SecurityUser user = getCurrentUser();
  432 + TenantId tenantId = user.getTenantId();
  433 + EdgeGrpcSession session = edgeGrpcService.getEdgeGrpcSessionById(tenantId, edgeId);
428 434 Edge edge = session.getEdge();
429   - syncEdgeService.sync(edge);
  435 + syncEdgeService.sync(tenantId, edge);
430 436 } else {
431 437 throw new ThingsboardException("Edges support disabled", ThingsboardErrorCode.GENERAL);
432 438 }
... ... @@ -455,4 +461,19 @@ public class EdgeController extends BaseController {
455 461 throw new ThingsboardException(e, ThingsboardErrorCode.SUBSCRIPTION_VIOLATION);
456 462 }
457 463 }
  464 +
  465 + @PreAuthorize("hasAuthority('TENANT_ADMIN')")
  466 + @RequestMapping(value = "/edge/missingToRelatedRuleChains/{edgeId}", method = RequestMethod.GET)
  467 + @ResponseBody
  468 + public String findMissingToRelatedRuleChains(@PathVariable("edgeId") String strEdgeId) throws ThingsboardException {
  469 + try {
  470 + EdgeId edgeId = new EdgeId(toUUID(strEdgeId));
  471 + edgeId = checkNotNull(edgeId);
  472 + SecurityUser user = getCurrentUser();
  473 + TenantId tenantId = user.getTenantId();
  474 + return edgeService.findMissingToRelatedRuleChains(tenantId, edgeId);
  475 + } catch (Exception e) {
  476 + throw handleException(e);
  477 + }
  478 + }
458 479 }
... ...
... ... @@ -495,14 +495,14 @@ public class RuleChainController extends BaseController {
495 495 }
496 496
497 497 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
498   - @RequestMapping(value = "/ruleChain/{ruleChainId}/defaultRootEdge", method = RequestMethod.POST)
  498 + @RequestMapping(value = "/ruleChain/{ruleChainId}/edgeTemplateRoot", method = RequestMethod.POST)
499 499 @ResponseBody
500   - public RuleChain setDefaultRootEdgeRuleChain(@PathVariable(RULE_CHAIN_ID) String strRuleChainId) throws ThingsboardException {
  500 + public RuleChain setEdgeTemplateRootRuleChain(@PathVariable(RULE_CHAIN_ID) String strRuleChainId) throws ThingsboardException {
501 501 checkParameter(RULE_CHAIN_ID, strRuleChainId);
502 502 try {
503 503 RuleChainId ruleChainId = new RuleChainId(toUUID(strRuleChainId));
504 504 RuleChain ruleChain = checkRuleChain(ruleChainId, Operation.WRITE);
505   - ruleChainService.setDefaultRootEdgeRuleChain(getTenantId(), ruleChainId);
  505 + ruleChainService.setEdgeTemplateRootRuleChain(getTenantId(), ruleChainId);
506 506 return ruleChain;
507 507 } catch (Exception e) {
508 508 logEntityAction(emptyId(EntityType.RULE_CHAIN),
... ... @@ -514,14 +514,14 @@ public class RuleChainController extends BaseController {
514 514 }
515 515
516 516 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
517   - @RequestMapping(value = "/ruleChain/{ruleChainId}/defaultEdge", method = RequestMethod.POST)
  517 + @RequestMapping(value = "/ruleChain/{ruleChainId}/autoAssignToEdge", method = RequestMethod.POST)
518 518 @ResponseBody
519   - public RuleChain addDefaultEdgeRuleChain(@PathVariable(RULE_CHAIN_ID) String strRuleChainId) throws ThingsboardException {
  519 + public RuleChain setAutoAssignToEdgeRuleChain(@PathVariable(RULE_CHAIN_ID) String strRuleChainId) throws ThingsboardException {
520 520 checkParameter(RULE_CHAIN_ID, strRuleChainId);
521 521 try {
522 522 RuleChainId ruleChainId = new RuleChainId(toUUID(strRuleChainId));
523 523 RuleChain ruleChain = checkRuleChain(ruleChainId, Operation.WRITE);
524   - ruleChainService.addDefaultEdgeRuleChain(getTenantId(), ruleChainId);
  524 + ruleChainService.setAutoAssignToEdgeRuleChain(getTenantId(), ruleChainId);
525 525 return ruleChain;
526 526 } catch (Exception e) {
527 527 logEntityAction(emptyId(EntityType.RULE_CHAIN),
... ... @@ -533,14 +533,14 @@ public class RuleChainController extends BaseController {
533 533 }
534 534
535 535 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
536   - @RequestMapping(value = "/ruleChain/{ruleChainId}/defaultEdge", method = RequestMethod.DELETE)
  536 + @RequestMapping(value = "/ruleChain/{ruleChainId}/autoAssignToEdge", method = RequestMethod.DELETE)
537 537 @ResponseBody
538   - public RuleChain removeDefaultEdgeRuleChain(@PathVariable(RULE_CHAIN_ID) String strRuleChainId) throws ThingsboardException {
  538 + public RuleChain unsetAutoAssignToEdgeRuleChain(@PathVariable(RULE_CHAIN_ID) String strRuleChainId) throws ThingsboardException {
539 539 checkParameter(RULE_CHAIN_ID, strRuleChainId);
540 540 try {
541 541 RuleChainId ruleChainId = new RuleChainId(toUUID(strRuleChainId));
542 542 RuleChain ruleChain = checkRuleChain(ruleChainId, Operation.WRITE);
543   - ruleChainService.removeDefaultEdgeRuleChain(getTenantId(), ruleChainId);
  543 + ruleChainService.unsetAutoAssignToEdgeRuleChain(getTenantId(), ruleChainId);
544 544 return ruleChain;
545 545 } catch (Exception e) {
546 546 logEntityAction(emptyId(EntityType.RULE_CHAIN),
... ... @@ -552,12 +552,12 @@ public class RuleChainController extends BaseController {
552 552 }
553 553
554 554 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
555   - @RequestMapping(value = "/ruleChain/defaultEdgeRuleChains", method = RequestMethod.GET)
  555 + @RequestMapping(value = "/ruleChain/autoAssignToEdgeRuleChains", method = RequestMethod.GET)
556 556 @ResponseBody
557   - public List<RuleChain> getDefaultEdgeRuleChains() throws ThingsboardException {
  557 + public List<RuleChain> getAutoAssignToEdgeRuleChains() throws ThingsboardException {
558 558 try {
559 559 TenantId tenantId = getCurrentUser().getTenantId();
560   - return checkNotNull(ruleChainService.findDefaultEdgeRuleChainsByTenantId(tenantId)).get();
  560 + return checkNotNull(ruleChainService.findAutoAssignToEdgeRuleChainsByTenantId(tenantId)).get();
561 561 } catch (Exception e) {
562 562 throw handleException(e);
563 563 }
... ...
... ... @@ -114,11 +114,6 @@ public class DefaultEdgeNotificationService implements EdgeNotificationService {
114 114 }
115 115
116 116 @Override
117   - public TimePageData<EdgeEvent> findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink) {
118   - return edgeEventService.findEdgeEvents(tenantId, edgeId, pageLink, true);
119   - }
120   -
121   - @Override
122 117 public Edge setEdgeRootRuleChain(TenantId tenantId, Edge edge, RuleChainId ruleChainId) throws IOException {
123 118 edge.setRootRuleChainId(ruleChainId);
124 119 Edge savedEdge = edgeService.saveEdge(edge);
... ...
... ... @@ -28,6 +28,7 @@ import org.thingsboard.server.dao.customer.CustomerService;
28 28 import org.thingsboard.server.dao.dashboard.DashboardService;
29 29 import org.thingsboard.server.dao.device.DeviceCredentialsService;
30 30 import org.thingsboard.server.dao.device.DeviceService;
  31 +import org.thingsboard.server.dao.edge.EdgeEventService;
31 32 import org.thingsboard.server.dao.edge.EdgeService;
32 33 import org.thingsboard.server.dao.entityview.EntityViewService;
33 34 import org.thingsboard.server.dao.relation.RelationService;
... ... @@ -74,7 +75,7 @@ public class EdgeContextComponent {
74 75
75 76 @Lazy
76 77 @Autowired
77   - private EdgeNotificationService edgeNotificationService;
  78 + private EdgeEventService edgeEventService;
78 79
79 80 @Lazy
80 81 @Autowired
... ...
... ... @@ -15,14 +15,9 @@
15 15 */
16 16 package org.thingsboard.server.service.edge;
17 17
18   -import org.thingsboard.server.common.data.Event;
19 18 import org.thingsboard.server.common.data.edge.Edge;
20   -import org.thingsboard.server.common.data.edge.EdgeEvent;
21   -import org.thingsboard.server.common.data.id.EdgeId;
22 19 import org.thingsboard.server.common.data.id.RuleChainId;
23 20 import org.thingsboard.server.common.data.id.TenantId;
24   -import org.thingsboard.server.common.data.page.TimePageData;
25   -import org.thingsboard.server.common.data.page.TimePageLink;
26 21 import org.thingsboard.server.common.msg.queue.TbCallback;
27 22 import org.thingsboard.server.gen.transport.TransportProtos;
28 23
... ... @@ -30,8 +25,6 @@ import java.io.IOException;
30 25
31 26 public interface EdgeNotificationService {
32 27
33   - TimePageData<EdgeEvent> findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink);
34   -
35 28 Edge setEdgeRootRuleChain(TenantId tenantId, Edge edge, RuleChainId ruleChainId) throws IOException;
36 29
37 30 void pushNotificationToEdge(TransportProtos.EdgeNotificationMsgProto edgeNotificationMsg, TbCallback callback);
... ...
... ... @@ -28,6 +28,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
28 28 import org.springframework.stereotype.Service;
29 29 import org.thingsboard.common.util.ThingsBoardThreadFactory;
30 30 import org.thingsboard.server.common.data.DataConstants;
  31 +import org.thingsboard.server.common.data.Tenant;
31 32 import org.thingsboard.server.common.data.edge.Edge;
32 33 import org.thingsboard.server.common.data.id.EdgeId;
33 34 import org.thingsboard.server.common.data.id.TenantId;
... ... @@ -186,11 +187,12 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase i
186 187 scheduleEdgeEventsCheck(edgeGrpcSession);
187 188 }
188 189
189   - public EdgeGrpcSession getEdgeGrpcSessionById(EdgeId edgeId) {
  190 + public EdgeGrpcSession getEdgeGrpcSessionById(TenantId tenantId, EdgeId edgeId) {
190 191 EdgeGrpcSession session = sessions.get(edgeId);
191 192 if (session != null && session.isConnected()) {
192 193 return session;
193 194 } else {
  195 + log.error("[{}] Edge is not connected [{}]", tenantId, edgeId);
194 196 throw new RuntimeException("Edge is not connected");
195 197 }
196 198 }
... ...
... ... @@ -160,11 +160,12 @@ public final class EdgeGrpcSession implements Closeable {
160 160 .build());
161 161 if (ConnectResponseCode.ACCEPTED != responseMsg.getResponseCode()) {
162 162 outputStream.onError(new RuntimeException(responseMsg.getErrorMsg()));
  163 + } else {
  164 + connected = true;
163 165 }
164 166 }
165   - if (!connected && requestMsg.getMsgType().equals(RequestMsgType.SYNC_REQUEST_RPC_MESSAGE)) {
166   - connected = true;
167   - ctx.getSyncEdgeService().sync(edge);
  167 + if (connected && requestMsg.getMsgType().equals(RequestMsgType.SYNC_REQUEST_RPC_MESSAGE)) {
  168 + ctx.getSyncEdgeService().sync(edge.getTenantId(), edge);
168 169 }
169 170 if (connected) {
170 171 if (requestMsg.getMsgType().equals(RequestMsgType.UPLINK_RPC_MESSAGE) && requestMsg.hasUplinkMsg()) {
... ... @@ -266,7 +267,7 @@ public final class EdgeGrpcSession implements Closeable {
266 267 UUID ifOffset = null;
267 268 boolean success = true;
268 269 do {
269   - pageData = ctx.getEdgeNotificationService().findEdgeEvents(edge.getTenantId(), edge.getId(), pageLink);
  270 + pageData = ctx.getEdgeEventService().findEdgeEvents(edge.getTenantId(), edge.getId(), pageLink, true);
270 271 if (isConnected() && !pageData.getData().isEmpty()) {
271 272 log.trace("[{}] [{}] event(s) are going to be processed.", this.sessionId, pageData.getData().size());
272 273 List<DownlinkMsg> downlinkMsgsPack = convertToDownlinkMsgsPack(pageData.getData());
... ... @@ -898,27 +899,27 @@ public final class EdgeGrpcSession implements Closeable {
898 899 }
899 900 if (uplinkMsg.getRuleChainMetadataRequestMsgList() != null && !uplinkMsg.getRuleChainMetadataRequestMsgList().isEmpty()) {
900 901 for (RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg : uplinkMsg.getRuleChainMetadataRequestMsgList()) {
901   - result.add(ctx.getSyncEdgeService().processRuleChainMetadataRequestMsg(edge, ruleChainMetadataRequestMsg));
  902 + result.add(ctx.getSyncEdgeService().processRuleChainMetadataRequestMsg(edge.getTenantId(), edge, ruleChainMetadataRequestMsg));
902 903 }
903 904 }
904 905 if (uplinkMsg.getAttributesRequestMsgList() != null && !uplinkMsg.getAttributesRequestMsgList().isEmpty()) {
905 906 for (AttributesRequestMsg attributesRequestMsg : uplinkMsg.getAttributesRequestMsgList()) {
906   - result.add(ctx.getSyncEdgeService().processAttributesRequestMsg(edge, attributesRequestMsg));
  907 + result.add(ctx.getSyncEdgeService().processAttributesRequestMsg(edge.getTenantId(), edge, attributesRequestMsg));
907 908 }
908 909 }
909 910 if (uplinkMsg.getRelationRequestMsgList() != null && !uplinkMsg.getRelationRequestMsgList().isEmpty()) {
910 911 for (RelationRequestMsg relationRequestMsg : uplinkMsg.getRelationRequestMsgList()) {
911   - result.add(ctx.getSyncEdgeService().processRelationRequestMsg(edge, relationRequestMsg));
  912 + result.add(ctx.getSyncEdgeService().processRelationRequestMsg(edge.getTenantId(), edge, relationRequestMsg));
912 913 }
913 914 }
914 915 if (uplinkMsg.getUserCredentialsRequestMsgList() != null && !uplinkMsg.getUserCredentialsRequestMsgList().isEmpty()) {
915 916 for (UserCredentialsRequestMsg userCredentialsRequestMsg : uplinkMsg.getUserCredentialsRequestMsgList()) {
916   - result.add(ctx.getSyncEdgeService().processUserCredentialsRequestMsg(edge, userCredentialsRequestMsg));
  917 + result.add(ctx.getSyncEdgeService().processUserCredentialsRequestMsg(edge.getTenantId(), edge, userCredentialsRequestMsg));
917 918 }
918 919 }
919 920 if (uplinkMsg.getDeviceCredentialsRequestMsgList() != null && !uplinkMsg.getDeviceCredentialsRequestMsgList().isEmpty()) {
920 921 for (DeviceCredentialsRequestMsg deviceCredentialsRequestMsg : uplinkMsg.getDeviceCredentialsRequestMsgList()) {
921   - result.add(ctx.getSyncEdgeService().processDeviceCredentialsRequestMsg(edge, deviceCredentialsRequestMsg));
  922 + result.add(ctx.getSyncEdgeService().processDeviceCredentialsRequestMsg(edge.getTenantId(), edge, deviceCredentialsRequestMsg));
922 923 }
923 924 }
924 925 if (uplinkMsg.getDeviceRpcCallMsgList() != null && !uplinkMsg.getDeviceRpcCallMsgList().isEmpty()) {
... ...
... ... @@ -33,7 +33,6 @@ import org.springframework.core.io.DefaultResourceLoader;
33 33 import org.springframework.stereotype.Service;
34 34 import org.thingsboard.server.common.data.AdminSettings;
35 35 import org.thingsboard.server.common.data.DashboardInfo;
36   -import org.thingsboard.server.common.data.DataConstants;
37 36 import org.thingsboard.server.common.data.Device;
38 37 import org.thingsboard.server.common.data.EdgeUtils;
39 38 import org.thingsboard.server.common.data.EntityType;
... ... @@ -146,37 +145,37 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
146 145 private TbClusterService tbClusterService;
147 146
148 147 @Override
149   - public void sync(Edge edge) {
150   - log.trace("[{}][{}] Staring edge sync process", edge.getTenantId(), edge.getId());
  148 + public void sync(TenantId tenantId, Edge edge) {
  149 + log.trace("[{}][{}] Staring edge sync process", tenantId, edge.getId());
151 150 try {
152   - syncWidgetsBundleAndWidgetTypes(edge);
153   - syncAdminSettings(edge);
154   - syncRuleChains(edge, new TimePageLink(DEFAULT_LIMIT));
155   - syncUsers(edge, new TextPageLink(DEFAULT_LIMIT));
156   - syncDevices(edge, new TimePageLink(DEFAULT_LIMIT));
157   - syncAssets(edge, new TimePageLink(DEFAULT_LIMIT));
158   - syncEntityViews(edge, new TimePageLink(DEFAULT_LIMIT));
159   - syncDashboards(edge, new TimePageLink(DEFAULT_LIMIT));
  151 + syncWidgetsBundleAndWidgetTypes(tenantId, edge);
  152 + syncAdminSettings(tenantId, edge);
  153 + syncRuleChains(tenantId, edge, new TimePageLink(DEFAULT_LIMIT));
  154 + syncUsers(tenantId, edge, new TextPageLink(DEFAULT_LIMIT));
  155 + syncDevices(tenantId, edge, new TimePageLink(DEFAULT_LIMIT));
  156 + syncAssets(tenantId, edge, new TimePageLink(DEFAULT_LIMIT));
  157 + syncEntityViews(tenantId, edge, new TimePageLink(DEFAULT_LIMIT));
  158 + syncDashboards(tenantId, edge, new TimePageLink(DEFAULT_LIMIT));
160 159 } catch (Exception e) {
161   - log.error("[{}][{}] Exception during sync process", edge.getTenantId(), edge.getId(), e);
  160 + log.error("[{}][{}] Exception during sync process", tenantId, edge.getId(), e);
162 161 }
163 162 }
164 163
165   - private void syncRuleChains(Edge edge, TimePageLink pageLink) {
166   - log.trace("[{}] syncRuleChains [{}] [{}]", edge.getTenantId(), edge.getName(), pageLink);
  164 + private void syncRuleChains(TenantId tenantId, Edge edge, TimePageLink pageLink) {
  165 + log.trace("[{}] syncRuleChains [{}] [{}]", tenantId, edge.getName(), pageLink);
167 166 try {
168 167 ListenableFuture<TimePageData<RuleChain>> future =
169   - ruleChainService.findRuleChainsByTenantIdAndEdgeId(edge.getTenantId(), edge.getId(), pageLink);
  168 + ruleChainService.findRuleChainsByTenantIdAndEdgeId(tenantId, edge.getId(), pageLink);
170 169 Futures.addCallback(future, new FutureCallback<TimePageData<RuleChain>>() {
171 170 @Override
172 171 public void onSuccess(@Nullable TimePageData<RuleChain> pageData) {
173 172 if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) {
174 173 log.trace("[{}] [{}] rule chains(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size());
175 174 for (RuleChain ruleChain : pageData.getData()) {
176   - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.RULE_CHAIN, EdgeEventActionType.ADDED, ruleChain.getId(), null);
  175 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.RULE_CHAIN, EdgeEventActionType.ADDED, ruleChain.getId(), null);
177 176 }
178 177 if (pageData.hasNext()) {
179   - syncRuleChains(edge, pageData.getNextPageLink());
  178 + syncRuleChains(tenantId, edge, pageData.getNextPageLink());
180 179 }
181 180 }
182 181 }
... ... @@ -191,21 +190,21 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
191 190 }
192 191 }
193 192
194   - private void syncDevices(Edge edge, TimePageLink pageLink) {
195   - log.trace("[{}] syncDevices [{}]", edge.getTenantId(), edge.getName());
  193 + private void syncDevices(TenantId tenantId, Edge edge, TimePageLink pageLink) {
  194 + log.trace("[{}] syncDevices [{}]", tenantId, edge.getName());
196 195 try {
197 196 ListenableFuture<TimePageData<Device>> future =
198   - deviceService.findDevicesByTenantIdAndEdgeId(edge.getTenantId(), edge.getId(), pageLink);
  197 + deviceService.findDevicesByTenantIdAndEdgeId(tenantId, edge.getId(), pageLink);
199 198 Futures.addCallback(future, new FutureCallback<TimePageData<Device>>() {
200 199 @Override
201 200 public void onSuccess(@Nullable TimePageData<Device> pageData) {
202 201 if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) {
203 202 log.trace("[{}] [{}] device(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size());
204 203 for (Device device : pageData.getData()) {
205   - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.DEVICE, EdgeEventActionType.ADDED, device.getId(), null);
  204 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.DEVICE, EdgeEventActionType.ADDED, device.getId(), null);
206 205 }
207 206 if (pageData.hasNext()) {
208   - syncDevices(edge, pageData.getNextPageLink());
  207 + syncDevices(tenantId, edge, pageData.getNextPageLink());
209 208 }
210 209 }
211 210 }
... ... @@ -220,20 +219,20 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
220 219 }
221 220 }
222 221
223   - private void syncAssets(Edge edge, TimePageLink pageLink) {
224   - log.trace("[{}] syncAssets [{}]", edge.getTenantId(), edge.getName());
  222 + private void syncAssets(TenantId tenantId, Edge edge, TimePageLink pageLink) {
  223 + log.trace("[{}] syncAssets [{}]", tenantId, edge.getName());
225 224 try {
226   - ListenableFuture<TimePageData<Asset>> future = assetService.findAssetsByTenantIdAndEdgeId(edge.getTenantId(), edge.getId(), pageLink);
  225 + ListenableFuture<TimePageData<Asset>> future = assetService.findAssetsByTenantIdAndEdgeId(tenantId, edge.getId(), pageLink);
227 226 Futures.addCallback(future, new FutureCallback<TimePageData<Asset>>() {
228 227 @Override
229 228 public void onSuccess(@Nullable TimePageData<Asset> pageData) {
230 229 if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) {
231 230 log.trace("[{}] [{}] asset(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size());
232 231 for (Asset asset : pageData.getData()) {
233   - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.ASSET, EdgeEventActionType.ADDED, asset.getId(), null);
  232 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ASSET, EdgeEventActionType.ADDED, asset.getId(), null);
234 233 }
235 234 if (pageData.hasNext()) {
236   - syncAssets(edge, pageData.getNextPageLink());
  235 + syncAssets(tenantId, edge, pageData.getNextPageLink());
237 236 }
238 237 }
239 238 }
... ... @@ -248,20 +247,20 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
248 247 }
249 248 }
250 249
251   - private void syncEntityViews(Edge edge, TimePageLink pageLink) {
252   - log.trace("[{}] syncEntityViews [{}]", edge.getTenantId(), edge.getName());
  250 + private void syncEntityViews(TenantId tenantId, Edge edge, TimePageLink pageLink) {
  251 + log.trace("[{}] syncEntityViews [{}]", tenantId, edge.getName());
253 252 try {
254   - ListenableFuture<TimePageData<EntityView>> future = entityViewService.findEntityViewsByTenantIdAndEdgeId(edge.getTenantId(), edge.getId(), pageLink);
  253 + ListenableFuture<TimePageData<EntityView>> future = entityViewService.findEntityViewsByTenantIdAndEdgeId(tenantId, edge.getId(), pageLink);
255 254 Futures.addCallback(future, new FutureCallback<TimePageData<EntityView>>() {
256 255 @Override
257 256 public void onSuccess(@Nullable TimePageData<EntityView> pageData) {
258 257 if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) {
259 258 log.trace("[{}] [{}] entity view(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size());
260 259 for (EntityView entityView : pageData.getData()) {
261   - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.ENTITY_VIEW, EdgeEventActionType.ADDED, entityView.getId(), null);
  260 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ENTITY_VIEW, EdgeEventActionType.ADDED, entityView.getId(), null);
262 261 }
263 262 if (pageData.hasNext()) {
264   - syncEntityViews(edge, pageData.getNextPageLink());
  263 + syncEntityViews(tenantId, edge, pageData.getNextPageLink());
265 264 }
266 265 }
267 266 }
... ... @@ -276,20 +275,20 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
276 275 }
277 276 }
278 277
279   - private void syncDashboards(Edge edge, TimePageLink pageLink) {
280   - log.trace("[{}] syncDashboards [{}]", edge.getTenantId(), edge.getName());
  278 + private void syncDashboards(TenantId tenantId, Edge edge, TimePageLink pageLink) {
  279 + log.trace("[{}] syncDashboards [{}]", tenantId, edge.getName());
281 280 try {
282   - ListenableFuture<TimePageData<DashboardInfo>> future = dashboardService.findDashboardsByTenantIdAndEdgeId(edge.getTenantId(), edge.getId(), pageLink);
  281 + ListenableFuture<TimePageData<DashboardInfo>> future = dashboardService.findDashboardsByTenantIdAndEdgeId(tenantId, edge.getId(), pageLink);
283 282 Futures.addCallback(future, new FutureCallback<TimePageData<DashboardInfo>>() {
284 283 @Override
285 284 public void onSuccess(@Nullable TimePageData<DashboardInfo> pageData) {
286 285 if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) {
287 286 log.trace("[{}] [{}] dashboard(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size());
288 287 for (DashboardInfo dashboardInfo : pageData.getData()) {
289   - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.DASHBOARD, EdgeEventActionType.ADDED, dashboardInfo.getId(), null);
  288 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.DASHBOARD, EdgeEventActionType.ADDED, dashboardInfo.getId(), null);
290 289 }
291 290 if (pageData.hasNext()) {
292   - syncDashboards(edge, pageData.getNextPageLink());
  291 + syncDashboards(tenantId, edge, pageData.getNextPageLink());
293 292 }
294 293 }
295 294 }
... ... @@ -304,31 +303,31 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
304 303 }
305 304 }
306 305
307   - private void syncUsers(Edge edge, TextPageLink pageLink) {
308   - log.trace("[{}] syncUsers [{}]", edge.getTenantId(), edge.getName());
  306 + private void syncUsers(TenantId tenantId, Edge edge, TextPageLink pageLink) {
  307 + log.trace("[{}] syncUsers [{}]", tenantId, edge.getName());
309 308 try {
310 309 TextPageData<User> pageData;
311 310 do {
312   - pageData = userService.findTenantAdmins(edge.getTenantId(), pageLink);
313   - pushUsersToEdge(pageData, edge);
  311 + pageData = userService.findTenantAdmins(tenantId, pageLink);
  312 + pushUsersToEdge(tenantId, pageData, edge);
314 313 if (pageData != null && pageData.hasNext()) {
315 314 pageLink = pageData.getNextPageLink();
316 315 }
317 316 } while (pageData != null && pageData.hasNext());
318   - syncCustomerUsers(edge);
  317 + syncCustomerUsers(tenantId, edge);
319 318 } catch (Exception e) {
320 319 log.error("Exception during loading edge user(s) on sync!", e);
321 320 }
322 321 }
323 322
324   - private void syncCustomerUsers(Edge edge) {
  323 + private void syncCustomerUsers(TenantId tenantId, Edge edge) {
325 324 if (edge.getCustomerId() != null && !EntityId.NULL_UUID.equals(edge.getCustomerId().getId())) {
326   - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.CUSTOMER, EdgeEventActionType.ADDED, edge.getCustomerId(), null);
  325 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.CUSTOMER, EdgeEventActionType.ADDED, edge.getCustomerId(), null);
327 326 TextPageLink pageLink = new TextPageLink(DEFAULT_LIMIT);
328 327 TextPageData<User> pageData;
329 328 do {
330   - pageData = userService.findCustomerUsers(edge.getTenantId(), edge.getCustomerId(), pageLink);
331   - pushUsersToEdge(pageData, edge);
  329 + pageData = userService.findCustomerUsers(tenantId, edge.getCustomerId(), pageLink);
  330 + pushUsersToEdge(tenantId, pageData, edge);
332 331 if (pageData != null && pageData.hasNext()) {
333 332 pageLink = pageData.getNextPageLink();
334 333 }
... ... @@ -336,45 +335,45 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
336 335 }
337 336 }
338 337
339   - private void pushUsersToEdge(TextPageData<User> pageData, Edge edge) {
  338 + private void pushUsersToEdge(TenantId tenantId, TextPageData<User> pageData, Edge edge) {
340 339 if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) {
341 340 log.trace("[{}] [{}] user(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size());
342 341 for (User user : pageData.getData()) {
343   - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.USER, EdgeEventActionType.ADDED, user.getId(), null);
  342 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.USER, EdgeEventActionType.ADDED, user.getId(), null);
344 343 }
345 344 }
346 345 }
347 346
348   - private void syncWidgetsBundleAndWidgetTypes(Edge edge) {
349   - log.trace("[{}] syncWidgetsBundleAndWidgetTypes [{}]", edge.getTenantId(), edge.getName());
  347 + private void syncWidgetsBundleAndWidgetTypes(TenantId tenantId, Edge edge) {
  348 + log.trace("[{}] syncWidgetsBundleAndWidgetTypes [{}]", tenantId, edge.getName());
350 349 List<WidgetsBundle> widgetsBundlesToPush = new ArrayList<>();
351 350 List<WidgetType> widgetTypesToPush = new ArrayList<>();
352   - widgetsBundlesToPush.addAll(widgetsBundleService.findAllTenantWidgetsBundlesByTenantId(edge.getTenantId()));
353   - widgetsBundlesToPush.addAll(widgetsBundleService.findSystemWidgetsBundles(edge.getTenantId()));
  351 + widgetsBundlesToPush.addAll(widgetsBundleService.findAllTenantWidgetsBundlesByTenantId(tenantId));
  352 + widgetsBundlesToPush.addAll(widgetsBundleService.findSystemWidgetsBundles(tenantId));
354 353 try {
355 354 for (WidgetsBundle widgetsBundle: widgetsBundlesToPush) {
356   - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.WIDGETS_BUNDLE, EdgeEventActionType.ADDED, widgetsBundle.getId(), null);
  355 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.WIDGETS_BUNDLE, EdgeEventActionType.ADDED, widgetsBundle.getId(), null);
357 356 widgetTypesToPush.addAll(widgetTypeService.findWidgetTypesByTenantIdAndBundleAlias(widgetsBundle.getTenantId(), widgetsBundle.getAlias()));
358 357 }
359 358 for (WidgetType widgetType: widgetTypesToPush) {
360   - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.WIDGET_TYPE, EdgeEventActionType.ADDED, widgetType.getId(), null);
  359 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.WIDGET_TYPE, EdgeEventActionType.ADDED, widgetType.getId(), null);
361 360 }
362 361 } catch (Exception e) {
363 362 log.error("Exception during loading widgets bundle(s) and widget type(s) on sync!", e);
364 363 }
365 364 }
366 365
367   - private void syncAdminSettings(Edge edge) {
368   - log.trace("[{}] syncAdminSettings [{}]", edge.getTenantId(), edge.getName());
  366 + private void syncAdminSettings(TenantId tenantId, Edge edge) {
  367 + log.trace("[{}] syncAdminSettings [{}]", tenantId, edge.getName());
369 368 try {
370 369 AdminSettings systemMailSettings = adminSettingsService.findAdminSettingsByKey(TenantId.SYS_TENANT_ID, "mail");
371   - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(systemMailSettings));
  370 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(systemMailSettings));
372 371 AdminSettings tenantMailSettings = convertToTenantAdminSettings(systemMailSettings.getKey(), (ObjectNode) systemMailSettings.getJsonValue());
373   - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(tenantMailSettings));
  372 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(tenantMailSettings));
374 373 AdminSettings systemMailTemplates = loadMailTemplates();
375   - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(systemMailTemplates));
  374 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(systemMailTemplates));
376 375 AdminSettings tenantMailTemplates = convertToTenantAdminSettings(systemMailTemplates.getKey(), (ObjectNode) systemMailTemplates.getJsonValue());
377   - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(tenantMailTemplates));
  376 + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(tenantMailTemplates));
378 377 } catch (Exception e) {
379 378 log.error("Can't load admin settings", e);
380 379 }
... ... @@ -433,13 +432,13 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
433 432 }
434 433
435 434 @Override
436   - public ListenableFuture<Void> processRuleChainMetadataRequestMsg(Edge edge, RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg) {
437   - log.trace("[{}] processRuleChainMetadataRequestMsg [{}][{}]", edge.getTenantId(), edge.getName(), ruleChainMetadataRequestMsg);
  435 + public ListenableFuture<Void> processRuleChainMetadataRequestMsg(TenantId tenantId, Edge edge, RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg) {
  436 + log.trace("[{}] processRuleChainMetadataRequestMsg [{}][{}]", tenantId, edge.getName(), ruleChainMetadataRequestMsg);
438 437 SettableFuture<Void> futureToSet = SettableFuture.create();
439 438 if (ruleChainMetadataRequestMsg.getRuleChainIdMSB() != 0 && ruleChainMetadataRequestMsg.getRuleChainIdLSB() != 0) {
440 439 RuleChainId ruleChainId =
441 440 new RuleChainId(new UUID(ruleChainMetadataRequestMsg.getRuleChainIdMSB(), ruleChainMetadataRequestMsg.getRuleChainIdLSB()));
442   - ListenableFuture<EdgeEvent> future = saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.RULE_CHAIN_METADATA, EdgeEventActionType.ADDED, ruleChainId, null);
  441 + ListenableFuture<EdgeEvent> future = saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.RULE_CHAIN_METADATA, EdgeEventActionType.ADDED, ruleChainId, null);
443 442 Futures.addCallback(future, new FutureCallback<EdgeEvent>() {
444 443 @Override
445 444 public void onSuccess(@Nullable EdgeEvent result) {
... ... @@ -457,8 +456,8 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
457 456 }
458 457
459 458 @Override
460   - public ListenableFuture<Void> processAttributesRequestMsg(Edge edge, AttributesRequestMsg attributesRequestMsg) {
461   - log.trace("[{}] processAttributesRequestMsg [{}][{}]", edge.getTenantId(), edge.getName(), attributesRequestMsg);
  459 + public ListenableFuture<Void> processAttributesRequestMsg(TenantId tenantId, Edge edge, AttributesRequestMsg attributesRequestMsg) {
  460 + log.trace("[{}] processAttributesRequestMsg [{}][{}]", tenantId, edge.getName(), attributesRequestMsg);
462 461 EntityId entityId = EntityIdFactory.getByTypeAndUuid(
463 462 EntityType.valueOf(attributesRequestMsg.getEntityType()),
464 463 new UUID(attributesRequestMsg.getEntityIdMSB(), attributesRequestMsg.getEntityIdLSB()));
... ... @@ -466,7 +465,7 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
466 465 if (type != null) {
467 466 SettableFuture<Void> futureToSet = SettableFuture.create();
468 467 String scope = attributesRequestMsg.getScope();
469   - ListenableFuture<List<AttributeKvEntry>> ssAttrFuture = attributesService.findAll(edge.getTenantId(), entityId, scope);
  468 + ListenableFuture<List<AttributeKvEntry>> ssAttrFuture = attributesService.findAll(tenantId, entityId, scope);
470 469 Futures.addCallback(ssAttrFuture, new FutureCallback<List<AttributeKvEntry>>() {
471 470 @Override
472 471 public void onSuccess(@Nullable List<AttributeKvEntry> ssAttributes) {
... ... @@ -489,7 +488,7 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
489 488 entityData.put("scope", scope);
490 489 JsonNode body = mapper.valueToTree(entityData);
491 490 log.debug("Sending attributes data msg, entityId [{}], attributes [{}]", entityId, body);
492   - saveEdgeEvent(edge.getTenantId(),
  491 + saveEdgeEvent(tenantId,
493 492 edge.getId(),
494 493 type,
495 494 EdgeEventActionType.ATTRIBUTES_UPDATED,
... ... @@ -500,7 +499,7 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
500 499 throw new RuntimeException("[" + edge.getName() + "] Failed to send attribute updates to the edge", e);
501 500 }
502 501 } else {
503   - log.trace("[{}][{}] No attributes found for entity {} [{}]", edge.getTenantId(),
  502 + log.trace("[{}][{}] No attributes found for entity {} [{}]", tenantId,
504 503 edge.getName(),
505 504 entityId.getEntityType(),
506 505 entityId.getId());
... ... @@ -516,21 +515,21 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
516 515 }, dbCallbackExecutorService);
517 516 return futureToSet;
518 517 } else {
519   - log.warn("[{}] Type doesn't supported {}", edge.getTenantId(), entityId.getEntityType());
  518 + log.warn("[{}] Type doesn't supported {}", tenantId, entityId.getEntityType());
520 519 return Futures.immediateFuture(null);
521 520 }
522 521 }
523 522
524 523 @Override
525   - public ListenableFuture<Void> processRelationRequestMsg(Edge edge, RelationRequestMsg relationRequestMsg) {
526   - log.trace("[{}] processRelationRequestMsg [{}][{}]", edge.getTenantId(), edge.getName(), relationRequestMsg);
  524 + public ListenableFuture<Void> processRelationRequestMsg(TenantId tenantId, Edge edge, RelationRequestMsg relationRequestMsg) {
  525 + log.trace("[{}] processRelationRequestMsg [{}][{}]", tenantId, edge.getName(), relationRequestMsg);
527 526 EntityId entityId = EntityIdFactory.getByTypeAndUuid(
528 527 EntityType.valueOf(relationRequestMsg.getEntityType()),
529 528 new UUID(relationRequestMsg.getEntityIdMSB(), relationRequestMsg.getEntityIdLSB()));
530 529
531 530 List<ListenableFuture<List<EntityRelation>>> futures = new ArrayList<>();
532   - futures.add(findRelationByQuery(edge, entityId, EntitySearchDirection.FROM));
533   - futures.add(findRelationByQuery(edge, entityId, EntitySearchDirection.TO));
  531 + futures.add(findRelationByQuery(tenantId, edge, entityId, EntitySearchDirection.FROM));
  532 + futures.add(findRelationByQuery(tenantId, edge, entityId, EntitySearchDirection.TO));
534 533 ListenableFuture<List<List<EntityRelation>>> relationsListFuture = Futures.allAsList(futures);
535 534 SettableFuture<Void> futureToSet = SettableFuture.create();
536 535 Futures.addCallback(relationsListFuture, new FutureCallback<List<List<EntityRelation>>>() {
... ... @@ -544,7 +543,7 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
544 543 try {
545 544 if (!relation.getFrom().getEntityType().equals(EntityType.EDGE) &&
546 545 !relation.getTo().getEntityType().equals(EntityType.EDGE)) {
547   - saveEdgeEvent(edge.getTenantId(),
  546 + saveEdgeEvent(tenantId,
548 547 edge.getId(),
549 548 EdgeEventType.RELATION,
550 549 EdgeEventActionType.ADDED,
... ... @@ -568,26 +567,26 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
568 567
569 568 @Override
570 569 public void onFailure(Throwable t) {
571   - log.error("[{}] Can't find relation by query. Entity id [{}]", edge.getTenantId(), entityId, t);
  570 + log.error("[{}] Can't find relation by query. Entity id [{}]", tenantId, entityId, t);
572 571 futureToSet.setException(t);
573 572 }
574 573 }, dbCallbackExecutorService);
575 574 return futureToSet;
576 575 }
577 576
578   - private ListenableFuture<List<EntityRelation>> findRelationByQuery(Edge edge, EntityId entityId, EntitySearchDirection direction) {
  577 + private ListenableFuture<List<EntityRelation>> findRelationByQuery(TenantId tenantId, Edge edge, EntityId entityId, EntitySearchDirection direction) {
579 578 EntityRelationsQuery query = new EntityRelationsQuery();
580 579 query.setParameters(new RelationsSearchParameters(entityId, direction, -1, false));
581   - return relationService.findByQuery(edge.getTenantId(), query);
  580 + return relationService.findByQuery(tenantId, query);
582 581 }
583 582
584 583 @Override
585   - public ListenableFuture<Void> processDeviceCredentialsRequestMsg(Edge edge, DeviceCredentialsRequestMsg deviceCredentialsRequestMsg) {
586   - log.trace("[{}] processDeviceCredentialsRequestMsg [{}][{}]", edge.getTenantId(), edge.getName(), deviceCredentialsRequestMsg);
  584 + public ListenableFuture<Void> processDeviceCredentialsRequestMsg(TenantId tenantId, Edge edge, DeviceCredentialsRequestMsg deviceCredentialsRequestMsg) {
  585 + log.trace("[{}] processDeviceCredentialsRequestMsg [{}][{}]", tenantId, edge.getName(), deviceCredentialsRequestMsg);
587 586 SettableFuture<Void> futureToSet = SettableFuture.create();
588 587 if (deviceCredentialsRequestMsg.getDeviceIdMSB() != 0 && deviceCredentialsRequestMsg.getDeviceIdLSB() != 0) {
589 588 DeviceId deviceId = new DeviceId(new UUID(deviceCredentialsRequestMsg.getDeviceIdMSB(), deviceCredentialsRequestMsg.getDeviceIdLSB()));
590   - ListenableFuture<EdgeEvent> future = saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.DEVICE, EdgeEventActionType.CREDENTIALS_UPDATED, deviceId, null);
  589 + ListenableFuture<EdgeEvent> future = saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.DEVICE, EdgeEventActionType.CREDENTIALS_UPDATED, deviceId, null);
591 590 Futures.addCallback(future, new FutureCallback<EdgeEvent>() {
592 591 @Override
593 592 public void onSuccess(@Nullable EdgeEvent result) {
... ... @@ -605,12 +604,12 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
605 604 }
606 605
607 606 @Override
608   - public ListenableFuture<Void> processUserCredentialsRequestMsg(Edge edge, UserCredentialsRequestMsg userCredentialsRequestMsg) {
609   - log.trace("[{}] processUserCredentialsRequestMsg [{}][{}]", edge.getTenantId(), edge.getName(), userCredentialsRequestMsg);
  607 + public ListenableFuture<Void> processUserCredentialsRequestMsg(TenantId tenantId, Edge edge, UserCredentialsRequestMsg userCredentialsRequestMsg) {
  608 + log.trace("[{}] processUserCredentialsRequestMsg [{}][{}]", tenantId, edge.getName(), userCredentialsRequestMsg);
610 609 SettableFuture<Void> futureToSet = SettableFuture.create();
611 610 if (userCredentialsRequestMsg.getUserIdMSB() != 0 && userCredentialsRequestMsg.getUserIdLSB() != 0) {
612 611 UserId userId = new UserId(new UUID(userCredentialsRequestMsg.getUserIdMSB(), userCredentialsRequestMsg.getUserIdLSB()));
613   - ListenableFuture<EdgeEvent> future = saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.USER, EdgeEventActionType.CREDENTIALS_UPDATED, userId, null);
  612 + ListenableFuture<EdgeEvent> future = saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.USER, EdgeEventActionType.CREDENTIALS_UPDATED, userId, null);
614 613 Futures.addCallback(future, new FutureCallback<EdgeEvent>() {
615 614 @Override
616 615 public void onSuccess(@Nullable EdgeEvent result) {
... ...
... ... @@ -17,6 +17,7 @@ package org.thingsboard.server.service.edge.rpc.init;
17 17
18 18 import com.google.common.util.concurrent.ListenableFuture;
19 19 import org.thingsboard.server.common.data.edge.Edge;
  20 +import org.thingsboard.server.common.data.id.TenantId;
20 21 import org.thingsboard.server.gen.edge.AttributesRequestMsg;
21 22 import org.thingsboard.server.gen.edge.DeviceCredentialsRequestMsg;
22 23 import org.thingsboard.server.gen.edge.RelationRequestMsg;
... ... @@ -25,15 +26,15 @@ import org.thingsboard.server.gen.edge.UserCredentialsRequestMsg;
25 26
26 27 public interface SyncEdgeService {
27 28
28   - void sync(Edge edge);
  29 + void sync(TenantId tenantId, Edge edge);
29 30
30   - ListenableFuture<Void> processRuleChainMetadataRequestMsg(Edge edge, RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg);
  31 + ListenableFuture<Void> processRuleChainMetadataRequestMsg(TenantId tenantId, Edge edge, RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg);
31 32
32   - ListenableFuture<Void> processAttributesRequestMsg(Edge edge, AttributesRequestMsg attributesRequestMsg);
  33 + ListenableFuture<Void> processAttributesRequestMsg(TenantId tenantId, Edge edge, AttributesRequestMsg attributesRequestMsg);
33 34
34   - ListenableFuture<Void> processRelationRequestMsg(Edge edge, RelationRequestMsg relationRequestMsg);
  35 + ListenableFuture<Void> processRelationRequestMsg(TenantId tenantId, Edge edge, RelationRequestMsg relationRequestMsg);
35 36
36   - ListenableFuture<Void> processDeviceCredentialsRequestMsg(Edge edge, DeviceCredentialsRequestMsg deviceCredentialsRequestMsg);
  37 + ListenableFuture<Void> processDeviceCredentialsRequestMsg(TenantId tenantId, Edge edge, DeviceCredentialsRequestMsg deviceCredentialsRequestMsg);
37 38
38   - ListenableFuture<Void> processUserCredentialsRequestMsg(Edge edge, UserCredentialsRequestMsg userCredentialsRequestMsg);
  39 + ListenableFuture<Void> processUserCredentialsRequestMsg(TenantId tenantId, Edge edge, UserCredentialsRequestMsg userCredentialsRequestMsg);
39 40 }
... ...
... ... @@ -89,7 +89,7 @@ public class DefaultDataUpdateService implements DataUpdateService {
89 89 @Override
90 90 protected void updateEntity(Tenant tenant) {
91 91 try {
92   - RuleChain defaultEdgeRuleChain = ruleChainService.getDefaultRootEdgeRuleChain(tenant.getId());
  92 + RuleChain defaultEdgeRuleChain = ruleChainService.getEdgeTemplateRootRuleChain(tenant.getId());
93 93 if (defaultEdgeRuleChain == null) {
94 94 installScripts.createDefaultEdgeRuleChains(tenant.getId());
95 95 }
... ...
... ... @@ -682,7 +682,7 @@ public abstract class BaseEdgeControllerTest extends AbstractControllerTest {
682 682 edgeImitator.getDownlinkMsgs().clear();
683 683
684 684 edgeImitator.expectMessageAmount(4);
685   - doPost("/api/edge/sync", edge.getId());
  685 + doPost("/api/edge/sync/" + edge.getId());
686 686 edgeImitator.waitForMessages();
687 687
688 688 Assert.assertEquals(4, edgeImitator.getDownlinkMsgs().size());
... ...
... ... @@ -80,4 +80,6 @@ public interface EdgeService {
80 80 Object checkInstance(Object request);
81 81
82 82 Object activateInstance(String licenseSecret, String releaseDate);
  83 +
  84 + String findMissingToRelatedRuleChains(TenantId tenantId, EdgeId edgeId);
83 85 }
... ...
... ... @@ -73,14 +73,14 @@ public interface RuleChainService {
73 73
74 74 ListenableFuture<TimePageData<RuleChain>> findRuleChainsByTenantIdAndEdgeId(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink);
75 75
76   - RuleChain getDefaultRootEdgeRuleChain(TenantId tenantId);
  76 + RuleChain getEdgeTemplateRootRuleChain(TenantId tenantId);
77 77
78   - boolean setDefaultRootEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId);
  78 + boolean setEdgeTemplateRootRuleChain(TenantId tenantId, RuleChainId ruleChainId);
79 79
80   - boolean addDefaultEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId);
  80 + boolean setAutoAssignToEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId);
81 81
82   - boolean removeDefaultEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId);
  82 + boolean unsetAutoAssignToEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId);
83 83
84   - ListenableFuture<List<RuleChain>> findDefaultEdgeRuleChainsByTenantId(TenantId tenantId);
  84 + ListenableFuture<List<RuleChain>> findAutoAssignToEdgeRuleChainsByTenantId(TenantId tenantId);
85 85
86 86 }
... ...
... ... @@ -23,6 +23,6 @@ public enum RelationTypeGroup {
23 23 RULE_CHAIN,
24 24 RULE_NODE,
25 25 EDGE,
26   - EDGE_DEFAULT_RULE_CHAIN
  26 + EDGE_AUTO_ASSIGN_RULE_CHAIN
27 27
28 28 }
... ...
... ... @@ -15,6 +15,9 @@
15 15 */
16 16 package org.thingsboard.server.dao.edge;
17 17
  18 +import com.fasterxml.jackson.databind.ObjectMapper;
  19 +import com.fasterxml.jackson.databind.node.ArrayNode;
  20 +import com.fasterxml.jackson.databind.node.ObjectNode;
18 21 import com.google.common.base.Function;
19 22 import com.google.common.util.concurrent.FutureCallback;
20 23 import com.google.common.util.concurrent.Futures;
... ... @@ -54,10 +57,13 @@ import org.thingsboard.server.common.data.id.TenantId;
54 57 import org.thingsboard.server.common.data.id.UserId;
55 58 import org.thingsboard.server.common.data.page.TextPageData;
56 59 import org.thingsboard.server.common.data.page.TextPageLink;
  60 +import org.thingsboard.server.common.data.page.TimePageData;
  61 +import org.thingsboard.server.common.data.page.TimePageLink;
57 62 import org.thingsboard.server.common.data.relation.EntityRelation;
58 63 import org.thingsboard.server.common.data.relation.EntitySearchDirection;
59 64 import org.thingsboard.server.common.data.relation.RelationTypeGroup;
60 65 import org.thingsboard.server.common.data.rule.RuleChain;
  66 +import org.thingsboard.server.common.data.rule.RuleChainConnectionInfo;
61 67 import org.thingsboard.server.dao.customer.CustomerDao;
62 68 import org.thingsboard.server.dao.entity.AbstractEntityService;
63 69 import org.thingsboard.server.dao.exception.DataValidationException;
... ... @@ -100,6 +106,8 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic
100 106 public static final String INCORRECT_CUSTOMER_ID = "Incorrect customerId ";
101 107 public static final String INCORRECT_EDGE_ID = "Incorrect edgeId ";
102 108
  109 + private static final ObjectMapper mapper = new ObjectMapper();
  110 +
103 111 private static final int DEFAULT_LIMIT = 100;
104 112
105 113 private RestTemplate restTemplate;
... ... @@ -340,7 +348,7 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic
340 348 @Override
341 349 public void assignDefaultRuleChainsToEdge(TenantId tenantId, EdgeId edgeId) {
342 350 log.trace("Executing assignDefaultRuleChainsToEdge, tenantId [{}], edgeId [{}]", tenantId, edgeId);
343   - ListenableFuture<List<RuleChain>> future = ruleChainService.findDefaultEdgeRuleChainsByTenantId(tenantId);
  351 + ListenableFuture<List<RuleChain>> future = ruleChainService.findAutoAssignToEdgeRuleChainsByTenantId(tenantId);
344 352 Futures.addCallback(future, new FutureCallback<List<RuleChain>>() {
345 353 @Override
346 354 public void onSuccess(List<RuleChain> ruleChains) {
... ... @@ -575,6 +583,56 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic
575 583 return this.restTemplate.postForEntity(EDGE_LICENSE_SERVER_ENDPOINT + "/api/license/activateInstance?licenseSecret={licenseSecret}&releaseDate={releaseDate}", (Object) null, Object.class, params);
576 584 }
577 585
  586 + @Override
  587 + public String findMissingToRelatedRuleChains(TenantId tenantId, EdgeId edgeId) {
  588 + List<RuleChain> edgeRuleChains = findEdgeRuleChains(tenantId, edgeId);
  589 + List<RuleChainId> edgeRuleChainIds = edgeRuleChains.stream().map(IdBased::getId).collect(Collectors.toList());
  590 + ObjectNode result = mapper.createObjectNode();
  591 + for (RuleChain edgeRuleChain : edgeRuleChains) {
  592 + List<RuleChainConnectionInfo> connectionInfos =
  593 + ruleChainService.loadRuleChainMetaData(edgeRuleChain.getTenantId(), edgeRuleChain.getId()).getRuleChainConnections();
  594 + if (connectionInfos != null && !connectionInfos.isEmpty()) {
  595 + List<RuleChainId> connectedRuleChains =
  596 + connectionInfos.stream().map(RuleChainConnectionInfo::getTargetRuleChainId).collect(Collectors.toList());
  597 + List<String> missingRuleChains = new ArrayList<>();
  598 + for (RuleChainId connectedRuleChain : connectedRuleChains) {
  599 + if (!edgeRuleChainIds.contains(connectedRuleChain)) {
  600 + RuleChain ruleChainById = ruleChainService.findRuleChainById(tenantId, connectedRuleChain);
  601 + missingRuleChains.add(ruleChainById.getName());
  602 + }
  603 + }
  604 + if (!missingRuleChains.isEmpty()) {
  605 + ArrayNode array = mapper.createArrayNode();
  606 + for (String missingRuleChain : missingRuleChains) {
  607 + array.add(missingRuleChain);
  608 + }
  609 + result.set(edgeRuleChain.getName(), array);
  610 + }
  611 + }
  612 + }
  613 + return result.toString();
  614 + }
  615 +
  616 + private List<RuleChain> findEdgeRuleChains(TenantId tenantId, EdgeId edgeId) {
  617 + List<RuleChain> result = new ArrayList<>();
  618 + TimePageLink pageLink = new TimePageLink(DEFAULT_LIMIT);
  619 + TimePageData<RuleChain> pageData;
  620 + try {
  621 + do {
  622 + pageData = ruleChainService.findRuleChainsByTenantIdAndEdgeId(tenantId, edgeId, pageLink).get();
  623 + if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) {
  624 + result.addAll(pageData.getData());
  625 + if (pageData.hasNext()) {
  626 + pageLink = pageData.getNextPageLink();
  627 + }
  628 + }
  629 + } while (pageData != null && pageData.hasNext());
  630 + } catch (Exception e) {
  631 + log.error("[{}] Can't find edge rule chains [{}]", tenantId, edgeId, e);
  632 + }
  633 + return result;
  634 + }
  635 +
578 636 private void initRestTemplate() {
579 637 boolean jdkHttpClientEnabled = isNotEmpty(System.getProperty("tb.proxy.jdk")) && System.getProperty("tb.proxy.jdk").equalsIgnoreCase("true");
580 638 boolean systemProxyEnabled = isNotEmpty(System.getProperty("tb.proxy.system")) && System.getProperty("tb.proxy.system").equalsIgnoreCase("true");
... ...
... ... @@ -484,21 +484,21 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC
484 484 }
485 485
486 486 @Override
487   - public RuleChain getDefaultRootEdgeRuleChain(TenantId tenantId) {
  487 + public RuleChain getEdgeTemplateRootRuleChain(TenantId tenantId) {
488 488 return getRootRuleChainByType(tenantId, RuleChainType.EDGE);
489 489 }
490 490
491 491 @Override
492   - public boolean setDefaultRootEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId) {
  492 + public boolean setEdgeTemplateRootRuleChain(TenantId tenantId, RuleChainId ruleChainId) {
493 493 RuleChain ruleChain = ruleChainDao.findById(tenantId, ruleChainId.getId());
494   - RuleChain previousDefaultRootEdgeRuleChain = getDefaultRootEdgeRuleChain(ruleChain.getTenantId());
495   - if (previousDefaultRootEdgeRuleChain == null || !previousDefaultRootEdgeRuleChain.getId().equals(ruleChain.getId())) {
  494 + RuleChain previousEdgeTemplateRootRuleChain = getEdgeTemplateRootRuleChain(ruleChain.getTenantId());
  495 + if (previousEdgeTemplateRootRuleChain == null || !previousEdgeTemplateRootRuleChain.getId().equals(ruleChain.getId())) {
496 496 try {
497   - if (previousDefaultRootEdgeRuleChain != null) {
498   - deleteRelation(tenantId, new EntityRelation(previousDefaultRootEdgeRuleChain.getTenantId(), previousDefaultRootEdgeRuleChain.getId(),
  497 + if (previousEdgeTemplateRootRuleChain != null) {
  498 + deleteRelation(tenantId, new EntityRelation(previousEdgeTemplateRootRuleChain.getTenantId(), previousEdgeTemplateRootRuleChain.getId(),
499 499 EntityRelation.CONTAINS_TYPE, RelationTypeGroup.RULE_CHAIN));
500   - previousDefaultRootEdgeRuleChain.setRoot(false);
501   - ruleChainDao.save(tenantId, previousDefaultRootEdgeRuleChain);
  500 + previousEdgeTemplateRootRuleChain.setRoot(false);
  501 + ruleChainDao.save(tenantId, previousEdgeTemplateRootRuleChain);
502 502 }
503 503 createRelation(tenantId, new EntityRelation(ruleChain.getTenantId(), ruleChain.getId(),
504 504 EntityRelation.CONTAINS_TYPE, RelationTypeGroup.RULE_CHAIN));
... ... @@ -506,7 +506,7 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC
506 506 ruleChainDao.save(tenantId, ruleChain);
507 507 return true;
508 508 } catch (Exception e) {
509   - log.warn("Failed to set default root edge rule chain, ruleChainId: [{}]", ruleChainId, e);
  509 + log.warn("Failed to set edge template root rule chain, ruleChainId: [{}]", ruleChainId, e);
510 510 throw new RuntimeException(e);
511 511 }
512 512 }
... ... @@ -514,34 +514,34 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC
514 514 }
515 515
516 516 @Override
517   - public boolean addDefaultEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId) {
  517 + public boolean setAutoAssignToEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId) {
518 518 try {
519 519 createRelation(tenantId, new EntityRelation(tenantId, ruleChainId,
520   - EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_DEFAULT_RULE_CHAIN));
  520 + EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_AUTO_ASSIGN_RULE_CHAIN));
521 521 return true;
522 522 } catch (Exception e) {
523   - log.warn("Failed to add default edge rule chain, ruleChainId: [{}]", ruleChainId, e);
  523 + log.warn("Failed to set auto assign to edge rule chain, ruleChainId: [{}]", ruleChainId, e);
524 524 throw new RuntimeException(e);
525 525 }
526 526 }
527 527
528 528 @Override
529   - public boolean removeDefaultEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId) {
  529 + public boolean unsetAutoAssignToEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId) {
530 530 try {
531 531 deleteRelation(tenantId, new EntityRelation(tenantId, ruleChainId,
532   - EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_DEFAULT_RULE_CHAIN));
  532 + EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_AUTO_ASSIGN_RULE_CHAIN));
533 533 return true;
534 534 } catch (Exception e) {
535   - log.warn("Failed to remove default edge rule chain, ruleChainId: [{}]", ruleChainId, e);
  535 + log.warn("Failed to unset auto assign to edge rule chain, ruleChainId: [{}]", ruleChainId, e);
536 536 throw new RuntimeException(e);
537 537 }
538 538 }
539 539
540 540 @Override
541   - public ListenableFuture<List<RuleChain>> findDefaultEdgeRuleChainsByTenantId(TenantId tenantId) {
542   - log.trace("Executing findDefaultEdgeRuleChainsByTenantId, tenantId [{}]", tenantId);
  541 + public ListenableFuture<List<RuleChain>> findAutoAssignToEdgeRuleChainsByTenantId(TenantId tenantId) {
  542 + log.trace("Executing findAutoAssignToEdgeRuleChainsByTenantId, tenantId [{}]", tenantId);
543 543 validateId(tenantId, INCORRECT_TENANT_ID + tenantId);
544   - return ruleChainDao.findDefaultEdgeRuleChainsByTenantId(tenantId.getId());
  544 + return ruleChainDao.findAutoAssignToEdgeRuleChainsByTenantId(tenantId.getId());
545 545 }
546 546
547 547
... ... @@ -592,9 +592,9 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC
592 592 }
593 593 }
594 594 if (ruleChain.isRoot() && RuleChainType.EDGE.equals(ruleChain.getType())) {
595   - RuleChain defaultRootEdgeRuleChain = getDefaultRootEdgeRuleChain(ruleChain.getTenantId());
596   - if (defaultRootEdgeRuleChain != null && !defaultRootEdgeRuleChain.getId().equals(ruleChain.getId())) {
597   - throw new DataValidationException("Another default root edge rule chain is present in scope of current tenant!");
  595 + RuleChain edgeTemplateRootRuleChain = getEdgeTemplateRootRuleChain(ruleChain.getTenantId());
  596 + if (edgeTemplateRootRuleChain != null && !edgeTemplateRootRuleChain.getId().equals(ruleChain.getId())) {
  597 + throw new DataValidationException("Another edge template root rule chain is present in scope of current tenant!");
598 598 }
599 599 }
600 600 }
... ...
... ... @@ -103,9 +103,10 @@ public class CassandraRuleChainDao extends CassandraAbstractSearchTextDao<RuleCh
103 103 }
104 104
105 105 @Override
106   - public ListenableFuture<List<RuleChain>> findDefaultEdgeRuleChainsByTenantId(UUID tenantId) {
107   - log.debug("Try to find default edge rule chains by tenantId [{}]", tenantId);
108   - ListenableFuture<List<EntityRelation>> relations = relationDao.findAllByFromAndType(new TenantId(tenantId), new TenantId(tenantId), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_DEFAULT_RULE_CHAIN);
  106 + public ListenableFuture<List<RuleChain>> findAutoAssignToEdgeRuleChainsByTenantId(UUID tenantId) {
  107 + log.debug("Try to find auto assign to edge rule chains by tenantId [{}]", tenantId);
  108 + ListenableFuture<List<EntityRelation>> relations =
  109 + relationDao.findAllByFromAndType(new TenantId(tenantId), new TenantId(tenantId), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_AUTO_ASSIGN_RULE_CHAIN);
109 110 return Futures.transformAsync(relations, input -> {
110 111 List<ListenableFuture<RuleChain>> ruleChainFutures = new ArrayList<>(input.size());
111 112 for (EntityRelation relation : input) {
... ...
... ... @@ -60,10 +60,10 @@ public interface RuleChainDao extends Dao<RuleChain> {
60 60 ListenableFuture<List<RuleChain>> findRuleChainsByTenantIdAndEdgeId(UUID tenantId, UUID edgeId, TimePageLink pageLink);
61 61
62 62 /**
63   - * Find default edge rule chains by tenantId.
  63 + * Find auto assign to edge rule chains by tenantId.
64 64 *
65 65 * @param tenantId the tenantId
66 66 * @return the list of rule chain objects
67 67 */
68   - ListenableFuture<List<RuleChain>> findDefaultEdgeRuleChainsByTenantId(UUID tenantId);
  68 + ListenableFuture<List<RuleChain>> findAutoAssignToEdgeRuleChainsByTenantId(UUID tenantId);
69 69 }
... ...
... ... @@ -25,9 +25,7 @@ import org.springframework.data.repository.CrudRepository;
25 25 import org.springframework.stereotype.Component;
26 26 import org.thingsboard.server.common.data.EntityType;
27 27 import org.thingsboard.server.common.data.UUIDConverter;
28   -import org.thingsboard.server.common.data.edge.Edge;
29 28 import org.thingsboard.server.common.data.id.EdgeId;
30   -import org.thingsboard.server.common.data.id.RuleChainId;
31 29 import org.thingsboard.server.common.data.id.TenantId;
32 30 import org.thingsboard.server.common.data.page.TextPageLink;
33 31 import org.thingsboard.server.common.data.page.TimePageLink;
... ... @@ -107,9 +105,10 @@ public class JpaRuleChainDao extends JpaAbstractSearchTextDao<RuleChainEntity, R
107 105 }
108 106
109 107 @Override
110   - public ListenableFuture<List<RuleChain>> findDefaultEdgeRuleChainsByTenantId(UUID tenantId) {
111   - log.debug("Try to find default edge rule chains by tenantId [{}]", tenantId);
112   - ListenableFuture<List<EntityRelation>> relations = relationDao.findAllByFromAndType(new TenantId(tenantId), new TenantId(tenantId), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_DEFAULT_RULE_CHAIN);
  108 + public ListenableFuture<List<RuleChain>> findAutoAssignToEdgeRuleChainsByTenantId(UUID tenantId) {
  109 + log.debug("Try to find auto assign to edge rule chains by tenantId [{}]", tenantId);
  110 + ListenableFuture<List<EntityRelation>> relations =
  111 + relationDao.findAllByFromAndType(new TenantId(tenantId), new TenantId(tenantId), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_AUTO_ASSIGN_RULE_CHAIN);
113 112 return Futures.transformAsync(relations, input -> {
114 113 List<ListenableFuture<RuleChain>> ruleChainsFutures = new ArrayList<>(input.size());
115 114 for (EntityRelation relation : input) {
... ...
... ... @@ -331,24 +331,24 @@ public abstract class BaseRuleChainServiceTest extends AbstractServiceTest {
331 331
332 332 @Test
333 333 public void testGetDefaultEdgeRuleChains() throws Exception {
334   - RuleChainId ruleChainId = saveRuleChainAndSetDefaultEdge("Default Edge Rule Chain 1");
335   - saveRuleChainAndSetDefaultEdge("Default Edge Rule Chain 2");
336   - List<RuleChain> result = ruleChainService.findDefaultEdgeRuleChainsByTenantId(tenantId).get();
  334 + RuleChainId ruleChainId = saveRuleChainAndSetAutoAssignToEdge("Default Edge Rule Chain 1");
  335 + saveRuleChainAndSetAutoAssignToEdge("Default Edge Rule Chain 2");
  336 + List<RuleChain> result = ruleChainService.findAutoAssignToEdgeRuleChainsByTenantId(tenantId).get();
337 337 Assert.assertEquals(2, result.size());
338 338
339   - ruleChainService.removeDefaultEdgeRuleChain(tenantId, ruleChainId);
  339 + ruleChainService.unsetAutoAssignToEdgeRuleChain(tenantId, ruleChainId);
340 340
341   - result = ruleChainService.findDefaultEdgeRuleChainsByTenantId(tenantId).get();
  341 + result = ruleChainService.findAutoAssignToEdgeRuleChainsByTenantId(tenantId).get();
342 342 Assert.assertEquals(1, result.size());
343 343 }
344 344
345 345 @Test
346   - public void setDefaultRootEdgeRuleChain() throws Exception {
347   - RuleChainId ruleChainId1 = saveRuleChainAndSetDefaultEdge("Default Edge Rule Chain 1");
348   - RuleChainId ruleChainId2 = saveRuleChainAndSetDefaultEdge("Default Edge Rule Chain 2");
  346 + public void setEdgeTemplateRootRuleChain() throws Exception {
  347 + RuleChainId ruleChainId1 = saveRuleChainAndSetAutoAssignToEdge("Default Edge Rule Chain 1");
  348 + RuleChainId ruleChainId2 = saveRuleChainAndSetAutoAssignToEdge("Default Edge Rule Chain 2");
349 349
350   - ruleChainService.setDefaultRootEdgeRuleChain(tenantId, ruleChainId1);
351   - ruleChainService.setDefaultRootEdgeRuleChain(tenantId, ruleChainId2);
  350 + ruleChainService.setEdgeTemplateRootRuleChain(tenantId, ruleChainId1);
  351 + ruleChainService.setEdgeTemplateRootRuleChain(tenantId, ruleChainId2);
352 352
353 353 RuleChain ruleChainById = ruleChainService.findRuleChainById(tenantId, ruleChainId1);
354 354 Assert.assertFalse(ruleChainById.isRoot());
... ... @@ -357,13 +357,13 @@ public abstract class BaseRuleChainServiceTest extends AbstractServiceTest {
357 357 Assert.assertTrue(ruleChainById.isRoot());
358 358 }
359 359
360   - private RuleChainId saveRuleChainAndSetDefaultEdge(String name) {
  360 + private RuleChainId saveRuleChainAndSetAutoAssignToEdge(String name) {
361 361 RuleChain edgeRuleChain = new RuleChain();
362 362 edgeRuleChain.setTenantId(tenantId);
363 363 edgeRuleChain.setType(RuleChainType.EDGE);
364 364 edgeRuleChain.setName(name);
365 365 RuleChain savedEdgeRuleChain = ruleChainService.saveRuleChain(edgeRuleChain);
366   - ruleChainService.addDefaultEdgeRuleChain(tenantId, savedEdgeRuleChain.getId());
  366 + ruleChainService.setAutoAssignToEdgeRuleChain(tenantId, savedEdgeRuleChain.getId());
367 367 return savedEdgeRuleChain.getId();
368 368 }
369 369
... ...
... ... @@ -2262,9 +2262,9 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable {
2262 2262 }, params).getBody();
2263 2263 }
2264 2264
2265   - public Optional<RuleChain> addDefaultEdgeRuleChain(RuleChainId ruleChainId) {
  2265 + public Optional<RuleChain> setAutoAssignToEdgeRuleChain(RuleChainId ruleChainId) {
2266 2266 try {
2267   - ResponseEntity<RuleChain> ruleChain = restTemplate.postForEntity(baseURL + "/api/ruleChain/{ruleChainId}/defaultEdge", null, RuleChain.class, ruleChainId.getId());
  2267 + ResponseEntity<RuleChain> ruleChain = restTemplate.postForEntity(baseURL + "/api/ruleChain/{ruleChainId}/autoAssignToEdge", null, RuleChain.class, ruleChainId.getId());
2268 2268 return Optional.ofNullable(ruleChain.getBody());
2269 2269 } catch (HttpClientErrorException exception) {
2270 2270 if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
... ... @@ -2275,9 +2275,9 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable {
2275 2275 }
2276 2276 }
2277 2277
2278   - public Optional<RuleChain> removeDefaultEdgeRuleChain(RuleChainId ruleChainId) {
  2278 + public Optional<RuleChain> unsetAutoAssignToEdgeRuleChain(RuleChainId ruleChainId) {
2279 2279 try {
2280   - ResponseEntity<RuleChain> ruleChain = restTemplate.exchange(baseURL + "/api/ruleChain/{ruleChainId}/defaultEdge", HttpMethod.DELETE, HttpEntity.EMPTY, RuleChain.class, ruleChainId.getId());
  2280 + ResponseEntity<RuleChain> ruleChain = restTemplate.exchange(baseURL + "/api/ruleChain/{ruleChainId}/autoAssignToEdge", HttpMethod.DELETE, HttpEntity.EMPTY, RuleChain.class, ruleChainId.getId());
2281 2281 return Optional.ofNullable(ruleChain.getBody());
2282 2282 } catch (HttpClientErrorException exception) {
2283 2283 if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
... ... @@ -2288,17 +2288,17 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable {
2288 2288 }
2289 2289 }
2290 2290
2291   - public List<RuleChain> getDefaultEdgeRuleChains() {
2292   - return restTemplate.exchange(baseURL + "/api/ruleChain/defaultEdgeRuleChains",
  2291 + public List<RuleChain> getAutoAssignToEdgeRuleChains() {
  2292 + return restTemplate.exchange(baseURL + "/api/ruleChain/autoAssignToEdgeRuleChains",
2293 2293 HttpMethod.GET,
2294 2294 HttpEntity.EMPTY,
2295 2295 new ParameterizedTypeReference<List<RuleChain>>() {
2296 2296 }).getBody();
2297 2297 }
2298 2298
2299   - public Optional<RuleChain> setDefaultRootEdgeRuleChain(RuleChainId ruleChainId) {
  2299 + public Optional<RuleChain> setRootEdgeTemplateRuleChain(RuleChainId ruleChainId) {
2300 2300 try {
2301   - ResponseEntity<RuleChain> ruleChain = restTemplate.postForEntity(baseURL + "/api/ruleChain/{ruleChainId}/defaultRootEdge", null, RuleChain.class, ruleChainId.getId());
  2301 + ResponseEntity<RuleChain> ruleChain = restTemplate.postForEntity(baseURL + "/api/ruleChain/{ruleChainId}/edgeTemplateRoot", null, RuleChain.class, ruleChainId.getId());
2302 2302 return Optional.ofNullable(ruleChain.getBody());
2303 2303 } catch (HttpClientErrorException exception) {
2304 2304 if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
... ... @@ -2384,7 +2384,9 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable {
2384 2384 }
2385 2385
2386 2386 public void syncEdge(EdgeId edgeId) {
2387   - restTemplate.postForEntity(baseURL + "/api/edge/sync", edgeId, EdgeId.class);
  2387 + Map<String, String> params = new HashMap<>();
  2388 + params.put("edgeId", edgeId.toString());
  2389 + restTemplate.postForEntity(baseURL + "/api/edge/sync/{edgeId}", null, EdgeId.class, params);
2388 2390 }
2389 2391
2390 2392 @Deprecated
... ...
... ... @@ -297,8 +297,8 @@ function EdgeService($http, $q, customerService) {
297 297
298 298 function syncEdge(edgeId) {
299 299 var deferred = $q.defer();
300   - var url = '/api/edge/sync';
301   - $http.post(url, edgeId).then(function success(response) {
  300 + var url = '/api/edge/sync/' + edgeId;
  301 + $http.post(url, null).then(function success(response) {
302 302 deferred.resolve(response);
303 303 }, function fail(response) {
304 304 deferred.reject(response.data);
... ...
... ... @@ -40,10 +40,10 @@ function RuleChainService($http, $q, $filter, $ocLazyLoad, $translate, types, co
40 40 getEdgesRuleChains: getEdgesRuleChains,
41 41 assignRuleChainToEdge: assignRuleChainToEdge,
42 42 unassignRuleChainFromEdge: unassignRuleChainFromEdge,
43   - setDefaultRootEdgeRuleChain: setDefaultRootEdgeRuleChain,
44   - addDefaultEdgeRuleChain: addDefaultEdgeRuleChain,
45   - removeDefaultEdgeRuleChain: removeDefaultEdgeRuleChain,
46   - getDefaultEdgeRuleChains: getDefaultEdgeRuleChains
  43 + setEdgeTemplateRootRuleChain: setEdgeTemplateRootRuleChain,
  44 + setAutoAssignToEdgeRuleChain: setAutoAssignToEdgeRuleChain,
  45 + unsetAutoAssignToEdgeRuleChain: unsetAutoAssignToEdgeRuleChain,
  46 + getAutoAssignToEdgeRuleChains: getAutoAssignToEdgeRuleChains
47 47 };
48 48
49 49 return service;
... ... @@ -350,9 +350,9 @@ function RuleChainService($http, $q, $filter, $ocLazyLoad, $translate, types, co
350 350 return deferred.promise;
351 351 }
352 352
353   - function setDefaultRootEdgeRuleChain(ruleChainId) {
  353 + function setEdgeTemplateRootRuleChain(ruleChainId) {
354 354 var deferred = $q.defer();
355   - var url = '/api/ruleChain/' + ruleChainId + '/defaultRootEdge';
  355 + var url = '/api/ruleChain/' + ruleChainId + '/edgeTemplateRoot';
356 356 $http.post(url).then(function success(response) {
357 357 deferred.resolve(response.data);
358 358 }, function fail() {
... ... @@ -361,9 +361,9 @@ function RuleChainService($http, $q, $filter, $ocLazyLoad, $translate, types, co
361 361 return deferred.promise;
362 362 }
363 363
364   - function addDefaultEdgeRuleChain(ruleChainId) {
  364 + function setAutoAssignToEdgeRuleChain(ruleChainId) {
365 365 var deferred = $q.defer();
366   - var url = '/api/ruleChain/' + ruleChainId + '/defaultEdge';
  366 + var url = '/api/ruleChain/' + ruleChainId + '/autoAssignToEdge';
367 367 $http.post(url, null).then(function success(response) {
368 368 deferred.resolve(response.data);
369 369 }, function fail() {
... ... @@ -372,9 +372,9 @@ function RuleChainService($http, $q, $filter, $ocLazyLoad, $translate, types, co
372 372 return deferred.promise;
373 373 }
374 374
375   - function removeDefaultEdgeRuleChain(ruleChainId) {
  375 + function unsetAutoAssignToEdgeRuleChain(ruleChainId) {
376 376 var deferred = $q.defer();
377   - var url = '/api/ruleChain/' + ruleChainId + '/defaultEdge';
  377 + var url = '/api/ruleChain/' + ruleChainId + '/autoAssignToEdge';
378 378 $http.delete(url).then(function success(response) {
379 379 deferred.resolve(response.data);
380 380 }, function fail() {
... ... @@ -383,9 +383,9 @@ function RuleChainService($http, $q, $filter, $ocLazyLoad, $translate, types, co
383 383 return deferred.promise;
384 384 }
385 385
386   - function getDefaultEdgeRuleChains(config) {
  386 + function getAutoAssignToEdgeRuleChains(config) {
387 387 var deferred = $q.defer();
388   - var url = '/api/ruleChain/defaultEdgeRuleChains';
  388 + var url = '/api/ruleChain/autoAssignToEdgeRuleChains';
389 389 $http.get(url, config).then(function success(response) {
390 390 deferred.resolve(response.data);
391 391 }, function fail() {
... ...
... ... @@ -71,7 +71,7 @@ export default function EdgeDirective($compile, $templateCache, $translate, $mdD
71 71 };
72 72
73 73 scope.onEdgeSync = function (edgeId) {
74   - edgeService.syncEdge(edgeId).then(
  74 + edgeService.syncEdge(edgeId.id).then(
75 75 function success() {
76 76 toast.showSuccess($translate.instant('edge.sync-message'), 750, angular.element(element).parent().parent(), 'bottom left');
77 77 },
... ...
... ... @@ -97,8 +97,8 @@ export default function RuleChainsController(ruleChainService, userService, impo
97 97
98 98 vm.exportRuleChain = exportRuleChain;
99 99 vm.setRootRuleChain = setRootRuleChain;
100   - vm.setAutoAssignToEdgeRuleChain = setAutoAssignToEdgeRuleChain;
101   - vm.removeDefaultEdgeRuleChain = removeDefaultEdgeRuleChain;
  100 + vm.setDefaultEdgeRuleChain = setDefaultEdgeRuleChain;
  101 + vm.unsetAutoAssignToEdgeRuleChain = unsetAutoAssignToEdgeRuleChain;
102 102
103 103 initController();
104 104
... ... @@ -185,27 +185,27 @@ export default function RuleChainsController(ruleChainService, userService, impo
185 185
186 186 ruleChainActionsList.push({
187 187 onAction: function ($event, item) {
188   - setAutoAssignToEdgeRuleChain($event, item);
  188 + setDefaultEdgeRuleChain($event, item);
189 189 },
190   - name: function() { return $translate.instant('rulechain.set-auto-assign-to-edge') },
191   - details: function() { return $translate.instant('rulechain.set-auto-assign-to-edge') },
  190 + name: function() { return $translate.instant('rulechain.set-default-edge') },
  191 + details: function() { return $translate.instant('rulechain.set-default-edge') },
192 192 icon: "bookmark_outline",
193 193 isEnabled: isNonDefaultEdgeRuleChain
194 194 });
195 195
196 196 ruleChainActionsList.push({
197 197 onAction: function ($event, item) {
198   - removeDefaultEdgeRuleChain($event, item);
  198 + unsetAutoAssignToEdgeRuleChain($event, item);
199 199 },
200   - name: function() { return $translate.instant('rulechain.remove-auto-assign-to-edge') },
201   - details: function() { return $translate.instant('rulechain.remove-auto-assign-to-edge') },
  200 + name: function() { return $translate.instant('rulechain.remove-default-edge') },
  201 + details: function() { return $translate.instant('rulechain.remove-default-edge') },
202 202 icon: "bookmark",
203 203 isEnabled: isDefaultEdgeRuleChain
204 204 });
205 205
206 206 ruleChainActionsList.push({
207 207 onAction: function ($event, item) {
208   - setDefaultRootEdgeRuleChain($event, item);
  208 + setEdgeTemplateRootRuleChain($event, item);
209 209 },
210 210 name: function() { return $translate.instant('rulechain.set-default-root-edge') },
211 211 details: function() { return $translate.instant('rulechain.set-default-root-edge') },
... ... @@ -339,7 +339,7 @@ export default function RuleChainsController(ruleChainService, userService, impo
339 339
340 340 function mapRuleChainsWithDefaultEdges(ruleChains) {
341 341 var deferred = $q.defer();
342   - ruleChainService.getDefaultEdgeRuleChains(null).then(
  342 + ruleChainService.getAutoAssignToEdgeRuleChains(null).then(
343 343 function success(response) {
344 344 let defaultEdgeRuleChainIds = [];
345 345 response.map(function (ruleChain) {
... ... @@ -471,17 +471,17 @@ export default function RuleChainsController(ruleChainService, userService, impo
471 471 });
472 472 }
473 473
474   - function setAutoAssignToEdgeRuleChain($event, ruleChain) {
  474 + function setDefaultEdgeRuleChain($event, ruleChain) {
475 475 $event.stopPropagation();
476 476 var confirm = $mdDialog.confirm()
477 477 .targetEvent($event)
478   - .title($translate.instant('rulechain.set-auto-assign-to-edge-title', {ruleChainName: ruleChain.name}))
479   - .htmlContent($translate.instant('rulechain.set-auto-assign-to-edge-text'))
480   - .ariaLabel($translate.instant('rulechain.set-auto-assign-to-edge'))
  478 + .title($translate.instant('rulechain.set-default-edge-title', {ruleChainName: ruleChain.name}))
  479 + .htmlContent($translate.instant('rulechain.set-default-edge-text'))
  480 + .ariaLabel($translate.instant('rulechain.set-default-edge'))
481 481 .cancel($translate.instant('action.no'))
482 482 .ok($translate.instant('action.yes'));
483 483 $mdDialog.show(confirm).then(function () {
484   - ruleChainService.addDefaultEdgeRuleChain(ruleChain.id.id).then(
  484 + ruleChainService.setAutoAssignToEdgeRuleChain(ruleChain.id.id).then(
485 485 () => {
486 486 vm.grid.refreshList();
487 487 }
... ... @@ -489,17 +489,17 @@ export default function RuleChainsController(ruleChainService, userService, impo
489 489 });
490 490 }
491 491
492   - function removeDefaultEdgeRuleChain($event, ruleChain) {
  492 + function unsetAutoAssignToEdgeRuleChain($event, ruleChain) {
493 493 $event.stopPropagation();
494 494 var confirm = $mdDialog.confirm()
495 495 .targetEvent($event)
496   - .title($translate.instant('rulechain.remove-auto-assign-to-edge-title', {ruleChainName: ruleChain.name}))
497   - .htmlContent($translate.instant('rulechain.remove-auto-assign-to-edge-text'))
498   - .ariaLabel($translate.instant('rulechain.remove-auto-assign-to-edge'))
  496 + .title($translate.instant('rulechain.remove-default-edge-title', {ruleChainName: ruleChain.name}))
  497 + .htmlContent($translate.instant('rulechain.remove-default-edge-text'))
  498 + .ariaLabel($translate.instant('rulechain.remove-default-edge'))
499 499 .cancel($translate.instant('action.no'))
500 500 .ok($translate.instant('action.yes'));
501 501 $mdDialog.show(confirm).then(function () {
502   - ruleChainService.removeDefaultEdgeRuleChain(ruleChain.id.id).then(
  502 + ruleChainService.unsetAutoAssignToEdgeRuleChain(ruleChain.id.id).then(
503 503 () => {
504 504 vm.grid.refreshList();
505 505 }
... ... @@ -507,7 +507,7 @@ export default function RuleChainsController(ruleChainService, userService, impo
507 507 });
508 508 }
509 509
510   - function setDefaultRootEdgeRuleChain($event, ruleChain) {
  510 + function setEdgeTemplateRootRuleChain($event, ruleChain) {
511 511 $event.stopPropagation();
512 512 var confirm = $mdDialog.confirm()
513 513 .targetEvent($event)
... ... @@ -517,7 +517,7 @@ export default function RuleChainsController(ruleChainService, userService, impo
517 517 .cancel($translate.instant('action.no'))
518 518 .ok($translate.instant('action.yes'));
519 519 $mdDialog.show(confirm).then(function () {
520   - ruleChainService.setDefaultRootEdgeRuleChain(ruleChain.id.id).then(
  520 + ruleChainService.setEdgeTemplateRootRuleChain(ruleChain.id.id).then(
521 521 () => {
522 522 vm.grid.refreshList();
523 523 }
... ...
... ... @@ -28,8 +28,8 @@
28 28 the-form="vm.grid.detailsForm"
29 29 rule-chains-scope="vm.ruleChainsScope"
30 30 edge="vm.edge"
31   - on-set-auto-assign-to-edge-rule-chain="vm.setAutoAssignToEdgeRuleChain(event, vm.grid.detailsConfig.currentItem)"
32   - on-remove-auto-assign-to-edge-rule-chain="vm.removeAutoAssignToEdgeRuleChain(event, vm.grid.detailsConfig.currentItem)"
  31 + on-set-default-edge-rule-chain="vm.setDefaultEdgeRuleChain(event, vm.grid.detailsConfig.currentItem)"
  32 + on-remove-default-edge-rule-chain="vm.unsetAutoAssignToEdgeRuleChain(event, vm.grid.detailsConfig.currentItem)"
33 33 on-set-root-rule-chain="vm.setRootRuleChain(event, vm.grid.detailsConfig.currentItem)"
34 34 on-export-rule-chain="vm.exportRuleChain(event, vm.grid.detailsConfig.currentItem)"
35 35 on-delete-rule-chain="vm.grid.deleteItem(event, vm.grid.detailsConfig.currentItem)">
... ...