Working version with provision data only in device profile

This commit is contained in:
zbeacon 2020-09-23 15:19:06 +03:00
parent 8a8695f260
commit 073225ab9f

View File

@ -31,6 +31,7 @@ import org.thingsboard.server.common.data.DeviceProfileType;
import org.thingsboard.server.common.data.audit.ActionType; import org.thingsboard.server.common.data.audit.ActionType;
import org.thingsboard.server.common.data.device.data.ProvisionDeviceConfiguration; import org.thingsboard.server.common.data.device.data.ProvisionDeviceConfiguration;
import org.thingsboard.server.common.data.device.profile.ProvisionDeviceProfileConfiguration; import org.thingsboard.server.common.data.device.profile.ProvisionDeviceProfileConfiguration;
import org.thingsboard.server.common.data.device.profile.ProvisionRequestValidationStrategy;
import org.thingsboard.server.common.data.device.profile.ProvisionRequestValidationStrategyType; import org.thingsboard.server.common.data.device.profile.ProvisionRequestValidationStrategyType;
import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
@ -118,75 +119,37 @@ public class DeviceProvisionServiceImpl implements DeviceProvisionService {
return Futures.immediateFuture(new ProvisionResponse(null, ProvisionResponseStatus.NOT_FOUND)); return Futures.immediateFuture(new ProvisionResponse(null, ProvisionResponseStatus.NOT_FOUND));
} }
Device targetDevice = deviceDao.findDeviceByProfileNameAndDeviceDataProvisionConfigurationPair(
provisionRequest.getDeviceType(),
provisionRequestKey,
provisionRequestSecret
).orElse(null);
if (targetDevice != null) {
return processProvisionDeviceWithKeySecretPairExists(provisionRequest, provisionRequestKey, provisionRequestSecret, targetDevice);
} else {
return processProvisionDeviceWithKeySecretPairNotExists(provisionRequest, provisionRequestKey, provisionRequestSecret);
}
}
private ListenableFuture<ProvisionResponse> processProvisionDeviceWithKeySecretPairExists(ProvisionRequest provisionRequest, String provisionRequestKey, String provisionRequestSecret, Device targetDevice) {
if (targetDevice.getDeviceData().getConfiguration().getType() != DeviceProfileType.PROVISION) {
return Futures.immediateFuture(new ProvisionResponse(null, ProvisionResponseStatus.NOT_FOUND));
}
DeviceProfile targetProfile = deviceProfileDao.findById(targetDevice.getTenantId(), targetDevice.getDeviceProfileId().getId());
if (targetProfile == null || targetProfile.getProfileData().getConfiguration().getType() != DeviceProfileType.PROVISION) {
return Futures.immediateFuture(new ProvisionResponse(null, ProvisionResponseStatus.NOT_FOUND));
}
ProvisionDeviceConfiguration currentDeviceConfiguration = (ProvisionDeviceConfiguration) targetDevice.getDeviceData().getConfiguration();
if (!new ProvisionDeviceConfiguration(provisionRequestKey, provisionRequestSecret).equals(currentDeviceConfiguration)) {
return Futures.immediateFuture(new ProvisionResponse(null, ProvisionResponseStatus.NOT_FOUND));
}
ProvisionRequestValidationStrategyType targetStrategy = getStrategy(targetProfile);
switch (targetStrategy) {
case CHECK_NEW_DEVICE:
log.warn("[{}] The device is present and could not be provisioned once more!", targetDevice.getName());
notify(targetDevice, provisionRequest, DataConstants.PROVISION_FAILURE, false);
return Futures.immediateFuture(new ProvisionResponse(null, ProvisionResponseStatus.FAILURE));
case CHECK_PRE_PROVISIONED_DEVICE:
return processProvision(targetDevice, provisionRequest);
default:
throw new RuntimeException("Strategy is not supported - " + targetStrategy.name());
}
}
private ListenableFuture<ProvisionResponse> processProvisionDeviceWithKeySecretPairNotExists(ProvisionRequest provisionRequest, String provisionRequestKey, String provisionRequestSecret){
DeviceProfile targetProfile = deviceProfileDao.findProfileByProfileNameAndProfileDataProvisionConfigurationPair( DeviceProfile targetProfile = deviceProfileDao.findProfileByProfileNameAndProfileDataProvisionConfigurationPair(
provisionRequest.getDeviceType(), provisionRequest.getDeviceType(),
provisionRequestKey, provisionRequestKey,
provisionRequestSecret provisionRequestSecret);
);
if (targetProfile == null || targetProfile.getProfileData().getConfiguration().getType() != DeviceProfileType.PROVISION) { if (targetProfile == null || targetProfile.getProfileData().getConfiguration().getType() != DeviceProfileType.PROVISION) {
return Futures.immediateFuture(new ProvisionResponse(null, ProvisionResponseStatus.NOT_FOUND)); return Futures.immediateFuture(new ProvisionResponse(null, ProvisionResponseStatus.NOT_FOUND));
} }
ProvisionRequestValidationStrategyType targetStrategy = getStrategy(targetProfile);
switch (targetStrategy) { ProvisionRequestValidationStrategyType validationStrategy = getStrategy(targetProfile);
Device targetDevice = deviceDao.findDeviceByTenantIdAndName(targetProfile.getTenantId().getId(), provisionRequest.getDeviceName()).orElse(null);
switch(validationStrategy) {
case CHECK_NEW_DEVICE: case CHECK_NEW_DEVICE:
if (targetDevice != null) {
log.warn("[{}] The device is present and could not be provisioned once more!", targetDevice.getName());
notify(targetDevice, provisionRequest, DataConstants.PROVISION_FAILURE, false);
return Futures.immediateFuture(new ProvisionResponse(null, ProvisionResponseStatus.FAILURE));
} else {
return createDevice(provisionRequest, targetProfile); return createDevice(provisionRequest, targetProfile);
}
case CHECK_PRE_PROVISIONED_DEVICE: case CHECK_PRE_PROVISIONED_DEVICE:
ProvisionDeviceProfileConfiguration currentDeviceProfileConfiguration = (ProvisionDeviceProfileConfiguration) targetProfile.getProfileData().getConfiguration(); if (targetDevice != null){
if(new ProvisionDeviceProfileConfiguration(provisionRequestKey, provisionRequestSecret).equals(currentDeviceProfileConfiguration)) { return processProvision(targetDevice, provisionRequest);
Optional<Device> optionalDevice = deviceDao.findDeviceByTenantIdAndName(targetProfile.getTenantId().getId(), provisionRequest.getDeviceName()); } else {
if (optionalDevice.isPresent()) {
return processProvision(optionalDevice.get(), provisionRequest);
}
}
log.warn("[{}] Failed to find pre provisioned device!", provisionRequest.getDeviceName()); log.warn("[{}] Failed to find pre provisioned device!", provisionRequest.getDeviceName());
return Futures.immediateFuture(new ProvisionResponse(null, ProvisionResponseStatus.FAILURE)); return Futures.immediateFuture(new ProvisionResponse(null, ProvisionResponseStatus.FAILURE));
}
default: default:
throw new RuntimeException("Strategy is not supported - " + targetStrategy.name()); throw new RuntimeException("Strategy is not supported - " + validationStrategy.name());
} }
} }