From 4a60912cd90837cb0a6c201fb2a235a2427b7bc3 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Thu, 4 Aug 2022 14:12:07 +0300 Subject: [PATCH 1/3] Propagate firmware id to device and device profile --- .../rpc/constructor/DeviceMsgConstructor.java | 4 ++ .../DeviceProfileMsgConstructor.java | 6 ++- .../constructor/OtaPackageMsgConstructor.java | 7 ++- .../thingsboard/server/edge/BaseEdgeTest.java | 51 +++++++++++++++---- common/edge-api/src/main/proto/edge.proto | 4 ++ 5 files changed, 59 insertions(+), 13 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 64f48345fe..c8fdcc4537 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 @@ -59,6 +59,10 @@ public class DeviceMsgConstructor { if (device.getAdditionalInfo() != null) { builder.setAdditionalInfo(JacksonUtil.toString(device.getAdditionalInfo())); } + if (device.getFirmwareId() != null) { + builder.setFirmwareIdMSB(device.getFirmwareId().getId().getMostSignificantBits()) + .setFirmwareIdLSB(device.getFirmwareId().getId().getLeastSignificantBits()); + } if (conflictName != null) { builder.setConflictName(conflictName); } 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 4e12fa3366..cb0f3145a8 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 @@ -20,9 +20,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.id.DeviceProfileId; -import org.thingsboard.server.queue.util.DataDecodingEncodingService; import org.thingsboard.server.gen.edge.v1.DeviceProfileUpdateMsg; import org.thingsboard.server.gen.edge.v1.UpdateMsgType; +import org.thingsboard.server.queue.util.DataDecodingEncodingService; import org.thingsboard.server.queue.util.TbCoreComponent; import java.nio.charset.StandardCharsets; @@ -66,6 +66,10 @@ public class DeviceProfileMsgConstructor { if (deviceProfile.getImage() != null) { builder.setImage(ByteString.copyFrom(deviceProfile.getImage().getBytes(StandardCharsets.UTF_8))); } + if (deviceProfile.getFirmwareId() != null) { + builder.setFirmwareIdMSB(deviceProfile.getFirmwareId().getId().getMostSignificantBits()) + .setFirmwareIdLSB(deviceProfile.getFirmwareId().getId().getLeastSignificantBits()); + } return builder.build(); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/OtaPackageMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/OtaPackageMsgConstructor.java index be38079d1e..35a1a6e0ac 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/OtaPackageMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/OtaPackageMsgConstructor.java @@ -33,13 +33,16 @@ public class OtaPackageMsgConstructor { .setMsgType(msgType) .setIdMSB(otaPackage.getId().getId().getMostSignificantBits()) .setIdLSB(otaPackage.getId().getId().getLeastSignificantBits()) - .setDeviceProfileIdMSB(otaPackage.getDeviceProfileId().getId().getMostSignificantBits()) - .setDeviceProfileIdLSB(otaPackage.getDeviceProfileId().getId().getLeastSignificantBits()) .setType(otaPackage.getType().name()) .setTitle(otaPackage.getTitle()) .setVersion(otaPackage.getVersion()) .setTag(otaPackage.getTag()); + if (otaPackage.getDeviceProfileId() != null) { + builder.setDeviceProfileIdMSB(otaPackage.getDeviceProfileId().getId().getMostSignificantBits()) + .setDeviceProfileIdLSB(otaPackage.getDeviceProfileId().getId().getLeastSignificantBits()); + } + if (otaPackage.getUrl() != null) { builder.setUrl(otaPackage.getUrl()); } 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 4bcb9c6d59..c347ea13d9 100644 --- a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java @@ -71,10 +71,10 @@ import org.thingsboard.server.common.data.edge.Edge; import org.thingsboard.server.common.data.edge.EdgeEvent; import org.thingsboard.server.common.data.edge.EdgeEventActionType; import org.thingsboard.server.common.data.edge.EdgeEventType; +import org.thingsboard.server.common.data.id.DeviceProfileId; 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.id.QueueId; import org.thingsboard.server.common.data.id.RuleChainId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.ota.ChecksumAlgorithm; @@ -207,13 +207,6 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { verifyEdgeConnectionAndInitialData(); } - private QueueId getRandomQueueId() throws Exception { - List ruleEngineQueues = doGetTypedWithPageLink("/api/queues?serviceType={serviceType}&", - new TypeReference>() {}, new PageLink(100), ServiceType.TB_RULE_ENGINE.name()) - .getData(); - return ruleEngineQueues.get(0).getId(); - } - @After public void afterTest() throws Exception { try { @@ -388,6 +381,21 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { Assert.assertEquals(deviceProfileUpdateMsg.getIdLSB(), deviceProfile.getUuidId().getLeastSignificantBits()); // 2 + OtaPackageInfo firmwareOtaPackageInfo = saveOtaPackageInfo(deviceProfile.getId()); + edgeImitator.expectMessageAmount(1); + Assert.assertTrue(edgeImitator.waitForMessages()); + + deviceProfile.setFirmwareId(firmwareOtaPackageInfo.getId()); + edgeImitator.expectMessageAmount(1); + deviceProfile = doPost("/api/deviceProfile", deviceProfile, DeviceProfile.class); + Assert.assertTrue(edgeImitator.waitForMessages()); + latestMessage = edgeImitator.getLatestMessage(); + Assert.assertTrue(latestMessage instanceof DeviceProfileUpdateMsg); + deviceProfileUpdateMsg = (DeviceProfileUpdateMsg) latestMessage; + Assert.assertEquals(firmwareOtaPackageInfo.getUuidId().getMostSignificantBits(), deviceProfileUpdateMsg.getFirmwareIdMSB()); + Assert.assertEquals(firmwareOtaPackageInfo.getUuidId().getLeastSignificantBits(), deviceProfileUpdateMsg.getFirmwareIdLSB()); + + // 3 edgeImitator.expectMessageAmount(1); doDelete("/api/deviceProfile/" + deviceProfile.getUuidId()) .andExpect(status().isOk()); @@ -1866,8 +1874,15 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { // Utility methods private Device saveDeviceOnCloudAndVerifyDeliveryToEdge() throws Exception { + OtaPackageInfo firmwareOtaPackageInfo = saveOtaPackageInfo(thermostatDeviceProfile.getId()); edgeImitator.expectMessageAmount(1); - Device savedDevice = saveDevice(RandomStringUtils.randomAlphanumeric(15), "Default"); + Assert.assertTrue(edgeImitator.waitForMessages()); + + edgeImitator.expectMessageAmount(1); + Device savedDevice = saveDevice(RandomStringUtils.randomAlphanumeric(15), thermostatDeviceProfile.getName()); + savedDevice.setFirmwareId(firmwareOtaPackageInfo.getId()); + savedDevice = doPost("/api/device", savedDevice, Device.class); + doPost("/api/edge/" + edge.getUuidId() + "/device/" + savedDevice.getUuidId(), Device.class); Assert.assertTrue(edgeImitator.waitForMessages()); @@ -1879,6 +1894,8 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { Assert.assertEquals(deviceUpdateMsg.getIdLSB(), savedDevice.getUuidId().getLeastSignificantBits()); Assert.assertEquals(deviceUpdateMsg.getName(), savedDevice.getName()); Assert.assertEquals(deviceUpdateMsg.getType(), savedDevice.getType()); + Assert.assertEquals(firmwareOtaPackageInfo.getUuidId().getMostSignificantBits(), deviceUpdateMsg.getFirmwareIdMSB()); + Assert.assertEquals(firmwareOtaPackageInfo.getUuidId().getLeastSignificantBits(), deviceUpdateMsg.getFirmwareIdLSB()); return savedDevice; } @@ -1904,7 +1921,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { return asset; } - private Device saveDevice(String deviceName, String type) throws Exception { + private Device saveDevice(String deviceName, String type) { Device device = new Device(); device.setName(deviceName); device.setType(type); @@ -1918,6 +1935,20 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { return doPost("/api/asset", asset, Asset.class); } + private OtaPackageInfo saveOtaPackageInfo(DeviceProfileId deviceProfileId) { + SaveOtaPackageInfoRequest firmwareInfo = new SaveOtaPackageInfoRequest(); + firmwareInfo.setDeviceProfileId(deviceProfileId); + firmwareInfo.setType(FIRMWARE); + firmwareInfo.setTitle("Firmware Edge"); + firmwareInfo.setVersion("v1.0"); + firmwareInfo.setTag("My firmware #1 v1.0"); + firmwareInfo.setUsesUrl(true); + firmwareInfo.setUrl("http://localhost:8080/v1/package"); + firmwareInfo.setAdditionalInfo(JacksonUtil.newObjectNode()); + firmwareInfo.setChecksumAlgorithm(ChecksumAlgorithm.SHA256); + return doPost("/api/otaPackage", firmwareInfo, OtaPackageInfo.class); + } + private EdgeEvent constructEdgeEvent(TenantId tenantId, EdgeId edgeId, EdgeEventActionType edgeEventAction, UUID entityId, EdgeEventType edgeEventType, JsonNode entityBody) { EdgeEvent edgeEvent = new EdgeEvent(); edgeEvent.setEdgeId(edgeId); diff --git a/common/edge-api/src/main/proto/edge.proto b/common/edge-api/src/main/proto/edge.proto index 4b132d8c76..7e18abcaec 100644 --- a/common/edge-api/src/main/proto/edge.proto +++ b/common/edge-api/src/main/proto/edge.proto @@ -198,6 +198,8 @@ message DeviceUpdateMsg { optional string label = 10; optional string additionalInfo = 11; optional string conflictName = 12; + int64 firmwareIdMSB = 13; + int64 firmwareIdLSB = 14; } message DeviceProfileUpdateMsg { @@ -216,6 +218,8 @@ message DeviceProfileUpdateMsg { bytes profileDataBytes = 13; optional string provisionDeviceKey = 14; optional bytes image = 15; + int64 firmwareIdMSB = 16; + int64 firmwareIdLSB = 17; } message DeviceCredentialsUpdateMsg { From a967ea82d462c3cc40b32946ddce3cd1e77318e9 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Thu, 4 Aug 2022 14:13:53 +0300 Subject: [PATCH 2/3] firmware id optional --- common/edge-api/src/main/proto/edge.proto | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/common/edge-api/src/main/proto/edge.proto b/common/edge-api/src/main/proto/edge.proto index 7e18abcaec..f7ecbfcb8d 100644 --- a/common/edge-api/src/main/proto/edge.proto +++ b/common/edge-api/src/main/proto/edge.proto @@ -198,8 +198,8 @@ message DeviceUpdateMsg { optional string label = 10; optional string additionalInfo = 11; optional string conflictName = 12; - int64 firmwareIdMSB = 13; - int64 firmwareIdLSB = 14; + optional int64 firmwareIdMSB = 13; + optional int64 firmwareIdLSB = 14; } message DeviceProfileUpdateMsg { @@ -218,8 +218,8 @@ message DeviceProfileUpdateMsg { bytes profileDataBytes = 13; optional string provisionDeviceKey = 14; optional bytes image = 15; - int64 firmwareIdMSB = 16; - int64 firmwareIdLSB = 17; + optional int64 firmwareIdMSB = 16; + optional int64 firmwareIdLSB = 17; } message DeviceCredentialsUpdateMsg { From 4b814ee80d7aeb645c22953cd25b1f1172759aab Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Thu, 4 Aug 2022 16:23:21 +0300 Subject: [PATCH 3/3] Fixed Edge base test --- .../org/thingsboard/server/edge/BaseEdgeTest.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 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 c347ea13d9..2cc217e0c1 100644 --- a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java @@ -1874,22 +1874,25 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { // Utility methods private Device saveDeviceOnCloudAndVerifyDeliveryToEdge() throws Exception { - OtaPackageInfo firmwareOtaPackageInfo = saveOtaPackageInfo(thermostatDeviceProfile.getId()); edgeImitator.expectMessageAmount(1); + OtaPackageInfo firmwareOtaPackageInfo = saveOtaPackageInfo(thermostatDeviceProfile.getId()); Assert.assertTrue(edgeImitator.waitForMessages()); - edgeImitator.expectMessageAmount(1); Device savedDevice = saveDevice(RandomStringUtils.randomAlphanumeric(15), thermostatDeviceProfile.getName()); savedDevice.setFirmwareId(firmwareOtaPackageInfo.getId()); savedDevice = doPost("/api/device", savedDevice, Device.class); + // wait until device UPDATED event is sent to edge notification service + // to avoid edge notification service to send device UPDATED event before ASSIGNED_TO_EDGE + Thread.sleep(500); + + edgeImitator.expectMessageAmount(1); doPost("/api/edge/" + edge.getUuidId() + "/device/" + savedDevice.getUuidId(), Device.class); Assert.assertTrue(edgeImitator.waitForMessages()); AbstractMessage latestMessage = edgeImitator.getLatestMessage(); Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg); DeviceUpdateMsg deviceUpdateMsg = (DeviceUpdateMsg) latestMessage; - Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, deviceUpdateMsg.getMsgType()); Assert.assertEquals(deviceUpdateMsg.getIdMSB(), savedDevice.getUuidId().getMostSignificantBits()); Assert.assertEquals(deviceUpdateMsg.getIdLSB(), savedDevice.getUuidId().getLeastSignificantBits()); Assert.assertEquals(deviceUpdateMsg.getName(), savedDevice.getName()); @@ -1939,7 +1942,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { SaveOtaPackageInfoRequest firmwareInfo = new SaveOtaPackageInfoRequest(); firmwareInfo.setDeviceProfileId(deviceProfileId); firmwareInfo.setType(FIRMWARE); - firmwareInfo.setTitle("Firmware Edge"); + firmwareInfo.setTitle("Firmware Edge " + RandomStringUtils.randomAlphanumeric(3)); firmwareInfo.setVersion("v1.0"); firmwareInfo.setTag("My firmware #1 v1.0"); firmwareInfo.setUsesUrl(true);