[mcp] Handle non-default TaskExecutor

Some tasks run on different instances of Swarming from the default. We
need to use the correct instance to obtain their details.

Bug: b/491418947
Change-Id: Iae2e69e5b8979b8fcdf473abe62758c6985451cd
Reviewed-on: https://skia-review.googlesource.com/c/buildbot/+/1325936
Reviewed-by: Brett Somocurcio <brettos@google.com>
Auto-Submit: Eric Boren <borenet@google.com>
Commit-Queue: Brett Somocurcio <brettos@google.com>
diff --git a/mcp/services/skia/task_details/client.go b/mcp/services/skia/task_details/client.go
index 7b2e2ca..4e9306d 100644
--- a/mcp/services/skia/task_details/client.go
+++ b/mcp/services/skia/task_details/client.go
@@ -6,6 +6,7 @@
 	"encoding/json"
 	"fmt"
 	"io"
+	"net/http"
 	"strconv"
 	"strings"
 
@@ -39,11 +40,12 @@
 )
 
 type TaskDetailsClient struct {
-	swarm  swarmingv2.SwarmingV2Client
-	td     td_db.DB
-	tdLogs *logs.LogsManager
-	ts     ts_db.DBCloser
-	logdog LogDogClient
+	swarm           swarmingv2.SwarmingV2Client
+	swarmHttpClient *http.Client
+	td              td_db.DB
+	tdLogs          *logs.LogsManager
+	ts              ts_db.DBCloser
+	logdog          LogDogClient
 }
 
 func NewClient(ctx context.Context, btProject, btInstance, firestoreInstance, swarmingServer string) (*TaskDetailsClient, error) {
@@ -76,11 +78,12 @@
 	swarm := swarmingv2.NewDefaultClient(swarmHttpClient, swarmingServer)
 
 	return &TaskDetailsClient{
-		swarm:  swarm,
-		td:     tdDB,
-		tdLogs: tdLogs,
-		ts:     tsDB,
-		logdog: &logDogClientImpl{coord},
+		swarm:           swarm,
+		swarmHttpClient: swarmHttpClient,
+		td:              tdDB,
+		tdLogs:          tdLogs,
+		ts:              tsDB,
+		logdog:          &logDogClientImpl{coord},
 	}, nil
 }
 
@@ -115,7 +118,11 @@
 	if task == nil {
 		return nil, skerr.Fmt("No such task with ID %s", taskID)
 	}
-	swarmTask, err := c.swarm.GetResult(ctx, &apipb.TaskIdWithPerfRequest{TaskId: task.SwarmingTaskId})
+	swarm := c.swarm
+	if task.TaskExecutor != "" {
+		swarm = swarmingv2.NewDefaultClient(c.swarmHttpClient, task.TaskExecutor)
+	}
+	swarmTask, err := swarm.GetResult(ctx, &apipb.TaskIdWithPerfRequest{TaskId: task.SwarmingTaskId})
 	if err != nil {
 		return nil, skerr.Wrap(err)
 	}
@@ -133,7 +140,7 @@
 	}
 
 	// If we couldn't find recipe steps, just return the Swarming task logs.
-	swarmOutput, err := c.swarm.GetStdout(ctx, &apipb.TaskIdWithOffsetRequest{TaskId: task.SwarmingTaskId})
+	swarmOutput, err := swarm.GetStdout(ctx, &apipb.TaskIdWithOffsetRequest{TaskId: task.SwarmingTaskId})
 	if err != nil {
 		if !strings.Contains(err.Error(), "404 page not found") {
 			return nil, skerr.Wrap(err)