From 817d59ada9250223cba7b8350fd9214fb3e5e6aa Mon Sep 17 00:00:00 2001 From: Artem Babak Date: Mon, 21 Dec 2020 18:07:18 +0200 Subject: [PATCH 01/24] Edge management: menu refactored, hide menu section --- ui/src/app/api/user.service.js | 24 +++- ui/src/app/rulechain/rulechain.controller.js | 4 +- ui/src/app/rulechain/rulechain.routes.js | 62 +++++++--- ui/src/app/rulechain/rulechains.controller.js | 6 +- ui/src/app/services/menu.service.js | 113 +++++++++--------- 5 files changed, 129 insertions(+), 80 deletions(-) diff --git a/ui/src/app/api/user.service.js b/ui/src/app/api/user.service.js index b84bcf8428..9d99681b0d 100644 --- a/ui/src/app/api/user.service.js +++ b/ui/src/app/api/user.service.js @@ -29,7 +29,8 @@ function UserService($http, $q, $rootScope, adminService, dashboardService, time allowedDashboardIds = [], redirectParams = null, userTokenAccessEnabled = false, - userLoaded = false; + userLoaded = false, + edgesSupportEnabled = false; var refreshTokenQueue = []; @@ -65,7 +66,9 @@ function UserService($http, $q, $rootScope, adminService, dashboardService, time reloadUser: reloadUser, isUserTokenAccessEnabled: isUserTokenAccessEnabled, loginAsUser: loginAsUser, - setUserCredentialsEnabled: setUserCredentialsEnabled + setUserCredentialsEnabled: setUserCredentialsEnabled, + isEdgesSupportEnabled: isEdgesSupportEnabled, + loadIsEdgesSupportEnabled: loadIsEdgesSupportEnabled } reloadUser(); @@ -451,6 +454,7 @@ function UserService($http, $q, $rootScope, adminService, dashboardService, time function loadSystemParams() { var promises = []; promises.push(loadIsUserTokenAccessEnabled()); + promises.push(loadIsEdgesSupportEnabled()); promises.push(timeService.loadMaxDatapointsLimit()); return $q.all(promises); } @@ -685,4 +689,20 @@ function UserService($http, $q, $rootScope, adminService, dashboardService, time }); } + function isEdgesSupportEnabled() { + return edgesSupportEnabled; + } + + function loadIsEdgesSupportEnabled() { + var deferred = $q.defer(); + var url = '/api/edges/enabled'; + $http.get(url).then(function success(response) { + edgesSupportEnabled = response.data; + deferred.resolve(response.data); + }, function fail() { + deferred.reject(); + }); + return deferred.promise; + } + } diff --git a/ui/src/app/rulechain/rulechain.controller.js b/ui/src/app/rulechain/rulechain.controller.js index 51f82108c2..fee537f309 100644 --- a/ui/src/app/rulechain/rulechain.controller.js +++ b/ui/src/app/rulechain/rulechain.controller.js @@ -1270,9 +1270,9 @@ export function RuleChainController($state, $scope, $compile, $q, $mdUtil, $time vm.isImport = false; $mdUtil.nextTick(() => { if (vm.ruleChain.type === vm.types.ruleChainType.core) { - $state.go('home.ruleChains.core.ruleChain', {ruleChainId: vm.ruleChain.id.id}); + $state.go('home.ruleChains.ruleChain', {ruleChainId: vm.ruleChain.id.id}); } else { - $state.go('home.ruleChains.edge.ruleChain', {ruleChainId: vm.ruleChain.id.id}); + $state.go('home.edges.edgeRuleChains.ruleChain', {ruleChainId: vm.ruleChain.id.id}); } }); } else { diff --git a/ui/src/app/rulechain/rulechain.routes.js b/ui/src/app/rulechain/rulechain.routes.js index 8a5c13cc1d..a1d5da43e2 100644 --- a/ui/src/app/rulechain/rulechain.routes.js +++ b/ui/src/app/rulechain/rulechain.routes.js @@ -29,15 +29,6 @@ export default function RuleChainRoutes($stateProvider, NodeTemplatePathProvider $stateProvider .state('home.ruleChains', { url: '/ruleChains', - module: 'private', - auth: ['SYS_ADMIN', 'TENANT_ADMIN'], - redirectTo: 'home.ruleChains.core', - ncyBreadcrumb: { - label: '{"icon": "settings_ethernet", "label": "rulechain.rulechains"}' - } - }) - .state('home.ruleChains.core', { - url: '/ruleChains/core', params: {'topIndex': 0}, module: 'private', auth: ['SYS_ADMIN', 'TENANT_ADMIN'], @@ -50,13 +41,13 @@ export default function RuleChainRoutes($stateProvider, NodeTemplatePathProvider }, data: { searchEnabled: true, - pageTitle: 'rulechain.core-rulechains', + pageTitle: 'rulechain.rulechains', ruleChainsType: 'tenant' }, ncyBreadcrumb: { - label: '{"icon": "settings_ethernet", "label": "rulechain.core-rulechains"}' + label: '{"icon": "settings_ethernet", "label": "rulechain.rulechains"}' } - }).state('home.ruleChains.core.ruleChain', { + }).state('home.ruleChains.ruleChain', { url: '/:ruleChainId', reloadOnSearch: false, module: 'private', @@ -134,8 +125,8 @@ export default function RuleChainRoutes($stateProvider, NodeTemplatePathProvider ncyBreadcrumb: { label: '{"icon": "settings_ethernet", "label": "{{ (\'rulechain.import\' | translate) + \': \'+ vm.ruleChain.name }}", "translate": "false"}' } - }).state('home.ruleChains.edge', { - url: '/ruleChains/edge', + }).state('home.edges.edgeRuleChains', { + url: '/ruleChains', params: {'topIndex': 0}, module: 'private', auth: ['TENANT_ADMIN'], @@ -154,7 +145,7 @@ export default function RuleChainRoutes($stateProvider, NodeTemplatePathProvider ncyBreadcrumb: { label: '{"icon": "code", "label": "rulechain.edge-rulechains"}' } - }).state('home.ruleChains.edge.ruleChain', { + }).state('home.edges.edgeRuleChains.ruleChain', { url: '/:ruleChainId', reloadOnSearch: false, module: 'private', @@ -191,5 +182,46 @@ export default function RuleChainRoutes($stateProvider, NodeTemplatePathProvider ncyBreadcrumb: { label: '{"icon": "code", "label": "{{ vm.ruleChain.name }}", "translate": "false"}' } + }).state('home.edges.edgeRuleChains.importRuleChain', { + url: '/edges/ruleChains/import', + reloadOnSearch: false, + module: 'private', + auth: ['SYS_ADMIN', 'TENANT_ADMIN'], + views: { + "content@home": { + templateUrl: ruleChainTemplate, + controller: 'RuleChainController', + controllerAs: 'vm' + } + }, + params: { + ruleChainImport: {}, + ruleChainType: {} + }, + resolve: { + ruleChain: + /*@ngInject*/ + function($stateParams) { + return $stateParams.ruleChainImport.ruleChain; + }, + ruleChainMetaData: + /*@ngInject*/ + function($stateParams) { + return $stateParams.ruleChainImport.metadata; + }, + ruleNodeComponents: + /*@ngInject*/ + function($stateParams, ruleChainService) { + return ruleChainService.getRuleNodeComponents($stateParams.ruleChainType); + } + }, + data: { + import: true, + searchEnabled: true, + pageTitle: 'edge.rulechain' + }, + ncyBreadcrumb: { + label: '{"icon": "code", "label": "{{ (\'rulechain.import\' | translate) + \': \'+ vm.ruleChain.name }}", "translate": "false"}' + } }); } diff --git a/ui/src/app/rulechain/rulechains.controller.js b/ui/src/app/rulechain/rulechains.controller.js index 65eb62abbe..6de188e4a7 100644 --- a/ui/src/app/rulechain/rulechains.controller.js +++ b/ui/src/app/rulechain/rulechains.controller.js @@ -247,7 +247,7 @@ export default function RuleChainsController(ruleChainService, userService, impo onAction: function ($event) { importExport.importRuleChain($event, types.ruleChainType.edge).then( function(ruleChainImport) { - $state.go('home.ruleChains.importRuleChain', {ruleChainImport:ruleChainImport, ruleChainType: types.ruleChainType.edge}); + $state.go('home.edges.edgeRuleChains.importRuleChain', {ruleChainImport:ruleChainImport, ruleChainType: types.ruleChainType.edge}); } ); }, @@ -401,9 +401,9 @@ export default function RuleChainsController(ruleChainService, userService, impo if (vm.ruleChainsScope === 'edge') { $state.go('home.edges.ruleChains.ruleChain', Object.assign(ruleChainParams, edgeId = vm.edge.id.id)); } else if (vm.ruleChainsScope === 'edges') { - $state.go('home.ruleChains.edge.ruleChain', ruleChainParams); + $state.go('home.edges.edgeRuleChains.ruleChain', ruleChainParams); } else { - $state.go('home.ruleChains.core.ruleChain', ruleChainParams); + $state.go('home.ruleChains.ruleChain', ruleChainParams); } } diff --git a/ui/src/app/services/menu.service.js b/ui/src/app/services/menu.service.js index 4cad286de8..d46c477f4a 100644 --- a/ui/src/app/services/menu.service.js +++ b/ui/src/app/services/menu.service.js @@ -58,6 +58,45 @@ function Menu(userService, $state, $rootScope) { if (authority !== user.authority) { sections = []; authority = user.authority; + var edgeMenuSection = { + side: { + name: 'edge.management', + type: 'toggle', + state: 'home.edges', + height: '80px', + icon: 'router', + pages: [ + { + name: 'edge.edges', + type: 'link', + state: 'home.edges', + icon: 'router' + }, + { + name: 'rulechain.edge-rulechains', + type: 'link', + state: 'home.edges.edgeRuleChains', + icon: 'code' + } + ] + }, + home: { + name: 'edge.management', + places: [ + { + name: 'edge.edges', + icon: 'router', + state: 'home.edges' + }, + { + name: 'rulechain.edge-rulechains', + icon: 'code', + state: 'home.edges.edgeRuleChains' + } + ] + + } + } if (authority === 'SYS_ADMIN') { sections = [ { @@ -156,24 +195,9 @@ function Menu(userService, $state, $rootScope) { }, { name: 'rulechain.rulechains', - type: 'toggle', + type: 'link', state: 'home.ruleChains', - height: '80px', - icon: 'settings_ethernet', - pages: [ - { - name: 'rulechain.core-rulechains', - type: 'link', - state: 'home.ruleChains.core', - icon: 'settings_ethernet' - }, - { - name: 'rulechain.edge-rulechains', - type: 'link', - state: 'home.ruleChains.edge', - icon: 'code' - } - ] + icon: 'settings_ethernet' }, { name: 'customer.customers', @@ -199,12 +223,6 @@ function Menu(userService, $state, $rootScope) { state: 'home.entityViews', icon: 'view_quilt' }, - { - name: 'edge.edges', - type: 'link', - state: 'home.edges', - icon: 'router' - }, { name: 'widget.widget-library', type: 'link', @@ -226,17 +244,12 @@ function Menu(userService, $state, $rootScope) { homeSections = [{ - name: 'rulechain.management', + name: 'rulechain.rulechains', places: [ { - name: 'rulechain.core-rulechains', + name: 'rulechain.rulechains', icon: 'settings_ethernet', - state: 'home.ruleChains.core' - }, - { - name: 'rulechain.edge-rulechains', - icon: 'code', - state: 'home.ruleChains.edge' + state: 'home.ruleChains' } ] }, @@ -280,16 +293,6 @@ function Menu(userService, $state, $rootScope) { } ] }, - { - name: 'edge.management', - places: [ - { - name: 'edge.edges', - icon: 'router', - state: 'home.edges' - } - ] - }, { name: 'dashboard.management', places: [ @@ -316,6 +319,11 @@ function Menu(userService, $state, $rootScope) { ] }]; + if (userService.isEdgesSupportEnabled()) { + sections.splice(6, 0, edgeMenuSection.side); + homeSections.splice(5, 0, edgeMenuSection.home); + } + } else if (authority === 'CUSTOMER_USER') { sections = [ { @@ -342,12 +350,6 @@ function Menu(userService, $state, $rootScope) { state: 'home.entityViews', icon: 'view_quilt' }, - { - name: 'edge.edges', - type: 'link', - state: 'home.edges', - icon: 'router' - }, { name: 'dashboard.dashboards', type: 'link', @@ -386,16 +388,6 @@ function Menu(userService, $state, $rootScope) { } ] }, - { - name: 'edge.management', - places: [ - { - name: 'edge.edges', - icon: 'router', - state: 'home.edges' - } - ] - }, { name: 'dashboard.view-dashboards', places: [ @@ -406,6 +398,11 @@ function Menu(userService, $state, $rootScope) { } ] }]; + + if (userService.isEdgesSupportEnabled()) { + sections.splice(4, 0, edgeMenuSection.side); + homeSections.splice(3, 0, edgeMenuSection.home); + } } } } @@ -423,4 +420,4 @@ function Menu(userService, $state, $rootScope) { return $state.includes(section.state); } -} \ No newline at end of file +} From ee1da2fd6a5004fdafa2bc18f589614580c78f67 Mon Sep 17 00:00:00 2001 From: Artem Babak Date: Mon, 21 Dec 2020 18:14:54 +0200 Subject: [PATCH 02/24] Edge management minor code change --- ui/src/app/api/user.service.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/app/api/user.service.js b/ui/src/app/api/user.service.js index 9d99681b0d..fad837543d 100644 --- a/ui/src/app/api/user.service.js +++ b/ui/src/app/api/user.service.js @@ -698,7 +698,7 @@ function UserService($http, $q, $rootScope, adminService, dashboardService, time var url = '/api/edges/enabled'; $http.get(url).then(function success(response) { edgesSupportEnabled = response.data; - deferred.resolve(response.data); + deferred.resolve(response); }, function fail() { deferred.reject(); }); From da5ac8902d055fc58f4209a14de55fd2d9083d13 Mon Sep 17 00:00:00 2001 From: Artem Babak Date: Mon, 21 Dec 2020 18:20:45 +0200 Subject: [PATCH 03/24] Removed rule chains management for customers --- ui/src/app/services/menu.service.js | 97 +++++++++++++++++------------ 1 file changed, 58 insertions(+), 39 deletions(-) diff --git a/ui/src/app/services/menu.service.js b/ui/src/app/services/menu.service.js index d46c477f4a..620c842421 100644 --- a/ui/src/app/services/menu.service.js +++ b/ui/src/app/services/menu.service.js @@ -58,45 +58,6 @@ function Menu(userService, $state, $rootScope) { if (authority !== user.authority) { sections = []; authority = user.authority; - var edgeMenuSection = { - side: { - name: 'edge.management', - type: 'toggle', - state: 'home.edges', - height: '80px', - icon: 'router', - pages: [ - { - name: 'edge.edges', - type: 'link', - state: 'home.edges', - icon: 'router' - }, - { - name: 'rulechain.edge-rulechains', - type: 'link', - state: 'home.edges.edgeRuleChains', - icon: 'code' - } - ] - }, - home: { - name: 'edge.management', - places: [ - { - name: 'edge.edges', - icon: 'router', - state: 'home.edges' - }, - { - name: 'rulechain.edge-rulechains', - icon: 'code', - state: 'home.edges.edgeRuleChains' - } - ] - - } - } if (authority === 'SYS_ADMIN') { sections = [ { @@ -186,6 +147,45 @@ function Menu(userService, $state, $rootScope) { ] }]; } else if (authority === 'TENANT_ADMIN') { + let edgeMenuSection = { + side: { + name: 'edge.management', + type: 'toggle', + state: 'home.edges', + height: '80px', + icon: 'router', + pages: [ + { + name: 'edge.edges', + type: 'link', + state: 'home.edges', + icon: 'router' + }, + { + name: 'rulechain.edge-rulechains', + type: 'link', + state: 'home.edges.edgeRuleChains', + icon: 'code' + } + ] + }, + home: { + name: 'edge.management', + places: [ + { + name: 'edge.edges', + icon: 'router', + state: 'home.edges' + }, + { + name: 'rulechain.edge-rulechains', + icon: 'code', + state: 'home.edges.edgeRuleChains' + } + ] + + } + } sections = [ { name: 'home.home', @@ -325,6 +325,25 @@ function Menu(userService, $state, $rootScope) { } } else if (authority === 'CUSTOMER_USER') { + let edgeMenuSection = { + side: { + name: 'edge.edges', + type: 'link', + state: 'home.edges', + icon: 'router' + }, + home: { + name: 'edge.edges', + places: [ + { + name: 'edge.edges', + icon: 'router', + state: 'home.edges' + } + ] + + } + } sections = [ { name: 'home.home', From 479c318925fc537fbb02d8c1622dae81bed2aa1a Mon Sep 17 00:00:00 2001 From: Artem Babak Date: Tue, 22 Dec 2020 05:11:31 +0200 Subject: [PATCH 04/24] Edge menu hide --- ui/src/app/api/user.service.js | 3 +- ui/src/app/services/menu.service.js | 206 ++++++++++++++-------------- 2 files changed, 107 insertions(+), 102 deletions(-) diff --git a/ui/src/app/api/user.service.js b/ui/src/app/api/user.service.js index fad837543d..cdf18c27ed 100644 --- a/ui/src/app/api/user.service.js +++ b/ui/src/app/api/user.service.js @@ -67,8 +67,7 @@ function UserService($http, $q, $rootScope, adminService, dashboardService, time isUserTokenAccessEnabled: isUserTokenAccessEnabled, loginAsUser: loginAsUser, setUserCredentialsEnabled: setUserCredentialsEnabled, - isEdgesSupportEnabled: isEdgesSupportEnabled, - loadIsEdgesSupportEnabled: loadIsEdgesSupportEnabled + isEdgesSupportEnabled: isEdgesSupportEnabled } reloadUser(); diff --git a/ui/src/app/services/menu.service.js b/ui/src/app/services/menu.service.js index 620c842421..f3bfbea470 100644 --- a/ui/src/app/services/menu.service.js +++ b/ui/src/app/services/menu.service.js @@ -147,45 +147,6 @@ function Menu(userService, $state, $rootScope) { ] }]; } else if (authority === 'TENANT_ADMIN') { - let edgeMenuSection = { - side: { - name: 'edge.management', - type: 'toggle', - state: 'home.edges', - height: '80px', - icon: 'router', - pages: [ - { - name: 'edge.edges', - type: 'link', - state: 'home.edges', - icon: 'router' - }, - { - name: 'rulechain.edge-rulechains', - type: 'link', - state: 'home.edges.edgeRuleChains', - icon: 'code' - } - ] - }, - home: { - name: 'edge.management', - places: [ - { - name: 'edge.edges', - icon: 'router', - state: 'home.edges' - }, - { - name: 'rulechain.edge-rulechains', - icon: 'code', - state: 'home.edges.edgeRuleChains' - } - ] - - } - } sections = [ { name: 'home.home', @@ -222,7 +183,33 @@ function Menu(userService, $state, $rootScope) { type: 'link', state: 'home.entityViews', icon: 'view_quilt' - }, + }]; + if (userService.isEdgesSupportEnabled()) { + sections.push( + { + name: 'edge.management', + type: 'toggle', + state: 'home.edges', + height: '80px', + icon: 'router', + pages: [ + { + name: 'edge.edges', + type: 'link', + state: 'home.edges', + icon: 'router' + }, + { + name: 'rulechain.edge-rulechains', + type: 'link', + state: 'home.edges.edgeRuleChains', + icon: 'code' + } + ] + } + ); + } + sections.push( { name: 'widget.widget-library', type: 'link', @@ -230,17 +217,18 @@ function Menu(userService, $state, $rootScope) { icon: 'now_widgets' }, { - name: 'dashboard.dashboards', - type: 'link', - state: 'home.dashboards', - icon: 'dashboards' - }, + name: 'dashboard.dashboards', + type: 'link', + state: 'home.dashboards', + icon: 'dashboards' + }, { - name: 'audit-log.audit-logs', - type: 'link', - state: 'home.auditLogs', - icon: 'track_changes' - }]; + name: 'audit-log.audit-logs', + type: 'link', + state: 'home.auditLogs', + icon: 'track_changes' + } + ); homeSections = [{ @@ -292,58 +280,52 @@ function Menu(userService, $state, $rootScope) { state: 'home.entityViews' } ] - }, - { - name: 'dashboard.management', - places: [ - { - name: 'widget.widget-library', - icon: 'now_widgets', - state: 'home.widgets-bundles' - }, - { - name: 'dashboard.dashboards', - icon: 'dashboard', - state: 'home.dashboards' - } - ] - }, - { - name: 'audit-log.audit', - places: [ - { - name: 'audit-log.audit-logs', - icon: 'track_changes', - state: 'home.auditLogs' - } - ] }]; - if (userService.isEdgesSupportEnabled()) { - sections.splice(6, 0, edgeMenuSection.side); - homeSections.splice(5, 0, edgeMenuSection.home); - } - - } else if (authority === 'CUSTOMER_USER') { - let edgeMenuSection = { - side: { - name: 'edge.edges', - type: 'link', - state: 'home.edges', - icon: 'router' - }, - home: { - name: 'edge.edges', + homeSections.push({ + name: 'edge.management', places: [ { name: 'edge.edges', icon: 'router', state: 'home.edges' + }, + { + name: 'rulechain.edge-rulechains', + icon: 'code', + state: 'home.edges.edgeRuleChains' } ] - } + }); } + homeSections.push( + { + name: 'dashboard.management', + places: [ + { + name: 'widget.widget-library', + icon: 'now_widgets', + state: 'home.widgets-bundles' + }, + { + name: 'dashboard.dashboards', + icon: 'dashboard', + state: 'home.dashboards' + } + ] + }, + { + name: 'audit-log.audit', + places: [ + { + name: 'audit-log.audit-logs', + icon: 'track_changes', + state: 'home.auditLogs' + } + ] + }); + } else if (authority === 'CUSTOMER_USER') { sections = [ { name: 'home.home', @@ -368,13 +350,25 @@ function Menu(userService, $state, $rootScope) { type: 'link', state: 'home.entityViews', icon: 'view_quilt' - }, + }]; + if (userService.isEdgesSupportEnabled()) { + sections.push( + { + name: 'edge.edges', + type: 'link', + state: 'home.edges', + icon: 'router' + } + ); + } + sections.push( { name: 'dashboard.dashboards', type: 'link', state: 'home.dashboards', icon: 'dashboard' - }]; + } + ); homeSections = [{ @@ -406,7 +400,23 @@ function Menu(userService, $state, $rootScope) { state: 'home.entityViews' } ] - }, + }]; + if (userService.isEdgesSupportEnabled()) { + homeSections.push( + { + name: 'edge.edges', + places: [ + { + name: 'edge.edges', + icon: 'router', + state: 'home.edges' + } + ] + + } + ); + } + homeSections.push( { name: 'dashboard.view-dashboards', places: [ @@ -416,12 +426,8 @@ function Menu(userService, $state, $rootScope) { state: 'home.dashboards' } ] - }]; - - if (userService.isEdgesSupportEnabled()) { - sections.splice(4, 0, edgeMenuSection.side); - homeSections.splice(3, 0, edgeMenuSection.home); - } + } + ); } } } From f0d21d94a3ae4faeba790ec8eca7610f9dedd761 Mon Sep 17 00:00:00 2001 From: Artem Babak Date: Tue, 22 Dec 2020 05:16:03 +0200 Subject: [PATCH 05/24] Code beatify --- ui/src/app/services/menu.service.js | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/ui/src/app/services/menu.service.js b/ui/src/app/services/menu.service.js index f3bfbea470..4d2c74da63 100644 --- a/ui/src/app/services/menu.service.js +++ b/ui/src/app/services/menu.service.js @@ -217,16 +217,16 @@ function Menu(userService, $state, $rootScope) { icon: 'now_widgets' }, { - name: 'dashboard.dashboards', - type: 'link', - state: 'home.dashboards', - icon: 'dashboards' - }, + name: 'dashboard.dashboards', + type: 'link', + state: 'home.dashboards', + icon: 'dashboards' + }, { - name: 'audit-log.audit-logs', - type: 'link', - state: 'home.auditLogs', - icon: 'track_changes' + name: 'audit-log.audit-logs', + type: 'link', + state: 'home.auditLogs', + icon: 'track_changes' } ); @@ -412,7 +412,6 @@ function Menu(userService, $state, $rootScope) { state: 'home.edges' } ] - } ); } From 6c33cb351ab1dbec57b64f22c790cbb6b56410c3 Mon Sep 17 00:00:00 2001 From: Artem Babak Date: Tue, 22 Dec 2020 15:26:47 +0200 Subject: [PATCH 06/24] Edge fieldset reorder and rename Manage... buttons --- ui/src/app/edge/edge-fieldset.tpl.html | 58 ++++++++++++++------------ 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/ui/src/app/edge/edge-fieldset.tpl.html b/ui/src/app/edge/edge-fieldset.tpl.html index 2f2195ec39..e96d12f391 100644 --- a/ui/src/app/edge/edge-fieldset.tpl.html +++ b/ui/src/app/edge/edge-fieldset.tpl.html @@ -15,34 +15,38 @@ limitations under the License. --> -{{ 'edge.assign-to-customer' | translate }} -{{ isPublic ? 'edge.make-private' : 'edge.unassign-from-customer' | translate }} -{{ 'edge.make-public' | 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 }} +
+ {{ 'edge.assign-to-customer' | translate }} + {{ isPublic ? 'edge.make-private' : 'edge.unassign-from-customer' | translate }} + {{ 'edge.make-public' | translate }} + {{ 'edge.delete' | translate }} +
+
+ {{ 'edge.assets' | translate }} + {{ 'edge.devices' | translate }} + {{ 'edge.entity-views' | translate }} + {{ 'edge.dashboards' | translate }} + {{ 'edge.rulechains' | translate }} +
Date: Tue, 22 Dec 2020 15:55:21 +0200 Subject: [PATCH 07/24] Edge rule chains rename to Rule chain templates --- ui/src/app/customer/customer.controller.js | 2 +- ui/src/app/edge/edge-fieldset.tpl.html | 2 +- ui/src/app/edge/edge.routes.js | 10 +++++----- ui/src/app/locale/locale.constant-de_DE.json | 6 ++---- ui/src/app/locale/locale.constant-en_US.json | 8 +++----- ui/src/app/locale/locale.constant-es_ES.json | 4 +--- ui/src/app/locale/locale.constant-fr_FR.json | 4 +--- ui/src/app/rulechain/rulechain.routes.js | 8 ++++---- ui/src/app/services/menu.service.js | 14 +++++++------- 9 files changed, 25 insertions(+), 33 deletions(-) diff --git a/ui/src/app/customer/customer.controller.js b/ui/src/app/customer/customer.controller.js index c61962f9f3..2d1d2202a8 100644 --- a/ui/src/app/customer/customer.controller.js +++ b/ui/src/app/customer/customer.controller.js @@ -81,7 +81,7 @@ export default function CustomerController(customerService, $state, $stateParams onAction: function ($event, item) { openCustomerEdges($event, item); }, - name: function() { return $translate.instant('edge.edges') }, + name: function() { return $translate.instant('edge.edge-instances') }, details: function(customer) { if (customer && customer.additionalInfo && customer.additionalInfo.isPublic) { return $translate.instant('customer.manage-public-edges') diff --git a/ui/src/app/edge/edge-fieldset.tpl.html b/ui/src/app/edge/edge-fieldset.tpl.html index e96d12f391..05b4742f82 100644 --- a/ui/src/app/edge/edge-fieldset.tpl.html +++ b/ui/src/app/edge/edge-fieldset.tpl.html @@ -44,7 +44,7 @@ class="md-raised md-primary">{{ 'edge.dashboards' | translate }} {{ 'edge.rulechains' | translate }} + class="md-raised md-primary">{{ 'edge.rulechain-templates' | translate }}
diff --git a/ui/src/app/edge/edge.routes.js b/ui/src/app/edge/edge.routes.js index ccfb3a7b14..e4b0d72727 100644 --- a/ui/src/app/edge/edge.routes.js +++ b/ui/src/app/edge/edge.routes.js @@ -46,10 +46,10 @@ export default function EdgeRoutes($stateProvider, types) { searchEnabled: true, searchByEntitySubtype: true, searchEntityType: types.entityType.edge, - pageTitle: 'edge.edges' + pageTitle: 'edge.edge-instances' }, ncyBreadcrumb: { - label: '{"icon": "router", "label": "edge.edges"}' + label: '{"icon": "router", "label": "edge.edge-instances"}' } }).state('home.edges.entityViews', { url: '/:edgeId/entityViews', @@ -194,11 +194,11 @@ export default function EdgeRoutes($stateProvider, types) { }, data: { searchEnabled: true, - pageTitle: 'edge.rulechains', + pageTitle: 'edge.rulechain-templates', ruleChainsType: 'edge' }, ncyBreadcrumb: { - label: '{"icon": "code", "label": "rulechain.edge-rulechains"}' + label: '{"icon": "code", "label": "edge.rulechain-templates"}' } }).state('home.edges.ruleChains.ruleChain', { url: '/:ruleChainId', @@ -232,7 +232,7 @@ export default function EdgeRoutes($stateProvider, types) { data: { import: false, searchEnabled: false, - pageTitle: 'edge.rulechain' + pageTitle: 'edge.rulechain-templates' }, ncyBreadcrumb: { label: '{"icon": "code", "label": "{{ vm.ruleChain.name }}", "translate": "false"}' diff --git a/ui/src/app/locale/locale.constant-de_DE.json b/ui/src/app/locale/locale.constant-de_DE.json index 81558e7ab2..e209d61c85 100644 --- a/ui/src/app/locale/locale.constant-de_DE.json +++ b/ui/src/app/locale/locale.constant-de_DE.json @@ -431,7 +431,7 @@ "customer-required": "Kunde ist erforderlich", "select-default-customer": "Wählen Sie den Standardkunden aus.", "default-customer": "Standardkunde", - "edges": "Kunden Rand", + "edge-instances": "Kunden Rand", "default-customer-required": "Ein Standardkunde ist erforderlich, um das Dashboard auf Mandantenebene zu testen." }, "datetime": { @@ -730,7 +730,7 @@ }, "edge": { "edge": "Rand", - "edges": "Rand", + "edge-instances": "Rand", "management": "Rand verwalten", "no-edges-matching": "Keine passenden Rand '{{entity}}' gefunden.", "add": "Rand hinzufügen", @@ -1355,8 +1355,6 @@ "rulechain": { "rulechain": "Regelkette", "rulechains": "Regelketten", - "core-rulechains": "Kernregelketten", - "edge-rulechains": "Randregelketten", "root": "Wurzel", "delete": "Regelkette löschen", "name": "Name", diff --git a/ui/src/app/locale/locale.constant-en_US.json b/ui/src/app/locale/locale.constant-en_US.json index 5e02bc95b5..3bafe1813d 100644 --- a/ui/src/app/locale/locale.constant-en_US.json +++ b/ui/src/app/locale/locale.constant-en_US.json @@ -764,7 +764,7 @@ }, "edge": { "edge": "Edge", - "edges": "Edges", + "edge-instances": "Edge instances", "edge-file": "Edge file", "management": "Edge management", "no-edges-matching": "No edges matching '{{entity}}' were found.", @@ -828,8 +828,8 @@ "unassign-from-edge": "Unassign from edge", "dashboards": "Edge Dashboards", "manage-edge-rulechains": "Manage edge rule chains", - "rulechains": "Edge Rule Chains", - "rulechain": "Edge Rule Chain", + "rulechain-templates": "Rule chain templates", + "rulechain-template": "Rule chain template", "edge-key": "Edge key", "copy-edge-key": "Copy edge key", "edge-key-copied-message": "Edge key has been copied to clipboard", @@ -1549,8 +1549,6 @@ "rulechain": { "rulechain": "Rule chain", "rulechains": "Rule chains", - "core-rulechains": "Core Rule chains", - "edge-rulechains": "Edge Rule chains", "default-root": "Default root", "root": "Root", "delete": "Delete rule chain", diff --git a/ui/src/app/locale/locale.constant-es_ES.json b/ui/src/app/locale/locale.constant-es_ES.json index 060c762fec..59b354c191 100644 --- a/ui/src/app/locale/locale.constant-es_ES.json +++ b/ui/src/app/locale/locale.constant-es_ES.json @@ -743,7 +743,7 @@ }, "edge": { "edge": "Borde", - "edges": "Bordes", + "edge-instances": "Bordes", "management": "Gestión de bordes", "no-edges-matching": "No se encontraron bordes que coincidan con '{{entity}}'", "add": "Agregar borde", @@ -1423,8 +1423,6 @@ "rulechain": { "rulechain": "Cadena de reglas", "rulechains": "Cadenas de reglas", - "core-rulechains": "Cadenas de reglas centrales", - "edge-rulechains": "Cadenas de reglas de borde", "root": "Raíz", "delete": "Eliminar cadena de reglas", "name": "Nombre", diff --git a/ui/src/app/locale/locale.constant-fr_FR.json b/ui/src/app/locale/locale.constant-fr_FR.json index fcd2bc4d22..d6775567fb 100644 --- a/ui/src/app/locale/locale.constant-fr_FR.json +++ b/ui/src/app/locale/locale.constant-fr_FR.json @@ -748,7 +748,7 @@ }, "edge": { "edge": "Bordure", - "edges": "Bordures", + "edge-instances": "Bordures", "management": "Gestion des bordures", "no-edges-matching": "Aucun bordure correspondant à {{entity}} n'a été trouvé.", "add": "Ajouter un bordure", @@ -1429,8 +1429,6 @@ "rulechain-required": "Chaîne de règles requise", "rulechains": "Chaînes de règles", "select-rulechain": "Sélectionner la chaîne de règles", - "core-rulechains": "Chaînes de règles fondamentales", - "edge-rulechains": "Chaînes de règles de la bordure", "set-root": "Rend la chaîne de règles racine (root) ", "set-root-rulechain-text": "Après la confirmation, la chaîne de règles deviendra racine (root) et gérera tous les messages de transport entrants.", "set-root-rulechain-title": "Voulez-vous vraiment que la chaîne de règles '{{ruleChainName}} soit racine (root) ?", diff --git a/ui/src/app/rulechain/rulechain.routes.js b/ui/src/app/rulechain/rulechain.routes.js index a1d5da43e2..359579c9c8 100644 --- a/ui/src/app/rulechain/rulechain.routes.js +++ b/ui/src/app/rulechain/rulechain.routes.js @@ -139,11 +139,11 @@ export default function RuleChainRoutes($stateProvider, NodeTemplatePathProvider }, data: { searchEnabled: true, - pageTitle: 'rulechain.edge-rulechains', + pageTitle: 'edge.rulechain-templates', ruleChainsType: 'edges' }, ncyBreadcrumb: { - label: '{"icon": "code", "label": "rulechain.edge-rulechains"}' + label: '{"icon": "code", "label": "edge.rulechain-templates"}' } }).state('home.edges.edgeRuleChains.ruleChain', { url: '/:ruleChainId', @@ -177,7 +177,7 @@ export default function RuleChainRoutes($stateProvider, NodeTemplatePathProvider data: { import: false, searchEnabled: false, - pageTitle: 'edge.rulechain' + pageTitle: 'edge.rulechain-template' }, ncyBreadcrumb: { label: '{"icon": "code", "label": "{{ vm.ruleChain.name }}", "translate": "false"}' @@ -218,7 +218,7 @@ export default function RuleChainRoutes($stateProvider, NodeTemplatePathProvider data: { import: true, searchEnabled: true, - pageTitle: 'edge.rulechain' + pageTitle: 'edge.rulechain-template' }, ncyBreadcrumb: { label: '{"icon": "code", "label": "{{ (\'rulechain.import\' | translate) + \': \'+ vm.ruleChain.name }}", "translate": "false"}' diff --git a/ui/src/app/services/menu.service.js b/ui/src/app/services/menu.service.js index 4d2c74da63..6b0337d0ab 100644 --- a/ui/src/app/services/menu.service.js +++ b/ui/src/app/services/menu.service.js @@ -194,13 +194,13 @@ function Menu(userService, $state, $rootScope) { icon: 'router', pages: [ { - name: 'edge.edges', + name: 'edge.edge-instances', type: 'link', state: 'home.edges', icon: 'router' }, { - name: 'rulechain.edge-rulechains', + name: 'edge.rulechain-templates', type: 'link', state: 'home.edges.edgeRuleChains', icon: 'code' @@ -286,12 +286,12 @@ function Menu(userService, $state, $rootScope) { name: 'edge.management', places: [ { - name: 'edge.edges', + name: 'edge.edge-instances', icon: 'router', state: 'home.edges' }, { - name: 'rulechain.edge-rulechains', + name: 'edge.rulechain-templates', icon: 'code', state: 'home.edges.edgeRuleChains' } @@ -354,7 +354,7 @@ function Menu(userService, $state, $rootScope) { if (userService.isEdgesSupportEnabled()) { sections.push( { - name: 'edge.edges', + name: 'edge.edge-instances', type: 'link', state: 'home.edges', icon: 'router' @@ -404,10 +404,10 @@ function Menu(userService, $state, $rootScope) { if (userService.isEdgesSupportEnabled()) { homeSections.push( { - name: 'edge.edges', + name: 'edge.edge-instances', places: [ { - name: 'edge.edges', + name: 'edge.edge-instances', icon: 'router', state: 'home.edges' } From 314f5a7c00be846bf98e8b4da61f292d8e3bc87a Mon Sep 17 00:00:00 2001 From: Artem Babak Date: Tue, 22 Dec 2020 20:54:46 +0200 Subject: [PATCH 08/24] Set default type for new edges, Customer edges renamed to Customer edge instances --- ui/src/app/edge/edge-fieldset.tpl.html | 19 ++++++++++--------- ui/src/app/edge/edge.directive.js | 1 + ui/src/app/locale/locale.constant-en_US.json | 2 +- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/ui/src/app/edge/edge-fieldset.tpl.html b/ui/src/app/edge/edge-fieldset.tpl.html index 05b4742f82..42eee537b0 100644 --- a/ui/src/app/edge/edge-fieldset.tpl.html +++ b/ui/src/app/edge/edge-fieldset.tpl.html @@ -102,14 +102,6 @@ ng-model="edge.type" entity-type="types.entityType.edge"> - - - - - - - - @@ -126,7 +118,6 @@
- @@ -156,4 +147,14 @@
+
+ + + + + + + + +
diff --git a/ui/src/app/edge/edge.directive.js b/ui/src/app/edge/edge.directive.js index bdd3b44b67..a1efa67197 100644 --- a/ui/src/app/edge/edge.directive.js +++ b/ui/src/app/edge/edge.directive.js @@ -36,6 +36,7 @@ export default function EdgeDirective($compile, $templateCache, $translate, $mdD scope.edge.routingKey = utils.guid(''); scope.edge.secret = generateSecret(20); scope.edge.cloudEndpoint = utils.baseUrl(); + scope.edge.type = 'default'; } if (scope.edge.customerId && scope.edge.customerId.id !== types.id.nullUid) { scope.isAssignedToCustomer = true; diff --git a/ui/src/app/locale/locale.constant-en_US.json b/ui/src/app/locale/locale.constant-en_US.json index 3bafe1813d..343ead0099 100644 --- a/ui/src/app/locale/locale.constant-en_US.json +++ b/ui/src/app/locale/locale.constant-en_US.json @@ -457,7 +457,7 @@ "select-default-customer": "Select default customer", "default-customer": "Default customer", "default-customer-required": "Default customer is required in order to debug dashboard on Tenant level", - "edges": "Customer Edges" + "edges": "Customer edge instances" }, "datetime": { "date-from": "Date from", From 6ce3a7577f1e5e161286e9c3c4c9e66b03cf323d Mon Sep 17 00:00:00 2001 From: Artem Babak Date: Tue, 22 Dec 2020 22:01:22 +0200 Subject: [PATCH 09/24] Edge license key tooltip. Code icon changed to settings_ethernet --- ui/src/app/edge/edge-fieldset.tpl.html | 17 +++++++++++++---- ui/src/app/edge/edge.controller.js | 2 +- ui/src/app/edge/edge.directive.js | 2 +- ui/src/app/edge/edge.routes.js | 4 ++-- ui/src/app/locale/locale.constant-en_US.json | 3 ++- ui/src/app/rulechain/rulechain.routes.js | 6 +++--- ui/src/app/services/menu.service.js | 4 ++-- 7 files changed, 24 insertions(+), 14 deletions(-) diff --git a/ui/src/app/edge/edge-fieldset.tpl.html b/ui/src/app/edge/edge-fieldset.tpl.html index 42eee537b0..01728b0b9a 100644 --- a/ui/src/app/edge/edge-fieldset.tpl.html +++ b/ui/src/app/edge/edge-fieldset.tpl.html @@ -100,15 +100,24 @@ tb-required="true" the-form="theForm" ng-model="edge.type" - entity-type="types.entityType.edge"> + entity-type="types.entityType.edge" + ng-value="defaultType"> - +
+
edge.edge-license-key-required
+ + + {{ 'edge.license-key-tooltip' | translate }} + + + +
@@ -147,7 +156,7 @@
-
+
@@ -156,5 +165,5 @@ -
+ diff --git a/ui/src/app/edge/edge.controller.js b/ui/src/app/edge/edge.controller.js index 0c9d42c584..6239789edc 100644 --- a/ui/src/app/edge/edge.controller.js +++ b/ui/src/app/edge/edge.controller.js @@ -283,7 +283,7 @@ export function EdgeController($rootScope, userService, edgeService, customerSer details: function() { return $translate.instant('edge.manage-edge-rulechains'); }, - icon: "code" + icon: "settings_ethernet" } ); diff --git a/ui/src/app/edge/edge.directive.js b/ui/src/app/edge/edge.directive.js index a1efa67197..6a56cbcd87 100644 --- a/ui/src/app/edge/edge.directive.js +++ b/ui/src/app/edge/edge.directive.js @@ -29,6 +29,7 @@ export default function EdgeDirective($compile, $templateCache, $translate, $mdD scope.isAssignedToCustomer = false; scope.isPublic = false; scope.assignedCustomer = null; + scope.defaultType = 'default'; scope.$watch('edge', function(newVal) { if (newVal) { @@ -36,7 +37,6 @@ export default function EdgeDirective($compile, $templateCache, $translate, $mdD scope.edge.routingKey = utils.guid(''); scope.edge.secret = generateSecret(20); scope.edge.cloudEndpoint = utils.baseUrl(); - scope.edge.type = 'default'; } if (scope.edge.customerId && scope.edge.customerId.id !== types.id.nullUid) { scope.isAssignedToCustomer = true; diff --git a/ui/src/app/edge/edge.routes.js b/ui/src/app/edge/edge.routes.js index e4b0d72727..bed701009a 100644 --- a/ui/src/app/edge/edge.routes.js +++ b/ui/src/app/edge/edge.routes.js @@ -198,7 +198,7 @@ export default function EdgeRoutes($stateProvider, types) { ruleChainsType: 'edge' }, ncyBreadcrumb: { - label: '{"icon": "code", "label": "edge.rulechain-templates"}' + label: '{"icon": "settings_ethernet", "label": "edge.rulechain-templates"}' } }).state('home.edges.ruleChains.ruleChain', { url: '/:ruleChainId', @@ -235,7 +235,7 @@ export default function EdgeRoutes($stateProvider, types) { pageTitle: 'edge.rulechain-templates' }, ncyBreadcrumb: { - label: '{"icon": "code", "label": "{{ vm.ruleChain.name }}", "translate": "false"}' + label: '{"icon": "settings_ethernet", "label": "{{ vm.ruleChain.name }}", "translate": "false"}' } }); } diff --git a/ui/src/app/locale/locale.constant-en_US.json b/ui/src/app/locale/locale.constant-en_US.json index 343ead0099..1849b6625a 100644 --- a/ui/src/app/locale/locale.constant-en_US.json +++ b/ui/src/app/locale/locale.constant-en_US.json @@ -852,7 +852,8 @@ "enter-edge-type": "Enter edge type", "no-edge-types-matching": "No edge types matching '{{entitySubtype}}' were found.", "edge-type-list-empty": "No edge types selected.", - "edge-types": "Edge types" + "edge-types": "Edge types", + "license-key-tooltip": "To get license key please visit www.thingsboard.io/edge" }, "error": { "unable-to-connect": "Unable to connect to the server! Please check your internet connection.", diff --git a/ui/src/app/rulechain/rulechain.routes.js b/ui/src/app/rulechain/rulechain.routes.js index 359579c9c8..9bdb5c2981 100644 --- a/ui/src/app/rulechain/rulechain.routes.js +++ b/ui/src/app/rulechain/rulechain.routes.js @@ -143,7 +143,7 @@ export default function RuleChainRoutes($stateProvider, NodeTemplatePathProvider ruleChainsType: 'edges' }, ncyBreadcrumb: { - label: '{"icon": "code", "label": "edge.rulechain-templates"}' + label: '{"icon": "settings_ethernet", "label": "edge.rulechain-templates"}' } }).state('home.edges.edgeRuleChains.ruleChain', { url: '/:ruleChainId', @@ -180,7 +180,7 @@ export default function RuleChainRoutes($stateProvider, NodeTemplatePathProvider pageTitle: 'edge.rulechain-template' }, ncyBreadcrumb: { - label: '{"icon": "code", "label": "{{ vm.ruleChain.name }}", "translate": "false"}' + label: '{"icon": "settings_ethernet", "label": "{{ vm.ruleChain.name }}", "translate": "false"}' } }).state('home.edges.edgeRuleChains.importRuleChain', { url: '/edges/ruleChains/import', @@ -221,7 +221,7 @@ export default function RuleChainRoutes($stateProvider, NodeTemplatePathProvider pageTitle: 'edge.rulechain-template' }, ncyBreadcrumb: { - label: '{"icon": "code", "label": "{{ (\'rulechain.import\' | translate) + \': \'+ vm.ruleChain.name }}", "translate": "false"}' + label: '{"icon": "settings_ethernet", "label": "{{ (\'rulechain.import\' | translate) + \': \'+ vm.ruleChain.name }}", "translate": "false"}' } }); } diff --git a/ui/src/app/services/menu.service.js b/ui/src/app/services/menu.service.js index 6b0337d0ab..2d01daccdf 100644 --- a/ui/src/app/services/menu.service.js +++ b/ui/src/app/services/menu.service.js @@ -203,7 +203,7 @@ function Menu(userService, $state, $rootScope) { name: 'edge.rulechain-templates', type: 'link', state: 'home.edges.edgeRuleChains', - icon: 'code' + icon: 'settings_ethernet' } ] } @@ -292,7 +292,7 @@ function Menu(userService, $state, $rootScope) { }, { name: 'edge.rulechain-templates', - icon: 'code', + icon: 'settings_ethernet', state: 'home.edges.edgeRuleChains' } ] From a083719de40e63eeab734253312ad0a29b0e021a Mon Sep 17 00:00:00 2001 From: Artem Babak Date: Wed, 23 Dec 2020 06:37:04 +0200 Subject: [PATCH 10/24] Rename edge Default rule chain to Auto-assign --- ui/src/app/locale/locale.constant-en_US.json | 14 +++++----- ui/src/app/rulechain/rulechain-card.tpl.html | 2 +- .../app/rulechain/rulechain-fieldset.tpl.html | 6 ++--- ui/src/app/rulechain/rulechain.directive.js | 4 +-- ui/src/app/rulechain/rulechains.controller.js | 26 +++++++++---------- ui/src/app/rulechain/rulechains.tpl.html | 4 +-- 6 files changed, 28 insertions(+), 28 deletions(-) diff --git a/ui/src/app/locale/locale.constant-en_US.json b/ui/src/app/locale/locale.constant-en_US.json index 1849b6625a..d6774ea114 100644 --- a/ui/src/app/locale/locale.constant-en_US.json +++ b/ui/src/app/locale/locale.constant-en_US.json @@ -1587,7 +1587,7 @@ "assign-rulechains": "Assign rulechains", "assign-new-rulechain": "Assign new rulechain", "delete-rulechains": "Delete rulechains", - "default": "Default", + "auto-assign-to-edge": "Auto-assign to edge(s)", "unassign-rulechain": "Unassign rulechain", "unassign-rulechains": "Unassign rulechains", "unassign-rulechain-title": "Are you sure you want to unassign the rulechain '{{ruleChainTitle}}'?", @@ -1601,12 +1601,12 @@ "set-default-root-edge-rulechain-title": "Are you sure you want to make the rule chain '{{ruleChainName}}' default edge root?", "set-default-root-edge-rulechain-text": "After the confirmation the rule chain will become default edge root and will handle all incoming transport messages.", "invalid-rulechain-type-error": "Unable to import rule chain: Invalid rule chain type. Expected type is {{expectedRuleChainType}}.", - "set-default-edge": "Make rule chain default", - "set-default-edge-title": "Are you sure you want to make the edge rule chain '{{ruleChainName}}' default?", - "set-default-edge-text": "After the confirmation the edge rule chain will be added to default list and assigned to newly created edge(s).", - "remove-default-edge": "Remove rule chain from defaults", - "remove-default-edge-title": "Are you sure you want to remove the edge rule chain '{{ruleChainName}}' from default list?", - "remove-default-edge-text": "After the confirmation the edge rule chain will not be assigned for a newly created edges." + "set-auto-assign-to-edge": "Auto-assign rule chain to edge(s) on creation", + "set-auto-assign-to-edge-title": "Are you sure you want to auto-assign the edge rule chain '{{ruleChainName}}' to edge(s) on creation?", + "set-auto-assign-to-edge-text": "After the confirmation the edge rule chain will be automatically assigned to edge(s) on creation.", + "remove-auto-assign-to-edge": "Do not assign rule chain to edge(s) on creation", + "remove-auto-assign-to-edge-title": "Are you sure you do not want to auto-assign the edge rule chain '{{ruleChainName}}' to edge(s) on creation?", + "remove-auto-assign-to-edge-text": "After the confirmation the edge rule chain won't be automatically assigned to edge(s) on creation." }, "rulenode": { "details": "Details", diff --git a/ui/src/app/rulechain/rulechain-card.tpl.html b/ui/src/app/rulechain/rulechain-card.tpl.html index e4df4c9471..95e7b4fd2b 100644 --- a/ui/src/app/rulechain/rulechain-card.tpl.html +++ b/ui/src/app/rulechain/rulechain-card.tpl.html @@ -20,4 +20,4 @@
rulechain.default-root
-
rulechain.default
+
rulechain.auto-assign-to-edge
diff --git a/ui/src/app/rulechain/rulechain-fieldset.tpl.html b/ui/src/app/rulechain/rulechain-fieldset.tpl.html index 5d3bf08739..223806386f 100644 --- a/ui/src/app/rulechain/rulechain-fieldset.tpl.html +++ b/ui/src/app/rulechain/rulechain-fieldset.tpl.html @@ -26,12 +26,12 @@ {{ 'rulechain.set-default-root-edge' | translate }} -{{ 'rulechain.set-default-edge' | translate }} + class="md-raised md-primary">{{ 'rulechain.set-auto-assign-to-edge' | translate }} {{ 'rulechain.remove-default-edge' | translate }} + class="md-raised md-primary">{{ 'rulechain.remove-auto-assign-to-edge' | translate }} From 59018f12847c1d3e5add639b15bff4ecc7cc6e45 Mon Sep 17 00:00:00 2001 From: deaflynx Date: Wed, 23 Dec 2020 10:24:19 +0200 Subject: [PATCH 11/24] Set 'default' as default edge type, added hints to cloudEndpoint, licenseKey --- ui/src/app/edge/edge-fieldset.tpl.html | 15 ++++----------- ui/src/app/edge/edge.directive.js | 2 +- ui/src/app/locale/locale.constant-en_US.json | 3 ++- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/ui/src/app/edge/edge-fieldset.tpl.html b/ui/src/app/edge/edge-fieldset.tpl.html index 01728b0b9a..aee00875b9 100644 --- a/ui/src/app/edge/edge-fieldset.tpl.html +++ b/ui/src/app/edge/edge-fieldset.tpl.html @@ -100,24 +100,17 @@ tb-required="true" the-form="theForm" ng-model="edge.type" - entity-type="types.entityType.edge" - ng-value="defaultType"> + entity-type="types.entityType.edge"> -
- +
edge.license-key-hint
+
edge.edge-license-key-required
- - - {{ 'edge.license-key-tooltip' | translate }} - - - -
+
edge.cloud-endpoint-hint
diff --git a/ui/src/app/edge/edge.directive.js b/ui/src/app/edge/edge.directive.js index 6a56cbcd87..a1efa67197 100644 --- a/ui/src/app/edge/edge.directive.js +++ b/ui/src/app/edge/edge.directive.js @@ -29,7 +29,6 @@ export default function EdgeDirective($compile, $templateCache, $translate, $mdD scope.isAssignedToCustomer = false; scope.isPublic = false; scope.assignedCustomer = null; - scope.defaultType = 'default'; scope.$watch('edge', function(newVal) { if (newVal) { @@ -37,6 +36,7 @@ export default function EdgeDirective($compile, $templateCache, $translate, $mdD scope.edge.routingKey = utils.guid(''); scope.edge.secret = generateSecret(20); scope.edge.cloudEndpoint = utils.baseUrl(); + scope.edge.type = 'default'; } if (scope.edge.customerId && scope.edge.customerId.id !== types.id.nullUid) { scope.isAssignedToCustomer = true; diff --git a/ui/src/app/locale/locale.constant-en_US.json b/ui/src/app/locale/locale.constant-en_US.json index d6774ea114..77bd29dcb6 100644 --- a/ui/src/app/locale/locale.constant-en_US.json +++ b/ui/src/app/locale/locale.constant-en_US.json @@ -853,7 +853,8 @@ "no-edge-types-matching": "No edge types matching '{{entitySubtype}}' were found.", "edge-type-list-empty": "No edge types selected.", "edge-types": "Edge types", - "license-key-tooltip": "To get license key please visit www.thingsboard.io/edge" + "license-key-hint": "To obtain your license please navigate to the pricing page and select the best license option for your case.", + "cloud-endpoint-hint": "Edge requires HTTP(s) access to Cloud (ThingsBoard CE/PE) to verify the license key. Please specify Cloud URL that Edge is able to connect to." }, "error": { "unable-to-connect": "Unable to connect to the server! Please check your internet connection.", From 81f1091a4fd7d6a8405664009f61d381055fc71e Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Wed, 23 Dec 2020 12:28:47 +0200 Subject: [PATCH 12/24] Sync should be send only once or by force button --- .../thingsboard/server/service/edge/rpc/EdgeGrpcSession.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 fe44d51d2f..a3206817a0 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 @@ -160,10 +160,11 @@ public final class EdgeGrpcSession implements Closeable { .build()); if (ConnectResponseCode.ACCEPTED != responseMsg.getResponseCode()) { outputStream.onError(new RuntimeException(responseMsg.getErrorMsg())); + } else { + connected = true; } } - if (!connected && requestMsg.getMsgType().equals(RequestMsgType.SYNC_REQUEST_RPC_MESSAGE)) { - connected = true; + if (connected && requestMsg.getMsgType().equals(RequestMsgType.SYNC_REQUEST_RPC_MESSAGE)) { ctx.getSyncEdgeService().sync(edge); } if (connected) { From 908a89bfc5dd5581fa17e3258faae6a67746cf79 Mon Sep 17 00:00:00 2001 From: deaflynx Date: Wed, 23 Dec 2020 12:58:11 +0200 Subject: [PATCH 13/24] Remove edge type from relations in case edge is disabled --- ui/src/app/api/entity.service.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ui/src/app/api/entity.service.js b/ui/src/app/api/entity.service.js index df684c334e..153fe11b50 100644 --- a/ui/src/app/api/entity.service.js +++ b/ui/src/app/api/entity.service.js @@ -910,6 +910,9 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device } } } + if (userService.isEdgesSupportEnabled()) { + delete entityTypes.edge; + } return entityTypes; } From 318019d10c1a4948a6dd4e5b32470b9ded9ad1d5 Mon Sep 17 00:00:00 2001 From: deaflynx Date: Wed, 23 Dec 2020 12:58:29 +0200 Subject: [PATCH 14/24] Remove edge type from relations in case edge is disabled --- ui/src/app/api/entity.service.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/app/api/entity.service.js b/ui/src/app/api/entity.service.js index 153fe11b50..56e4378eba 100644 --- a/ui/src/app/api/entity.service.js +++ b/ui/src/app/api/entity.service.js @@ -910,7 +910,7 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device } } } - if (userService.isEdgesSupportEnabled()) { + if (!userService.isEdgesSupportEnabled()) { delete entityTypes.edge; } return entityTypes; From df11b383c1625ce65870b82178676931a3548f80 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Wed, 23 Dec 2020 19:12:05 +0200 Subject: [PATCH 15/24] Naming conventions update --- .../server/controller/EdgeController.java | 10 ++--- .../controller/RuleChainController.java | 24 +++++------ .../update/DefaultDataUpdateService.java | 2 +- .../server/dao/rule/RuleChainService.java | 10 ++--- .../data/relation/RelationTypeGroup.java | 2 +- .../server/dao/edge/EdgeServiceImpl.java | 2 +- .../server/dao/rule/BaseRuleChainService.java | 42 +++++++++---------- .../dao/rule/CassandraRuleChainDao.java | 7 ++-- .../server/dao/rule/RuleChainDao.java | 4 +- .../server/dao/sql/rule/JpaRuleChainDao.java | 9 ++-- .../dao/service/BaseRuleChainServiceTest.java | 24 +++++------ .../thingsboard/rest/client/RestClient.java | 16 +++---- ui/src/app/api/rule-chain.service.js | 24 +++++------ ui/src/app/rulechain/rulechains.controller.js | 18 ++++---- ui/src/app/rulechain/rulechains.tpl.html | 2 +- 15 files changed, 98 insertions(+), 98 deletions(-) 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 45c3e51b9d..6fc29a8976 100644 --- a/application/src/main/java/org/thingsboard/server/controller/EdgeController.java +++ b/application/src/main/java/org/thingsboard/server/controller/EdgeController.java @@ -92,10 +92,10 @@ public class EdgeController extends BaseController { edge.setTenantId(tenantId); boolean created = edge.getId() == null; - RuleChain defaultRootEdgeRuleChain = null; + RuleChain edgeTemplateRootRuleChain = null; if (created) { - defaultRootEdgeRuleChain = ruleChainService.getDefaultRootEdgeRuleChain(tenantId); - if (defaultRootEdgeRuleChain == null) { + edgeTemplateRootRuleChain = ruleChainService.getEdgeTemplateRootRuleChain(tenantId); + if (edgeTemplateRootRuleChain == null) { throw new DataValidationException("Root edge rule chain is not available!"); } } @@ -108,8 +108,8 @@ public class EdgeController extends BaseController { Edge savedEdge = checkNotNull(edgeService.saveEdge(edge)); if (created) { - ruleChainService.assignRuleChainToEdge(tenantId, defaultRootEdgeRuleChain.getId(), savedEdge.getId()); - edgeNotificationService.setEdgeRootRuleChain(tenantId, savedEdge, defaultRootEdgeRuleChain.getId()); + ruleChainService.assignRuleChainToEdge(tenantId, edgeTemplateRootRuleChain.getId(), savedEdge.getId()); + edgeNotificationService.setEdgeRootRuleChain(tenantId, savedEdge, edgeTemplateRootRuleChain.getId()); edgeService.assignDefaultRuleChainsToEdge(tenantId, savedEdge.getId()); } diff --git a/application/src/main/java/org/thingsboard/server/controller/RuleChainController.java b/application/src/main/java/org/thingsboard/server/controller/RuleChainController.java index 514498ac0e..ea8b7c2ac5 100644 --- a/application/src/main/java/org/thingsboard/server/controller/RuleChainController.java +++ b/application/src/main/java/org/thingsboard/server/controller/RuleChainController.java @@ -495,14 +495,14 @@ public class RuleChainController extends BaseController { } @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')") - @RequestMapping(value = "/ruleChain/{ruleChainId}/defaultRootEdge", method = RequestMethod.POST) + @RequestMapping(value = "/ruleChain/{ruleChainId}/edgeTemplateRoot", method = RequestMethod.POST) @ResponseBody - public RuleChain setDefaultRootEdgeRuleChain(@PathVariable(RULE_CHAIN_ID) String strRuleChainId) throws ThingsboardException { + public RuleChain setEdgeTemplateRootRuleChain(@PathVariable(RULE_CHAIN_ID) String strRuleChainId) throws ThingsboardException { checkParameter(RULE_CHAIN_ID, strRuleChainId); try { RuleChainId ruleChainId = new RuleChainId(toUUID(strRuleChainId)); RuleChain ruleChain = checkRuleChain(ruleChainId, Operation.WRITE); - ruleChainService.setDefaultRootEdgeRuleChain(getTenantId(), ruleChainId); + ruleChainService.setEdgeTemplateRootRuleChain(getTenantId(), ruleChainId); return ruleChain; } catch (Exception e) { logEntityAction(emptyId(EntityType.RULE_CHAIN), @@ -514,14 +514,14 @@ public class RuleChainController extends BaseController { } @PreAuthorize("hasAuthority('TENANT_ADMIN')") - @RequestMapping(value = "/ruleChain/{ruleChainId}/defaultEdge", method = RequestMethod.POST) + @RequestMapping(value = "/ruleChain/{ruleChainId}/autoAssignToEdge", method = RequestMethod.POST) @ResponseBody - public RuleChain addDefaultEdgeRuleChain(@PathVariable(RULE_CHAIN_ID) String strRuleChainId) throws ThingsboardException { + public RuleChain setAutoAssignToEdgeRuleChain(@PathVariable(RULE_CHAIN_ID) String strRuleChainId) throws ThingsboardException { checkParameter(RULE_CHAIN_ID, strRuleChainId); try { RuleChainId ruleChainId = new RuleChainId(toUUID(strRuleChainId)); RuleChain ruleChain = checkRuleChain(ruleChainId, Operation.WRITE); - ruleChainService.addDefaultEdgeRuleChain(getTenantId(), ruleChainId); + ruleChainService.setAutoAssignToEdgeRuleChain(getTenantId(), ruleChainId); return ruleChain; } catch (Exception e) { logEntityAction(emptyId(EntityType.RULE_CHAIN), @@ -533,14 +533,14 @@ public class RuleChainController extends BaseController { } @PreAuthorize("hasAuthority('TENANT_ADMIN')") - @RequestMapping(value = "/ruleChain/{ruleChainId}/defaultEdge", method = RequestMethod.DELETE) + @RequestMapping(value = "/ruleChain/{ruleChainId}/autoAssignToEdge", method = RequestMethod.DELETE) @ResponseBody - public RuleChain removeDefaultEdgeRuleChain(@PathVariable(RULE_CHAIN_ID) String strRuleChainId) throws ThingsboardException { + public RuleChain unsetAutoAssignToEdgeRuleChain(@PathVariable(RULE_CHAIN_ID) String strRuleChainId) throws ThingsboardException { checkParameter(RULE_CHAIN_ID, strRuleChainId); try { RuleChainId ruleChainId = new RuleChainId(toUUID(strRuleChainId)); RuleChain ruleChain = checkRuleChain(ruleChainId, Operation.WRITE); - ruleChainService.removeDefaultEdgeRuleChain(getTenantId(), ruleChainId); + ruleChainService.unsetAutoAssignToEdgeRuleChain(getTenantId(), ruleChainId); return ruleChain; } catch (Exception e) { logEntityAction(emptyId(EntityType.RULE_CHAIN), @@ -552,12 +552,12 @@ public class RuleChainController extends BaseController { } @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')") - @RequestMapping(value = "/ruleChain/defaultEdgeRuleChains", method = RequestMethod.GET) + @RequestMapping(value = "/ruleChain/autoAssignToEdgeRuleChains", method = RequestMethod.GET) @ResponseBody - public List getDefaultEdgeRuleChains() throws ThingsboardException { + public List getAutoAssignToEdgeRuleChains() throws ThingsboardException { try { TenantId tenantId = getCurrentUser().getTenantId(); - return checkNotNull(ruleChainService.findDefaultEdgeRuleChainsByTenantId(tenantId)).get(); + return checkNotNull(ruleChainService.findAutoAssignToEdgeRuleChainsByTenantId(tenantId)).get(); } catch (Exception e) { throw handleException(e); } diff --git a/application/src/main/java/org/thingsboard/server/service/install/update/DefaultDataUpdateService.java b/application/src/main/java/org/thingsboard/server/service/install/update/DefaultDataUpdateService.java index 77b356797c..981e83fbcd 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/update/DefaultDataUpdateService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/update/DefaultDataUpdateService.java @@ -89,7 +89,7 @@ public class DefaultDataUpdateService implements DataUpdateService { @Override protected void updateEntity(Tenant tenant) { try { - RuleChain defaultEdgeRuleChain = ruleChainService.getDefaultRootEdgeRuleChain(tenant.getId()); + RuleChain defaultEdgeRuleChain = ruleChainService.getEdgeTemplateRootRuleChain(tenant.getId()); if (defaultEdgeRuleChain == null) { installScripts.createDefaultEdgeRuleChains(tenant.getId()); } diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/rule/RuleChainService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/rule/RuleChainService.java index 6fd168c915..5abfa70bee 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/rule/RuleChainService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/rule/RuleChainService.java @@ -73,14 +73,14 @@ public interface RuleChainService { ListenableFuture> findRuleChainsByTenantIdAndEdgeId(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink); - RuleChain getDefaultRootEdgeRuleChain(TenantId tenantId); + RuleChain getEdgeTemplateRootRuleChain(TenantId tenantId); - boolean setDefaultRootEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId); + boolean setEdgeTemplateRootRuleChain(TenantId tenantId, RuleChainId ruleChainId); - boolean addDefaultEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId); + boolean setAutoAssignToEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId); - boolean removeDefaultEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId); + boolean unsetAutoAssignToEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId); - ListenableFuture> findDefaultEdgeRuleChainsByTenantId(TenantId tenantId); + ListenableFuture> findAutoAssignToEdgeRuleChainsByTenantId(TenantId tenantId); } diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/relation/RelationTypeGroup.java b/common/data/src/main/java/org/thingsboard/server/common/data/relation/RelationTypeGroup.java index 07315428e3..07901c5cbf 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/relation/RelationTypeGroup.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/relation/RelationTypeGroup.java @@ -23,6 +23,6 @@ public enum RelationTypeGroup { RULE_CHAIN, RULE_NODE, EDGE, - EDGE_DEFAULT_RULE_CHAIN + EDGE_AUTO_ASSIGN_RULE_CHAIN } diff --git a/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java index 92cb65ad08..2819cc9db4 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java @@ -340,7 +340,7 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic @Override public void assignDefaultRuleChainsToEdge(TenantId tenantId, EdgeId edgeId) { log.trace("Executing assignDefaultRuleChainsToEdge, tenantId [{}], edgeId [{}]", tenantId, edgeId); - ListenableFuture> future = ruleChainService.findDefaultEdgeRuleChainsByTenantId(tenantId); + ListenableFuture> future = ruleChainService.findAutoAssignToEdgeRuleChainsByTenantId(tenantId); Futures.addCallback(future, new FutureCallback>() { @Override public void onSuccess(List ruleChains) { diff --git a/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java b/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java index 8a0bc233cf..cc832c0826 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java @@ -484,21 +484,21 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC } @Override - public RuleChain getDefaultRootEdgeRuleChain(TenantId tenantId) { + public RuleChain getEdgeTemplateRootRuleChain(TenantId tenantId) { return getRootRuleChainByType(tenantId, RuleChainType.EDGE); } @Override - public boolean setDefaultRootEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId) { + public boolean setEdgeTemplateRootRuleChain(TenantId tenantId, RuleChainId ruleChainId) { RuleChain ruleChain = ruleChainDao.findById(tenantId, ruleChainId.getId()); - RuleChain previousDefaultRootEdgeRuleChain = getDefaultRootEdgeRuleChain(ruleChain.getTenantId()); - if (previousDefaultRootEdgeRuleChain == null || !previousDefaultRootEdgeRuleChain.getId().equals(ruleChain.getId())) { + RuleChain previousEdgeTemplateRootRuleChain = getEdgeTemplateRootRuleChain(ruleChain.getTenantId()); + if (previousEdgeTemplateRootRuleChain == null || !previousEdgeTemplateRootRuleChain.getId().equals(ruleChain.getId())) { try { - if (previousDefaultRootEdgeRuleChain != null) { - deleteRelation(tenantId, new EntityRelation(previousDefaultRootEdgeRuleChain.getTenantId(), previousDefaultRootEdgeRuleChain.getId(), + if (previousEdgeTemplateRootRuleChain != null) { + deleteRelation(tenantId, new EntityRelation(previousEdgeTemplateRootRuleChain.getTenantId(), previousEdgeTemplateRootRuleChain.getId(), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.RULE_CHAIN)); - previousDefaultRootEdgeRuleChain.setRoot(false); - ruleChainDao.save(tenantId, previousDefaultRootEdgeRuleChain); + previousEdgeTemplateRootRuleChain.setRoot(false); + ruleChainDao.save(tenantId, previousEdgeTemplateRootRuleChain); } createRelation(tenantId, new EntityRelation(ruleChain.getTenantId(), ruleChain.getId(), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.RULE_CHAIN)); @@ -506,7 +506,7 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC ruleChainDao.save(tenantId, ruleChain); return true; } catch (Exception e) { - log.warn("Failed to set default root edge rule chain, ruleChainId: [{}]", ruleChainId, e); + log.warn("Failed to set edge template root rule chain, ruleChainId: [{}]", ruleChainId, e); throw new RuntimeException(e); } } @@ -514,34 +514,34 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC } @Override - public boolean addDefaultEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId) { + public boolean setAutoAssignToEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId) { try { createRelation(tenantId, new EntityRelation(tenantId, ruleChainId, - EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_DEFAULT_RULE_CHAIN)); + EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_AUTO_ASSIGN_RULE_CHAIN)); return true; } catch (Exception e) { - log.warn("Failed to add default edge rule chain, ruleChainId: [{}]", ruleChainId, e); + log.warn("Failed to set auto assign to edge rule chain, ruleChainId: [{}]", ruleChainId, e); throw new RuntimeException(e); } } @Override - public boolean removeDefaultEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId) { + public boolean unsetAutoAssignToEdgeRuleChain(TenantId tenantId, RuleChainId ruleChainId) { try { deleteRelation(tenantId, new EntityRelation(tenantId, ruleChainId, - EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_DEFAULT_RULE_CHAIN)); + EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_AUTO_ASSIGN_RULE_CHAIN)); return true; } catch (Exception e) { - log.warn("Failed to remove default edge rule chain, ruleChainId: [{}]", ruleChainId, e); + log.warn("Failed to unset auto assign to edge rule chain, ruleChainId: [{}]", ruleChainId, e); throw new RuntimeException(e); } } @Override - public ListenableFuture> findDefaultEdgeRuleChainsByTenantId(TenantId tenantId) { - log.trace("Executing findDefaultEdgeRuleChainsByTenantId, tenantId [{}]", tenantId); + public ListenableFuture> findAutoAssignToEdgeRuleChainsByTenantId(TenantId tenantId) { + log.trace("Executing findAutoAssignToEdgeRuleChainsByTenantId, tenantId [{}]", tenantId); validateId(tenantId, INCORRECT_TENANT_ID + tenantId); - return ruleChainDao.findDefaultEdgeRuleChainsByTenantId(tenantId.getId()); + return ruleChainDao.findAutoAssignToEdgeRuleChainsByTenantId(tenantId.getId()); } @@ -592,9 +592,9 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC } } if (ruleChain.isRoot() && RuleChainType.EDGE.equals(ruleChain.getType())) { - RuleChain defaultRootEdgeRuleChain = getDefaultRootEdgeRuleChain(ruleChain.getTenantId()); - if (defaultRootEdgeRuleChain != null && !defaultRootEdgeRuleChain.getId().equals(ruleChain.getId())) { - throw new DataValidationException("Another default root edge rule chain is present in scope of current tenant!"); + RuleChain edgeTemplateRootRuleChain = getEdgeTemplateRootRuleChain(ruleChain.getTenantId()); + if (edgeTemplateRootRuleChain != null && !edgeTemplateRootRuleChain.getId().equals(ruleChain.getId())) { + throw new DataValidationException("Another edge template root rule chain is present in scope of current tenant!"); } } } diff --git a/dao/src/main/java/org/thingsboard/server/dao/rule/CassandraRuleChainDao.java b/dao/src/main/java/org/thingsboard/server/dao/rule/CassandraRuleChainDao.java index 9dfc869afd..b128572b2f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/rule/CassandraRuleChainDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/rule/CassandraRuleChainDao.java @@ -103,9 +103,10 @@ public class CassandraRuleChainDao extends CassandraAbstractSearchTextDao> findDefaultEdgeRuleChainsByTenantId(UUID tenantId) { - log.debug("Try to find default edge rule chains by tenantId [{}]", tenantId); - ListenableFuture> relations = relationDao.findAllByFromAndType(new TenantId(tenantId), new TenantId(tenantId), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_DEFAULT_RULE_CHAIN); + public ListenableFuture> findAutoAssignToEdgeRuleChainsByTenantId(UUID tenantId) { + log.debug("Try to find auto assign to edge rule chains by tenantId [{}]", tenantId); + ListenableFuture> relations = + relationDao.findAllByFromAndType(new TenantId(tenantId), new TenantId(tenantId), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_AUTO_ASSIGN_RULE_CHAIN); return Futures.transformAsync(relations, input -> { List> ruleChainFutures = new ArrayList<>(input.size()); for (EntityRelation relation : input) { diff --git a/dao/src/main/java/org/thingsboard/server/dao/rule/RuleChainDao.java b/dao/src/main/java/org/thingsboard/server/dao/rule/RuleChainDao.java index b883f13fa8..ac39792e87 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/rule/RuleChainDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/rule/RuleChainDao.java @@ -60,10 +60,10 @@ public interface RuleChainDao extends Dao { ListenableFuture> findRuleChainsByTenantIdAndEdgeId(UUID tenantId, UUID edgeId, TimePageLink pageLink); /** - * Find default edge rule chains by tenantId. + * Find auto assign to edge rule chains by tenantId. * * @param tenantId the tenantId * @return the list of rule chain objects */ - ListenableFuture> findDefaultEdgeRuleChainsByTenantId(UUID tenantId); + ListenableFuture> findAutoAssignToEdgeRuleChainsByTenantId(UUID tenantId); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaRuleChainDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaRuleChainDao.java index b6f2ac2421..33538c50b5 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaRuleChainDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaRuleChainDao.java @@ -25,9 +25,7 @@ import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.UUIDConverter; -import org.thingsboard.server.common.data.edge.Edge; import org.thingsboard.server.common.data.id.EdgeId; -import org.thingsboard.server.common.data.id.RuleChainId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.page.TimePageLink; @@ -107,9 +105,10 @@ public class JpaRuleChainDao extends JpaAbstractSearchTextDao> findDefaultEdgeRuleChainsByTenantId(UUID tenantId) { - log.debug("Try to find default edge rule chains by tenantId [{}]", tenantId); - ListenableFuture> relations = relationDao.findAllByFromAndType(new TenantId(tenantId), new TenantId(tenantId), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_DEFAULT_RULE_CHAIN); + public ListenableFuture> findAutoAssignToEdgeRuleChainsByTenantId(UUID tenantId) { + log.debug("Try to find auto assign to edge rule chains by tenantId [{}]", tenantId); + ListenableFuture> relations = + relationDao.findAllByFromAndType(new TenantId(tenantId), new TenantId(tenantId), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE_AUTO_ASSIGN_RULE_CHAIN); return Futures.transformAsync(relations, input -> { List> ruleChainsFutures = new ArrayList<>(input.size()); for (EntityRelation relation : input) { diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/BaseRuleChainServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/BaseRuleChainServiceTest.java index 53dc55a0ec..f67c397ef1 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/BaseRuleChainServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/BaseRuleChainServiceTest.java @@ -331,24 +331,24 @@ public abstract class BaseRuleChainServiceTest extends AbstractServiceTest { @Test public void testGetDefaultEdgeRuleChains() throws Exception { - RuleChainId ruleChainId = saveRuleChainAndSetDefaultEdge("Default Edge Rule Chain 1"); - saveRuleChainAndSetDefaultEdge("Default Edge Rule Chain 2"); - List result = ruleChainService.findDefaultEdgeRuleChainsByTenantId(tenantId).get(); + RuleChainId ruleChainId = saveRuleChainAndSetAutoAssignToEdge("Default Edge Rule Chain 1"); + saveRuleChainAndSetAutoAssignToEdge("Default Edge Rule Chain 2"); + List result = ruleChainService.findAutoAssignToEdgeRuleChainsByTenantId(tenantId).get(); Assert.assertEquals(2, result.size()); - ruleChainService.removeDefaultEdgeRuleChain(tenantId, ruleChainId); + ruleChainService.unsetAutoAssignToEdgeRuleChain(tenantId, ruleChainId); - result = ruleChainService.findDefaultEdgeRuleChainsByTenantId(tenantId).get(); + result = ruleChainService.findAutoAssignToEdgeRuleChainsByTenantId(tenantId).get(); Assert.assertEquals(1, result.size()); } @Test - public void setDefaultRootEdgeRuleChain() throws Exception { - RuleChainId ruleChainId1 = saveRuleChainAndSetDefaultEdge("Default Edge Rule Chain 1"); - RuleChainId ruleChainId2 = saveRuleChainAndSetDefaultEdge("Default Edge Rule Chain 2"); + public void setEdgeTemplateRootRuleChain() throws Exception { + RuleChainId ruleChainId1 = saveRuleChainAndSetAutoAssignToEdge("Default Edge Rule Chain 1"); + RuleChainId ruleChainId2 = saveRuleChainAndSetAutoAssignToEdge("Default Edge Rule Chain 2"); - ruleChainService.setDefaultRootEdgeRuleChain(tenantId, ruleChainId1); - ruleChainService.setDefaultRootEdgeRuleChain(tenantId, ruleChainId2); + ruleChainService.setEdgeTemplateRootRuleChain(tenantId, ruleChainId1); + ruleChainService.setEdgeTemplateRootRuleChain(tenantId, ruleChainId2); RuleChain ruleChainById = ruleChainService.findRuleChainById(tenantId, ruleChainId1); Assert.assertFalse(ruleChainById.isRoot()); @@ -357,13 +357,13 @@ public abstract class BaseRuleChainServiceTest extends AbstractServiceTest { Assert.assertTrue(ruleChainById.isRoot()); } - private RuleChainId saveRuleChainAndSetDefaultEdge(String name) { + private RuleChainId saveRuleChainAndSetAutoAssignToEdge(String name) { RuleChain edgeRuleChain = new RuleChain(); edgeRuleChain.setTenantId(tenantId); edgeRuleChain.setType(RuleChainType.EDGE); edgeRuleChain.setName(name); RuleChain savedEdgeRuleChain = ruleChainService.saveRuleChain(edgeRuleChain); - ruleChainService.addDefaultEdgeRuleChain(tenantId, savedEdgeRuleChain.getId()); + ruleChainService.setAutoAssignToEdgeRuleChain(tenantId, savedEdgeRuleChain.getId()); return savedEdgeRuleChain.getId(); } diff --git a/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java b/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java index 9529a67052..fdde79359d 100644 --- a/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java +++ b/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java @@ -2262,9 +2262,9 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable { }, params).getBody(); } - public Optional addDefaultEdgeRuleChain(RuleChainId ruleChainId) { + public Optional setAutoAssignToEdgeRuleChain(RuleChainId ruleChainId) { try { - ResponseEntity ruleChain = restTemplate.postForEntity(baseURL + "/api/ruleChain/{ruleChainId}/defaultEdge", null, RuleChain.class, ruleChainId.getId()); + ResponseEntity ruleChain = restTemplate.postForEntity(baseURL + "/api/ruleChain/{ruleChainId}/autoAssignToEdge", null, RuleChain.class, ruleChainId.getId()); return Optional.ofNullable(ruleChain.getBody()); } catch (HttpClientErrorException exception) { if (exception.getStatusCode() == HttpStatus.NOT_FOUND) { @@ -2275,9 +2275,9 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable { } } - public Optional removeDefaultEdgeRuleChain(RuleChainId ruleChainId) { + public Optional unsetAutoAssignToEdgeRuleChain(RuleChainId ruleChainId) { try { - ResponseEntity ruleChain = restTemplate.exchange(baseURL + "/api/ruleChain/{ruleChainId}/defaultEdge", HttpMethod.DELETE, HttpEntity.EMPTY, RuleChain.class, ruleChainId.getId()); + ResponseEntity ruleChain = restTemplate.exchange(baseURL + "/api/ruleChain/{ruleChainId}/autoAssignToEdge", HttpMethod.DELETE, HttpEntity.EMPTY, RuleChain.class, ruleChainId.getId()); return Optional.ofNullable(ruleChain.getBody()); } catch (HttpClientErrorException exception) { if (exception.getStatusCode() == HttpStatus.NOT_FOUND) { @@ -2288,17 +2288,17 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable { } } - public List getDefaultEdgeRuleChains() { - return restTemplate.exchange(baseURL + "/api/ruleChain/defaultEdgeRuleChains", + public List getAutoAssignToEdgeRuleChains() { + return restTemplate.exchange(baseURL + "/api/ruleChain/autoAssignToEdgeRuleChains", HttpMethod.GET, HttpEntity.EMPTY, new ParameterizedTypeReference>() { }).getBody(); } - public Optional setDefaultRootEdgeRuleChain(RuleChainId ruleChainId) { + public Optional setRootEdgeTemplateRuleChain(RuleChainId ruleChainId) { try { - ResponseEntity ruleChain = restTemplate.postForEntity(baseURL + "/api/ruleChain/{ruleChainId}/defaultRootEdge", null, RuleChain.class, ruleChainId.getId()); + ResponseEntity ruleChain = restTemplate.postForEntity(baseURL + "/api/ruleChain/{ruleChainId}/edgeTemplateRoot", null, RuleChain.class, ruleChainId.getId()); return Optional.ofNullable(ruleChain.getBody()); } catch (HttpClientErrorException exception) { if (exception.getStatusCode() == HttpStatus.NOT_FOUND) { diff --git a/ui/src/app/api/rule-chain.service.js b/ui/src/app/api/rule-chain.service.js index ba91e9e748..a94b9bde52 100644 --- a/ui/src/app/api/rule-chain.service.js +++ b/ui/src/app/api/rule-chain.service.js @@ -40,10 +40,10 @@ function RuleChainService($http, $q, $filter, $ocLazyLoad, $translate, types, co getEdgesRuleChains: getEdgesRuleChains, assignRuleChainToEdge: assignRuleChainToEdge, unassignRuleChainFromEdge: unassignRuleChainFromEdge, - setDefaultRootEdgeRuleChain: setDefaultRootEdgeRuleChain, - addDefaultEdgeRuleChain: addDefaultEdgeRuleChain, - removeDefaultEdgeRuleChain: removeDefaultEdgeRuleChain, - getDefaultEdgeRuleChains: getDefaultEdgeRuleChains + setEdgeTemplateRootRuleChain: setEdgeTemplateRootRuleChain, + setAutoAssignToEdgeRuleChain: setAutoAssignToEdgeRuleChain, + unsetAutoAssignToEdgeRuleChain: unsetAutoAssignToEdgeRuleChain, + getAutoAssignToEdgeRuleChains: getAutoAssignToEdgeRuleChains }; return service; @@ -350,9 +350,9 @@ function RuleChainService($http, $q, $filter, $ocLazyLoad, $translate, types, co return deferred.promise; } - function setDefaultRootEdgeRuleChain(ruleChainId) { + function setEdgeTemplateRootRuleChain(ruleChainId) { var deferred = $q.defer(); - var url = '/api/ruleChain/' + ruleChainId + '/defaultRootEdge'; + var url = '/api/ruleChain/' + ruleChainId + '/edgeTemplateRoot'; $http.post(url).then(function success(response) { deferred.resolve(response.data); }, function fail() { @@ -361,9 +361,9 @@ function RuleChainService($http, $q, $filter, $ocLazyLoad, $translate, types, co return deferred.promise; } - function addDefaultEdgeRuleChain(ruleChainId) { + function setAutoAssignToEdgeRuleChain(ruleChainId) { var deferred = $q.defer(); - var url = '/api/ruleChain/' + ruleChainId + '/defaultEdge'; + var url = '/api/ruleChain/' + ruleChainId + '/autoAssignToEdge'; $http.post(url, null).then(function success(response) { deferred.resolve(response.data); }, function fail() { @@ -372,9 +372,9 @@ function RuleChainService($http, $q, $filter, $ocLazyLoad, $translate, types, co return deferred.promise; } - function removeDefaultEdgeRuleChain(ruleChainId) { + function unsetAutoAssignToEdgeRuleChain(ruleChainId) { var deferred = $q.defer(); - var url = '/api/ruleChain/' + ruleChainId + '/defaultEdge'; + var url = '/api/ruleChain/' + ruleChainId + '/autoAssignToEdge'; $http.delete(url).then(function success(response) { deferred.resolve(response.data); }, function fail() { @@ -383,9 +383,9 @@ function RuleChainService($http, $q, $filter, $ocLazyLoad, $translate, types, co return deferred.promise; } - function getDefaultEdgeRuleChains(config) { + function getAutoAssignToEdgeRuleChains(config) { var deferred = $q.defer(); - var url = '/api/ruleChain/defaultEdgeRuleChains'; + var url = '/api/ruleChain/autoAssignToEdgeRuleChains'; $http.get(url, config).then(function success(response) { deferred.resolve(response.data); }, function fail() { diff --git a/ui/src/app/rulechain/rulechains.controller.js b/ui/src/app/rulechain/rulechains.controller.js index 65eb62abbe..a457883b16 100644 --- a/ui/src/app/rulechain/rulechains.controller.js +++ b/ui/src/app/rulechain/rulechains.controller.js @@ -98,7 +98,7 @@ export default function RuleChainsController(ruleChainService, userService, impo vm.exportRuleChain = exportRuleChain; vm.setRootRuleChain = setRootRuleChain; vm.setDefaultEdgeRuleChain = setDefaultEdgeRuleChain; - vm.removeDefaultEdgeRuleChain = removeDefaultEdgeRuleChain; + vm.unsetAutoAssignToEdgeRuleChain = unsetAutoAssignToEdgeRuleChain; initController(); @@ -195,7 +195,7 @@ export default function RuleChainsController(ruleChainService, userService, impo ruleChainActionsList.push({ onAction: function ($event, item) { - removeDefaultEdgeRuleChain($event, item); + unsetAutoAssignToEdgeRuleChain($event, item); }, name: function() { return $translate.instant('rulechain.remove-default-edge') }, details: function() { return $translate.instant('rulechain.remove-default-edge') }, @@ -205,7 +205,7 @@ export default function RuleChainsController(ruleChainService, userService, impo ruleChainActionsList.push({ onAction: function ($event, item) { - setDefaultRootEdgeRuleChain($event, item); + setEdgeTemplateRootRuleChain($event, item); }, name: function() { return $translate.instant('rulechain.set-default-root-edge') }, details: function() { return $translate.instant('rulechain.set-default-root-edge') }, @@ -339,7 +339,7 @@ export default function RuleChainsController(ruleChainService, userService, impo function mapRuleChainsWithDefaultEdges(ruleChains) { var deferred = $q.defer(); - ruleChainService.getDefaultEdgeRuleChains(null).then( + ruleChainService.getAutoAssignToEdgeRuleChains(null).then( function success(response) { let defaultEdgeRuleChainIds = []; response.map(function (ruleChain) { @@ -481,7 +481,7 @@ export default function RuleChainsController(ruleChainService, userService, impo .cancel($translate.instant('action.no')) .ok($translate.instant('action.yes')); $mdDialog.show(confirm).then(function () { - ruleChainService.addDefaultEdgeRuleChain(ruleChain.id.id).then( + ruleChainService.setAutoAssignToEdgeRuleChain(ruleChain.id.id).then( () => { vm.grid.refreshList(); } @@ -489,7 +489,7 @@ export default function RuleChainsController(ruleChainService, userService, impo }); } - function removeDefaultEdgeRuleChain($event, ruleChain) { + function unsetAutoAssignToEdgeRuleChain($event, ruleChain) { $event.stopPropagation(); var confirm = $mdDialog.confirm() .targetEvent($event) @@ -499,7 +499,7 @@ export default function RuleChainsController(ruleChainService, userService, impo .cancel($translate.instant('action.no')) .ok($translate.instant('action.yes')); $mdDialog.show(confirm).then(function () { - ruleChainService.removeDefaultEdgeRuleChain(ruleChain.id.id).then( + ruleChainService.unsetAutoAssignToEdgeRuleChain(ruleChain.id.id).then( () => { vm.grid.refreshList(); } @@ -507,7 +507,7 @@ export default function RuleChainsController(ruleChainService, userService, impo }); } - function setDefaultRootEdgeRuleChain($event, ruleChain) { + function setEdgeTemplateRootRuleChain($event, ruleChain) { $event.stopPropagation(); var confirm = $mdDialog.confirm() .targetEvent($event) @@ -517,7 +517,7 @@ export default function RuleChainsController(ruleChainService, userService, impo .cancel($translate.instant('action.no')) .ok($translate.instant('action.yes')); $mdDialog.show(confirm).then(function () { - ruleChainService.setDefaultRootEdgeRuleChain(ruleChain.id.id).then( + ruleChainService.setEdgeTemplateRootRuleChain(ruleChain.id.id).then( () => { vm.grid.refreshList(); } diff --git a/ui/src/app/rulechain/rulechains.tpl.html b/ui/src/app/rulechain/rulechains.tpl.html index 0e03a4d8fe..fe9b9fdc64 100644 --- a/ui/src/app/rulechain/rulechains.tpl.html +++ b/ui/src/app/rulechain/rulechains.tpl.html @@ -29,7 +29,7 @@ rule-chains-scope="vm.ruleChainsScope" edge="vm.edge" on-set-default-edge-rule-chain="vm.setDefaultEdgeRuleChain(event, vm.grid.detailsConfig.currentItem)" - on-remove-default-edge-rule-chain="vm.removeDefaultEdgeRuleChain(event, vm.grid.detailsConfig.currentItem)" + on-remove-default-edge-rule-chain="vm.unsetAutoAssignToEdgeRuleChain(event, vm.grid.detailsConfig.currentItem)" on-set-root-rule-chain="vm.setRootRuleChain(event, vm.grid.detailsConfig.currentItem)" on-export-rule-chain="vm.exportRuleChain(event, vm.grid.detailsConfig.currentItem)" on-delete-rule-chain="vm.grid.deleteItem(event, vm.grid.detailsConfig.currentItem)"> From 5aa8ad1755145da0636ae7cd91e3a200dbd2d350 Mon Sep 17 00:00:00 2001 From: Artem Babak Date: Thu, 24 Dec 2020 09:16:54 +0200 Subject: [PATCH 16/24] Hide edge type in alias types --- ui/src/app/entity/entity-filter.directive.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ui/src/app/entity/entity-filter.directive.js b/ui/src/app/entity/entity-filter.directive.js index 629433545d..c79739cdd4 100644 --- a/ui/src/app/entity/entity-filter.directive.js +++ b/ui/src/app/entity/entity-filter.directive.js @@ -22,7 +22,7 @@ import entityFilterTemplate from './entity-filter.tpl.html'; import './entity-filter.scss'; /*@ngInject*/ -export default function EntityFilterDirective($compile, $templateCache, $q, $document, $mdDialog, types, entityService) { +export default function EntityFilterDirective($compile, $templateCache, $q, $document, $mdDialog, types, entityService, userService) { var linker = function (scope, element, attrs, ngModelCtrl) { @@ -31,6 +31,9 @@ export default function EntityFilterDirective($compile, $templateCache, $q, $doc scope.ngModelCtrl = ngModelCtrl; scope.types = types; + if (userService.isEdgesSupportEnabled()) { + scope.allowedEntityTypes = Object.values(types.entityType).filter(entityType => entityType !== types.entityType.edge); + } scope.aliasFilterTypes = entityService.getAliasFilterTypesByEntityTypes(scope.allowedEntityTypes); scope.$watch('filter.type', function (newType, prevType) { From f71aec543afc6e55028c9a1bc6bd8670796ec746 Mon Sep 17 00:00:00 2001 From: Artem Babak Date: Thu, 24 Dec 2020 09:17:03 +0200 Subject: [PATCH 17/24] Hide edge type in alias types --- ui/src/app/entity/entity-filter.directive.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/app/entity/entity-filter.directive.js b/ui/src/app/entity/entity-filter.directive.js index c79739cdd4..e29fbf4a78 100644 --- a/ui/src/app/entity/entity-filter.directive.js +++ b/ui/src/app/entity/entity-filter.directive.js @@ -31,7 +31,7 @@ export default function EntityFilterDirective($compile, $templateCache, $q, $doc scope.ngModelCtrl = ngModelCtrl; scope.types = types; - if (userService.isEdgesSupportEnabled()) { + if (!userService.isEdgesSupportEnabled()) { scope.allowedEntityTypes = Object.values(types.entityType).filter(entityType => entityType !== types.entityType.edge); } scope.aliasFilterTypes = entityService.getAliasFilterTypesByEntityTypes(scope.allowedEntityTypes); From 790da527f4caec5396b9c358daa8d70582442b27 Mon Sep 17 00:00:00 2001 From: Artem Babak Date: Thu, 24 Dec 2020 13:24:45 +0200 Subject: [PATCH 18/24] Edge events with translations --- ui/src/app/common/types.constant.js | 123 +++++++++++++++++- .../app/event/event-row-edge-event.tpl.html | 4 +- ui/src/app/event/event-table.directive.js | 18 ++- ui/src/app/locale/locale.constant-en_US.json | 12 +- 4 files changed, 151 insertions(+), 6 deletions(-) diff --git a/ui/src/app/common/types.constant.js b/ui/src/app/common/types.constant.js index a9a833bd7e..e43dd9aa8a 100644 --- a/ui/src/app/common/types.constant.js +++ b/ui/src/app/common/types.constant.js @@ -1076,6 +1076,127 @@ export default angular.module('thingsboard.types', []) }, translate: { customTranslationsPrefix: "custom." - } + }, + edgeEventActionType: { + "ADDED": { + name: "audit-log.type-added" + }, + "DELETED": { + name: "audit-log.type-deleted" + }, + "UPDATED": { + name: "audit-log.type-updated" + }, + "ATTRIBUTES_UPDATED": { + name: "audit-log.type-attributes-updated" + }, + "ATTRIBUTES_DELETED": { + name: "audit-log.type-attributes-deleted" + }, + "RPC_CALL": { + name: "audit-log.type-rpc-call" + }, + "CREDENTIALS_UPDATED": { + name: "audit-log.type-credentials-updated" + }, + "RELATION_ADD_OR_UPDATE": { + name: "audit-log.type-relation-add-or-update" + }, + "RELATION_DELETED": { + name: "audit-log.type-relation-delete" + }, + "ALARM_ACK": { + name: "audit-log.type-alarm-ack" + }, + "ALARM_CLEAR": { + name: "audit-log.type-alarm-clear" + }, + "CREDENTIALS_REQUEST": { + name: "edge.credentials-request" + }, + "ATTRIBUTES_REQUEST": { + name: "edge.attributes-request" + }, + "TIMESERIES_UPDATED": { + name: "edge.timeseries-updated" + }, + "RELATION_REQUEST": { + name: "edge.relation-request" + }, + "RULE_CHAIN_METADATA_REQUEST": { + name: "edge.rule-chain-metadata-request" + }, + "GROUP_ENTITIES_REQUEST": { + name: "edge.group_entities_request" + }, + "GROUP_PERMISSIONS_REQUEST": { + name: "edge.group-permissions-request" + }, + "ASSIGNED_TO_EDGE": { + name: "audit-log.type-assigned-to-edge" + }, + "UNASSIGNED_FROM_EDGE": { + name: "audit-log.type-unassigned-from-edge" + } + }, + edgeEventTypeTranslations:{ + "DASHBOARD": { + name: "entity.type-dashboard" + }, + "ASSET": { + name: "entity.type-asset" + }, + "DEVICE": { + name: "entity.type-device" + }, + "ENTITY_VIEW": { + name: "entity.type-entity_view" + }, + "ALARM": { + name: "entity.type-alarm" + }, + "RULE_CHAIN": { + name: "entity.type-rulechain" + }, + "RULE_CHAIN_META_DATA": { + name: "entity.type-rule-chain-metadata" + }, + "EDGE": { + name: "entity.type-edge" + }, + "USER": { + name: "entity.type-user" + }, + "CUSTOMER": { + name: "entity.type-customer" + }, + "RELATION": { + name: "entity.type-relation" + }, + "ENTITY_GROUP": { + name: "entity.type-entity-group" + }, + "SCHEDULER_EVENT": { + name: "entity.type-scheduler-event" + }, + "WHITE_LABELING": { + name: "white-labeling.white-labeling" + }, + "LOGIN_WHITE_LABELING": { + name: "white-labeling.login-white-labeling" + }, + "CUSTOM_TRANSLATION": { + name: "custom-translation.custom-translation", + }, + "WIDGETS_BUNDLE": { + name: "widget.widget-bundle" + }, + "WIDGET_TYPE": { + name: "widget.type" + }, + "ADMIN_SETTINGS": { + name: "permission.resource.display-type.ADMIN_SETTINGS" + } + }, } ).name; 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 01b6c6e261..c88d98855a 100644 --- a/ui/src/app/event/event-row-edge-event.tpl.html +++ b/ui/src/app/event/event-row-edge-event.tpl.html @@ -16,8 +16,8 @@ -->
{{ event.createdTime | date : 'yyyy-MM-dd HH:mm:ss' }}
-
{{ event.type }}
-
{{ event.action }}
+
{{ event.edgeEventTypeText }}
+
{{ event.edgeEventActionText }}
{{ event.entityId }}
{{ updateStatus(event.createdTime) }}
diff --git a/ui/src/app/event/event-table.directive.js b/ui/src/app/event/event-table.directive.js index 746f82c405..ba41da8c34 100644 --- a/ui/src/app/event/event-table.directive.js +++ b/ui/src/app/event/event-table.directive.js @@ -22,7 +22,7 @@ import eventTableTemplate from './event-table.tpl.html'; /* eslint-enable import/no-unresolved, import/default */ /*@ngInject*/ -export default function EventTableDirective($compile, $templateCache, $rootScope, types, +export default function EventTableDirective($compile, $templateCache, $rootScope, $translate, types, eventService, edgeService, attributeService) { var linker = function (scope, element, attrs) { @@ -118,7 +118,11 @@ export default function EventTableDirective($compile, $templateCache, $rootScope scope.events.pending = true; promise.then( function success(events) { - scope.events.data = scope.events.data.concat(events.data); + if (scope.eventType === types.eventType.edgeEvent.value) { + scope.events.data = scope.events.data.concat(prepareEdgeEventData(events.data)); + } else { + scope.events.data = scope.events.data.concat(events.data); + } scope.events.nextPageLink = events.nextPageLink; scope.events.hasNext = events.hasNext; if (scope.events.hasNext) { @@ -266,6 +270,16 @@ export default function EventTableDirective($compile, $templateCache, $rootScope $compile(element.contents())(scope); } + + function prepareEdgeEventData(data) { + data.forEach( + edgeEvent => { + edgeEvent.edgeEventActionText = $translate.instant(types.edgeEventActionType[edgeEvent.action].name); + edgeEvent.edgeEventTypeText = $translate.instant(types.edgeEventTypeTranslations[edgeEvent.edgeId.entityType].name); + } + ); + return data; + } return { restrict: "E", diff --git a/ui/src/app/locale/locale.constant-en_US.json b/ui/src/app/locale/locale.constant-en_US.json index 77bd29dcb6..1469f23de4 100644 --- a/ui/src/app/locale/locale.constant-en_US.json +++ b/ui/src/app/locale/locale.constant-en_US.json @@ -854,7 +854,17 @@ "edge-type-list-empty": "No edge types selected.", "edge-types": "Edge types", "license-key-hint": "To obtain your license please navigate to the pricing page and select the best license option for your case.", - "cloud-endpoint-hint": "Edge requires HTTP(s) access to Cloud (ThingsBoard CE/PE) to verify the license key. Please specify Cloud URL that Edge is able to connect to." + "cloud-endpoint-hint": "Edge requires HTTP(s) access to Cloud (ThingsBoard CE/PE) to verify the license key. Please specify Cloud URL that Edge is able to connect to.", + + "set-edge-template-root-rulechain": "Make rule chain edge template root", + "set-edge-template-root-rulechain-title": "Are you sure you want to make the rule chain '{{ruleChainName}}' edge template root?", + "set-edge-template-root-rulechain-text": "After the confirmation the rule chain will become edge template root and will be root rule chain for a newly created edges.", + "set-auto-assign-to-edge": "Assign rule chain to edge(s) on creation", + "set-auto-assign-to-edge-title": "Are you sure you want to assign the edge rule chain '{{ruleChainName}}' to edge(s) on creation?", + "set-auto-assign-to-edge-text": "After the confirmation the edge rule chain will be automatically assigned to edge(s) on creation.", + "unset-auto-assign-to-edge": "Unset assign rule chain to edge(s) on creation", + "unset-auto-assign-to-edge-title": "Are you sure you want to unset assign the edge rule chain '{{ruleChainName}}' to edge(s) on creation?", + "unset-auto-assign-to-edge-text": "After the confirmation the edge rule chain will no longer be automatically assigned to edge(s) on creation." }, "error": { "unable-to-connect": "Unable to connect to the server! Please check your internet connection.", From e58af8fb2266a16962151253c8eb43426b0dd90b Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Thu, 24 Dec 2020 13:39:24 +0200 Subject: [PATCH 19/24] Added findMissingToRelatedRuleChains method --- .../server/controller/EdgeController.java | 35 +++- .../edge/DefaultEdgeNotificationService.java | 5 - .../service/edge/EdgeContextComponent.java | 3 +- .../service/edge/EdgeNotificationService.java | 7 - .../service/edge/rpc/EdgeGrpcService.java | 4 +- .../service/edge/rpc/EdgeGrpcSession.java | 14 +- .../edge/rpc/init/DefaultSyncEdgeService.java | 165 +++++++++--------- .../edge/rpc/init/SyncEdgeService.java | 13 +- .../server/dao/edge/EdgeService.java | 2 + .../server/dao/edge/EdgeServiceImpl.java | 58 ++++++ .../thingsboard/rest/client/RestClient.java | 4 +- ui/src/app/api/edge.service.js | 4 +- ui/src/app/edge/edge.directive.js | 2 +- 13 files changed, 195 insertions(+), 121 deletions(-) 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 6fc29a8976..60b10bb6fc 100644 --- a/application/src/main/java/org/thingsboard/server/controller/EdgeController.java +++ b/application/src/main/java/org/thingsboard/server/controller/EdgeController.java @@ -389,10 +389,12 @@ public class EdgeController extends BaseController { checkNotNull(query.getEdgeTypes()); checkEntityId(query.getParameters().getEntityId(), Operation.READ); try { - List edges = checkNotNull(edgeService.findEdgesByQuery(getCurrentUser().getTenantId(), query).get()); + SecurityUser user = getCurrentUser(); + TenantId tenantId = user.getTenantId(); + List edges = checkNotNull(edgeService.findEdgesByQuery(tenantId, query).get()); edges = edges.stream().filter(edge -> { try { - accessControlService.checkPermission(getCurrentUser(), Resource.EDGE, Operation.READ, edge.getId(), edge); + accessControlService.checkPermission(user, Resource.EDGE, Operation.READ, edge.getId(), edge); return true; } catch (ThingsboardException e) { return false; @@ -419,14 +421,18 @@ public class EdgeController extends BaseController { } @PreAuthorize("hasAuthority('TENANT_ADMIN')") - @RequestMapping(value = "/edge/sync", method = RequestMethod.POST) - public void syncEdge(@RequestBody EdgeId edgeId) throws ThingsboardException { + @RequestMapping(value = "/edge/sync/{edgeId}", method = RequestMethod.POST) + public void syncEdge(@PathVariable("edgeId") String strEdgeId) throws ThingsboardException { + checkParameter("edgeId", strEdgeId); try { - edgeId = checkNotNull(edgeId); if (isEdgesEnabled()) { - EdgeGrpcSession session = edgeGrpcService.getEdgeGrpcSessionById(edgeId); + EdgeId edgeId = new EdgeId(toUUID(strEdgeId)); + edgeId = checkNotNull(edgeId); + SecurityUser user = getCurrentUser(); + TenantId tenantId = user.getTenantId(); + EdgeGrpcSession session = edgeGrpcService.getEdgeGrpcSessionById(tenantId, edgeId); Edge edge = session.getEdge(); - syncEdgeService.sync(edge); + syncEdgeService.sync(tenantId, edge); } else { throw new ThingsboardException("Edges support disabled", ThingsboardErrorCode.GENERAL); } @@ -455,4 +461,19 @@ public class EdgeController extends BaseController { throw new ThingsboardException(e, ThingsboardErrorCode.SUBSCRIPTION_VIOLATION); } } + + @PreAuthorize("hasAuthority('TENANT_ADMIN')") + @RequestMapping(value = "/edge/missingToRelatedRuleChains/{edgeId}", method = RequestMethod.GET) + @ResponseBody + public String findMissingToRelatedRuleChains(@PathVariable("edgeId") String strEdgeId) throws ThingsboardException { + try { + EdgeId edgeId = new EdgeId(toUUID(strEdgeId)); + edgeId = checkNotNull(edgeId); + SecurityUser user = getCurrentUser(); + TenantId tenantId = user.getTenantId(); + return edgeService.findMissingToRelatedRuleChains(tenantId, edgeId); + } catch (Exception e) { + throw handleException(e); + } + } } 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 9d93bb0cbf..2e8676650d 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 @@ -113,11 +113,6 @@ public class DefaultEdgeNotificationService implements EdgeNotificationService { } } - @Override - public TimePageData findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink) { - return edgeEventService.findEdgeEvents(tenantId, edgeId, pageLink, true); - } - @Override public Edge setEdgeRootRuleChain(TenantId tenantId, Edge edge, RuleChainId ruleChainId) throws IOException { edge.setRootRuleChainId(ruleChainId); diff --git a/application/src/main/java/org/thingsboard/server/service/edge/EdgeContextComponent.java b/application/src/main/java/org/thingsboard/server/service/edge/EdgeContextComponent.java index c90cc99965..0c0f49b53b 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/EdgeContextComponent.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/EdgeContextComponent.java @@ -28,6 +28,7 @@ import org.thingsboard.server.dao.customer.CustomerService; import org.thingsboard.server.dao.dashboard.DashboardService; import org.thingsboard.server.dao.device.DeviceCredentialsService; import org.thingsboard.server.dao.device.DeviceService; +import org.thingsboard.server.dao.edge.EdgeEventService; import org.thingsboard.server.dao.edge.EdgeService; import org.thingsboard.server.dao.entityview.EntityViewService; import org.thingsboard.server.dao.relation.RelationService; @@ -74,7 +75,7 @@ public class EdgeContextComponent { @Lazy @Autowired - private EdgeNotificationService edgeNotificationService; + private EdgeEventService edgeEventService; @Lazy @Autowired diff --git a/application/src/main/java/org/thingsboard/server/service/edge/EdgeNotificationService.java b/application/src/main/java/org/thingsboard/server/service/edge/EdgeNotificationService.java index 6f35d4c32c..1657e9bfca 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/EdgeNotificationService.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/EdgeNotificationService.java @@ -15,14 +15,9 @@ */ package org.thingsboard.server.service.edge; -import org.thingsboard.server.common.data.Event; import org.thingsboard.server.common.data.edge.Edge; -import org.thingsboard.server.common.data.edge.EdgeEvent; -import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.RuleChainId; import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.common.data.page.TimePageData; -import org.thingsboard.server.common.data.page.TimePageLink; import org.thingsboard.server.common.msg.queue.TbCallback; import org.thingsboard.server.gen.transport.TransportProtos; @@ -30,8 +25,6 @@ import java.io.IOException; public interface EdgeNotificationService { - TimePageData findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink); - Edge setEdgeRootRuleChain(TenantId tenantId, Edge edge, RuleChainId ruleChainId) throws IOException; void pushNotificationToEdge(TransportProtos.EdgeNotificationMsgProto edgeNotificationMsg, TbCallback callback); 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 8fd335efea..3ccdd40a17 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 @@ -28,6 +28,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Service; import org.thingsboard.common.util.ThingsBoardThreadFactory; import org.thingsboard.server.common.data.DataConstants; +import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.edge.Edge; import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.TenantId; @@ -186,11 +187,12 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase i scheduleEdgeEventsCheck(edgeGrpcSession); } - public EdgeGrpcSession getEdgeGrpcSessionById(EdgeId edgeId) { + public EdgeGrpcSession getEdgeGrpcSessionById(TenantId tenantId, EdgeId edgeId) { EdgeGrpcSession session = sessions.get(edgeId); if (session != null && session.isConnected()) { return session; } else { + log.error("[{}] Edge is not connected [{}]", tenantId, edgeId); throw new RuntimeException("Edge is not connected"); } } 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 a3206817a0..4b34b0c4a2 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 @@ -165,7 +165,7 @@ public final class EdgeGrpcSession implements Closeable { } } if (connected && requestMsg.getMsgType().equals(RequestMsgType.SYNC_REQUEST_RPC_MESSAGE)) { - ctx.getSyncEdgeService().sync(edge); + ctx.getSyncEdgeService().sync(edge.getTenantId(), edge); } if (connected) { if (requestMsg.getMsgType().equals(RequestMsgType.UPLINK_RPC_MESSAGE) && requestMsg.hasUplinkMsg()) { @@ -267,7 +267,7 @@ public final class EdgeGrpcSession implements Closeable { UUID ifOffset = null; boolean success = true; do { - pageData = ctx.getEdgeNotificationService().findEdgeEvents(edge.getTenantId(), edge.getId(), pageLink); + pageData = ctx.getEdgeEventService().findEdgeEvents(edge.getTenantId(), edge.getId(), pageLink, true); if (isConnected() && !pageData.getData().isEmpty()) { log.trace("[{}] [{}] event(s) are going to be processed.", this.sessionId, pageData.getData().size()); List downlinkMsgsPack = convertToDownlinkMsgsPack(pageData.getData()); @@ -899,27 +899,27 @@ public final class EdgeGrpcSession implements Closeable { } if (uplinkMsg.getRuleChainMetadataRequestMsgList() != null && !uplinkMsg.getRuleChainMetadataRequestMsgList().isEmpty()) { for (RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg : uplinkMsg.getRuleChainMetadataRequestMsgList()) { - result.add(ctx.getSyncEdgeService().processRuleChainMetadataRequestMsg(edge, ruleChainMetadataRequestMsg)); + result.add(ctx.getSyncEdgeService().processRuleChainMetadataRequestMsg(edge.getTenantId(), edge, ruleChainMetadataRequestMsg)); } } if (uplinkMsg.getAttributesRequestMsgList() != null && !uplinkMsg.getAttributesRequestMsgList().isEmpty()) { for (AttributesRequestMsg attributesRequestMsg : uplinkMsg.getAttributesRequestMsgList()) { - result.add(ctx.getSyncEdgeService().processAttributesRequestMsg(edge, attributesRequestMsg)); + result.add(ctx.getSyncEdgeService().processAttributesRequestMsg(edge.getTenantId(), edge, attributesRequestMsg)); } } if (uplinkMsg.getRelationRequestMsgList() != null && !uplinkMsg.getRelationRequestMsgList().isEmpty()) { for (RelationRequestMsg relationRequestMsg : uplinkMsg.getRelationRequestMsgList()) { - result.add(ctx.getSyncEdgeService().processRelationRequestMsg(edge, relationRequestMsg)); + result.add(ctx.getSyncEdgeService().processRelationRequestMsg(edge.getTenantId(), edge, relationRequestMsg)); } } if (uplinkMsg.getUserCredentialsRequestMsgList() != null && !uplinkMsg.getUserCredentialsRequestMsgList().isEmpty()) { for (UserCredentialsRequestMsg userCredentialsRequestMsg : uplinkMsg.getUserCredentialsRequestMsgList()) { - result.add(ctx.getSyncEdgeService().processUserCredentialsRequestMsg(edge, userCredentialsRequestMsg)); + result.add(ctx.getSyncEdgeService().processUserCredentialsRequestMsg(edge.getTenantId(), edge, userCredentialsRequestMsg)); } } if (uplinkMsg.getDeviceCredentialsRequestMsgList() != null && !uplinkMsg.getDeviceCredentialsRequestMsgList().isEmpty()) { for (DeviceCredentialsRequestMsg deviceCredentialsRequestMsg : uplinkMsg.getDeviceCredentialsRequestMsgList()) { - result.add(ctx.getSyncEdgeService().processDeviceCredentialsRequestMsg(edge, deviceCredentialsRequestMsg)); + result.add(ctx.getSyncEdgeService().processDeviceCredentialsRequestMsg(edge.getTenantId(), edge, deviceCredentialsRequestMsg)); } } if (uplinkMsg.getDeviceRpcCallMsgList() != null && !uplinkMsg.getDeviceRpcCallMsgList().isEmpty()) { diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/init/DefaultSyncEdgeService.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/init/DefaultSyncEdgeService.java index c67a8062a0..67828fa1ac 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/init/DefaultSyncEdgeService.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/init/DefaultSyncEdgeService.java @@ -33,7 +33,6 @@ import org.springframework.core.io.DefaultResourceLoader; import org.springframework.stereotype.Service; import org.thingsboard.server.common.data.AdminSettings; import org.thingsboard.server.common.data.DashboardInfo; -import org.thingsboard.server.common.data.DataConstants; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.EdgeUtils; import org.thingsboard.server.common.data.EntityType; @@ -146,37 +145,37 @@ public class DefaultSyncEdgeService implements SyncEdgeService { private TbClusterService tbClusterService; @Override - public void sync(Edge edge) { - log.trace("[{}][{}] Staring edge sync process", edge.getTenantId(), edge.getId()); + public void sync(TenantId tenantId, Edge edge) { + log.trace("[{}][{}] Staring edge sync process", tenantId, edge.getId()); try { - syncWidgetsBundleAndWidgetTypes(edge); - syncAdminSettings(edge); - syncRuleChains(edge, new TimePageLink(DEFAULT_LIMIT)); - syncUsers(edge, new TextPageLink(DEFAULT_LIMIT)); - syncDevices(edge, new TimePageLink(DEFAULT_LIMIT)); - syncAssets(edge, new TimePageLink(DEFAULT_LIMIT)); - syncEntityViews(edge, new TimePageLink(DEFAULT_LIMIT)); - syncDashboards(edge, new TimePageLink(DEFAULT_LIMIT)); + syncWidgetsBundleAndWidgetTypes(tenantId, edge); + syncAdminSettings(tenantId, edge); + syncRuleChains(tenantId, edge, new TimePageLink(DEFAULT_LIMIT)); + syncUsers(tenantId, edge, new TextPageLink(DEFAULT_LIMIT)); + syncDevices(tenantId, edge, new TimePageLink(DEFAULT_LIMIT)); + syncAssets(tenantId, edge, new TimePageLink(DEFAULT_LIMIT)); + syncEntityViews(tenantId, edge, new TimePageLink(DEFAULT_LIMIT)); + syncDashboards(tenantId, edge, new TimePageLink(DEFAULT_LIMIT)); } catch (Exception e) { - log.error("[{}][{}] Exception during sync process", edge.getTenantId(), edge.getId(), e); + log.error("[{}][{}] Exception during sync process", tenantId, edge.getId(), e); } } - private void syncRuleChains(Edge edge, TimePageLink pageLink) { - log.trace("[{}] syncRuleChains [{}] [{}]", edge.getTenantId(), edge.getName(), pageLink); + private void syncRuleChains(TenantId tenantId, Edge edge, TimePageLink pageLink) { + log.trace("[{}] syncRuleChains [{}] [{}]", tenantId, edge.getName(), pageLink); try { ListenableFuture> future = - ruleChainService.findRuleChainsByTenantIdAndEdgeId(edge.getTenantId(), edge.getId(), pageLink); + ruleChainService.findRuleChainsByTenantIdAndEdgeId(tenantId, edge.getId(), pageLink); Futures.addCallback(future, new FutureCallback>() { @Override public void onSuccess(@Nullable TimePageData pageData) { if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) { log.trace("[{}] [{}] rule chains(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size()); for (RuleChain ruleChain : pageData.getData()) { - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.RULE_CHAIN, EdgeEventActionType.ADDED, ruleChain.getId(), null); + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.RULE_CHAIN, EdgeEventActionType.ADDED, ruleChain.getId(), null); } if (pageData.hasNext()) { - syncRuleChains(edge, pageData.getNextPageLink()); + syncRuleChains(tenantId, edge, pageData.getNextPageLink()); } } } @@ -191,21 +190,21 @@ public class DefaultSyncEdgeService implements SyncEdgeService { } } - private void syncDevices(Edge edge, TimePageLink pageLink) { - log.trace("[{}] syncDevices [{}]", edge.getTenantId(), edge.getName()); + private void syncDevices(TenantId tenantId, Edge edge, TimePageLink pageLink) { + log.trace("[{}] syncDevices [{}]", tenantId, edge.getName()); try { ListenableFuture> future = - deviceService.findDevicesByTenantIdAndEdgeId(edge.getTenantId(), edge.getId(), pageLink); + deviceService.findDevicesByTenantIdAndEdgeId(tenantId, edge.getId(), pageLink); Futures.addCallback(future, new FutureCallback>() { @Override public void onSuccess(@Nullable TimePageData pageData) { if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) { log.trace("[{}] [{}] device(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size()); for (Device device : pageData.getData()) { - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.DEVICE, EdgeEventActionType.ADDED, device.getId(), null); + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.DEVICE, EdgeEventActionType.ADDED, device.getId(), null); } if (pageData.hasNext()) { - syncDevices(edge, pageData.getNextPageLink()); + syncDevices(tenantId, edge, pageData.getNextPageLink()); } } } @@ -220,20 +219,20 @@ public class DefaultSyncEdgeService implements SyncEdgeService { } } - private void syncAssets(Edge edge, TimePageLink pageLink) { - log.trace("[{}] syncAssets [{}]", edge.getTenantId(), edge.getName()); + private void syncAssets(TenantId tenantId, Edge edge, TimePageLink pageLink) { + log.trace("[{}] syncAssets [{}]", tenantId, edge.getName()); try { - ListenableFuture> future = assetService.findAssetsByTenantIdAndEdgeId(edge.getTenantId(), edge.getId(), pageLink); + ListenableFuture> future = assetService.findAssetsByTenantIdAndEdgeId(tenantId, edge.getId(), pageLink); Futures.addCallback(future, new FutureCallback>() { @Override public void onSuccess(@Nullable TimePageData pageData) { if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) { log.trace("[{}] [{}] asset(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size()); for (Asset asset : pageData.getData()) { - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.ASSET, EdgeEventActionType.ADDED, asset.getId(), null); + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ASSET, EdgeEventActionType.ADDED, asset.getId(), null); } if (pageData.hasNext()) { - syncAssets(edge, pageData.getNextPageLink()); + syncAssets(tenantId, edge, pageData.getNextPageLink()); } } } @@ -248,20 +247,20 @@ public class DefaultSyncEdgeService implements SyncEdgeService { } } - private void syncEntityViews(Edge edge, TimePageLink pageLink) { - log.trace("[{}] syncEntityViews [{}]", edge.getTenantId(), edge.getName()); + private void syncEntityViews(TenantId tenantId, Edge edge, TimePageLink pageLink) { + log.trace("[{}] syncEntityViews [{}]", tenantId, edge.getName()); try { - ListenableFuture> future = entityViewService.findEntityViewsByTenantIdAndEdgeId(edge.getTenantId(), edge.getId(), pageLink); + ListenableFuture> future = entityViewService.findEntityViewsByTenantIdAndEdgeId(tenantId, edge.getId(), pageLink); Futures.addCallback(future, new FutureCallback>() { @Override public void onSuccess(@Nullable TimePageData pageData) { if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) { log.trace("[{}] [{}] entity view(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size()); for (EntityView entityView : pageData.getData()) { - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.ENTITY_VIEW, EdgeEventActionType.ADDED, entityView.getId(), null); + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ENTITY_VIEW, EdgeEventActionType.ADDED, entityView.getId(), null); } if (pageData.hasNext()) { - syncEntityViews(edge, pageData.getNextPageLink()); + syncEntityViews(tenantId, edge, pageData.getNextPageLink()); } } } @@ -276,20 +275,20 @@ public class DefaultSyncEdgeService implements SyncEdgeService { } } - private void syncDashboards(Edge edge, TimePageLink pageLink) { - log.trace("[{}] syncDashboards [{}]", edge.getTenantId(), edge.getName()); + private void syncDashboards(TenantId tenantId, Edge edge, TimePageLink pageLink) { + log.trace("[{}] syncDashboards [{}]", tenantId, edge.getName()); try { - ListenableFuture> future = dashboardService.findDashboardsByTenantIdAndEdgeId(edge.getTenantId(), edge.getId(), pageLink); + ListenableFuture> future = dashboardService.findDashboardsByTenantIdAndEdgeId(tenantId, edge.getId(), pageLink); Futures.addCallback(future, new FutureCallback>() { @Override public void onSuccess(@Nullable TimePageData pageData) { if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) { log.trace("[{}] [{}] dashboard(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size()); for (DashboardInfo dashboardInfo : pageData.getData()) { - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.DASHBOARD, EdgeEventActionType.ADDED, dashboardInfo.getId(), null); + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.DASHBOARD, EdgeEventActionType.ADDED, dashboardInfo.getId(), null); } if (pageData.hasNext()) { - syncDashboards(edge, pageData.getNextPageLink()); + syncDashboards(tenantId, edge, pageData.getNextPageLink()); } } } @@ -304,31 +303,31 @@ public class DefaultSyncEdgeService implements SyncEdgeService { } } - private void syncUsers(Edge edge, TextPageLink pageLink) { - log.trace("[{}] syncUsers [{}]", edge.getTenantId(), edge.getName()); + private void syncUsers(TenantId tenantId, Edge edge, TextPageLink pageLink) { + log.trace("[{}] syncUsers [{}]", tenantId, edge.getName()); try { TextPageData pageData; do { - pageData = userService.findTenantAdmins(edge.getTenantId(), pageLink); - pushUsersToEdge(pageData, edge); + pageData = userService.findTenantAdmins(tenantId, pageLink); + pushUsersToEdge(tenantId, pageData, edge); if (pageData != null && pageData.hasNext()) { pageLink = pageData.getNextPageLink(); } } while (pageData != null && pageData.hasNext()); - syncCustomerUsers(edge); + syncCustomerUsers(tenantId, edge); } catch (Exception e) { log.error("Exception during loading edge user(s) on sync!", e); } } - private void syncCustomerUsers(Edge edge) { + private void syncCustomerUsers(TenantId tenantId, Edge edge) { if (edge.getCustomerId() != null && !EntityId.NULL_UUID.equals(edge.getCustomerId().getId())) { - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.CUSTOMER, EdgeEventActionType.ADDED, edge.getCustomerId(), null); + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.CUSTOMER, EdgeEventActionType.ADDED, edge.getCustomerId(), null); TextPageLink pageLink = new TextPageLink(DEFAULT_LIMIT); TextPageData pageData; do { - pageData = userService.findCustomerUsers(edge.getTenantId(), edge.getCustomerId(), pageLink); - pushUsersToEdge(pageData, edge); + pageData = userService.findCustomerUsers(tenantId, edge.getCustomerId(), pageLink); + pushUsersToEdge(tenantId, pageData, edge); if (pageData != null && pageData.hasNext()) { pageLink = pageData.getNextPageLink(); } @@ -336,45 +335,45 @@ public class DefaultSyncEdgeService implements SyncEdgeService { } } - private void pushUsersToEdge(TextPageData pageData, Edge edge) { + private void pushUsersToEdge(TenantId tenantId, TextPageData pageData, Edge edge) { if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) { log.trace("[{}] [{}] user(s) are going to be pushed to edge.", edge.getId(), pageData.getData().size()); for (User user : pageData.getData()) { - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.USER, EdgeEventActionType.ADDED, user.getId(), null); + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.USER, EdgeEventActionType.ADDED, user.getId(), null); } } } - private void syncWidgetsBundleAndWidgetTypes(Edge edge) { - log.trace("[{}] syncWidgetsBundleAndWidgetTypes [{}]", edge.getTenantId(), edge.getName()); + private void syncWidgetsBundleAndWidgetTypes(TenantId tenantId, Edge edge) { + log.trace("[{}] syncWidgetsBundleAndWidgetTypes [{}]", tenantId, edge.getName()); List widgetsBundlesToPush = new ArrayList<>(); List widgetTypesToPush = new ArrayList<>(); - widgetsBundlesToPush.addAll(widgetsBundleService.findAllTenantWidgetsBundlesByTenantId(edge.getTenantId())); - widgetsBundlesToPush.addAll(widgetsBundleService.findSystemWidgetsBundles(edge.getTenantId())); + widgetsBundlesToPush.addAll(widgetsBundleService.findAllTenantWidgetsBundlesByTenantId(tenantId)); + widgetsBundlesToPush.addAll(widgetsBundleService.findSystemWidgetsBundles(tenantId)); try { for (WidgetsBundle widgetsBundle: widgetsBundlesToPush) { - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.WIDGETS_BUNDLE, EdgeEventActionType.ADDED, widgetsBundle.getId(), null); + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.WIDGETS_BUNDLE, EdgeEventActionType.ADDED, widgetsBundle.getId(), null); widgetTypesToPush.addAll(widgetTypeService.findWidgetTypesByTenantIdAndBundleAlias(widgetsBundle.getTenantId(), widgetsBundle.getAlias())); } for (WidgetType widgetType: widgetTypesToPush) { - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.WIDGET_TYPE, EdgeEventActionType.ADDED, widgetType.getId(), null); + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.WIDGET_TYPE, EdgeEventActionType.ADDED, widgetType.getId(), null); } } catch (Exception e) { log.error("Exception during loading widgets bundle(s) and widget type(s) on sync!", e); } } - private void syncAdminSettings(Edge edge) { - log.trace("[{}] syncAdminSettings [{}]", edge.getTenantId(), edge.getName()); + private void syncAdminSettings(TenantId tenantId, Edge edge) { + log.trace("[{}] syncAdminSettings [{}]", tenantId, edge.getName()); try { AdminSettings systemMailSettings = adminSettingsService.findAdminSettingsByKey(TenantId.SYS_TENANT_ID, "mail"); - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(systemMailSettings)); + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(systemMailSettings)); AdminSettings tenantMailSettings = convertToTenantAdminSettings(systemMailSettings.getKey(), (ObjectNode) systemMailSettings.getJsonValue()); - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(tenantMailSettings)); + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(tenantMailSettings)); AdminSettings systemMailTemplates = loadMailTemplates(); - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(systemMailTemplates)); + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(systemMailTemplates)); AdminSettings tenantMailTemplates = convertToTenantAdminSettings(systemMailTemplates.getKey(), (ObjectNode) systemMailTemplates.getJsonValue()); - saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(tenantMailTemplates)); + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.ADMIN_SETTINGS, EdgeEventActionType.UPDATED, null, mapper.valueToTree(tenantMailTemplates)); } catch (Exception e) { log.error("Can't load admin settings", e); } @@ -433,13 +432,13 @@ public class DefaultSyncEdgeService implements SyncEdgeService { } @Override - public ListenableFuture processRuleChainMetadataRequestMsg(Edge edge, RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg) { - log.trace("[{}] processRuleChainMetadataRequestMsg [{}][{}]", edge.getTenantId(), edge.getName(), ruleChainMetadataRequestMsg); + public ListenableFuture processRuleChainMetadataRequestMsg(TenantId tenantId, Edge edge, RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg) { + log.trace("[{}] processRuleChainMetadataRequestMsg [{}][{}]", tenantId, edge.getName(), ruleChainMetadataRequestMsg); SettableFuture futureToSet = SettableFuture.create(); if (ruleChainMetadataRequestMsg.getRuleChainIdMSB() != 0 && ruleChainMetadataRequestMsg.getRuleChainIdLSB() != 0) { RuleChainId ruleChainId = new RuleChainId(new UUID(ruleChainMetadataRequestMsg.getRuleChainIdMSB(), ruleChainMetadataRequestMsg.getRuleChainIdLSB())); - ListenableFuture future = saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.RULE_CHAIN_METADATA, EdgeEventActionType.ADDED, ruleChainId, null); + ListenableFuture future = saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.RULE_CHAIN_METADATA, EdgeEventActionType.ADDED, ruleChainId, null); Futures.addCallback(future, new FutureCallback() { @Override public void onSuccess(@Nullable EdgeEvent result) { @@ -457,8 +456,8 @@ public class DefaultSyncEdgeService implements SyncEdgeService { } @Override - public ListenableFuture processAttributesRequestMsg(Edge edge, AttributesRequestMsg attributesRequestMsg) { - log.trace("[{}] processAttributesRequestMsg [{}][{}]", edge.getTenantId(), edge.getName(), attributesRequestMsg); + public ListenableFuture processAttributesRequestMsg(TenantId tenantId, Edge edge, AttributesRequestMsg attributesRequestMsg) { + log.trace("[{}] processAttributesRequestMsg [{}][{}]", tenantId, edge.getName(), attributesRequestMsg); EntityId entityId = EntityIdFactory.getByTypeAndUuid( EntityType.valueOf(attributesRequestMsg.getEntityType()), new UUID(attributesRequestMsg.getEntityIdMSB(), attributesRequestMsg.getEntityIdLSB())); @@ -466,7 +465,7 @@ public class DefaultSyncEdgeService implements SyncEdgeService { if (type != null) { SettableFuture futureToSet = SettableFuture.create(); String scope = attributesRequestMsg.getScope(); - ListenableFuture> ssAttrFuture = attributesService.findAll(edge.getTenantId(), entityId, scope); + ListenableFuture> ssAttrFuture = attributesService.findAll(tenantId, entityId, scope); Futures.addCallback(ssAttrFuture, new FutureCallback>() { @Override public void onSuccess(@Nullable List ssAttributes) { @@ -489,7 +488,7 @@ public class DefaultSyncEdgeService implements SyncEdgeService { entityData.put("scope", scope); JsonNode body = mapper.valueToTree(entityData); log.debug("Sending attributes data msg, entityId [{}], attributes [{}]", entityId, body); - saveEdgeEvent(edge.getTenantId(), + saveEdgeEvent(tenantId, edge.getId(), type, EdgeEventActionType.ATTRIBUTES_UPDATED, @@ -500,7 +499,7 @@ public class DefaultSyncEdgeService implements SyncEdgeService { throw new RuntimeException("[" + edge.getName() + "] Failed to send attribute updates to the edge", e); } } else { - log.trace("[{}][{}] No attributes found for entity {} [{}]", edge.getTenantId(), + log.trace("[{}][{}] No attributes found for entity {} [{}]", tenantId, edge.getName(), entityId.getEntityType(), entityId.getId()); @@ -516,21 +515,21 @@ public class DefaultSyncEdgeService implements SyncEdgeService { }, dbCallbackExecutorService); return futureToSet; } else { - log.warn("[{}] Type doesn't supported {}", edge.getTenantId(), entityId.getEntityType()); + log.warn("[{}] Type doesn't supported {}", tenantId, entityId.getEntityType()); return Futures.immediateFuture(null); } } @Override - public ListenableFuture processRelationRequestMsg(Edge edge, RelationRequestMsg relationRequestMsg) { - log.trace("[{}] processRelationRequestMsg [{}][{}]", edge.getTenantId(), edge.getName(), relationRequestMsg); + public ListenableFuture processRelationRequestMsg(TenantId tenantId, Edge edge, RelationRequestMsg relationRequestMsg) { + log.trace("[{}] processRelationRequestMsg [{}][{}]", tenantId, edge.getName(), relationRequestMsg); EntityId entityId = EntityIdFactory.getByTypeAndUuid( EntityType.valueOf(relationRequestMsg.getEntityType()), new UUID(relationRequestMsg.getEntityIdMSB(), relationRequestMsg.getEntityIdLSB())); List>> futures = new ArrayList<>(); - futures.add(findRelationByQuery(edge, entityId, EntitySearchDirection.FROM)); - futures.add(findRelationByQuery(edge, entityId, EntitySearchDirection.TO)); + futures.add(findRelationByQuery(tenantId, edge, entityId, EntitySearchDirection.FROM)); + futures.add(findRelationByQuery(tenantId, edge, entityId, EntitySearchDirection.TO)); ListenableFuture>> relationsListFuture = Futures.allAsList(futures); SettableFuture futureToSet = SettableFuture.create(); Futures.addCallback(relationsListFuture, new FutureCallback>>() { @@ -544,7 +543,7 @@ public class DefaultSyncEdgeService implements SyncEdgeService { try { if (!relation.getFrom().getEntityType().equals(EntityType.EDGE) && !relation.getTo().getEntityType().equals(EntityType.EDGE)) { - saveEdgeEvent(edge.getTenantId(), + saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.RELATION, EdgeEventActionType.ADDED, @@ -568,26 +567,26 @@ public class DefaultSyncEdgeService implements SyncEdgeService { @Override public void onFailure(Throwable t) { - log.error("[{}] Can't find relation by query. Entity id [{}]", edge.getTenantId(), entityId, t); + log.error("[{}] Can't find relation by query. Entity id [{}]", tenantId, entityId, t); futureToSet.setException(t); } }, dbCallbackExecutorService); return futureToSet; } - private ListenableFuture> findRelationByQuery(Edge edge, EntityId entityId, EntitySearchDirection direction) { + private ListenableFuture> findRelationByQuery(TenantId tenantId, Edge edge, EntityId entityId, EntitySearchDirection direction) { EntityRelationsQuery query = new EntityRelationsQuery(); query.setParameters(new RelationsSearchParameters(entityId, direction, -1, false)); - return relationService.findByQuery(edge.getTenantId(), query); + return relationService.findByQuery(tenantId, query); } @Override - public ListenableFuture processDeviceCredentialsRequestMsg(Edge edge, DeviceCredentialsRequestMsg deviceCredentialsRequestMsg) { - log.trace("[{}] processDeviceCredentialsRequestMsg [{}][{}]", edge.getTenantId(), edge.getName(), deviceCredentialsRequestMsg); + public ListenableFuture processDeviceCredentialsRequestMsg(TenantId tenantId, Edge edge, DeviceCredentialsRequestMsg deviceCredentialsRequestMsg) { + log.trace("[{}] processDeviceCredentialsRequestMsg [{}][{}]", tenantId, edge.getName(), deviceCredentialsRequestMsg); SettableFuture futureToSet = SettableFuture.create(); if (deviceCredentialsRequestMsg.getDeviceIdMSB() != 0 && deviceCredentialsRequestMsg.getDeviceIdLSB() != 0) { DeviceId deviceId = new DeviceId(new UUID(deviceCredentialsRequestMsg.getDeviceIdMSB(), deviceCredentialsRequestMsg.getDeviceIdLSB())); - ListenableFuture future = saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.DEVICE, EdgeEventActionType.CREDENTIALS_UPDATED, deviceId, null); + ListenableFuture future = saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.DEVICE, EdgeEventActionType.CREDENTIALS_UPDATED, deviceId, null); Futures.addCallback(future, new FutureCallback() { @Override public void onSuccess(@Nullable EdgeEvent result) { @@ -605,12 +604,12 @@ public class DefaultSyncEdgeService implements SyncEdgeService { } @Override - public ListenableFuture processUserCredentialsRequestMsg(Edge edge, UserCredentialsRequestMsg userCredentialsRequestMsg) { - log.trace("[{}] processUserCredentialsRequestMsg [{}][{}]", edge.getTenantId(), edge.getName(), userCredentialsRequestMsg); + public ListenableFuture processUserCredentialsRequestMsg(TenantId tenantId, Edge edge, UserCredentialsRequestMsg userCredentialsRequestMsg) { + log.trace("[{}] processUserCredentialsRequestMsg [{}][{}]", tenantId, edge.getName(), userCredentialsRequestMsg); SettableFuture futureToSet = SettableFuture.create(); if (userCredentialsRequestMsg.getUserIdMSB() != 0 && userCredentialsRequestMsg.getUserIdLSB() != 0) { UserId userId = new UserId(new UUID(userCredentialsRequestMsg.getUserIdMSB(), userCredentialsRequestMsg.getUserIdLSB())); - ListenableFuture future = saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.USER, EdgeEventActionType.CREDENTIALS_UPDATED, userId, null); + ListenableFuture future = saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.USER, EdgeEventActionType.CREDENTIALS_UPDATED, userId, null); Futures.addCallback(future, new FutureCallback() { @Override public void onSuccess(@Nullable EdgeEvent result) { diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/init/SyncEdgeService.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/init/SyncEdgeService.java index a4df4e227c..f301384246 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/init/SyncEdgeService.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/init/SyncEdgeService.java @@ -17,6 +17,7 @@ package org.thingsboard.server.service.edge.rpc.init; import com.google.common.util.concurrent.ListenableFuture; import org.thingsboard.server.common.data.edge.Edge; +import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.gen.edge.AttributesRequestMsg; import org.thingsboard.server.gen.edge.DeviceCredentialsRequestMsg; import org.thingsboard.server.gen.edge.RelationRequestMsg; @@ -25,15 +26,15 @@ import org.thingsboard.server.gen.edge.UserCredentialsRequestMsg; public interface SyncEdgeService { - void sync(Edge edge); + void sync(TenantId tenantId, Edge edge); - ListenableFuture processRuleChainMetadataRequestMsg(Edge edge, RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg); + ListenableFuture processRuleChainMetadataRequestMsg(TenantId tenantId, Edge edge, RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg); - ListenableFuture processAttributesRequestMsg(Edge edge, AttributesRequestMsg attributesRequestMsg); + ListenableFuture processAttributesRequestMsg(TenantId tenantId, Edge edge, AttributesRequestMsg attributesRequestMsg); - ListenableFuture processRelationRequestMsg(Edge edge, RelationRequestMsg relationRequestMsg); + ListenableFuture processRelationRequestMsg(TenantId tenantId, Edge edge, RelationRequestMsg relationRequestMsg); - ListenableFuture processDeviceCredentialsRequestMsg(Edge edge, DeviceCredentialsRequestMsg deviceCredentialsRequestMsg); + ListenableFuture processDeviceCredentialsRequestMsg(TenantId tenantId, Edge edge, DeviceCredentialsRequestMsg deviceCredentialsRequestMsg); - ListenableFuture processUserCredentialsRequestMsg(Edge edge, UserCredentialsRequestMsg userCredentialsRequestMsg); + ListenableFuture processUserCredentialsRequestMsg(TenantId tenantId, Edge edge, UserCredentialsRequestMsg userCredentialsRequestMsg); } diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeService.java index e29d5f3307..2bce018d12 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeService.java @@ -80,4 +80,6 @@ public interface EdgeService { Object checkInstance(Object request); Object activateInstance(String licenseSecret, String releaseDate); + + String findMissingToRelatedRuleChains(TenantId tenantId, EdgeId edgeId); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java index 2819cc9db4..0d4d45bec4 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeServiceImpl.java @@ -15,6 +15,9 @@ */ package org.thingsboard.server.dao.edge; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.common.base.Function; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; @@ -54,10 +57,13 @@ import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.common.data.page.TextPageData; import org.thingsboard.server.common.data.page.TextPageLink; +import org.thingsboard.server.common.data.page.TimePageData; +import org.thingsboard.server.common.data.page.TimePageLink; import org.thingsboard.server.common.data.relation.EntityRelation; import org.thingsboard.server.common.data.relation.EntitySearchDirection; import org.thingsboard.server.common.data.relation.RelationTypeGroup; import org.thingsboard.server.common.data.rule.RuleChain; +import org.thingsboard.server.common.data.rule.RuleChainConnectionInfo; import org.thingsboard.server.dao.customer.CustomerDao; import org.thingsboard.server.dao.entity.AbstractEntityService; import org.thingsboard.server.dao.exception.DataValidationException; @@ -100,6 +106,8 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic public static final String INCORRECT_CUSTOMER_ID = "Incorrect customerId "; public static final String INCORRECT_EDGE_ID = "Incorrect edgeId "; + private static final ObjectMapper mapper = new ObjectMapper(); + private static final int DEFAULT_LIMIT = 100; private RestTemplate restTemplate; @@ -575,6 +583,56 @@ public class EdgeServiceImpl extends AbstractEntityService implements EdgeServic return this.restTemplate.postForEntity(EDGE_LICENSE_SERVER_ENDPOINT + "/api/license/activateInstance?licenseSecret={licenseSecret}&releaseDate={releaseDate}", (Object) null, Object.class, params); } + @Override + public String findMissingToRelatedRuleChains(TenantId tenantId, EdgeId edgeId) { + List edgeRuleChains = findEdgeRuleChains(tenantId, edgeId); + List edgeRuleChainIds = edgeRuleChains.stream().map(IdBased::getId).collect(Collectors.toList()); + ObjectNode result = mapper.createObjectNode(); + for (RuleChain edgeRuleChain : edgeRuleChains) { + List connectionInfos = + ruleChainService.loadRuleChainMetaData(edgeRuleChain.getTenantId(), edgeRuleChain.getId()).getRuleChainConnections(); + if (connectionInfos != null && !connectionInfos.isEmpty()) { + List connectedRuleChains = + connectionInfos.stream().map(RuleChainConnectionInfo::getTargetRuleChainId).collect(Collectors.toList()); + List missingRuleChains = new ArrayList<>(); + for (RuleChainId connectedRuleChain : connectedRuleChains) { + if (!edgeRuleChainIds.contains(connectedRuleChain)) { + RuleChain ruleChainById = ruleChainService.findRuleChainById(tenantId, connectedRuleChain); + missingRuleChains.add(ruleChainById.getName()); + } + } + if (!missingRuleChains.isEmpty()) { + ArrayNode array = mapper.createArrayNode(); + for (String missingRuleChain : missingRuleChains) { + array.add(missingRuleChain); + } + result.set(edgeRuleChain.getName(), array); + } + } + } + return result.toString(); + } + + private List findEdgeRuleChains(TenantId tenantId, EdgeId edgeId) { + List result = new ArrayList<>(); + TimePageLink pageLink = new TimePageLink(DEFAULT_LIMIT); + TimePageData pageData; + try { + do { + pageData = ruleChainService.findRuleChainsByTenantIdAndEdgeId(tenantId, edgeId, pageLink).get(); + if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) { + result.addAll(pageData.getData()); + if (pageData.hasNext()) { + pageLink = pageData.getNextPageLink(); + } + } + } while (pageData != null && pageData.hasNext()); + } catch (Exception e) { + log.error("[{}] Can't find edge rule chains [{}]", tenantId, edgeId, e); + } + return result; + } + private void initRestTemplate() { boolean jdkHttpClientEnabled = isNotEmpty(System.getProperty("tb.proxy.jdk")) && System.getProperty("tb.proxy.jdk").equalsIgnoreCase("true"); boolean systemProxyEnabled = isNotEmpty(System.getProperty("tb.proxy.system")) && System.getProperty("tb.proxy.system").equalsIgnoreCase("true"); diff --git a/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java b/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java index fdde79359d..cf214016d9 100644 --- a/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java +++ b/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java @@ -2384,7 +2384,9 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable { } public void syncEdge(EdgeId edgeId) { - restTemplate.postForEntity(baseURL + "/api/edge/sync", edgeId, EdgeId.class); + Map params = new HashMap<>(); + params.put("edgeId", edgeId.toString()); + restTemplate.postForEntity(baseURL + "/api/edge/sync/{edgeId}", null, EdgeId.class, params); } @Deprecated diff --git a/ui/src/app/api/edge.service.js b/ui/src/app/api/edge.service.js index e8abec1fd9..f5e43f7ef5 100644 --- a/ui/src/app/api/edge.service.js +++ b/ui/src/app/api/edge.service.js @@ -297,8 +297,8 @@ function EdgeService($http, $q, customerService) { function syncEdge(edgeId) { var deferred = $q.defer(); - var url = '/api/edge/sync'; - $http.post(url, edgeId).then(function success(response) { + var url = '/api/edge/sync/' + edgeId; + $http.post(url, null).then(function success(response) { deferred.resolve(response); }, function fail(response) { deferred.reject(response.data); diff --git a/ui/src/app/edge/edge.directive.js b/ui/src/app/edge/edge.directive.js index bdd3b44b67..e306a4d5d2 100644 --- a/ui/src/app/edge/edge.directive.js +++ b/ui/src/app/edge/edge.directive.js @@ -70,7 +70,7 @@ export default function EdgeDirective($compile, $templateCache, $translate, $mdD }; scope.onEdgeSync = function (edgeId) { - edgeService.syncEdge(edgeId).then( + edgeService.syncEdge(edgeId.id).then( function success() { toast.showSuccess($translate.instant('edge.sync-message'), 750, angular.element(element).parent().parent(), 'bottom left'); }, From af3a3683875fb07916ac79ac8a3f8c37181fe0c1 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Thu, 24 Dec 2020 14:45:37 +0200 Subject: [PATCH 20/24] Fixed sync test --- .../thingsboard/server/controller/BaseEdgeControllerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/src/test/java/org/thingsboard/server/controller/BaseEdgeControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseEdgeControllerTest.java index 16338584af..2340e822ac 100644 --- a/application/src/test/java/org/thingsboard/server/controller/BaseEdgeControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseEdgeControllerTest.java @@ -682,7 +682,7 @@ public abstract class BaseEdgeControllerTest extends AbstractControllerTest { edgeImitator.getDownlinkMsgs().clear(); edgeImitator.expectMessageAmount(4); - doPost("/api/edge/sync", edge.getId()); + doPost("/api/edge/sync/" + edge.getId()); edgeImitator.waitForMessages(); Assert.assertEquals(4, edgeImitator.getDownlinkMsgs().size()); From 633de57330605ba60d6600e37ebbfc265de2a9ad Mon Sep 17 00:00:00 2001 From: Artem Babak Date: Thu, 24 Dec 2020 15:38:02 +0200 Subject: [PATCH 21/24] EdgeEvents columns width --- ui/src/app/event/event-header-edge-event.tpl.html | 6 +++--- ui/src/app/event/event-row-edge-event.tpl.html | 6 +++--- 2 files changed, 6 insertions(+), 6 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 e84922f6a5..3de281ddc7 100644 --- a/ui/src/app/event/event-header-edge-event.tpl.html +++ b/ui/src/app/event/event-header-edge-event.tpl.html @@ -16,8 +16,8 @@ -->
event.event-time
-
event.event-type
-
edge.event-action
-
edge.entity-id
+
event.event-type
+
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 c88d98855a..a842b5d787 100644 --- a/ui/src/app/event/event-row-edge-event.tpl.html +++ b/ui/src/app/event/event-row-edge-event.tpl.html @@ -16,9 +16,9 @@ -->
{{ event.createdTime | date : 'yyyy-MM-dd HH:mm:ss' }}
-
{{ event.edgeEventTypeText }}
-
{{ event.edgeEventActionText }}
-
{{ event.entityId }}
+
{{ event.edgeEventTypeText }}
+
{{ event.edgeEventActionText }}
+
{{ event.entityId }}
{{ updateStatus(event.createdTime) }}
Date: Thu, 24 Dec 2020 17:43:11 +0200 Subject: [PATCH 22/24] Rule chains default to auto-assign style refactor --- ui/src/app/locale/locale.constant-de_DE.json | 20 ++++---- ui/src/app/locale/locale.constant-en_US.json | 29 +++++------ ui/src/app/locale/locale.constant-es_ES.json | 20 ++++---- ui/src/app/locale/locale.constant-fr_FR.json | 20 ++++---- ui/src/app/rulechain/rulechain-card.tpl.html | 4 +- .../app/rulechain/rulechain-fieldset.tpl.html | 49 +++++++++---------- ui/src/app/rulechain/rulechain.directive.js | 2 +- ui/src/app/rulechain/rulechains.controller.js | 34 ++++++------- ui/src/app/rulechain/rulechains.tpl.html | 4 +- 9 files changed, 87 insertions(+), 95 deletions(-) diff --git a/ui/src/app/locale/locale.constant-de_DE.json b/ui/src/app/locale/locale.constant-de_DE.json index e209d61c85..6c69c25910 100644 --- a/ui/src/app/locale/locale.constant-de_DE.json +++ b/ui/src/app/locale/locale.constant-de_DE.json @@ -1391,7 +1391,6 @@ "assign-rulechains": "Regelketten zuweisen", "assign-new-rulechain": "Neues Regelkette zuweisen", "delete-rulechains": "Regelketten löschen", - "default": "Standard", "unassign-rulechain": "Nicht zugeordnete Regelkette", "unassign-rulechains": "Nicht zugeordnete Regelketten", "unassign-rulechain-title": "Möchten Sie die Zuordnung die Regelkette '{{ruleChainTitle}}' wirklich aufheben?", @@ -1401,16 +1400,17 @@ "unassign-rulechains-from-edge-text": "Nach der Bestätigung wird die Zuordnung aller ausgewählten Regelketten aufgehoben und sie sind für den Rand nicht mehr zugänglich.", "assign-rulechain-to-edge": "Regelkette(n) dem Rand zuordnen", "assign-rulechain-to-edge-text": "Bitte wählen Sie die Regelketten aus, die Sie dem Rand zuordnen möchten", - "set-default-root-edge": "Machen Sie Randregelkette zur Wurzel Standard", - "set-default-root-edge-rulechain-title": "Sind Sie sicher, dass Sie die Randregelkette '{{ruleChainName}}' zur Wurzel machen Standard?", - "set-default-root-edge-rulechain-text": "Nach der Bestätigung wird die Randregelkette zur Wurzel Standard und behandelt alle eingehenden Transportnachrichten.", + "set-edge-template-root-rulechain": "Regelkette als Rand der Kantenvorlage erstellen", + "set-edge-template-root-rulechain-title": "Möchten Sie die Kantenvorlage der Regelkette '{{ruleChainName}}' wirklich als Root festlegen?", + "set-edge-template-root-rulechain-text": "Nach der Bestätigung wird die Regelkette zum Stamm der Kantenvorlage und zur Stammregelkette für neu erstellte Kanten.", "invalid-rulechain-type-error": "Regelkette konnte nicht importiert werden: Ungültige Regelkettentyp. Erwarteter Typ ist {{expectedRuleChainType}}.", - "set-default-edge": "Machen Sie Regelkette Standard", - "set-default-edge-title": "Sind Sie sicher, dass Sie die Randregelkette '{{ruleChainName}}' machen Standard?", - "set-default-edge-text": "Nach der Bestätigung wird die Randregelkette für neu erstellte Rand vergeben.", - "remove-default-edge": "Randregelkette Standard entfernen", - "remove-default-edge-title": "Sind Sie sicher, dass Sie die Randregelkette '{{ruleChainName}}' aus der Standardliste entfernen?", - "remove-default-edge-text": "Nach der Bestätigung wird die Randregelkette nicht für neu erstellte Rand vergeben." + "set-auto-assign-to-edge": "Weisen Sie den Kanten bei der Erstellung eine Regelkette zu", + "set-auto-assign-to-edge-title": "Sind Sie sicher, dass Sie die Kantenregelkette '{{ruleChainName}}' bei der Erstellung den Kanten zuweisen möchten? ", + "set-auto-assign-to-edge-text": "Nach der Bestätigung wird die Kantenregelkette bei der Erstellung automatisch den Kanten zugewiesen.", + "unset-auto-assign-to-edge": "Weisen Sie Kanten bei der Erstellung keine Regelkette zu", + "unset-auto-assign-to-edge-title": "Sind Sie sicher, dass Sie die Kantenregelkette '{{ruleChainName}}' bei der Erstellung nicht den Kanten zuweisen möchten?", + "unset-auto-assign-to-edge-text": "Nach der Bestätigung wird die Kantenregelkette bei der Erstellung nicht mehr automatisch den Kanten zugewiesen.", + "edge-template-root": "Vorlagenstamm" }, "rulenode": { "details": "Details", diff --git a/ui/src/app/locale/locale.constant-en_US.json b/ui/src/app/locale/locale.constant-en_US.json index 1469f23de4..e04d152b43 100644 --- a/ui/src/app/locale/locale.constant-en_US.json +++ b/ui/src/app/locale/locale.constant-en_US.json @@ -854,17 +854,7 @@ "edge-type-list-empty": "No edge types selected.", "edge-types": "Edge types", "license-key-hint": "To obtain your license please navigate to the pricing page and select the best license option for your case.", - "cloud-endpoint-hint": "Edge requires HTTP(s) access to Cloud (ThingsBoard CE/PE) to verify the license key. Please specify Cloud URL that Edge is able to connect to.", - - "set-edge-template-root-rulechain": "Make rule chain edge template root", - "set-edge-template-root-rulechain-title": "Are you sure you want to make the rule chain '{{ruleChainName}}' edge template root?", - "set-edge-template-root-rulechain-text": "After the confirmation the rule chain will become edge template root and will be root rule chain for a newly created edges.", - "set-auto-assign-to-edge": "Assign rule chain to edge(s) on creation", - "set-auto-assign-to-edge-title": "Are you sure you want to assign the edge rule chain '{{ruleChainName}}' to edge(s) on creation?", - "set-auto-assign-to-edge-text": "After the confirmation the edge rule chain will be automatically assigned to edge(s) on creation.", - "unset-auto-assign-to-edge": "Unset assign rule chain to edge(s) on creation", - "unset-auto-assign-to-edge-title": "Are you sure you want to unset assign the edge rule chain '{{ruleChainName}}' to edge(s) on creation?", - "unset-auto-assign-to-edge-text": "After the confirmation the edge rule chain will no longer be automatically assigned to edge(s) on creation." + "cloud-endpoint-hint": "Edge requires HTTP(s) access to Cloud (ThingsBoard CE/PE) to verify the license key. Please specify Cloud URL that Edge is able to connect to." }, "error": { "unable-to-connect": "Unable to connect to the server! Please check your internet connection.", @@ -1561,7 +1551,6 @@ "rulechain": { "rulechain": "Rule chain", "rulechains": "Rule chains", - "default-root": "Default root", "root": "Root", "delete": "Delete rule chain", "name": "Name", @@ -1598,7 +1587,7 @@ "assign-rulechains": "Assign rulechains", "assign-new-rulechain": "Assign new rulechain", "delete-rulechains": "Delete rulechains", - "auto-assign-to-edge": "Auto-assign to edge(s)", + "set-auto-assign-to-edge-card": "Assign to edge(s) on creation", "unassign-rulechain": "Unassign rulechain", "unassign-rulechains": "Unassign rulechains", "unassign-rulechain-title": "Are you sure you want to unassign the rulechain '{{ruleChainTitle}}'?", @@ -1611,13 +1600,17 @@ "set-default-root-edge": "Make rule chain default root", "set-default-root-edge-rulechain-title": "Are you sure you want to make the rule chain '{{ruleChainName}}' default edge root?", "set-default-root-edge-rulechain-text": "After the confirmation the rule chain will become default edge root and will handle all incoming transport messages.", + "set-edge-template-root-rulechain": "Make rule chain as edge template root", + "set-edge-template-root-rulechain-title": "Are you sure you want to make the rule chain '{{ruleChainName}}' edge template root?", + "set-edge-template-root-rulechain-text": "After the confirmation the rule chain will become edge template root and will be root rule chain for a newly created edges.", "invalid-rulechain-type-error": "Unable to import rule chain: Invalid rule chain type. Expected type is {{expectedRuleChainType}}.", - "set-auto-assign-to-edge": "Auto-assign rule chain to edge(s) on creation", - "set-auto-assign-to-edge-title": "Are you sure you want to auto-assign the edge rule chain '{{ruleChainName}}' to edge(s) on creation?", + "set-auto-assign-to-edge": "Assign rule chain to edge(s) on creation", + "set-auto-assign-to-edge-title": "Are you sure you want to assign the edge rule chain '{{ruleChainName}}' to edge(s) on creation?", "set-auto-assign-to-edge-text": "After the confirmation the edge rule chain will be automatically assigned to edge(s) on creation.", - "remove-auto-assign-to-edge": "Do not assign rule chain to edge(s) on creation", - "remove-auto-assign-to-edge-title": "Are you sure you do not want to auto-assign the edge rule chain '{{ruleChainName}}' to edge(s) on creation?", - "remove-auto-assign-to-edge-text": "After the confirmation the edge rule chain won't be automatically assigned to edge(s) on creation." + "unset-auto-assign-to-edge": "Do not assign rule chain to edge(s) on creation", + "unset-auto-assign-to-edge-title": "Are you sure you do not want to assign the edge rule chain '{{ruleChainName}}' to edge(s) on creation?", + "unset-auto-assign-to-edge-text": "After the confirmation the edge rule chain will no longer be automatically assigned to edge(s) on creation.", + "edge-template-root": "Template Root" }, "rulenode": { "details": "Details", diff --git a/ui/src/app/locale/locale.constant-es_ES.json b/ui/src/app/locale/locale.constant-es_ES.json index 59b354c191..301e292de2 100644 --- a/ui/src/app/locale/locale.constant-es_ES.json +++ b/ui/src/app/locale/locale.constant-es_ES.json @@ -1459,7 +1459,6 @@ "assign-rulechains": "Asignar cadenas de reglas", "assign-new-rulechain": "Asignar nueva cadena de reglas", "delete-rulechains": "Eliminar cadenas de reglas", - "default": "Predeterminado", "unassign-rulechain": "Anular asignación de cadena de reglas", "unassign-rulechains": "Anular asignación de cadenas de reglas", "unassign-rulechain-title": "¿Está seguro de que desea desasignar la cadena de reglas '{{ruleChainTitle}}'?", @@ -1469,16 +1468,17 @@ "unassign-rulechains-from-edge-text": "Después de la confirmación, todas las cadenas de reglas seleccionadas quedarán sin asignar y el borde no podrá acceder a ellas", "assign-rulechain-to-edge": "Asignar cadena (s) de reglas a borde", "assign-rulechain-to-edge-text": "Seleccione las cadenas de reglas para asignar al borde", - "set-default-root-edge": "Hacer que la cadena de reglas sea la raíz predeterminada", - "set-default-root-edge-rulechain-title": "¿Está seguro de que desea hacer que la cadena de reglas '{{ruleChainName}}' sea la raíz de borde predeterminada?", - "set-default-root-edge-rulechain-text": "Después de la confirmación, la cadena de reglas se convertirá en raíz raíz predeterminada y manejará todos los mensajes de transporte entrantes", + "set-edge-template-root-rulechain": "Hacer una cadena de reglas como raíz de la plantilla de borde", + "set-edge-template-root-rulechain-title": "¿Está seguro de que desea que la cadena de reglas '{{ruleChainName}}' sea la raíz de la plantilla de borde?", + "set-edge-template-root-rulechain-text": "Después de la confirmación, la cadena de reglas se convertirá en la raíz de la plantilla de borde y será la cadena de reglas raíz para los bordes recién creados.", "invalid-rulechain-type-error": "No se puede importar la cadena de reglas: Tipo de cadena de reglas no válido. El tipo esperado es {{expectedRuleChainType}}", - "set-default-edge": "Hacer que la cadena de reglas de borde sea predeterminada", - "set-default-edge-title": "¿Está seguro de que desea que la cadena de reglas de borde '{{ruleChainName}}' sea predeterminada?", - "set-default-edge-text": "Después de la confirmación, la cadena de reglas de borde se agregará a la lista predeterminada y se asignará a los bordes recién creados", - "remove-default-edge": "Eliminar la cadena de regla de borde de los valores predeterminados", - "remove-default-edge-title": "¿Está seguro de que desea eliminar la cadena de reglas de borde '{{ruleChainName}}' de la lista predeterminada?", - "remove-default-edge-text": "Después de la confirmación, la cadena de reglas de borde no se asignará a los bordes recién creados" + "set-auto-assign-to-edge": "Asignar cadena de reglas a los bordes en la creación", + "set-auto-assign-to-edge-title": "¿Está seguro de que desea asignar la cadena de reglas de borde '{{ruleChainName}}' a los bordes en la creación?", + "set-auto-assign-to-edge-text": "Después de la confirmación, la cadena de reglas de borde se asignará automáticamente a los bordes en la creación.", + "unset-auto-assign-to-edge": "No asigne una cadena de reglas a los bordes en la creación", + "unset-auto-assign-to-edge-title": "¿Está seguro de que no desea asignar la cadena de reglas de borde '{{ruleChainName}}' a los bordes en la creación?", + "unset-auto-assign-to-edge-text": "Después de la confirmación, la cadena de reglas de borde ya no se asignará automáticamente a los bordes en la creación.", + "edge-template-root": "Raíz de plantilla" }, "rulenode": { "details": "Detalles", diff --git a/ui/src/app/locale/locale.constant-fr_FR.json b/ui/src/app/locale/locale.constant-fr_FR.json index d6775567fb..a4b92cae37 100644 --- a/ui/src/app/locale/locale.constant-fr_FR.json +++ b/ui/src/app/locale/locale.constant-fr_FR.json @@ -1436,7 +1436,6 @@ "assign-rulechains": "Attribuer aux chaînes de règles", "assign-new-rulechain": "Attribuer une nouvele chaînes de règles", "delete-rulechains": "Supprimer une chaînes de règles", - "default": "Défaut", "unassign-rulechain": "Retirer chaîne de règles", "unassign-rulechains": "Retirer chaînes de règles", "unassign-rulechain-title": "AÊtes-vous sûr de vouloir retirer l'attribution de chaînes de règles '{{ruleChainTitle}}'?", @@ -1446,16 +1445,17 @@ "unassign-rulechains-from-edge-text": "Après la confirmation, tous les chaînes de règles sélectionnés ne seront pas attribués et ne seront pas accessibles a la bordure.", "assign-rulechain-to-edge": "Attribuer les chaînes de règles a la bordure", "assign-rulechain-to-edge-text": "Veuillez sélectionner la bordure pour attribuer le ou les chaînes de règles", - "set-default-root-edge": "Définir la racine par défaut de la chaîne de règles", - "set-default-root-edge-rulechain-title": "AVoulez-vous vraiment créer de chaînes de règles par défaut '{{ruleChainName}}'?", - "set-default-root-edge-rulechain-text": "Après la confirmation, la chaîne de règles deviendra la racine de la bordure par défaut et gérera tous les messages de transport entrants.", + "set-edge-template-root-rulechain": "Faire de la chaîne de règles la racine du modèle d'arête", + "set-edge-template-root-rulechain-title": "Voulez-vous vraiment définir la racine du modèle d'arête de la chaîne de règles '{{ruleChainName}}'?", + "set-edge-template-root-rulechain-text": "Après la confirmation, la chaîne de règles deviendra la racine du modèle d'arête et sera la chaîne de règles racine pour les arêtes nouvellement créées.", "invalid-rulechain-type-error": "Impossible d'importer la chaîne de règles: type de chaîne de règles non valide. Le type attendu est {{attenduRuleChainType}}.", - "set-default-edge": "Définir la chaîne de règles de la bordure par défaut", - "set-default-edge-title": "Voulez-vous vraiment définir la chaîne de règles de la bordure '{{ruleChainName}}' par défaut?", - "set-default-edge-text": "Après la confirmation, la chaîne de règles d'arête sera ajoutée à la liste par défaut et affectée aux arêtes nouvellement créées.", - "remove-default-edge": "Supprimer la chaîne de règles de la bordure des valeurs par défaut", - "remove-default-edge-title": "Voulez-vous vraiment supprimer la chaîne de règles de la bordure '{{ruleChainName}}' de la liste par défaut", - "remove-default-edge-text": "Après la confirmation, la chaîne de règles d'arête ne sera pas affectée aux arêtes nouvellement créées." + "set-auto-assign-to-edge": "Attribuer une chaîne de règles aux arêtes lors de la création", + "set-auto-assign-to-edge-title": "Voulez-vous vraiment attribuer la chaîne de règles d'arête '{{ruleChainName}}' à l'arête (s) lors de la création?", + "set-auto-assign-to-edge-text": "Après la confirmation, la chaîne de règles d'arêtes sera automatiquement affectée aux arêtes lors de la création.", + "unset-auto-assign-to-edge": "N'attribuez pas de chaîne de règles aux arêtes lors de la création", + "unset-auto-assign-to-edge-title": "Êtes-vous sûr de ne pas vouloir attribuer la chaîne de règles d'arête '{{ruleChainName}}' à l'arête (s) lors de la création?", + "unset-auto-assign-to-edge-text": "Après la confirmation, la chaîne de règles d'arêtes ne sera plus automatiquement affectée aux arêtes lors de la création.", + "edge-template-root": "Racine du modèle" }, "rulenode": { "add": "Ajouter un noeud de règle", diff --git a/ui/src/app/rulechain/rulechain-card.tpl.html b/ui/src/app/rulechain/rulechain-card.tpl.html index 95e7b4fd2b..974a0af4cf 100644 --- a/ui/src/app/rulechain/rulechain-card.tpl.html +++ b/ui/src/app/rulechain/rulechain-card.tpl.html @@ -18,6 +18,6 @@
rulechain.root
-
rulechain.default-root
+
rulechain.edge-template-root
-
rulechain.auto-assign-to-edge
+
rulechain.set-auto-assign-to-edge-card
diff --git a/ui/src/app/rulechain/rulechain-fieldset.tpl.html b/ui/src/app/rulechain/rulechain-fieldset.tpl.html index 223806386f..6a4841a550 100644 --- a/ui/src/app/rulechain/rulechain-fieldset.tpl.html +++ b/ui/src/app/rulechain/rulechain-fieldset.tpl.html @@ -15,32 +15,31 @@ limitations under the License. --> -{{ 'rulechain.export' | translate }} - -{{ 'rulechain.set-root' | translate }} - -{{ 'rulechain.set-default-root-edge' | translate }} -{{ 'rulechain.set-auto-assign-to-edge' | translate }} -{{ 'rulechain.remove-auto-assign-to-edge' | translate }} - -{{ 'rulechain.set-root' | translate }} - -{{ 'rulechain.delete' | translate }} +
+ {{ 'rulechain.export' | translate }} + {{ 'rulechain.delete' | translate }} +
+
{{ 'rulechain.set-root' | translate }} + {{ 'rulechain.set-edge-template-root-rulechain' | translate }} + {{ 'rulechain.set-auto-assign-to-edge' | translate }} + {{ 'rulechain.unset-auto-assign-to-edge' | translate }} + {{ 'rulechain.set-root' | translate }} +
From ee111c644596ddb2273d2664141183ddb162d0bc Mon Sep 17 00:00:00 2001 From: deaflynx Date: Fri, 25 Dec 2020 11:10:38 +0200 Subject: [PATCH 23/24] Alert message for missingRuleChains --- ui/src/app/api/edge.service.js | 14 +++++++++- ui/src/app/locale/locale.constant-en_US.json | 4 ++- ui/src/app/rulechain/rulechains.controller.js | 28 +++++++++++++++++-- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/ui/src/app/api/edge.service.js b/ui/src/app/api/edge.service.js index f5e43f7ef5..debd49069a 100644 --- a/ui/src/app/api/edge.service.js +++ b/ui/src/app/api/edge.service.js @@ -36,7 +36,8 @@ function EdgeService($http, $q, customerService) { makeEdgePublic: makeEdgePublic, setRootRuleChain: setRootRuleChain, getEdgeEvents: getEdgeEvents, - syncEdge: syncEdge + syncEdge: syncEdge, + findMissingToRelatedRuleChains: findMissingToRelatedRuleChains }; return service; @@ -305,4 +306,15 @@ function EdgeService($http, $q, customerService) { }); return deferred.promise; } + + function findMissingToRelatedRuleChains(edgeId) { + var deferred = $q.defer(); + var url = '/api/edge/missingToRelatedRuleChains/' + edgeId; + $http.get(url, null).then(function success(response) { + deferred.resolve(response.data); + }, function fail(response) { + deferred.reject(response.data); + }); + return deferred.promise; + } } diff --git a/ui/src/app/locale/locale.constant-en_US.json b/ui/src/app/locale/locale.constant-en_US.json index e04d152b43..56f45586c3 100644 --- a/ui/src/app/locale/locale.constant-en_US.json +++ b/ui/src/app/locale/locale.constant-en_US.json @@ -854,7 +854,9 @@ "edge-type-list-empty": "No edge types selected.", "edge-types": "Edge types", "license-key-hint": "To obtain your license please navigate to the pricing page and select the best license option for your case.", - "cloud-endpoint-hint": "Edge requires HTTP(s) access to Cloud (ThingsBoard CE/PE) to verify the license key. Please specify Cloud URL that Edge is able to connect to." + "cloud-endpoint-hint": "Edge requires HTTP(s) access to Cloud (ThingsBoard CE/PE) to verify the license key. Please specify Cloud URL that Edge is able to connect to.", + "missing-related-rule-chains-title": "Edge has missing related rule chain(s)", + "missing-related-rule-chains-text": "Assigned to edge rule chain(s) use rule nodes that forward message(s) to rule chain(s) that are not assigned to this edge.

List of missing rule chain(s):
{{missingRuleChains}}" }, "error": { "unable-to-connect": "Unable to connect to the server! Please check your internet connection.", diff --git a/ui/src/app/rulechain/rulechains.controller.js b/ui/src/app/rulechain/rulechains.controller.js index b11008cacc..4ea5d5ffd1 100644 --- a/ui/src/app/rulechain/rulechains.controller.js +++ b/ui/src/app/rulechain/rulechains.controller.js @@ -572,8 +572,32 @@ export default function RuleChainsController(ruleChainService, userService, impo fullscreen: true, targetEvent: $event }).then(function () { - vm.grid.refreshList(); - }, function () { + edgeService.findMissingToRelatedRuleChains(edgeId).then( + function success(missingRuleChains) { + if (missingRuleChains && Object.keys(missingRuleChains).length > 0) { + let formattedMissingRuleChains = []; + for (const missingRuleChain of Object.keys(missingRuleChains)) { + const arrayOfMissingRuleChains = missingRuleChains[missingRuleChain]; + const tmp = "- '" + missingRuleChain + "': '" + arrayOfMissingRuleChains.join("', ") + "'"; + formattedMissingRuleChains.push(tmp); + } + var alert = $mdDialog.alert() + .parent(angular.element($document[0].body)) + .clickOutsideToClose(true) + .title($translate.instant('edge.missing-related-rule-chains-title')) + .htmlContent($translate.instant('edge.missing-related-rule-chains-text', {missingRuleChains: formattedMissingRuleChains.join("
")})) + .ok($translate.instant('action.close')); + alert._options.fullscreen = true; + $mdDialog.show(alert).then( + function () { + vm.grid.refreshList(); + } + ); + } else { + vm.grid.refreshList(); + } + } + ); }); }, function fail() { From e5753c036076fbc73ce74d8f1bf4333491b66b20 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Tue, 29 Dec 2020 10:18:42 +0200 Subject: [PATCH 24/24] Refactored edge rule chains storage --- .../rule_chains/edge_root_rule_chain.json | 0 .../rule_chains/edge_root_rule_chain.json | 0 .../server/controller/TenantController.java | 3 ++ .../service/install/InstallScripts.java | 38 +++++++++++++------ .../install/PsqlTsDatabaseUpgradeService.java | 2 +- .../server/dao/rule/BaseRuleChainService.java | 2 +- 6 files changed, 32 insertions(+), 13 deletions(-) rename application/src/main/data/json/demo/{ => edge_management}/rule_chains/edge_root_rule_chain.json (100%) rename application/src/main/data/json/tenant/{ => edge_management}/rule_chains/edge_root_rule_chain.json (100%) diff --git a/application/src/main/data/json/demo/rule_chains/edge_root_rule_chain.json b/application/src/main/data/json/demo/edge_management/rule_chains/edge_root_rule_chain.json similarity index 100% rename from application/src/main/data/json/demo/rule_chains/edge_root_rule_chain.json rename to application/src/main/data/json/demo/edge_management/rule_chains/edge_root_rule_chain.json diff --git a/application/src/main/data/json/tenant/rule_chains/edge_root_rule_chain.json b/application/src/main/data/json/tenant/edge_management/rule_chains/edge_root_rule_chain.json similarity index 100% rename from application/src/main/data/json/tenant/rule_chains/edge_root_rule_chain.json rename to application/src/main/data/json/tenant/edge_management/rule_chains/edge_root_rule_chain.json diff --git a/application/src/main/java/org/thingsboard/server/controller/TenantController.java b/application/src/main/java/org/thingsboard/server/controller/TenantController.java index ca87e08c96..450c994a38 100644 --- a/application/src/main/java/org/thingsboard/server/controller/TenantController.java +++ b/application/src/main/java/org/thingsboard/server/controller/TenantController.java @@ -77,6 +77,9 @@ public class TenantController extends BaseController { tenant = checkNotNull(tenantService.saveTenant(tenant)); if (newTenant) { installScripts.createDefaultRuleChains(tenant.getId()); + if (edgesEnabled) { + installScripts.createDefaultEdgeRuleChains(tenant.getId()); + } } return tenant; } catch (Exception e) { diff --git a/application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java b/application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java index 27423259cd..ae5bcd13fa 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java +++ b/application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java @@ -28,7 +28,6 @@ import org.thingsboard.server.common.data.id.RuleChainId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.rule.RuleChain; import org.thingsboard.server.common.data.rule.RuleChainMetaData; -import org.thingsboard.server.common.data.rule.RuleChainType; import org.thingsboard.server.common.data.widget.WidgetType; import org.thingsboard.server.common.data.widget.WidgetsBundle; import org.thingsboard.server.dao.dashboard.DashboardService; @@ -36,7 +35,6 @@ import org.thingsboard.server.dao.rule.RuleChainService; import org.thingsboard.server.dao.widget.WidgetTypeService; import org.thingsboard.server.dao.widget.WidgetsBundleService; -import java.io.File; import java.io.IOException; import java.nio.file.DirectoryStream; import java.nio.file.Files; @@ -64,6 +62,8 @@ public class InstallScripts { public static final String WIDGET_BUNDLES_DIR = "widget_bundles"; public static final String DASHBOARDS_DIR = "dashboards"; + public static final String EDGE_MANAGEMENT = "edge_management"; + public static final String JSON_EXT = ".json"; @Value("${install.data_dir:}") @@ -81,10 +81,14 @@ public class InstallScripts { @Autowired private WidgetsBundleService widgetsBundleService; - public Path getTenantRuleChainsDir() { + private Path getTenantRuleChainsDir() { return Paths.get(getDataDir(), JSON_DIR, TENANT_DIR, RULE_CHAINS_DIR); } + private Path getEdgeRuleChainsDir() { + return Paths.get(getDataDir(), JSON_DIR, TENANT_DIR, EDGE_MANAGEMENT, RULE_CHAINS_DIR); + } + public String getDataDir() { if (!StringUtils.isEmpty(dataDir)) { if (!Paths.get(this.dataDir).toFile().isDirectory()) { @@ -108,18 +112,22 @@ public class InstallScripts { public void createDefaultRuleChains(TenantId tenantId) throws IOException { Path tenantChainsDir = getTenantRuleChainsDir(); - try (DirectoryStream dirStream = Files.newDirectoryStream(tenantChainsDir, path -> path.toString().endsWith(InstallScripts.JSON_EXT))) { + loadRuleChainsFromPath(tenantId, tenantChainsDir); + } + + public void createDefaultEdgeRuleChains(TenantId tenantId) throws IOException { + Path edgeChainsDir = getEdgeRuleChainsDir(); + loadRuleChainsFromPath(tenantId, edgeChainsDir); + } + + private void loadRuleChainsFromPath(TenantId tenantId, Path ruleChainsPath) throws IOException { + try (DirectoryStream dirStream = Files.newDirectoryStream(ruleChainsPath, path -> path.toString().endsWith(InstallScripts.JSON_EXT))) { dirStream.forEach( path -> loadRuleChainFromFile(tenantId, path) ); } } - public void createDefaultEdgeRuleChains(TenantId tenantId) { - Path tenantChainsDir = getTenantRuleChainsDir(); - loadRuleChainFromFile(tenantId, tenantChainsDir.resolve("edge_root_rule_chain.json")); - } - public void loadSystemWidgets() throws Exception { Path widgetBundlesDir = Paths.get(getDataDir(), JSON_DIR, SYSTEM_DIR, WIDGET_BUNDLES_DIR); try (DirectoryStream dirStream = Files.newDirectoryStream(widgetBundlesDir, path -> path.toString().endsWith(JSON_EXT))) { @@ -174,7 +182,6 @@ public class InstallScripts { } } - public void loadDemoRuleChains(TenantId tenantId) throws Exception { Path ruleChainsDir = Paths.get(getDataDir(), JSON_DIR, DEMO_DIR, RULE_CHAINS_DIR); try { @@ -196,8 +203,17 @@ public class InstallScripts { rootChain = ruleChainService.saveRuleChain(rootChain); rootChainMetaData.setRuleChainId(rootChain.getId()); ruleChainService.saveRuleChainMetaData(new TenantId(EntityId.NULL_UUID), rootChainMetaData); + } catch (Exception e) { + log.error("Unable to load dashboard from json", e); + throw new RuntimeException("Unable to load dashboard from json", e); + } + loadEdgeDemoRuleChains(tenantId); + } - loadRuleChainFromFile(tenantId, ruleChainsDir.resolve("edge_root_rule_chain.json")); + private void loadEdgeDemoRuleChains(TenantId tenantId) throws Exception { + Path edgeRuleChainsDir = Paths.get(getDataDir(), JSON_DIR, DEMO_DIR, EDGE_MANAGEMENT, RULE_CHAINS_DIR); + try { + loadRuleChainFromFile(tenantId, edgeRuleChainsDir.resolve("edge_root_rule_chain.json")); } catch (Exception e) { log.error("Unable to load dashboard from json", e); throw new RuntimeException("Unable to load dashboard from json", e); diff --git a/application/src/main/java/org/thingsboard/server/service/install/PsqlTsDatabaseUpgradeService.java b/application/src/main/java/org/thingsboard/server/service/install/PsqlTsDatabaseUpgradeService.java index 0bfa28e03a..8d954cb460 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/PsqlTsDatabaseUpgradeService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/PsqlTsDatabaseUpgradeService.java @@ -203,7 +203,7 @@ public class PsqlTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeSe break; case "2.5.5": try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword)) { - log.info("Load TTL functions ..."); + log.info("Load Edge TTL functions ..."); loadSql(conn, "2.6.0", LOAD_TTL_FUNCTIONS_SQL); } break; diff --git a/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java b/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java index cc832c0826..3e1e418bc2 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java @@ -91,7 +91,7 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC EntityRelation.CONTAINS_TYPE, RelationTypeGroup.RULE_CHAIN)); } catch (Exception e) { log.warn("[{}] Failed to create tenant to root rule chain relation. from: [{}], to: [{}]", - savedRuleChain.getTenantId(), savedRuleChain.getId()); + savedRuleChain.getTenantId(), savedRuleChain.getTenantId(), savedRuleChain.getId(), e); throw new RuntimeException(e); } }