Skip to content
This repository has been archived by the owner on May 6, 2022. It is now read-only.

svcat CLI can now filter the classes return by broker in svcat get classes via a --broker flag #2786

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 3 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ STAT = stat -c '%Y %n'
endif

TYPES_FILES = $(shell find pkg/apis -name types.go)
GO_VERSION ?= 1.12
GO_VERSION ?= 1.13

ALL_ARCH=amd64 arm arm64 ppc64le s390x
ALL_CLIENT_PLATFORM=darwin linux windows
Expand Down Expand Up @@ -225,7 +225,7 @@ verify: .init verify-generated verify-client-gen verify-docs verify-vendor
@#
$(DOCKER_CMD) go vet $(SC_PKG)/...
@echo Running repo-infra verify scripts
@$(DOCKER_CMD) vendor/github.com/kubernetes/repo-infra/verify/verify-boilerplate.sh --rootdir=. | grep -Fv -e generated -e .pkg -e docsite > .out 2>&1 || true
@$(DOCKER_CMD) vendor/github.com/kubernetes/repo-infra/verify/verify-boilerplate.sh --rootdir=. | grep -Fv -e generated -e .pkg -e docsite -e bin/verify-links.sh > .out 2>&1 || true
@[ ! -s .out ] || (cat .out && rm .out && false)
@rm .out
@#
Expand All @@ -238,7 +238,7 @@ verify: .init verify-generated verify-client-gen verify-docs verify-vendor

verify-docs: .init
@echo Running href checker$(SKIP_COMMENT):
@$(DOCKER_CMD) verify-links.sh -s .pkg -s .bundler -s _plugins -s _includes -t $(SKIP_HTTP) .
@$(DOCKER_CMD) verify-links.sh -s .pkg -s .bundler -s _plugins -s _includes -s contribute/docs.md -t $(SKIP_HTTP) .

verify-generated: .init generators
$(DOCKER_CMD) $(BUILD_DIR)/update-apis-gen.sh --verify-only
Expand Down
4 changes: 2 additions & 2 deletions cmd/svcat/browsing/marketplace_cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ package browsing
import (
"github.com/kubernetes-sigs/service-catalog/cmd/svcat/command"
"github.com/kubernetes-sigs/service-catalog/cmd/svcat/output"
"github.com/kubernetes-sigs/service-catalog/pkg/svcat/service-catalog"
servicecatalog "github.com/kubernetes-sigs/service-catalog/pkg/svcat/service-catalog"
"github.com/spf13/cobra"
)

