Skip to content

Commit 43b696c

Browse files
fix: Remove 'Dataproc Session' link from the cell output and update 'View Session Details' button url. (#163)
1 parent 3beb0fc commit 43b696c

File tree

2 files changed

+75
-11
lines changed

2 files changed

+75
-11
lines changed

google/cloud/dataproc_spark_connect/session.py

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@
6767
"goog-colab-notebook-id",
6868
}
6969

70+
_DATAPROC_SESSIONS_BASE_URL = (
71+
"https://console.cloud.google.com/dataproc/interactive"
72+
)
73+
7074

7175
def _is_valid_label_value(value: str) -> bool:
7276
"""
@@ -494,15 +498,21 @@ def _wait_for_session_available(
494498
)
495499

496500
def _display_session_link_on_creation(self, session_id):
497-
session_url = f"https://console.cloud.google.com/dataproc/interactive/{self._region}/{session_id}?project={self._project_id}"
501+
session_url = f"{_DATAPROC_SESSIONS_BASE_URL}/{self._region}/{session_id}?project={self._project_id}"
498502
plain_message = f"Creating Dataproc Session: {session_url}"
499-
html_element = f"""
503+
if environment.is_colab_enterprise():
504+
html_element = f"""
500505
<div>
501506
<p>Creating Dataproc Spark Session<p>
502-
<p><a href="{session_url}">Dataproc Session</a></p>
503507
</div>
504-
"""
505-
508+
"""
509+
else:
510+
html_element = f"""
511+
<div>
512+
<p>Creating Dataproc Spark Session<p>
513+
<p><a href="{session_url}">Dataproc Session</a></p>
514+
</div>
515+
"""
506516
self._output_element_or_message(plain_message, html_element)
507517

508518
def _print_session_created_message(self):
@@ -554,7 +564,7 @@ def _get_exiting_active_session(
554564

555565
if session_response is not None:
556566
print(
557-
f"Using existing Dataproc Session (configuration changes may not be applied): https://console.cloud.google.com/dataproc/interactive/{self._region}/{s8s_session_id}?project={self._project_id}"
567+
f"Using existing Dataproc Session (configuration changes may not be applied): {_DATAPROC_SESSIONS_BASE_URL}/{self._region}/{s8s_session_id}?project={self._project_id}"
558568
)
559569
self._display_view_session_details_button(s8s_session_id)
560570
if session is None:
@@ -798,7 +808,7 @@ def _display_view_session_details_button(self, session_id):
798808
return
799809

800810
try:
801-
session_url = f"https://console.cloud.google.com/dataproc/interactive/sessions/{session_id}/locations/{self._region}?project={self._project_id}"
811+
session_url = f"{_DATAPROC_SESSIONS_BASE_URL}/{self._region}/{session_id}?project={self._project_id}"
802812
from IPython.core.interactiveshell import InteractiveShell
803813

804814
if not InteractiveShell.initialized():
@@ -1060,7 +1070,7 @@ def _repr_html_(self) -> str:
10601070
<div>No Active Dataproc Session</div>
10611071
"""
10621072

