From 096b1e32d3980d8e2a776a6c3158f25f25681e21 Mon Sep 17 00:00:00 2001 From: Guillaume Lours <705411+glours@users.noreply.github.com> Date: Tue, 8 Apr 2025 10:44:20 +0200 Subject: [PATCH] plugin provider support: check docker model runner status Signed-off-by: Guillaume Lours <705411+glours@users.noreply.github.com> --- pkg/compose/plugins.go | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/pkg/compose/plugins.go b/pkg/compose/plugins.go index ed489d4a6..a905546fe 100644 --- a/pkg/compose/plugins.go +++ b/pkg/compose/plugins.go @@ -50,12 +50,16 @@ const ( func (s *composeService) runPlugin(ctx context.Context, project *types.Project, service types.ServiceConfig, command string) error { provider := *service.Provider - path, err := s.getPluginBinaryPath(provider.Type) + plugin, err := s.getPluginBinaryPath(provider.Type) if err != nil { return err } - cmd := s.setupPluginCommand(ctx, project, provider, path, command) + if err := s.checkPluginEnabledInDD(ctx, plugin); err != nil { + return err + } + + cmd := s.setupPluginCommand(ctx, project, provider, plugin.Path, command) eg := errgroup.Group{} stdout, err := cmd.StdoutPipe() @@ -121,13 +125,9 @@ func (s *composeService) runPlugin(ctx context.Context, project *types.Project, return nil } -func (s *composeService) getPluginBinaryPath(providerType string) (string, error) { +func (s *composeService) getPluginBinaryPath(providerType string) (*manager.Plugin, error) { // Only support Docker CLI plugins for first iteration. Could support any binary from PATH - plugin, err := manager.GetPlugin(providerType, s.dockerCli, &cobra.Command{}) - if err != nil { - return "", err - } - return plugin.Path, nil + return manager.GetPlugin(providerType, s.dockerCli, &cobra.Command{}) } func (s *composeService) setupPluginCommand(ctx context.Context, project *types.Project, provider types.ServiceProviderConfig, path, command string) *exec.Cmd { @@ -142,7 +142,7 @@ func (s *composeService) setupPluginCommand(ctx context.Context, project *types. // Use docker/cli mechanism to propagate termination signal to child process server, err := socket.NewPluginServer(nil) - if err != nil { + if err == nil { defer server.Close() //nolint:errcheck cmd.Cancel = server.Close cmd.Env = replace(cmd.Env, socket.EnvKey, server.Addr().String()) @@ -156,3 +156,24 @@ func (s *composeService) setupPluginCommand(ctx context.Context, project *types. cmd.Env = append(cmd.Env, types.Mapping(carrier).Values()...) return cmd } + +func (s *composeService) checkPluginEnabledInDD(ctx context.Context, plugin *manager.Plugin) error { + if integrationEnabled := s.isDesktopIntegrationActive(); !integrationEnabled { + return fmt.Errorf("you should enable Docker Desktop integration to use %q provider services", plugin.Name) + } + + // Until we support more use cases, check explicitly status of model runner + if plugin.Name == "model" { + cmd := exec.CommandContext(ctx, "docker", "model", "status") + _, err := cmd.CombinedOutput() + if err != nil { + var exitErr *exec.ExitError + if errors.As(err, &exitErr) && exitErr.ExitCode() == 1 { + return fmt.Errorf("you should enable model runner to use %q provider services: %s", plugin.Name, err.Error()) + } + } + } else { + return fmt.Errorf("unsupported provider %q", plugin.Name) + } + return nil +}