From e05e681bd9f68923eecae73d2c299fce3fe615f9 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Fri, 30 Jul 2021 18:22:19 +0300 Subject: [PATCH 01/13] Properly hanlde null values in proto classes --- .../service/edge/rpc/EdgeProtoUtils.java | 60 +++++++++++++ .../rpc/constructor/AssetMsgConstructor.java | 15 ++-- .../constructor/CustomerMsgConstructor.java | 38 +++----- .../constructor/DashboardMsgConstructor.java | 6 +- .../rpc/constructor/DeviceMsgConstructor.java | 23 +++-- .../DeviceProfileMsgConstructor.java | 17 ++-- .../constructor/EntityViewMsgConstructor.java | 11 +-- .../constructor/RelationMsgConstructor.java | 4 +- .../constructor/RuleChainMsgConstructor.java | 6 +- .../rpc/constructor/UserMsgConstructor.java | 24 ++--- .../constructor/WidgetTypeMsgConstructor.java | 26 +++--- .../WidgetsBundleMsgConstructor.java | 7 +- .../rpc/processor/DeviceEdgeProcessor.java | 26 ++++-- .../rpc/processor/RelationEdgeProcessor.java | 4 +- .../thingsboard/server/edge/BaseEdgeTest.java | 6 +- common/edge-api/src/main/proto/edge.proto | 89 ++++++++++--------- 16 files changed, 207 insertions(+), 155 deletions(-) create mode 100644 application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeProtoUtils.java diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeProtoUtils.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeProtoUtils.java new file mode 100644 index 0000000000..4e9e5f59aa --- /dev/null +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeProtoUtils.java @@ -0,0 +1,60 @@ +/** + * Copyright © 2016-2021 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 com.google.protobuf.BoolValue; +import com.google.protobuf.ByteString; +import com.google.protobuf.BytesValue; +import com.google.protobuf.Int64Value; +import com.google.protobuf.StringValue; + +public class EdgeProtoUtils { + + private EdgeProtoUtils() { + } + + public static BoolValue getBoolValue(Boolean value) { + BoolValue.Builder builder = BoolValue.newBuilder(); + if (value != null) { + builder.setValue(value); + } + return builder.build(); + } + + public static StringValue getStringValue(String value) { + StringValue.Builder builder = StringValue.newBuilder(); + if (value != null) { + builder.setValue(value); + } + return builder.build(); + } + + public static Int64Value getInt64Value(Long value) { + Int64Value.Builder builder = Int64Value.newBuilder(); + if (value != null) { + builder.setValue(value); + } + return builder.build(); + } + + public static BytesValue getBytesValue(ByteString value) { + BytesValue.Builder builder = BytesValue.newBuilder(); + if (value != null) { + builder.setValue(value); + } + return builder.build(); + } +} diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/AssetMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/AssetMsgConstructor.java index a835660dae..60e532e2d0 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/AssetMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/AssetMsgConstructor.java @@ -24,6 +24,9 @@ import org.thingsboard.server.gen.edge.v1.AssetUpdateMsg; import org.thingsboard.server.gen.edge.v1.UpdateMsgType; import org.thingsboard.server.queue.util.TbCoreComponent; +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getInt64Value; +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getStringValue; + @Component @TbCoreComponent public class AssetMsgConstructor { @@ -35,16 +38,12 @@ public class AssetMsgConstructor { .setIdLSB(asset.getId().getId().getLeastSignificantBits()) .setName(asset.getName()) .setType(asset.getType()); - if (asset.getLabel() != null) { - builder.setLabel(asset.getLabel()); - } + builder.setLabel(getStringValue(asset.getLabel())); if (customerId != null) { - builder.setCustomerIdMSB(customerId.getId().getMostSignificantBits()); - builder.setCustomerIdLSB(customerId.getId().getLeastSignificantBits()); - } - if (asset.getAdditionalInfo() != null) { - builder.setAdditionalInfo(JacksonUtil.toString(asset.getAdditionalInfo())); + builder.setCustomerIdMSB(getInt64Value(customerId.getId().getMostSignificantBits())); + builder.setCustomerIdLSB(getInt64Value(customerId.getId().getLeastSignificantBits())); } + builder.setAdditionalInfo(getStringValue(JacksonUtil.toString(asset.getAdditionalInfo()))); return builder.build(); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/CustomerMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/CustomerMsgConstructor.java index c5161a674b..314ac1bda8 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/CustomerMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/CustomerMsgConstructor.java @@ -23,6 +23,8 @@ import org.thingsboard.server.gen.edge.v1.CustomerUpdateMsg; import org.thingsboard.server.gen.edge.v1.UpdateMsgType; import org.thingsboard.server.queue.util.TbCoreComponent; +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getStringValue; + @Component @TbCoreComponent public class CustomerMsgConstructor { @@ -33,33 +35,15 @@ public class CustomerMsgConstructor { .setIdMSB(customer.getId().getId().getMostSignificantBits()) .setIdLSB(customer.getId().getId().getLeastSignificantBits()) .setTitle(customer.getTitle()); - if (customer.getCountry() != null) { - builder.setCountry(customer.getCountry()); - } - if (customer.getState() != null) { - builder.setState(customer.getState()); - } - if (customer.getCity() != null) { - builder.setCity(customer.getCity()); - } - if (customer.getAddress() != null) { - builder.setAddress(customer.getAddress()); - } - if (customer.getAddress2() != null) { - builder.setAddress2(customer.getAddress2()); - } - if (customer.getZip() != null) { - builder.setZip(customer.getZip()); - } - if (customer.getPhone() != null) { - builder.setPhone(customer.getPhone()); - } - if (customer.getEmail() != null) { - builder.setEmail(customer.getEmail()); - } - if (customer.getAdditionalInfo() != null) { - builder.setAdditionalInfo(JacksonUtil.toString(customer.getAdditionalInfo())); - } + builder.setCountry(getStringValue(customer.getCountry())); + builder.setState(getStringValue(customer.getState())); + builder.setCity(getStringValue(customer.getCity())); + builder.setAddress(getStringValue(customer.getAddress())); + builder.setAddress2(getStringValue(customer.getAddress2())); + builder.setZip(getStringValue(customer.getZip())); + builder.setPhone(getStringValue(customer.getPhone())); + builder.setEmail(getStringValue(customer.getEmail())); + builder.setAdditionalInfo(getStringValue(JacksonUtil.toString(customer.getAdditionalInfo()))); return builder.build(); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DashboardMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DashboardMsgConstructor.java index f3f8573aa2..b916d10aa8 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DashboardMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DashboardMsgConstructor.java @@ -24,6 +24,8 @@ import org.thingsboard.server.gen.edge.v1.DashboardUpdateMsg; import org.thingsboard.server.gen.edge.v1.UpdateMsgType; import org.thingsboard.server.queue.util.TbCoreComponent; +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getInt64Value; + @Component @TbCoreComponent public class DashboardMsgConstructor { @@ -36,8 +38,8 @@ public class DashboardMsgConstructor { .setTitle(dashboard.getTitle()) .setConfiguration(JacksonUtil.toString(dashboard.getConfiguration())); if (customerId != null) { - builder.setCustomerIdMSB(customerId.getId().getMostSignificantBits()); - builder.setCustomerIdLSB(customerId.getId().getLeastSignificantBits()); + builder.setCustomerIdMSB(getInt64Value(customerId.getId().getMostSignificantBits())); + builder.setCustomerIdLSB(getInt64Value(customerId.getId().getLeastSignificantBits())); } return builder.build(); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceMsgConstructor.java index a28e80d80a..1afde36dac 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceMsgConstructor.java @@ -32,6 +32,9 @@ import org.thingsboard.server.queue.util.TbCoreComponent; import java.util.UUID; +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getInt64Value; +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getStringValue; + @Component @TbCoreComponent public class DeviceMsgConstructor { @@ -45,23 +48,17 @@ public class DeviceMsgConstructor { .setIdLSB(device.getId().getId().getLeastSignificantBits()) .setName(device.getName()) .setType(device.getType()); - if (device.getLabel() != null) { - builder.setLabel(device.getLabel()); - } + builder.setLabel(getStringValue(device.getLabel())); if (customerId != null) { - builder.setCustomerIdMSB(customerId.getId().getMostSignificantBits()); - builder.setCustomerIdLSB(customerId.getId().getLeastSignificantBits()); + builder.setCustomerIdMSB(getInt64Value(customerId.getId().getMostSignificantBits())); + builder.setCustomerIdLSB(getInt64Value(customerId.getId().getLeastSignificantBits())); } if (device.getDeviceProfileId() != null) { - builder.setDeviceProfileIdMSB(device.getDeviceProfileId().getId().getMostSignificantBits()); - builder.setDeviceProfileIdLSB(device.getDeviceProfileId().getId().getLeastSignificantBits()); - } - if (device.getAdditionalInfo() != null) { - builder.setAdditionalInfo(JacksonUtil.toString(device.getAdditionalInfo())); - } - if (conflictName != null) { - builder.setConflictName(conflictName); + builder.setDeviceProfileIdMSB(getInt64Value(device.getDeviceProfileId().getId().getMostSignificantBits())); + builder.setDeviceProfileIdLSB(getInt64Value(device.getDeviceProfileId().getId().getLeastSignificantBits())); } + builder.setAdditionalInfo(getStringValue(JacksonUtil.toString(device.getAdditionalInfo()))); + builder.setConflictName(getStringValue(conflictName)); return builder.build(); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceProfileMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceProfileMsgConstructor.java index 965b7c9e67..ef95ef0299 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceProfileMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceProfileMsgConstructor.java @@ -27,6 +27,9 @@ import org.thingsboard.server.queue.util.TbCoreComponent; import java.nio.charset.StandardCharsets; +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getBytesValue; +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getStringValue; + @Component @TbCoreComponent public class DeviceProfileMsgConstructor { @@ -51,20 +54,16 @@ public class DeviceProfileMsgConstructor { // if (deviceProfile.getDefaultQueueName() != null) { // builder.setDefaultQueueName(deviceProfile.getDefaultQueueName()); // } - if (deviceProfile.getDescription() != null) { - builder.setDescription(deviceProfile.getDescription()); - } + builder.setDescription(getStringValue(deviceProfile.getDescription())); if (deviceProfile.getTransportType() != null) { - builder.setTransportType(deviceProfile.getTransportType().name()); + builder.setTransportType(getStringValue(deviceProfile.getTransportType().name())); } if (deviceProfile.getProvisionType() != null) { - builder.setProvisionType(deviceProfile.getProvisionType().name()); - } - if (deviceProfile.getProvisionDeviceKey() != null) { - builder.setProvisionDeviceKey(deviceProfile.getProvisionDeviceKey()); + builder.setProvisionType(getStringValue(deviceProfile.getProvisionType().name())); } + builder.setProvisionDeviceKey(getStringValue(deviceProfile.getProvisionDeviceKey())); if (deviceProfile.getImage() != null) { - builder.setImage(ByteString.copyFrom(deviceProfile.getImage().getBytes(StandardCharsets.UTF_8))); + builder.setImage(getBytesValue(ByteString.copyFrom(deviceProfile.getImage().getBytes(StandardCharsets.UTF_8)))); } return builder.build(); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/EntityViewMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/EntityViewMsgConstructor.java index 6b6447e1e7..70ea4d179b 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/EntityViewMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/EntityViewMsgConstructor.java @@ -25,6 +25,9 @@ import org.thingsboard.server.gen.edge.v1.EntityViewUpdateMsg; import org.thingsboard.server.gen.edge.v1.UpdateMsgType; import org.thingsboard.server.queue.util.TbCoreComponent; +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getInt64Value; +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getStringValue; + @Component @TbCoreComponent public class EntityViewMsgConstructor { @@ -51,12 +54,10 @@ public class EntityViewMsgConstructor { .setEntityIdLSB(entityView.getEntityId().getId().getLeastSignificantBits()) .setEntityType(entityType); if (customerId != null) { - builder.setCustomerIdMSB(customerId.getId().getMostSignificantBits()); - builder.setCustomerIdLSB(customerId.getId().getLeastSignificantBits()); - } - if (entityView.getAdditionalInfo() != null) { - builder.setAdditionalInfo(JacksonUtil.toString(entityView.getAdditionalInfo())); + builder.setCustomerIdMSB(getInt64Value(customerId.getId().getMostSignificantBits())); + builder.setCustomerIdLSB(getInt64Value(customerId.getId().getLeastSignificantBits())); } + builder.setAdditionalInfo(getStringValue(JacksonUtil.toString(entityView.getAdditionalInfo()))); return builder.build(); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/RelationMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/RelationMsgConstructor.java index b4763e3f78..b78d4f6642 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/RelationMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/RelationMsgConstructor.java @@ -22,6 +22,8 @@ import org.thingsboard.server.gen.edge.v1.RelationUpdateMsg; import org.thingsboard.server.gen.edge.v1.UpdateMsgType; import org.thingsboard.server.queue.util.TbCoreComponent; +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getStringValue; + @Component @TbCoreComponent public class RelationMsgConstructor { @@ -38,7 +40,7 @@ public class RelationMsgConstructor { .setType(entityRelation.getType()) .setAdditionalInfo(JacksonUtil.toString(entityRelation.getAdditionalInfo())); if (entityRelation.getTypeGroup() != null) { - builder.setTypeGroup(entityRelation.getTypeGroup().name()); + builder.setTypeGroup(getStringValue(entityRelation.getTypeGroup().name())); } return builder.build(); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/RuleChainMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/RuleChainMsgConstructor.java index 8438057a73..f137fda04e 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/RuleChainMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/RuleChainMsgConstructor.java @@ -37,6 +37,8 @@ import org.thingsboard.server.queue.util.TbCoreComponent; import java.util.ArrayList; import java.util.List; +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getInt64Value; + @Component @Slf4j @TbCoreComponent @@ -54,8 +56,8 @@ public class RuleChainMsgConstructor { .setDebugMode(ruleChain.isDebugMode()) .setConfiguration(JacksonUtil.toString(ruleChain.getConfiguration())); if (ruleChain.getFirstRuleNodeId() != null) { - builder.setFirstRuleNodeIdMSB(ruleChain.getFirstRuleNodeId().getId().getMostSignificantBits()) - .setFirstRuleNodeIdLSB(ruleChain.getFirstRuleNodeId().getId().getLeastSignificantBits()); + builder.setFirstRuleNodeIdMSB(getInt64Value(ruleChain.getFirstRuleNodeId().getId().getMostSignificantBits())) + .setFirstRuleNodeIdLSB(getInt64Value(ruleChain.getFirstRuleNodeId().getId().getLeastSignificantBits())); } return builder.build(); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/UserMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/UserMsgConstructor.java index af422cc8ab..b9e045821c 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/UserMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/UserMsgConstructor.java @@ -16,16 +16,19 @@ package org.thingsboard.server.service.edge.rpc.constructor; import org.springframework.stereotype.Component; +import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.common.data.security.UserCredentials; -import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.gen.edge.v1.UpdateMsgType; import org.thingsboard.server.gen.edge.v1.UserCredentialsUpdateMsg; import org.thingsboard.server.gen.edge.v1.UserUpdateMsg; import org.thingsboard.server.queue.util.TbCoreComponent; +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getInt64Value; +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getStringValue; + @Component @TbCoreComponent public class UserMsgConstructor { @@ -38,21 +41,12 @@ public class UserMsgConstructor { .setEmail(user.getEmail()) .setAuthority(user.getAuthority().name()); if (customerId != null) { - builder.setCustomerIdMSB(customerId.getId().getMostSignificantBits()); - builder.setCustomerIdLSB(customerId.getId().getLeastSignificantBits()); - } - if (user.getFirstName() != null) { - builder.setFirstName(user.getFirstName()); - } - if (user.getLastName() != null) { - builder.setLastName(user.getLastName()); - } - if (user.getAdditionalInfo() != null) { - builder.setAdditionalInfo(JacksonUtil.toString(user.getAdditionalInfo())); - } - if (user.getAdditionalInfo() != null) { - builder.setAdditionalInfo(JacksonUtil.toString(user.getAdditionalInfo())); + builder.setCustomerIdMSB(getInt64Value(customerId.getId().getMostSignificantBits())); + builder.setCustomerIdLSB(getInt64Value(customerId.getId().getLeastSignificantBits())); } + builder.setFirstName(getStringValue(user.getFirstName())); + builder.setLastName(getStringValue(user.getLastName())); + builder.setAdditionalInfo(getStringValue(JacksonUtil.toString(user.getAdditionalInfo()))); return builder.build(); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/WidgetTypeMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/WidgetTypeMsgConstructor.java index 6d8799f8fe..350dfe8d58 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/WidgetTypeMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/WidgetTypeMsgConstructor.java @@ -16,14 +16,16 @@ package org.thingsboard.server.service.edge.rpc.constructor; import org.springframework.stereotype.Component; +import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.WidgetTypeId; import org.thingsboard.server.common.data.widget.WidgetType; -import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.gen.edge.v1.UpdateMsgType; import org.thingsboard.server.gen.edge.v1.WidgetTypeUpdateMsg; import org.thingsboard.server.queue.util.TbCoreComponent; +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getStringValue; + @Component @TbCoreComponent public class WidgetTypeMsgConstructor { @@ -33,21 +35,13 @@ public class WidgetTypeMsgConstructor { .setMsgType(msgType) .setIdMSB(widgetType.getId().getId().getMostSignificantBits()) .setIdLSB(widgetType.getId().getId().getLeastSignificantBits()); - if (widgetType.getBundleAlias() != null) { - builder.setBundleAlias(widgetType.getBundleAlias()); - } - if (widgetType.getAlias() != null) { - builder.setAlias(widgetType.getAlias()); - } - if (widgetType.getName() != null) { - builder.setName(widgetType.getName()); - } - if (widgetType.getDescriptor() != null) { - builder.setDescriptorJson(JacksonUtil.toString(widgetType.getDescriptor())); - } - if (widgetType.getTenantId().equals(TenantId.SYS_TENANT_ID)) { - builder.setIsSystem(true); - } + builder.setBundleAlias(getStringValue(widgetType.getBundleAlias())); + builder.setAlias(getStringValue(widgetType.getAlias())); + builder.setName(getStringValue(widgetType.getName())); + builder.setDescriptorJson(getStringValue(JacksonUtil.toString(widgetType.getDescriptor()))); + if (widgetType.getTenantId().equals(TenantId.SYS_TENANT_ID)) { + builder.setIsSystem(true); + } return builder.build(); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/WidgetsBundleMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/WidgetsBundleMsgConstructor.java index 7a2a9d00cd..56464ad8a5 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/WidgetsBundleMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/WidgetsBundleMsgConstructor.java @@ -26,6 +26,9 @@ import org.thingsboard.server.queue.util.TbCoreComponent; import java.nio.charset.StandardCharsets; +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getBytesValue; +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getStringValue; + @Component @TbCoreComponent public class WidgetsBundleMsgConstructor { @@ -38,10 +41,10 @@ public class WidgetsBundleMsgConstructor { .setTitle(widgetsBundle.getTitle()) .setAlias(widgetsBundle.getAlias()); if (widgetsBundle.getImage() != null) { - builder.setImage(ByteString.copyFrom(widgetsBundle.getImage().getBytes(StandardCharsets.UTF_8))); + builder.setImage(getBytesValue(ByteString.copyFrom(widgetsBundle.getImage().getBytes(StandardCharsets.UTF_8)))); } if (widgetsBundle.getDescription() != null) { - builder.setDescription(widgetsBundle.getDescription()); + builder.setDescription(getStringValue(widgetsBundle.getDescription())); } if (widgetsBundle.getTenantId().equals(TenantId.SYS_TENANT_ID)) { builder.setIsSystem(true); diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/DeviceEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/DeviceEdgeProcessor.java index d924795df1..b59f192d97 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/DeviceEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/DeviceEdgeProcessor.java @@ -162,11 +162,16 @@ public class DeviceEdgeProcessor extends BaseEdgeProcessor { if (device != null) { device.setName(deviceUpdateMsg.getName()); device.setType(deviceUpdateMsg.getType()); - device.setLabel(deviceUpdateMsg.getLabel()); - device.setAdditionalInfo(JacksonUtil.toJsonNode(deviceUpdateMsg.getAdditionalInfo())); - if (deviceUpdateMsg.getDeviceProfileIdMSB() != 0 && deviceUpdateMsg.getDeviceProfileIdLSB() != 0) { + if (deviceUpdateMsg.hasLabel()) { + device.setLabel(deviceUpdateMsg.getLabel().getValue()); + } + if (deviceUpdateMsg.hasAdditionalInfo()) { + device.setAdditionalInfo(JacksonUtil.toJsonNode(deviceUpdateMsg.getAdditionalInfo().getValue())); + } + if (deviceUpdateMsg.hasDeviceProfileIdMSB() && deviceUpdateMsg.hasDeviceProfileIdLSB()) { DeviceProfileId deviceProfileId = new DeviceProfileId( - new UUID(deviceUpdateMsg.getDeviceProfileIdMSB(), deviceUpdateMsg.getDeviceProfileIdLSB())); + new UUID(deviceUpdateMsg.getDeviceProfileIdMSB().getValue(), + deviceUpdateMsg.getDeviceProfileIdLSB().getValue())); device.setDeviceProfileId(deviceProfileId); } deviceService.saveDevice(device); @@ -195,11 +200,16 @@ public class DeviceEdgeProcessor extends BaseEdgeProcessor { device.setCustomerId(getCustomerId(edge)); device.setName(deviceName); device.setType(deviceUpdateMsg.getType()); - device.setLabel(deviceUpdateMsg.getLabel()); - device.setAdditionalInfo(JacksonUtil.toJsonNode(deviceUpdateMsg.getAdditionalInfo())); - if (deviceUpdateMsg.getDeviceProfileIdMSB() != 0 && deviceUpdateMsg.getDeviceProfileIdLSB() != 0) { + if (deviceUpdateMsg.hasLabel()) { + device.setLabel(deviceUpdateMsg.getLabel().getValue()); + } + if (deviceUpdateMsg.hasAdditionalInfo()) { + device.setAdditionalInfo(JacksonUtil.toJsonNode(deviceUpdateMsg.getAdditionalInfo().getValue())); + } + if (deviceUpdateMsg.hasDeviceProfileIdMSB() && deviceUpdateMsg.hasDeviceProfileIdLSB()) { DeviceProfileId deviceProfileId = new DeviceProfileId( - new UUID(deviceUpdateMsg.getDeviceProfileIdMSB(), deviceUpdateMsg.getDeviceProfileIdLSB())); + new UUID(deviceUpdateMsg.getDeviceProfileIdMSB().getValue(), + deviceUpdateMsg.getDeviceProfileIdLSB().getValue())); device.setDeviceProfileId(deviceProfileId); } Device savedDevice = deviceService.saveDevice(device, false); diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/RelationEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/RelationEdgeProcessor.java index 6318356a47..d23edc0f60 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/RelationEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/RelationEdgeProcessor.java @@ -72,7 +72,9 @@ public class RelationEdgeProcessor extends BaseEdgeProcessor { entityRelation.setTo(toId); entityRelation.setType(relationUpdateMsg.getType()); - entityRelation.setTypeGroup(RelationTypeGroup.valueOf(relationUpdateMsg.getTypeGroup())); + if (relationUpdateMsg.hasTypeGroup()) { + entityRelation.setTypeGroup(RelationTypeGroup.valueOf(relationUpdateMsg.getTypeGroup().getValue())); + } entityRelation.setAdditionalInfo(mapper.readTree(relationUpdateMsg.getAdditionalInfo())); switch (relationUpdateMsg.getMsgType()) { case ENTITY_CREATED_RPC_MESSAGE: diff --git a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java index dd9f67416a..aad11006be 100644 --- a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java @@ -114,6 +114,7 @@ import org.thingsboard.server.gen.edge.v1.UserUpdateMsg; import org.thingsboard.server.gen.edge.v1.WidgetTypeUpdateMsg; import org.thingsboard.server.gen.edge.v1.WidgetsBundleUpdateMsg; import org.thingsboard.server.gen.transport.TransportProtos; +import org.thingsboard.server.service.edge.rpc.EdgeProtoUtils; import org.thingsboard.server.service.queue.TbClusterService; import java.util.ArrayList; @@ -126,6 +127,7 @@ import java.util.UUID; import java.util.concurrent.TimeUnit; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.thingsboard.server.service.edge.rpc.EdgeProtoUtils.getStringValue; @Slf4j abstract public class BaseEdgeTest extends AbstractControllerTest { @@ -902,7 +904,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { Assert.assertEquals(widgetTypeUpdateMsg.getIdLSB(), savedWidgetType.getUuidId().getLeastSignificantBits()); Assert.assertEquals(widgetTypeUpdateMsg.getAlias(), savedWidgetType.getAlias()); Assert.assertEquals(widgetTypeUpdateMsg.getName(), savedWidgetType.getName()); - Assert.assertEquals(JacksonUtil.toJsonNode(widgetTypeUpdateMsg.getDescriptorJson()), savedWidgetType.getDescriptor()); + Assert.assertEquals(JacksonUtil.toJsonNode(widgetTypeUpdateMsg.getDescriptorJson().getValue()), savedWidgetType.getDescriptor()); // 3 edgeImitator.expectMessageAmount(1); @@ -1381,7 +1383,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder(); RelationUpdateMsg.Builder relationUpdateMsgBuilder = RelationUpdateMsg.newBuilder(); relationUpdateMsgBuilder.setType("test"); - relationUpdateMsgBuilder.setTypeGroup(RelationTypeGroup.COMMON.name()); + relationUpdateMsgBuilder.setTypeGroup(getStringValue(RelationTypeGroup.COMMON.name())); relationUpdateMsgBuilder.setToIdMSB(device1.getId().getId().getMostSignificantBits()); relationUpdateMsgBuilder.setToIdLSB(device1.getId().getId().getLeastSignificantBits()); relationUpdateMsgBuilder.setToEntityType(device1.getId().getEntityType().name()); diff --git a/common/edge-api/src/main/proto/edge.proto b/common/edge-api/src/main/proto/edge.proto index 9e0a180dcf..11f6f0e343 100644 --- a/common/edge-api/src/main/proto/edge.proto +++ b/common/edge-api/src/main/proto/edge.proto @@ -20,6 +20,7 @@ option java_multiple_files = true; option java_outer_classname = "EdgeProtos"; import "queue.proto"; +import "google/protobuf/wrappers.proto"; package edge; @@ -129,8 +130,8 @@ message RuleChainUpdateMsg { int64 idMSB = 2; int64 idLSB = 3; string name = 4; - int64 firstRuleNodeIdMSB = 5; - int64 firstRuleNodeIdLSB = 6; + google.protobuf.Int64Value firstRuleNodeIdMSB = 5; + google.protobuf.Int64Value firstRuleNodeIdLSB = 6; bool root = 7; bool debugMode = 8; string configuration = 9; @@ -174,8 +175,8 @@ message DashboardUpdateMsg { UpdateMsgType msgType = 1; int64 idMSB = 2; int64 idLSB = 3; - int64 customerIdMSB = 4; - int64 customerIdLSB = 5; + google.protobuf.Int64Value customerIdMSB = 4; + google.protobuf.Int64Value customerIdLSB = 5; string title = 6; string configuration = 7; } @@ -184,15 +185,15 @@ message DeviceUpdateMsg { UpdateMsgType msgType = 1; int64 idMSB = 2; int64 idLSB = 3; - int64 customerIdMSB = 4; - int64 customerIdLSB = 5; - int64 deviceProfileIdMSB = 6; - int64 deviceProfileIdLSB = 7; + google.protobuf.Int64Value customerIdMSB = 4; + google.protobuf.Int64Value customerIdLSB = 5; + google.protobuf.Int64Value deviceProfileIdMSB = 6; + google.protobuf.Int64Value deviceProfileIdLSB = 7; string name = 8; string type = 9; - string label = 10; - string additionalInfo = 11; - string conflictName = 12; + google.protobuf.StringValue label = 10; + google.protobuf.StringValue additionalInfo = 11; + google.protobuf.StringValue conflictName = 12; } message DeviceProfileUpdateMsg { @@ -200,17 +201,17 @@ message DeviceProfileUpdateMsg { int64 idMSB = 2; int64 idLSB = 3; string name = 4; - string description = 5; + google.protobuf.StringValue description = 5; bool default = 6; string type = 7; - string transportType = 8; - string provisionType = 9; + google.protobuf.StringValue transportType = 8; + google.protobuf.StringValue provisionType = 9; int64 defaultRuleChainIdMSB = 10; int64 defaultRuleChainIdLSB = 11; string defaultQueueName = 12; bytes profileDataBytes = 13; - string provisionDeviceKey = 14; - bytes image = 15; + google.protobuf.StringValue provisionDeviceKey = 14; + google.protobuf.BytesValue image = 15; } message DeviceCredentialsUpdateMsg { @@ -225,26 +226,26 @@ message AssetUpdateMsg { UpdateMsgType msgType = 1; int64 idMSB = 2; int64 idLSB = 3; - int64 customerIdMSB = 4; - int64 customerIdLSB = 5; + google.protobuf.Int64Value customerIdMSB = 4; + google.protobuf.Int64Value customerIdLSB = 5; string name = 6; string type = 7; - string label = 8; - string additionalInfo = 9; + google.protobuf.StringValue label = 8; + google.protobuf.StringValue additionalInfo = 9; } message EntityViewUpdateMsg { UpdateMsgType msgType = 1; int64 idMSB = 2; int64 idLSB = 3; - int64 customerIdMSB = 4; - int64 customerIdLSB = 5; + google.protobuf.Int64Value customerIdMSB = 4; + google.protobuf.Int64Value customerIdLSB = 5; string name = 6; string type = 7; int64 entityIdMSB = 8; int64 entityIdLSB = 9; EdgeEntityType entityType = 10; - string additionalInfo = 11; + google.protobuf.StringValue additionalInfo = 11; } message AlarmUpdateMsg { @@ -268,15 +269,15 @@ message CustomerUpdateMsg { int64 idMSB = 2; int64 idLSB = 3; string title = 4; - string country = 5; - string state = 6; - string city = 7; - string address = 8; - string address2 = 9; - string zip = 10; - string phone = 11; - string email = 12; - string additionalInfo = 13; + google.protobuf.StringValue country = 5; + google.protobuf.StringValue state = 6; + google.protobuf.StringValue city = 7; + google.protobuf.StringValue address = 8; + google.protobuf.StringValue address2 = 9; + google.protobuf.StringValue zip = 10; + google.protobuf.StringValue phone = 11; + google.protobuf.StringValue email = 12; + google.protobuf.StringValue additionalInfo = 13; } message RelationUpdateMsg { @@ -288,7 +289,7 @@ message RelationUpdateMsg { int64 toIdLSB = 6; string toEntityType = 7; string type = 8; - string typeGroup = 9; + google.protobuf.StringValue typeGroup = 9; string additionalInfo = 10; } @@ -296,13 +297,13 @@ message UserUpdateMsg { UpdateMsgType msgType = 1; int64 idMSB = 2; int64 idLSB = 3; - int64 customerIdMSB = 4; - int64 customerIdLSB = 5; + google.protobuf.Int64Value customerIdMSB = 4; + google.protobuf.Int64Value customerIdLSB = 5; string email = 6; string authority = 7; - string firstName = 8; - string lastName = 9; - string additionalInfo = 10; + google.protobuf.StringValue firstName = 8; + google.protobuf.StringValue lastName = 9; + google.protobuf.StringValue additionalInfo = 10; } message WidgetsBundleUpdateMsg { @@ -311,19 +312,19 @@ message WidgetsBundleUpdateMsg { int64 idLSB = 3; string title = 4; string alias = 5; - bytes image = 6; + google.protobuf.BytesValue image = 6; bool isSystem = 7; - string description = 8; + google.protobuf.StringValue description = 8; } message WidgetTypeUpdateMsg { UpdateMsgType msgType = 1; int64 idMSB = 2; int64 idLSB = 3; - string bundleAlias = 4; - string alias = 5; - string name = 6; - string descriptorJson = 7; + google.protobuf.StringValue bundleAlias = 4; + google.protobuf.StringValue alias = 5; + google.protobuf.StringValue name = 6; + google.protobuf.StringValue descriptorJson = 7; bool isSystem = 8; } From d1bede770d891ee37b999e5471b43c93e13b10fc Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Sun, 1 Aug 2021 22:23:15 +0300 Subject: [PATCH 02/13] Edge test fixes. Replaced do/while loop with awailability framework approach --- application/pom.xml | 5 +++ .../thingsboard/server/edge/BaseEdgeTest.java | 39 +++++++++++-------- pom.xml | 7 ++++ 3 files changed, 35 insertions(+), 16 deletions(-) diff --git a/application/pom.xml b/application/pom.xml index 303f206601..83a9eefdc3 100644 --- a/application/pom.xml +++ b/application/pom.xml @@ -289,6 +289,11 @@ junit test + + org.awaitility + awaitility + test + org.mockito mockito-core diff --git a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java index aad11006be..0da275adeb 100644 --- a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java @@ -27,6 +27,8 @@ import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.MessageLite; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.RandomStringUtils; +import org.awaitility.Awaitility; +import org.hamcrest.Matchers; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -650,7 +652,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { Assert.assertEquals(relationUpdateMsg.getFromIdMSB(), relation.getFrom().getId().getMostSignificantBits()); Assert.assertEquals(relationUpdateMsg.getToIdLSB(), relation.getTo().getId().getLeastSignificantBits()); Assert.assertEquals(relationUpdateMsg.getToEntityType(), relation.getTo().getEntityType().name()); - Assert.assertEquals(relationUpdateMsg.getTypeGroup(), relation.getTypeGroup().name()); + Assert.assertEquals(relationUpdateMsg.getTypeGroup().getValue(), relation.getTypeGroup().name()); // 2 edgeImitator.expectMessageAmount(1); @@ -674,7 +676,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { Assert.assertEquals(relationUpdateMsg.getFromIdMSB(), relation.getFrom().getId().getMostSignificantBits()); Assert.assertEquals(relationUpdateMsg.getToIdLSB(), relation.getTo().getId().getLeastSignificantBits()); Assert.assertEquals(relationUpdateMsg.getToEntityType(), relation.getTo().getEntityType().name()); - Assert.assertEquals(relationUpdateMsg.getTypeGroup(), relation.getTypeGroup().name()); + Assert.assertEquals(relationUpdateMsg.getTypeGroup().getValue(), relation.getTypeGroup().name()); log.info("Relations tested successfully"); } @@ -902,8 +904,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, widgetTypeUpdateMsg.getMsgType()); Assert.assertEquals(widgetTypeUpdateMsg.getIdMSB(), savedWidgetType.getUuidId().getMostSignificantBits()); Assert.assertEquals(widgetTypeUpdateMsg.getIdLSB(), savedWidgetType.getUuidId().getLeastSignificantBits()); - Assert.assertEquals(widgetTypeUpdateMsg.getAlias(), savedWidgetType.getAlias()); - Assert.assertEquals(widgetTypeUpdateMsg.getName(), savedWidgetType.getName()); + Assert.assertEquals(widgetTypeUpdateMsg.getAlias().getValue(), savedWidgetType.getAlias()); + Assert.assertEquals(widgetTypeUpdateMsg.getName().getValue(), savedWidgetType.getName()); Assert.assertEquals(JacksonUtil.toJsonNode(widgetTypeUpdateMsg.getDescriptorJson().getValue()), savedWidgetType.getDescriptor()); // 3 @@ -1204,7 +1206,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg); DeviceUpdateMsg latestDeviceUpdateMsg = (DeviceUpdateMsg) latestMessage; Assert.assertNotEquals(deviceOnCloudName, latestDeviceUpdateMsg.getName()); - Assert.assertEquals(deviceOnCloudName, latestDeviceUpdateMsg.getConflictName()); + Assert.assertEquals(deviceOnCloudName, latestDeviceUpdateMsg.getConflictName().getValue()); UUID newDeviceId = new UUID(latestDeviceUpdateMsg.getIdMSB(), latestDeviceUpdateMsg.getIdLSB()); @@ -1271,7 +1273,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { EntityId toEntityId = EntityIdFactory.getByTypeAndUuid(relationUpdateMsg.getToEntityType(), toUUID); Assert.assertEquals(relation.getTo(), toEntityId); - Assert.assertEquals(relation.getTypeGroup().name(), relationUpdateMsg.getTypeGroup()); + Assert.assertEquals(relation.getTypeGroup().name(), relationUpdateMsg.getTypeGroup().getValue()); } private void sendAlarm() throws Exception { @@ -1350,15 +1352,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { edgeImitator.sendUplinkMsg(uplinkMsgBuilder2.build()); Assert.assertTrue(edgeImitator.waitForResponses()); - int attempt = 0; - Map>> timeseries; - do { - timeseries = doGetAsyncTyped("/api/plugins/telemetry/DEVICE/" + device.getUuidId() + "/values/timeseries?keys=" + timeseriesKey, - new TypeReference<>() {}); - // Wait before device attributes saved to database before requesting them from controller - Thread.sleep(100); - attempt++; - } while (!timeseries.containsKey(timeseriesKey) || attempt < 10); + Awaitility.await() + .atMost(2, TimeUnit.SECONDS) + .until(() -> isTimeseriesAlreadyAvailable(device, timeseriesKey)); + + Map>> timeseries = loadDeviceTimeseries(device, timeseriesKey); Assert.assertTrue(timeseries.containsKey(timeseriesKey)); Assert.assertEquals(1, timeseries.get(timeseriesKey).size()); Assert.assertEquals(timeseriesValue, timeseries.get(timeseriesKey).get(0).get("value")); @@ -1370,6 +1368,15 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { } + private boolean isTimeseriesAlreadyAvailable(Device device, String timeseriesKey) throws Exception { + return loadDeviceTimeseries(device, timeseriesKey).containsKey(timeseriesKey); + } + + private Map>> loadDeviceTimeseries(Device device, String timeseriesKey) throws Exception { + return doGetAsyncTyped("/api/plugins/telemetry/DEVICE/" + device.getUuidId() + "/values/timeseries?keys=" + timeseriesKey, + new TypeReference<>() {}); + } + private void sendRelation() throws Exception { List edgeDevices = doGetTypedWithPageLink("/api/edge/" + edge.getId().getId().toString() + "/devices?", new TypeReference>() {}, new PageLink(100)).getData(); @@ -1449,7 +1456,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { edgeImitator.expectMessageAmount(1); edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); Assert.assertTrue(edgeImitator.waitForResponses()); - Assert.assertTrue(edgeImitator.waitForMessages());; + Assert.assertTrue(edgeImitator.waitForMessages()); AbstractMessage latestMessage = edgeImitator.getLatestMessage(); Assert.assertTrue(latestMessage instanceof RuleChainMetadataUpdateMsg); diff --git a/pom.xml b/pom.xml index d0c9864ef3..f59f69467c 100755 --- a/pom.xml +++ b/pom.xml @@ -49,6 +49,7 @@ 2.2.0 4.12 5.7.1 + 4.1.0 2.2 1.7.7 1.2.3 @@ -1437,6 +1438,12 @@ ${junit.version} test + + org.awaitility + awaitility + ${awaitility.version} + test + org.hamcrest hamcrest From f0f387e7102041a90d139c4762dc1f1aa1c0afc0 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Sun, 1 Aug 2021 22:25:52 +0300 Subject: [PATCH 03/13] Removed unnecessary method --- .../java/org/thingsboard/server/edge/BaseEdgeTest.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java index 0da275adeb..37d8b58f28 100644 --- a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java @@ -1354,7 +1354,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { Awaitility.await() .atMost(2, TimeUnit.SECONDS) - .until(() -> isTimeseriesAlreadyAvailable(device, timeseriesKey)); + .until(() -> loadDeviceTimeseries(device, timeseriesKey).containsKey(timeseriesKey)); Map>> timeseries = loadDeviceTimeseries(device, timeseriesKey); Assert.assertTrue(timeseries.containsKey(timeseriesKey)); @@ -1365,11 +1365,6 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { Assert.assertEquals(1, attributes.size()); Assert.assertEquals(attributes.get(0).get("key"), attributesKey); Assert.assertEquals(attributes.get(0).get("value"), attributesValue); - - } - - private boolean isTimeseriesAlreadyAvailable(Device device, String timeseriesKey) throws Exception { - return loadDeviceTimeseries(device, timeseriesKey).containsKey(timeseriesKey); } private Map>> loadDeviceTimeseries(Device device, String timeseriesKey) throws Exception { From 94cf676d97c5da49cd563c66362fee29888bf07e Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Mon, 2 Aug 2021 13:44:11 +0300 Subject: [PATCH 04/13] Added proper handle of null additional info --- .../edge/rpc/constructor/RelationMsgConstructor.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/RelationMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/RelationMsgConstructor.java index b78d4f6642..839f19dad5 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/RelationMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/RelationMsgConstructor.java @@ -37,8 +37,10 @@ public class RelationMsgConstructor { .setToIdMSB(entityRelation.getTo().getId().getMostSignificantBits()) .setToIdLSB(entityRelation.getTo().getId().getLeastSignificantBits()) .setToEntityType(entityRelation.getTo().getEntityType().name()) - .setType(entityRelation.getType()) - .setAdditionalInfo(JacksonUtil.toString(entityRelation.getAdditionalInfo())); + .setType(entityRelation.getType()); + if (entityRelation.getAdditionalInfo() != null) { + builder.setAdditionalInfo(JacksonUtil.toString(entityRelation.getAdditionalInfo())); + } if (entityRelation.getTypeGroup() != null) { builder.setTypeGroup(getStringValue(entityRelation.getTypeGroup().name())); } From d95c2b88b0337fd185fd1d07bd48626f42dcfcbf Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Mon, 2 Aug 2021 14:55:43 +0300 Subject: [PATCH 05/13] Added proper hanling of null values for provision device key --- .../edge/rpc/constructor/DeviceProfileMsgConstructor.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceProfileMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceProfileMsgConstructor.java index ef95ef0299..697e2aaf22 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceProfileMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceProfileMsgConstructor.java @@ -61,7 +61,9 @@ public class DeviceProfileMsgConstructor { if (deviceProfile.getProvisionType() != null) { builder.setProvisionType(getStringValue(deviceProfile.getProvisionType().name())); } - builder.setProvisionDeviceKey(getStringValue(deviceProfile.getProvisionDeviceKey())); + if (deviceProfile.getProvisionDeviceKey() != null) { + builder.setProvisionDeviceKey(getStringValue(deviceProfile.getProvisionDeviceKey())); + } if (deviceProfile.getImage() != null) { builder.setImage(getBytesValue(ByteString.copyFrom(deviceProfile.getImage().getBytes(StandardCharsets.UTF_8)))); } From 15f8a46d492ef251e2f6db964b0ddf4a64cc70af Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Tue, 3 Aug 2021 13:47:08 +0300 Subject: [PATCH 06/13] Add check for null values --- .../service/edge/rpc/EdgeProtoUtils.java | 18 +++------- .../rpc/constructor/AssetMsgConstructor.java | 8 +++-- .../constructor/CustomerMsgConstructor.java | 36 ++++++++++++++----- .../rpc/constructor/DeviceMsgConstructor.java | 12 +++++-- .../DeviceProfileMsgConstructor.java | 4 ++- .../constructor/EntityViewMsgConstructor.java | 4 ++- .../rpc/constructor/UserMsgConstructor.java | 12 +++++-- .../constructor/WidgetTypeMsgConstructor.java | 16 ++++++--- 8 files changed, 74 insertions(+), 36 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeProtoUtils.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeProtoUtils.java index 4e9e5f59aa..f8065758ba 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeProtoUtils.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeProtoUtils.java @@ -5,7 +5,7 @@ * 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 + * 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, @@ -28,33 +28,25 @@ public class EdgeProtoUtils { public static BoolValue getBoolValue(Boolean value) { BoolValue.Builder builder = BoolValue.newBuilder(); - if (value != null) { - builder.setValue(value); - } + builder.setValue(value); return builder.build(); } public static StringValue getStringValue(String value) { StringValue.Builder builder = StringValue.newBuilder(); - if (value != null) { - builder.setValue(value); - } + builder.setValue(value); return builder.build(); } public static Int64Value getInt64Value(Long value) { Int64Value.Builder builder = Int64Value.newBuilder(); - if (value != null) { - builder.setValue(value); - } + builder.setValue(value); return builder.build(); } public static BytesValue getBytesValue(ByteString value) { BytesValue.Builder builder = BytesValue.newBuilder(); - if (value != null) { - builder.setValue(value); - } + builder.setValue(value); return builder.build(); } } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/AssetMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/AssetMsgConstructor.java index 60e532e2d0..c5438f9445 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/AssetMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/AssetMsgConstructor.java @@ -38,12 +38,16 @@ public class AssetMsgConstructor { .setIdLSB(asset.getId().getId().getLeastSignificantBits()) .setName(asset.getName()) .setType(asset.getType()); - builder.setLabel(getStringValue(asset.getLabel())); + if (asset.getLabel() != null) { + builder.setLabel(getStringValue(asset.getLabel())); + } if (customerId != null) { builder.setCustomerIdMSB(getInt64Value(customerId.getId().getMostSignificantBits())); builder.setCustomerIdLSB(getInt64Value(customerId.getId().getLeastSignificantBits())); } - builder.setAdditionalInfo(getStringValue(JacksonUtil.toString(asset.getAdditionalInfo()))); + if (asset.getAdditionalInfo() != null) { + builder.setAdditionalInfo(getStringValue(JacksonUtil.toString(asset.getAdditionalInfo()))); + } return builder.build(); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/CustomerMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/CustomerMsgConstructor.java index 314ac1bda8..5e9a861995 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/CustomerMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/CustomerMsgConstructor.java @@ -35,15 +35,33 @@ public class CustomerMsgConstructor { .setIdMSB(customer.getId().getId().getMostSignificantBits()) .setIdLSB(customer.getId().getId().getLeastSignificantBits()) .setTitle(customer.getTitle()); - builder.setCountry(getStringValue(customer.getCountry())); - builder.setState(getStringValue(customer.getState())); - builder.setCity(getStringValue(customer.getCity())); - builder.setAddress(getStringValue(customer.getAddress())); - builder.setAddress2(getStringValue(customer.getAddress2())); - builder.setZip(getStringValue(customer.getZip())); - builder.setPhone(getStringValue(customer.getPhone())); - builder.setEmail(getStringValue(customer.getEmail())); - builder.setAdditionalInfo(getStringValue(JacksonUtil.toString(customer.getAdditionalInfo()))); + if (customer.getCountry() != null) { + builder.setCountry(getStringValue(customer.getCountry())); + } + if (customer.getState() != null) { + builder.setState(getStringValue(customer.getState())); + } + if (customer.getCity() != null) { + builder.setCity(getStringValue(customer.getCity())); + } + if (customer.getAddress() != null) { + builder.setAddress(getStringValue(customer.getAddress())); + } + if (customer.getAddress2() != null) { + builder.setAddress2(getStringValue(customer.getAddress2())); + } + if (customer.getZip() != null) { + builder.setZip(getStringValue(customer.getZip())); + } + if (customer.getPhone() != null) { + builder.setPhone(getStringValue(customer.getPhone())); + } + if (customer.getEmail() != null) { + builder.setEmail(getStringValue(customer.getEmail())); + } + if (customer.getAdditionalInfo() != null) { + builder.setAdditionalInfo(getStringValue(JacksonUtil.toString(customer.getAdditionalInfo()))); + } return builder.build(); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceMsgConstructor.java index 1afde36dac..02332eb307 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceMsgConstructor.java @@ -48,7 +48,9 @@ public class DeviceMsgConstructor { .setIdLSB(device.getId().getId().getLeastSignificantBits()) .setName(device.getName()) .setType(device.getType()); - builder.setLabel(getStringValue(device.getLabel())); + if (device.getLabel() != null) { + builder.setLabel(getStringValue(device.getLabel())); + } if (customerId != null) { builder.setCustomerIdMSB(getInt64Value(customerId.getId().getMostSignificantBits())); builder.setCustomerIdLSB(getInt64Value(customerId.getId().getLeastSignificantBits())); @@ -57,8 +59,12 @@ public class DeviceMsgConstructor { builder.setDeviceProfileIdMSB(getInt64Value(device.getDeviceProfileId().getId().getMostSignificantBits())); builder.setDeviceProfileIdLSB(getInt64Value(device.getDeviceProfileId().getId().getLeastSignificantBits())); } - builder.setAdditionalInfo(getStringValue(JacksonUtil.toString(device.getAdditionalInfo()))); - builder.setConflictName(getStringValue(conflictName)); + if (device.getAdditionalInfo() != null) { + builder.setAdditionalInfo(getStringValue(JacksonUtil.toString(device.getAdditionalInfo()))); + } + if (conflictName != null) { + builder.setConflictName(getStringValue(conflictName)); + } return builder.build(); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceProfileMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceProfileMsgConstructor.java index 697e2aaf22..8646fc3756 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceProfileMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceProfileMsgConstructor.java @@ -54,7 +54,9 @@ public class DeviceProfileMsgConstructor { // if (deviceProfile.getDefaultQueueName() != null) { // builder.setDefaultQueueName(deviceProfile.getDefaultQueueName()); // } - builder.setDescription(getStringValue(deviceProfile.getDescription())); + if (deviceProfile.getDescription() != null) { + builder.setDescription(getStringValue(deviceProfile.getDescription())); + } if (deviceProfile.getTransportType() != null) { builder.setTransportType(getStringValue(deviceProfile.getTransportType().name())); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/EntityViewMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/EntityViewMsgConstructor.java index 70ea4d179b..4f9d580ecb 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/EntityViewMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/EntityViewMsgConstructor.java @@ -57,7 +57,9 @@ public class EntityViewMsgConstructor { builder.setCustomerIdMSB(getInt64Value(customerId.getId().getMostSignificantBits())); builder.setCustomerIdLSB(getInt64Value(customerId.getId().getLeastSignificantBits())); } - builder.setAdditionalInfo(getStringValue(JacksonUtil.toString(entityView.getAdditionalInfo()))); + if (entityView.getAdditionalInfo() != null) { + builder.setAdditionalInfo(getStringValue(JacksonUtil.toString(entityView.getAdditionalInfo()))); + } return builder.build(); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/UserMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/UserMsgConstructor.java index b9e045821c..118bd4e6dd 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/UserMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/UserMsgConstructor.java @@ -44,9 +44,15 @@ public class UserMsgConstructor { builder.setCustomerIdMSB(getInt64Value(customerId.getId().getMostSignificantBits())); builder.setCustomerIdLSB(getInt64Value(customerId.getId().getLeastSignificantBits())); } - builder.setFirstName(getStringValue(user.getFirstName())); - builder.setLastName(getStringValue(user.getLastName())); - builder.setAdditionalInfo(getStringValue(JacksonUtil.toString(user.getAdditionalInfo()))); + if (user.getFirstName() != null) { + builder.setFirstName(getStringValue(user.getFirstName())); + } + if (user.getLastName() != null) { + builder.setLastName(getStringValue(user.getLastName())); + } + if (user.getAdditionalInfo() != null) { + builder.setAdditionalInfo(getStringValue(JacksonUtil.toString(user.getAdditionalInfo()))); + } return builder.build(); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/WidgetTypeMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/WidgetTypeMsgConstructor.java index 350dfe8d58..8cf5c2e792 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/WidgetTypeMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/WidgetTypeMsgConstructor.java @@ -35,10 +35,18 @@ public class WidgetTypeMsgConstructor { .setMsgType(msgType) .setIdMSB(widgetType.getId().getId().getMostSignificantBits()) .setIdLSB(widgetType.getId().getId().getLeastSignificantBits()); - builder.setBundleAlias(getStringValue(widgetType.getBundleAlias())); - builder.setAlias(getStringValue(widgetType.getAlias())); - builder.setName(getStringValue(widgetType.getName())); - builder.setDescriptorJson(getStringValue(JacksonUtil.toString(widgetType.getDescriptor()))); + if (widgetType.getBundleAlias() != null) { + builder.setBundleAlias(getStringValue(widgetType.getBundleAlias())); + } + if (widgetType.getAlias() != null) { + builder.setAlias(getStringValue(widgetType.getAlias())); + } + if (widgetType.getName() != null) { + builder.setName(getStringValue(widgetType.getName())); + } + if (widgetType.getDescriptor() != null) { + builder.setDescriptorJson(getStringValue(JacksonUtil.toString(widgetType.getDescriptor()))); + } if (widgetType.getTenantId().equals(TenantId.SYS_TENANT_ID)) { builder.setIsSystem(true); } From dffd25296bfaf87bbc8431860ae06ef5de74c15c Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Tue, 3 Aug 2021 13:49:32 +0300 Subject: [PATCH 07/13] License header fix --- .../org/thingsboard/server/service/edge/rpc/EdgeProtoUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeProtoUtils.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeProtoUtils.java index f8065758ba..a9dfac4df7 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeProtoUtils.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeProtoUtils.java @@ -5,7 +5,7 @@ * 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 + * 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, From a3add4dc9b34057759e2c151196b46eeec9b0e14 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Tue, 3 Aug 2021 14:34:16 +0300 Subject: [PATCH 08/13] Use awailability instead of loop --- .../BaseEdgeEventControllerTest.java | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/controller/BaseEdgeEventControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseEdgeEventControllerTest.java index c07a499f83..0cafa96658 100644 --- a/application/src/test/java/org/thingsboard/server/controller/BaseEdgeEventControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseEdgeEventControllerTest.java @@ -17,6 +17,7 @@ package org.thingsboard.server.controller; import com.fasterxml.jackson.core.type.TypeReference; import lombok.extern.slf4j.Slf4j; +import org.awaitility.Awaitility; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -28,13 +29,14 @@ import org.thingsboard.server.common.data.asset.Asset; import org.thingsboard.server.common.data.edge.Edge; import org.thingsboard.server.common.data.edge.EdgeEvent; import org.thingsboard.server.common.data.edge.EdgeEventType; -import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.TimePageLink; import org.thingsboard.server.common.data.relation.EntityRelation; import org.thingsboard.server.common.data.security.Authority; import java.util.List; +import java.util.concurrent.TimeUnit; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -83,34 +85,37 @@ public class BaseEdgeEventControllerTest extends AbstractControllerTest { Device device = constructDevice("TestDevice", "default"); Device savedDevice = doPost("/api/device", device, Device.class); - doPost("/api/edge/" + edge.getId().toString() + "/device/" + savedDevice.getId().toString(), Device.class); + final EdgeId edgeId = edge.getId(); + doPost("/api/edge/" + edgeId.toString() + "/device/" + savedDevice.getId().toString(), Device.class); Asset asset = constructAsset("TestAsset", "default"); Asset savedAsset = doPost("/api/asset", asset, Asset.class); - doPost("/api/edge/" + edge.getId().toString() + "/asset/" + savedAsset.getId().toString(), Asset.class); + doPost("/api/edge/" + edgeId.toString() + "/asset/" + savedAsset.getId().toString(), Asset.class); EntityRelation relation = new EntityRelation(savedAsset.getId(), savedDevice.getId(), EntityRelation.CONTAINS_TYPE); doPost("/api/relation", relation); - // wait while edge event for the relation entity persisted to DB - Thread.sleep(100); - List edgeEvents; - int attempt = 1; - do { - edgeEvents = doGetTypedWithTimePageLink("/api/edge/" + edge.getId().toString() + "/events?", - new TypeReference>() {}, new TimePageLink(4)).getData(); - attempt++; - Thread.sleep(100); - } while (edgeEvents.size() != 4 && attempt < 5); - Assert.assertEquals(4, edgeEvents.size()); + Awaitility.await() + .atMost(30, TimeUnit.SECONDS) + .until(() -> { + List edgeEvents = findEdgeEvents(edgeId); + return edgeEvents.size() == 4; + }); + List edgeEvents = findEdgeEvents(edgeId); Assert.assertTrue(edgeEvents.stream().anyMatch(ee -> EdgeEventType.RULE_CHAIN.equals(ee.getType()))); Assert.assertTrue(edgeEvents.stream().anyMatch(ee -> EdgeEventType.DEVICE.equals(ee.getType()))); Assert.assertTrue(edgeEvents.stream().anyMatch(ee -> EdgeEventType.ASSET.equals(ee.getType()))); Assert.assertTrue(edgeEvents.stream().anyMatch(ee -> EdgeEventType.RELATION.equals(ee.getType()))); } + private List findEdgeEvents(EdgeId edgeId) throws Exception { + return doGetTypedWithTimePageLink("/api/edge/" + edgeId.toString() + "/events?", + new TypeReference>() { + }, new TimePageLink(4)).getData(); + } + private Device constructDevice(String name, String type) { Device device = new Device(); device.setName(name); From 7d1a849047663a20ffffe1481df2ee623e7fbf56 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Tue, 3 Aug 2021 14:39:23 +0300 Subject: [PATCH 09/13] Increased fetch size --- .../server/controller/BaseEdgeEventControllerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/src/test/java/org/thingsboard/server/controller/BaseEdgeEventControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseEdgeEventControllerTest.java index 0cafa96658..b809b9cbc5 100644 --- a/application/src/test/java/org/thingsboard/server/controller/BaseEdgeEventControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseEdgeEventControllerTest.java @@ -113,7 +113,7 @@ public class BaseEdgeEventControllerTest extends AbstractControllerTest { private List findEdgeEvents(EdgeId edgeId) throws Exception { return doGetTypedWithTimePageLink("/api/edge/" + edgeId.toString() + "/events?", new TypeReference>() { - }, new TimePageLink(4)).getData(); + }, new TimePageLink(10)).getData(); } private Device constructDevice(String name, String type) { From 5557406f07cf6650a9b768195330d724f6827783 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Wed, 4 Aug 2021 09:45:16 +0300 Subject: [PATCH 10/13] Added alarm id for future needs --- .../rpc/constructor/AlarmMsgConstructor.java | 2 ++ .../rpc/processor/AlarmEdgeProcessor.java | 1 + common/edge-api/src/main/proto/edge.proto | 26 ++++++++++--------- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/AlarmMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/AlarmMsgConstructor.java index c1fc9f0585..039280a76c 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/AlarmMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/AlarmMsgConstructor.java @@ -58,6 +58,8 @@ public class AlarmMsgConstructor { } AlarmUpdateMsg.Builder builder = AlarmUpdateMsg.newBuilder() .setMsgType(msgType) + .setIdMSB(alarm.getId().getId().getMostSignificantBits()) + .setIdLSB(alarm.getId().getId().getLeastSignificantBits()) .setName(alarm.getName()) .setType(alarm.getType()) .setOriginatorName(entityName) diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/AlarmEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/AlarmEdgeProcessor.java index c2e5dc2e3e..f6525640d4 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/AlarmEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/AlarmEdgeProcessor.java @@ -54,6 +54,7 @@ public class AlarmEdgeProcessor extends BaseEdgeProcessor { EntityId originatorId = getAlarmOriginator(tenantId, alarmUpdateMsg.getOriginatorName(), EntityType.valueOf(alarmUpdateMsg.getOriginatorType())); if (originatorId == null) { + log.warn("Originator not found for the alarm msg {}", alarmUpdateMsg); return Futures.immediateFuture(null); } try { diff --git a/common/edge-api/src/main/proto/edge.proto b/common/edge-api/src/main/proto/edge.proto index 11f6f0e343..af041151c6 100644 --- a/common/edge-api/src/main/proto/edge.proto +++ b/common/edge-api/src/main/proto/edge.proto @@ -250,18 +250,20 @@ message EntityViewUpdateMsg { message AlarmUpdateMsg { UpdateMsgType msgType = 1; - string name = 2; - string type = 3; - string originatorType = 4; - string originatorName = 5; - string severity = 6; - string status = 7; - int64 startTs = 8; - int64 endTs = 9; - int64 ackTs = 10; - int64 clearTs = 11; - string details = 12; - bool propagate = 13; + int64 idMSB = 2; + int64 idLSB = 3; + string name = 4; + string type = 5; + string originatorType = 6; + string originatorName = 7; + string severity = 8; + string status = 9; + int64 startTs = 10; + int64 endTs = 11; + int64 ackTs = 12; + int64 clearTs = 13; + string details = 14; + bool propagate = 15; } message CustomerUpdateMsg { From 1297fef550e8789902b49e1c55d2b4e6f919fd18 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Wed, 4 Aug 2021 12:17:16 +0300 Subject: [PATCH 11/13] Fixed alarm delete functionality on edge --- .../server/controller/AlarmController.java | 8 +- .../server/controller/BaseController.java | 14 ++- .../edge/DefaultEdgeNotificationService.java | 1 + .../service/edge/rpc/EdgeGrpcSession.java | 2 +- .../rpc/processor/AlarmEdgeProcessor.java | 108 +++++++++++------- .../thingsboard/rest/client/RestClient.java | 2 +- 6 files changed, 90 insertions(+), 45 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/controller/AlarmController.java b/application/src/main/java/org/thingsboard/server/controller/AlarmController.java index f0af59c7bc..7bbc84fb32 100644 --- a/application/src/main/java/org/thingsboard/server/controller/AlarmController.java +++ b/application/src/main/java/org/thingsboard/server/controller/AlarmController.java @@ -38,6 +38,7 @@ import org.thingsboard.server.common.data.edge.EdgeEventActionType; import org.thingsboard.server.common.data.exception.ThingsboardErrorCode; import org.thingsboard.server.common.data.exception.ThingsboardException; import org.thingsboard.server.common.data.id.AlarmId; +import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.EntityIdFactory; import org.thingsboard.server.common.data.page.PageData; @@ -46,6 +47,8 @@ import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.service.security.permission.Operation; import org.thingsboard.server.service.security.permission.Resource; +import java.util.List; + @RestController @TbCoreComponent @RequestMapping("/api") @@ -112,10 +115,13 @@ public class AlarmController extends BaseController { AlarmId alarmId = new AlarmId(toUUID(strAlarmId)); Alarm alarm = checkAlarmId(alarmId, Operation.WRITE); + List relatedEdgeIds = findRelatedEdgeIds(getTenantId(), alarm.getOriginator()); + logEntityAction(alarm.getOriginator(), alarm, getCurrentUser().getCustomerId(), ActionType.ALARM_DELETE, null); - sendEntityNotificationMsg(getTenantId(), alarmId, EdgeEventActionType.DELETED); + + sendAlarmDeleteNotificationMsg(getTenantId(), alarmId, relatedEdgeIds, alarm); return alarmService.deleteAlarm(getTenantId(), alarmId); } catch (Exception e) { diff --git a/application/src/main/java/org/thingsboard/server/controller/BaseController.java b/application/src/main/java/org/thingsboard/server/controller/BaseController.java index 267cfe75e3..09281a0ec0 100644 --- a/application/src/main/java/org/thingsboard/server/controller/BaseController.java +++ b/application/src/main/java/org/thingsboard/server/controller/BaseController.java @@ -852,13 +852,25 @@ public abstract class BaseController { } protected void sendDeleteNotificationMsg(TenantId tenantId, EntityId entityId, List edgeIds) { + sendDeleteNotificationMsg(tenantId, entityId, edgeIds, null); + } + + protected void sendDeleteNotificationMsg(TenantId tenantId, EntityId entityId, List edgeIds, String body) { if (edgeIds != null && !edgeIds.isEmpty()) { for (EdgeId edgeId : edgeIds) { - sendNotificationMsgToEdgeService(tenantId, edgeId, entityId, null, null, EdgeEventActionType.DELETED); + sendNotificationMsgToEdgeService(tenantId, edgeId, entityId, body, null, EdgeEventActionType.DELETED); } } } + protected void sendAlarmDeleteNotificationMsg(TenantId tenantId, EntityId entityId, List edgeIds, Alarm alarm) { + try { + sendDeleteNotificationMsg(tenantId, entityId, edgeIds, json.writeValueAsString(alarm)); + } catch (Exception e) { + log.warn("Failed to push delete alarm msg to core: {}", alarm, e); + } + } + protected void sendEntityAssignToCustomerNotificationMsg(TenantId tenantId, EntityId entityId, CustomerId customerId, EdgeEventActionType action) { try { sendNotificationMsgToEdgeService(tenantId, null, entityId, json.writeValueAsString(customerId), null, action); 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 f45fd80068..8a1d70751b 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 @@ -121,6 +121,7 @@ public class DefaultEdgeNotificationService implements EdgeNotificationService { @Override public void pushNotificationToEdge(TransportProtos.EdgeNotificationMsgProto edgeNotificationMsg, TbCallback callback) { + log.trace("Pushing notification to edge {}", edgeNotificationMsg); try { TenantId tenantId = new TenantId(new UUID(edgeNotificationMsg.getTenantIdMSB(), edgeNotificationMsg.getTenantIdLSB())); EdgeEventType type = EdgeEventType.valueOf(edgeNotificationMsg.getType()); 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 bec187a69b..46b36ca99f 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 @@ -527,7 +527,7 @@ public final class EdgeGrpcSession implements Closeable { case RULE_CHAIN_METADATA: return ctx.getRuleChainProcessor().processRuleChainMetadataToEdge(edgeEvent, msgType); case ALARM: - return ctx.getAlarmProcessor().processAlarmToEdge(edge, edgeEvent, msgType); + return ctx.getAlarmProcessor().processAlarmToEdge(edge, edgeEvent, msgType, action); case USER: return ctx.getUserProcessor().processUserToEdge(edge, edgeEvent, msgType, action); case RELATION: diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/AlarmEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/AlarmEdgeProcessor.java index f6525640d4..90d30737f3 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/AlarmEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/AlarmEdgeProcessor.java @@ -15,6 +15,7 @@ */ package org.thingsboard.server.service.edge.rpc.processor; +import com.fasterxml.jackson.core.JsonProcessingException; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; @@ -114,59 +115,84 @@ public class AlarmEdgeProcessor extends BaseEdgeProcessor { } } - public DownlinkMsg processAlarmToEdge(Edge edge, EdgeEvent edgeEvent, UpdateMsgType msgType) { + public DownlinkMsg processAlarmToEdge(Edge edge, EdgeEvent edgeEvent, UpdateMsgType msgType, EdgeEventActionType action) { + AlarmId alarmId = new AlarmId(edgeEvent.getEntityId()); DownlinkMsg downlinkMsg = null; - try { - AlarmId alarmId = new AlarmId(edgeEvent.getEntityId()); - Alarm alarm = alarmService.findAlarmByIdAsync(edgeEvent.getTenantId(), alarmId).get(); - if (alarm != null) { + switch (action) { + case ADDED: + case UPDATED: + case ALARM_ACK: + case ALARM_CLEAR: + try { + Alarm alarm = alarmService.findAlarmByIdAsync(edgeEvent.getTenantId(), alarmId).get(); + if (alarm != null) { + downlinkMsg = DownlinkMsg.newBuilder() + .setDownlinkMsgId(EdgeUtils.nextPositiveInt()) + .addAlarmUpdateMsg(alarmMsgConstructor.constructAlarmUpdatedMsg(edge.getTenantId(), msgType, alarm)) + .build(); + } + } catch (Exception e) { + log.error("Can't process alarm msg [{}] [{}]", edgeEvent, msgType, e); + } + break; + case DELETED: + Alarm alarm = mapper.convertValue(edgeEvent.getBody(), Alarm.class); + AlarmUpdateMsg alarmUpdateMsg = + alarmMsgConstructor.constructAlarmUpdatedMsg(edge.getTenantId(), msgType, alarm); downlinkMsg = DownlinkMsg.newBuilder() .setDownlinkMsgId(EdgeUtils.nextPositiveInt()) - .addAlarmUpdateMsg(alarmMsgConstructor.constructAlarmUpdatedMsg(edge.getTenantId(), msgType, alarm)) + .addAlarmUpdateMsg(alarmUpdateMsg) .build(); - } - } catch (Exception e) { - log.error("Can't process alarm msg [{}] [{}]", edgeEvent, msgType, e); + break; } return downlinkMsg; } - public void processAlarmNotification(TenantId tenantId, TransportProtos.EdgeNotificationMsgProto edgeNotificationMsg) { + public void processAlarmNotification(TenantId tenantId, TransportProtos.EdgeNotificationMsgProto edgeNotificationMsg) throws JsonProcessingException { + EdgeEventActionType actionType = EdgeEventActionType.valueOf(edgeNotificationMsg.getAction()); AlarmId alarmId = new AlarmId(new UUID(edgeNotificationMsg.getEntityIdMSB(), edgeNotificationMsg.getEntityIdLSB())); - ListenableFuture alarmFuture = alarmService.findAlarmByIdAsync(tenantId, alarmId); - Futures.addCallback(alarmFuture, new FutureCallback() { - @Override - public void onSuccess(@Nullable Alarm alarm) { - if (alarm != null) { - EdgeEventType type = EdgeUtils.getEdgeEventTypeByEntityType(alarm.getOriginator().getEntityType()); - if (type != null) { - PageLink pageLink = new PageLink(DEFAULT_PAGE_SIZE); - PageData pageData; - do { - pageData = edgeService.findRelatedEdgeIdsByEntityId(tenantId, alarm.getOriginator(), pageLink); - if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) { - for (EdgeId edgeId : pageData.getData()) { - saveEdgeEvent(tenantId, - edgeId, - EdgeEventType.ALARM, - EdgeEventActionType.valueOf(edgeNotificationMsg.getAction()), - alarmId, - null); - } - if (pageData.hasNext()) { - pageLink = pageLink.nextPageLink(); - } + switch (actionType) { + case DELETED: + EdgeId edgeId = new EdgeId(new UUID(edgeNotificationMsg.getEdgeIdMSB(), edgeNotificationMsg.getEdgeIdLSB())); + Alarm alarm = mapper.readValue(edgeNotificationMsg.getBody(), Alarm.class); + saveEdgeEvent(tenantId, edgeId, EdgeEventType.ALARM, actionType, alarmId, mapper.valueToTree(alarm)); + break; + default: + ListenableFuture alarmFuture = alarmService.findAlarmByIdAsync(tenantId, alarmId); + Futures.addCallback(alarmFuture, new FutureCallback() { + @Override + public void onSuccess(@Nullable Alarm alarm) { + if (alarm != null) { + EdgeEventType type = EdgeUtils.getEdgeEventTypeByEntityType(alarm.getOriginator().getEntityType()); + if (type != null) { + PageLink pageLink = new PageLink(DEFAULT_PAGE_SIZE); + PageData pageData; + do { + pageData = edgeService.findRelatedEdgeIdsByEntityId(tenantId, alarm.getOriginator(), pageLink); + if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) { + for (EdgeId edgeId : pageData.getData()) { + saveEdgeEvent(tenantId, + edgeId, + EdgeEventType.ALARM, + EdgeEventActionType.valueOf(edgeNotificationMsg.getAction()), + alarmId, + null); + } + if (pageData.hasNext()) { + pageLink = pageLink.nextPageLink(); + } + } + } while (pageData != null && pageData.hasNext()); } - } while (pageData != null && pageData.hasNext()); + } } - } - } - @Override - public void onFailure(Throwable t) { - log.warn("[{}] can't find alarm by id [{}] {}", tenantId.getId(), alarmId.getId(), t); - } - }, dbCallbackExecutorService); + @Override + public void onFailure(Throwable t) { + log.warn("[{}] can't find alarm by id [{}] {}", tenantId.getId(), alarmId.getId(), t); + } + }, dbCallbackExecutorService); + } } } 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 5ac86c08cf..30dc57eeb7 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 @@ -337,7 +337,7 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable { addTimePageLinkToParam(params, pageLink); return restTemplate.exchange( - baseURL + urlSecondPart + getTimeUrlParams(pageLink), + baseURL + urlSecondPart + "&" + getTimeUrlParams(pageLink), HttpMethod.GET, HttpEntity.EMPTY, new ParameterizedTypeReference>() { From e974644d27240b95aef0330f883cdb79bc239c70 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Wed, 4 Aug 2021 13:05:18 +0300 Subject: [PATCH 12/13] Fixed alarm test - deleted msg pushed to edge --- .../java/org/thingsboard/server/edge/BaseEdgeTest.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java index 37d8b58f28..d2267facfb 100644 --- a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java @@ -734,7 +734,15 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { edgeImitator.expectMessageAmount(1); doDelete("/api/alarm/" + savedAlarm.getId().getId().toString()) .andExpect(status().isOk()); - Assert.assertFalse(edgeImitator.waitForMessages(1)); + Assert.assertTrue(edgeImitator.waitForMessages(1)); + latestMessage = edgeImitator.getLatestMessage(); + Assert.assertTrue(latestMessage instanceof AlarmUpdateMsg); + alarmUpdateMsg = (AlarmUpdateMsg) latestMessage; + Assert.assertEquals(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE, alarmUpdateMsg.getMsgType()); + Assert.assertEquals(alarmUpdateMsg.getType(), savedAlarm.getType()); + Assert.assertEquals(alarmUpdateMsg.getName(), savedAlarm.getName()); + Assert.assertEquals(alarmUpdateMsg.getOriginatorName(), device.getName()); + Assert.assertEquals(alarmUpdateMsg.getStatus(), AlarmStatus.CLEARED_ACK.name()); log.info("Alarms tested successfully"); } From 2558b2ecda6a9aec4573f21ceafed66bc716e6cf Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Thu, 5 Aug 2021 15:11:08 +0300 Subject: [PATCH 13/13] Device credential value can be null --- .../service/edge/rpc/constructor/DeviceMsgConstructor.java | 2 +- .../service/edge/rpc/processor/DeviceEdgeProcessor.java | 4 +++- common/edge-api/src/main/proto/edge.proto | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceMsgConstructor.java index 02332eb307..1506e2f4e8 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceMsgConstructor.java @@ -77,7 +77,7 @@ public class DeviceMsgConstructor { .setCredentialsId(deviceCredentials.getCredentialsId()); } if (deviceCredentials.getCredentialsValue() != null) { - builder.setCredentialsValue(deviceCredentials.getCredentialsValue()); + builder.setCredentialsValue(getStringValue(deviceCredentials.getCredentialsValue())); } return builder.build(); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/DeviceEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/DeviceEdgeProcessor.java index b59f192d97..c036eebc16 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/DeviceEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/DeviceEdgeProcessor.java @@ -144,7 +144,9 @@ public class DeviceEdgeProcessor extends BaseEdgeProcessor { DeviceCredentials deviceCredentials = deviceCredentialsService.findDeviceCredentialsByDeviceId(tenantId, device.getId()); deviceCredentials.setCredentialsType(DeviceCredentialsType.valueOf(deviceCredentialsUpdateMsg.getCredentialsType())); deviceCredentials.setCredentialsId(deviceCredentialsUpdateMsg.getCredentialsId()); - deviceCredentials.setCredentialsValue(deviceCredentialsUpdateMsg.getCredentialsValue()); + if (deviceCredentialsUpdateMsg.hasCredentialsValue()) { + deviceCredentials.setCredentialsValue(deviceCredentialsUpdateMsg.getCredentialsValue().getValue()); + } deviceCredentialsService.updateDeviceCredentials(tenantId, deviceCredentials); } catch (Exception e) { log.error("Can't update device credentials for device [{}], deviceCredentialsUpdateMsg [{}]", device.getName(), deviceCredentialsUpdateMsg, e); diff --git a/common/edge-api/src/main/proto/edge.proto b/common/edge-api/src/main/proto/edge.proto index af041151c6..06eec3c2ce 100644 --- a/common/edge-api/src/main/proto/edge.proto +++ b/common/edge-api/src/main/proto/edge.proto @@ -219,7 +219,7 @@ message DeviceCredentialsUpdateMsg { int64 deviceIdLSB = 2; string credentialsType = 3; string credentialsId = 4; - string credentialsValue = 5; + google.protobuf.StringValue credentialsValue = 5; } message AssetUpdateMsg {