in provisioning/provisioning-device-client/src/main/java/com/microsoft/azure/sdk/iot/provisioning/device/internal/task/ProvisioningTask.java [178:275]
private void executeStateMachineForStatus(RegistrationOperationStatusParser registrationOperationStatusParser)
throws TimeoutException, InterruptedException, ExecutionException, ProvisioningDeviceClientException, SecurityProviderException
{
boolean isContinue = false;
ProvisioningStatus nextStatus = ProvisioningStatus.fromString(registrationOperationStatusParser.getStatus());
log.info("Current provisioning status: {}", nextStatus);
// continue invoking for status until a terminal state is reached
do
{
if (nextStatus == null)
{
throw new ProvisioningDeviceClientException("Did not receive a valid status");
}
switch (nextStatus)
{
case UNASSIGNED:
//intended fall through
case ASSIGNING:
log.trace("Polling device provisioning service for status of registration...");
registrationOperationStatusParser = this.invokeStatus(registrationOperationStatusParser.getOperationId());
nextStatus = ProvisioningStatus.fromString(registrationOperationStatusParser.getStatus());
isContinue = true;
break;
case ASSIGNED:
this.dpsStatus = PROVISIONING_DEVICE_STATUS_ASSIGNED;
DeviceRegistrationResultParser registrationStatus = registrationOperationStatusParser.getRegistrationState();
if (registrationStatus == null
|| registrationStatus.getAssignedHub() == null
|| registrationStatus.getAssignedHub().isEmpty()
|| registrationStatus.getDeviceId() == null
|| registrationStatus.getDeviceId().isEmpty())
{
throw new ProvisioningDeviceClientException("Could not retrieve Assigned Hub or Device ID and status changed to Assigned");
}
RegistrationResult registrationInfo = new RegistrationResult(
registrationStatus.getAssignedHub(),
registrationStatus.getDeviceId(),
registrationStatus.getPayload(), PROVISIONING_DEVICE_STATUS_ASSIGNED);
registrationInfo.setRegistrationId(registrationStatus.getRegistrationId());
registrationInfo.setStatus(registrationStatus.getStatus());
registrationInfo.setSubstatus(ProvisioningDeviceClientSubstatus.fromString(registrationStatus.getSubstatus()));
registrationInfo.setCreatedDateTimeUtc(registrationStatus.getCreatedDateTimeUtc());
registrationInfo.setLastUpdatesDateTimeUtc(registrationStatus.getLastUpdatesDateTimeUtc());
registrationInfo.setETag(registrationStatus.getETag());
if (this.securityProvider instanceof SecurityProviderTpm)
{
if (registrationStatus.getTpm() == null
|| registrationStatus.getTpm().getAuthenticationKey() == null
|| registrationStatus.getTpm().getAuthenticationKey().isEmpty())
{
throw new ProvisioningDeviceClientException("Could not retrieve Authentication key when status was assigned");
}
String authenticationKey = registrationStatus.getTpm().getAuthenticationKey();
((SecurityProviderTpm) this.securityProvider).activateIdentityKey(decodeBase64(authenticationKey.getBytes(StandardCharsets.UTF_8)));
}
log.info("Device provisioning service assigned the device successfully");
this.invokeRegistrationCallback(registrationInfo, null);
isContinue = false;
break;
case FAILED:
this.dpsStatus = PROVISIONING_DEVICE_STATUS_FAILED;
String errorMessage = registrationOperationStatusParser.getRegistrationState().getErrorMessage();
ProvisioningDeviceHubException dpsHubException = new ProvisioningDeviceHubException(errorMessage);
if (registrationOperationStatusParser.getRegistrationState().getErrorCode() != null)
{
dpsHubException.setErrorCode(registrationOperationStatusParser.getRegistrationState().getErrorCode());
}
registrationInfo = new RegistrationResult(null, null, null, PROVISIONING_DEVICE_STATUS_FAILED);
log.error("Device provisioning service failed to provision the device, finished with status FAILED: {}", errorMessage);
this.invokeRegistrationCallback(registrationInfo, dpsHubException);
isContinue = false;
break;
case DISABLED:
this.dpsStatus = PROVISIONING_DEVICE_STATUS_DISABLED;
String disabledErrorMessage = registrationOperationStatusParser.getRegistrationState().getErrorMessage();
dpsHubException = new ProvisioningDeviceHubException(disabledErrorMessage);
if (registrationOperationStatusParser.getRegistrationState().getErrorCode() != null)
{
dpsHubException.setErrorCode(registrationOperationStatusParser.getRegistrationState().getErrorCode());
}
registrationInfo = new RegistrationResult(null, null, null, PROVISIONING_DEVICE_STATUS_DISABLED);
log.error("Device provisioning service failed to provision the device, finished with status DISABLED: {}", disabledErrorMessage);
this.invokeRegistrationCallback(registrationInfo, dpsHubException);
isContinue = false;
break;
}
}
while (isContinue);
}