|
| 1 | +package subcmd |
| 2 | + |
| 3 | +import ( |
| 4 | + "context" |
| 5 | + "strings" |
| 6 | + |
| 7 | + "github.com/aws/aws-sdk-go/aws/session" |
| 8 | + "github.com/segmentio/kafka-go" |
| 9 | + "github.com/segmentio/topicctl/pkg/acl" |
| 10 | + "github.com/segmentio/topicctl/pkg/cli" |
| 11 | + log "github.com/sirupsen/logrus" |
| 12 | + "github.com/spf13/cobra" |
| 13 | +) |
| 14 | + |
| 15 | +var deleteCmd = &cobra.Command{ |
| 16 | + Use: "delete [resource type]", |
| 17 | + Short: "delete instances of a particular type", |
| 18 | + Long: strings.Join( |
| 19 | + []string{ |
| 20 | + "Deletes instances of a particular type.", |
| 21 | + }, |
| 22 | + "\n", |
| 23 | + ), |
| 24 | + PersistentPreRunE: deletePreRun, |
| 25 | +} |
| 26 | + |
| 27 | +type deleteCmdConfig struct { |
| 28 | + dryRun bool |
| 29 | + |
| 30 | + shared sharedOptions |
| 31 | +} |
| 32 | + |
| 33 | +var deleteConfig deleteCmdConfig |
| 34 | + |
| 35 | +func init() { |
| 36 | + deleteCmd.PersistentFlags().BoolVar( |
| 37 | + &deleteConfig.dryRun, |
| 38 | + "dry-run", |
| 39 | + false, |
| 40 | + "Do a dry-run", |
| 41 | + ) |
| 42 | + |
| 43 | + addSharedFlags(deleteCmd, &deleteConfig.shared) |
| 44 | + deleteCmd.AddCommand( |
| 45 | + deleteACLCmd(), |
| 46 | + ) |
| 47 | + RootCmd.AddCommand(deleteCmd) |
| 48 | +} |
| 49 | + |
| 50 | +func deletePreRun(cmd *cobra.Command, args []string) error { |
| 51 | + return deleteConfig.shared.validate() |
| 52 | +} |
| 53 | + |
| 54 | +var deleteACLsConfig = aclsCmdConfig{} |
| 55 | + |
| 56 | +func deleteACLCmd() *cobra.Command { |
| 57 | + cmd := &cobra.Command{ |
| 58 | + Use: "acls [flags]", |
| 59 | + Short: "Delete ACLs. Requires providing flags to target ACLs for deletion.", |
| 60 | + Args: cobra.NoArgs, |
| 61 | + Example: `Delete read acls for topic my-topic, user 'User:default', and host '*' |
| 62 | +$ topicctl delete acls --resource-type topic --resource-pattern-type literal --resource-name my-topic --principal 'User:default' --host '*' --operation read --permission-type allow |
| 63 | +`, |
| 64 | + RunE: func(cmd *cobra.Command, args []string) error { |
| 65 | + ctx := context.Background() |
| 66 | + sess := session.Must(session.NewSession()) |
| 67 | + |
| 68 | + adminClient, err := deleteConfig.shared.getAdminClient(ctx, sess, deleteConfig.dryRun) |
| 69 | + if err != nil { |
| 70 | + return err |
| 71 | + } |
| 72 | + defer adminClient.Close() |
| 73 | + |
| 74 | + cliRunner := cli.NewCLIRunner(adminClient, log.Infof, !noSpinner) |
| 75 | + |
| 76 | + filter := kafka.DeleteACLsFilter{ |
| 77 | + ResourceTypeFilter: kafka.ResourceType(deleteACLsConfig.resourceType), |
| 78 | + ResourceNameFilter: deleteACLsConfig.resourceNameFilter, |
| 79 | + ResourcePatternTypeFilter: kafka.PatternType(deleteACLsConfig.resourcePatternType), |
| 80 | + PrincipalFilter: deleteACLsConfig.principalFilter, |
| 81 | + HostFilter: deleteACLsConfig.hostFilter, |
| 82 | + Operation: kafka.ACLOperationType(deleteACLsConfig.operationType), |
| 83 | + PermissionType: kafka.ACLPermissionType(deleteACLsConfig.permissionType), |
| 84 | + } |
| 85 | + |
| 86 | + aclAdminConfig := acl.ACLAdminConfig{ |
| 87 | + // Omit fields we don't need for deletes |
| 88 | + DryRun: deleteConfig.dryRun, |
| 89 | + // Deletes cannot be skipped |
| 90 | + SkipConfirm: false, |
| 91 | + } |
| 92 | + |
| 93 | + return cliRunner.DeleteACL(ctx, aclAdminConfig, filter) |
| 94 | + }, |
| 95 | + } |
| 96 | + cmd.Flags().StringVar( |
| 97 | + &deleteACLsConfig.hostFilter, |
| 98 | + "host", |
| 99 | + "", |
| 100 | + `The host to filter on. (e.g. 198.51.100.0) (Required)`, |
| 101 | + ) |
| 102 | + cmd.MarkFlagRequired("host") |
| 103 | + |
| 104 | + cmd.Flags().Var( |
| 105 | + &deleteACLsConfig.operationType, |
| 106 | + "operation", |
| 107 | + `The operation that is being allowed or denied to filter on. allowed: [any, all, read, write, create, delete, alter, describe, clusteraction, describeconfigs, alterconfigs, idempotentwrite] (Required)`, |
| 108 | + ) |
| 109 | + cmd.MarkFlagRequired("operation") |
| 110 | + |
| 111 | + cmd.Flags().Var( |
| 112 | + &deleteACLsConfig.permissionType, |
| 113 | + "permission-type", |
| 114 | + `The permission type to filter on. allowed: [any, allow, deny] (Required)`, |
| 115 | + ) |
| 116 | + cmd.MarkFlagRequired("permission-type") |
| 117 | + |
| 118 | + cmd.Flags().StringVar( |
| 119 | + &deleteACLsConfig.principalFilter, |
| 120 | + "principal", |
| 121 | + "", |
| 122 | + `The principal to filter on in principalType:name format (e.g. User:alice). (Required)`, |
| 123 | + ) |
| 124 | + cmd.MarkFlagRequired("principal") |
| 125 | + |
| 126 | + cmd.Flags().StringVar( |
| 127 | + &deleteACLsConfig.resourceNameFilter, |
| 128 | + "resource-name", |
| 129 | + "", |
| 130 | + `The resource name to filter on. (e.g. my-topic) (Required)`, |
| 131 | + ) |
| 132 | + cmd.MarkFlagRequired("resource-name") |
| 133 | + |
| 134 | + cmd.Flags().Var( |
| 135 | + &deleteACLsConfig.resourcePatternType, |
| 136 | + "resource-pattern-type", |
| 137 | + `The type of the resource pattern or filter. allowed: [any, match, literal, prefixed]. "any" will match any pattern type (literal or prefixed), but will match the resource name exactly, where as "match" will perform pattern matching to list all acls that affect the supplied resource(s).`, |
| 138 | + ) |
| 139 | + |
| 140 | + cmd.Flags().Var( |
| 141 | + &deleteACLsConfig.resourceType, |
| 142 | + "resource-type", |
| 143 | + `The type of resource to filter on. allowed: [any, topic, group, cluster, transactionalid, delegationtoken] (Required)`, |
| 144 | + ) |
| 145 | + cmd.MarkFlagRequired("resource-type") |
| 146 | + return cmd |
| 147 | +} |
0 commit comments