From 35a17efc71249eb157b96bcf5689173e43348666 Mon Sep 17 00:00:00 2001 From: deaflynx Date: Sat, 11 Jul 2020 00:29:42 +0300 Subject: [PATCH 01/14] For edgeEvents added Status of data received by Edge v.1.0 --- .../event/event-header-edge-event.tpl.html | 1 + .../app/event/event-row-edge-event.tpl.html | 1 + ui/src/app/event/event-row.directive.js | 28 +++++++++++++++++-- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/ui/src/app/event/event-header-edge-event.tpl.html b/ui/src/app/event/event-header-edge-event.tpl.html index f0d2daa53b..e9770f42bd 100644 --- a/ui/src/app/event/event-header-edge-event.tpl.html +++ b/ui/src/app/event/event-header-edge-event.tpl.html @@ -20,3 +20,4 @@
edge.event-action
edge.entity-id
edge.entity-info
+
event.status
diff --git a/ui/src/app/event/event-row-edge-event.tpl.html b/ui/src/app/event/event-row-edge-event.tpl.html index 5c3a7a8576..7dea0aa804 100644 --- a/ui/src/app/event/event-row-edge-event.tpl.html +++ b/ui/src/app/event/event-row-edge-event.tpl.html @@ -32,4 +32,5 @@ +
{{receiveStatus(event.createdTime)}}
diff --git a/ui/src/app/event/event-row.directive.js b/ui/src/app/event/event-row.directive.js index 0ba533d5f1..7bec6c28dd 100644 --- a/ui/src/app/event/event-row.directive.js +++ b/ui/src/app/event/event-row.directive.js @@ -26,11 +26,13 @@ import eventRowEdgeEventTemplate from './event-row-edge-event.tpl.html'; /* eslint-enable import/no-unresolved, import/default */ /*@ngInject*/ -export default function EventRowDirective($compile, $templateCache, $mdDialog, $document, $translate, - types, toast, entityService, ruleChainService) { +export default function EventRowDirective($compile, $templateCache, $mdDialog, $document, $translate, $log, + types, toast, entityService, ruleChainService, userService, attributeService) { var linker = function (scope, element, attrs) { + var lastDisconnectTime; + var getTemplate = function(eventType) { var template = ''; switch(eventType) { @@ -50,6 +52,7 @@ export default function EventRowDirective($compile, $templateCache, $mdDialog, $ template = eventRowDebugRuleNodeTemplate; break; case types.eventType.edgeEvent.value: + getLastDisconnectTime(); template = eventRowEdgeEventTemplate; break; } @@ -135,6 +138,27 @@ export default function EventRowDirective($compile, $templateCache, $mdDialog, $ }); } + function getLastDisconnectTime() { + let params = { + entityType: types.entityType.edge, + entityId: scope.entityId, + attributeScope: types.attributesScope.server.value, + query: {order: '', limit: 1, page: 1, search: "active"} + }; + attributeService.getEntityAttributes(params.entityType, params.entityId, params.attributeScope, params.query, + function (attribute) { + if (attribute && attribute.data) { + $log.log("attribute", attribute); + lastDisconnectTime = attribute.data[0].lastUpdateTs; + $log.log("lastDisconnectTime", lastDisconnectTime, typeof(lastDisconnectTime)); + } + }); + } + + scope.receiveStatus = function(eventCreatedTime) { + return (eventCreatedTime <= lastDisconnectTime) ? $translate.instant('event.success') : $translate.instant('event.failed'); + } + scope.checkTooltip = function($event) { var el = $event.target; var $el = angular.element(el); From df62957780e50b67e589b8feeef2bd6b4b73e902 Mon Sep 17 00:00:00 2001 From: deaflynx Date: Sat, 11 Jul 2020 00:34:00 +0300 Subject: [PATCH 02/14] For edgeEvents added Status of data received by Edge v.1.0 --- ui/src/app/event/event-row.directive.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ui/src/app/event/event-row.directive.js b/ui/src/app/event/event-row.directive.js index 7bec6c28dd..2e4163d694 100644 --- a/ui/src/app/event/event-row.directive.js +++ b/ui/src/app/event/event-row.directive.js @@ -26,7 +26,7 @@ import eventRowEdgeEventTemplate from './event-row-edge-event.tpl.html'; /* eslint-enable import/no-unresolved, import/default */ /*@ngInject*/ -export default function EventRowDirective($compile, $templateCache, $mdDialog, $document, $translate, $log, +export default function EventRowDirective($compile, $templateCache, $mdDialog, $document, $translate, types, toast, entityService, ruleChainService, userService, attributeService) { var linker = function (scope, element, attrs) { @@ -148,9 +148,7 @@ export default function EventRowDirective($compile, $templateCache, $mdDialog, $ attributeService.getEntityAttributes(params.entityType, params.entityId, params.attributeScope, params.query, function (attribute) { if (attribute && attribute.data) { - $log.log("attribute", attribute); lastDisconnectTime = attribute.data[0].lastUpdateTs; - $log.log("lastDisconnectTime", lastDisconnectTime, typeof(lastDisconnectTime)); } }); } From 5ab81b98a6c5f53d8691cd811c4d23b5fdd573cc Mon Sep 17 00:00:00 2001 From: deaflynx Date: Mon, 13 Jul 2020 17:13:18 +0300 Subject: [PATCH 03/14] Edge Events Status Update --- ui/src/app/api/edge.service.js | 2 +- .../app/event/event-row-edge-event.tpl.html | 2 +- ui/src/app/event/event-row.directive.js | 30 +++-------- ui/src/app/event/event-table.directive.js | 52 ++++++++++++++++++- 4 files changed, 60 insertions(+), 26 deletions(-) diff --git a/ui/src/app/api/edge.service.js b/ui/src/app/api/edge.service.js index 858dff3d18..7814e1d826 100644 --- a/ui/src/app/api/edge.service.js +++ b/ui/src/app/api/edge.service.js @@ -56,7 +56,7 @@ function EdgeService($http, $q, customerService) { deferred.reject(); }); return deferred.promise; - } // TODO: deaflynx: check usage in UI + } function getEdgesByIds(edgeIds, config) { var deferred = $q.defer(); diff --git a/ui/src/app/event/event-row-edge-event.tpl.html b/ui/src/app/event/event-row-edge-event.tpl.html index 7dea0aa804..0b088d8570 100644 --- a/ui/src/app/event/event-row-edge-event.tpl.html +++ b/ui/src/app/event/event-row-edge-event.tpl.html @@ -32,5 +32,5 @@ -
{{receiveStatus(event.createdTime)}}
+
{{updateStatus(event.createdTime)}}
diff --git a/ui/src/app/event/event-row.directive.js b/ui/src/app/event/event-row.directive.js index 2e4163d694..fd9756a697 100644 --- a/ui/src/app/event/event-row.directive.js +++ b/ui/src/app/event/event-row.directive.js @@ -27,12 +27,10 @@ import eventRowEdgeEventTemplate from './event-row-edge-event.tpl.html'; /*@ngInject*/ export default function EventRowDirective($compile, $templateCache, $mdDialog, $document, $translate, - types, toast, entityService, ruleChainService, userService, attributeService) { + types, toast, entityService, ruleChainService) { var linker = function (scope, element, attrs) { - var lastDisconnectTime; - var getTemplate = function(eventType) { var template = ''; switch(eventType) { @@ -52,7 +50,6 @@ export default function EventRowDirective($compile, $templateCache, $mdDialog, $ template = eventRowDebugRuleNodeTemplate; break; case types.eventType.edgeEvent.value: - getLastDisconnectTime(); template = eventRowEdgeEventTemplate; break; } @@ -138,25 +135,6 @@ export default function EventRowDirective($compile, $templateCache, $mdDialog, $ }); } - function getLastDisconnectTime() { - let params = { - entityType: types.entityType.edge, - entityId: scope.entityId, - attributeScope: types.attributesScope.server.value, - query: {order: '', limit: 1, page: 1, search: "active"} - }; - attributeService.getEntityAttributes(params.entityType, params.entityId, params.attributeScope, params.query, - function (attribute) { - if (attribute && attribute.data) { - lastDisconnectTime = attribute.data[0].lastUpdateTs; - } - }); - } - - scope.receiveStatus = function(eventCreatedTime) { - return (eventCreatedTime <= lastDisconnectTime) ? $translate.instant('event.success') : $translate.instant('event.failed'); - } - scope.checkTooltip = function($event) { var el = $event.target; var $el = angular.element(el); @@ -166,6 +144,12 @@ export default function EventRowDirective($compile, $templateCache, $mdDialog, $ } $compile(element.contents())(scope); + + scope.updateStatus = function(eventCreatedTime) { + if (scope.queueStartTs) { + return (eventCreatedTime < scope.queueStartTs) ? $translate.instant('event.success') : $translate.instant('event.failed'); + } + } } return { diff --git a/ui/src/app/event/event-table.directive.js b/ui/src/app/event/event-table.directive.js index 4e8ae226b7..df300dd8e1 100644 --- a/ui/src/app/event/event-table.directive.js +++ b/ui/src/app/event/event-table.directive.js @@ -22,7 +22,8 @@ import eventTableTemplate from './event-table.tpl.html'; /* eslint-enable import/no-unresolved, import/default */ /*@ngInject*/ -export default function EventTableDirective($compile, $templateCache, $rootScope, types, eventService, edgeService) { +export default function EventTableDirective($compile, $templateCache, $rootScope, types, eventService, edgeService, + attributeService) { var linker = function (scope, element, attrs) { @@ -106,6 +107,7 @@ export default function EventTableDirective($compile, $templateCache, $rootScope scope.eventType, scope.tenantId, scope.events.nextPageLink); } else { promise = edgeService.getEdgeEvents(scope.entityId, scope.events.nextPageLink); + scope.loadEdgeInfo(); } if (promise) { scope.events.pending = true; @@ -135,6 +137,7 @@ export default function EventTableDirective($compile, $templateCache, $rootScope scope.$watch("entityId", function(newVal, prevVal) { if (newVal && !angular.equals(newVal, prevVal)) { + scope.loadEdgeInfo(); scope.resetFilter(); scope.reload(); } @@ -212,6 +215,53 @@ export default function EventTableDirective($compile, $templateCache, $rootScope return false; } + scope.subscriptionId = null; + scope.queueStartTs; + + scope.loadEdgeInfo = function() { + attributeService.getEntityAttributesValues(scope.entityType, scope.entityId, types.attributesScope.server.value, + ["queueStartTs"], {}) + .then(function success(attributes) { + scope.onUpdate(attributes); + }); + + scope.checkSubscription(); + + attributeService.getEntityAttributes(scope.entityType, scope.entityId, types.attributesScope.server.value, {order: '', limit: 1, page: 1, search: ''}, + function (attributes) { + if (attributes && attributes.data) { + scope.onUpdate(attributes.data); + } + }); + } + + scope.onUpdate = function(attributes) { + let edge = attributes.reduce(function (map, attribute) { + map[attribute.key] = attribute; + return map; + }, {}); + if (edge.queueStartTs) { + scope.queueStartTs = edge.queueStartTs.lastUpdateTs; + } + } + + scope.checkSubscription = function() { + var newSubscriptionId = null; + if (scope.entityId && scope.entityType && types.attributesScope.server.value) { + newSubscriptionId = attributeService.subscribeForEntityAttributes(scope.entityType, scope.entityId, types.attributesScope.server.value); + } + if (scope.subscriptionId && scope.subscriptionId != newSubscriptionId) { + attributeService.unsubscribeForEntityAttributes(scope.subscriptionId); + } + scope.subscriptionId = newSubscriptionId; + } + + scope.$on('$destroy', function () { + if (scope.subscriptionId) { + attributeService.unsubscribeForEntityAttributes(scope.subscriptionId); + } + }); + scope.reload(); $compile(element.contents())(scope); From 63de68f6952d7e2f2d3d927b51486ea4ae5330b6 Mon Sep 17 00:00:00 2001 From: deaflynx Date: Tue, 14 Jul 2020 10:57:34 +0300 Subject: [PATCH 04/14] Added eventTypeScope for edgeEvents --- ui/src/app/event/event-table.directive.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/ui/src/app/event/event-table.directive.js b/ui/src/app/event/event-table.directive.js index df300dd8e1..205a686fe3 100644 --- a/ui/src/app/event/event-table.directive.js +++ b/ui/src/app/event/event-table.directive.js @@ -23,7 +23,7 @@ import eventTableTemplate from './event-table.tpl.html'; /*@ngInject*/ export default function EventTableDirective($compile, $templateCache, $rootScope, types, eventService, edgeService, - attributeService) { + attributeService, $log) { var linker = function (scope, element, attrs) { @@ -31,11 +31,16 @@ export default function EventTableDirective($compile, $templateCache, $rootScope element.html(template); + scope.eventTypeScope = angular.copy(types.eventType); + if (scope.entityType !== types.entityType.edge) { + delete scope.eventTypeScope.edgeEvent; + } + if (attrs.disabledEventTypes) { var disabledEventTypes = attrs.disabledEventTypes.split(','); scope.eventTypes = {}; - for (var type in types.eventType) { - var eventType = types.eventType[type]; + for (var type in scope.eventTypeScope) { + var eventType = scope.eventTypeScope[type]; var enabled = true; for (var i=0;i Date: Tue, 21 Jul 2020 08:19:16 +0300 Subject: [PATCH 05/14] Added Edge Fieldset manage... buttons. In EdgeEvents updated table columns width, status labels --- ui/src/app/edge/edge-fieldset.tpl.html | 15 +++++++++++++++ ui/src/app/edge/edge.controller.js | 5 +++++ ui/src/app/edge/edge.directive.js | 5 +++++ ui/src/app/edge/edges.tpl.html | 5 +++++ ui/src/app/event/event-header-edge-event.tpl.html | 8 ++++---- ui/src/app/event/event-row-edge-event.tpl.html | 9 +++++---- ui/src/app/event/event-row.directive.js | 10 +++++++++- ui/src/app/locale/locale.constant-en_US.json | 5 ++++- 8 files changed, 52 insertions(+), 10 deletions(-) diff --git a/ui/src/app/edge/edge-fieldset.tpl.html b/ui/src/app/edge/edge-fieldset.tpl.html index b54e1cb651..c151c03f10 100644 --- a/ui/src/app/edge/edge-fieldset.tpl.html +++ b/ui/src/app/edge/edge-fieldset.tpl.html @@ -21,6 +21,21 @@ {{ isPublic ? 'edge.make-private' : 'edge.unassign-from-customer' | translate }} +{{ 'edge.manage-edge-assets' | translate }} +{{ 'edge.manage-edge-devices' | translate }} +{{ 'edge.manage-edge-entity-views' | translate }} +{{ 'edge.manage-edge-dashboards' | translate }} +{{ 'edge.manage-edge-rulechains' | translate }} {{ 'edge.delete' | translate }} diff --git a/ui/src/app/edge/edge.controller.js b/ui/src/app/edge/edge.controller.js index 51269ea753..7e57fce6a6 100644 --- a/ui/src/app/edge/edge.controller.js +++ b/ui/src/app/edge/edge.controller.js @@ -129,6 +129,11 @@ export function EdgeController($rootScope, userService, edgeService, customerSer vm.assignToCustomer = assignToCustomer; vm.makePublic = makePublic; vm.unassignFromCustomer = unassignFromCustomer; + vm.openEdgeAssets = openEdgeAssets; + vm.openEdgeDevices = openEdgeDevices; + vm.openEdgeEntityViews = openEdgeEntityViews; + vm.openEdgeDashboards = openEdgeDashboards; + vm.openEdgeRuleChains = openEdgeRuleChains; initController(); diff --git a/ui/src/app/edge/edge.directive.js b/ui/src/app/edge/edge.directive.js index 0cbe32f79e..d96dfa4b4d 100644 --- a/ui/src/app/edge/edge.directive.js +++ b/ui/src/app/edge/edge.directive.js @@ -96,6 +96,11 @@ export default function EdgeDirective($compile, $templateCache, $translate, $mdD onAssignToCustomer: '&', onMakePublic: '&', onUnassignFromCustomer: '&', + onManageEdgeAssets: '&', + onManageEdgeDevices: '&', + onManageEdgeEntityViews: '&', + onManageEdgeDashboards: '&', + onManageEdgeRuleChains: '&', onDeleteEdge: '&' } }; diff --git a/ui/src/app/edge/edges.tpl.html b/ui/src/app/edge/edges.tpl.html index 4fc3f5d75e..2600413255 100644 --- a/ui/src/app/edge/edges.tpl.html +++ b/ui/src/app/edge/edges.tpl.html @@ -29,6 +29,11 @@ on-assign-to-customer="vm.assignToCustomer(event, [ vm.grid.detailsConfig.currentItem.id.id ])" on-make-public="vm.makePublic(event, vm.grid.detailsConfig.currentItem)" on-unassign-from-customer="vm.unassignFromCustomer(event, vm.grid.detailsConfig.currentItem, isPublic)" + on-manage-edge-assets="vm.openEdgeAssets(event, vm.grid.detailsConfig.currentItem)" + on-manage-edge-devices="vm.openEdgeDevices(event, vm.grid.detailsConfig.currentItem)" + on-manage-edge-entity-views="vm.openEdgeEntityViews(event, vm.grid.detailsConfig.currentItem)" + on-manage-edge-dashboards="vm.openEdgeDashboards(event, vm.grid.detailsConfig.currentItem)" + on-manage-edge-rule-chains="vm.openEdgeRuleChains(event, vm.grid.detailsConfig.currentItem)" on-delete-edge="vm.grid.deleteItem(event, vm.grid.detailsConfig.currentItem)"> diff --git a/ui/src/app/event/event-header-edge-event.tpl.html b/ui/src/app/event/event-header-edge-event.tpl.html index e9770f42bd..e84922f6a5 100644 --- a/ui/src/app/event/event-header-edge-event.tpl.html +++ b/ui/src/app/event/event-header-edge-event.tpl.html @@ -17,7 +17,7 @@ -->
event.event-time
event.event-type
-
edge.event-action
-
edge.entity-id
-
edge.entity-info
-
event.status
+
edge.event-action
+
edge.entity-id
+
edge.status
+
edge.entity-info
diff --git a/ui/src/app/event/event-row-edge-event.tpl.html b/ui/src/app/event/event-row-edge-event.tpl.html index 0b088d8570..ef5efee956 100644 --- a/ui/src/app/event/event-row-edge-event.tpl.html +++ b/ui/src/app/event/event-row-edge-event.tpl.html @@ -17,9 +17,10 @@ -->
{{event.createdTime | date : 'yyyy-MM-dd HH:mm:ss'}}
{{event.edgeEventType}}
-
{{event.edgeEventAction}}
-
{{event.entityId}}
-
+
{{event.edgeEventAction}}
+
{{event.entityId}}
+
{{updateStatus(event.createdTime)}}
+
@@ -32,5 +33,5 @@
-
{{updateStatus(event.createdTime)}}
+ diff --git a/ui/src/app/event/event-row.directive.js b/ui/src/app/event/event-row.directive.js index fd9756a697..11af155176 100644 --- a/ui/src/app/event/event-row.directive.js +++ b/ui/src/app/event/event-row.directive.js @@ -147,7 +147,15 @@ export default function EventRowDirective($compile, $templateCache, $mdDialog, $ scope.updateStatus = function(eventCreatedTime) { if (scope.queueStartTs) { - return (eventCreatedTime < scope.queueStartTs) ? $translate.instant('event.success') : $translate.instant('event.failed'); + var status; + if (eventCreatedTime < scope.queueStartTs) { + status = 'edge.success'; + scope.isPending = false; + } else { + status = 'edge.failed'; + scope.isPending = true; + } + return $translate.instant(status); } } } diff --git a/ui/src/app/locale/locale.constant-en_US.json b/ui/src/app/locale/locale.constant-en_US.json index 57c54c2556..bea55fd30e 100644 --- a/ui/src/app/locale/locale.constant-en_US.json +++ b/ui/src/app/locale/locale.constant-en_US.json @@ -843,7 +843,10 @@ "entity-views": "Edge entity views", "set-root-rule-chain-text": "Please select root rule chain for edge(s)", "set-root-rule-chain-to-edges": "Set root rule chain for Edge(s)", - "set-root-rule-chain-to-edges-text": "Set root rule chain for { count, plural, 1 {1 edge} other {# edges} }" + "set-root-rule-chain-to-edges-text": "Set root rule chain for { count, plural, 1 {1 edge} other {# edges} }", + "status": "Received by edge", + "success": "Deployed", + "failed": "Pending" }, "error": { "unable-to-connect": "Unable to connect to the server! Please check your internet connection.", From 8c9aa0c8dfe47f4b3bbf1f9660f563ef6945cca9 Mon Sep 17 00:00:00 2001 From: deaflynx Date: Tue, 21 Jul 2020 08:44:49 +0300 Subject: [PATCH 06/14] Minor code cleaning --- ui/src/app/event/event-row-edge-event.tpl.html | 10 +++++----- ui/src/app/event/event-row.directive.js | 6 +++--- ui/src/app/event/event-table.directive.js | 6 ++---- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/ui/src/app/event/event-row-edge-event.tpl.html b/ui/src/app/event/event-row-edge-event.tpl.html index ef5efee956..d47ca55b81 100644 --- a/ui/src/app/event/event-row-edge-event.tpl.html +++ b/ui/src/app/event/event-row-edge-event.tpl.html @@ -15,11 +15,11 @@ limitations under the License. --> -
{{event.createdTime | date : 'yyyy-MM-dd HH:mm:ss'}}
-
{{event.edgeEventType}}
-
{{event.edgeEventAction}}
-
{{event.entityId}}
-
{{updateStatus(event.createdTime)}}
+
{{ event.createdTime | date : 'yyyy-MM-dd HH:mm:ss' }}
+
{{ event.edgeEventType }}
+
{{ event.edgeEventAction }}
+
{{ event.entityId }}
+
{{ updateStatus(event.createdTime) | translate }}
Date: Tue, 21 Jul 2020 11:56:19 +0300 Subject: [PATCH 07/14] EdgeEvents: added toast.showError() for deleted entities --- ui/src/app/common/types.constant.js | 13 ++++++ ui/src/app/event/event-row.directive.js | 42 ++++++++++++-------- ui/src/app/locale/locale.constant-en_US.json | 2 +- 3 files changed, 39 insertions(+), 18 deletions(-) diff --git a/ui/src/app/common/types.constant.js b/ui/src/app/common/types.constant.js index 7b37ada832..f48f3e9f03 100644 --- a/ui/src/app/common/types.constant.js +++ b/ui/src/app/common/types.constant.js @@ -389,6 +389,19 @@ export default angular.module('thingsboard.types', []) customer: "CUSTOMER", relation: "RELATION" }, + edgeEventAction: { + updated: "UPDATED", + added: "ADDED", + assignedToEdge: "ASSIGNED_TO_EDGE", + deleted: "DELETED", + unassignedFromEdge: "UNASSIGNED_FROM_EDGE", + alarmAck: "ALARM_ACK", + alarmClear: "ALARM_CLEAR", + credentialsUpdated: "CREDENTIALS_UPDATED", + attributesUpdated: "ATTRIBUTES_UPDATED", + attributesDeleted: "ATTRIBUTES_DELETED", + timeseriesUpdated: "TIMESERIES_UPDATED" + }, importEntityColumnType: { name: { name: 'import.column-type.name', diff --git a/ui/src/app/event/event-row.directive.js b/ui/src/app/event/event-row.directive.js index e5908d88b0..b1b6311e5e 100644 --- a/ui/src/app/event/event-row.directive.js +++ b/ui/src/app/event/event-row.directive.js @@ -102,37 +102,45 @@ export default function EventRowDirective($compile, $templateCache, $mdDialog, $ switch(scope.event.edgeEventType) { case types.edgeEventType.relation: content = angular.toJson(scope.event.entityBody); + showDialog(); break; case types.edgeEventType.ruleChainMetaData: - content = ruleChainService.getRuleChainMetaData(scope.event.entityId, {}).then( + content = ruleChainService.getRuleChainMetaData(scope.event.entityId, {ignoreErrors: true}).then( function success(info) { + showDialog(); return angular.toJson(info); }, function fail() { - toast.showError($translate.instant('edge.load-entity-error')); + showError(); }); break; default: - content = entityService.getEntity(scope.event.edgeEventType, scope.event.entityId, {}).then( + content = entityService.getEntity(scope.event.edgeEventType, scope.event.entityId, {ignoreLoading: true, ignoreErrors: true}).then( function success(info) { + showDialog(); return angular.toJson(info); }, function fail() { - toast.showError($translate.instant('edge.load-entity-error')); + showError(); }); break; } - $mdDialog.show({ - controller: 'EventContentDialogController', - controllerAs: 'vm', - templateUrl: eventErrorDialogTemplate, - locals: {content: content, title: title, contentType: contentType, showingCallback: onShowingCallback}, - parent: angular.element($document[0].body), - fullscreen: true, - targetEvent: $event, - multiple: true, - onShowing: function(scope, element) { - onShowingCallback.onShowing(scope, element); - } - }); + function showDialog() { + $mdDialog.show({ + controller: 'EventContentDialogController', + controllerAs: 'vm', + templateUrl: eventErrorDialogTemplate, + locals: {content: content, title: title, contentType: contentType, showingCallback: onShowingCallback}, + parent: angular.element($document[0].body), + fullscreen: true, + targetEvent: $event, + multiple: true, + onShowing: function(scope, element) { + onShowingCallback.onShowing(scope, element); + } + }); + } + function showError() { + toast.showError($translate.instant('edge.load-entity-error')); + } } scope.checkTooltip = function($event) { diff --git a/ui/src/app/locale/locale.constant-en_US.json b/ui/src/app/locale/locale.constant-en_US.json index bea55fd30e..f8d1c8568a 100644 --- a/ui/src/app/locale/locale.constant-en_US.json +++ b/ui/src/app/locale/locale.constant-en_US.json @@ -821,7 +821,7 @@ "make-private-edge-text": "After the confirmation the edge and all its data will be made private and won't be accessible by others.", "import": "Import edge", "label": "Label", - "load-entity-error": "Could not load entity info", + "load-entity-error": "Entity not found. Failed to load info", "assign-new-edge": "Assign new edge", "manage-edge-dashboards": "Manage edge dashboards", "unassign-from-edge": "Unassign from edge", From 48cced2d0c5a89fabe2d249701d4e95f40d2ba95 Mon Sep 17 00:00:00 2001 From: deaflynx Date: Tue, 21 Jul 2020 11:59:04 +0300 Subject: [PATCH 08/14] Minor code fix --- ui/src/app/event/event-row.directive.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/app/event/event-row.directive.js b/ui/src/app/event/event-row.directive.js index b1b6311e5e..92da9c06b9 100644 --- a/ui/src/app/event/event-row.directive.js +++ b/ui/src/app/event/event-row.directive.js @@ -114,7 +114,7 @@ export default function EventRowDirective($compile, $templateCache, $mdDialog, $ }); break; default: - content = entityService.getEntity(scope.event.edgeEventType, scope.event.entityId, {ignoreLoading: true, ignoreErrors: true}).then( + content = entityService.getEntity(scope.event.edgeEventType, scope.event.entityId, {ignoreErrors: true}).then( function success(info) { showDialog(); return angular.toJson(info); From ac18f1aa95a18ee03c72b2a9eff7fb5d03f9e64f Mon Sep 17 00:00:00 2001 From: deaflynx Date: Wed, 29 Jul 2020 12:36:48 +0300 Subject: [PATCH 09/14] Added edgeAttributeKeys constants --- ui/src/app/common/types.constant.js | 6 ++++++ ui/src/app/event/event-table.directive.js | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/ui/src/app/common/types.constant.js b/ui/src/app/common/types.constant.js index f48f3e9f03..59f1111ab4 100644 --- a/ui/src/app/common/types.constant.js +++ b/ui/src/app/common/types.constant.js @@ -402,6 +402,12 @@ export default angular.module('thingsboard.types', []) attributesDeleted: "ATTRIBUTES_DELETED", timeseriesUpdated: "TIMESERIES_UPDATED" }, + edgeAttributeKeys: { + active: "active", + lastConnectTime: "lastConnectTime", + lastDisconnectTime: "lastDisconnectTime", + queueStartTs: "queueStartTs" + }, importEntityColumnType: { name: { name: 'import.column-type.name', diff --git a/ui/src/app/event/event-table.directive.js b/ui/src/app/event/event-table.directive.js index 1cd61c888e..9c7c57d5d7 100644 --- a/ui/src/app/event/event-table.directive.js +++ b/ui/src/app/event/event-table.directive.js @@ -225,7 +225,7 @@ export default function EventTableDirective($compile, $templateCache, $rootScope scope.loadEdgeInfo = function() { attributeService.getEntityAttributesValues(scope.entityType, scope.entityId, types.attributesScope.server.value, - ["queueStartTs"], {}) + types.edgeAttributeKeys.queueStartTs, {}) .then(function success(attributes) { scope.onUpdate(attributes); }); From c4d7f52cf3e0c552286b1848074b0e6d2c1713b8 Mon Sep 17 00:00:00 2001 From: Bohdan Smetaniuk Date: Thu, 30 Jul 2020 19:46:33 +0300 Subject: [PATCH 10/14] filtering EdgeEvents with TIMESERIES_UPDATE --- .../server/controller/EdgeEventController.java | 2 +- .../thingsboard/server/dao/edge/EdgeEventService.java | 3 +-- .../server/dao/edge/BaseEdgeEventService.java | 9 +++++++-- .../server/dao/edge/CassandraEdgeEventDao.java | 2 +- .../org/thingsboard/server/dao/edge/EdgeEventDao.java | 2 +- .../server/dao/sql/edge/JpaBaseEdgeEventDao.java | 11 ++++++++--- 6 files changed, 19 insertions(+), 10 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/controller/EdgeEventController.java b/application/src/main/java/org/thingsboard/server/controller/EdgeEventController.java index 097b8d0f5c..15578b8593 100644 --- a/application/src/main/java/org/thingsboard/server/controller/EdgeEventController.java +++ b/application/src/main/java/org/thingsboard/server/controller/EdgeEventController.java @@ -61,7 +61,7 @@ public class EdgeEventController extends BaseController { EdgeId edgeId = new EdgeId(toUUID(strEdgeId)); checkEdgeId(edgeId, Operation.READ); TimePageLink pageLink = createPageLink(limit, startTime, endTime, ascOrder, offset); - return checkNotNull(edgeEventService.findEdgeEvents(tenantId, edgeId, pageLink)); + return checkNotNull(edgeEventService.findEdgeEvents(tenantId, edgeId, pageLink, false)); } catch (Exception e) { throw handleException(e); } diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeEventService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeEventService.java index 0d65c134f2..8ab877dd83 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeEventService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeEventService.java @@ -16,9 +16,7 @@ package org.thingsboard.server.dao.edge; import com.google.common.util.concurrent.ListenableFuture; -import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.edge.EdgeEvent; -import org.thingsboard.server.common.data.edge.EdgeEventType; import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.page.TimePageData; @@ -30,4 +28,5 @@ public interface EdgeEventService { TimePageData findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink); + TimePageData findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink, boolean withTsUpdate); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/edge/BaseEdgeEventService.java b/dao/src/main/java/org/thingsboard/server/dao/edge/BaseEdgeEventService.java index 75bc3046c4..efb2c7198a 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/edge/BaseEdgeEventService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/edge/BaseEdgeEventService.java @@ -35,7 +35,7 @@ import java.util.List; public class BaseEdgeEventService implements EdgeEventService { @Autowired - public EdgeEventDao edgeEventDao; + private EdgeEventDao edgeEventDao; @Override public ListenableFuture saveAsync(EdgeEvent edgeEvent) { @@ -45,7 +45,12 @@ public class BaseEdgeEventService implements EdgeEventService { @Override public TimePageData findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink) { - List events = edgeEventDao.findEdgeEvents(tenantId.getId(), edgeId, pageLink); + return findEdgeEvents(tenantId, edgeId, pageLink, true); + } + + @Override + public TimePageData findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink, boolean withTsUpdate) { + List events = edgeEventDao.findEdgeEvents(tenantId.getId(), edgeId, pageLink, withTsUpdate); return new TimePageData<>(events, pageLink); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/edge/CassandraEdgeEventDao.java b/dao/src/main/java/org/thingsboard/server/dao/edge/CassandraEdgeEventDao.java index 8483197f1b..e127abad39 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/edge/CassandraEdgeEventDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/edge/CassandraEdgeEventDao.java @@ -53,7 +53,7 @@ public class CassandraEdgeEventDao extends CassandraAbstractSearchTimeDao findEdgeEvents(UUID tenantId, EdgeId edgeId, TimePageLink pageLink) { + public List findEdgeEvents(UUID tenantId, EdgeId edgeId, TimePageLink pageLink, boolean withTsUpdate) { return null; } } diff --git a/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeEventDao.java b/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeEventDao.java index 426bada645..bf7b263e44 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeEventDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeEventDao.java @@ -46,6 +46,6 @@ public interface EdgeEventDao extends Dao { * @param pageLink the pageLink * @return the event list */ - List findEdgeEvents(UUID tenantId, EdgeId edgeId, TimePageLink pageLink); + List findEdgeEvents(UUID tenantId, EdgeId edgeId, TimePageLink pageLink, boolean withTsUpdate); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaBaseEdgeEventDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaBaseEdgeEventDao.java index 11a4a1dc64..4408b8ebae 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaBaseEdgeEventDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaBaseEdgeEventDao.java @@ -26,6 +26,7 @@ import org.springframework.data.jpa.domain.Specification; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.UUIDConverter; +import org.thingsboard.server.common.data.audit.ActionType; import org.thingsboard.server.common.data.edge.EdgeEvent; import org.thingsboard.server.common.data.id.EdgeEventId; import org.thingsboard.server.common.data.id.EdgeId; @@ -75,9 +76,9 @@ public class JpaBaseEdgeEventDao extends JpaAbstractSearchTimeDao findEdgeEvents(UUID tenantId, EdgeId edgeId, TimePageLink pageLink) { + public List findEdgeEvents(UUID tenantId, EdgeId edgeId, TimePageLink pageLink, boolean withTsUpdate) { Specification timeSearchSpec = JpaAbstractSearchTimeDao.getTimeSearchPageSpec(pageLink, "id"); - Specification fieldsSpec = getEntityFieldsSpec(tenantId, edgeId); + Specification fieldsSpec = getEntityFieldsSpec(tenantId, edgeId, withTsUpdate); Sort.Direction sortDirection = pageLink.isAscOrder() ? Sort.Direction.ASC : Sort.Direction.DESC; Pageable pageable = PageRequest.of(0, pageLink.getLimit(), sortDirection, ID_PROPERTY); return DaoUtil.convertDataList(edgeEventRepository.findAll(Specification.where(timeSearchSpec).and(fieldsSpec), pageable).getContent()); @@ -95,7 +96,7 @@ public class JpaBaseEdgeEventDao extends JpaAbstractSearchTimeDao getEntityFieldsSpec(UUID tenantId, EdgeId edgeId) { + private Specification getEntityFieldsSpec(UUID tenantId, EdgeId edgeId, boolean withTsUpdate) { return (root, criteriaQuery, criteriaBuilder) -> { List predicates = new ArrayList<>(); if (tenantId != null) { @@ -106,6 +107,10 @@ public class JpaBaseEdgeEventDao extends JpaAbstractSearchTimeDao Date: Fri, 31 Jul 2020 10:13:03 +0300 Subject: [PATCH 11/14] Introduced Edge Lifecycle. Update Edge session configuration --- .../server/actors/ActorSystemContext.java | 16 ++++---- .../server/actors/tenant/TenantActor.java | 17 +++++++- .../server/controller/EdgeController.java | 9 ++++ .../service/edge/rpc/EdgeGrpcService.java | 20 ++++++++- .../service/edge/rpc/EdgeGrpcSession.java | 14 +++++++ .../service/edge/rpc/EdgeRpcService.java | 41 +++++++++++++++++++ 6 files changed, 107 insertions(+), 10 deletions(-) create mode 100644 application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeRpcService.java diff --git a/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java b/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java index 78caa4a626..3f4dcb3c0b 100644 --- a/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java +++ b/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java @@ -66,6 +66,7 @@ import org.thingsboard.server.dao.user.UserService; import org.thingsboard.server.queue.discovery.PartitionService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.service.component.ComponentDiscoveryService; +import org.thingsboard.server.service.edge.rpc.EdgeRpcService; import org.thingsboard.server.service.encoding.DataDecodingEncodingService; import org.thingsboard.server.service.executors.DbCallbackExecutorService; import org.thingsboard.server.service.executors.ExternalCallExecutorService; @@ -254,15 +255,14 @@ public class ActorSystemContext { @Getter private TbCoreDeviceRpcService tbCoreDeviceRpcService; - @Lazy - @Autowired - @Getter - private EdgeService edgeService; + @Autowired(required = false) + @Getter private EdgeService edgeService; - @Lazy - @Autowired - @Getter - private EdgeEventService edgeEventService; + @Autowired(required = false) + @Getter private EdgeEventService edgeEventService; + + @Autowired(required = false) + @Getter private EdgeRpcService edgeRpcService; @Value("${actors.session.max_concurrent_sessions_per_device:1}") @Getter diff --git a/application/src/main/java/org/thingsboard/server/actors/tenant/TenantActor.java b/application/src/main/java/org/thingsboard/server/actors/tenant/TenantActor.java index 7ce5fb3206..fde6f688c5 100644 --- a/application/src/main/java/org/thingsboard/server/actors/tenant/TenantActor.java +++ b/application/src/main/java/org/thingsboard/server/actors/tenant/TenantActor.java @@ -31,10 +31,13 @@ import org.thingsboard.server.actors.service.ContextBasedCreator; import org.thingsboard.server.actors.service.DefaultActorService; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.Tenant; +import org.thingsboard.server.common.data.edge.Edge; import org.thingsboard.server.common.data.id.DeviceId; +import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.RuleChainId; import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; import org.thingsboard.server.common.data.rule.RuleChain; import org.thingsboard.server.common.data.rule.RuleChainType; import org.thingsboard.server.common.msg.MsgType; @@ -47,6 +50,7 @@ import org.thingsboard.server.common.msg.queue.PartitionChangeMsg; import org.thingsboard.server.common.msg.queue.QueueToRuleEngineMsg; import org.thingsboard.server.common.msg.queue.RuleEngineException; import org.thingsboard.server.common.msg.queue.ServiceType; +import org.thingsboard.server.service.edge.rpc.EdgeRpcService; import java.util.List; import java.util.Optional; @@ -202,7 +206,18 @@ public class TenantActor extends RuleChainManagerActor { } private void onComponentLifecycleMsg(ComponentLifecycleMsg msg) { - if (isRuleEngineForCurrentTenant) { + if (msg.getEntityId().getEntityType() == EntityType.EDGE) { + EdgeId edgeId = new EdgeId(msg.getEntityId().getId()); + EdgeRpcService edgeRpcService = systemContext.getEdgeRpcService(); + if (msg.getEvent() == ComponentLifecycleEvent.DELETED) { + edgeRpcService.deleteEdge(edgeId); + } else { + Edge edge = systemContext.getEdgeService().findEdgeById(tenantId, edgeId); + if (msg.getEvent() == ComponentLifecycleEvent.UPDATED) { + edgeRpcService.updateEdge(edge); + } + } + } else if (isRuleEngineForCurrentTenant) { TbActorRef target = getEntityActorRef(msg.getEntityId()); if (target != null) { if (msg.getEntityId().getEntityType() == EntityType.RULE_CHAIN) { diff --git a/application/src/main/java/org/thingsboard/server/controller/EdgeController.java b/application/src/main/java/org/thingsboard/server/controller/EdgeController.java index b6f2c31561..3c17176b88 100644 --- a/application/src/main/java/org/thingsboard/server/controller/EdgeController.java +++ b/application/src/main/java/org/thingsboard/server/controller/EdgeController.java @@ -40,6 +40,7 @@ import org.thingsboard.server.common.data.id.RuleChainId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.page.TextPageData; import org.thingsboard.server.common.data.page.TextPageLink; +import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; import org.thingsboard.server.common.data.rule.RuleChain; import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.IncorrectParameterException; @@ -101,6 +102,9 @@ public class EdgeController extends BaseController { edgeService.assignDefaultRuleChainsToEdge(tenantId, savedEdge.getId()); } + tbClusterService.onEntityStateChange(savedEdge.getTenantId(), savedEdge.getId(), + created ? ComponentLifecycleEvent.CREATED : ComponentLifecycleEvent.UPDATED); + logEntityAction(savedEdge.getId(), savedEdge, null, created ? ActionType.ADDED : ActionType.UPDATED, null); return savedEdge; } catch (Exception e) { @@ -120,6 +124,9 @@ public class EdgeController extends BaseController { Edge edge = checkEdgeId(edgeId, Operation.DELETE); edgeService.deleteEdge(getTenantId(), edgeId); + tbClusterService.onEntityStateChange(getTenantId(), edgeId, + ComponentLifecycleEvent.DELETED); + logEntityAction(edgeId, edge, null, ActionType.DELETED, null, strEdgeId); @@ -284,6 +291,8 @@ public class EdgeController extends BaseController { Edge updatedEdge = edgeNotificationService.setEdgeRootRuleChain(getTenantId(), edge, ruleChainId); + tbClusterService.onEntityStateChange(updatedEdge.getTenantId(), updatedEdge.getId(), ComponentLifecycleEvent.UPDATED); + logEntityAction(updatedEdge.getId(), updatedEdge, null, ActionType.UPDATED, null); return updatedEdge; diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcService.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcService.java index 3792fbdf73..8e2990c75f 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcService.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcService.java @@ -27,6 +27,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Service; import org.thingsboard.server.common.data.DataConstants; +import org.thingsboard.server.common.data.edge.Edge; import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.kv.BasicTsKvEntry; @@ -52,7 +53,7 @@ import java.util.concurrent.Executors; @Service @Slf4j @ConditionalOnProperty(prefix = "edges.rpc", value = "enabled", havingValue = "true") -public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase { +public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase implements EdgeRpcService { private final Map sessions = new ConcurrentHashMap<>(); private static final ObjectMapper mapper = new ObjectMapper(); @@ -117,6 +118,23 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase { return new EdgeGrpcSession(ctx, outputStream, this::onEdgeConnect, this::onEdgeDisconnect, mapper).getInputStream(); } + @Override + public void updateEdge(Edge edge) { + EdgeGrpcSession session = sessions.get(edge.getId()); + if (session != null && session.isConnected()) { + session.onConfigurationUpdate(edge); + } + } + + @Override + public void deleteEdge(EdgeId edgeId) { + EdgeGrpcSession session = sessions.get(edgeId); + if (session != null && session.isConnected()) { + session.close(); + sessions.remove(edgeId); + } + } + private void onEdgeConnect(EdgeId edgeId, EdgeGrpcSession edgeGrpcSession) { sessions.put(edgeId, edgeGrpcSession); save(edgeId, DefaultDeviceStateService.ACTIVITY_STATE, true); diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java index 9a5632bde4..72014cf1c9 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java @@ -192,6 +192,20 @@ public final class EdgeGrpcSession implements Closeable { }; } + void onConfigurationUpdate(Edge edge) { + try { + this.edge = edge; + // TODO: voba - push edge configuration update to edge +// outputStream.onNext(org.thingsboard.server.gen.integration.ResponseMsg.newBuilder() +// .setIntegrationUpdateMsg(IntegrationUpdateMsg.newBuilder() +// .setConfiguration(constructIntegrationConfigProto(configuration, defaultConverterProto, downLinkConverterProto)) +// .build()) +// .build()); + } catch (Exception e) { + log.error("Failed to construct proto objects!", e); + } + } + void processHandleMessages() throws ExecutionException, InterruptedException { Long queueStartTs = getQueueStartTs().get(); TimePageLink pageLink = new TimePageLink(ctx.getEdgeEventStorageSettings().getMaxReadRecordsCount(), queueStartTs, null, true); diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeRpcService.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeRpcService.java new file mode 100644 index 0000000000..27cd81250b --- /dev/null +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeRpcService.java @@ -0,0 +1,41 @@ +/** + * ThingsBoard, Inc. ("COMPANY") CONFIDENTIAL + * + * Copyright © 2016-2020 ThingsBoard, Inc. All Rights Reserved. + * + * NOTICE: All information contained herein is, and remains + * the property of ThingsBoard, Inc. and its suppliers, + * if any. The intellectual and technical concepts contained + * herein are proprietary to ThingsBoard, Inc. + * and its suppliers and may be covered by U.S. and Foreign Patents, + * patents in process, and are protected by trade secret or copyright law. + * + * Dissemination of this information or reproduction of this material is strictly forbidden + * unless prior written permission is obtained from COMPANY. + * + * Access to the source code contained herein is hereby forbidden to anyone except current COMPANY employees, + * managers or contractors who have executed Confidentiality and Non-disclosure agreements + * explicitly covering such access. + * + * The copyright notice above does not evidence any actual or intended publication + * or disclosure of this source code, which includes + * information that is confidential and/or proprietary, and is a trade secret, of COMPANY. + * ANY REPRODUCTION, MODIFICATION, DISTRIBUTION, PUBLIC PERFORMANCE, + * OR PUBLIC DISPLAY OF OR THROUGH USE OF THIS SOURCE CODE WITHOUT + * THE EXPRESS WRITTEN CONSENT OF COMPANY IS STRICTLY PROHIBITED, + * AND IN VIOLATION OF APPLICABLE LAWS AND INTERNATIONAL TREATIES. + * THE RECEIPT OR POSSESSION OF THIS SOURCE CODE AND/OR RELATED INFORMATION + * DOES NOT CONVEY OR IMPLY ANY RIGHTS TO REPRODUCE, DISCLOSE OR DISTRIBUTE ITS CONTENTS, + * OR TO MANUFACTURE, USE, OR SELL ANYTHING THAT IT MAY DESCRIBE, IN WHOLE OR IN PART. + */ +package org.thingsboard.server.service.edge.rpc; + +import org.thingsboard.server.common.data.edge.Edge; +import org.thingsboard.server.common.data.id.EdgeId; + +public interface EdgeRpcService { + + void updateEdge(Edge edge); + + void deleteEdge(EdgeId edgeId); +} From ce746b4f91b0bff088e18869825b30012846a1bf Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Fri, 31 Jul 2020 11:13:07 +0300 Subject: [PATCH 12/14] Fixed license header --- .../service/edge/rpc/EdgeRpcService.java | 35 ++++++------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeRpcService.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeRpcService.java index 27cd81250b..2355a2e49a 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeRpcService.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeRpcService.java @@ -1,32 +1,17 @@ /** - * ThingsBoard, Inc. ("COMPANY") CONFIDENTIAL + * Copyright © 2016-2020 The Thingsboard Authors * - * Copyright © 2016-2020 ThingsBoard, Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * NOTICE: All information contained herein is, and remains - * the property of ThingsBoard, Inc. and its suppliers, - * if any. The intellectual and technical concepts contained - * herein are proprietary to ThingsBoard, Inc. - * and its suppliers and may be covered by U.S. and Foreign Patents, - * patents in process, and are protected by trade secret or copyright law. + * http://www.apache.org/licenses/LICENSE-2.0 * - * Dissemination of this information or reproduction of this material is strictly forbidden - * unless prior written permission is obtained from COMPANY. - * - * Access to the source code contained herein is hereby forbidden to anyone except current COMPANY employees, - * managers or contractors who have executed Confidentiality and Non-disclosure agreements - * explicitly covering such access. - * - * The copyright notice above does not evidence any actual or intended publication - * or disclosure of this source code, which includes - * information that is confidential and/or proprietary, and is a trade secret, of COMPANY. - * ANY REPRODUCTION, MODIFICATION, DISTRIBUTION, PUBLIC PERFORMANCE, - * OR PUBLIC DISPLAY OF OR THROUGH USE OF THIS SOURCE CODE WITHOUT - * THE EXPRESS WRITTEN CONSENT OF COMPANY IS STRICTLY PROHIBITED, - * AND IN VIOLATION OF APPLICABLE LAWS AND INTERNATIONAL TREATIES. - * THE RECEIPT OR POSSESSION OF THIS SOURCE CODE AND/OR RELATED INFORMATION - * DOES NOT CONVEY OR IMPLY ANY RIGHTS TO REPRODUCE, DISCLOSE OR DISTRIBUTE ITS CONTENTS, - * OR TO MANUFACTURE, USE, OR SELL ANYTHING THAT IT MAY DESCRIBE, IN WHOLE OR IN PART. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.thingsboard.server.service.edge.rpc; From 71a3fa68f1c987447965b277c0d2a35b3aea774f Mon Sep 17 00:00:00 2001 From: Bohdan Smetaniuk Date: Fri, 31 Jul 2020 11:38:25 +0300 Subject: [PATCH 13/14] fixes --- .../server/service/edge/DefaultEdgeNotificationService.java | 2 +- .../org/thingsboard/server/dao/edge/EdgeEventService.java | 2 -- .../thingsboard/server/dao/edge/BaseEdgeEventService.java | 5 ----- .../server/dao/service/BaseEdgeEventServiceTest.java | 4 ++-- 4 files changed, 3 insertions(+), 10 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/edge/DefaultEdgeNotificationService.java b/application/src/main/java/org/thingsboard/server/service/edge/DefaultEdgeNotificationService.java index 47c6ece48f..c90c05746f 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/DefaultEdgeNotificationService.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/DefaultEdgeNotificationService.java @@ -111,7 +111,7 @@ public class DefaultEdgeNotificationService implements EdgeNotificationService { @Override public TimePageData findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink) { - return edgeEventService.findEdgeEvents(tenantId, edgeId, pageLink); + return edgeEventService.findEdgeEvents(tenantId, edgeId, pageLink, true); } @Override diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeEventService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeEventService.java index 8ab877dd83..1c65c34a08 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeEventService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeEventService.java @@ -26,7 +26,5 @@ public interface EdgeEventService { ListenableFuture saveAsync(EdgeEvent edgeEvent); - TimePageData findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink); - TimePageData findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink, boolean withTsUpdate); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/edge/BaseEdgeEventService.java b/dao/src/main/java/org/thingsboard/server/dao/edge/BaseEdgeEventService.java index efb2c7198a..08e5d2570f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/edge/BaseEdgeEventService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/edge/BaseEdgeEventService.java @@ -43,11 +43,6 @@ public class BaseEdgeEventService implements EdgeEventService { return edgeEventDao.saveAsync(edgeEvent); } - @Override - public TimePageData findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink) { - return findEdgeEvents(tenantId, edgeId, pageLink, true); - } - @Override public TimePageData findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink, boolean withTsUpdate) { List events = edgeEventDao.findEdgeEvents(tenantId.getId(), edgeId, pageLink, withTsUpdate); diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/BaseEdgeEventServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/BaseEdgeEventServiceTest.java index f4d622daa5..aa0a3c79e4 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/BaseEdgeEventServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/BaseEdgeEventServiceTest.java @@ -82,7 +82,7 @@ public abstract class BaseEdgeEventServiceTest extends AbstractServiceTest { EdgeEvent savedEdgeEvent3 = saveEdgeEventWithProvidedTime(eventTime + 2, edgeId, deviceId, tenantId); saveEdgeEventWithProvidedTime(timeAfterEndTime, edgeId, deviceId, tenantId); - TimePageData edgeEvents = edgeEventService.findEdgeEvents(tenantId, edgeId, new TimePageLink(2, startTime, endTime, false)); + TimePageData edgeEvents = edgeEventService.findEdgeEvents(tenantId, edgeId, new TimePageLink(2, startTime, endTime, false), true); Assert.assertNotNull(edgeEvents.getData()); Assert.assertTrue(edgeEvents.getData().size() == 2); @@ -91,7 +91,7 @@ public abstract class BaseEdgeEventServiceTest extends AbstractServiceTest { Assert.assertTrue(edgeEvents.hasNext()); Assert.assertNotNull(edgeEvents.getNextPageLink()); - edgeEvents = edgeEventService.findEdgeEvents(tenantId, edgeId, edgeEvents.getNextPageLink()); + edgeEvents = edgeEventService.findEdgeEvents(tenantId, edgeId, edgeEvents.getNextPageLink(), true); Assert.assertNotNull(edgeEvents.getData()); Assert.assertTrue(edgeEvents.getData().size() == 1); From c56c2c4c5d0b9c510e88ee4dfa1951c65bc363a6 Mon Sep 17 00:00:00 2001 From: Bohdan Smetaniuk Date: Fri, 31 Jul 2020 17:10:35 +0300 Subject: [PATCH 14/14] added test --- .../dao/service/BaseEdgeEventServiceTest.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/BaseEdgeEventServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/BaseEdgeEventServiceTest.java index aa0a3c79e4..5da642d254 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/BaseEdgeEventServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/BaseEdgeEventServiceTest.java @@ -19,6 +19,7 @@ import com.datastax.driver.core.utils.UUIDs; import org.junit.Assert; import org.junit.Test; import org.thingsboard.server.common.data.DataConstants; +import org.thingsboard.server.common.data.audit.ActionType; import org.thingsboard.server.common.data.edge.EdgeEvent; import org.thingsboard.server.common.data.edge.EdgeEventType; import org.thingsboard.server.common.data.id.DeviceId; @@ -100,6 +101,26 @@ public abstract class BaseEdgeEventServiceTest extends AbstractServiceTest { Assert.assertNull(edgeEvents.getNextPageLink()); } + @Test + public void findEdgeEventsWithTsUpdateAndWithout() throws Exception { + EdgeId edgeId = new EdgeId(UUIDs.timeBased()); + DeviceId deviceId = new DeviceId(UUIDs.timeBased()); + TenantId tenantId = new TenantId(UUIDs.timeBased()); + TimePageLink pageLink = new TimePageLink(1); + + EdgeEvent edgeEventWithTsUpdate = generateEdgeEvent(tenantId, edgeId, deviceId, ActionType.TIMESERIES_UPDATED.name()); + edgeEventService.saveAsync(edgeEventWithTsUpdate); + + TimePageData allEdgeEvents = edgeEventService.findEdgeEvents(tenantId, edgeId, pageLink, true); + TimePageData edgeEventsWithoutTsUpdate = edgeEventService.findEdgeEvents(tenantId, edgeId, pageLink, false); + + Assert.assertNotNull(allEdgeEvents.getData()); + Assert.assertNotNull(edgeEventsWithoutTsUpdate.getData()); + Assert.assertEquals(1, allEdgeEvents.getData().size()); + Assert.assertEquals(allEdgeEvents.getData().get(0).getUuidId(), edgeEventWithTsUpdate.getUuidId()); + Assert.assertTrue(edgeEventsWithoutTsUpdate.getData().isEmpty()); + } + private EdgeEvent saveEdgeEventWithProvidedTime(long time, EdgeId edgeId, EntityId entityId, TenantId tenantId) throws Exception { EdgeEvent edgeEvent = generateEdgeEvent(tenantId, edgeId, entityId, DataConstants.ENTITY_CREATED); edgeEvent.setId(new EdgeEventId(UUIDs.startOf(time)));