diff --git a/extensions/azurecore/src/azureResource/tree/connectionDialogTreeProvider.ts b/extensions/azurecore/src/azureResource/tree/connectionDialogTreeProvider.ts index dfa36bc37d..09014c93cd 100644 --- a/extensions/azurecore/src/azureResource/tree/connectionDialogTreeProvider.ts +++ b/extensions/azurecore/src/azureResource/tree/connectionDialogTreeProvider.ts @@ -53,20 +53,32 @@ export class ConnectionDialogTreeProvider implements vscode.TreeDataProvider 0) { - const accountNodes: FlatAccountTreeNode[] = []; - for (const account of this.accounts) { + if (this.accounts && this.accounts.length > 0) { + const accountNodes: FlatAccountTreeNode[] = []; + const errorMessages: string[] = []; + // We are doing sequential account loading to avoid the Azure request throttling + for (const account of this.accounts) { + try { const accountNode = new FlatAccountTreeNode(account, this.appContext, this); await accountNode.updateLabel(); accountNodes.push(accountNode); } - return accountNodes; - } else { - return [new AzureResourceAccountNotSignedInTreeNode()]; + catch (error) { + errorMessages.push(AzureResourceErrorMessageUtil.getErrorMessage(error)); + } } - } catch (error) { - return [AzureResourceMessageTreeNode.create(AzureResourceErrorMessageUtil.getErrorMessage(error), undefined)]; + if (errorMessages.length > 0) { + const showAccountsAction = localize('azure.resource.tree.treeProvider.openAccountsDialog', "Show Azure accounts"); + vscode.window.showErrorMessage(localize('azure.resource.tree.treeProvider.accountLoadError', "Failed to load some Azure accounts. {0}", errorMessages.join(',')), showAccountsAction).then(result => { + if (result === showAccountsAction) { + vscode.commands.executeCommand('azure.resource.signin'); + } + }); + } + + return accountNodes; + } else { + return [new AzureResourceAccountNotSignedInTreeNode()]; } } diff --git a/extensions/azurecore/src/azureResource/tree/flatAccountTreeNode.ts b/extensions/azurecore/src/azureResource/tree/flatAccountTreeNode.ts index 1b643fd080..d24775eeb6 100644 --- a/extensions/azurecore/src/azureResource/tree/flatAccountTreeNode.ts +++ b/extensions/azurecore/src/azureResource/tree/flatAccountTreeNode.ts @@ -127,7 +127,7 @@ async function getSubscriptionInfo(account: AzureAccount, subscriptionService: I subscriptions.push(...(await subscriptionService.getSubscriptions(account, new TokenCredentials(token.token, token.tokenType), tenant.id) || [])); } } catch (error) { - throw new AzureResourceCredentialError(localize('azure.resource.tree.accountTreeNode.credentialError', "Failed to get credential for account {0}. Please refresh the account.", account.key.accountId), error); + throw new AzureResourceCredentialError(localize('azure.resource.tree.accountTreeNode.credentialError', "Failed to get credential for account {0}. Please go to the accounts dialog and refresh the account.", account.key.accountId), error); } const total = subscriptions.length; let selected = total;