1063-
s8s_session = f"https://console.cloud.google.com/dataproc/interactive/{self._region}/{self._active_s8s_session_id}"
1073+
s8s_session = f"{_DATAPROC_SESSIONS_BASE_URL}/{self._region}/{self._active_s8s_session_id}"
10641074
ui = f"{s8s_session}/sparkApplications/applications"
10651075
return f"""
10661076
<div>
@@ -1087,7 +1097,7 @@ def _display_operation_link(self, operation_id: str):
10871097
)
10881098

10891099
url = (
1090-
f"https://console.cloud.google.com/dataproc/interactive/{self._region}/"
1100+
f"{_DATAPROC_SESSIONS_BASE_URL}/{self._region}/"
10911101
f"{self._active_s8s_session_id}/sparkApplications/application;"
10921102
f"associatedSqlOperationId={operation_id}?project={self._project_id}"
10931103
)

tests/unit/test_session.py

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@
3838
from pyspark.sql.connect.proto import Command, ConfigResponse, ExecutePlanRequest, Plan, Relation, SQL, SqlCommand, UserContext
3939
from unittest import mock
4040

41+
_DATAPROC_SESSIONS_BASE_URL = (
42+
"https://console.cloud.google.com/dataproc/interactive"
43+
)
44+
4145

4246
class DataprocRemoteSparkSessionBuilderTests(unittest.TestCase):
4347

@@ -163,7 +167,7 @@ def test_create_spark_session_with_default_notebook_behavior(
163167
mock_ipython_utils = mock.sys.modules[
164168
"google.cloud.aiplatform.utils"
165169
]._ipython_utils
166-
test_session_url = f"https://console.cloud.google.com/dataproc/interactive/sessions/{session_id}/locations/test-region?project=test-project"
170+
test_session_url = f"{_DATAPROC_SESSIONS_BASE_URL}/test-region/{session_id}?project=test-project"
167171
mock_display_link = mock_ipython_utils.display_link
168172
mock.patch.dict(
169173
os.environ,
@@ -1189,7 +1193,7 @@ def test_display_button_with_aiplatform_installed_ipython_interactive(
11891193
mock_ipython_utils = mock.sys.modules[
11901194
"google.cloud.aiplatform.utils"
11911195
]._ipython_utils
1192-
test_session_url = "https://console.cloud.google.com/dataproc/interactive/sessions/test_session/locations/test-region?project=test-project"
1196+
test_session_url = f"{_DATAPROC_SESSIONS_BASE_URL}/test-region/test_session?project=test-project"
11931197

11941198
mock_display_link = mock_ipython_utils.display_link
11951199
DataprocSparkSession.builder._display_view_session_details_button(
@@ -1230,6 +1234,56 @@ def test_display_button_with_aiplatform_installed_ipython_non_interactive(
12301234
)
12311235
mock_display_link.assert_not_called()
12321236

1237+
@mock.patch(
1238+
"IPython.core.interactiveshell.InteractiveShell.initialized",
1239+
return_value=False,
1240+
)
1241+
@mock.patch("IPython.display.display")
1242+
def test_display_session_link_on_creation_colab_enterprise(
1243+
self,
1244+
mock_display,
1245+
_mock_ipy,
1246+
):
1247+
mock.patch.dict(
1248+
os.environ,
1249+
{
1250+
"VERTEX_PRODUCT": "COLAB_ENTERPRISE",
1251+
},
1252+
).start()
1253+
DataprocSparkSession.builder._display_session_link_on_creation(
1254+
"test_session"
1255+
)
1256+
1257+
mock_display.assert_called_once()
1258+
args, _ = mock_display.call_args
1259+
html_output = args[0].data
1260+
self.assertIn("Creating Dataproc Spark Session", html_output)
1261+
self.assertNotIn("Dataproc Session", html_output)
1262+
1263+
@mock.patch(
1264+
"IPython.core.interactiveshell.InteractiveShell.initialized",
1265+
return_value=False,
1266+
)
1267+
@mock.patch("IPython.display.display")
1268+
def test_display_session_link_on_creation_not_colab_enterprise(
1269+
self,
1270+
mock_display,
1271+
_mock_ipy,
1272+
):
1273+
mock.patch.dict(
1274+
os.environ,
1275+
{},
1276+
).start()
1277+
DataprocSparkSession.builder._display_session_link_on_creation(
1278+
"test_session"
1279+
)
1280+
1281+
mock_display.assert_called_once()
1282+
args, _ = mock_display.call_args
1283+
html_output = args[0].data
1284+
self.assertIn("Creating Dataproc Spark Session", html_output)
1285+
self.assertIn("Dataproc Session", html_output)
1286+
12331287
def test_is_valid_label_value(self):
12341288
# Valid label values
12351289
self.assertTrue(_is_valid_label_value("valid-label-123"))

0 commit comments

Comments
 (0)