Skip to content

Commit 7e1d2aa

Browse files
authored
Support remote servers in workload management commands (stop/restart/rm) (#1541)
1 parent a42cd78 commit 7e1d2aa

File tree

13 files changed

+566
-157
lines changed

13 files changed

+566
-157
lines changed

cmd/thv/app/restart.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@ var (
1818
)
1919

2020
var restartCmd = &cobra.Command{
21-
Use: "restart [workload-name]",
22-
Short: "Restart a tooling server",
23-
Long: `Restart a running tooling server managed by ToolHive. If the server is not running, it will be started.`,
21+
Use: "restart [workload-name]",
22+
Short: "Restart a tooling server",
23+
Long: `Restart a running tooling server managed by ToolHive.
24+
If the server is not running, it will be started.
25+
Supports both container-based and remote MCP servers.`,
2426
Args: cobra.RangeArgs(0, 1),
2527
RunE: restartCmdFunc,
2628
ValidArgsFunction: completeMCPServerNames,
@@ -76,7 +78,7 @@ func restartCmdFunc(cmd *cobra.Command, args []string) error {
7678
return fmt.Errorf("failed to restart workload %s: %v", workloadName, err)
7779
}
7880

79-
fmt.Printf("Container %s restarted successfully\n", workloadName)
81+
fmt.Printf("Workload %s restarted successfully\n", workloadName)
8082
return nil
8183
}
8284

@@ -88,7 +90,7 @@ func restartAllContainers(ctx context.Context, workloadManager workloads.Manager
8890
}
8991

9092
if len(allWorkloads) == 0 {
91-
fmt.Println("No MCP servers found to restart")
93+
fmt.Println("No workloads found to restart")
9294
return nil
9395
}
9496

@@ -124,7 +126,7 @@ func restartWorkloadsByGroup(ctx context.Context, workloadManager workloads.Mana
124126
}
125127

126128
if len(workloadNames) == 0 {
127-
fmt.Printf("No MCP servers found in group '%s' to restart\n", groupName)
129+
fmt.Printf("No workloads found in group '%s' to restart\n", groupName)
128130
return nil
129131
}
130132

@@ -142,7 +144,7 @@ func restartMultipleWorkloads(
142144
failedCount := 0
143145
var errors []string
144146

145-
fmt.Printf("Restarting %d MCP server(s)...\n", len(workloadNames))
147+
fmt.Printf("Restarting %d workload(s)...\n", len(workloadNames))
146148

147149
var restartRequests []*errgroup.Group
148150
// First, trigger the restarts concurrently.

cmd/thv/app/run_flags.go

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -495,18 +495,19 @@ func getRemoteAuthFromRemoteServerMetadata(remoteServerMetadata *registry.Remote
495495

496496
if remoteServerMetadata.OAuthConfig != nil {
497497
return &runner.RemoteAuthConfig{
498-
ClientID: runFlags.RemoteAuthFlags.RemoteAuthClientID,
499-
ClientSecret: runFlags.RemoteAuthFlags.RemoteAuthClientSecret,
500-
Scopes: remoteServerMetadata.OAuthConfig.Scopes,
501-
SkipBrowser: runFlags.RemoteAuthFlags.RemoteAuthSkipBrowser,
502-
Timeout: runFlags.RemoteAuthFlags.RemoteAuthTimeout,
503-
CallbackPort: remoteServerMetadata.OAuthConfig.CallbackPort,
504-
Issuer: remoteServerMetadata.OAuthConfig.Issuer,
505-
AuthorizeURL: remoteServerMetadata.OAuthConfig.AuthorizeURL,
506-
TokenURL: remoteServerMetadata.OAuthConfig.TokenURL,
507-
OAuthParams: remoteServerMetadata.OAuthConfig.OAuthParams,
508-
Headers: remoteServerMetadata.Headers,
509-
EnvVars: remoteServerMetadata.EnvVars,
498+
EnableRemoteAuth: runFlags.RemoteAuthFlags.EnableRemoteAuth || runFlags.RemoteAuthFlags.RemoteAuthClientID != "",
499+
ClientID: runFlags.RemoteAuthFlags.RemoteAuthClientID,
500+
ClientSecret: runFlags.RemoteAuthFlags.RemoteAuthClientSecret,
501+
Scopes: remoteServerMetadata.OAuthConfig.Scopes,
502+
SkipBrowser: runFlags.RemoteAuthFlags.RemoteAuthSkipBrowser,
503+
Timeout: runFlags.RemoteAuthFlags.RemoteAuthTimeout,
504+
CallbackPort: remoteServerMetadata.OAuthConfig.CallbackPort,
505+
Issuer: remoteServerMetadata.OAuthConfig.Issuer,
506+
AuthorizeURL: remoteServerMetadata.OAuthConfig.AuthorizeURL,
507+
TokenURL: remoteServerMetadata.OAuthConfig.TokenURL,
508+
OAuthParams: remoteServerMetadata.OAuthConfig.OAuthParams,
509+
Headers: remoteServerMetadata.Headers,
510+
EnvVars: remoteServerMetadata.EnvVars,
510511
}
511512
}
512513
return nil

docs/cli/thv_restart.md

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/server/docs.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/server/swagger.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/server/swagger.yaml

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/core/workload.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,6 @@ type Workload struct {
3939
Group string `json:"group,omitempty"`
4040
// ToolsFilter is the filter on tools applied to the workload.
4141
ToolsFilter []string `json:"tools,omitempty"`
42+
// Remote indicates whether this is a remote workload (true) or a container workload (false).
43+
Remote bool `json:"remote,omitempty"`
4244
}

pkg/runner/config.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -365,10 +365,16 @@ func (c *RunConfig) WithEnvFile(filePath string) (*RunConfig, error) {
365365

366366
// WithContainerName generates container name if not already set
367367
func (c *RunConfig) WithContainerName() *RunConfig {
368-
if c.ContainerName == "" && c.Image != "" {
369-
containerName, baseName := container.GetOrGenerateContainerName(c.Name, c.Image)
370-
c.ContainerName = containerName
371-
c.BaseName = baseName
368+
if c.ContainerName == "" {
369+
if c.Image != "" {
370+
// For container-based servers
371+
containerName, baseName := container.GetOrGenerateContainerName(c.Name, c.Image)
372+
c.ContainerName = containerName
373+
c.BaseName = baseName
374+
} else if c.RemoteURL != "" && c.Name != "" {
375+
// For remote servers, use the provided name as base name
376+
c.BaseName = c.Name
377+
}
372378
}
373379
return c
374380
}

pkg/runner/runner.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ func (r *Runner) handleRemoteAuthentication(ctx context.Context) (*oauth2.TokenS
321321
authHandler := NewRemoteAuthHandler(r.Config.RemoteAuthConfig)
322322

323323
// Perform authentication
324-
tokenSource, err := authHandler.Authenticate(ctx, r.Config.Image)
324+
tokenSource, err := authHandler.Authenticate(ctx, r.Config.RemoteURL)
325325
if err != nil {
326326
return nil, fmt.Errorf("remote authentication failed: %w", err)
327327
}

0 commit comments

Comments
 (0)