From be2e3b4583064d96b9fd46f8d23636f7f95e5963 Mon Sep 17 00:00:00 2001 From: chrischristiansen-glitch Date: Wed, 10 Jun 2026 04:57:54 +0200 Subject: [PATCH] fix(CI5): bytt til google.auth REST-kall for regional Cloud Build --- agents/mcp_server/server.py | 79 +++++++++++++++++++++---------------- 1 file changed, 46 insertions(+), 33 deletions(-) diff --git a/agents/mcp_server/server.py b/agents/mcp_server/server.py index 753edf5..e8ac463 100644 --- a/agents/mcp_server/server.py +++ b/agents/mcp_server/server.py @@ -1,5 +1,5 @@ # agents/mcp_server/server.py -# OPAX-MCP — Vauco sin egen MCP-server / CI-kanal mot GCP +# OPAX-MCP — Vauco sin eigen MCP-server / CI-kanal mot GCP import os import logging @@ -25,14 +25,27 @@ def verify_token(x_mcp_key: str = Header(default="")): return True -def _cloudbuild_client(): - """Returnerer CloudBuildClient koblet til regional endpoint.""" - from google.cloud.devtools import cloudbuild_v1 - from google.api_core.client_options import ClientOptions - endpoint = f"{REGION}-cloudbuild.googleapis.com" - return cloudbuild_v1.CloudBuildClient( - client_options=ClientOptions(api_endpoint=endpoint) +def _get_access_token() -> str: + import google.auth + import google.auth.transport.requests + creds, _ = google.auth.default(scopes=["https://www.googleapis.com/auth/cloud-platform"]) + creds.refresh(google.auth.transport.requests.Request()) + return creds.token + + +def _list_builds_rest(project_id: str, region: str, trigger_id: str, page_size: int = 1): + """Kaller Cloud Build v1 REST direkte mot regional endpoint.""" + import urllib.request + import json + token = _get_access_token() + url = ( + f"https://cloudbuild.googleapis.com/v1/" + f"projects/{project_id}/locations/{region}/builds" + f"?filter=trigger_id%3D%22{trigger_id}%22&pageSize={page_size}" ) + req = urllib.request.Request(url, headers={"Authorization": f"Bearer {token}"}) + with urllib.request.urlopen(req, timeout=10) as resp: + return json.loads(resp.read()) class PushStaticRequest(BaseModel): @@ -94,39 +107,36 @@ async def push_static(req: PushStaticRequest, _: bool = Depends(verify_token)): @app.get("/tools/get_build_status") async def get_build_status(_: bool = Depends(verify_token)): """ - Henter siste build fra osvauco-agent-main-trigger. - Bruker regional endpoint: {region}-cloudbuild.googleapis.com - og parent: projects/{project}/locations/{region} + Henter siste build fra osvauco-agent-main-trigger via REST mot + cloudbuild.googleapis.com/v1/projects/{p}/locations/{r}/builds """ try: - from google.cloud.devtools import cloudbuild_v1 - client = _cloudbuild_client() - parent = f"projects/{PROJECT_ID}/locations/{REGION}" - request = cloudbuild_v1.ListBuildsRequest( - parent=parent, - filter=f'trigger_id="{BUILD_TRIGGER_ID}"', - page_size=1, - ) - builds = list(client.list_builds(request=request)) + data = _list_builds_rest(PROJECT_ID, REGION, BUILD_TRIGGER_ID, page_size=1) + builds = data.get("builds", []) if not builds: return {"status": "unknown", "message": f"Ingen builds for trigger {BUILD_TRIGGER_ID} i {REGION}"} b = builds[0] - status_map = {1:"queued",2:"working",3:"success",4:"failure", - 5:"internal_error",6:"timeout",7:"cancelled"} - status_str = status_map.get(int(b.status), "unknown") - import time + status_str = b.get("status", "unknown").lower() + subs = b.get("substitutions", {}) + start = b.get("startTime") + finish = b.get("finishTime") duration_s = None - if b.finish_time and b.start_time: - duration_s = int(b.finish_time.seconds - b.start_time.seconds) - elif b.start_time: - duration_s = int(time.time() - b.start_time.seconds) + if start and finish: + from datetime import datetime, timezone + fmt = "%Y-%m-%dT%H:%M:%S.%fZ" + try: + t0 = datetime.strptime(start, fmt).replace(tzinfo=timezone.utc) + t1 = datetime.strptime(finish, fmt).replace(tzinfo=timezone.utc) + duration_s = int((t1 - t0).total_seconds()) + except Exception: + pass return { "status": status_str, - "build_id": b.id, - "branch": (b.substitutions or {}).get("BRANCH_NAME", "main"), - "commit": (b.substitutions or {}).get("SHORT_SHA", ""), + "build_id": b.get("id", ""), + "branch": subs.get("BRANCH_NAME", "main"), + "commit": subs.get("SHORT_SHA", ""), "duration_s": duration_s, - "log_url": b.log_url or "", + "log_url": b.get("logUrl", ""), "region": REGION, "trigger_id": BUILD_TRIGGER_ID, } @@ -139,7 +149,10 @@ async def get_build_status(_: bool = Depends(verify_token)): async def deploy_service(req: DeployServiceRequest, _: bool = Depends(verify_token)): try: from google.cloud.devtools import cloudbuild_v1 - client = _cloudbuild_client() + from google.api_core.client_options import ClientOptions + client = cloudbuild_v1.CloudBuildClient( + client_options=ClientOptions(api_endpoint=f"{REGION}-cloudbuild.googleapis.com") + ) trigger_id = req.trigger_id or BUILD_TRIGGER_ID subs = {"BRANCH_NAME": req.branch, **req.substitutions} response = client.run_build_trigger(