Showing
10 changed files
with
60 additions
and
5 deletions
@@ -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", |