public fun doPollAsync()

in plugin-azure-server/src/main/kotlin/jetbrains/buildServer/clouds/azure/arm/connector/tasks/AzureClientUtils.kt [56:84]


public fun <T> doPollAsync(azureClient: AzureClient, state: PollingState<T>, resourceType: Type, beforePollAttemptHandler: () -> Observable<Unit>): Observable<PollingState<T>> {
    val retryCount = TeamCityProperties.getInteger(TEAMCITY_CLOUDS_AZURE_DEPLOYMENT_LONG_RUNNING_QUERY_RETRY_COUNT, 5)
    return Observable.just(true)
        .flatMap<PollingState<T>> {
            beforePollAttemptHandler()
                .flatMap {
                    azureClient.pollSingleAsync(state, resourceType).toObservable()
                }
        }
        .repeatWhen { observable ->
            observable.flatMap {
                Observable.timer(
                    TeamCityProperties.getLong(TEAMCITY_CLOUDS_AZURE_DEPLOYMENT_LONG_RUNNING_QUERY_RETRY_TIMEOUT, 30),
                    TimeUnit.SECONDS,
                    Schedulers.computation()
                )
                .observeOn(Schedulers.io())
            }
        }
        .retryWhen { observable ->
            observable.zipWith(Observable.range(1, retryCount)) { throwable, integer ->
                if (throwable is CloudException || integer == retryCount) {
                    throw Exceptions.propagate(throwable)
                }
                integer
            }
        }
        .takeUntil { isStatusTerminal(state) }
}