Browse Source

Fix resourceEdgeTest

pull/9617/head
Andrii Landiak 3 years ago
parent
commit
64349f538e
  1. 2
      application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java
  2. 51
      application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/resource/BaseResourceProcessor.java
  3. 5
      application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/resource/ResourceEdgeProcessor.java
  4. 14
      application/src/test/java/org/thingsboard/server/edge/AbstractEdgeTest.java
  5. 57
      application/src/test/java/org/thingsboard/server/edge/ResourceEdgeTest.java

2
application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java

@ -715,7 +715,7 @@ public final class EdgeGrpcSession implements Closeable {
}
if (uplinkMsg.getResourceUpdateMsgCount() > 0) {
for (ResourceUpdateMsg resourceUpdateMsg : uplinkMsg.getResourceUpdateMsgList()) {
result.add(ctx.getResourceEdgeProcessor().processResourceMsgFromEdge(edge.getTenantId(), edge, resourceUpdateMsg));
result.add(ctx.getResourceEdgeProcessor().processResourceMsgFromEdge(edge.getTenantId(), edge, resourceUpdateMsg, this.edgeVersion));
}
}
if (uplinkMsg.getRuleChainMetadataRequestMsgCount() > 0) {

51
application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/resource/BaseResourceProcessor.java

@ -17,6 +17,7 @@ package org.thingsboard.server.service.edge.rpc.processor.resource;
import com.datastax.oss.driver.api.core.uuid.Uuids;
import lombok.extern.slf4j.Slf4j;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.ResourceType;
import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.TbResource;
@ -30,39 +31,37 @@ import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor;
@Slf4j
public abstract class BaseResourceProcessor extends BaseEdgeProcessor {
protected boolean saveOrUpdateTbResource(TenantId tenantId, TbResourceId tbResourceId, ResourceUpdateMsg resourceUpdateMsg) {
protected boolean saveOrUpdateTbResource(TenantId tenantId, TbResourceId tbResourceId, ResourceUpdateMsg resourceUpdateMsg, boolean isEdgeDeprecated) {
boolean resourceKeyUpdated = false;
try {
boolean created = false;
TbResource resource = resourceService.findResourceById(tenantId, tbResourceId);
TbResource resource = isEdgeDeprecated
? createTbResource(tenantId, resourceUpdateMsg)
: JacksonUtil.fromStringIgnoreUnknownProperties(resourceUpdateMsg.getEntity(), TbResource.class);
if (resource == null) {
resource = new TbResource();
if (resourceUpdateMsg.getIsSystem()) {
resource.setTenantId(TenantId.SYS_TENANT_ID);
} else {
resource.setTenantId(tenantId);
}
throw new RuntimeException("[{" + tenantId + "}] resourceUpdateMsg {" + resourceUpdateMsg + " } cannot be converted to resource");
}
boolean created = false;
TbResource resourceById = resourceService.findResourceById(tenantId, tbResourceId);
if (resourceById == null) {
resource.setCreatedTime(Uuids.unixTimestamp(tbResourceId.getId()));
created = true;
resource.setId(null);
} else {
resource.setId(tbResourceId);
}
String resourceKey = resourceUpdateMsg.getResourceKey();
ResourceType resourceType = ResourceType.valueOf(resourceUpdateMsg.getResourceType());
String resourceKey = resource.getResourceKey();
ResourceType resourceType = resource.getResourceType();
PageDataIterable<TbResource> resourcesIterable = new PageDataIterable<>(
link -> resourceService.findTenantResourcesByResourceTypeAndPageLink(tenantId, resourceType, link), 1024);
for (TbResource tbResource : resourcesIterable) {
if (tbResource.getResourceKey().equals(resourceUpdateMsg.getResourceKey()) && !tbResourceId.equals(tbResource.getId())) {
if (tbResource.getResourceKey().equals(resourceKey) && !tbResourceId.equals(tbResource.getId())) {
resourceKey = StringUtils.randomAlphabetic(15) + "_" + resourceKey;
log.warn("[{}] Resource with resource type {} and key {} already exists. Renaming resource key to {}",
tenantId, resourceType, resourceUpdateMsg.getResourceKey(), resourceKey);
tenantId, resourceType, resource.getResourceKey(), resourceKey);
resourceKeyUpdated = true;
}
}
resource.setTitle(resourceUpdateMsg.getTitle());
resource.setResourceKey(resourceKey);
resource.setResourceType(resourceType);
resource.setFileName(resourceUpdateMsg.getFileName());
resource.setData(resourceUpdateMsg.hasData() ? resourceUpdateMsg.getData() : null);
resource.setEtag(resourceUpdateMsg.hasEtag() ? resourceUpdateMsg.getEtag() : null);
resourceValidator.validate(resource, TbResourceInfo::getTenantId);
if (created) {
resource.setId(tbResourceId);
@ -74,4 +73,20 @@ public abstract class BaseResourceProcessor extends BaseEdgeProcessor {
}
return resourceKeyUpdated;
}
private TbResource createTbResource(TenantId tenantId, ResourceUpdateMsg resourceUpdateMsg) {
TbResource resource = new TbResource();
if (resourceUpdateMsg.getIsSystem()) {
resource.setTenantId(TenantId.SYS_TENANT_ID);
} else {
resource.setTenantId(tenantId);
}
resource.setTitle(resourceUpdateMsg.getTitle());
resource.setResourceKey(resourceUpdateMsg.getResourceKey());
resource.setResourceType(ResourceType.valueOf(resourceUpdateMsg.getResourceType()));
resource.setFileName(resourceUpdateMsg.getFileName());
resource.setData(resourceUpdateMsg.hasData() ? resourceUpdateMsg.getData() : null);
resource.setEtag(resourceUpdateMsg.hasEtag() ? resourceUpdateMsg.getEtag() : null);
return resource;
}
}

5
application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/resource/ResourceEdgeProcessor.java

@ -33,6 +33,7 @@ import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.gen.edge.v1.ResourceUpdateMsg;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.queue.util.TbCoreComponent;
import org.thingsboard.server.service.edge.rpc.utils.EdgeVersionUtils;
import java.util.UUID;
@ -41,7 +42,7 @@ import java.util.UUID;
@TbCoreComponent
public class ResourceEdgeProcessor extends BaseResourceProcessor {
public ListenableFuture<Void> processResourceMsgFromEdge(TenantId tenantId, Edge edge, ResourceUpdateMsg resourceUpdateMsg) {
public ListenableFuture<Void> processResourceMsgFromEdge(TenantId tenantId, Edge edge, ResourceUpdateMsg resourceUpdateMsg, EdgeVersion edgeVersion) {
TbResourceId tbResourceId = new TbResourceId(new UUID(resourceUpdateMsg.getIdMSB(), resourceUpdateMsg.getIdLSB()));
try {
edgeSynchronizationManager.getEdgeId().set(edge.getId());
@ -49,7 +50,7 @@ public class ResourceEdgeProcessor extends BaseResourceProcessor {
switch (resourceUpdateMsg.getMsgType()) {
case ENTITY_CREATED_RPC_MESSAGE:
case ENTITY_UPDATED_RPC_MESSAGE:
boolean resourceKeyUpdated = super.saveOrUpdateTbResource(tenantId, tbResourceId, resourceUpdateMsg);
boolean resourceKeyUpdated = super.saveOrUpdateTbResource(tenantId, tbResourceId, resourceUpdateMsg, EdgeVersionUtils.isEdgeVersionOlderThan_3_6_2(edgeVersion));
if (resourceKeyUpdated) {
saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.TB_RESOURCE, EdgeEventActionType.UPDATED, tbResourceId, null);
}

14
application/src/test/java/org/thingsboard/server/edge/AbstractEdgeTest.java

@ -469,6 +469,16 @@ abstract public class AbstractEdgeTest extends AbstractControllerTest {
}
private void validateConnectivityAdminSettings(AdminSettings adminSettings) {
JsonNode jsonNode = adminSettings.getJsonValue();
Assert.assertNotNull(jsonNode.get("http"));
Assert.assertNotNull(jsonNode.get("https"));
Assert.assertNotNull(jsonNode.get("mqtt"));
Assert.assertNotNull(jsonNode.get("mqtts"));
Assert.assertNotNull(jsonNode.get("coap"));
Assert.assertNotNull(jsonNode.get("coaps"));
}
private void validateJwtAdminSettings(AdminSettings adminSettings) {
JsonNode jsonNode = adminSettings.getJsonValue();
Assert.assertNotNull(jsonNode.get("tokenExpirationTime"));
Assert.assertNotNull(jsonNode.get("refreshTokenExpTime"));
@ -476,10 +486,6 @@ abstract public class AbstractEdgeTest extends AbstractControllerTest {
Assert.assertNotNull(jsonNode.get("tokenSigningKey"));
}
private void validateJwtAdminSettings(AdminSettings adminSettings) {
Assert.assertNotNull(adminSettings.getJsonValue().get("baseUrl"));
}
private void validateAssetProfiles(int expectedMsgCnt) throws Exception {
List<AssetProfileUpdateMsg> assetProfileUpdateMsgs = edgeImitator.findAllMessagesByType(AssetProfileUpdateMsg.class);
Assert.assertEquals(expectedMsgCnt, assetProfileUpdateMsgs.size());

57
application/src/test/java/org/thingsboard/server/edge/ResourceEdgeTest.java

@ -19,6 +19,7 @@ import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.google.protobuf.AbstractMessage;
import org.junit.Assert;
import org.junit.Test;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.ResourceType;
import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.TbResource;
@ -58,12 +59,14 @@ public class ResourceEdgeTest extends AbstractEdgeTest {
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, resourceUpdateMsg.getMsgType());
Assert.assertEquals(savedResource.getUuidId().getMostSignificantBits(), resourceUpdateMsg.getIdMSB());
Assert.assertEquals(savedResource.getUuidId().getLeastSignificantBits(), resourceUpdateMsg.getIdLSB());
Assert.assertEquals("Edge Test Resource", resourceUpdateMsg.getTitle());
Assert.assertEquals(ResourceType.JKS.name(), resourceUpdateMsg.getResourceType());
Assert.assertEquals(FILE_NAME, resourceUpdateMsg.getResourceKey());
Assert.assertEquals(FILE_NAME, resourceUpdateMsg.getFileName());
Assert.assertEquals(TEST_DATA, resourceUpdateMsg.getData());
Assert.assertTrue(StringUtils.isNotBlank(resourceUpdateMsg.getEtag()));
TbResource tbResource = JacksonUtil.fromStringIgnoreUnknownProperties(resourceUpdateMsg.getEntity(), TbResource.class);
Assert.assertNotNull(tbResource);
Assert.assertEquals("Edge Test Resource", tbResource.getTitle());
Assert.assertEquals(ResourceType.JKS, tbResource.getResourceType());
Assert.assertEquals(FILE_NAME, tbResource.getResourceKey());
Assert.assertEquals(FILE_NAME, tbResource.getFileName());
Assert.assertEquals(TEST_DATA, tbResource.getData());
Assert.assertTrue(StringUtils.isNotBlank(tbResource.getEtag()));
// update resource
edgeImitator.expectMessageAmount(1);
@ -73,8 +76,10 @@ public class ResourceEdgeTest extends AbstractEdgeTest {
latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof ResourceUpdateMsg);
resourceUpdateMsg = (ResourceUpdateMsg) latestMessage;
tbResource = JacksonUtil.fromStringIgnoreUnknownProperties(resourceUpdateMsg.getEntity(), TbResource.class);
Assert.assertNotNull(tbResource);
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, resourceUpdateMsg.getMsgType());
Assert.assertEquals("Updated Edge Test Resource", resourceUpdateMsg.getTitle());
Assert.assertEquals("Updated Edge Test Resource", tbResource.getTitle());
// delete resource
edgeImitator.expectMessageAmount(1);
@ -91,18 +96,14 @@ public class ResourceEdgeTest extends AbstractEdgeTest {
@Test
public void testSendResourceToCloud() throws Exception {
TbResource tbResource = createTbResource();
UUID uuid = Uuids.timeBased();
UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
ResourceUpdateMsg.Builder resourceUpdateMsgBuilder = ResourceUpdateMsg.newBuilder();
resourceUpdateMsgBuilder.setIdMSB(uuid.getMostSignificantBits());
resourceUpdateMsgBuilder.setIdLSB(uuid.getLeastSignificantBits());
resourceUpdateMsgBuilder.setTitle("Edge Test Resource");
resourceUpdateMsgBuilder.setResourceType(ResourceType.JKS.name());
resourceUpdateMsgBuilder.setResourceKey(FILE_NAME);
resourceUpdateMsgBuilder.setFileName(FILE_NAME);
resourceUpdateMsgBuilder.setData(TEST_DATA);
resourceUpdateMsgBuilder.setIsSystem(false);
resourceUpdateMsgBuilder.setEntity(JacksonUtil.toString(tbResource));
resourceUpdateMsgBuilder.setMsgType(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE);
testAutoGeneratedCodeByProtobuf(resourceUpdateMsgBuilder);
uplinkMsgBuilder.addResourceUpdateMsg(resourceUpdateMsgBuilder.build());
@ -117,18 +118,14 @@ public class ResourceEdgeTest extends AbstractEdgeTest {
UplinkResponseMsg latestResponseMsg = edgeImitator.getLatestResponseMsg();
Assert.assertTrue(latestResponseMsg.getSuccess());
TbResource tbResource = doGet("/api/resource/" + uuid, TbResource.class);
Assert.assertNotNull(tbResource);
Assert.assertEquals("Edge Test Resource", tbResource.getName());
TbResource tb = doGet("/api/resource/" + uuid, TbResource.class);
Assert.assertNotNull(tb);
Assert.assertEquals("Edge Test Resource", tb.getName());
}
@Test
public void testResourceToCloudWithNameThatAlreadyExistsOnCloud() throws Exception {
TbResource resource = new TbResource();
resource.setResourceType(ResourceType.JKS);
resource.setTitle("Edge Test Resource");
resource.setFileName(FILE_NAME);
resource.setData(TEST_DATA);
TbResource resource = createTbResource();
edgeImitator.expectMessageAmount(1);
TbResource savedResource = doPost("/api/resource", resource, TbResource.class);
@ -140,12 +137,7 @@ public class ResourceEdgeTest extends AbstractEdgeTest {
ResourceUpdateMsg.Builder resourceUpdateMsgBuilder = ResourceUpdateMsg.newBuilder();
resourceUpdateMsgBuilder.setIdMSB(uuid.getMostSignificantBits());
resourceUpdateMsgBuilder.setIdLSB(uuid.getLeastSignificantBits());
resourceUpdateMsgBuilder.setTitle("Edge Test Resource");
resourceUpdateMsgBuilder.setResourceType(ResourceType.JKS.name());
resourceUpdateMsgBuilder.setResourceKey(FILE_NAME);
resourceUpdateMsgBuilder.setFileName(FILE_NAME);
resourceUpdateMsgBuilder.setData(TEST_DATA);
resourceUpdateMsgBuilder.setIsSystem(false);
resourceUpdateMsgBuilder.setEntity(JacksonUtil.toString(resource));
resourceUpdateMsgBuilder.setMsgType(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE);
testAutoGeneratedCodeByProtobuf(resourceUpdateMsgBuilder);
uplinkMsgBuilder.addResourceUpdateMsg(resourceUpdateMsgBuilder.build());
@ -171,4 +163,15 @@ public class ResourceEdgeTest extends AbstractEdgeTest {
Assert.assertNotNull(tbResource);
Assert.assertNotEquals(FILE_NAME, tbResource.getName());
}
private TbResource createTbResource() {
TbResource tbResource = new TbResource();
tbResource.setTenantId(tenantId);
tbResource.setTitle("Edge Test Resource");
tbResource.setResourceType(ResourceType.JKS);
tbResource.setResourceKey(FILE_NAME);
tbResource.setFileName(FILE_NAME);
tbResource.setData(TEST_DATA);
return tbResource;
}
}

Loading…
Cancel
Save