diff --git a/src/Explorer/Quickstart/QuickstartGuide.tsx b/src/Explorer/Quickstart/QuickstartGuide.tsx
index 9df39de0f..48a7a9a79 100644
--- a/src/Explorer/Quickstart/QuickstartGuide.tsx
+++ b/src/Explorer/Quickstart/QuickstartGuide.tsx
@@ -96,12 +96,18 @@ export const QuickstartGuide: React.FC = (): JSX.Element => {
Quick start guide
{currentStep < 5 && (
-
+ setCurrentStep(Object.values(GuideSteps).indexOf(item.props.itemKey))}
+ >
customPivotHeaderRenderer(props, defaultRenderer, 0)}
itemKey={GuideSteps[0]}
- onClick={() => setCurrentStep(0)}
+ onClick={() => {
+ setCurrentStep(0);
+ }}
>
diff --git a/src/Explorer/Tabs/QuickstartTab.tsx b/src/Explorer/Tabs/QuickstartTab.tsx
index 5a3aac58c..b077c8273 100644
--- a/src/Explorer/Tabs/QuickstartTab.tsx
+++ b/src/Explorer/Tabs/QuickstartTab.tsx
@@ -1,4 +1,4 @@
-import { Spinner, SpinnerSize, Stack } from "@fluentui/react";
+import { Spinner, SpinnerSize, Stack, Text } from "@fluentui/react";
import { configContext } from "ConfigContext";
import { NotebookWorkspaceConnectionInfo, PostgresFirewallRule } from "Contracts/DataModels";
import { NotebookTerminalComponent } from "Explorer/Controls/Notebook/NotebookTerminalComponent";
@@ -69,7 +69,15 @@ export const QuickstartTab: React.FC = ({ explorer }: Quicks
/>
)}
{isAllPublicIPAddressEnabled && !notebookServerInfo?.notebookServerEndpoint && (
-
+
+
+ Connecting to the PostgreSQL shell.
+
+
+ If the cluster was just created, this could take up to a minute.
+
+
+
)}
diff --git a/src/Phoenix/PhoenixClient.ts b/src/Phoenix/PhoenixClient.ts
index aea03f8aa..ddc4d563a 100644
--- a/src/Phoenix/PhoenixClient.ts
+++ b/src/Phoenix/PhoenixClient.ts
@@ -45,7 +45,11 @@ export class PhoenixClient {
}
public async allocateContainer(provisionData: IProvisionData): Promise> {
- return this.executeContainerAssignmentOperation(provisionData, "allocate");
+ return promiseRetry(() => this.executeContainerAssignmentOperation(provisionData, "allocate"), {
+ retries: 4,
+ maxTimeout: 20000,
+ minTimeout: 20000,
+ });
}
public async resetContainer(provisionData: IProvisionData): Promise> {
@@ -80,9 +84,12 @@ export class PhoenixClient {
}
const phoenixError = responseJson as IPhoenixError;
if (response.status === HttpStatusCodes.Forbidden) {
- throw new Error(this.ConvertToForbiddenErrorString(phoenixError));
+ if (phoenixError.message === "Sequence contains no elements") {
+ throw Error("Phoenix container allocation failed, please try again later.");
+ }
+ throw new AbortError(this.ConvertToForbiddenErrorString(phoenixError));
}
- throw new Error(phoenixError.message);
+ throw new AbortError(phoenixError.message);
} catch (error) {
error.status = response?.status;
throw error;
diff --git a/src/Terminal/JupyterLabAppFactory.ts b/src/Terminal/JupyterLabAppFactory.ts
index 6d85c9e7b..f6698d58d 100644
--- a/src/Terminal/JupyterLabAppFactory.ts
+++ b/src/Terminal/JupyterLabAppFactory.ts
@@ -81,6 +81,9 @@ export class JupyterLabAppFactory {
// Attach the widget to the dom.
Widget.attach(panel, document.body);
+ // Switch focus to the terminal
+ term.activate();
+
// Handle resize events.
window.addEventListener("resize", () => {
panel.update();