diff --git a/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java b/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java index 78caa4a626..3f4dcb3c0b 100644 --- a/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java +++ b/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java @@ -66,6 +66,7 @@ import org.thingsboard.server.dao.user.UserService; import org.thingsboard.server.queue.discovery.PartitionService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.service.component.ComponentDiscoveryService; +import org.thingsboard.server.service.edge.rpc.EdgeRpcService; import org.thingsboard.server.service.encoding.DataDecodingEncodingService; import org.thingsboard.server.service.executors.DbCallbackExecutorService; import org.thingsboard.server.service.executors.ExternalCallExecutorService; @@ -254,15 +255,14 @@ public class ActorSystemContext { @Getter private TbCoreDeviceRpcService tbCoreDeviceRpcService; - @Lazy - @Autowired - @Getter - private EdgeService edgeService; + @Autowired(required = false) + @Getter private EdgeService edgeService; - @Lazy - @Autowired - @Getter - private EdgeEventService edgeEventService; + @Autowired(required = false) + @Getter private EdgeEventService edgeEventService; + + @Autowired(required = false) + @Getter private EdgeRpcService edgeRpcService; @Value("${actors.session.max_concurrent_sessions_per_device:1}") @Getter diff --git a/application/src/main/java/org/thingsboard/server/actors/tenant/TenantActor.java b/application/src/main/java/org/thingsboard/server/actors/tenant/TenantActor.java index 7ce5fb3206..fde6f688c5 100644 --- a/application/src/main/java/org/thingsboard/server/actors/tenant/TenantActor.java +++ b/application/src/main/java/org/thingsboard/server/actors/tenant/TenantActor.java @@ -31,10 +31,13 @@ import org.thingsboard.server.actors.service.ContextBasedCreator; import org.thingsboard.server.actors.service.DefaultActorService; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.Tenant; +import org.thingsboard.server.common.data.edge.Edge; import org.thingsboard.server.common.data.id.DeviceId; +import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.RuleChainId; import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; import org.thingsboard.server.common.data.rule.RuleChain; import org.thingsboard.server.common.data.rule.RuleChainType; import org.thingsboard.server.common.msg.MsgType; @@ -47,6 +50,7 @@ import org.thingsboard.server.common.msg.queue.PartitionChangeMsg; import org.thingsboard.server.common.msg.queue.QueueToRuleEngineMsg; import org.thingsboard.server.common.msg.queue.RuleEngineException; import org.thingsboard.server.common.msg.queue.ServiceType; +import org.thingsboard.server.service.edge.rpc.EdgeRpcService; import java.util.List; import java.util.Optional; @@ -202,7 +206,18 @@ public class TenantActor extends RuleChainManagerActor { } private void onComponentLifecycleMsg(ComponentLifecycleMsg msg) { - if (isRuleEngineForCurrentTenant) { + if (msg.getEntityId().getEntityType() == EntityType.EDGE) { + EdgeId edgeId = new EdgeId(msg.getEntityId().getId()); + EdgeRpcService edgeRpcService = systemContext.getEdgeRpcService(); + if (msg.getEvent() == ComponentLifecycleEvent.DELETED) { + edgeRpcService.deleteEdge(edgeId); + } else { + Edge edge = systemContext.getEdgeService().findEdgeById(tenantId, edgeId); + if (msg.getEvent() == ComponentLifecycleEvent.UPDATED) { + edgeRpcService.updateEdge(edge); + } + } + } else if (isRuleEngineForCurrentTenant) { TbActorRef target = getEntityActorRef(msg.getEntityId()); if (target != null) { if (msg.getEntityId().getEntityType() == EntityType.RULE_CHAIN) { diff --git a/application/src/main/java/org/thingsboard/server/controller/EdgeController.java b/application/src/main/java/org/thingsboard/server/controller/EdgeController.java index b6f2c31561..3c17176b88 100644 --- a/application/src/main/java/org/thingsboard/server/controller/EdgeController.java +++ b/application/src/main/java/org/thingsboard/server/controller/EdgeController.java @@ -40,6 +40,7 @@ import org.thingsboard.server.common.data.id.RuleChainId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.page.TextPageData; import org.thingsboard.server.common.data.page.TextPageLink; +import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; import org.thingsboard.server.common.data.rule.RuleChain; import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.IncorrectParameterException; @@ -101,6 +102,9 @@ public class EdgeController extends BaseController { edgeService.assignDefaultRuleChainsToEdge(tenantId, savedEdge.getId()); } + tbClusterService.onEntityStateChange(savedEdge.getTenantId(), savedEdge.getId(), + created ? ComponentLifecycleEvent.CREATED : ComponentLifecycleEvent.UPDATED); + logEntityAction(savedEdge.getId(), savedEdge, null, created ? ActionType.ADDED : ActionType.UPDATED, null); return savedEdge; } catch (Exception e) { @@ -120,6 +124,9 @@ public class EdgeController extends BaseController { Edge edge = checkEdgeId(edgeId, Operation.DELETE); edgeService.deleteEdge(getTenantId(), edgeId); + tbClusterService.onEntityStateChange(getTenantId(), edgeId, + ComponentLifecycleEvent.DELETED); + logEntityAction(edgeId, edge, null, ActionType.DELETED, null, strEdgeId); @@ -284,6 +291,8 @@ public class EdgeController extends BaseController { Edge updatedEdge = edgeNotificationService.setEdgeRootRuleChain(getTenantId(), edge, ruleChainId); + tbClusterService.onEntityStateChange(updatedEdge.getTenantId(), updatedEdge.getId(), ComponentLifecycleEvent.UPDATED); + logEntityAction(updatedEdge.getId(), updatedEdge, null, ActionType.UPDATED, null); return updatedEdge; diff --git a/application/src/main/java/org/thingsboard/server/controller/EdgeEventController.java b/application/src/main/java/org/thingsboard/server/controller/EdgeEventController.java index 097b8d0f5c..15578b8593 100644 --- a/application/src/main/java/org/thingsboard/server/controller/EdgeEventController.java +++ b/application/src/main/java/org/thingsboard/server/controller/EdgeEventController.java @@ -61,7 +61,7 @@ public class EdgeEventController extends BaseController { EdgeId edgeId = new EdgeId(toUUID(strEdgeId)); checkEdgeId(edgeId, Operation.READ); TimePageLink pageLink = createPageLink(limit, startTime, endTime, ascOrder, offset); - return checkNotNull(edgeEventService.findEdgeEvents(tenantId, edgeId, pageLink)); + return checkNotNull(edgeEventService.findEdgeEvents(tenantId, edgeId, pageLink, false)); } catch (Exception e) { throw handleException(e); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/DefaultEdgeNotificationService.java b/application/src/main/java/org/thingsboard/server/service/edge/DefaultEdgeNotificationService.java index c2a9cc223e..0304205008 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/DefaultEdgeNotificationService.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/DefaultEdgeNotificationService.java @@ -111,7 +111,7 @@ public class DefaultEdgeNotificationService implements EdgeNotificationService { @Override public TimePageData findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink) { - return edgeEventService.findEdgeEvents(tenantId, edgeId, pageLink); + return edgeEventService.findEdgeEvents(tenantId, edgeId, pageLink, true); } @Override diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcService.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcService.java index 3792fbdf73..8e2990c75f 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcService.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcService.java @@ -27,6 +27,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Service; import org.thingsboard.server.common.data.DataConstants; +import org.thingsboard.server.common.data.edge.Edge; import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.kv.BasicTsKvEntry; @@ -52,7 +53,7 @@ import java.util.concurrent.Executors; @Service @Slf4j @ConditionalOnProperty(prefix = "edges.rpc", value = "enabled", havingValue = "true") -public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase { +public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase implements EdgeRpcService { private final Map sessions = new ConcurrentHashMap<>(); private static final ObjectMapper mapper = new ObjectMapper(); @@ -117,6 +118,23 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase { return new EdgeGrpcSession(ctx, outputStream, this::onEdgeConnect, this::onEdgeDisconnect, mapper).getInputStream(); } + @Override + public void updateEdge(Edge edge) { + EdgeGrpcSession session = sessions.get(edge.getId()); + if (session != null && session.isConnected()) { + session.onConfigurationUpdate(edge); + } + } + + @Override + public void deleteEdge(EdgeId edgeId) { + EdgeGrpcSession session = sessions.get(edgeId); + if (session != null && session.isConnected()) { + session.close(); + sessions.remove(edgeId); + } + } + private void onEdgeConnect(EdgeId edgeId, EdgeGrpcSession edgeGrpcSession) { sessions.put(edgeId, edgeGrpcSession); save(edgeId, DefaultDeviceStateService.ACTIVITY_STATE, true); diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java index ec3633a7c4..8f49b4dead 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 @@ -198,6 +198,20 @@ public final class EdgeGrpcSession implements Closeable { }; } + void onConfigurationUpdate(Edge edge) { + try { + this.edge = edge; + // TODO: voba - push edge configuration update to edge +// outputStream.onNext(org.thingsboard.server.gen.integration.ResponseMsg.newBuilder() +// .setIntegrationUpdateMsg(IntegrationUpdateMsg.newBuilder() +// .setConfiguration(constructIntegrationConfigProto(configuration, defaultConverterProto, downLinkConverterProto)) +// .build()) +// .build()); + } catch (Exception e) { + log.error("Failed to construct proto objects!", e); + } + } + void processHandleMessages() throws ExecutionException, InterruptedException { Long queueStartTs = getQueueStartTs().get(); TimePageLink pageLink = new TimePageLink(ctx.getEdgeEventStorageSettings().getMaxReadRecordsCount(), queueStartTs, null, true); diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeRpcService.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeRpcService.java new file mode 100644 index 0000000000..2355a2e49a --- /dev/null +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeRpcService.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2020 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.service.edge.rpc; + +import org.thingsboard.server.common.data.edge.Edge; +import org.thingsboard.server.common.data.id.EdgeId; + +public interface EdgeRpcService { + + void updateEdge(Edge edge); + + void deleteEdge(EdgeId edgeId); +} diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeEventService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeEventService.java index 0d65c134f2..1c65c34a08 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeEventService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeEventService.java @@ -16,9 +16,7 @@ package org.thingsboard.server.dao.edge; import com.google.common.util.concurrent.ListenableFuture; -import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.edge.EdgeEvent; -import org.thingsboard.server.common.data.edge.EdgeEventType; import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.page.TimePageData; @@ -28,6 +26,5 @@ public interface EdgeEventService { ListenableFuture saveAsync(EdgeEvent edgeEvent); - TimePageData findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink); - + TimePageData findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink, boolean withTsUpdate); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/edge/BaseEdgeEventService.java b/dao/src/main/java/org/thingsboard/server/dao/edge/BaseEdgeEventService.java index 75bc3046c4..08e5d2570f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/edge/BaseEdgeEventService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/edge/BaseEdgeEventService.java @@ -35,7 +35,7 @@ import java.util.List; public class BaseEdgeEventService implements EdgeEventService { @Autowired - public EdgeEventDao edgeEventDao; + private EdgeEventDao edgeEventDao; @Override public ListenableFuture saveAsync(EdgeEvent edgeEvent) { @@ -44,8 +44,8 @@ public class BaseEdgeEventService implements EdgeEventService { } @Override - public TimePageData findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink) { - List events = edgeEventDao.findEdgeEvents(tenantId.getId(), edgeId, pageLink); + public TimePageData findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink, boolean withTsUpdate) { + List events = edgeEventDao.findEdgeEvents(tenantId.getId(), edgeId, pageLink, withTsUpdate); return new TimePageData<>(events, pageLink); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/edge/CassandraEdgeEventDao.java b/dao/src/main/java/org/thingsboard/server/dao/edge/CassandraEdgeEventDao.java index 8483197f1b..e127abad39 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/edge/CassandraEdgeEventDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/edge/CassandraEdgeEventDao.java @@ -53,7 +53,7 @@ public class CassandraEdgeEventDao extends CassandraAbstractSearchTimeDao findEdgeEvents(UUID tenantId, EdgeId edgeId, TimePageLink pageLink) { + public List findEdgeEvents(UUID tenantId, EdgeId edgeId, TimePageLink pageLink, boolean withTsUpdate) { return null; } } diff --git a/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeEventDao.java b/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeEventDao.java index 426bada645..bf7b263e44 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeEventDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/edge/EdgeEventDao.java @@ -46,6 +46,6 @@ public interface EdgeEventDao extends Dao { * @param pageLink the pageLink * @return the event list */ - List findEdgeEvents(UUID tenantId, EdgeId edgeId, TimePageLink pageLink); + List findEdgeEvents(UUID tenantId, EdgeId edgeId, TimePageLink pageLink, boolean withTsUpdate); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaBaseEdgeEventDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaBaseEdgeEventDao.java index 11a4a1dc64..4408b8ebae 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaBaseEdgeEventDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaBaseEdgeEventDao.java @@ -26,6 +26,7 @@ import org.springframework.data.jpa.domain.Specification; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.UUIDConverter; +import org.thingsboard.server.common.data.audit.ActionType; import org.thingsboard.server.common.data.edge.EdgeEvent; import org.thingsboard.server.common.data.id.EdgeEventId; import org.thingsboard.server.common.data.id.EdgeId; @@ -75,9 +76,9 @@ public class JpaBaseEdgeEventDao extends JpaAbstractSearchTimeDao findEdgeEvents(UUID tenantId, EdgeId edgeId, TimePageLink pageLink) { + public List findEdgeEvents(UUID tenantId, EdgeId edgeId, TimePageLink pageLink, boolean withTsUpdate) { Specification timeSearchSpec = JpaAbstractSearchTimeDao.getTimeSearchPageSpec(pageLink, "id"); - Specification fieldsSpec = getEntityFieldsSpec(tenantId, edgeId); + Specification fieldsSpec = getEntityFieldsSpec(tenantId, edgeId, withTsUpdate); Sort.Direction sortDirection = pageLink.isAscOrder() ? Sort.Direction.ASC : Sort.Direction.DESC; Pageable pageable = PageRequest.of(0, pageLink.getLimit(), sortDirection, ID_PROPERTY); return DaoUtil.convertDataList(edgeEventRepository.findAll(Specification.where(timeSearchSpec).and(fieldsSpec), pageable).getContent()); @@ -95,7 +96,7 @@ public class JpaBaseEdgeEventDao extends JpaAbstractSearchTimeDao getEntityFieldsSpec(UUID tenantId, EdgeId edgeId) { + private Specification getEntityFieldsSpec(UUID tenantId, EdgeId edgeId, boolean withTsUpdate) { return (root, criteriaQuery, criteriaBuilder) -> { List predicates = new ArrayList<>(); if (tenantId != null) { @@ -106,6 +107,10 @@ public class JpaBaseEdgeEventDao extends JpaAbstractSearchTimeDao edgeEvents = edgeEventService.findEdgeEvents(tenantId, edgeId, new TimePageLink(2, startTime, endTime, false)); + TimePageData edgeEvents = edgeEventService.findEdgeEvents(tenantId, edgeId, new TimePageLink(2, startTime, endTime, false), true); Assert.assertNotNull(edgeEvents.getData()); Assert.assertTrue(edgeEvents.getData().size() == 2); @@ -91,7 +92,7 @@ public abstract class BaseEdgeEventServiceTest extends AbstractServiceTest { Assert.assertTrue(edgeEvents.hasNext()); Assert.assertNotNull(edgeEvents.getNextPageLink()); - edgeEvents = edgeEventService.findEdgeEvents(tenantId, edgeId, edgeEvents.getNextPageLink()); + edgeEvents = edgeEventService.findEdgeEvents(tenantId, edgeId, edgeEvents.getNextPageLink(), true); Assert.assertNotNull(edgeEvents.getData()); Assert.assertTrue(edgeEvents.getData().size() == 1); @@ -100,6 +101,26 @@ public abstract class BaseEdgeEventServiceTest extends AbstractServiceTest { Assert.assertNull(edgeEvents.getNextPageLink()); } + @Test + public void findEdgeEventsWithTsUpdateAndWithout() throws Exception { + EdgeId edgeId = new EdgeId(UUIDs.timeBased()); + DeviceId deviceId = new DeviceId(UUIDs.timeBased()); + TenantId tenantId = new TenantId(UUIDs.timeBased()); + TimePageLink pageLink = new TimePageLink(1); + + EdgeEvent edgeEventWithTsUpdate = generateEdgeEvent(tenantId, edgeId, deviceId, ActionType.TIMESERIES_UPDATED.name()); + edgeEventService.saveAsync(edgeEventWithTsUpdate); + + TimePageData allEdgeEvents = edgeEventService.findEdgeEvents(tenantId, edgeId, pageLink, true); + TimePageData edgeEventsWithoutTsUpdate = edgeEventService.findEdgeEvents(tenantId, edgeId, pageLink, false); + + Assert.assertNotNull(allEdgeEvents.getData()); + Assert.assertNotNull(edgeEventsWithoutTsUpdate.getData()); + Assert.assertEquals(1, allEdgeEvents.getData().size()); + Assert.assertEquals(allEdgeEvents.getData().get(0).getUuidId(), edgeEventWithTsUpdate.getUuidId()); + Assert.assertTrue(edgeEventsWithoutTsUpdate.getData().isEmpty()); + } + private EdgeEvent saveEdgeEventWithProvidedTime(long time, EdgeId edgeId, EntityId entityId, TenantId tenantId) throws Exception { EdgeEvent edgeEvent = generateEdgeEvent(tenantId, edgeId, entityId, DataConstants.ENTITY_CREATED); edgeEvent.setId(new EdgeEventId(UUIDs.startOf(time))); diff --git a/ui/src/app/api/edge.service.js b/ui/src/app/api/edge.service.js index 858dff3d18..7814e1d826 100644 --- a/ui/src/app/api/edge.service.js +++ b/ui/src/app/api/edge.service.js @@ -56,7 +56,7 @@ function EdgeService($http, $q, customerService) { deferred.reject(); }); return deferred.promise; - } // TODO: deaflynx: check usage in UI + } function getEdgesByIds(edgeIds, config) { var deferred = $q.defer(); diff --git a/ui/src/app/common/types.constant.js b/ui/src/app/common/types.constant.js index 7b37ada832..59f1111ab4 100644 --- a/ui/src/app/common/types.constant.js +++ b/ui/src/app/common/types.constant.js @@ -389,6 +389,25 @@ export default angular.module('thingsboard.types', []) customer: "CUSTOMER", relation: "RELATION" }, + edgeEventAction: { + updated: "UPDATED", + added: "ADDED", + assignedToEdge: "ASSIGNED_TO_EDGE", + deleted: "DELETED", + unassignedFromEdge: "UNASSIGNED_FROM_EDGE", + alarmAck: "ALARM_ACK", + alarmClear: "ALARM_CLEAR", + credentialsUpdated: "CREDENTIALS_UPDATED", + attributesUpdated: "ATTRIBUTES_UPDATED", + attributesDeleted: "ATTRIBUTES_DELETED", + timeseriesUpdated: "TIMESERIES_UPDATED" + }, + edgeAttributeKeys: { + active: "active", + lastConnectTime: "lastConnectTime", + lastDisconnectTime: "lastDisconnectTime", + queueStartTs: "queueStartTs" + }, importEntityColumnType: { name: { name: 'import.column-type.name', diff --git a/ui/src/app/edge/edge-fieldset.tpl.html b/ui/src/app/edge/edge-fieldset.tpl.html index b54e1cb651..c151c03f10 100644 --- a/ui/src/app/edge/edge-fieldset.tpl.html +++ b/ui/src/app/edge/edge-fieldset.tpl.html @@ -21,6 +21,21 @@ {{ isPublic ? 'edge.make-private' : 'edge.unassign-from-customer' | translate }} +{{ 'edge.manage-edge-assets' | translate }} +{{ 'edge.manage-edge-devices' | translate }} +{{ 'edge.manage-edge-entity-views' | translate }} +{{ 'edge.manage-edge-dashboards' | translate }} +{{ 'edge.manage-edge-rulechains' | translate }} {{ 'edge.delete' | translate }} diff --git a/ui/src/app/edge/edge.controller.js b/ui/src/app/edge/edge.controller.js index 51269ea753..7e57fce6a6 100644 --- a/ui/src/app/edge/edge.controller.js +++ b/ui/src/app/edge/edge.controller.js @@ -129,6 +129,11 @@ export function EdgeController($rootScope, userService, edgeService, customerSer vm.assignToCustomer = assignToCustomer; vm.makePublic = makePublic; vm.unassignFromCustomer = unassignFromCustomer; + vm.openEdgeAssets = openEdgeAssets; + vm.openEdgeDevices = openEdgeDevices; + vm.openEdgeEntityViews = openEdgeEntityViews; + vm.openEdgeDashboards = openEdgeDashboards; + vm.openEdgeRuleChains = openEdgeRuleChains; initController(); diff --git a/ui/src/app/edge/edge.directive.js b/ui/src/app/edge/edge.directive.js index 0cbe32f79e..d96dfa4b4d 100644 --- a/ui/src/app/edge/edge.directive.js +++ b/ui/src/app/edge/edge.directive.js @@ -96,6 +96,11 @@ export default function EdgeDirective($compile, $templateCache, $translate, $mdD onAssignToCustomer: '&', onMakePublic: '&', onUnassignFromCustomer: '&', + onManageEdgeAssets: '&', + onManageEdgeDevices: '&', + onManageEdgeEntityViews: '&', + onManageEdgeDashboards: '&', + onManageEdgeRuleChains: '&', onDeleteEdge: '&' } }; diff --git a/ui/src/app/edge/edges.tpl.html b/ui/src/app/edge/edges.tpl.html index 4fc3f5d75e..2600413255 100644 --- a/ui/src/app/edge/edges.tpl.html +++ b/ui/src/app/edge/edges.tpl.html @@ -29,6 +29,11 @@ on-assign-to-customer="vm.assignToCustomer(event, [ vm.grid.detailsConfig.currentItem.id.id ])" on-make-public="vm.makePublic(event, vm.grid.detailsConfig.currentItem)" on-unassign-from-customer="vm.unassignFromCustomer(event, vm.grid.detailsConfig.currentItem, isPublic)" + on-manage-edge-assets="vm.openEdgeAssets(event, vm.grid.detailsConfig.currentItem)" + on-manage-edge-devices="vm.openEdgeDevices(event, vm.grid.detailsConfig.currentItem)" + on-manage-edge-entity-views="vm.openEdgeEntityViews(event, vm.grid.detailsConfig.currentItem)" + on-manage-edge-dashboards="vm.openEdgeDashboards(event, vm.grid.detailsConfig.currentItem)" + on-manage-edge-rule-chains="vm.openEdgeRuleChains(event, vm.grid.detailsConfig.currentItem)" on-delete-edge="vm.grid.deleteItem(event, vm.grid.detailsConfig.currentItem)"> diff --git a/ui/src/app/event/event-header-edge-event.tpl.html b/ui/src/app/event/event-header-edge-event.tpl.html index f0d2daa53b..e84922f6a5 100644 --- a/ui/src/app/event/event-header-edge-event.tpl.html +++ b/ui/src/app/event/event-header-edge-event.tpl.html @@ -17,6 +17,7 @@ -->
event.event-time
event.event-type
-
edge.event-action
-
edge.entity-id
-
edge.entity-info
+
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 5c3a7a8576..d47ca55b81 100644 --- a/ui/src/app/event/event-row-edge-event.tpl.html +++ b/ui/src/app/event/event-row-edge-event.tpl.html @@ -15,11 +15,12 @@ limitations under the License. --> -
{{event.createdTime | date : 'yyyy-MM-dd HH:mm:ss'}}
-
{{event.edgeEventType}}
-
{{event.edgeEventAction}}
-
{{event.entityId}}
-
+
{{ event.createdTime | date : 'yyyy-MM-dd HH:mm:ss' }}
+
{{ event.edgeEventType }}
+
{{ event.edgeEventAction }}
+
{{ event.entityId }}
+
{{ updateStatus(event.createdTime) | translate }}
+
@@ -33,3 +34,4 @@
+ diff --git a/ui/src/app/event/event-row.directive.js b/ui/src/app/event/event-row.directive.js index 0ba533d5f1..92da9c06b9 100644 --- a/ui/src/app/event/event-row.directive.js +++ b/ui/src/app/event/event-row.directive.js @@ -102,37 +102,45 @@ export default function EventRowDirective($compile, $templateCache, $mdDialog, $ switch(scope.event.edgeEventType) { case types.edgeEventType.relation: content = angular.toJson(scope.event.entityBody); + showDialog(); break; case types.edgeEventType.ruleChainMetaData: - content = ruleChainService.getRuleChainMetaData(scope.event.entityId, {}).then( + content = ruleChainService.getRuleChainMetaData(scope.event.entityId, {ignoreErrors: true}).then( function success(info) { + showDialog(); return angular.toJson(info); }, function fail() { - toast.showError($translate.instant('edge.load-entity-error')); + showError(); }); break; default: - content = entityService.getEntity(scope.event.edgeEventType, scope.event.entityId, {}).then( + content = entityService.getEntity(scope.event.edgeEventType, scope.event.entityId, {ignoreErrors: true}).then( function success(info) { + showDialog(); return angular.toJson(info); }, function fail() { - toast.showError($translate.instant('edge.load-entity-error')); + showError(); }); break; } - $mdDialog.show({ - controller: 'EventContentDialogController', - controllerAs: 'vm', - templateUrl: eventErrorDialogTemplate, - locals: {content: content, title: title, contentType: contentType, showingCallback: onShowingCallback}, - parent: angular.element($document[0].body), - fullscreen: true, - targetEvent: $event, - multiple: true, - onShowing: function(scope, element) { - onShowingCallback.onShowing(scope, element); - } - }); + function showDialog() { + $mdDialog.show({ + controller: 'EventContentDialogController', + controllerAs: 'vm', + templateUrl: eventErrorDialogTemplate, + locals: {content: content, title: title, contentType: contentType, showingCallback: onShowingCallback}, + parent: angular.element($document[0].body), + fullscreen: true, + targetEvent: $event, + multiple: true, + onShowing: function(scope, element) { + onShowingCallback.onShowing(scope, element); + } + }); + } + function showError() { + toast.showError($translate.instant('edge.load-entity-error')); + } } scope.checkTooltip = function($event) { @@ -144,6 +152,20 @@ export default function EventRowDirective($compile, $templateCache, $mdDialog, $ } $compile(element.contents())(scope); + + scope.updateStatus = function(eventCreatedTime) { + if (scope.queueStartTs) { + var status; + if (eventCreatedTime < scope.queueStartTs) { + status = $translate.instant('edge.success'); + scope.isPending = false; + } else { + status = $translate.instant('edge.failed'); + scope.isPending = true; + } + return status; + } + } } return { diff --git a/ui/src/app/event/event-table.directive.js b/ui/src/app/event/event-table.directive.js index 4e8ae226b7..9c7c57d5d7 100644 --- a/ui/src/app/event/event-table.directive.js +++ b/ui/src/app/event/event-table.directive.js @@ -22,7 +22,8 @@ import eventTableTemplate from './event-table.tpl.html'; /* eslint-enable import/no-unresolved, import/default */ /*@ngInject*/ -export default function EventTableDirective($compile, $templateCache, $rootScope, types, eventService, edgeService) { +export default function EventTableDirective($compile, $templateCache, $rootScope, types, + eventService, edgeService, attributeService) { var linker = function (scope, element, attrs) { @@ -30,11 +31,16 @@ export default function EventTableDirective($compile, $templateCache, $rootScope element.html(template); + scope.eventTypeScope = angular.copy(types.eventType); + if (scope.entityType !== types.entityType.edge) { + delete scope.eventTypeScope.edgeEvent; + } + if (attrs.disabledEventTypes) { var disabledEventTypes = attrs.disabledEventTypes.split(','); scope.eventTypes = {}; - for (var type in types.eventType) { - var eventType = types.eventType[type]; + for (var type in scope.eventTypeScope) { + var eventType = scope.eventTypeScope[type]; var enabled = true; for (var i=0;i