If a device is already provisioned but the key exchange fails, retry it until it succeeds

Change-Type: patch
Signed-off-by: Pablo Carranza Velez <pablo@resin.io>
This commit is contained in:
Pablo Carranza Velez 2017-10-24 14:27:18 -07:00
parent b809e2aa02
commit c532344dce

View File

@ -179,13 +179,7 @@ hasDeviceApiKeySupport = (osVersion) ->
console.error('Unable to determine if device has deviceApiKey support', err, err.stack)
false
bootstrapper.done = new Promise (resolve) ->
bootstrapper.doneBootstrapping = ->
bootstrapper.bootstrapped = true
resolve(userConfig)
# If we're still using an old api key we can try to exchange it for a valid device key
# This will only be the case when the supervisor/OS has been updated.
if userConfig.apiKey?
exchangeKeyAndUpdateConfig = ->
# Only do a key exchange and delete the provisioning key if we're on a Resin OS version
# that supports using the deviceApiKey (2.0.2 and above)
# or if we're in a non-Resin OS (which is assumed to be updated enough).
@ -209,7 +203,26 @@ bootstrapper.done = new Promise (resolve) ->
utils.setConfig('apiKey', userConfig.deviceApiKey)
.then ->
writeAndSyncFile(configPath, JSON.stringify(userConfig))
# We return immediately, and eventually the API key will be exchanged and replaced.
exchangeKeyOrRetry = do ->
_failedExchanges = 0
return ->
exchangeKeyAndUpdateConfig()
.catch (err) ->
console.error('Error exchanging API key, will retry', err, err.stack)
delay = Math.min((2 ** _failedExchanges) * config.bootstrapRetryDelay, 24 * 60 * 60 * 1000)
_failedExchanges += 1
setTimeout(exchangeKeyOrRetry, delay)
return
bootstrapper.done = new Promise (resolve) ->
bootstrapper.doneBootstrapping = ->
bootstrapper.bootstrapped = true
resolve(userConfig)
# If we're still using an old api key we can try to exchange it for a valid device key
# This will only be the case when the supervisor/OS has been updated.
if userConfig.apiKey?
exchangeKeyOrRetry()
return
bootstrapper.bootstrapped = false