Expand Down Expand Up @@ -66,7 +66,7 @@ func (c *MarketplaceCmd) Run() error {
Namespace: c.Namespace,
Scope: servicecatalog.AllScope,
}
classes, err := c.App.RetrieveClasses(opts)
classes, err := c.App.RetrieveClasses(opts, command.BrokerAll)
if err != nil {
return err
}
Expand Down
5 changes: 3 additions & 2 deletions cmd/svcat/browsing/marketplace_cmd_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import (

. "github.com/kubernetes-sigs/service-catalog/cmd/svcat/browsing"
"github.com/kubernetes-sigs/service-catalog/cmd/svcat/command"
"github.com/kubernetes-sigs/service-catalog/cmd/svcat/test"
svcattest "github.com/kubernetes-sigs/service-catalog/cmd/svcat/test"
_ "github.com/kubernetes-sigs/service-catalog/internal/test"
"github.com/kubernetes-sigs/service-catalog/pkg/apis/servicecatalog/v1beta1"
"github.com/kubernetes-sigs/service-catalog/pkg/svcat"
Expand Down Expand Up @@ -149,11 +149,12 @@ var _ = Describe("Register Command", func() {
err := cmd.Run()
Expect(err).NotTo(HaveOccurred())
Expect(fakeSDK.RetrieveClassesCallCount()).To(Equal(1))
scopeOpts := fakeSDK.RetrieveClassesArgsForCall(0)
scopeOpts, brokerFilter := fakeSDK.RetrieveClassesArgsForCall(0)
Expect(scopeOpts).To(Equal(servicecatalog.ScopeOptions{
Scope: servicecatalog.AllScope,
Namespace: namespace,
}))
Expect(brokerFilter).To((Equal("")))

Expect(fakeSDK.RetrievePlansCallCount()).To(Equal(1))
class, scopeOpts := fakeSDK.RetrievePlansArgsForCall(0)
Expand Down
18 changes: 13 additions & 5 deletions cmd/svcat/class/get_cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import (

"github.com/kubernetes-sigs/service-catalog/cmd/svcat/command"
"github.com/kubernetes-sigs/service-catalog/cmd/svcat/output"
"github.com/kubernetes-sigs/service-catalog/pkg/svcat/service-catalog"
servicecatalog "github.com/kubernetes-sigs/service-catalog/pkg/svcat/service-catalog"
"github.com/spf13/cobra"
)

Expand All @@ -31,6 +31,7 @@ type GetCmd struct {
*command.Namespaced
*command.Scoped
*command.Formatted
*command.BrokerFiltered

LookupByKubeName bool
KubeName string
Expand All @@ -40,9 +41,10 @@ type GetCmd struct {
// NewGetCmd builds a "svcat get classes" command
func NewGetCmd(cxt *command.Context) *cobra.Command {
getCmd := &GetCmd{
Namespaced: command.NewNamespaced(cxt),
Scoped: command.NewScoped(),
Formatted: command.NewFormatted(),
Namespaced: command.NewNamespaced(cxt),
Scoped: command.NewScoped(),
Formatted: command.NewFormatted(),
BrokerFiltered: command.NewBrokerFiltered(),
}
cmd := &cobra.Command{
Use: "classes [NAME]",
Expand All @@ -52,6 +54,7 @@ func NewGetCmd(cxt *command.Context) *cobra.Command {
svcat get classes
svcat get classes --scope cluster
svcat get classes --scope namespace --namespace dev
svcat get classes --broker mysql-broker
svcat get class mysqldb
svcat get class --kube-name 997b8372-8dac-40ac-ae65-758b4a5075a5
`),
Expand All @@ -68,6 +71,7 @@ func NewGetCmd(cxt *command.Context) *cobra.Command {
getCmd.AddOutputFlags(cmd.Flags())
getCmd.AddNamespaceFlags(cmd.Flags(), true)
getCmd.AddScopedFlags(cmd.Flags(), true)
getCmd.AddBrokerFlag(cmd)
return cmd
}

Expand All @@ -79,6 +83,10 @@ func (c *GetCmd) Validate(args []string) error {
} else {
c.Name = args[0]
}

if c.BrokerFilter != "" {
return fmt.Errorf("broker filter is not supported when specifying class name")
}
}

return nil
Expand All @@ -99,7 +107,7 @@ func (c *GetCmd) getAll() error {
Namespace: c.Namespace,
Scope: c.Scope,
}
classes, err := c.App.RetrieveClasses(opts)
classes, err := c.App.RetrieveClasses(opts, c.BrokerFilter)
if err != nil {
return err
}
Expand Down
74 changes: 60 additions & 14 deletions cmd/svcat/class/get_cmd_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,15 @@ import (

. "github.com/kubernetes-sigs/service-catalog/cmd/svcat/class"
"github.com/kubernetes-sigs/service-catalog/cmd/svcat/command"
"github.com/kubernetes-sigs/service-catalog/cmd/svcat/test"
svcattest "github.com/kubernetes-sigs/service-catalog/cmd/svcat/test"
"github.com/kubernetes-sigs/service-catalog/pkg/apis/servicecatalog/v1beta1"
"github.com/kubernetes-sigs/service-catalog/pkg/svcat"
servicecatalog "github.com/kubernetes-sigs/service-catalog/pkg/svcat/service-catalog"
servicecatalogfakes "github.com/kubernetes-sigs/service-catalog/pkg/svcat/service-catalog/service-catalogfakes"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"github.com/spf13/pflag"
"k8s.io/apimachinery/pkg/apis/meta/v1"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

var _ = Describe("Get Class Command", func() {
Expand All @@ -44,6 +44,7 @@ var _ = Describe("Get Class Command", func() {
Expect(cmd.Example).To(ContainSubstring("svcat get classes"))
Expect(cmd.Example).To(ContainSubstring("svcat get classes --scope cluster"))
Expect(cmd.Example).To(ContainSubstring("svcat get classes --scope namespace --namespace dev"))
Expect(cmd.Example).To(ContainSubstring("svcat get classes --broker mysql-broker"))
Expect(cmd.Example).To(ContainSubstring("svcat get class mysql"))
Expect(cmd.Example).To(ContainSubstring("svcat get class --kube-name 997b8372-8dac-40ac-ae65-758b4a5075a5"))
Expect(len(cmd.Aliases)).To(Equal(2))
Expand All @@ -64,6 +65,7 @@ var _ = Describe("Get Class Command", func() {
})
It("optionally parses the class name argument", func() {
cmd := &GetCmd{}
cmd.BrokerFiltered = &command.BrokerFiltered{}
err := cmd.Validate([]string{"foobarclass"})
Expect(err).To(BeNil())
Expect(cmd.Name).To(Equal("foobarclass"))
Expand Down Expand Up @@ -122,6 +124,44 @@ var _ = Describe("Get Class Command", func() {
}
})
Context("getting all classes", func() {
It("Calls the pkg/svcat libs RetrieveClasses with broker filter", func() {
outputBuffer := &bytes.Buffer{}

fakeApp, _ := svcat.NewApp(nil, nil, namespace)
fakeSDK := new(servicecatalogfakes.FakeSvcatClient)
fakeSDK.RetrieveClassesReturns([]servicecatalog.Class{classToReturn, namespacedClassToReturn}, nil)
fakeApp.SvcatClient = fakeSDK
cxt := svcattest.NewContext(outputBuffer, fakeApp)
cmd := GetCmd{
Formatted: command.NewFormatted(),
Namespaced: command.NewNamespaced(cxt),
Scoped: command.NewScoped(),
BrokerFiltered: command.NewBrokerFiltered(),
}
cmd.Namespaced.ApplyNamespaceFlags(&pflag.FlagSet{})
cmd.Scope = servicecatalog.AllScope
cmd.BrokerFiltered = &command.BrokerFiltered{
BrokerFilter: brokerName,
}
err := cmd.Run()

Expect(err).NotTo(HaveOccurred())
Expect(fakeSDK.RetrieveClassesCallCount()).To(Equal(1))
returnedScopeOpts, returnedBrokerFilter := fakeSDK.RetrieveClassesArgsForCall(0)
scopeOpts := servicecatalog.ScopeOptions{
Scope: servicecatalog.AllScope,
Namespace: namespace,
}
Expect(returnedScopeOpts).To(Equal(scopeOpts))
Expect(returnedBrokerFilter).To(Equal(brokerName))

output := outputBuffer.String()
Expect(output).To(ContainSubstring(className))
Expect(output).To(ContainSubstring(classToReturn.Spec.Description))
Expect(output).To(ContainSubstring(namespacedClassName))
Expect(output).To(ContainSubstring(namespace))
Expect(output).To(ContainSubstring(namespacedClassToReturn.Spec.Description))
})
It("Calls the pkg/svcat libs RetrieveClasses with all scope and current namespace", func() {
outputBuffer := &bytes.Buffer{}

Expand All @@ -131,22 +171,24 @@ var _ = Describe("Get Class Command", func() {
fakeApp.SvcatClient = fakeSDK
cxt := svcattest.NewContext(outputBuffer, fakeApp)
cmd := GetCmd{
Formatted: command.NewFormatted(),
Namespaced: command.NewNamespaced(cxt),
Scoped: command.NewScoped(),
Formatted: command.NewFormatted(),
Namespaced: command.NewNamespaced(cxt),
Scoped: command.NewScoped(),
BrokerFiltered: command.NewBrokerFiltered(),
}
cmd.Namespaced.ApplyNamespaceFlags(&pflag.FlagSet{})
cmd.Scope = servicecatalog.AllScope
err := cmd.Run()

Expect(err).NotTo(HaveOccurred())
Expect(fakeSDK.RetrieveClassesCallCount()).To(Equal(1))
returnedScopeOpts := fakeSDK.RetrieveClassesArgsForCall(0)
returnedScopeOpts, returnedBrokerFilter := fakeSDK.RetrieveClassesArgsForCall(0)
scopeOpts := servicecatalog.ScopeOptions{
Scope: servicecatalog.AllScope,
Namespace: namespace,
}
Expect(returnedScopeOpts).To(Equal(scopeOpts))
Expect(returnedBrokerFilter).To(Equal(""))

output := outputBuffer.String()
Expect(output).To(ContainSubstring(className))
Expand All @@ -164,9 +206,10 @@ var _ = Describe("Get Class Command", func() {
fakeApp.SvcatClient = fakeSDK
cxt := svcattest.NewContext(outputBuffer, fakeApp)
cmd := GetCmd{
Formatted: command.NewFormatted(),
Namespaced: command.NewNamespaced(cxt),
Scoped: command.NewScoped(),
Formatted: command.NewFormatted(),
Namespaced: command.NewNamespaced(cxt),
Scoped: command.NewScoped(),
BrokerFiltered: command.NewBrokerFiltered(),
}
cmd.Namespaced.ApplyNamespaceFlags(&pflag.FlagSet{})
cmd.Scope = servicecatalog.NamespaceScope
Expand All @@ -175,12 +218,13 @@ var _ = Describe("Get Class Command", func() {

Expect(err).NotTo(HaveOccurred())
Expect(fakeSDK.RetrieveClassesCallCount()).To(Equal(1))
returnedScopeOpts := fakeSDK.RetrieveClassesArgsForCall(0)
returnedScopeOpts, returnedBrokerFilter := fakeSDK.RetrieveClassesArgsForCall(0)
scopeOpts := servicecatalog.ScopeOptions{
Scope: servicecatalog.NamespaceScope,
Namespace: namespace,
}
Expect(returnedScopeOpts).To(Equal(scopeOpts))
Expect(returnedBrokerFilter).To(Equal(""))

output := outputBuffer.String()
Expect(output).NotTo(ContainSubstring(className))
Expand All @@ -198,22 +242,24 @@ var _ = Describe("Get Class Command", func() {
fakeApp.SvcatClient = fakeSDK
cxt := svcattest.NewContext(outputBuffer, fakeApp)
cmd := GetCmd{
Formatted: command.NewFormatted(),
Namespaced: command.NewNamespaced(cxt),
Scoped: command.NewScoped(),
Formatted: command.NewFormatted(),
Namespaced: command.NewNamespaced(cxt),
Scoped: command.NewScoped(),
BrokerFiltered: command.NewBrokerFiltered(),
}
cmd.Namespaced.ApplyNamespaceFlags(&pflag.FlagSet{})
cmd.Scope = servicecatalog.ClusterScope
err := cmd.Run()

Expect(err).NotTo(HaveOccurred())
Expect(fakeSDK.RetrieveClassesCallCount()).To(Equal(1))
returnedScopeOpts := fakeSDK.RetrieveClassesArgsForCall(0)
returnedScopeOpts, returnedBrokerFilter := fakeSDK.RetrieveClassesArgsForCall(0)
scopeOpts := servicecatalog.ScopeOptions{
Scope: servicecatalog.ClusterScope,
Namespace: namespace,
}
Expect(returnedScopeOpts).To(Equal(scopeOpts))
Expect(returnedBrokerFilter).To(Equal(""))

output := outputBuffer.String()
Expect(output).To(ContainSubstring(className))
Expand Down
62 changes: 62 additions & 0 deletions cmd/svcat/command/brokerfiltered.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/*
Copyright 2020 The Kubernetes Authors.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package command

import (
"github.com/spf13/cobra"
)

const (
// BrokerAll is the default argument to specify when you want to list or filter resources for all brokers
BrokerAll string = ""
)

// HasBrokerFlag represents a command that supports --broker.
type HasBrokerFlag interface {
// ApplyBrokerFlag validates and persists the broker related flag.
// --broker
ApplyBrokerFlag(*cobra.Command) error
}

// BrokerFiltered adds support to a command for the --broker flag.
type BrokerFiltered struct {
BrokerFilter string
}

// NewBrokerFiltered initializes a new broker specified command.
func NewBrokerFiltered() *BrokerFiltered {
return &BrokerFiltered{}
}

// AddBrokerFlag adds the broker related flag.
// --broker
func (c *BrokerFiltered) AddBrokerFlag(cmd *cobra.Command) {
cmd.Flags().StringP(
"broker",
"b",
"",
"If present, specify the broker used as a filter for this request",
)
}

// ApplyBrokerFlag persists the broker related flag.
// --broker
func (c *BrokerFiltered) ApplyBrokerFlag(cmd *cobra.Command) error {
var err error
c.BrokerFilter, err = cmd.Flags().GetString("broker")
return err
}
6 changes: 6 additions & 0 deletions cmd/svcat/command/command.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,12 @@ func PreRunE(cmd Command) func(*cobra.Command, []string) error {
return err
}
}
if brokerFilteredCmd, ok := cmd.(HasBrokerFlag); ok {
err := brokerFilteredCmd.ApplyBrokerFlag(c)
if err != nil {
return err
}
}
if classFilteredCmd, ok := cmd.(HasClassFlag); ok {
err := classFilteredCmd.ApplyClassFlag(c)
if err != nil {
Expand Down
4 changes: 3 additions & 1 deletion cmd/svcat/output/class.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,16 @@ func writeClassListTable(w io.Writer, classes []servicecatalog.Class) {
t.SetHeader([]string{
"Name",
"Namespace",
"Broker",
"Description",
})
t.SetVariableColumn(3)
t.SetVariableColumn(4)

for _, class := range classes {
t.Append([]string{
class.GetExternalName(),
class.GetNamespace(),
class.GetServiceBrokerName(),
class.GetDescription(),
})
}
Expand Down
Loading