From afda40f5da234f34f60960955f38d6275901f0fd Mon Sep 17 00:00:00 2001 From: Ramakrishna Pattnaik Date: Wed, 7 Jul 2021 22:37:51 +0530 Subject: [PATCH 1/3] feat(consumer-group list): add search flag --- docs/commands/rhoas_kafka_consumer-group_list.adoc | 1 + pkg/cmd/kafka/consumergroup/list/list.go | 7 +++++++ .../locales/en/cmd/kafka_consumergroup_list.en.toml | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/docs/commands/rhoas_kafka_consumer-group_list.adoc b/docs/commands/rhoas_kafka_consumer-group_list.adoc index 06e0ecc9c..b0efefe48 100644 --- a/docs/commands/rhoas_kafka_consumer-group_list.adoc +++ b/docs/commands/rhoas_kafka_consumer-group_list.adoc @@ -30,6 +30,7 @@ $ rhoas kafka consumer-group list -o json `--limit` _int32_:: The maximum number of consumer groups to be returned (default 1000) `-o`, `--output` _string_:: Format in which to display the consumer groups. Choose from: "json", "yml", "yaml" + `--search` _string_:: Text search to filter consumer groups by ID `--topic` _string_:: Fetch the consumer groups for a specific Kafka topic [discrete] diff --git a/pkg/cmd/kafka/consumergroup/list/list.go b/pkg/cmd/kafka/consumergroup/list/list.go index 12c66e3f2..3d8478d94 100644 --- a/pkg/cmd/kafka/consumergroup/list/list.go +++ b/pkg/cmd/kafka/consumergroup/list/list.go @@ -34,6 +34,7 @@ type Options struct { kafkaID string limit int32 topic string + search string } type consumerGroupRow struct { @@ -81,6 +82,7 @@ func NewListConsumerGroupCommand(f *factory.Factory) *cobra.Command { cmd.Flags().Int32VarP(&opts.limit, "limit", "", 1000, opts.localizer.MustLocalize("kafka.consumerGroup.list.flag.limit")) cmd.Flags().StringVarP(&opts.output, "output", "o", "", opts.localizer.MustLocalize("kafka.consumerGroup.list.flag.output.description")) cmd.Flags().StringVar(&opts.topic, "topic", "", opts.localizer.MustLocalize("kafka.consumerGroup.list.flag.topic.description")) + cmd.Flags().StringVar(&opts.search, "search", "", opts.localizer.MustLocalize("kafka.consumerGroup.list.flag.search")) _ = cmd.RegisterFlagCompletionFunc("topic", func(cmd *cobra.Command, _ []string, toComplete string) ([]string, cobra.ShellCompDirective) { return cmdutil.FilterValidTopicNameArgs(f, toComplete) @@ -91,6 +93,7 @@ func NewListConsumerGroupCommand(f *factory.Factory) *cobra.Command { return cmd } +// nolint:funlen func runList(opts *Options) (err error) { conn, err := opts.Connection(connection.DefaultConfigRequireMasAuth) if err != nil { @@ -114,6 +117,10 @@ func runList(opts *Options) (err error) { if opts.topic != "" { req = req.Topic(opts.topic) } + if opts.search != "" { + req = req.GroupIdFilter(opts.search) + } + consumerGroupData, httpRes, err := req.Execute() if err != nil { if httpRes == nil { diff --git a/pkg/localize/locales/en/cmd/kafka_consumergroup_list.en.toml b/pkg/localize/locales/en/cmd/kafka_consumergroup_list.en.toml index b7a198e2f..6bf329e50 100644 --- a/pkg/localize/locales/en/cmd/kafka_consumergroup_list.en.toml +++ b/pkg/localize/locales/en/cmd/kafka_consumergroup_list.en.toml @@ -21,6 +21,10 @@ $ rhoas kafka consumer-group list -o json description = 'Description for the --limit flag' one = 'The maximum number of consumer groups to be returned' +[kafka.consumerGroup.list.flag.search] +description = 'Description for the --search flag' +one = 'Text search to filter consumer groups by ID' + [kafka.consumerGroup.list.log.info.noConsumerGroups] one = 'Kafka instance "{{.InstanceName}}" has no consumer groups' From 6ce22def47c00e62c4e8c13dd370e3a3dcf5cd8f Mon Sep 17 00:00:00 2001 From: Ramakrishna Pattnaik Date: Thu, 8 Jul 2021 14:02:00 +0530 Subject: [PATCH 2/3] fix: add validation for search input --- pkg/cmd/kafka/consumergroup/list/list.go | 11 +++++++ pkg/kafka/consumergroup/validators.go | 33 +++++++++++++++++++ .../en/cmd/kafka_consumergroup_common.en.toml | 6 +++- 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 pkg/kafka/consumergroup/validators.go diff --git a/pkg/cmd/kafka/consumergroup/list/list.go b/pkg/cmd/kafka/consumergroup/list/list.go index 3d8478d94..612aeba87 100644 --- a/pkg/cmd/kafka/consumergroup/list/list.go +++ b/pkg/cmd/kafka/consumergroup/list/list.go @@ -13,6 +13,8 @@ import ( "github.com/redhat-developer/app-services-cli/pkg/cmd/flag" "github.com/redhat-developer/app-services-cli/pkg/cmdutil" flagutil "github.com/redhat-developer/app-services-cli/pkg/cmdutil/flags" + consumergrouputil "github.com/redhat-developer/app-services-cli/pkg/kafka/consumergroup" + "github.com/redhat-developer/app-services-cli/pkg/connection" "github.com/redhat-developer/app-services-cli/pkg/dump" "github.com/redhat-developer/app-services-cli/pkg/iostreams" @@ -73,6 +75,15 @@ func NewListConsumerGroupCommand(f *factory.Factory) *cobra.Command { return fmt.Errorf(opts.localizer.MustLocalize("kafka.consumerGroup.common.error.noKafkaSelected")) } + if opts.search != "" { + validator := &consumergrouputil.Validator{ + Localizer: opts.localizer, + } + if err = validator.ValidateSearchInput(opts.search); err != nil { + return err + } + } + opts.kafkaID = cfg.Services.Kafka.ClusterID return runList(opts) diff --git a/pkg/kafka/consumergroup/validators.go b/pkg/kafka/consumergroup/validators.go new file mode 100644 index 000000000..27be67730 --- /dev/null +++ b/pkg/kafka/consumergroup/validators.go @@ -0,0 +1,33 @@ +package consumergroup + +import ( + "errors" + "regexp" + + "github.com/redhat-developer/app-services-cli/pkg/common/commonerr" + "github.com/redhat-developer/app-services-cli/pkg/localize" +) + +const ( + legalSearchChars = "^[a-zA-Z0-9-]+$" +) + +// Validator is a type for validating Kafka consumer group configuration values +type Validator struct { + Localizer localize.Localizer +} + +func (v *Validator) ValidateSearchInput(val interface{}) error { + search, ok := val.(string) + if !ok { + return commonerr.NewCastError(val, "string") + } + + matched, _ := regexp.Match(legalSearchChars, []byte(search)) + + if matched { + return nil + } + + return errors.New(v.Localizer.MustLocalize("kafka.consumerGroup.list.error.illegalSearchValue", localize.NewEntry("Search", search))) +} diff --git a/pkg/localize/locales/en/cmd/kafka_consumergroup_common.en.toml b/pkg/localize/locales/en/cmd/kafka_consumergroup_common.en.toml index e216b6cf7..bd2f738a6 100644 --- a/pkg/localize/locales/en/cmd/kafka_consumergroup_common.en.toml +++ b/pkg/localize/locales/en/cmd/kafka_consumergroup_common.en.toml @@ -31,4 +31,8 @@ one = 'no Kafka instance is currently selected, run "rhoas kafka use" to set the one = 'you are unauthorized to {{.Operation}} these consumer groups' [kafka.consumerGroup.list.error.forbidden] -one = 'you are forbidden to {{.Operation}} these consumer groups' \ No newline at end of file +one = 'you are forbidden to {{.Operation}} these consumer groups' + +[kafka.consumerGroup.list.error.illegalSearchValue] +description = 'Error message when invalid chars are used for search flag' +one = 'illegal search value "{{.Search}}"; only letters (Aa-Zz), numbers and "-" are accepted' \ No newline at end of file From d05b88e09d4123c507d0dfb0c676f7ffb4656d89 Mon Sep 17 00:00:00 2001 From: Ramakrishna Pattnaik Date: Fri, 9 Jul 2021 18:55:36 +0530 Subject: [PATCH 3/3] fix: remove validation --- pkg/cmd/kafka/consumergroup/list/list.go | 10 ------ pkg/kafka/consumergroup/validators.go | 33 ------------------- .../en/cmd/kafka_consumergroup_common.en.toml | 6 +--- 3 files changed, 1 insertion(+), 48 deletions(-) delete mode 100644 pkg/kafka/consumergroup/validators.go diff --git a/pkg/cmd/kafka/consumergroup/list/list.go b/pkg/cmd/kafka/consumergroup/list/list.go index 612aeba87..1ef85760e 100644 --- a/pkg/cmd/kafka/consumergroup/list/list.go +++ b/pkg/cmd/kafka/consumergroup/list/list.go @@ -13,7 +13,6 @@ import ( "github.com/redhat-developer/app-services-cli/pkg/cmd/flag" "github.com/redhat-developer/app-services-cli/pkg/cmdutil" flagutil "github.com/redhat-developer/app-services-cli/pkg/cmdutil/flags" - consumergrouputil "github.com/redhat-developer/app-services-cli/pkg/kafka/consumergroup" "github.com/redhat-developer/app-services-cli/pkg/connection" "github.com/redhat-developer/app-services-cli/pkg/dump" @@ -75,15 +74,6 @@ func NewListConsumerGroupCommand(f *factory.Factory) *cobra.Command { return fmt.Errorf(opts.localizer.MustLocalize("kafka.consumerGroup.common.error.noKafkaSelected")) } - if opts.search != "" { - validator := &consumergrouputil.Validator{ - Localizer: opts.localizer, - } - if err = validator.ValidateSearchInput(opts.search); err != nil { - return err - } - } - opts.kafkaID = cfg.Services.Kafka.ClusterID return runList(opts) diff --git a/pkg/kafka/consumergroup/validators.go b/pkg/kafka/consumergroup/validators.go deleted file mode 100644 index 27be67730..000000000 --- a/pkg/kafka/consumergroup/validators.go +++ /dev/null @@ -1,33 +0,0 @@ -package consumergroup - -import ( - "errors" - "regexp" - - "github.com/redhat-developer/app-services-cli/pkg/common/commonerr" - "github.com/redhat-developer/app-services-cli/pkg/localize" -) - -const ( - legalSearchChars = "^[a-zA-Z0-9-]+$" -) - -// Validator is a type for validating Kafka consumer group configuration values -type Validator struct { - Localizer localize.Localizer -} - -func (v *Validator) ValidateSearchInput(val interface{}) error { - search, ok := val.(string) - if !ok { - return commonerr.NewCastError(val, "string") - } - - matched, _ := regexp.Match(legalSearchChars, []byte(search)) - - if matched { - return nil - } - - return errors.New(v.Localizer.MustLocalize("kafka.consumerGroup.list.error.illegalSearchValue", localize.NewEntry("Search", search))) -} diff --git a/pkg/localize/locales/en/cmd/kafka_consumergroup_common.en.toml b/pkg/localize/locales/en/cmd/kafka_consumergroup_common.en.toml index bd2f738a6..e216b6cf7 100644 --- a/pkg/localize/locales/en/cmd/kafka_consumergroup_common.en.toml +++ b/pkg/localize/locales/en/cmd/kafka_consumergroup_common.en.toml @@ -31,8 +31,4 @@ one = 'no Kafka instance is currently selected, run "rhoas kafka use" to set the one = 'you are unauthorized to {{.Operation}} these consumer groups' [kafka.consumerGroup.list.error.forbidden] -one = 'you are forbidden to {{.Operation}} these consumer groups' - -[kafka.consumerGroup.list.error.illegalSearchValue] -description = 'Error message when invalid chars are used for search flag' -one = 'illegal search value "{{.Search}}"; only letters (Aa-Zz), numbers and "-" are accepted' \ No newline at end of file +one = 'you are forbidden to {{.Operation}} these consumer groups' \ No newline at end of file