From 01b62a2c42a4e633b4e294c3db94e1a421bd7381 Mon Sep 17 00:00:00 2001 From: ChristianZaccaria Date: Tue, 12 Nov 2024 14:12:37 +0000 Subject: [PATCH] Update comments in demo notebooks --- demo-notebooks/guided-demos/0_basic_ray.ipynb | 2 +- .../guided-demos/1_cluster_job_client.ipynb | 7 +++++++ .../guided-demos/2_basic_interactive.ipynb | 8 ++++++++ .../guided-demos/3_widget_example.ipynb | 2 +- .../tests/widget_notebook_example.test.ts | 16 ++++++++-------- .../widgets-cell-3-linux.png | Bin 7692 -> 8156 bytes 6 files changed, 25 insertions(+), 10 deletions(-) diff --git a/demo-notebooks/guided-demos/0_basic_ray.ipynb b/demo-notebooks/guided-demos/0_basic_ray.ipynb index 51fb00268..be05130e1 100644 --- a/demo-notebooks/guided-demos/0_basic_ray.ipynb +++ b/demo-notebooks/guided-demos/0_basic_ray.ipynb @@ -88,7 +88,7 @@ "id": "12eef53c", "metadata": {}, "source": [ - "Next, we want to bring our cluster up, so we call the `up()` function below to submit our Ray Cluster onto the queue, and begin the process of obtaining our resource cluster." + "To create the Ray Cluster, we can click the `Cluster Up` button to submit our Ray Cluster onto the queue, and begin the process of creating a Ray Cluster resource. Alternatively, you can run the code cell below to do the same." ] }, { diff --git a/demo-notebooks/guided-demos/1_cluster_job_client.ipynb b/demo-notebooks/guided-demos/1_cluster_job_client.ipynb index aaed99304..8db650ddd 100644 --- a/demo-notebooks/guided-demos/1_cluster_job_client.ipynb +++ b/demo-notebooks/guided-demos/1_cluster_job_client.ipynb @@ -76,6 +76,13 @@ "))" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To create the Ray Cluster, we can tick the `Wait for cluster?` checkbox and click the `Cluster Up` button to submit our Ray Cluster onto the queue, and begin the process of creating a Ray Cluster resource while waiting for the Ray Dashboard to be available. Alternatively, you can run the code cell below to do the same." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/demo-notebooks/guided-demos/2_basic_interactive.ipynb b/demo-notebooks/guided-demos/2_basic_interactive.ipynb index 8610a0557..5528d04b2 100644 --- a/demo-notebooks/guided-demos/2_basic_interactive.ipynb +++ b/demo-notebooks/guided-demos/2_basic_interactive.ipynb @@ -81,6 +81,14 @@ "))" ] }, + { + "cell_type": "markdown", + "id": "6973247b", + "metadata": {}, + "source": [ + "To create the Ray Cluster, we can tick the `Wait for cluster?` checkbox and click the `Cluster Up` button to submit our Ray Cluster onto the queue, and begin the process of creating a Ray Cluster resource while waiting for the Ray Dashboard to be available. Alternatively, you can run the code cell below to do the same." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/demo-notebooks/guided-demos/3_widget_example.ipynb b/demo-notebooks/guided-demos/3_widget_example.ipynb index cf0df6ddf..243c75ec1 100644 --- a/demo-notebooks/guided-demos/3_widget_example.ipynb +++ b/demo-notebooks/guided-demos/3_widget_example.ipynb @@ -65,7 +65,7 @@ "# Create and configure our cluster object\n", "# The SDK will try to find the name of your default local queue based on the annotation \"kueue.x-k8s.io/default-queue\": \"true\" unless you specify the local queue manually below\n", "cluster = Cluster(ClusterConfiguration(\n", - " name='raytest',\n", + " name='widgettest',\n", " head_cpu_requests='500m',\n", " head_cpu_limits='500m',\n", " head_memory_requests=2,\n", diff --git a/ui-tests/tests/widget_notebook_example.test.ts b/ui-tests/tests/widget_notebook_example.test.ts index db746e00f..d37c225c2 100644 --- a/ui-tests/tests/widget_notebook_example.test.ts +++ b/ui-tests/tests/widget_notebook_example.test.ts @@ -88,7 +88,7 @@ test.describe("Visual Regression", () => { await interactWithWidget(page, upDownWidgetCellIndex, 'button:has-text("Cluster Up")', async (button) => { await button.click(); - const successMessage = await page.waitForSelector('text=Ray Cluster: \'raytest\' has successfully been created', { timeout: 10000 }); + const successMessage = await page.waitForSelector('text=Ray Cluster: \'widgettest\' has successfully been created', { timeout: 10000 }); expect(successMessage).not.toBeNull(); const resourcesMessage = await page.waitForSelector('text=Waiting for requested resources to be set up...'); @@ -105,20 +105,20 @@ test.describe("Visual Regression", () => { await interactWithWidget(page, upDownWidgetCellIndex, 'button:has-text("Cluster Down")', async (button) => { await button.click(); - const clusterDownMessage = await page.waitForSelector('text=Ray Cluster: \'raytest\' has successfully been deleted', { timeout: 5000 }); + const clusterDownMessage = await page.waitForSelector('text=Ray Cluster: \'widgettest\' has successfully been deleted', { timeout: 5000 }); expect(clusterDownMessage).not.toBeNull(); }); await runPreviousCell(page, cellCount, '(, False)'); // Replace text in ClusterConfiguration to run a new RayCluster - const cell = page.getByText('raytest').first(); - await cell.fill('"raytest-1"'); + const cell = page.getByText('widgettest').first(); + await cell.fill('"widgettest-1"'); await page.notebook.runCell(cellCount - 3, true); // Run ClusterConfiguration cell await interactWithWidget(page, upDownWidgetCellIndex, 'button:has-text("Cluster Up")', async (button) => { await button.click(); - const successMessage = await page.waitForSelector('text=Ray Cluster: \'raytest-1\' has successfully been created', { timeout: 10000 }); + const successMessage = await page.waitForSelector('text=Ray Cluster: \'widgettest-1\' has successfully been created', { timeout: 10000 }); expect(successMessage).not.toBeNull(); }); @@ -146,13 +146,13 @@ test.describe("Visual Regression", () => { await interactWithWidget(page, viewClustersCellIndex, 'button:has-text("Open Ray Dashboard")', async (button) => { await button.click(); - const successMessage = await page.waitForSelector('text=Opening Ray Dashboard for raytest-1 cluster', { timeout: 5000 }); + const successMessage = await page.waitForSelector('text=Opening Ray Dashboard for widgettest-1 cluster', { timeout: 5000 }); expect(successMessage).not.toBeNull(); }); await interactWithWidget(page, viewClustersCellIndex, 'button:has-text("View Jobs")', async (button) => { await button.click(); - const successMessage = await page.waitForSelector('text=Opening Ray Jobs Dashboard for raytest-1 cluster', { timeout: 5000 }); + const successMessage = await page.waitForSelector('text=Opening Ray Jobs Dashboard for widgettest-1 cluster', { timeout: 5000 }); expect(successMessage).not.toBeNull(); }); @@ -161,7 +161,7 @@ test.describe("Visual Regression", () => { const noClustersMessage = await page.waitForSelector(`text=No clusters found in the ${namespace} namespace.`, { timeout: 5000 }); expect(noClustersMessage).not.toBeNull(); - const successMessage = await page.waitForSelector(`text=Cluster raytest-1 in the ${namespace} namespace was deleted successfully.`, { timeout: 5000 }); + const successMessage = await page.waitForSelector(`text=Cluster widgettest-1 in the ${namespace} namespace was deleted successfully.`, { timeout: 5000 }); expect(successMessage).not.toBeNull(); }); diff --git a/ui-tests/tests/widget_notebook_example.test.ts-snapshots/widgets-cell-3-linux.png b/ui-tests/tests/widget_notebook_example.test.ts-snapshots/widgets-cell-3-linux.png index bd55aa7784a429a7cdb660b8d4e299e3eeb26f3c..1454d17ca7c04e2fc1f89e7a0114c7bfd5009416 100644 GIT binary patch literal 8156 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