Files
steampipe/pkg/display/plugin_install.go
kaidaguerre 40804a3201 Execute RefreshConnections asyncronously and optimise for high connection count. Add connection_state table.
- Execute RefreshConnections asyncronously
- Add connection_state table to indicate the loading state of connections
- Optimise RefreshConnections by cloning connection schemas
- Add locking to ensure only a single instance of RefreshConnections runs
- Start executing queries without waiting for connections to load, add smart error handling to wait for required connection
- Optimise autocomplete for high connection count
- Autocomplete and inspect data available before all conections are refreshed
- Update file watcher to respond to CHMOD, so thaat it pickes up deletion of file contents

 Closes #3394
 Closes #3267
2023-05-10 09:05:08 +01:00

164 lines
4.6 KiB
Go

package display
import (
"fmt"
"sort"
"strings"
"github.com/turbot/steampipe/pkg/constants"
"github.com/turbot/steampipe/pkg/ociinstaller"
"github.com/turbot/steampipe/pkg/utils"
)
type PluginInstallReports []*PluginInstallReport
// making the type compatible with sort.Interface so that we can use the sort package utilities
func (i PluginInstallReports) Len() int { return len(i) }
func (i PluginInstallReports) Swap(lIdx, rIdx int) { i[lIdx], i[rIdx] = i[rIdx], i[lIdx] }
func (i PluginInstallReports) Less(lIdx, rIdx int) bool { return i[lIdx].Plugin < i[rIdx].Plugin }
type PluginInstallReport struct {
Skipped bool
Plugin string
SkipReason string
DocURL string
Version string
IsUpdateReport bool
}
func (i *PluginInstallReport) skipString() string {
ref := ociinstaller.NewSteampipeImageRef(i.Plugin)
_, name, stream := ref.GetOrgNameAndStream()
return fmt.Sprintf("Plugin: %s\nReason: %s", fmt.Sprintf("%s@%s", name, stream), i.SkipReason)
}
func (i *PluginInstallReport) installString() string {
thisReport := []string{}
if i.IsUpdateReport {
thisReport = append(
thisReport,
fmt.Sprintf("Updated plugin: %s%s", constants.Bold(i.Plugin), i.Version),
)
if len(i.DocURL) > 0 {
thisReport = append(
thisReport,
fmt.Sprintf("Documentation: %s", i.DocURL),
)
}
} else {
thisReport = append(
thisReport,
fmt.Sprintf("Installed plugin: %s%s", constants.Bold(i.Plugin), i.Version),
)
if len(i.DocURL) > 0 {
thisReport = append(
thisReport,
fmt.Sprintf("Documentation: %s", i.DocURL),
)
}
}
return strings.Join(thisReport, "\n")
}
func (i *PluginInstallReport) String() string {
if !i.Skipped {
return i.installString()
} else {
return i.skipString()
}
}
// PrintInstallReports Prints out the installation reports onto the console
func PrintInstallReports(reports PluginInstallReports, isUpdateReport bool) {
installedOrUpdated := PluginInstallReports{}
canBeInstalled := PluginInstallReports{}
canBeUpdated := PluginInstallReports{}
notFound := PluginInstallReports{}
for _, report := range reports {
report.IsUpdateReport = isUpdateReport
if !report.Skipped {
installedOrUpdated = append(installedOrUpdated, report)
} else if report.SkipReason == constants.InstallMessagePluginNotInstalled {
canBeInstalled = append(canBeInstalled, report)
} else if report.SkipReason == constants.InstallMessagePluginAlreadyInstalled {
canBeUpdated = append(canBeUpdated, report)
} else if report.SkipReason == constants.InstallMessagePluginNotFound {
notFound = append(notFound, report)
}
}
// sort the report
sort.Stable(reports)
// sort the individual chunks
sort.Stable(installedOrUpdated)
sort.Stable(canBeInstalled)
sort.Stable(canBeUpdated)
sort.Stable(notFound)
if len(installedOrUpdated) > 0 {
fmt.Println()
asString := []string{}
for _, report := range installedOrUpdated {
asString = append(asString, report.installString())
}
fmt.Println(strings.Join(asString, "\n\n"))
}
if len(installedOrUpdated) < len(reports) {
installSkipReports := []string{}
for _, report := range reports {
showReport := true
if report.SkipReason == constants.InstallMessagePluginAlreadyInstalled || report.SkipReason == constants.InstallMessagePluginLatestAlreadyInstalled {
showReport = false
}
if report.Skipped && showReport {
installSkipReports = append(installSkipReports, report.skipString())
}
}
skipCount := len(installSkipReports)
if (len(installSkipReports)) > 0 {
fmt.Printf(
"\nSkipped the following %s:\n\n%s\n",
utils.Pluralize("plugin", skipCount),
strings.Join(installSkipReports, "\n\n"),
)
}
if len(canBeInstalled) > 0 {
pluginList := []string{}
for _, r := range canBeInstalled {
pluginList = append(pluginList, r.Plugin)
}
fmt.Println()
fmt.Printf(
"To install %s which %s not installed, please run %s\n",
utils.Pluralize("plugin", len(canBeInstalled)),
utils.Pluralize("is", len(canBeInstalled)),
constants.Bold(fmt.Sprintf(
"steampipe plugin install %s",
strings.Join(pluginList, " "),
)),
)
}
if len(canBeUpdated) > 0 {
pluginList := []string{}
for _, r := range canBeUpdated {
pluginList = append(pluginList, r.Plugin)
}
fmt.Println()
fmt.Printf(
"To update %s %s: %s\nTo update all plugins: %s",
utils.Pluralize("this", len(pluginList)),
utils.Pluralize("plugin", len(pluginList)),
constants.Bold(fmt.Sprintf("steampipe plugin update %s", strings.Join(pluginList, " "))),
constants.Bold(fmt.Sprintln("steampipe plugin update --all")),
)
}
}
}