Commit 9d4372dc0fbbc80cd5e3aaeaafc31e664ab143d8

Authored by deaflynx
1 parent 65b87cc8

Import edge implementation

@@ -31,6 +31,7 @@ function EdgeService($http, $q, customerService) { @@ -31,6 +31,7 @@ function EdgeService($http, $q, customerService) {
31 getCustomerEdges: getCustomerEdges, 31 getCustomerEdges: getCustomerEdges,
32 assignEdgeToCustomer: assignEdgeToCustomer, 32 assignEdgeToCustomer: assignEdgeToCustomer,
33 findByQuery: findByQuery, 33 findByQuery: findByQuery,
  34 + findByName: findByName,
34 unassignEdgeFromCustomer: unassignEdgeFromCustomer, 35 unassignEdgeFromCustomer: unassignEdgeFromCustomer,
35 makeEdgePublic: makeEdgePublic, 36 makeEdgePublic: makeEdgePublic,
36 setRootRuleChain: setRootRuleChain, 37 setRootRuleChain: setRootRuleChain,
@@ -95,10 +96,14 @@ function EdgeService($http, $q, customerService) { @@ -95,10 +96,14 @@ function EdgeService($http, $q, customerService) {
95 return deferred.promise; 96 return deferred.promise;
96 } 97 }
97 98
98 - function saveEdge(edge) { 99 + function saveEdge(edge, ignoreErrors, config) {
99 var deferred = $q.defer(); 100 var deferred = $q.defer();
100 var url = '/api/edge'; 101 var url = '/api/edge';
101 - $http.post(url, edge).then(function success(response) { 102 + if (!config) {
  103 + config = {};
  104 + }
  105 + config = Object.assign(config, { ignoreErrors: ignoreErrors });
  106 + $http.post(url, edge, config).then(function success(response) {
102 deferred.resolve(response.data); 107 deferred.resolve(response.data);
103 }, function fail(response) { 108 }, function fail(response) {
104 deferred.reject(response.data); 109 deferred.reject(response.data);
@@ -214,6 +219,18 @@ function EdgeService($http, $q, customerService) { @@ -214,6 +219,18 @@ function EdgeService($http, $q, customerService) {
214 return deferred.promise; 219 return deferred.promise;
215 } 220 }
216 221
  222 + function findByName(edgeName, config) {
  223 + config = config || {};
  224 + var deferred = $q.defer();
  225 + var url = '/api/tenant/edges?edgeName=' + edgeName;
  226 + $http.get(url, config).then(function success(response) {
  227 + deferred.resolve(response.data);
  228 + }, function fail() {
  229 + deferred.reject();
  230 + });
  231 + return deferred.promise;
  232 + }
  233 +
217 function assignEdgeToCustomer(customerId, edgeId) { 234 function assignEdgeToCustomer(customerId, edgeId) {
218 var deferred = $q.defer(); 235 var deferred = $q.defer();
219 var url = '/api/customer/' + customerId + '/edge/' + edgeId; 236 var url = '/api/customer/' + customerId + '/edge/' + edgeId;
@@ -1277,6 +1277,13 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device @@ -1277,6 +1277,13 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device
1277 }; 1277 };
1278 } 1278 }
1279 1279
  1280 + if (entityType === types.entityType.edge) {
  1281 + newEntity.edgeLicenseKey = entityParameters.edgeLicenseKey;
  1282 + newEntity.cloudEndpoint = entityParameters.cloudEndpoint;
  1283 + newEntity.routingKey = entityParameters.routingKey;
  1284 + newEntity.secret = entityParameters.secret;
  1285 + }
  1286 +
1280 let saveEntityPromise = getEntitySavePromise(entityType, newEntity, config); 1287 let saveEntityPromise = getEntitySavePromise(entityType, newEntity, config);
1281 1288
1282 saveEntityPromise.then(function success(response) { 1289 saveEntityPromise.then(function success(response) {
@@ -1301,6 +1308,9 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device @@ -1301,6 +1308,9 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device
1301 case types.entityType.asset: 1308 case types.entityType.asset:
1302 findIdEntity = assetService.findByName(entityParameters.name, config); 1309 findIdEntity = assetService.findByName(entityParameters.name, config);
1303 break; 1310 break;
  1311 + case types.entityType.edge:
  1312 + findIdEntity = edgeService.findByName(entityParameters.name, config);
  1313 + break;
1304 } 1314 }
1305 findIdEntity.then(function success(response) { 1315 findIdEntity.then(function success(response) {
1306 let promises = []; 1316 let promises = [];
@@ -1347,6 +1357,9 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device @@ -1347,6 +1357,9 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device
1347 case types.entityType.asset: 1357 case types.entityType.asset:
1348 promise = assetService.saveAsset(newEntity, true, config); 1358 promise = assetService.saveAsset(newEntity, true, config);
1349 break; 1359 break;
  1360 + case types.entityType.edge:
  1361 + promise = edgeService.saveEdge(newEntity, true, config);
  1362 + break;
1350 } 1363 }
1351 return promise; 1364 return promise;
1352 } 1365 }
@@ -465,6 +465,22 @@ export default angular.module('thingsboard.types', []) @@ -465,6 +465,22 @@ export default angular.module('thingsboard.types', [])
465 description: { 465 description: {
466 name: 'import.column-type.description', 466 name: 'import.column-type.description',
467 value: 'description' 467 value: 'description'
  468 + },
  469 + edgeLicenseKey: {
  470 + name: 'import.column-type.edgeLicenseKey',
  471 + value: 'edgeLicenseKey'
  472 + },
  473 + cloudEndpoint: {
  474 + name: 'import.column-type.cloudEndpoint',
  475 + value: 'cloudEndpoint'
  476 + },
  477 + routingKey: {
  478 + name: 'import.column-type.routingKey',
  479 + value: 'routingKey'
  480 + },
  481 + secret: {
  482 + name: 'import.column-type.secret',
  483 + value: 'secret'
468 } 484 }
469 }, 485 },
470 aliasEntityType: { 486 aliasEntityType: {
@@ -135,7 +135,11 @@ export default function ImportDialogCsvController($scope, $mdDialog, toast, impo @@ -135,7 +135,11 @@ export default function ImportDialogCsvController($scope, $mdDialog, toast, impo
135 server: [], 135 server: [],
136 shared: [] 136 shared: []
137 }, 137 },
138 - timeseries: [] 138 + timeseries: [],
  139 + edgeLicenseKey: "",
  140 + cloudEndpoint: "",
  141 + routingKey: "",
  142 + secret: ""
139 }; 143 };
140 for (var j = 0; j < parameterColumns.length; j++) { 144 for (var j = 0; j < parameterColumns.length; j++) {
141 switch (parameterColumns[j].type) { 145 switch (parameterColumns[j].type) {
@@ -175,6 +179,18 @@ export default function ImportDialogCsvController($scope, $mdDialog, toast, impo @@ -175,6 +179,18 @@ export default function ImportDialogCsvController($scope, $mdDialog, toast, impo
175 case types.importEntityColumnType.description.value: 179 case types.importEntityColumnType.description.value:
176 entityData.description = importData.rows[i][j]; 180 entityData.description = importData.rows[i][j];
177 break; 181 break;
  182 + case types.importEntityColumnType.edgeLicenseKey.value:
  183 + entityData.edgeLicenseKey = importData.rows[i][j];
  184 + break;
  185 + case types.importEntityColumnType.cloudEndpoint.value:
  186 + entityData.cloudEndpoint = importData.rows[i][j];
  187 + break;
  188 + case types.importEntityColumnType.routingKey.value:
  189 + entityData.routingKey = importData.rows[i][j];
  190 + break;
  191 + case types.importEntityColumnType.secret.value:
  192 + entityData.secret = importData.rows[i][j];
  193 + break;
178 } 194 }
179 } 195 }
180 entitiesData.push(entityData); 196 entitiesData.push(entityData);
@@ -58,6 +58,12 @@ function TableColumnsAssignmentController($scope, types, $timeout) { @@ -58,6 +58,12 @@ function TableColumnsAssignmentController($scope, types, $timeout) {
58 vm.columnTypes.serverAttribute = types.importEntityColumnType.serverAttribute; 58 vm.columnTypes.serverAttribute = types.importEntityColumnType.serverAttribute;
59 vm.columnTypes.timeseries = types.importEntityColumnType.timeseries; 59 vm.columnTypes.timeseries = types.importEntityColumnType.timeseries;
60 break; 60 break;
  61 + case types.entityType.edge:
  62 + vm.columnTypes.edgeLicenseKey = types.importEntityColumnType.edgeLicenseKey;
  63 + vm.columnTypes.cloudEndpoint = types.importEntityColumnType.cloudEndpoint;
  64 + vm.columnTypes.routingKey = types.importEntityColumnType.routingKey;
  65 + vm.columnTypes.secret = types.importEntityColumnType.secret;
  66 + break;
61 } 67 }
62 68
63 $scope.isColumnTypeDiffers = function(columnType) { 69 $scope.isColumnTypeDiffers = function(columnType) {
@@ -66,7 +72,11 @@ function TableColumnsAssignmentController($scope, types, $timeout) { @@ -66,7 +72,11 @@ function TableColumnsAssignmentController($scope, types, $timeout) {
66 columnType !== types.importEntityColumnType.label.value && 72 columnType !== types.importEntityColumnType.label.value &&
67 columnType !== types.importEntityColumnType.accessToken.value&& 73 columnType !== types.importEntityColumnType.accessToken.value&&
68 columnType !== types.importEntityColumnType.isGateway.value&& 74 columnType !== types.importEntityColumnType.isGateway.value&&
69 - columnType !== types.importEntityColumnType.description.value; 75 + columnType !== types.importEntityColumnType.description.value&&
  76 + columnType !== types.importEntityColumnType.edgeLicenseKey.value&&
  77 + columnType !== types.importEntityColumnType.cloudEndpoint.value&&
  78 + columnType !== types.importEntityColumnType.routingKey.value&&
  79 + columnType !== types.importEntityColumnType.secret.value;
70 }; 80 };
71 81
72 $scope.$watch('vm.columns', function(newVal){ 82 $scope.$watch('vm.columns', function(newVal){
@@ -77,6 +87,10 @@ function TableColumnsAssignmentController($scope, types, $timeout) { @@ -77,6 +87,10 @@ function TableColumnsAssignmentController($scope, types, $timeout) {
77 var isSelectCredentials = false; 87 var isSelectCredentials = false;
78 var isSelectGateway = false; 88 var isSelectGateway = false;
79 var isSelectDescription = false; 89 var isSelectDescription = false;
  90 + var isSelectEdgeLicenseKey = false;
  91 + var isSelectCloudEndpoint = false;
  92 + var isSelectRoutingKey = false;
  93 + var isSelectSecret = false;
80 for (var i = 0; i < newVal.length; i++) { 94 for (var i = 0; i < newVal.length; i++) {
81 switch (newVal[i].type) { 95 switch (newVal[i].type) {
82 case types.importEntityColumnType.name.value: 96 case types.importEntityColumnType.name.value:
@@ -94,6 +108,18 @@ function TableColumnsAssignmentController($scope, types, $timeout) { @@ -94,6 +108,18 @@ function TableColumnsAssignmentController($scope, types, $timeout) {
94 case types.importEntityColumnType.isGateway.value: 108 case types.importEntityColumnType.isGateway.value:
95 isSelectGateway = true; 109 isSelectGateway = true;
96 break; 110 break;
  111 + case types.importEntityColumnType.edgeLicenseKey.value:
  112 + isSelectEdgeLicenseKey = true;
  113 + break;
  114 + case types.importEntityColumnType.cloudEndpoint.value:
  115 + isSelectCloudEndpoint = true;
  116 + break;
  117 + case types.importEntityColumnType.routingKey.value:
  118 + isSelectRoutingKey = true;
  119 + break;
  120 + case types.importEntityColumnType.secret.value:
  121 + isSelectSecret = true;
  122 + break;
97 case types.importEntityColumnType.description.value: 123 case types.importEntityColumnType.description.value:
98 isSelectDescription = true; 124 isSelectDescription = true;
99 } 125 }
@@ -112,6 +138,10 @@ function TableColumnsAssignmentController($scope, types, $timeout) { @@ -112,6 +138,10 @@ function TableColumnsAssignmentController($scope, types, $timeout) {
112 if (angular.isDefined(vm.columnTypes.accessToken)) { 138 if (angular.isDefined(vm.columnTypes.accessToken)) {
113 vm.columnTypes.accessToken.disable = isSelectCredentials; 139 vm.columnTypes.accessToken.disable = isSelectCredentials;
114 } 140 }
  141 + vm.columnTypes.edgeLicenseKey.disable = isSelectEdgeLicenseKey;
  142 + vm.columnTypes.cloudEndpoint.disable = isSelectCloudEndpoint;
  143 + vm.columnTypes.routingKey.disable = isSelectRoutingKey;
  144 + vm.columnTypes.secret.disable = isSelectSecret;
115 }); 145 });
116 } 146 }
117 }, true); 147 }, true);
@@ -1404,7 +1404,11 @@ @@ -1404,7 +1404,11 @@
1404 "entity-field": "Entity field", 1404 "entity-field": "Entity field",
1405 "access-token": "Access token", 1405 "access-token": "Access token",
1406 "isgateway": "Is Gateway", 1406 "isgateway": "Is Gateway",
1407 - "description": "Description" 1407 + "description": "Description",
  1408 + "edgeLicenseKey": "Edge license key",
  1409 + "cloudEndpoint": "Cloud endpoint",
  1410 + "routingKey": "Edge routing key",
  1411 + "secret": "Edge secret"
1408 }, 1412 },
1409 "stepper-text":{ 1413 "stepper-text":{
1410 "select-file": "Select a file", 1414 "select-file": "Select a file",
@@ -41,8 +41,7 @@ function EntitiesHierarchyWidget() { @@ -41,8 +41,7 @@ function EntitiesHierarchyWidget() {
41 } 41 }
42 42
43 /*@ngInject*/ 43 /*@ngInject*/
44 -function EntitiesHierarchyWidgetController($element, $scope, $q, $timeout, toast, types, entityService, entityRelationService,  
45 - assetService, deviceService, entityViewService, dashboardService, ruleChainService /*$filter, $mdMedia, $mdPanel, $document, $translate, $timeout, utils, types*/) { 44 +function EntitiesHierarchyWidgetController($element, $scope, $q, $timeout, toast, types, entityService, entityRelationService /*$filter, $mdMedia, $mdPanel, $document, $translate, $timeout, utils, types*/) {
46 var vm = this; 45 var vm = this;
47 46
48 vm.showData = true; 47 vm.showData = true;
@@ -294,95 +293,27 @@ function EntitiesHierarchyWidgetController($element, $scope, $q, $timeout, toast @@ -294,95 +293,27 @@ function EntitiesHierarchyWidgetController($element, $scope, $q, $timeout, toast
294 }); 293 });
295 } else { 294 } else {
296 if (node.data && node.data.nodeCtx.entity && node.data.nodeCtx.entity.id && node.data.nodeCtx.entity.id.entityType !== 'function') { 295 if (node.data && node.data.nodeCtx.entity && node.data.nodeCtx.entity.id && node.data.nodeCtx.entity.id.entityType !== 'function') {
297 - if (node.data.nodeCtx.entity.id.entityType === types.entityType.edge) {  
298 - assetService.getEdgeAssets(node.data.nodeCtx.entity.id.id, {limit: 20}, null).then(  
299 - (entities) => {  
300 - var tasks = [];  
301 - for (var i=0;i<entities.data.length;i++) {  
302 - var relation = entities.data[i];  
303 - var targetId = node.data.nodeCtx.entity.id.entityType === types.entityType.edge ? relation.id : node.data.nodeCtx.entity.id;  
304 - tasks.push(entityIdToNode(targetId.entityType, targetId.id, node.data.datasource, node.data.nodeCtx));  
305 - }  
306 - $q.all(tasks).then((nodes) => {  
307 - cb(prepareNodes(nodes));  
308 - });  
309 - }  
310 - );  
311 - deviceService.getEdgeDevices(node.data.nodeCtx.entity.id.id, {limit: 20}, null).then(  
312 - (entities) => {  
313 - var tasks = [];  
314 - for (var i=0;i<entities.data.length;i++) {  
315 - var relation = entities.data[i];  
316 - var targetId = node.data.nodeCtx.entity.id.entityType === types.entityType.edge ? relation.id : node.data.nodeCtx.entity.id;  
317 - tasks.push(entityIdToNode(targetId.entityType, targetId.id, node.data.datasource, node.data.nodeCtx));  
318 - }  
319 - $q.all(tasks).then((nodes) => {  
320 - cb(prepareNodes(nodes));  
321 - });  
322 - }  
323 - );  
324 - entityViewService.getEdgeEntityViews(node.data.nodeCtx.entity.id.id, {limit: 20}, null).then(  
325 - (entities) => {  
326 - var tasks = [];  
327 - for (var i=0;i<entities.data.length;i++) {  
328 - var relation = entities.data[i];  
329 - var targetId = node.data.nodeCtx.entity.id.entityType === types.entityType.edge ? relation.id : node.data.nodeCtx.entity.id;  
330 - tasks.push(entityIdToNode(targetId.entityType, targetId.id, node.data.datasource, node.data.nodeCtx));  
331 - }  
332 - $q.all(tasks).then((nodes) => {  
333 - cb(prepareNodes(nodes));  
334 - }); 296 + var relationQuery = prepareNodeRelationQuery(node.data.nodeCtx);
  297 + entityRelationService.findByQuery(relationQuery, {ignoreErrors: true, ignoreLoading: true}).then(
  298 + (entityRelations) => {
  299 + var tasks = [];
  300 + for (var i=0;i<entityRelations.length;i++) {
  301 + var relation = entityRelations[i];
  302 + var targetId = relationQuery.parameters.direction === types.entitySearchDirection.from ? relation.to : relation.from;
  303 + tasks.push(entityIdToNode(targetId.entityType, targetId.id, node.data.datasource, node.data.nodeCtx));
335 } 304 }
336 - );  
337 - dashboardService.getEdgeDashboards(node.data.nodeCtx.entity.id.id, {limit: 20}, null).then(  
338 - (entities) => {  
339 - var tasks = [];  
340 - for (var i=0;i<entities.data.length;i++) {  
341 - var relation = entities.data[i];  
342 - var targetId = node.data.nodeCtx.entity.id.entityType === types.entityType.edge ? relation.id : node.data.nodeCtx.entity.id;  
343 - tasks.push(entityIdToNode(targetId.entityType, targetId.id, node.data.datasource, node.data.nodeCtx));  
344 - }  
345 - $q.all(tasks).then((nodes) => {  
346 - cb(prepareNodes(nodes));  
347 - }); 305 + $q.all(tasks).then((nodes) => {
  306 + cb(prepareNodes(nodes));
  307 + });
  308 + },
  309 + (error) => {
  310 + var errorText = "Failed to get relations!";
  311 + if (error && error.status === 400) {
  312 + errorText = "Invalid relations query returned by 'Node relations query function'! Please check widget configuration!";
348 } 313 }
349 - )  
350 - ruleChainService.getEdgeRuleChains(node.data.nodeCtx.entity.id.id, {limit: 20}, null).then(  
351 - (entities) => {  
352 - var tasks = [];  
353 - for (var i=0;i<entities.data.length;i++) {  
354 - var relation = entities.data[i];  
355 - var targetId = node.data.nodeCtx.entity.id.entityType === types.entityType.edge ? relation.id : node.data.nodeCtx.entity.id;  
356 - tasks.push(entityIdToNode(targetId.entityType, targetId.id, node.data.datasource, node.data.nodeCtx));  
357 - }  
358 - $q.all(tasks).then((nodes) => {  
359 - cb(prepareNodes(nodes));  
360 - });  
361 - }  
362 - )  
363 - } else {  
364 - var relationQuery = prepareNodeRelationQuery(node.data.nodeCtx);  
365 - entityRelationService.findByQuery(relationQuery, {ignoreErrors: true, ignoreLoading: true}).then(  
366 - (entityRelations) => {  
367 - var tasks = [];  
368 - for (var i=0;i<entityRelations.length;i++) {  
369 - var relation = entityRelations[i];  
370 - var targetId = relationQuery.parameters.direction === types.entitySearchDirection.from ? relation.to : relation.from;  
371 - tasks.push(entityIdToNode(targetId.entityType, targetId.id, node.data.datasource, node.data.nodeCtx));  
372 - }  
373 - $q.all(tasks).then((nodes) => {  
374 - cb(prepareNodes(nodes));  
375 - });  
376 - },  
377 - (error) => {  
378 - var errorText = "Failed to get relations!";  
379 - if (error && error.status === 400) {  
380 - errorText = "Invalid relations query returned by 'Node relations query function'! Please check widget configuration!";  
381 - }  
382 - showError(errorText);  
383 - }  
384 - );  
385 - } 314 + showError(errorText);
  315 + }
  316 + );
386 } else { 317 } else {
387 cb([]); 318 cb([]);
388 } 319 }
@@ -580,9 +511,6 @@ function EntitiesHierarchyWidgetController($element, $scope, $q, $timeout, toast @@ -580,9 +511,6 @@ function EntitiesHierarchyWidgetController($element, $scope, $q, $timeout, toast
580 case types.entityType.edge: 511 case types.entityType.edge:
581 materialIcon = 'router'; 512 materialIcon = 'router';
582 break; 513 break;
583 - case types.entityType.rulechain:  
584 - materialIcon = 'settings_ethernet';  
585 - break;  
586 } 514 }
587 } 515 }
588 return { 516 return {