Skip to content
This repository has been archived by the owner on Oct 10, 2023. It is now read-only.

[DO-NOT-MERGE] TESTS: Discover Plugins from all active contexts and Support Plugin Name conflicts across different Targets #4049

Closed
wants to merge 24 commits into from
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
6b1e347
Use CLIPlugin CR to determine ContextType of the plugin
anujc25 Oct 31, 2022
6820453
Update catalog and plugin manager implementation to include ContextType
anujc25 Nov 10, 2022
8554c75
Add target for standalone plugins CLIPlugin resources
anujc25 Nov 18, 2022
d27fff7
Update implementations of builder plugin to include target in generat…
anujc25 Nov 18, 2022
050fcd0
Add rename to target comment
anujc25 Nov 19, 2022
6c58f54
Update docs
anujc25 Nov 20, 2022
646c683
Address Review Comments
anujc25 Nov 22, 2022
12b1365
Make k8s a special target and remove duplicated plugin from available…
anujc25 Nov 21, 2022
d8f5316
Address Review Comments Part-2
anujc25 Nov 23, 2022
b7fbdc2
Use Context based SplitView to list plugins
anujc25 Nov 23, 2022
82eb1a4
Use Target based SplitView to list contexts
anujc25 Nov 23, 2022
3462917
Address Review Comments Part-3
anujc25 Nov 28, 2022
cccd240
Use underscore as delimeter for pluginName_Target key in catalog
anujc25 Nov 28, 2022
6c93e9b
Fix plugin deletion issue
anujc25 Nov 28, 2022
22c5e12
Update CLIPlugin CRD to 'cliplugins' and 'core-management-plugins' pa…
anujc25 Nov 28, 2022
54bedbb
Address Comments from Demo
anujc25 Nov 29, 2022
de62436
Address Review Comments Part-4
anujc25 Nov 29, 2022
a866977
Fix docker-build for cliplugins
anujc25 Nov 29, 2022
2886ab4
Set current (currentServer) only if context is of type k8s
anujc25 Nov 30, 2022
f466a62
Address Review Comments Part-5
anujc25 Nov 30, 2022
99151fe
Address Review Comments Part-6
anujc25 Nov 30, 2022
4cabafc
Fix unit test
anujc25 Nov 30, 2022
fea415e
Make target field optional in CLIPlugin API
anujc25 Nov 30, 2022
992f974
Do not lock when reading currentContextMap
anujc25 Nov 30, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Use Context based SplitView to list plugins
  • Loading branch information
