Merge pull request #8387 from dashevchenko/deviceImportFix
Fixed telemetry/attribute update while device bulk import
This commit is contained in:
		
						commit
						972a967e7a
					
				@ -113,8 +113,9 @@ public abstract class AbstractBulkImportService<E extends HasId<? extends Entity
 | 
			
		||||
                    ImportedEntityInfo<E> importedEntityInfo = saveEntity(entityData.getFields(), user);
 | 
			
		||||
                    E entity = importedEntityInfo.getEntity();
 | 
			
		||||
 | 
			
		||||
                    saveKvs(user, entity, entityData.getKvs());
 | 
			
		||||
 | 
			
		||||
                    if (request.getMapping().getUpdate() || !importedEntityInfo.isUpdated()) {
 | 
			
		||||
                        saveKvs(user, entity, entityData.getKvs());
 | 
			
		||||
                    }
 | 
			
		||||
                    return importedEntityInfo;
 | 
			
		||||
                },
 | 
			
		||||
                importedEntityInfo -> {
 | 
			
		||||
 | 
			
		||||
@ -17,6 +17,7 @@ package org.thingsboard.server.controller;
 | 
			
		||||
 | 
			
		||||
import com.datastax.oss.driver.api.core.uuid.Uuids;
 | 
			
		||||
import com.fasterxml.jackson.core.type.TypeReference;
 | 
			
		||||
import com.fasterxml.jackson.databind.JsonNode;
 | 
			
		||||
import com.google.common.util.concurrent.Futures;
 | 
			
		||||
import com.google.common.util.concurrent.ListenableFuture;
 | 
			
		||||
import com.google.common.util.concurrent.ListeningExecutorService;
 | 
			
		||||
@ -33,11 +34,13 @@ import org.springframework.boot.test.mock.mockito.SpyBean;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.context.annotation.Primary;
 | 
			
		||||
import org.springframework.test.context.ContextConfiguration;
 | 
			
		||||
import org.thingsboard.common.util.JacksonUtil;
 | 
			
		||||
import org.thingsboard.common.util.ThingsBoardExecutors;
 | 
			
		||||
import org.thingsboard.server.common.data.Customer;
 | 
			
		||||
import org.thingsboard.server.common.data.Device;
 | 
			
		||||
import org.thingsboard.server.common.data.DeviceProfile;
 | 
			
		||||
import org.thingsboard.server.common.data.EntitySubtype;
 | 
			
		||||
import org.thingsboard.server.common.data.EntityType;
 | 
			
		||||
import org.thingsboard.server.common.data.OtaPackageInfo;
 | 
			
		||||
import org.thingsboard.server.common.data.SaveDeviceWithCredentialsRequest;
 | 
			
		||||
import org.thingsboard.server.common.data.SaveOtaPackageInfoRequest;
 | 
			
		||||
@ -68,6 +71,8 @@ import org.thingsboard.server.service.gateway_device.GatewayNotificationsService
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
import java.util.concurrent.TimeUnit;
 | 
			
		||||
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
@ -1392,6 +1397,73 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest {
 | 
			
		||||
        Assert.assertEquals(savedCredentials, updatedCredentials);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testBulkImportDeviceWithUpdateFalse() throws Exception {
 | 
			
		||||
        String deviceName = "firstDevice";
 | 
			
		||||
        String attributeValue = "testValue";
 | 
			
		||||
        BulkImportRequest request = new BulkImportRequest();
 | 
			
		||||
        request.setFile(String.format("NAME,TYPE,DATA\n%s,%s,%s", deviceName, "thermostat", attributeValue));
 | 
			
		||||
        BulkImportRequest.Mapping mapping = new BulkImportRequest.Mapping();
 | 
			
		||||
        BulkImportRequest.ColumnMapping name = new BulkImportRequest.ColumnMapping();
 | 
			
		||||
        name.setType(BulkImportColumnType.NAME);
 | 
			
		||||
        BulkImportRequest.ColumnMapping type = new BulkImportRequest.ColumnMapping();
 | 
			
		||||
        type.setType(BulkImportColumnType.TYPE);
 | 
			
		||||
        BulkImportRequest.ColumnMapping attribute = new BulkImportRequest.ColumnMapping();
 | 
			
		||||
        attribute.setType(BulkImportColumnType.SERVER_ATTRIBUTE);
 | 
			
		||||
        attribute.setKey("DATA");
 | 
			
		||||
        List<BulkImportRequest.ColumnMapping> columns = new ArrayList<>();
 | 
			
		||||
        columns.add(name);
 | 
			
		||||
        columns.add(type);
 | 
			
		||||
        columns.add(attribute);
 | 
			
		||||
 | 
			
		||||
        mapping.setColumns(columns);
 | 
			
		||||
        mapping.setDelimiter(',');
 | 
			
		||||
        mapping.setUpdate(true);
 | 
			
		||||
        mapping.setHeader(true);
 | 
			
		||||
        request.setMapping(mapping);
 | 
			
		||||
 | 
			
		||||
        //import device
 | 
			
		||||
        doPostWithTypedResponse("/api/device/bulk_import", request, new TypeReference<>() {});
 | 
			
		||||
        Device savedDevice = doGet("/api/tenant/devices?deviceName=" + deviceName, Device.class);
 | 
			
		||||
 | 
			
		||||
        //check server attribute value
 | 
			
		||||
        List<Map<String, Object>> values = doGetAsyncTyped("/api/plugins/telemetry/DEVICE/" + savedDevice.getId() +
 | 
			
		||||
                "/values/attributes/SERVER_SCOPE", new TypeReference<>() {
 | 
			
		||||
        });
 | 
			
		||||
        Map<String, Object> serverAttribute = values.stream().filter(att -> att.get("key").equals("DATA")).findFirst().get();
 | 
			
		||||
        Assert.assertEquals(attributeValue, serverAttribute.get("value"));
 | 
			
		||||
 | 
			
		||||
        //update server attribute value
 | 
			
		||||
        String newAttributeValue = "testValue2";
 | 
			
		||||
        JsonNode content = JacksonUtil.toJsonNode("{\"DATA\": \"" + newAttributeValue + "\"}");
 | 
			
		||||
        doPost("/api/plugins/telemetry/" + EntityType.DEVICE.name() + "/" + savedDevice.getUuidId() + "/SERVER_SCOPE", content)
 | 
			
		||||
                .andExpect(status().isOk());
 | 
			
		||||
 | 
			
		||||
        //reimport devices
 | 
			
		||||
        String deviceName2 = "secondDevice";
 | 
			
		||||
        String attributeValue2 = "testValue3";
 | 
			
		||||
 | 
			
		||||
        request.setFile(String.format("NAME,TYPE,DATA\n%s,%s,%s\n%s,%s,%s", deviceName, "thermostat", attributeValue,
 | 
			
		||||
                deviceName2, "thermostat", attributeValue2));
 | 
			
		||||
        mapping.setUpdate(false);
 | 
			
		||||
        doPostWithTypedResponse("/api/device/bulk_import", request, new TypeReference<>() {});
 | 
			
		||||
        Device savedDevice2 = doGet("/api/tenant/devices?deviceName=" + deviceName2, Device.class);
 | 
			
		||||
 | 
			
		||||
        //check attribute value was not changed after reimport
 | 
			
		||||
        List<Map<String, Object>> values2 = doGetAsyncTyped("/api/plugins/telemetry/DEVICE/" + savedDevice.getId() +
 | 
			
		||||
                "/values/attributes/SERVER_SCOPE", new TypeReference<>() {
 | 
			
		||||
        });
 | 
			
		||||
        Map<String, Object> retrievedServerAttribute2 = values2.stream().filter(att -> att.get("key").equals("DATA")).findFirst().get();
 | 
			
		||||
        Assert.assertEquals(newAttributeValue, retrievedServerAttribute2.get("value"));
 | 
			
		||||
 | 
			
		||||
        //check attribute for second device
 | 
			
		||||
        List<Map<String, Object>> values3 = doGetAsyncTyped("/api/plugins/telemetry/DEVICE/" + savedDevice2.getId() +
 | 
			
		||||
                "/values/attributes/SERVER_SCOPE", new TypeReference<>() {
 | 
			
		||||
        });
 | 
			
		||||
        Map<String, Object> retrievedServerAttribute3 = values3.stream().filter(att -> att.get("key").equals("DATA")).findFirst().get();
 | 
			
		||||
        Assert.assertEquals(attributeValue2, retrievedServerAttribute3.get("value"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private Device createDevice(String name) {
 | 
			
		||||
        Device device = new Device();
 | 
			
		||||
        device.setName(name);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user