Browse Source

Edge resources support improvements; fixes for tests

pull/9542/head
ViacheslavKlimov 3 years ago
parent
commit
df00add81b
  1. 4
      application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/ResourceMsgConstructor.java
  2. 2
      application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/resource/BaseResourceProcessor.java
  3. 2
      application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/resource/ResourceEdgeProcessor.java
  4. 3
      application/src/test/java/org/thingsboard/server/controller/TbResourceControllerTest.java
  5. 3
      application/src/test/java/org/thingsboard/server/edge/ResourceEdgeTest.java
  6. 4
      application/src/test/java/org/thingsboard/server/service/transport/DefaultTransportApiServiceTest.java
  7. 12
      dao/src/main/java/org/thingsboard/server/dao/resource/BaseResourceService.java
  8. 18
      dao/src/main/java/org/thingsboard/server/dao/service/validator/ResourceDataValidator.java

4
application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/ResourceMsgConstructor.java

@ -23,6 +23,8 @@ import org.thingsboard.server.gen.edge.v1.ResourceUpdateMsg;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType; import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.queue.util.TbCoreComponent;
import java.util.Base64;
@Component @Component
@TbCoreComponent @TbCoreComponent
public class ResourceMsgConstructor { public class ResourceMsgConstructor {
@ -37,7 +39,7 @@ public class ResourceMsgConstructor {
.setResourceType(tbResource.getResourceType().name()) .setResourceType(tbResource.getResourceType().name())
.setFileName(tbResource.getFileName()); .setFileName(tbResource.getFileName());
if (tbResource.getData() != null) { if (tbResource.getData() != null) {
builder.setData(tbResource.getData()); builder.setData(Base64.getEncoder().encodeToString(tbResource.getData()));
} }
if (tbResource.getEtag() != null) { if (tbResource.getEtag() != null) {
builder.setEtag(tbResource.getEtag()); builder.setEtag(tbResource.getEtag());

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

@ -46,7 +46,7 @@ public abstract class BaseResourceProcessor extends BaseEdgeProcessor {
resource.setResourceKey(resourceUpdateMsg.getResourceKey()); resource.setResourceKey(resourceUpdateMsg.getResourceKey());
resource.setResourceType(ResourceType.valueOf(resourceUpdateMsg.getResourceType())); resource.setResourceType(ResourceType.valueOf(resourceUpdateMsg.getResourceType()));
resource.setFileName(resourceUpdateMsg.getFileName()); resource.setFileName(resourceUpdateMsg.getFileName());
resource.setData(resourceUpdateMsg.hasData() ? resourceUpdateMsg.getData() : null); resource.setBase64Data(resourceUpdateMsg.hasData() ? resourceUpdateMsg.getData() : null);
resource.setEtag(resourceUpdateMsg.hasEtag() ? resourceUpdateMsg.getEtag() : null); resource.setEtag(resourceUpdateMsg.hasEtag() ? resourceUpdateMsg.getEtag() : null);
resourceValidator.validate(resource, TbResourceInfo::getTenantId); resourceValidator.validate(resource, TbResourceInfo::getTenantId);
if (created) { if (created) {

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

@ -58,7 +58,7 @@ public class ResourceEdgeProcessor extends BaseResourceProcessor {
return handleUnsupportedMsgType(resourceUpdateMsg.getMsgType()); return handleUnsupportedMsgType(resourceUpdateMsg.getMsgType());
} }
} catch (DataValidationException e) { } catch (DataValidationException e) {
if (e.getMessage().contains("files size limit is exhausted")) { if (e.getMessage().contains("exceeds the maximum")) {
log.warn("[{}] Resource data size has been exhausted {}", tenantId, resourceUpdateMsg, e); log.warn("[{}] Resource data size has been exhausted {}", tenantId, resourceUpdateMsg, e);
return Futures.immediateFuture(null); return Futures.immediateFuture(null);
} else { } else {

3
application/src/test/java/org/thingsboard/server/controller/TbResourceControllerTest.java

@ -685,6 +685,9 @@ public class TbResourceControllerTest extends AbstractControllerTest {
.isEqualTo(download(savedResource.getId())) .isEqualTo(download(savedResource.getId()))
.isEqualTo(Base64.getDecoder().decode(TEST_DATA)); .isEqualTo(Base64.getDecoder().decode(TEST_DATA));
assertThat(imageResponse.getContentType()).isEqualTo("image/png"); assertThat(imageResponse.getContentType()).isEqualTo("image/png");
loginSysAdmin();
doDelete("/api/resource/" + savedResource.getId()).andExpect(status().isOk());
} }
@Test @Test

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

@ -45,7 +45,7 @@ public class ResourceEdgeTest extends AbstractEdgeTest {
resource.setResourceType(ResourceType.JKS); resource.setResourceType(ResourceType.JKS);
resource.setTitle("Edge Test Resource"); resource.setTitle("Edge Test Resource");
resource.setFileName(FILE_NAME); resource.setFileName(FILE_NAME);
resource.setData(TEST_DATA); resource.setBase64Data(TEST_DATA);
edgeImitator.expectMessageAmount(1); edgeImitator.expectMessageAmount(1);
TbResource savedResource = doPost("/api/resource", resource, TbResource.class); TbResource savedResource = doPost("/api/resource", resource, TbResource.class);
@ -119,5 +119,6 @@ public class ResourceEdgeTest extends AbstractEdgeTest {
TbResource tbResource = doGet("/api/resource/" + uuid, TbResource.class); TbResource tbResource = doGet("/api/resource/" + uuid, TbResource.class);
Assert.assertNotNull(tbResource); Assert.assertNotNull(tbResource);
Assert.assertEquals("Edge Test Resource", tbResource.getName()); Assert.assertEquals("Edge Test Resource", tbResource.getName());
Assert.assertEquals(TEST_DATA, tbResource.getBase64Data());
} }
} }

4
application/src/test/java/org/thingsboard/server/service/transport/DefaultTransportApiServiceTest.java

@ -44,13 +44,13 @@ import org.thingsboard.server.dao.device.provision.ProvisionResponseStatus;
import org.thingsboard.server.dao.ota.OtaPackageService; import org.thingsboard.server.dao.ota.OtaPackageService;
import org.thingsboard.server.dao.queue.QueueService; import org.thingsboard.server.dao.queue.QueueService;
import org.thingsboard.server.dao.relation.RelationService; import org.thingsboard.server.dao.relation.RelationService;
import org.thingsboard.server.dao.resource.ResourceService;
import org.thingsboard.server.dao.tenant.TbTenantProfileCache; import org.thingsboard.server.dao.tenant.TbTenantProfileCache;
import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.gen.transport.TransportProtos;
import org.thingsboard.server.queue.util.DataDecodingEncodingService; import org.thingsboard.server.queue.util.DataDecodingEncodingService;
import org.thingsboard.server.service.apiusage.TbApiUsageStateService; import org.thingsboard.server.service.apiusage.TbApiUsageStateService;
import org.thingsboard.server.service.executors.DbCallbackExecutorService; import org.thingsboard.server.service.executors.DbCallbackExecutorService;
import org.thingsboard.server.service.profile.TbDeviceProfileCache; import org.thingsboard.server.service.profile.TbDeviceProfileCache;
import org.thingsboard.server.service.resource.TbResourceService;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
@ -96,7 +96,7 @@ public class DefaultTransportApiServiceTest {
@MockBean @MockBean
protected DeviceProvisionService deviceProvisionService; protected DeviceProvisionService deviceProvisionService;
@MockBean @MockBean
protected TbResourceService resourceService; protected ResourceService resourceService;
@MockBean @MockBean
protected OtaPackageService otaPackageService; protected OtaPackageService otaPackageService;
@MockBean @MockBean

12
dao/src/main/java/org/thingsboard/server/dao/resource/BaseResourceService.java

@ -64,13 +64,13 @@ public class BaseResourceService extends AbstractCachedEntityService<ResourceInf
@Override @Override
public TbResource saveResource(TbResource resource, boolean doValidate) { public TbResource saveResource(TbResource resource, boolean doValidate) {
log.trace("Executing saveResource [{}]", resource); log.trace("Executing saveResource [{}]", resource);
TenantId tenantId = resource.getTenantId();
if (doValidate) { if (doValidate) {
resourceValidator.validate(resource, TbResourceInfo::getTenantId); resourceValidator.validate(resource, TbResourceInfo::getTenantId);
} }
boolean newResource = resource.getId() == null; TenantId tenantId = resource.getTenantId();
if (newResource) { TbResourceId resourceId = resource.getId();
if (resourceId == null) {
UUID uuid = Uuids.timeBased(); UUID uuid = Uuids.timeBased();
resource.setId(new TbResourceId(uuid)); resource.setId(new TbResourceId(uuid));
resource.setCreatedTime(Uuids.unixTimestamp(uuid)); resource.setCreatedTime(Uuids.unixTimestamp(uuid));
@ -91,12 +91,12 @@ public class BaseResourceService extends AbstractCachedEntityService<ResourceInf
TbResourceInfo resourceInfo = saveResourceInfo(resource); TbResourceInfo resourceInfo = saveResourceInfo(resource);
saved = new TbResource(resourceInfo); saved = new TbResource(resourceInfo);
} }
publishEvictEvent(new ResourceInfoEvictEvent(tenantId, resource.getId())); publishEvictEvent(new ResourceInfoEvictEvent(tenantId, resourceId));
eventPublisher.publishEvent(SaveEntityEvent.builder().tenantId(saved.getTenantId()) eventPublisher.publishEvent(SaveEntityEvent.builder().tenantId(saved.getTenantId())
.entityId(saved.getId()).added(resource.getId() == null).build()); .entityId(saved.getId()).added(resourceId == null).build());
return saved; return saved;
} catch (Exception t) { } catch (Exception t) {
publishEvictEvent(new ResourceInfoEvictEvent(tenantId, resource.getId())); publishEvictEvent(new ResourceInfoEvictEvent(tenantId, resourceId));
ConstraintViolationException e = extractConstraintViolationException(t).orElse(null); ConstraintViolationException e = extractConstraintViolationException(t).orElse(null);
if (e != null && e.getConstraintName() != null && e.getConstraintName().equalsIgnoreCase("resource_unq_key")) { if (e != null && e.getConstraintName() != null && e.getConstraintName().equalsIgnoreCase("resource_unq_key")) {
String field = ResourceType.LWM2M_MODEL.equals(resource.getResourceType()) ? "resourceKey" : "fileName"; String field = ResourceType.LWM2M_MODEL.equals(resource.getResourceType()) ? "resourceKey" : "fileName";

18
dao/src/main/java/org/thingsboard/server/dao/service/validator/ResourceDataValidator.java

@ -73,10 +73,18 @@ public class ResourceDataValidator extends DataValidator<TbResource> {
@Override @Override
protected void validateDataImpl(TenantId tenantId, TbResource resource) { protected void validateDataImpl(TenantId tenantId, TbResource resource) {
validateString("Resource title", resource.getTitle()); validateString("Resource title", resource.getTitle());
if (resource.getTenantId() == null) {
resource.setTenantId(TenantId.SYS_TENANT_ID);
}
if (!resource.getTenantId().isSysTenantId()) {
if (!tenantService.tenantExists(resource.getTenantId())) {
throw new DataValidationException("Resource is referencing to non-existent tenant!");
}
}
if (resource.getResourceType() == null) { if (resource.getResourceType() == null) {
throw new DataValidationException("Resource type should be specified!"); throw new DataValidationException("Resource type should be specified!");
} }
if (tenantId != null && !tenantId.isSysTenantId() && resource.getData() != null) { if (!resource.getTenantId().isSysTenantId() && resource.getData() != null) {
DefaultTenantProfileConfiguration profileConfiguration = tenantProfileCache.get(tenantId).getDefaultProfileConfiguration(); DefaultTenantProfileConfiguration profileConfiguration = tenantProfileCache.get(tenantId).getDefaultProfileConfiguration();
long maxResourceSize = profileConfiguration.getMaxResourceSize(); long maxResourceSize = profileConfiguration.getMaxResourceSize();
if (maxResourceSize > 0 && resource.getData().length > maxResourceSize) { if (maxResourceSize > 0 && resource.getData().length > maxResourceSize) {
@ -104,14 +112,6 @@ public class ResourceDataValidator extends DataValidator<TbResource> {
if (StringUtils.isEmpty(resource.getResourceKey())) { if (StringUtils.isEmpty(resource.getResourceKey())) {
throw new DataValidationException("Resource key should be specified!"); throw new DataValidationException("Resource key should be specified!");
} }
if (resource.getTenantId() == null) {
resource.setTenantId(TenantId.SYS_TENANT_ID);
}
if (!resource.getTenantId().isSysTenantId()) {
if (!tenantService.tenantExists(resource.getTenantId())) {
throw new DataValidationException("Resource is referencing to non-existent tenant!");
}
}
} }
@Override @Override

Loading…
Cancel
Save