anujc25 committed Nov 29, 2022
commit b7fbdc2eb1be9d34221fbd812f20e11f36c068fd
2 changes: 1 addition & 1 deletion cli/core/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ require (
github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489
github.com/briandowns/spinner v1.19.0
github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f
github.com/fatih/color v1.13.0
github.com/golang-jwt/jwt v3.2.2+incompatible
github.com/google/gnostic v0.5.7-v3refs
github.com/google/go-containerregistry v0.7.0
Expand Down Expand Up @@ -73,7 +74,6 @@ require (
github.com/docker/docker-credential-helpers v0.6.4 // indirect
github.com/emicklei/go-restful v2.15.0+incompatible // indirect
github.com/evanphx/json-patch v5.6.0+incompatible // indirect
github.com/fatih/color v1.13.0 // indirect
github.com/fsnotify/fsnotify v1.5.4 // indirect
github.com/ghodss/yaml v1.0.0 // indirect
github.com/go-logr/logr v1.2.2 // indirect
Expand Down
102 changes: 78 additions & 24 deletions cli/core/pkg/command/plugin_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,14 @@ package command

import (
"fmt"
"io"
"path/filepath"
"sort"

"github.com/fatih/color"

"github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/common"

cliv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1"

"github.com/aunum/log"
Expand All @@ -22,7 +27,7 @@ import (
"github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/pluginmanager"
cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1"
"github.com/vmware-tanzu/tanzu-framework/cli/runtime/command"
"github.com/vmware-tanzu/tanzu-framework/cli/runtime/component"
component "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component"
"github.com/vmware-tanzu/tanzu-framework/cli/runtime/config"
)

Expand Down Expand Up @@ -92,31 +97,11 @@ var listPluginCmd = &cobra.Command{
return err
}

var data [][]string
var output component.OutputWriter

if config.IsFeatureActivated(cliconfig.FeatureContextCommand) {
for index := range availablePlugins {
data = append(data, []string{availablePlugins[index].Name, availablePlugins[index].Description, availablePlugins[index].Scope,
availablePlugins[index].Source, string(availablePlugins[index].Target), getInstalledElseAvailablePluginVersion(&availablePlugins[index]), availablePlugins[index].Status})
}
output = component.NewOutputWriter(cmd.OutOrStdout(), outputFormat, "Name", "Description", "Scope", "Discovery", "Target", "Version", "Status")
if config.IsFeatureActivated(cliconfig.FeatureContextCommand) && (outputFormat == "" || outputFormat == string(component.TableOutputType)) {
displayPluginListOutputSplitViewContext(availablePlugins, cmd.OutOrStdout())
} else {
for index := range availablePlugins {
data = append(data, []string{availablePlugins[index].Name, availablePlugins[index].Description, availablePlugins[index].Scope,
availablePlugins[index].Source, getInstalledElseAvailablePluginVersion(&availablePlugins[index]), availablePlugins[index].Status})
}
output = component.NewOutputWriter(cmd.OutOrStdout(), outputFormat, "Name", "Description", "Scope", "Discovery", "Version", "Status")
}

for _, row := range data {
vals := make([]interface{}, len(row))
for i, val := range row {
vals[i] = val
}
output.AddRow(vals...)
displayPluginListOutputListView(availablePlugins, cmd.OutOrStdout())
}
output.Render()

return nil

Expand Down Expand Up @@ -398,3 +383,72 @@ func getInstalledElseAvailablePluginVersion(p *plugin.Discovered) string {
}
return installedOrAvailableVersion
}

func displayPluginListOutputListView(availablePlugins []plugin.Discovered, writer io.Writer) {
var data [][]string
var output component.OutputWriter

for index := range availablePlugins {
data = append(data, []string{availablePlugins[index].Name, availablePlugins[index].Description, availablePlugins[index].Scope,
availablePlugins[index].Source, getInstalledElseAvailablePluginVersion(&availablePlugins[index]), availablePlugins[index].Status})
}
output = component.NewOutputWriter(writer, outputFormat, "Name", "Description", "Scope", "Discovery", "Version", "Status")

for _, row := range data {
vals := make([]interface{}, len(row))
for i, val := range row {
vals[i] = val
}
output.AddRow(vals...)
}
output.Render()
}

func displayPluginListOutputSplitViewContext(availablePlugins []plugin.Discovered, writer io.Writer) {
var dataStandalone [][]string
var outputStandalone component.OutputWriter
dataContext := make(map[string][][]string)
outputContext := make(map[string]component.OutputWriter)

outputStandalone = component.NewOutputWriter(writer, outputFormat, "Name", "Description", "Target", "Discovery", "Version", "Status")

for index := range availablePlugins {
if availablePlugins[index].Scope == common.PluginScopeStandalone {
newRow := []string{availablePlugins[index].Name, availablePlugins[index].Description, string(availablePlugins[index].Target),
availablePlugins[index].Source, getInstalledElseAvailablePluginVersion(&availablePlugins[index]), availablePlugins[index].Status}
dataStandalone = append(dataStandalone, newRow)
} else {
newRow := []string{availablePlugins[index].Name, availablePlugins[index].Description, string(availablePlugins[index].Target),
getInstalledElseAvailablePluginVersion(&availablePlugins[index]), availablePlugins[index].Status}
outputContext[availablePlugins[index].ContextName] = component.NewOutputWriter(writer, outputFormat, "Name", "Description", "Target", "Version", "Status")
data := dataContext[availablePlugins[index].ContextName]
data = append(data, newRow)
dataContext[availablePlugins[index].ContextName] = data
}
}

addDataToOutputWriter := func(output component.OutputWriter, data [][]string) {
for _, row := range data {
vals := make([]interface{}, len(row))
for i, val := range row {
vals[i] = val
}
output.AddRow(vals...)
}
}

cyanBold := color.New(color.FgCyan).Add(color.Bold)
cyanBoldItalic := color.New(color.FgCyan).Add(color.Bold, color.Italic)

_, _ = cyanBold.Println("Standalone Plugins")
addDataToOutputWriter(outputStandalone, dataStandalone)
outputStandalone.Render()

for context, writer := range outputContext {
fmt.Println("")
_, _ = cyanBold.Println("Context Plugins: ", cyanBoldItalic.Sprintf(context))
data := dataContext[context]
addDataToOutputWriter(writer, data)
writer.Render()
}
}