Commit c9dcbda18dc1c6f5649eb23c5fa13d8d1b1effd4

Authored by Bohdan Smetaniuk
1 parent 93363f81

ui side + handle exceptions

@@ -104,6 +104,7 @@ import org.thingsboard.server.queue.provider.TbQueueProducerProvider; @@ -104,6 +104,7 @@ import org.thingsboard.server.queue.provider.TbQueueProducerProvider;
104 import org.thingsboard.server.queue.util.TbCoreComponent; 104 import org.thingsboard.server.queue.util.TbCoreComponent;
105 import org.thingsboard.server.service.component.ComponentDiscoveryService; 105 import org.thingsboard.server.service.component.ComponentDiscoveryService;
106 import org.thingsboard.server.service.edge.EdgeNotificationService; 106 import org.thingsboard.server.service.edge.EdgeNotificationService;
  107 +import org.thingsboard.server.service.edge.rpc.EdgeGrpcService;
107 import org.thingsboard.server.service.edge.rpc.init.SyncEdgeService; 108 import org.thingsboard.server.service.edge.rpc.init.SyncEdgeService;
108 import org.thingsboard.server.service.queue.TbClusterService; 109 import org.thingsboard.server.service.queue.TbClusterService;
109 import org.thingsboard.server.service.security.model.SecurityUser; 110 import org.thingsboard.server.service.security.model.SecurityUser;
@@ -212,6 +213,9 @@ public abstract class BaseController { @@ -212,6 +213,9 @@ public abstract class BaseController {
212 @Autowired(required = false) 213 @Autowired(required = false)
213 protected SyncEdgeService syncEdgeService; 214 protected SyncEdgeService syncEdgeService;
214 215
  216 + @Autowired(required = false)
  217 + protected EdgeGrpcService edgeGrpcService;
  218 +
215 @Value("${server.log_controller_error_stack_trace}") 219 @Value("${server.log_controller_error_stack_trace}")
216 @Getter 220 @Getter
217 private boolean logControllerErrorStackTrace; 221 private boolean logControllerErrorStackTrace;
@@ -26,7 +26,6 @@ import org.springframework.web.bind.annotation.RequestParam; @@ -26,7 +26,6 @@ import org.springframework.web.bind.annotation.RequestParam;
26 import org.springframework.web.bind.annotation.ResponseBody; 26 import org.springframework.web.bind.annotation.ResponseBody;
27 import org.springframework.web.bind.annotation.ResponseStatus; 27 import org.springframework.web.bind.annotation.ResponseStatus;
28 import org.springframework.web.bind.annotation.RestController; 28 import org.springframework.web.bind.annotation.RestController;
29 -import org.thingsboard.server.common.data.AdminSettings;  
30 import org.thingsboard.server.common.data.Customer; 29 import org.thingsboard.server.common.data.Customer;
31 import org.thingsboard.server.common.data.EntitySubtype; 30 import org.thingsboard.server.common.data.EntitySubtype;
32 import org.thingsboard.server.common.data.EntityType; 31 import org.thingsboard.server.common.data.EntityType;
@@ -47,6 +46,7 @@ import org.thingsboard.server.dao.exception.DataValidationException; @@ -47,6 +46,7 @@ import org.thingsboard.server.dao.exception.DataValidationException;
47 import org.thingsboard.server.dao.exception.IncorrectParameterException; 46 import org.thingsboard.server.dao.exception.IncorrectParameterException;
48 import org.thingsboard.server.dao.model.ModelConstants; 47 import org.thingsboard.server.dao.model.ModelConstants;
49 import org.thingsboard.server.queue.util.TbCoreComponent; 48 import org.thingsboard.server.queue.util.TbCoreComponent;
  49 +import org.thingsboard.server.service.edge.rpc.EdgeGrpcSession;
50 import org.thingsboard.server.service.security.model.SecurityUser; 50 import org.thingsboard.server.service.security.model.SecurityUser;
51 import org.thingsboard.server.service.security.permission.Operation; 51 import org.thingsboard.server.service.security.permission.Operation;
52 import org.thingsboard.server.service.security.permission.Resource; 52 import org.thingsboard.server.service.security.permission.Resource;
@@ -415,8 +415,13 @@ public class EdgeController extends BaseController { @@ -415,8 +415,13 @@ public class EdgeController extends BaseController {
415 public void syncEdge(@RequestBody EdgeId edgeId) throws ThingsboardException { 415 public void syncEdge(@RequestBody EdgeId edgeId) throws ThingsboardException {
416 try { 416 try {
417 edgeId = checkNotNull(edgeId); 417 edgeId = checkNotNull(edgeId);
418 - Edge edge = checkEdgeId(edgeId, Operation.READ);  
419 - syncEdgeService.sync(edge); 418 + if (isEdgesSupportEnabled()) {
  419 + EdgeGrpcSession session = edgeGrpcService.getEdgeGrpcSessionById(edgeId);
  420 + Edge edge = session.getEdge();
  421 + syncEdgeService.sync(edge);
  422 + } else {
  423 + throw new ThingsboardException("Edges support disabled", ThingsboardErrorCode.GENERAL);
  424 + }
420 } catch (Exception e) { 425 } catch (Exception e) {
421 throw handleException(e); 426 throw handleException(e);
422 } 427 }
@@ -146,6 +146,15 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase i @@ -146,6 +146,15 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase i
146 save(edgeId, DefaultDeviceStateService.LAST_CONNECT_TIME, System.currentTimeMillis()); 146 save(edgeId, DefaultDeviceStateService.LAST_CONNECT_TIME, System.currentTimeMillis());
147 } 147 }
148 148
  149 + public EdgeGrpcSession getEdgeGrpcSessionById(EdgeId edgeId) {
  150 + EdgeGrpcSession session = sessions.get(edgeId);
  151 + if (session != null && session.isConnected()) {
  152 + return session;
  153 + } else {
  154 + throw new RuntimeException("Edge is not connected");
  155 + }
  156 + }
  157 +
149 private void processHandleMessages() { 158 private void processHandleMessages() {
150 executor.submit(() -> { 159 executor.submit(() -> {
151 while (!Thread.interrupted()) { 160 while (!Thread.interrupted()) {
@@ -33,7 +33,8 @@ function EdgeService($http, $q, customerService) { @@ -33,7 +33,8 @@ function EdgeService($http, $q, customerService) {
33 unassignEdgeFromCustomer: unassignEdgeFromCustomer, 33 unassignEdgeFromCustomer: unassignEdgeFromCustomer,
34 makeEdgePublic: makeEdgePublic, 34 makeEdgePublic: makeEdgePublic,
35 setRootRuleChain: setRootRuleChain, 35 setRootRuleChain: setRootRuleChain,
36 - getEdgeEvents: getEdgeEvents 36 + getEdgeEvents: getEdgeEvents,
  37 + syncEdge: syncEdge
37 }; 38 };
38 39
39 return service; 40 return service;
@@ -262,4 +263,15 @@ function EdgeService($http, $q, customerService) { @@ -262,4 +263,15 @@ function EdgeService($http, $q, customerService) {
262 }); 263 });
263 return deferred.promise; 264 return deferred.promise;
264 } 265 }
  266 +
  267 + function syncEdge(edgeId) {
  268 + var deferred = $q.defer();
  269 + var url = '/api/edge/sync';
  270 + $http.post(url, edgeId).then(function success(response) {
  271 + deferred.resolve(response);
  272 + }, function fail(response) {
  273 + deferred.reject(response.data);
  274 + });
  275 + return deferred.promise;
  276 + }
265 } 277 }
@@ -48,6 +48,12 @@ @@ -48,6 +48,12 @@
48 <md-icon md-svg-icon="mdi:clipboard-arrow-left"></md-icon> 48 <md-icon md-svg-icon="mdi:clipboard-arrow-left"></md-icon>
49 <span translate>edge.copy-id</span> 49 <span translate>edge.copy-id</span>
50 </md-button> 50 </md-button>
  51 + <md-button ng-click="onEdgeSync(edge.id)"
  52 + ng-show="!isEdit"
  53 + class="md-raised">
  54 + <md-icon md-svg-icon="mdi:clipboard-arrow-left"></md-icon>
  55 + <span translate>edge.sync</span>
  56 + </md-button>
51 </div> 57 </div>
52 58
53 <md-content class="md-padding" layout="column"> 59 <md-content class="md-padding" layout="column">
@@ -20,7 +20,7 @@ import edgeFieldsetTemplate from './edge-fieldset.tpl.html'; @@ -20,7 +20,7 @@ import edgeFieldsetTemplate from './edge-fieldset.tpl.html';
20 /* eslint-enable import/no-unresolved, import/default */ 20 /* eslint-enable import/no-unresolved, import/default */
21 21
22 /*@ngInject*/ 22 /*@ngInject*/
23 -export default function EdgeDirective($compile, $templateCache, $translate, $mdDialog, $document, utils, toast, types, customerService) { 23 +export default function EdgeDirective($compile, $templateCache, $translate, $mdDialog, $document, utils, toast, types, customerService, edgeService) {
24 var linker = function (scope, element) { 24 var linker = function (scope, element) {
25 var template = $templateCache.get(edgeFieldsetTemplate); 25 var template = $templateCache.get(edgeFieldsetTemplate);
26 element.html(template); 26 element.html(template);
@@ -69,6 +69,17 @@ export default function EdgeDirective($compile, $templateCache, $translate, $mdD @@ -69,6 +69,17 @@ export default function EdgeDirective($compile, $templateCache, $translate, $mdD
69 toast.showSuccess($translate.instant('edge.id-copied-message'), 750, angular.element(element).parent().parent(), 'bottom left'); 69 toast.showSuccess($translate.instant('edge.id-copied-message'), 750, angular.element(element).parent().parent(), 'bottom left');
70 }; 70 };
71 71
  72 + scope.onEdgeSync = function (edgeId) {
  73 + edgeService.syncEdge(edgeId).then(
  74 + function success() {
  75 + toast.showSuccess($translate.instant('edge.sync-message'), 750, angular.element(element).parent().parent(), 'bottom left');
  76 + },
  77 + function fail(error) {
  78 + toast.showError(error);
  79 + }
  80 + );
  81 + }
  82 +
72 $compile(element.contents())(scope); 83 $compile(element.contents())(scope);
73 84
74 scope.onEdgeInfoCopied = function(type) { 85 scope.onEdgeInfoCopied = function(type) {
@@ -756,6 +756,8 @@ @@ -756,6 +756,8 @@
756 "details": "Details", 756 "details": "Details",
757 "copy-id": "Regelketten-ID kopieren", 757 "copy-id": "Regelketten-ID kopieren",
758 "id-copied-message": "Regelketten-ID wurde in die Zwischenablage kopiert", 758 "id-copied-message": "Regelketten-ID wurde in die Zwischenablage kopiert",
  759 + "sync": "Sync Edge",
  760 + "sync-message": "Edge wurde synchronisiert",
759 "permissions": "Berechtigungen", 761 "permissions": "Berechtigungen",
760 "edge-required": "Rand ist erforderlich.", 762 "edge-required": "Rand ist erforderlich.",
761 "edge-type": "Randtyp", 763 "edge-type": "Randtyp",
@@ -788,6 +788,8 @@ @@ -788,6 +788,8 @@
788 "events": "Events", 788 "events": "Events",
789 "copy-id": "Copy Edge Id", 789 "copy-id": "Copy Edge Id",
790 "id-copied-message": "Edge Id has been copied to clipboard", 790 "id-copied-message": "Edge Id has been copied to clipboard",
  791 + "sync": "Sync Edge",
  792 + "sync-message": "Edge has been synchronized",
791 "permissions": "Permissions", 793 "permissions": "Permissions",
792 "edge-required": "Edge required", 794 "edge-required": "Edge required",
793 "edge-type": "Edge type", 795 "edge-type": "Edge type",
@@ -769,6 +769,8 @@ @@ -769,6 +769,8 @@
769 "details": "Detalles", 769 "details": "Detalles",
770 "copy-id": "Copiar ID de borde", 770 "copy-id": "Copiar ID de borde",
771 "id-copied-message": "El ID de borde se ha copiado al portapapeles", 771 "id-copied-message": "El ID de borde se ha copiado al portapapeles",
  772 + "sync": "Sinc Edge",
  773 + "sync-message": "Edge se ha sincronizado",
772 "permissions": "Permisos", 774 "permissions": "Permisos",
773 "edge-required": "Edge required", 775 "edge-required": "Edge required",
774 "edge-type": "Type de la bordure", 776 "edge-type": "Type de la bordure",
@@ -774,6 +774,8 @@ @@ -774,6 +774,8 @@
774 "details": "Détails de l'entité", 774 "details": "Détails de l'entité",
775 "copy-id": "Copier borudre Id", 775 "copy-id": "Copier borudre Id",
776 "id-copied-message": "Id de la bordure a été copié dans le presse-papier", 776 "id-copied-message": "Id de la bordure a été copié dans le presse-papier",
  777 + "sync": "Sync Edge",
  778 + "sync-message": "Edge a été synchronisé",
777 "permissions": "Autorisations", 779 "permissions": "Autorisations",
778 "edge-required": "Bordure est requise", 780 "edge-required": "Bordure est requise",
779 "edge-type": "Type de la bordure", 781 "edge-type": "Type de la bordure",