Skip to content

Commit 424d92a

Browse files
authored
fix: allow to delete all ACLs for principal (#1441)
1 parent 5a93157 commit 424d92a

File tree

7 files changed

+93
-37
lines changed

7 files changed

+93
-37
lines changed

docs/commands/rhoas_kafka_acl_delete.md

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/cmd/kafka/acl/aclcmdutil/constants.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,5 @@ const (
3737
PatternTypePREFIX = "prefix"
3838
PatternTypeANY = "any"
3939
)
40+
41+
var PatternTypes = []string{PatternTypeANY, PatternTypeLITERAL, PatternTypePREFIX}

pkg/cmd/kafka/acl/aclcmdutil/util.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@ func IsValidResourceOperation(resourceType string, operation string, resourceOpe
9393
return false, resourceOperations
9494
}
9595

96-
// ValidateAndSetResources validates and sets resources options
97-
func ValidateAndSetResources(opts *CrudOptions, resourceTypeFlagEntries []*localize.TemplateEntry) error {
96+
// SetACLResources sets resources options and returns number of changed resources
97+
func SetACLResources(opts *CrudOptions) int {
9898
var selectedResourceTypeCount int
9999

100100
if opts.Topic != "" {
@@ -118,11 +118,7 @@ func ValidateAndSetResources(opts *CrudOptions, resourceTypeFlagEntries []*local
118118
opts.ResourceName = KafkaCluster
119119
}
120120

121-
if selectedResourceTypeCount != 1 {
122-
return opts.Localizer.MustLocalizeError("kafka.acl.common.error.oneResourceTypeAllowed", resourceTypeFlagEntries...)
123-
}
124-
125-
return nil
121+
return selectedResourceTypeCount
126122
}
127123

128124
// ValidateAPIError checks for a HTTP error and maps it to a user friendly error

pkg/cmd/kafka/acl/create/create.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package create
33
import (
44
"github.com/AlecAivazis/survey/v2"
55
"github.com/redhat-developer/app-services-cli/pkg/cmd/kafka/acl/aclcmdutil"
6-
aclFlagutil "github.com/redhat-developer/app-services-cli/pkg/cmd/kafka/acl/flagutil"
6+
aclFlagUtil "github.com/redhat-developer/app-services-cli/pkg/cmd/kafka/acl/flagutil"
77
"github.com/redhat-developer/app-services-cli/pkg/core/cmdutil"
88
"github.com/redhat-developer/app-services-cli/pkg/core/cmdutil/flagutil"
99
"github.com/redhat-developer/app-services-cli/pkg/core/ioutil/dump"
@@ -63,8 +63,10 @@ func NewCreateCommand(f *factory.Factory) *cobra.Command {
6363
errorCollection = append(errorCollection, opts.Localizer.MustLocalizeError("kafka.acl.common.flag.operation.required"))
6464
}
6565

66-
if resourceErrors := aclcmdutil.ValidateAndSetResources(opts, aclFlagutil.ResourceTypeFlagEntries); resourceErrors != nil {
67-
errorCollection = append(errorCollection, resourceErrors)
66+
selectedResourceTypeCount := aclcmdutil.SetACLResources(opts)
67+
68+
if selectedResourceTypeCount != 1 {
69+
errorCollection = append(errorCollection, opts.Localizer.MustLocalizeError("kafka.acl.common.error.oneResourceTypeAllowed", aclFlagUtil.ResourceTypeFlagEntries...))
6870
}
6971

7072
if principalErrors := validateAndSetOpts(opts); principalErrors != nil {
@@ -79,7 +81,7 @@ func NewCreateCommand(f *factory.Factory) *cobra.Command {
7981
},
8082
}
8183

82-
flags := aclFlagutil.NewFlagSet(cmd, f)
84+
flags := aclFlagUtil.NewFlagSet(cmd, f)
8385

8486
flags.AddPermissionCreate(&opts.Permission)
8587
flags.AddOperationCreate(&opts.Operation)

pkg/cmd/kafka/acl/delete/delete.go

Lines changed: 66 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@ import (
1717
)
1818

1919
var (
20-
serviceAccount string
21-
userID string
22-
allAccounts bool
23-
prefix bool
20+
serviceAccount string
21+
userID string
22+
allAccounts bool
23+
prefix bool
24+
patternTypeFlag string
2425
)
2526

2627
type requestParams struct {
@@ -56,12 +57,10 @@ func NewDeleteCommand(f *factory.Factory) *cobra.Command {
5657

5758
var errorCollection []error
5859

59-
if opts.Operation == "" {
60-
errorCollection = append(errorCollection, opts.Localizer.MustLocalizeError("kafka.acl.common.flag.operation.required"))
61-
}
62-
63-
if resourceErrors := aclcmdutil.ValidateAndSetResources(opts, aclFlagUtil.ResourceTypeFlagEntries); resourceErrors != nil {
64-
errorCollection = append(errorCollection, resourceErrors)
60+
selectedResourceTypeCount := aclcmdutil.SetACLResources(opts)
61+
if selectedResourceTypeCount > 1 {
62+
errorCollection = append(errorCollection,
63+
opts.Localizer.MustLocalizeError("kafka.acl.common.error.oneResourceTypeAllowed", aclFlagUtil.ResourceTypeFlagEntries...))
6564
}
6665

6766
if principalErrors := validateAndSetOpts(opts); principalErrors != nil {
@@ -82,7 +81,7 @@ func NewDeleteCommand(f *factory.Factory) *cobra.Command {
8281
flags.AddOperationFilter(&opts.Operation)
8382

8483
flags.AddCluster(&opts.Cluster)
85-
flags.AddPrefix(&prefix)
84+
8685
flags.AddTopic(&opts.Topic)
8786
flags.AddConsumerGroup(&opts.Group)
8887
flags.AddTransactionalID(&opts.TransactionalID)
@@ -92,6 +91,19 @@ func NewDeleteCommand(f *factory.Factory) *cobra.Command {
9291
flags.AddServiceAccount(&serviceAccount)
9392
flags.AddAllAccounts(&allAccounts)
9493
flags.AddYes(&opts.SkipConfirm)
94+
flags.AddPrefix(&prefix)
95+
96+
cmd.Flags().StringVar(
97+
&patternTypeFlag,
98+
"pattern-type",
99+
aclcmdutil.PatternTypeLITERAL,
100+
opts.Localizer.MustLocalize("kafka.acl.common.flag.patterntypes.description",
101+
localize.NewEntry("Types", aclcmdutil.PatternTypes)),
102+
)
103+
104+
_ = cmd.RegisterFlagCompletionFunc("pattern-type", func(cmd *cobra.Command, _ []string, toComplete string) ([]string, cobra.ShellCompDirective) {
105+
return aclcmdutil.PatternTypes, cobra.ShellCompDirectiveNoSpace
106+
})
95107

96108
return cmd
97109
}
@@ -118,12 +130,15 @@ func runDelete(instanceID string, opts *aclcmdutil.CrudOptions) error {
118130
return err
119131
}
120132

121-
if isValidOp, validResourceOperations := aclcmdutil.IsValidResourceOperation(opts.ResourceType, opts.Operation, resourceOperations); !isValidOp {
122-
return opts.Localizer.MustLocalizeError("kafka.acl.common.error.invalidResourceOperation",
123-
localize.NewEntry("ResourceType", opts.ResourceType),
124-
localize.NewEntry("Operation", opts.Operation),
125-
localize.NewEntry("ValidOperationList", cmdutil.StringSliceToListStringWithQuotes(validResourceOperations)),
126-
)
133+
// Validate only when both are present
134+
if opts.ResourceType != "" && opts.Operation != "" {
135+
if isValidOp, validResourceOperations := aclcmdutil.IsValidResourceOperation(opts.ResourceType, opts.Operation, resourceOperations); !isValidOp {
136+
return opts.Localizer.MustLocalizeError("kafka.acl.common.error.invalidResourceOperation",
137+
localize.NewEntry("ResourceType", opts.ResourceType),
138+
localize.NewEntry("Operation", opts.Operation),
139+
localize.NewEntry("ValidOperationList", cmdutil.StringSliceToListStringWithQuotes(validResourceOperations)),
140+
)
141+
}
127142
}
128143

129144
kafkaNameTmplEntry := localize.NewEntry("Name", kafkaInstance.GetName())
@@ -149,14 +164,29 @@ func runDelete(instanceID string, opts *aclcmdutil.CrudOptions) error {
149164

150165
requestParams := getRequestParams(opts)
151166

152-
deletedACLs, httpRes, err := adminAPI.AclsApi.DeleteAcls(ctx).
153-
ResourceType(requestParams.resourceType).
154-
Principal(requestParams.principal).
155-
PatternType(requestParams.patternType).
156-
ResourceName(requestParams.resourceName).
157-
Operation(requestParams.operation).
158-
Permission(requestParams.permission).
159-
Execute()
167+
requestDeleteAcls := adminAPI.AclsApi.DeleteAcls(ctx)
168+
if requestParams.resourceType != "" {
169+
requestDeleteAcls = requestDeleteAcls.ResourceType(requestParams.resourceType)
170+
}
171+
172+
if requestParams.principal != "" {
173+
requestDeleteAcls = requestDeleteAcls.Principal(requestParams.principal)
174+
}
175+
176+
if requestParams.resourceName != "" {
177+
requestDeleteAcls = requestDeleteAcls.ResourceName(requestParams.resourceName)
178+
}
179+
if requestParams.patternType != "" {
180+
requestDeleteAcls = requestDeleteAcls.PatternType(requestParams.patternType)
181+
}
182+
if requestParams.operation != "" {
183+
requestDeleteAcls = requestDeleteAcls.Operation(requestParams.operation)
184+
}
185+
if requestParams.permission != "" {
186+
requestDeleteAcls = requestDeleteAcls.Permission(requestParams.permission)
187+
}
188+
189+
deletedACLs, httpRes, err := requestDeleteAcls.Execute()
160190

161191
if httpRes != nil {
162192
defer httpRes.Body.Close()
@@ -226,7 +256,17 @@ func validateAndSetOpts(opts *aclcmdutil.CrudOptions) error {
226256
return opts.Localizer.MustLocalizeError("kafka.acl.common.error.noPrincipalsSelected")
227257
}
228258

229-
opts.PatternType = aclcmdutil.PatternTypeLITERAL
259+
// Backwards compatibility:
260+
261+
switch patternTypeFlag {
262+
case aclcmdutil.PatternTypeANY:
263+
opts.PatternType = aclcmdutil.PatternTypeANY
264+
case aclcmdutil.PatternTypePREFIX:
265+
opts.PatternType = aclcmdutil.PatternTypePREFIX
266+
case aclcmdutil.PatternTypeLITERAL:
267+
opts.PatternType = aclcmdutil.PatternTypeLITERAL
268+
}
269+
230270
if prefix {
231271
opts.PatternType = aclcmdutil.PatternTypePREFIX
232272
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package flagutil
2+
3+
// DeprecateFlag provides a way to deprecate a flag by appending standard prefixes to the flag description.
4+
func DeprecateFlag(flagDescription string) string {
5+
return "DEPRECATED: " + flagDescription
6+
}

pkg/core/localize/locales/en/cmd/acl.en.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ one = 'Set the resource type to cluster'
8585
[kafka.acl.common.flag.prefix.description]
8686
one = 'Determine if the resource should be exact match or prefix'
8787

88+
[kafka.acl.common.flag.patterntypes.description]
89+
one = 'Allows to specify arguments matching strategy {{.Types}}'
90+
8891
[kafka.acl.common.flag.topic.description]
8992
one = 'Set the topic resource. When the --prefix option is also passed, this is used as the topic prefix'
9093

@@ -291,6 +294,9 @@ $ rhoas kafka acl delete --operation write --permission allow --topic all --user
291294
# Delete an ACL for a service account
292295
$ rhoas kafka acl delete --operation all --permission any --topic "rhoas" --prefix --service-account "srvc-acct-11924479-43fe-42b4-9676-cf0c9aca81"
293296
297+
# Delete all ACLs for a service account
298+
$ rhoas kafka acl delete --service-account "srvc-acct-11924479-43fe-42b4-9676-cf0c9aca81 --pattern-type=all"
299+
294300
# Delete an ACL for all users on the consumer group resource
295301
$ rhoas kafka acl delete --operation all --permission any --group "group-1" --all-accounts
296302
'''

0 commit comments

Comments
 (0)