From bbfa0ebf34f44dbb9f32b8621b2621d45d7dc647 Mon Sep 17 00:00:00 2001 From: Dongjoon Hyun Date: Mon, 19 Oct 2026 06:55:42 -0700 Subject: [PATCH 1/2] [SPARK-60342][CORE][WEBUI] Respect UI root in Master UI links --- .../org/apache/spark/deploy/master/ui/EnvironmentPage.scala | 2 +- .../scala/org/apache/spark/deploy/master/ui/LogPage.scala | 2 +- .../scala/org/apache/spark/deploy/master/ui/MasterPage.scala | 4 ++-- .../org/apache/spark/deploy/master/MasterSuiteBase.scala | 5 +++++ .../org/apache/spark/deploy/master/MasterWorkerUISuite.scala | 5 +++++ 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/core/src/main/scala/org/apache/spark/deploy/master/ui/EnvironmentPage.scala b/core/src/main/scala/org/apache/spark/deploy/master/ui/EnvironmentPage.scala index 0874531752579..06a65d3641e53 100644 --- a/core/src/main/scala/org/apache/spark/deploy/master/ui/EnvironmentPage.scala +++ b/core/src/main/scala/org/apache/spark/deploy/master/ui/EnvironmentPage.scala @@ -62,7 +62,7 @@ private[ui] class EnvironmentPage( val content =
-

Back to Master

+

Back to Master

++
-

Back to Master

+

Back to Master

{range}
{moreButton}
diff --git a/core/src/main/scala/org/apache/spark/deploy/master/ui/MasterPage.scala b/core/src/main/scala/org/apache/spark/deploy/master/ui/MasterPage.scala index c89f586f7e6de..68cabe63ecf81 100644 --- a/core/src/main/scala/org/apache/spark/deploy/master/ui/MasterPage.scala +++ b/core/src/main/scala/org/apache/spark/deploy/master/ui/MasterPage.scala @@ -193,8 +193,8 @@ private[ui] class MasterPage(parent: MasterWebUI) extends WebUIPage("") { {state.completedDrivers.count(_.state == DriverState.RELAUNCHING)} Relaunching)
  • Status: {state.status} - (Environment, - Log) + (Environment, + Log)
  • diff --git a/core/src/test/scala/org/apache/spark/deploy/master/MasterSuiteBase.scala b/core/src/test/scala/org/apache/spark/deploy/master/MasterSuiteBase.scala index 70291625cdb43..ac9d42931b17b 100644 --- a/core/src/test/scala/org/apache/spark/deploy/master/MasterSuiteBase.scala +++ b/core/src/test/scala/org/apache/spark/deploy/master/MasterSuiteBase.scala @@ -144,6 +144,9 @@ trait MasterSuiteBase extends SparkFunSuite // groups represent URL and worker ID val WORKER_LINK_RE = """\s*(worker-.+?)\s*""".r + // regex to extract site-relative links from the webui HTML + val SITE_RELATIVE_LINK_RE = """href="(/[^"]*)"""".r + private var _master: Master = _ after { @@ -179,6 +182,8 @@ trait MasterSuiteBase extends SparkFunSuite html should include (s"""href="$proxyUrl/static""") html should not include ("""src="/static""") html should include (s"""src="$proxyUrl/static""") + // other site-relative links, e.g. "Back to Master", must not bypass the proxy either + (SITE_RELATIVE_LINK_RE findAllMatchIn html).foreach(_.group(1) should startWith (proxyUrl)) } protected def verifyDrivers( diff --git a/core/src/test/scala/org/apache/spark/deploy/master/MasterWorkerUISuite.scala b/core/src/test/scala/org/apache/spark/deploy/master/MasterWorkerUISuite.scala index 5f206f611fe6b..2abfc5b0cfaa0 100644 --- a/core/src/test/scala/org/apache/spark/deploy/master/MasterWorkerUISuite.scala +++ b/core/src/test/scala/org/apache/spark/deploy/master/MasterWorkerUISuite.scala @@ -133,6 +133,11 @@ class MasterWorkerUISuite extends MasterSuiteBase { .tryWithResource(Source.fromURL(s"$masterUrl/"))(_.getLines().mkString("\n")) html should include ("Spark Master at spark://") verifyStaticResourcesServedByProxy(html, reverseProxyUrl) + Seq("environment/", "logPage/?self&logType=out").foreach { path => + val pageHtml = Utils + .tryWithResource(Source.fromURL(s"$masterUrl/$path"))(_.getLines().mkString("\n")) + verifyStaticResourcesServedByProxy(pageHtml, reverseProxyUrl) + } verifyWorkerUI(html, masterUrl, reverseProxyUrl) } } finally { From be47a5147a87055c03df90393e301c9e5d868562 Mon Sep 17 00:00:00 2001 From: Dongjoon Hyun Date: Mon, 19 Oct 2026 13:56:58 -0700 Subject: [PATCH 2/2] Address comments --- .../org/apache/spark/deploy/master/MasterSuiteBase.scala | 3 ++- .../org/apache/spark/deploy/master/MasterWorkerUISuite.scala | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/core/src/test/scala/org/apache/spark/deploy/master/MasterSuiteBase.scala b/core/src/test/scala/org/apache/spark/deploy/master/MasterSuiteBase.scala index ac9d42931b17b..800ce81657e3d 100644 --- a/core/src/test/scala/org/apache/spark/deploy/master/MasterSuiteBase.scala +++ b/core/src/test/scala/org/apache/spark/deploy/master/MasterSuiteBase.scala @@ -183,7 +183,8 @@ trait MasterSuiteBase extends SparkFunSuite html should not include ("""src="/static""") html should include (s"""src="$proxyUrl/static""") // other site-relative links, e.g. "Back to Master", must not bypass the proxy either - (SITE_RELATIVE_LINK_RE findAllMatchIn html).foreach(_.group(1) should startWith (proxyUrl)) + (SITE_RELATIVE_LINK_RE findAllMatchIn html).map(_.group(1)) + .filterNot(_.startsWith(proxyUrl)).toSeq shouldBe empty } protected def verifyDrivers( diff --git a/core/src/test/scala/org/apache/spark/deploy/master/MasterWorkerUISuite.scala b/core/src/test/scala/org/apache/spark/deploy/master/MasterWorkerUISuite.scala index 2abfc5b0cfaa0..47ecdb3dd044b 100644 --- a/core/src/test/scala/org/apache/spark/deploy/master/MasterWorkerUISuite.scala +++ b/core/src/test/scala/org/apache/spark/deploy/master/MasterWorkerUISuite.scala @@ -136,7 +136,9 @@ class MasterWorkerUISuite extends MasterSuiteBase { Seq("environment/", "logPage/?self&logType=out").foreach { path => val pageHtml = Utils .tryWithResource(Source.fromURL(s"$masterUrl/$path"))(_.getLines().mkString("\n")) - verifyStaticResourcesServedByProxy(pageHtml, reverseProxyUrl) + withClue(s"$path: ") { + verifyStaticResourcesServedByProxy(pageHtml, reverseProxyUrl) + } } verifyWorkerUI(html, masterUrl, reverseProxyUrl) }