Skip to content

Commit 7707661

Browse files
committed
Add yoshi get_job_definition
1 parent a5866b3 commit 7707661

File tree

7 files changed

+643
-16
lines changed

7 files changed

+643
-16
lines changed

TESTING.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ task install
3030
task start-spark-bg && task start-mcp-bg && task start-inspector-bg
3131

3232
# Opens http://localhost:6274 automatically in your browser
33-
# When done: task stop-all
33+
# When done
34+
task stop-all
3435
```
3536

3637
**Alternative** (if you prefer manual control):

pyproject.toml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ dependencies = [
2727
"boto3~=1.34",
2828
"pydantic-settings>=2.9.1",
2929
"requests[socks]>=2.31.0",
30-
"pysocks>=1.7.1"
30+
"pysocks>=1.7.1",
31+
"yoshi-client",
32+
"dd-internal-authentication",
3133
]
3234

3335
[build-system]
@@ -103,3 +105,7 @@ name = "pypi-test"
103105
url = "https://test.pypi.org/simple/"
104106
publish-url = "https://test.pypi.org/legacy/"
105107
explicit = true
108+
109+
[tool.uv.sources]
110+
yoshi-client = { url = "https://binaries.ddbuild.io/dd-source/python/yoshi_client-0.0.76422691-py3-none-any.whl" }
111+
dd-internal-authentication = { url = "https://binaries.ddbuild.io/dd-source/python/dd_internal_authentication-0.0.79707356-py3-none-any.whl" }

src/spark_history_mcp/common/__init__.py

Whitespace-only changes.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import logging
2+
3+
from dd_internal_authentication.libs.py.dd_internal_authentication.dd_internal_authentication.client import (
4+
JWTDDToolAuthClientTokenManager,
5+
)
6+
7+
logger = logging.getLogger(__name__)
8+
9+
10+
def get_token(datacenter: str, audience: str) -> str:
11+
token = JWTDDToolAuthClientTokenManager.instance(
12+
name=audience, datacenter=datacenter
13+
).get_token(audience)
14+
return str(token)
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import os
2+
3+
from yoshi_client.domains.data_eng_infra.shared.libs.py.yoshi_client import (
4+
Configuration,
5+
ApiClient,
6+
JobApi,
7+
Job,
8+
)
9+
10+
from spark_history_mcp.common import vault
11+
12+
13+
class Yoshi:
14+
AUDIENCE = "rapid-data-eng-infra"
15+
16+
def __init__(self, datacenter: str):
17+
host =f"https://yoshi.{datacenter}"
18+
if os.getenv("POD_NAME"):
19+
host = f"https://yoshi.{self.AUDIENCE}.all-clusters.local-dc.fabric.dog:8443"
20+
self.configuration = Configuration(
21+
host=host,
22+
access_token=vault.get_token(datacenter, self.AUDIENCE),
23+
)
24+
25+
def get_job_definition(self, job_id: str) -> Job:
26+
with ApiClient(self.configuration) as api_client:
27+
job_api = JobApi(api_client)
28+
return job_api.v2_get_job(job_id=job_id)

src/spark_history_mcp/tools/tools.py

Lines changed: 52 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1+
import os
12
from datetime import datetime
23
import heapq
34
import logging
45
from typing import Any, Dict, List, Optional
56

7+
from yoshi_client.domains.data_eng_infra.shared.libs.py.yoshi_client import Job
8+
69
from spark_history_mcp.core.app import mcp
710
from spark_history_mcp.models.mcp_types import (
811
JobSummary,
@@ -18,11 +21,14 @@
1821
StageStatus,
1922
TaskMetricDistributions,
2023
)
24+
from ..common.yoshi import Yoshi
2125

2226
from ..utils.utils import parallel_execute
2327

2428
logger = logging.getLogger(__name__)
2529

30+
DATACENTER = os.environ.get("DD_DATACENTER", "us1.staging.dog")
31+
2632

2733
def get_client_or_default(
2834
ctx, server_name: Optional[str] = None, app_id: Optional[str] = None
@@ -1296,39 +1302,72 @@ def get_resource_usage_timeline(
12961302
},
12971303
}
12981304

1305+
12991306
@mcp.tool()
1300-
def get_yoshi_job(job_id: str):
1301-
pass
1307+
def get_job_definition(job_id: str) -> Job:
1308+
"""Get job definition
1309+
1310+
Args:
1311+
job_id: Job identifier
1312+
1313+
Returns:
1314+
Job: Job definition
1315+
"""
1316+
return Yoshi(DATACENTER).get_job_definition(job_id)
13021317

13031318

1304-
#@mcp.tool()
1305-
def get_job_logs(job_id: str, status: Optional[str] = None, start_time: Optional[datetime] = None, end_time: Optional[datetime] = None):
1319+
# @mcp.tool()
1320+
def get_job_logs(
1321+
job_id: str,
1322+
status: Optional[str] = None,
1323+
start_time: Optional[datetime] = None,
1324+
end_time: Optional[datetime] = None,
1325+
):
13061326
pass
13071327

13081328

1309-
#@mcp.tool()
1310-
def get_operator_logs(job_id: str, status: Optional[str] = None, start_time: Optional[datetime] = None, end_time: Optional[datetime] = None):
1329+
# @mcp.tool()
1330+
def get_operator_logs(
1331+
job_id: str,
1332+
status: Optional[str] = None,
1333+
start_time: Optional[datetime] = None,
1334+
end_time: Optional[datetime] = None,
1335+
):
13111336
# can be merged with get_job_logs???
13121337
pass
13131338

1314-
#@mcp.tool()
1315-
def get_workflow_logs(workflow_id: str, status: Optional[str] = None, start_time: Optional[datetime] = None, end_time: Optional[datetime] = None):
1339+
1340+
# @mcp.tool()
1341+
def get_workflow_logs(
1342+
workflow_id: str,
1343+
status: Optional[str] = None,
1344+
start_time: Optional[datetime] = None,
1345+
end_time: Optional[datetime] = None,
1346+
):
13161347
pass
13171348

13181349

1319-
#@mcp.tool()
1320-
def get_admission_logs(job_id: str, status: Optional[str] = None, start_time: Optional[datetime] = None, end_time: Optional[datetime] = None):
1350+
# @mcp.tool()
1351+
def get_admission_logs(
1352+
job_id: str,
1353+
status: Optional[str] = None,
1354+
start_time: Optional[datetime] = None,
1355+
end_time: Optional[datetime] = None,
1356+
):
13211357
pass
13221358

1323-
#@mcp.tool()
1359+
1360+
# @mcp.tool()
13241361
def get_oom_metrics_job(job_id: str):
13251362
# oom_kill.oom_process.count
13261363
pass
13271364

1328-
#@mcp.tool()
1365+
1366+
# @mcp.tool()
13291367
def get_cpu_metrics_job(job_id: str):
13301368
pass
13311369

1332-
#@mcp.tool()
1370+
1371+
# @mcp.tool()
13331372
def get_memory_metrics_job(job_id: str):
13341373
pass

0 commit comments

Comments
 (0)