Showing
10 changed files
with
60 additions
and
5 deletions
... | ... | @@ -104,6 +104,7 @@ import org.thingsboard.server.queue.provider.TbQueueProducerProvider; |
104 | 104 | import org.thingsboard.server.queue.util.TbCoreComponent; |
105 | 105 | import org.thingsboard.server.service.component.ComponentDiscoveryService; |
106 | 106 | import org.thingsboard.server.service.edge.EdgeNotificationService; |
107 | +import org.thingsboard.server.service.edge.rpc.EdgeGrpcService; | |
107 | 108 | import org.thingsboard.server.service.edge.rpc.init.SyncEdgeService; |
108 | 109 | import org.thingsboard.server.service.queue.TbClusterService; |
109 | 110 | import org.thingsboard.server.service.security.model.SecurityUser; |
... | ... | @@ -212,6 +213,9 @@ public abstract class BaseController { |
212 | 213 | @Autowired(required = false) |
213 | 214 | protected SyncEdgeService syncEdgeService; |
214 | 215 | |
216 | + @Autowired(required = false) | |
217 | + protected EdgeGrpcService edgeGrpcService; | |
218 | + | |
215 | 219 | @Value("${server.log_controller_error_stack_trace}") |
216 | 220 | @Getter |
217 | 221 | private boolean logControllerErrorStackTrace; | ... | ... |
... | ... | @@ -26,7 +26,6 @@ import org.springframework.web.bind.annotation.RequestParam; |
26 | 26 | import org.springframework.web.bind.annotation.ResponseBody; |
27 | 27 | import org.springframework.web.bind.annotation.ResponseStatus; |
28 | 28 | import org.springframework.web.bind.annotation.RestController; |
29 | -import org.thingsboard.server.common.data.AdminSettings; | |
30 | 29 | import org.thingsboard.server.common.data.Customer; |
31 | 30 | import org.thingsboard.server.common.data.EntitySubtype; |
32 | 31 | import org.thingsboard.server.common.data.EntityType; |
... | ... | @@ -47,6 +46,7 @@ import org.thingsboard.server.dao.exception.DataValidationException; |
47 | 46 | import org.thingsboard.server.dao.exception.IncorrectParameterException; |
48 | 47 | import org.thingsboard.server.dao.model.ModelConstants; |
49 | 48 | import org.thingsboard.server.queue.util.TbCoreComponent; |
49 | +import org.thingsboard.server.service.edge.rpc.EdgeGrpcSession; | |
50 | 50 | import org.thingsboard.server.service.security.model.SecurityUser; |
51 | 51 | import org.thingsboard.server.service.security.permission.Operation; |
52 | 52 | import org.thingsboard.server.service.security.permission.Resource; |
... | ... | @@ -415,8 +415,13 @@ public class EdgeController extends BaseController { |
415 | 415 | public void syncEdge(@RequestBody EdgeId edgeId) throws ThingsboardException { |
416 | 416 | try { |
417 | 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 | 425 | } catch (Exception e) { |
421 | 426 | throw handleException(e); |
422 | 427 | } | ... | ... |
... | ... | @@ -146,6 +146,15 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase i |
146 | 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 | 158 | private void processHandleMessages() { |
150 | 159 | executor.submit(() -> { |
151 | 160 | while (!Thread.interrupted()) { | ... | ... |
... | ... | @@ -33,7 +33,8 @@ function EdgeService($http, $q, customerService) { |
33 | 33 | unassignEdgeFromCustomer: unassignEdgeFromCustomer, |
34 | 34 | makeEdgePublic: makeEdgePublic, |
35 | 35 | setRootRuleChain: setRootRuleChain, |
36 | - getEdgeEvents: getEdgeEvents | |
36 | + getEdgeEvents: getEdgeEvents, | |
37 | + syncEdge: syncEdge | |
37 | 38 | }; |
38 | 39 | |
39 | 40 | return service; |
... | ... | @@ -262,4 +263,15 @@ function EdgeService($http, $q, customerService) { |
262 | 263 | }); |
263 | 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 | 48 | <md-icon md-svg-icon="mdi:clipboard-arrow-left"></md-icon> |
49 | 49 | <span translate>edge.copy-id</span> |
50 | 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 | 57 | </div> |
52 | 58 | |
53 | 59 | <md-content class="md-padding" layout="column"> | ... | ... |
... | ... | @@ -20,7 +20,7 @@ import edgeFieldsetTemplate from './edge-fieldset.tpl.html'; |
20 | 20 | /* eslint-enable import/no-unresolved, import/default */ |
21 | 21 | |
22 | 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 | 24 | var linker = function (scope, element) { |
25 | 25 | var template = $templateCache.get(edgeFieldsetTemplate); |
26 | 26 | element.html(template); |
... | ... | @@ -69,6 +69,17 @@ export default function EdgeDirective($compile, $templateCache, $translate, $mdD |
69 | 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 | 83 | $compile(element.contents())(scope); |
73 | 84 | |
74 | 85 | scope.onEdgeInfoCopied = function(type) { | ... | ... |
... | ... | @@ -756,6 +756,8 @@ |
756 | 756 | "details": "Details", |
757 | 757 | "copy-id": "Regelketten-ID kopieren", |
758 | 758 | "id-copied-message": "Regelketten-ID wurde in die Zwischenablage kopiert", |
759 | + "sync": "Sync Edge", | |
760 | + "sync-message": "Edge wurde synchronisiert", | |
759 | 761 | "permissions": "Berechtigungen", |
760 | 762 | "edge-required": "Rand ist erforderlich.", |
761 | 763 | "edge-type": "Randtyp", | ... | ... |
... | ... | @@ -788,6 +788,8 @@ |
788 | 788 | "events": "Events", |
789 | 789 | "copy-id": "Copy Edge Id", |
790 | 790 | "id-copied-message": "Edge Id has been copied to clipboard", |
791 | + "sync": "Sync Edge", | |
792 | + "sync-message": "Edge has been synchronized", | |
791 | 793 | "permissions": "Permissions", |
792 | 794 | "edge-required": "Edge required", |
793 | 795 | "edge-type": "Edge type", | ... | ... |
... | ... | @@ -769,6 +769,8 @@ |
769 | 769 | "details": "Detalles", |
770 | 770 | "copy-id": "Copiar ID de borde", |
771 | 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 | 774 | "permissions": "Permisos", |
773 | 775 | "edge-required": "Edge required", |
774 | 776 | "edge-type": "Type de la bordure", | ... | ... |
... | ... | @@ -774,6 +774,8 @@ |
774 | 774 | "details": "Détails de l'entité", |
775 | 775 | "copy-id": "Copier borudre Id", |
776 | 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 | 779 | "permissions": "Autorisations", |
778 | 780 | "edge-required": "Bordure est requise", |
779 | 781 | "edge-type": "Type de la bordure", | ... | ... |