From 7f72795e91ac6a2f2364fada3e16917c4c11c998 Mon Sep 17 00:00:00 2001 From: Philippe Martin Date: Thu, 23 Mar 2023 14:48:25 +0100 Subject: [PATCH] Use CommandGroups from registry index --- go.mod | 11 +- go.sum | 12 ++ pkg/alizer/alizer.go | 2 +- pkg/alizer/alizer_test.go | 2 +- pkg/api/registry.go | 5 + pkg/init/backend/interactive.go | 2 +- pkg/init/backend/interactive_test.go | 4 +- pkg/odo/cli/registry/registry.go | 25 ++++- pkg/registry/interface.go | 2 +- pkg/registry/mock.go | 8 +- pkg/registry/registry.go | 10 +- pkg/registry/registry_test.go | 5 +- .../index/generator/schema/schema.go | 103 ++++++++++++------ vendor/modules.txt | 20 +++- 14 files changed, 157 insertions(+), 54 deletions(-) diff --git a/go.mod b/go.mod index 05fa3bcf3b6..c0ae7a6fe06 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/blang/semver v3.5.1+incompatible github.com/devfile/api/v2 v2.2.0 github.com/devfile/library/v2 v2.2.1-0.20230323124903-d36e409ff94f - github.com/devfile/registry-support/index/generator v0.0.0-20221018203505-df96d34d4273 + github.com/devfile/registry-support/index/generator v0.0.0-20230322155332-33914affc83b github.com/devfile/registry-support/registry-library v0.0.0-20221201200738-19293ac0b8ab github.com/fatih/color v1.14.1 github.com/frapposelli/wwhrd v0.4.0 @@ -130,6 +130,7 @@ require ( github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-version v1.4.0 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect github.com/hinshun/vt10x v0.0.0-20220301184237-5011da428d02 // indirect github.com/imdario/mergo v0.3.13 // indirect github.com/inconshreveable/mousetrap v1.0.1 // indirect @@ -142,12 +143,14 @@ require ( github.com/klauspost/compress v1.15.1 // indirect github.com/kr/pty v1.1.8 // indirect github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect + github.com/magiconair/properties v1.8.5 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-isatty v0.0.17 // indirect github.com/mattn/go-runewidth v0.0.13 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.2 // indirect github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect github.com/mitchellh/go-wordwrap v1.0.0 // indirect + github.com/mitchellh/mapstructure v1.4.1 // indirect github.com/mitchellh/reflectwalk v1.0.1 // indirect github.com/moby/buildkit v0.10.6 // indirect github.com/moby/locker v1.0.1 // indirect @@ -162,6 +165,7 @@ require ( github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 // indirect github.com/openshift/library-go v0.0.0-20220210170159-18f172cff934 // indirect + github.com/pelletier/go-toml v1.9.4 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/pkg/errors v0.9.1 // indirect @@ -175,7 +179,11 @@ require ( github.com/sergi/go-diff v1.2.0 // indirect github.com/sirupsen/logrus v1.8.1 // indirect github.com/skeema/knownhosts v1.1.0 // indirect + github.com/spf13/cast v1.3.1 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/viper v1.8.1 // indirect github.com/stretchr/testify v1.8.1 // indirect + github.com/subosito/gotenv v1.2.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect @@ -197,6 +205,7 @@ require ( google.golang.org/grpc v1.49.0 // indirect google.golang.org/protobuf v1.28.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.62.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect k8s.io/apiserver v0.26.1 // indirect k8s.io/component-base v0.26.1 // indirect diff --git a/go.sum b/go.sum index f046e47277f..a21c37c9a34 100644 --- a/go.sum +++ b/go.sum @@ -396,6 +396,8 @@ github.com/devfile/registry-support/index/generator v0.0.0-20220222194908-7a90a4 github.com/devfile/registry-support/index/generator v0.0.0-20220527155645-8328a8a883be/go.mod h1:1fyDJL+fPHtcrYA6yjSVWeLmXmjCNth0d5Rq1rvtryc= github.com/devfile/registry-support/index/generator v0.0.0-20221018203505-df96d34d4273 h1:DXENQSRTEDsk9com38njPg5511DD12HPIgzyFUErnpM= github.com/devfile/registry-support/index/generator v0.0.0-20221018203505-df96d34d4273/go.mod h1:ZJnaSLjTKCvGJhWmYgQoQ1O3g78qBe4Va6ZugLmi4dE= +github.com/devfile/registry-support/index/generator v0.0.0-20230322155332-33914affc83b h1:IhZQnmff1ntrzplcM10/mj7H3X6E4NA3+paxD4HXfzc= +github.com/devfile/registry-support/index/generator v0.0.0-20230322155332-33914affc83b/go.mod h1:ZJnaSLjTKCvGJhWmYgQoQ1O3g78qBe4Va6ZugLmi4dE= github.com/devfile/registry-support/registry-library v0.0.0-20220627163229-4aa39fcb0c0a/go.mod h1:kmEjH5oO465vh36kcYdZLYeG8edVD6N/ZgzyLs1x7qs= github.com/devfile/registry-support/registry-library v0.0.0-20221018213054-47b3ffaeadba/go.mod h1:NOtmnbozFn15w/DPD/Urc+KDlNRP4JH5m+KC5GZoAWA= github.com/devfile/registry-support/registry-library v0.0.0-20221201200738-19293ac0b8ab h1:MBZdywPNNDf1f7V+plOOHqAiaY/C+IELrI4Rfdq78e4= @@ -791,6 +793,7 @@ github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= @@ -890,6 +893,7 @@ github.com/lucasb-eyer/go-colorful v0.0.0-20180526135729-345fbb3dbcdb/go.mod h1: github.com/lucasjones/reggen v0.0.0-20200904144131-37ba4fa293bb/go.mod h1:5ELEyG+X8f+meRWHuqUOewBOhvHkl7M76pdGEansxW4= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -944,6 +948,7 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4 github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= github.com/mitchellh/reflectwalk v1.0.1 h1:FVzMWA5RllMAKIdUSC8mdWo3XtwoecrH79BY70sEEpE= @@ -1092,6 +1097,8 @@ github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= +github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/peterbourgon/mergemap v0.0.0-20130613134717-e21c03b7a721/go.mod h1:jQyRpOpE/KbvPc0VKXjAqctYglwUO5W6zAcGcFfbvlo= @@ -1217,6 +1224,7 @@ github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTd github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= @@ -1231,6 +1239,7 @@ github.com/spf13/cobra v1.6.0/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUq github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -1242,6 +1251,7 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.8.1 h1:Kq1fyeebqsBfbjZj4EL7gj2IO0mMaiyjYUWcUsl2O44= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= @@ -1266,6 +1276,7 @@ github.com/stretchr/testify v1.7.4/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -2026,6 +2037,7 @@ gopkg.in/imdario/mergo.v0 v0.3.7/go.mod h1:9qPP6AGrlC1G2PTNXko614FwGZvorN7MiBU0E gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473/go.mod h1:N1eN2tsCx0Ydtgjl4cqmbRCsY4/+z4cYDeqwZTk6zog= diff --git a/pkg/alizer/alizer.go b/pkg/alizer/alizer.go index 02209d9ca54..0218f924980 100644 --- a/pkg/alizer/alizer.go +++ b/pkg/alizer/alizer.go @@ -31,7 +31,7 @@ func NewAlizerClient(registryClient registry.Client) *Alizer { // to use depending on the files in the path func (o *Alizer) DetectFramework(ctx context.Context, path string) (_ model.DevFileType, defaultVersion string, _ api.Registry, _ error) { types := []model.DevFileType{} - components, err := o.registryClient.ListDevfileStacks(ctx, "", "", "", false) + components, err := o.registryClient.ListDevfileStacks(ctx, "", "", "", false, false) if err != nil { return model.DevFileType{}, defaultVersion, api.Registry{}, err } diff --git a/pkg/alizer/alizer_test.go b/pkg/alizer/alizer_test.go index 481e5d03997..0a511eb914c 100644 --- a/pkg/alizer/alizer_test.go +++ b/pkg/alizer/alizer_test.go @@ -116,7 +116,7 @@ func TestDetectFramework(t *testing.T) { ctrl := gomock.NewController(t) registryClient := registry.NewMockClient(ctrl) ctx := context.Background() - registryClient.EXPECT().ListDevfileStacks(ctx, "", "", "", false).Return(list, nil) + registryClient.EXPECT().ListDevfileStacks(ctx, "", "", "", false, false).Return(list, nil) alizerClient := NewAlizerClient(registryClient) // Run function DetectFramework detected, _, registry, err := alizerClient.DetectFramework(ctx, tt.args.path) diff --git a/pkg/api/registry.go b/pkg/api/registry.go index 2171d87f2b6..9b0016f74d6 100644 --- a/pkg/api/registry.go +++ b/pkg/api/registry.go @@ -1,5 +1,9 @@ package api +import ( + schema "github.com/devfile/registry-support/index/generator/schema" +) + // Registry is the main struct of devfile registry type Registry struct { Name string `json:"name"` @@ -36,4 +40,5 @@ type DevfileStackVersion struct { IsDefault bool `json:"isDefault"` SchemaVersion string `json:"schemaVersion,omitempty"` StarterProjects []string `json:"starterProjects"` + CommandGroups map[schema.CommandGroupKind]bool } diff --git a/pkg/init/backend/interactive.go b/pkg/init/backend/interactive.go index 97aa530daf4..ab592d1bed4 100644 --- a/pkg/init/backend/interactive.go +++ b/pkg/init/backend/interactive.go @@ -51,7 +51,7 @@ func (o *InteractiveBackend) Validate(flags map[string]string, fs filesystem.Fil func (o *InteractiveBackend) SelectDevfile(ctx context.Context, flags map[string]string, _ filesystem.Filesystem, _ string) (*api.DetectionResult, error) { result := &api.DetectionResult{} - devfileEntries, _ := o.registryClient.ListDevfileStacks(ctx, "", "", "", false) + devfileEntries, _ := o.registryClient.ListDevfileStacks(ctx, "", "", "", false, false) langs := devfileEntries.GetLanguages() state := STATE_ASK_LANG diff --git a/pkg/init/backend/interactive_test.go b/pkg/init/backend/interactive_test.go index b9ede94bc15..76e6da862cb 100644 --- a/pkg/init/backend/interactive_test.go +++ b/pkg/init/backend/interactive_test.go @@ -47,7 +47,7 @@ func TestInteractiveBackend_SelectDevfile(t *testing.T) { }, buildCatalogClient: func(ctrl *gomock.Controller) registry.Client { client := registry.NewMockClient(ctrl) - client.EXPECT().ListDevfileStacks(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()) + client.EXPECT().ListDevfileStacks(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()) return client }, }, @@ -74,7 +74,7 @@ func TestInteractiveBackend_SelectDevfile(t *testing.T) { }, buildCatalogClient: func(ctrl *gomock.Controller) registry.Client { client := registry.NewMockClient(ctrl) - client.EXPECT().ListDevfileStacks(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()) + client.EXPECT().ListDevfileStacks(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()) return client }, }, diff --git a/pkg/odo/cli/registry/registry.go b/pkg/odo/cli/registry/registry.go index 06385b23222..f93e777e201 100644 --- a/pkg/odo/cli/registry/registry.go +++ b/pkg/odo/cli/registry/registry.go @@ -2,9 +2,11 @@ package registry import ( "context" + "errors" "fmt" "strings" + "github.com/devfile/registry-support/index/generator/schema" "github.com/jedib0t/go-pretty/v6/table" "github.com/jedib0t/go-pretty/v6/text" "github.com/spf13/cobra" @@ -66,7 +68,7 @@ func (o *ListOptions) SetClientset(clientset *clientset.Clientset) { // Complete completes ListOptions after they've been created func (o *ListOptions) Complete(ctx context.Context, cmdline cmdline.Cmdline, args []string) (err error) { - o.devfileList, err = o.clientset.RegistryClient.ListDevfileStacks(ctx, o.registryFlag, o.devfileFlag, o.filterFlag, o.detailsFlag) + o.devfileList, err = o.clientset.RegistryClient.ListDevfileStacks(ctx, o.registryFlag, o.devfileFlag, o.filterFlag, o.detailsFlag, log.IsJSON()) if err != nil { return err } @@ -188,6 +190,12 @@ func (o *ListOptions) printDevfileList(DevfileList []api.DevfileStack) { if o.detailsFlag { + defaultVersionDetails, err := getVersion(devfileComponent, devfileComponent.DefaultVersion) + if err != nil { + log.Error(err) + return + } + // Output the details of the component fmt.Printf(`%s: %s %s: %s @@ -219,9 +227,9 @@ func (o *ListOptions) printDevfileList(DevfileList []api.DevfileStack) { log.Sbold("Language"), devfileComponent.Language, log.Sbold("Starter Projects"), strings.Join(defaultVersionDetails.StarterProjects, "\n - "), log.Sbold("Supported odo Features"), - boolToYesNo(devfileComponent.DevfileData.SupportedOdoFeatures.Dev), - boolToYesNo(devfileComponent.DevfileData.SupportedOdoFeatures.Deploy), - boolToYesNo(devfileComponent.DevfileData.SupportedOdoFeatures.Debug), + boolToYesNo(defaultVersionDetails.CommandGroups[schema.RunCommandGroupKind]), + boolToYesNo(defaultVersionDetails.CommandGroups[schema.DeployCommandGroupKind]), + boolToYesNo(defaultVersionDetails.CommandGroups[schema.DebugCommandGroupKind]), log.Sbold("Versions"), strings.Join(vList, "\n - "), "\n") @@ -257,3 +265,12 @@ func boolToYesNo(b bool) string { } return "N" } + +func getVersion(stack api.DevfileStack, v string) (api.DevfileStackVersion, error) { + for _, version := range stack.Versions { + if version.Version == v { + return version, nil + } + } + return api.DevfileStackVersion{}, errors.New("version not found") +} diff --git a/pkg/registry/interface.go b/pkg/registry/interface.go index 12e8ca9c2d7..0e3b5344d0c 100644 --- a/pkg/registry/interface.go +++ b/pkg/registry/interface.go @@ -15,5 +15,5 @@ type Client interface { DownloadFileInMemory(params dfutil.HTTPRequestParams) ([]byte, error) DownloadStarterProject(starterProject *devfilev1.StarterProject, decryptedToken string, contextDir string, verbose bool) error GetDevfileRegistries(registryName string) ([]api.Registry, error) - ListDevfileStacks(ctx context.Context, registryName, devfileFlag, filterFlag string, detailsFlag bool) (DevfileStackList, error) + ListDevfileStacks(ctx context.Context, registryName, devfileFlag, filterFlag string, detailsFlag bool, withDevfileContent bool) (DevfileStackList, error) } diff --git a/pkg/registry/mock.go b/pkg/registry/mock.go index 763a735a4db..a71c4bea16e 100644 --- a/pkg/registry/mock.go +++ b/pkg/registry/mock.go @@ -83,18 +83,18 @@ func (mr *MockClientMockRecorder) GetDevfileRegistries(registryName interface{}) } // ListDevfileStacks mocks base method. -func (m *MockClient) ListDevfileStacks(ctx context.Context, registryName, devfileFlag, filterFlag string, detailsFlag bool) (DevfileStackList, error) { +func (m *MockClient) ListDevfileStacks(ctx context.Context, registryName, devfileFlag, filterFlag string, detailsFlag, jsonOutput bool) (DevfileStackList, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ListDevfileStacks", ctx, registryName, devfileFlag, filterFlag, detailsFlag) + ret := m.ctrl.Call(m, "ListDevfileStacks", ctx, registryName, devfileFlag, filterFlag, detailsFlag, jsonOutput) ret0, _ := ret[0].(DevfileStackList) ret1, _ := ret[1].(error) return ret0, ret1 } // ListDevfileStacks indicates an expected call of ListDevfileStacks. -func (mr *MockClientMockRecorder) ListDevfileStacks(ctx, registryName, devfileFlag, filterFlag, detailsFlag interface{}) *gomock.Call { +func (mr *MockClientMockRecorder) ListDevfileStacks(ctx, registryName, devfileFlag, filterFlag, detailsFlag, jsonOutput interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListDevfileStacks", reflect.TypeOf((*MockClient)(nil).ListDevfileStacks), ctx, registryName, devfileFlag, filterFlag, detailsFlag) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListDevfileStacks", reflect.TypeOf((*MockClient)(nil).ListDevfileStacks), ctx, registryName, devfileFlag, filterFlag, detailsFlag, jsonOutput) } // PullStackFromRegistry mocks base method. diff --git a/pkg/registry/registry.go b/pkg/registry/registry.go index da05fc4ea49..64c353b284d 100644 --- a/pkg/registry/registry.go +++ b/pkg/registry/registry.go @@ -234,7 +234,8 @@ func (o RegistryClient) GetDevfileRegistries(registryName string) ([]api.Registr } // ListDevfileStacks lists all the available devfile stacks in devfile registry -func (o RegistryClient) ListDevfileStacks(ctx context.Context, registryName, devfileFlag, filterFlag string, detailsFlag bool) (DevfileStackList, error) { +// When `withDevfileContent` and `detailsFlag` are both true, another HTTP call is executed to download the Devfile +func (o RegistryClient) ListDevfileStacks(ctx context.Context, registryName, devfileFlag, filterFlag string, detailsFlag bool, withDevfileContent bool) (DevfileStackList, error) { catalogDevfileList := &DevfileStackList{} var err error @@ -278,9 +279,6 @@ func (o RegistryClient) ListDevfileStacks(ctx context.Context, registryName, dev // Go through all the devfiles and filter based on: // What's in the name or description // The exact name of the devfile - // - // We also add additional details such as supported odo features (which we - // manually http get) if the details flag has been passed in. for priorityNumber, registryDevfiles := range registrySlice { devfiles := []api.DevfileStack{} @@ -302,7 +300,8 @@ func (o RegistryClient) ListDevfileStacks(ctx context.Context, registryName, dev } } - if detailsFlag { + // We are fetching the Devfile content only when `--details` and `-o json` flags are used + if detailsFlag && withDevfileContent { devfileData, err := o.retrieveDevfileDataFromRegistry(ctx, devfile.Registry.Name, devfile.Name) if err != nil { return *catalogDevfileList, err @@ -380,6 +379,7 @@ func createRegistryDevfiles(registry api.Registry, devfileIndex []indexSchema.Sc Version: v.Version, SchemaVersion: v.SchemaVersion, StarterProjects: v.StarterProjects, + CommandGroups: v.CommandGroups, }) } sort.Slice(stackDevfile.Versions, func(i, j int) bool { diff --git a/pkg/registry/registry_test.go b/pkg/registry/registry_test.go index 1ad31a2cb0c..453b669bd07 100644 --- a/pkg/registry/registry_test.go +++ b/pkg/registry/registry_test.go @@ -4,7 +4,6 @@ import ( "context" "errors" "fmt" - devfilev1 "github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2" "io/fs" "net/http" "net/http/httptest" @@ -15,6 +14,8 @@ import ( "strings" "testing" + devfilev1 "github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2" + "github.com/golang/mock/gomock" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -344,7 +345,7 @@ func TestListDevfileStacks(t *testing.T) { catClient := NewRegistryClient(filesystem.NewFakeFs(), prefClient, nil) ctx := context.Background() ctx = envcontext.WithEnvConfig(ctx, config.Configuration{}) - got, err := catClient.ListDevfileStacks(ctx, tt.registryName, tt.devfileName, tt.filter, false) + got, err := catClient.ListDevfileStacks(ctx, tt.registryName, tt.devfileName, tt.filter, false, false) if err != nil { t.Error(err) } diff --git a/vendor/github.com/devfile/registry-support/index/generator/schema/schema.go b/vendor/github.com/devfile/registry-support/index/generator/schema/schema.go index f003c452e43..f15f753fb8e 100644 --- a/vendor/github.com/devfile/registry-support/index/generator/schema/schema.go +++ b/vendor/github.com/devfile/registry-support/index/generator/schema/schema.go @@ -98,6 +98,13 @@ Sample index file: "resources": [ "devfile.yaml" ], + "commandGroups": { + "build": true, + "run": true, + "test": false, + "debug": false, + "deploy": false + }, "starterProjects": [ "community", "redhat-product" @@ -122,6 +129,7 @@ globalMemoryLimit: string - The devfile global memory limit projectType: string - The project framework that is used in the devfile language: string - The project language that is used in the devfile links: map[string]string - Links related to the devfile +commandGroups: map[CommandGroupKind]bool - The command groups that are used in the devfile resources: []string - The file resources that compose a devfile stack. starterProjects: string[] - The project templates that can be used in the devfile git: *git - The information of remote repositories @@ -131,25 +139,26 @@ versions: []Version - The list of stack versions information // Schema is the index file schema type Schema struct { - Name string `yaml:"name,omitempty" json:"name,omitempty"` - Version string `yaml:"version,omitempty" json:"version,omitempty"` - Attributes map[string]apiext.JSON `yaml:"attributes,omitempty" json:"attributes,omitempty"` - DisplayName string `yaml:"displayName,omitempty" json:"displayName,omitempty"` - Description string `yaml:"description,omitempty" json:"description,omitempty"` - Type DevfileType `yaml:"type,omitempty" json:"type,omitempty"` - Tags []string `yaml:"tags,omitempty" json:"tags,omitempty"` - Architectures []string `yaml:"architectures,omitempty" json:"architectures,omitempty"` - Icon string `yaml:"icon,omitempty" json:"icon,omitempty"` - GlobalMemoryLimit string `yaml:"globalMemoryLimit,omitempty" json:"globalMemoryLimit,omitempty"` - ProjectType string `yaml:"projectType,omitempty" json:"projectType,omitempty"` - Language string `yaml:"language,omitempty" json:"language,omitempty"` - Links map[string]string `yaml:"links,omitempty" json:"links,omitempty"` - Resources []string `yaml:"resources,omitempty" json:"resources,omitempty"` - StarterProjects []string `yaml:"starterProjects,omitempty" json:"starterProjects,omitempty"` - Git *Git `yaml:"git,omitempty" json:"git,omitempty"` - Provider string `yaml:"provider,omitempty" json:"provider,omitempty"` - SupportUrl string `yaml:"supportUrl,omitempty" json:"supportUrl,omitempty"` - Versions []Version `yaml:"versions,omitempty" json:"versions,omitempty"` + Name string `yaml:"name,omitempty" json:"name,omitempty"` + Version string `yaml:"version,omitempty" json:"version,omitempty"` + Attributes map[string]apiext.JSON `yaml:"attributes,omitempty" json:"attributes,omitempty"` + DisplayName string `yaml:"displayName,omitempty" json:"displayName,omitempty"` + Description string `yaml:"description,omitempty" json:"description,omitempty"` + Type DevfileType `yaml:"type,omitempty" json:"type,omitempty"` + Tags []string `yaml:"tags,omitempty" json:"tags,omitempty"` + Architectures []string `yaml:"architectures,omitempty" json:"architectures,omitempty"` + Icon string `yaml:"icon,omitempty" json:"icon,omitempty"` + GlobalMemoryLimit string `yaml:"globalMemoryLimit,omitempty" json:"globalMemoryLimit,omitempty"` + ProjectType string `yaml:"projectType,omitempty" json:"projectType,omitempty"` + Language string `yaml:"language,omitempty" json:"language,omitempty"` + Links map[string]string `yaml:"links,omitempty" json:"links,omitempty"` + CommandGroups map[CommandGroupKind]bool `yaml:"commandGroups,omitempty" json:"commandGroups,omitempty"` + Resources []string `yaml:"resources,omitempty" json:"resources,omitempty"` + StarterProjects []string `yaml:"starterProjects,omitempty" json:"starterProjects,omitempty"` + Git *Git `yaml:"git,omitempty" json:"git,omitempty"` + Provider string `yaml:"provider,omitempty" json:"provider,omitempty"` + SupportUrl string `yaml:"supportUrl,omitempty" json:"supportUrl,omitempty"` + Versions []Version `yaml:"versions,omitempty" json:"versions,omitempty"` } // DevfileType describes the type of devfile @@ -163,15 +172,46 @@ const ( StackDevfileType DevfileType = "stack" ) +// CommandGroupKind describes the kind of command group +type CommandGroupKind string + +const ( + BuildCommandGroupKind CommandGroupKind = "build" + RunCommandGroupKind CommandGroupKind = "run" + TestCommandGroupKind CommandGroupKind = "test" + DebugCommandGroupKind CommandGroupKind = "debug" + DeployCommandGroupKind CommandGroupKind = "deploy" +) + // StarterProject is the devfile starter project type StarterProject struct { Name string `yaml:"name,omitempty" json:"name,omitempty"` } +// Commands stores the command information +type Commands struct { + Id string `yaml:"id,omitempty" json:"id,omitempty"` + Exec CommandType `yaml:"exec,omitempty" json:"exec,omitempty"` + Apply CommandType `yaml:"apply,omitempty" json:"apply,omitempty"` + Composite CommandType `yaml:"composite,omitempty" json:"composite,omitempty"` +} + +// CommandType stores the group for a command +type CommandType struct { + Group CommandGroup `yaml:"group,omitempty" json:"group,omitempty"` +} + +// CommandGroup stores the group information for a command +type CommandGroup struct { + Kind CommandGroupKind `yaml:"kind,omitempty" json:"kind,omitempty"` + IsDefault bool `yaml:"isDefault,omitempty" json:"isDefault,omitempty"` +} + // Devfile is the devfile structure that is used by index component type Devfile struct { Meta Schema `yaml:"metadata,omitempty" json:"metadata,omitempty"` StarterProjects []StarterProject `yaml:"starterProjects,omitempty" json:"starterProjects,omitempty"` + Commands []Commands `yaml:"commands,omitempty" json:"commands,omitempty"` SchemaVersion string `yaml:"schemaVersion,omitempty" json:"schemaVersion,omitempty"` } @@ -190,7 +230,7 @@ type ExtraDevfileEntries struct { Stacks []Schema `yaml:"stacks,omitempty" json:"stacks,omitempty"` } -// Version stores the top-level stack information defined within stack.yaml +// StackInfo stores the top-level stack information defined within stack.yaml type StackInfo struct { Name string `yaml:"name,omitempty" json:"name,omitempty"` DisplayName string `yaml:"displayName,omitempty" json:"displayName,omitempty"` @@ -201,15 +241,16 @@ type StackInfo struct { // Version stores the information for each stack version type Version struct { - Version string `yaml:"version,omitempty" json:"version,omitempty"` - SchemaVersion string `yaml:"schemaVersion,omitempty" json:"schemaVersion,omitempty"` - Default bool `yaml:"default,omitempty" json:"default,omitempty"` - Git *Git `yaml:"git,omitempty" json:"git,omitempty"` - Description string `yaml:"description,omitempty" json:"description,omitempty"` - Tags []string `yaml:"tags,omitempty" json:"tags,omitempty"` - Architectures []string `yaml:"architectures,omitempty" json:"architectures,omitempty"` - Icon string `yaml:"icon,omitempty" json:"icon,omitempty"` - Links map[string]string `yaml:"links,omitempty" json:"links,omitempty"` - Resources []string `yaml:"resources,omitempty" json:"resources,omitempty"` - StarterProjects []string `yaml:"starterProjects,omitempty" json:"starterProjects,omitempty"` + Version string `yaml:"version,omitempty" json:"version,omitempty"` + SchemaVersion string `yaml:"schemaVersion,omitempty" json:"schemaVersion,omitempty"` + Default bool `yaml:"default,omitempty" json:"default,omitempty"` + Git *Git `yaml:"git,omitempty" json:"git,omitempty"` + Description string `yaml:"description,omitempty" json:"description,omitempty"` + Tags []string `yaml:"tags,omitempty" json:"tags,omitempty"` + Architectures []string `yaml:"architectures,omitempty" json:"architectures,omitempty"` + Icon string `yaml:"icon,omitempty" json:"icon,omitempty"` + Links map[string]string `yaml:"links,omitempty" json:"links,omitempty"` + CommandGroups map[CommandGroupKind]bool `yaml:"commandGroups,omitempty" json:"commandGroups,omitempty"` + Resources []string `yaml:"resources,omitempty" json:"resources,omitempty"` + StarterProjects []string `yaml:"starterProjects,omitempty" json:"starterProjects,omitempty"` } diff --git a/vendor/modules.txt b/vendor/modules.txt index b8392854194..8b4c9bd29f9 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -162,7 +162,7 @@ github.com/devfile/library/v2/pkg/devfile/validate github.com/devfile/library/v2/pkg/testingutil github.com/devfile/library/v2/pkg/testingutil/filesystem github.com/devfile/library/v2/pkg/util -# github.com/devfile/registry-support/index/generator v0.0.0-20221018203505-df96d34d4273 +# github.com/devfile/registry-support/index/generator v0.0.0-20230322155332-33914affc83b ## explicit; go 1.14 github.com/devfile/registry-support/index/generator/schema # github.com/devfile/registry-support/registry-library v0.0.0-20221201200738-19293ac0b8ab @@ -428,6 +428,8 @@ github.com/hashicorp/go-multierror # github.com/hashicorp/go-version v1.4.0 ## explicit github.com/hashicorp/go-version +# github.com/hashicorp/hcl v1.0.0 +## explicit # github.com/hinshun/vt10x v0.0.0-20220301184237-5011da428d02 ## explicit; go 1.14 # github.com/imdario/mergo v0.3.13 @@ -485,6 +487,8 @@ github.com/kubernetes-sigs/service-catalog/pkg/filter # github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de ## explicit github.com/liggitt/tabwriter +# github.com/magiconair/properties v1.8.5 +## explicit; go 1.13 # github.com/mailru/easyjson v0.7.7 ## explicit; go 1.12 github.com/mailru/easyjson/buffer @@ -508,6 +512,8 @@ github.com/mgutz/ansi # github.com/mitchellh/go-wordwrap v1.0.0 ## explicit github.com/mitchellh/go-wordwrap +# github.com/mitchellh/mapstructure v1.4.1 +## explicit; go 1.14 # github.com/mitchellh/reflectwalk v1.0.1 ## explicit github.com/mitchellh/reflectwalk @@ -674,6 +680,8 @@ github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientse # github.com/pborman/uuid v1.2.1 ## explicit github.com/pborman/uuid +# github.com/pelletier/go-toml v1.9.4 +## explicit; go 1.12 # github.com/peterbourgon/diskv v2.0.1+incompatible ## explicit github.com/peterbourgon/diskv @@ -789,16 +797,24 @@ github.com/skeema/knownhosts ## explicit; go 1.13 github.com/spf13/afero github.com/spf13/afero/mem +# github.com/spf13/cast v1.3.1 +## explicit # github.com/spf13/cobra v1.6.1 ## explicit; go 1.15 github.com/spf13/cobra +# github.com/spf13/jwalterweatherman v1.1.0 +## explicit # github.com/spf13/pflag v1.0.5 ## explicit; go 1.12 github.com/spf13/pflag +# github.com/spf13/viper v1.8.1 +## explicit; go 1.12 # github.com/stretchr/testify v1.8.1 ## explicit; go 1.13 github.com/stretchr/testify/assert github.com/stretchr/testify/require +# github.com/subosito/gotenv v1.2.0 +## explicit # github.com/tidwall/gjson v1.14.4 ## explicit; go 1.12 github.com/tidwall/gjson @@ -998,6 +1014,8 @@ gopkg.in/AlecAivazis/survey.v1/terminal # gopkg.in/inf.v0 v0.9.1 ## explicit gopkg.in/inf.v0 +# gopkg.in/ini.v1 v1.62.0 +## explicit # gopkg.in/segmentio/analytics-go.v3 v3.0.0-00010101000000-000000000000 => github.com/segmentio/analytics-go/v3 v3.2.1 ## explicit; go 1.17 gopkg.in/segmentio/analytics-go.v3