From 9300c1bbeaaabd924094a63074f9da23ea13e500 Mon Sep 17 00:00:00 2001 From: Will Browne Date: Tue, 6 Aug 2024 09:21:40 +0100 Subject: [PATCH] Plugins: Update CLI check if plugin is already installed (#91213) * check if plugin installed * undo remove initial vers check * still attempt deps --- .../grafana-cli/commands/install_command.go | 30 +++++++++++++++---- pkg/cmd/grafana-cli/services/services.go | 6 ++-- pkg/plugins/storage/fs.go | 2 +- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/pkg/cmd/grafana-cli/commands/install_command.go b/pkg/cmd/grafana-cli/commands/install_command.go index bb39301cd40..de4ae3f9b7c 100644 --- a/pkg/cmd/grafana-cli/commands/install_command.go +++ b/pkg/cmd/grafana-cli/commands/install_command.go @@ -117,8 +117,13 @@ func doInstallPlugin(ctx context.Context, pluginID, version string, o pluginInst // If a version is specified, check if it is already installed if version != "" { - if services.PluginVersionInstalled(pluginID, version, o.pluginDir) { + if p, ok := services.PluginVersionInstalled(pluginID, version, o.pluginDir); ok { services.Logger.Successf("Plugin %s v%s already installed.", pluginID, version) + for _, depP := range p.JSONData.Dependencies.Plugins { + if err := doInstallPlugin(ctx, depP.ID, depP.Version, o, installing); err != nil { + return err + } + } return nil } } @@ -133,13 +138,28 @@ func doInstallPlugin(ctx context.Context, pluginID, version string, o pluginInst var archive *repo.PluginArchive var err error - pluginZipURL := o.pluginURL - if pluginZipURL != "" { - if archive, err = repository.GetPluginArchiveByURL(ctx, pluginZipURL, compatOpts); err != nil { + if o.pluginURL != "" { + archive, err = repository.GetPluginArchiveByURL(ctx, o.pluginURL, compatOpts) + if err != nil { return err } } else { - if archive, err = repository.GetPluginArchive(ctx, pluginID, version, compatOpts); err != nil { + archiveInfo, err := repository.GetPluginArchiveInfo(ctx, pluginID, version, compatOpts) + if err != nil { + return err + } + + if p, ok := services.PluginVersionInstalled(pluginID, archiveInfo.Version, o.pluginDir); ok { + services.Logger.Successf("Plugin %s v%s already installed.", pluginID, archiveInfo.Version) + for _, depP := range p.JSONData.Dependencies.Plugins { + if err = doInstallPlugin(ctx, depP.ID, depP.Version, o, installing); err != nil { + return err + } + } + return nil + } + + if archive, err = repository.GetPluginArchiveByURL(ctx, archiveInfo.URL, compatOpts); err != nil { return err } } diff --git a/pkg/cmd/grafana-cli/services/services.go b/pkg/cmd/grafana-cli/services/services.go index 00fffc487e2..89cfa072c2a 100644 --- a/pkg/cmd/grafana-cli/services/services.go +++ b/pkg/cmd/grafana-cli/services/services.go @@ -88,14 +88,14 @@ func GetLocalPlugins(pluginDir string) []*plugins.FoundBundle { return res } -func PluginVersionInstalled(pluginID, version, pluginDir string) bool { +func PluginVersionInstalled(pluginID, version, pluginDir string) (plugins.FoundPlugin, bool) { for _, bundle := range GetLocalPlugins(pluginDir) { pJSON := bundle.Primary.JSONData if pJSON.ID == pluginID { if pJSON.Info.Version == version { - return true + return bundle.Primary, true } } } - return false + return plugins.FoundPlugin{}, false } diff --git a/pkg/plugins/storage/fs.go b/pkg/plugins/storage/fs.go index 9fb1ba899cf..e036a0b8c2f 100644 --- a/pkg/plugins/storage/fs.go +++ b/pkg/plugins/storage/fs.go @@ -237,7 +237,7 @@ func readPluginJSON(pluginDir string) (plugins.JSONData, error) { // nolint:gosec data, err = os.ReadFile(pluginPath) if err != nil { - return plugins.JSONData{}, fmt.Errorf("could not find plugin.json or dist/plugin.json for in %s", pluginDir) + return plugins.JSONData{}, fmt.Errorf("could not find plugin.json or dist/plugin.json in %s", pluginDir) } }