kafka-python 3.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- kafka/__init__.py +34 -0
- kafka/__main__.py +5 -0
- kafka/admin/__init__.py +29 -0
- kafka/admin/__main__.py +5 -0
- kafka/admin/_acls.py +355 -0
- kafka/admin/_cluster.py +359 -0
- kafka/admin/_configs.py +479 -0
- kafka/admin/_groups.py +754 -0
- kafka/admin/_partitions.py +595 -0
- kafka/admin/_topics.py +281 -0
- kafka/admin/_transactions.py +450 -0
- kafka/admin/_users.py +194 -0
- kafka/admin/client.py +373 -0
- kafka/benchmarks/__init__.py +0 -0
- kafka/benchmarks/consumer_performance.py +138 -0
- kafka/benchmarks/load_example.py +109 -0
- kafka/benchmarks/producer_encode_path.py +201 -0
- kafka/benchmarks/producer_performance.py +161 -0
- kafka/benchmarks/profile_protocol.py +138 -0
- kafka/benchmarks/protocol_old_vs_new.py +447 -0
- kafka/benchmarks/record_batch_compose.py +77 -0
- kafka/benchmarks/record_batch_read.py +82 -0
- kafka/benchmarks/varint_speed.py +426 -0
- kafka/cli/__init__.py +36 -0
- kafka/cli/admin/__init__.py +117 -0
- kafka/cli/admin/acls/__init__.py +9 -0
- kafka/cli/admin/acls/common.py +76 -0
- kafka/cli/admin/acls/create.py +19 -0
- kafka/cli/admin/acls/delete.py +23 -0
- kafka/cli/admin/acls/describe.py +16 -0
- kafka/cli/admin/cluster/__init__.py +14 -0
- kafka/cli/admin/cluster/describe.py +11 -0
- kafka/cli/admin/cluster/describe_quorum.py +11 -0
- kafka/cli/admin/cluster/features.py +52 -0
- kafka/cli/admin/cluster/log_dirs.py +43 -0
- kafka/cli/admin/cluster/versions.py +33 -0
- kafka/cli/admin/configs/__init__.py +10 -0
- kafka/cli/admin/configs/alter.py +43 -0
- kafka/cli/admin/configs/common.py +17 -0
- kafka/cli/admin/configs/describe.py +30 -0
- kafka/cli/admin/configs/list.py +16 -0
- kafka/cli/admin/configs/reset.py +20 -0
- kafka/cli/admin/groups/__init__.py +16 -0
- kafka/cli/admin/groups/alter_offsets.py +30 -0
- kafka/cli/admin/groups/delete.py +11 -0
- kafka/cli/admin/groups/delete_offsets.py +29 -0
- kafka/cli/admin/groups/describe.py +11 -0
- kafka/cli/admin/groups/list.py +28 -0
- kafka/cli/admin/groups/list_offsets.py +29 -0
- kafka/cli/admin/groups/remove_members.py +40 -0
- kafka/cli/admin/groups/reset_offsets.py +139 -0
- kafka/cli/admin/partitions/__init__.py +21 -0
- kafka/cli/admin/partitions/alter_reassignments.py +37 -0
- kafka/cli/admin/partitions/create.py +27 -0
- kafka/cli/admin/partitions/delete_records.py +31 -0
- kafka/cli/admin/partitions/describe.py +36 -0
- kafka/cli/admin/partitions/elect_leaders.py +53 -0
- kafka/cli/admin/partitions/list_offsets.py +88 -0
- kafka/cli/admin/partitions/list_reassignments.py +35 -0
- kafka/cli/admin/topics/__init__.py +10 -0
- kafka/cli/admin/topics/create.py +13 -0
- kafka/cli/admin/topics/delete.py +19 -0
- kafka/cli/admin/topics/describe.py +18 -0
- kafka/cli/admin/topics/list.py +11 -0
- kafka/cli/admin/transactions/__init__.py +17 -0
- kafka/cli/admin/transactions/abort.py +38 -0
- kafka/cli/admin/transactions/describe.py +24 -0
- kafka/cli/admin/transactions/describe_producers.py +29 -0
- kafka/cli/admin/transactions/find_hanging.py +26 -0
- kafka/cli/admin/transactions/list.py +37 -0
- kafka/cli/admin/users/__init__.py +8 -0
- kafka/cli/admin/users/alter_user_scram_credentials.py +34 -0
- kafka/cli/admin/users/describe_user_scram_credentials.py +15 -0
- kafka/cli/common.py +95 -0
- kafka/cli/consumer/__init__.py +63 -0
- kafka/cli/producer/__init__.py +57 -0
- kafka/cluster.py +824 -0
- kafka/codec.py +325 -0
- kafka/consumer/__init__.py +5 -0
- kafka/consumer/__main__.py +5 -0
- kafka/consumer/fetcher.py +2012 -0
- kafka/consumer/group.py +1347 -0
- kafka/consumer/subscription_state.py +897 -0
- kafka/coordinator/__init__.py +0 -0
- kafka/coordinator/assignors/__init__.py +0 -0
- kafka/coordinator/assignors/abstract.py +90 -0
- kafka/coordinator/assignors/cooperative_sticky.py +167 -0
- kafka/coordinator/assignors/range.py +81 -0
- kafka/coordinator/assignors/roundrobin.py +101 -0
- kafka/coordinator/assignors/sticky/StickyAssignorUserData.json +37 -0
- kafka/coordinator/assignors/sticky/__init__.py +0 -0
- kafka/coordinator/assignors/sticky/partition_movements.py +149 -0
- kafka/coordinator/assignors/sticky/sorted_set.py +63 -0
- kafka/coordinator/assignors/sticky/sticky_assignor.py +665 -0
- kafka/coordinator/assignors/sticky/user_data.py +8 -0
- kafka/coordinator/base.py +1215 -0
- kafka/coordinator/consumer.py +1224 -0
- kafka/coordinator/heartbeat.py +82 -0
- kafka/coordinator/subscription.py +34 -0
- kafka/errors.py +1004 -0
- kafka/future.py +166 -0
- kafka/metrics/__init__.py +13 -0
- kafka/metrics/compound_stat.py +33 -0
- kafka/metrics/dict_reporter.py +81 -0
- kafka/metrics/kafka_metric.py +36 -0
- kafka/metrics/measurable.py +27 -0
- kafka/metrics/measurable_stat.py +13 -0
- kafka/metrics/metric_config.py +33 -0
- kafka/metrics/metric_name.py +105 -0
- kafka/metrics/metrics.py +261 -0
- kafka/metrics/metrics_reporter.py +53 -0
- kafka/metrics/quota.py +41 -0
- kafka/metrics/stat.py +19 -0
- kafka/metrics/stats/__init__.py +15 -0
- kafka/metrics/stats/avg.py +24 -0
- kafka/metrics/stats/count.py +17 -0
- kafka/metrics/stats/histogram.py +99 -0
- kafka/metrics/stats/max_stat.py +17 -0
- kafka/metrics/stats/min_stat.py +19 -0
- kafka/metrics/stats/percentile.py +14 -0
- kafka/metrics/stats/percentiles.py +75 -0
- kafka/metrics/stats/rate.py +118 -0
- kafka/metrics/stats/sampled_stat.py +99 -0
- kafka/metrics/stats/sensor.py +136 -0
- kafka/metrics/stats/total.py +15 -0
- kafka/net/__init__.py +19 -0
- kafka/net/compat.py +165 -0
- kafka/net/connection.py +593 -0
- kafka/net/http_connect.py +144 -0
- kafka/net/inet.py +122 -0
- kafka/net/manager.py +451 -0
- kafka/net/metrics.py +149 -0
- kafka/net/sasl/__init__.py +32 -0
- kafka/net/sasl/abc.py +28 -0
- kafka/net/sasl/gssapi.py +95 -0
- kafka/net/sasl/msk.py +245 -0
- kafka/net/sasl/oauth.py +98 -0
- kafka/net/sasl/plain.py +42 -0
- kafka/net/sasl/scram.py +135 -0
- kafka/net/sasl/sspi.py +111 -0
- kafka/net/selector.py +644 -0
- kafka/net/socks5.py +262 -0
- kafka/net/transport.py +415 -0
- kafka/net/wakeup_notifier.py +72 -0
- kafka/partitioner/__init__.py +8 -0
- kafka/partitioner/abc.py +8 -0
- kafka/partitioner/default.py +89 -0
- kafka/partitioner/sticky.py +109 -0
- kafka/producer/__init__.py +5 -0
- kafka/producer/__main__.py +5 -0
- kafka/producer/future.py +101 -0
- kafka/producer/kafka.py +1123 -0
- kafka/producer/producer_batch.py +192 -0
- kafka/producer/record_accumulator.py +647 -0
- kafka/producer/sender.py +884 -0
- kafka/producer/transaction_manager.py +1326 -0
- kafka/protocol/__init__.py +0 -0
- kafka/protocol/admin/__init__.py +29 -0
- kafka/protocol/admin/acl.py +83 -0
- kafka/protocol/admin/acl.pyi +375 -0
- kafka/protocol/admin/client_quotas.py +14 -0
- kafka/protocol/admin/client_quotas.pyi +265 -0
- kafka/protocol/admin/cluster.py +31 -0
- kafka/protocol/admin/cluster.pyi +620 -0
- kafka/protocol/admin/configs.py +22 -0
- kafka/protocol/admin/configs.pyi +437 -0
- kafka/protocol/admin/groups.py +24 -0
- kafka/protocol/admin/groups.pyi +261 -0
- kafka/protocol/admin/topics.py +53 -0
- kafka/protocol/admin/topics.pyi +982 -0
- kafka/protocol/admin/transactions.py +18 -0
- kafka/protocol/admin/transactions.pyi +311 -0
- kafka/protocol/admin/users.py +14 -0
- kafka/protocol/admin/users.pyi +223 -0
- kafka/protocol/api_data.py +125 -0
- kafka/protocol/api_header.py +55 -0
- kafka/protocol/api_key.py +97 -0
- kafka/protocol/api_message.py +277 -0
- kafka/protocol/broker_version_data.py +246 -0
- kafka/protocol/consumer/__init__.py +13 -0
- kafka/protocol/consumer/fetch.py +16 -0
- kafka/protocol/consumer/fetch.pyi +298 -0
- kafka/protocol/consumer/group.py +38 -0
- kafka/protocol/consumer/group.pyi +824 -0
- kafka/protocol/consumer/metadata.py +30 -0
- kafka/protocol/consumer/metadata.pyi +89 -0
- kafka/protocol/consumer/offsets.py +75 -0
- kafka/protocol/consumer/offsets.pyi +288 -0
- kafka/protocol/data_container.py +166 -0
- kafka/protocol/frame.py +30 -0
- kafka/protocol/generate_stubs.py +468 -0
- kafka/protocol/metadata/__init__.py +10 -0
- kafka/protocol/metadata/api_versions.py +41 -0
- kafka/protocol/metadata/api_versions.pyi +128 -0
- kafka/protocol/metadata/find_coordinator.py +19 -0
- kafka/protocol/metadata/find_coordinator.pyi +105 -0
- kafka/protocol/metadata/metadata.py +34 -0
- kafka/protocol/metadata/metadata.pyi +160 -0
- kafka/protocol/old/__init__.py +0 -0
- kafka/protocol/old/abstract.py +17 -0
- kafka/protocol/old/add_offsets_to_txn.py +54 -0
- kafka/protocol/old/add_partitions_to_txn.py +71 -0
- kafka/protocol/old/admin.py +1086 -0
- kafka/protocol/old/api.py +205 -0
- kafka/protocol/old/api_versions.py +133 -0
- kafka/protocol/old/commit.py +355 -0
- kafka/protocol/old/consumer_protocol.py +36 -0
- kafka/protocol/old/end_txn.py +53 -0
- kafka/protocol/old/fetch.py +408 -0
- kafka/protocol/old/find_coordinator.py +72 -0
- kafka/protocol/old/group.py +451 -0
- kafka/protocol/old/init_producer_id.py +42 -0
- kafka/protocol/old/list_offsets.py +186 -0
- kafka/protocol/old/metadata.py +290 -0
- kafka/protocol/old/offset_for_leader_epoch.py +133 -0
- kafka/protocol/old/produce.py +247 -0
- kafka/protocol/old/sasl_authenticate.py +38 -0
- kafka/protocol/old/sasl_handshake.py +39 -0
- kafka/protocol/old/struct.py +87 -0
- kafka/protocol/old/txn_offset_commit.py +73 -0
- kafka/protocol/old/types.py +440 -0
- kafka/protocol/parser.py +191 -0
- kafka/protocol/producer/__init__.py +7 -0
- kafka/protocol/producer/produce.py +17 -0
- kafka/protocol/producer/produce.pyi +197 -0
- kafka/protocol/producer/transaction.py +30 -0
- kafka/protocol/producer/transaction.pyi +663 -0
- kafka/protocol/sasl.py +52 -0
- kafka/protocol/sasl.pyi +126 -0
- kafka/protocol/schemas/__init__.py +7 -0
- kafka/protocol/schemas/fields/__init__.py +7 -0
- kafka/protocol/schemas/fields/array.py +127 -0
- kafka/protocol/schemas/fields/base.py +156 -0
- kafka/protocol/schemas/fields/codecs/__init__.py +12 -0
- kafka/protocol/schemas/fields/codecs/encode_buffer.py +82 -0
- kafka/protocol/schemas/fields/codecs/tagged_fields.py +109 -0
- kafka/protocol/schemas/fields/codecs/types.py +505 -0
- kafka/protocol/schemas/fields/codegen.py +40 -0
- kafka/protocol/schemas/fields/simple.py +127 -0
- kafka/protocol/schemas/fields/struct.py +357 -0
- kafka/protocol/schemas/fields/struct_array.py +142 -0
- kafka/protocol/schemas/load_json.py +42 -0
- kafka/protocol/schemas/resources/AddOffsetsToTxnRequest.json +40 -0
- kafka/protocol/schemas/resources/AddOffsetsToTxnResponse.json +35 -0
- kafka/protocol/schemas/resources/AddPartitionsToTxnRequest.json +65 -0
- kafka/protocol/schemas/resources/AddPartitionsToTxnResponse.json +60 -0
- kafka/protocol/schemas/resources/AlterClientQuotasRequest.json +47 -0
- kafka/protocol/schemas/resources/AlterClientQuotasResponse.json +41 -0
- kafka/protocol/schemas/resources/AlterConfigsRequest.json +43 -0
- kafka/protocol/schemas/resources/AlterConfigsResponse.json +39 -0
- kafka/protocol/schemas/resources/AlterPartitionReassignmentsRequest.json +42 -0
- kafka/protocol/schemas/resources/AlterPartitionReassignmentsResponse.json +47 -0
- kafka/protocol/schemas/resources/AlterReplicaLogDirsRequest.json +41 -0
- kafka/protocol/schemas/resources/AlterReplicaLogDirsResponse.json +41 -0
- kafka/protocol/schemas/resources/AlterUserScramCredentialsRequest.json +45 -0
- kafka/protocol/schemas/resources/AlterUserScramCredentialsResponse.json +35 -0
- kafka/protocol/schemas/resources/ApiVersionsRequest.json +34 -0
- kafka/protocol/schemas/resources/ApiVersionsResponse.json +79 -0
- kafka/protocol/schemas/resources/ConsumerProtocolAssignment.json +42 -0
- kafka/protocol/schemas/resources/ConsumerProtocolSubscription.json +49 -0
- kafka/protocol/schemas/resources/CreateAclsRequest.json +46 -0
- kafka/protocol/schemas/resources/CreateAclsResponse.json +37 -0
- kafka/protocol/schemas/resources/CreatePartitionsRequest.json +47 -0
- kafka/protocol/schemas/resources/CreatePartitionsResponse.json +41 -0
- kafka/protocol/schemas/resources/CreateTopicsRequest.json +65 -0
- kafka/protocol/schemas/resources/CreateTopicsResponse.json +72 -0
- kafka/protocol/schemas/resources/DeleteAclsRequest.json +46 -0
- kafka/protocol/schemas/resources/DeleteAclsResponse.json +59 -0
- kafka/protocol/schemas/resources/DeleteGroupsRequest.json +30 -0
- kafka/protocol/schemas/resources/DeleteGroupsResponse.json +36 -0
- kafka/protocol/schemas/resources/DeleteRecordsRequest.json +42 -0
- kafka/protocol/schemas/resources/DeleteRecordsResponse.json +43 -0
- kafka/protocol/schemas/resources/DeleteTopicsRequest.json +43 -0
- kafka/protocol/schemas/resources/DeleteTopicsResponse.json +52 -0
- kafka/protocol/schemas/resources/DescribeAclsRequest.json +43 -0
- kafka/protocol/schemas/resources/DescribeAclsResponse.json +55 -0
- kafka/protocol/schemas/resources/DescribeClientQuotasRequest.json +37 -0
- kafka/protocol/schemas/resources/DescribeClientQuotasResponse.json +47 -0
- kafka/protocol/schemas/resources/DescribeClusterRequest.json +35 -0
- kafka/protocol/schemas/resources/DescribeClusterResponse.json +56 -0
- kafka/protocol/schemas/resources/DescribeConfigsRequest.json +42 -0
- kafka/protocol/schemas/resources/DescribeConfigsResponse.json +69 -0
- kafka/protocol/schemas/resources/DescribeGroupsRequest.json +38 -0
- kafka/protocol/schemas/resources/DescribeGroupsResponse.json +74 -0
- kafka/protocol/schemas/resources/DescribeLogDirsRequest.json +38 -0
- kafka/protocol/schemas/resources/DescribeLogDirsResponse.json +65 -0
- kafka/protocol/schemas/resources/DescribeProducersRequest.json +32 -0
- kafka/protocol/schemas/resources/DescribeProducersResponse.json +55 -0
- kafka/protocol/schemas/resources/DescribeQuorumRequest.json +39 -0
- kafka/protocol/schemas/resources/DescribeQuorumResponse.json +82 -0
- kafka/protocol/schemas/resources/DescribeTopicPartitionsRequest.json +40 -0
- kafka/protocol/schemas/resources/DescribeTopicPartitionsResponse.json +66 -0
- kafka/protocol/schemas/resources/DescribeTransactionsRequest.json +27 -0
- kafka/protocol/schemas/resources/DescribeTransactionsResponse.json +52 -0
- kafka/protocol/schemas/resources/DescribeUserScramCredentialsRequest.json +30 -0
- kafka/protocol/schemas/resources/DescribeUserScramCredentialsResponse.json +45 -0
- kafka/protocol/schemas/resources/ElectLeadersRequest.json +41 -0
- kafka/protocol/schemas/resources/ElectLeadersResponse.json +45 -0
- kafka/protocol/schemas/resources/EndTxnRequest.json +43 -0
- kafka/protocol/schemas/resources/EndTxnResponse.json +41 -0
- kafka/protocol/schemas/resources/FetchRequest.json +125 -0
- kafka/protocol/schemas/resources/FetchResponse.json +124 -0
- kafka/protocol/schemas/resources/FindCoordinatorRequest.json +43 -0
- kafka/protocol/schemas/resources/FindCoordinatorResponse.json +58 -0
- kafka/protocol/schemas/resources/HeartbeatRequest.json +39 -0
- kafka/protocol/schemas/resources/HeartbeatResponse.json +35 -0
- kafka/protocol/schemas/resources/IncrementalAlterConfigsRequest.json +44 -0
- kafka/protocol/schemas/resources/IncrementalAlterConfigsResponse.json +38 -0
- kafka/protocol/schemas/resources/InitProducerIdRequest.json +50 -0
- kafka/protocol/schemas/resources/InitProducerIdResponse.json +47 -0
- kafka/protocol/schemas/resources/JoinGroupRequest.json +63 -0
- kafka/protocol/schemas/resources/JoinGroupResponse.json +69 -0
- kafka/protocol/schemas/resources/LeaveGroupRequest.json +47 -0
- kafka/protocol/schemas/resources/LeaveGroupResponse.json +47 -0
- kafka/protocol/schemas/resources/ListConfigResourcesRequest.json +31 -0
- kafka/protocol/schemas/resources/ListConfigResourcesResponse.json +37 -0
- kafka/protocol/schemas/resources/ListGroupsRequest.json +36 -0
- kafka/protocol/schemas/resources/ListGroupsResponse.json +49 -0
- kafka/protocol/schemas/resources/ListOffsetsRequest.json +72 -0
- kafka/protocol/schemas/resources/ListOffsetsResponse.json +71 -0
- kafka/protocol/schemas/resources/ListPartitionReassignmentsRequest.json +34 -0
- kafka/protocol/schemas/resources/ListPartitionReassignmentsResponse.json +46 -0
- kafka/protocol/schemas/resources/ListTransactionsRequest.json +40 -0
- kafka/protocol/schemas/resources/ListTransactionsResponse.json +42 -0
- kafka/protocol/schemas/resources/MetadataRequest.json +56 -0
- kafka/protocol/schemas/resources/MetadataResponse.json +101 -0
- kafka/protocol/schemas/resources/OffsetCommitRequest.json +76 -0
- kafka/protocol/schemas/resources/OffsetCommitResponse.json +71 -0
- kafka/protocol/schemas/resources/OffsetDeleteRequest.json +39 -0
- kafka/protocol/schemas/resources/OffsetDeleteResponse.json +42 -0
- kafka/protocol/schemas/resources/OffsetFetchRequest.json +76 -0
- kafka/protocol/schemas/resources/OffsetFetchResponse.json +107 -0
- kafka/protocol/schemas/resources/OffsetForLeaderEpochRequest.json +52 -0
- kafka/protocol/schemas/resources/OffsetForLeaderEpochResponse.json +51 -0
- kafka/protocol/schemas/resources/ProduceRequest.json +73 -0
- kafka/protocol/schemas/resources/ProduceResponse.json +96 -0
- kafka/protocol/schemas/resources/RequestHeader.json +44 -0
- kafka/protocol/schemas/resources/ResponseHeader.json +26 -0
- kafka/protocol/schemas/resources/SaslAuthenticateRequest.json +29 -0
- kafka/protocol/schemas/resources/SaslAuthenticateResponse.json +34 -0
- kafka/protocol/schemas/resources/SaslHandshakeRequest.json +31 -0
- kafka/protocol/schemas/resources/SaslHandshakeResponse.json +32 -0
- kafka/protocol/schemas/resources/SyncGroupRequest.json +56 -0
- kafka/protocol/schemas/resources/SyncGroupResponse.json +46 -0
- kafka/protocol/schemas/resources/TxnOffsetCommitRequest.json +68 -0
- kafka/protocol/schemas/resources/TxnOffsetCommitResponse.json +47 -0
- kafka/protocol/schemas/resources/UpdateFeaturesRequest.json +43 -0
- kafka/protocol/schemas/resources/UpdateFeaturesResponse.json +39 -0
- kafka/protocol/schemas/resources/WriteTxnMarkersRequest.json +49 -0
- kafka/protocol/schemas/resources/WriteTxnMarkersResponse.json +45 -0
- kafka/protocol/schemas/resources/__init__.py +0 -0
- kafka/record/__init__.py +3 -0
- kafka/record/_crc32c.py +161 -0
- kafka/record/abc.py +144 -0
- kafka/record/default_records.py +782 -0
- kafka/record/legacy_records.py +587 -0
- kafka/record/memory_records.py +255 -0
- kafka/record/util.py +135 -0
- kafka/serializer/__init__.py +4 -0
- kafka/serializer/abstract.py +20 -0
- kafka/serializer/default.py +16 -0
- kafka/serializer/json.py +17 -0
- kafka/serializer/wrapper.py +21 -0
- kafka/structs.py +69 -0
- kafka/util.py +159 -0
- kafka/vendor/__init__.py +0 -0
- kafka/version.py +1 -0
- kafka_python-3.0.0.dist-info/METADATA +319 -0
- kafka_python-3.0.0.dist-info/RECORD +373 -0
- kafka_python-3.0.0.dist-info/WHEEL +5 -0
- kafka_python-3.0.0.dist-info/entry_points.txt +2 -0
- kafka_python-3.0.0.dist-info/licenses/LICENSE +202 -0
- kafka_python-3.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from .common import add_acl_filter_args, acl_filter_from_args
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class DeleteACLs:
|
|
5
|
+
COMMAND = 'delete'
|
|
6
|
+
HELP = 'Delete Kafka ACLs'
|
|
7
|
+
|
|
8
|
+
@classmethod
|
|
9
|
+
def add_arguments(cls, parser):
|
|
10
|
+
add_acl_filter_args(parser)
|
|
11
|
+
|
|
12
|
+
@classmethod
|
|
13
|
+
def command(cls, client, args):
|
|
14
|
+
acl_filter = acl_filter_from_args(args)
|
|
15
|
+
results = client.delete_acls([acl_filter])
|
|
16
|
+
output = []
|
|
17
|
+
for acl_filter, matching_acls, error in results:
|
|
18
|
+
output.append({
|
|
19
|
+
'filter': repr(acl_filter),
|
|
20
|
+
'deleted': [repr(acl) for acl in matching_acls],
|
|
21
|
+
'error': str(error),
|
|
22
|
+
})
|
|
23
|
+
return output
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from .common import add_acl_filter_args, acl_filter_from_args
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class DescribeACLs:
|
|
5
|
+
COMMAND = 'describe'
|
|
6
|
+
HELP = 'Describe Kafka ACLs'
|
|
7
|
+
|
|
8
|
+
@classmethod
|
|
9
|
+
def add_arguments(cls, parser):
|
|
10
|
+
add_acl_filter_args(parser)
|
|
11
|
+
|
|
12
|
+
@classmethod
|
|
13
|
+
def command(cls, client, args):
|
|
14
|
+
acl_filter = acl_filter_from_args(args)
|
|
15
|
+
acls, error = client.describe_acls(acl_filter)
|
|
16
|
+
return [repr(acl) for acl in acls]
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from .describe import DescribeCluster
|
|
2
|
+
from .describe_quorum import DescribeQuorum
|
|
3
|
+
from .features import DescribeFeatures, UpdateFeatures
|
|
4
|
+
from .log_dirs import DescribeLogDirs, AlterLogDirs
|
|
5
|
+
from .versions import GetApiVersions, GetBrokerVersion
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ClusterCommandGroup:
|
|
9
|
+
GROUP = 'cluster'
|
|
10
|
+
HELP = 'Manage Kafka Cluster'
|
|
11
|
+
COMMANDS = [DescribeCluster, DescribeQuorum,
|
|
12
|
+
GetApiVersions, GetBrokerVersion,
|
|
13
|
+
DescribeFeatures, UpdateFeatures,
|
|
14
|
+
DescribeLogDirs, AlterLogDirs]
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
from kafka.admin import UpdateFeatureType
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class DescribeFeatures:
|
|
5
|
+
COMMAND = 'describe-features'
|
|
6
|
+
HELP = 'Describe Features of Kafka Cluster'
|
|
7
|
+
|
|
8
|
+
@classmethod
|
|
9
|
+
def add_arguments(cls, parser):
|
|
10
|
+
parser.add_argument('-f', '--feature', type=str, action='append', dest='features', default=[],
|
|
11
|
+
help='Show one or more specific features. If not provided, returns all features.')
|
|
12
|
+
|
|
13
|
+
@classmethod
|
|
14
|
+
def command(cls, client, args):
|
|
15
|
+
result = client.describe_features()
|
|
16
|
+
if args.features:
|
|
17
|
+
return {k: v for k, v in result.items() if k in args.features}
|
|
18
|
+
else:
|
|
19
|
+
return result
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class UpdateFeatures:
|
|
23
|
+
COMMAND = 'update-features'
|
|
24
|
+
HELP = 'Update Features of Kafka Cluster'
|
|
25
|
+
|
|
26
|
+
@classmethod
|
|
27
|
+
def add_arguments(cls, parser):
|
|
28
|
+
parser.add_argument('-f', '--feature', type=str, action='append', dest='features', default=[], help='set feature=value')
|
|
29
|
+
parser.add_argument('--downgrade', action='store_true')
|
|
30
|
+
parser.add_argument('--unsafe', action='store_true')
|
|
31
|
+
parser.add_argument('--timeout', type=int, default=60)
|
|
32
|
+
parser.add_argument('--validate-only', action='store_true')
|
|
33
|
+
|
|
34
|
+
@staticmethod
|
|
35
|
+
def _feature_type(args):
|
|
36
|
+
if not args.downgrade:
|
|
37
|
+
return UpdateFeatureType.UPGRADE
|
|
38
|
+
elif args.unsafe:
|
|
39
|
+
return UpdateFeatureType.UNSAFE_DOWNGRADE
|
|
40
|
+
else:
|
|
41
|
+
return UpdateFeatureType.SAFE_DOWNGRADE
|
|
42
|
+
|
|
43
|
+
@classmethod
|
|
44
|
+
def command(cls, client, args):
|
|
45
|
+
feature_type = cls._feature_type(args)
|
|
46
|
+
feature_updates = {
|
|
47
|
+
feature_name: (feature_type, version)
|
|
48
|
+
for feature_name, version in [feature.split('=') for feature in args.features]
|
|
49
|
+
}
|
|
50
|
+
return client.update_features(feature_updates,
|
|
51
|
+
validate_only=args.validate_only,
|
|
52
|
+
timeout_ms=1000*args.timeout)
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from kafka.structs import TopicPartitionReplica
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class DescribeLogDirs:
|
|
5
|
+
COMMAND = 'describe-log-dirs'
|
|
6
|
+
HELP = 'Get topic log directories and stats'
|
|
7
|
+
|
|
8
|
+
@classmethod
|
|
9
|
+
def add_arguments(cls, parser):
|
|
10
|
+
parser.add_argument('--broker', type=int, action='append', dest='brokers', help='Query specific broker(s)')
|
|
11
|
+
parser.add_argument('--topic', type=str, action='append', dest='topics', help='Get data about specific topic(s)')
|
|
12
|
+
|
|
13
|
+
@classmethod
|
|
14
|
+
def command(cls, client, args):
|
|
15
|
+
return client.describe_log_dirs(topic_partitions=args.topics, brokers=args.brokers)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class AlterLogDirs:
|
|
19
|
+
COMMAND = 'alter-log-dirs'
|
|
20
|
+
HELP = 'Move replicas between log directories on their hosting brokers'
|
|
21
|
+
|
|
22
|
+
@classmethod
|
|
23
|
+
def add_arguments(cls, parser):
|
|
24
|
+
parser.add_argument(
|
|
25
|
+
'-a', '--assignment', type=str, action='append',
|
|
26
|
+
dest='assignments', default=[], required=True,
|
|
27
|
+
help='TOPIC:PARTITION:BROKER_ID=/absolute/log/dir/path (repeatable). '
|
|
28
|
+
'Instructs BROKER_ID to move its replica of TOPIC:PARTITION '
|
|
29
|
+
'into the given log directory.')
|
|
30
|
+
|
|
31
|
+
@classmethod
|
|
32
|
+
def command(cls, client, args):
|
|
33
|
+
assignments = {}
|
|
34
|
+
for spec in args.assignments:
|
|
35
|
+
tpr_str, log_dir = spec.rsplit('=', 1)
|
|
36
|
+
topic, partition, broker_id = tpr_str.rsplit(':', 2)
|
|
37
|
+
tpr = TopicPartitionReplica(topic, int(partition), int(broker_id))
|
|
38
|
+
assignments[tpr] = log_dir
|
|
39
|
+
result = client.alter_replica_log_dirs(assignments)
|
|
40
|
+
return {
|
|
41
|
+
f'{tpr.topic}:{tpr.partition}:{tpr.broker_id}': err.__name__
|
|
42
|
+
for tpr, err in result.items()
|
|
43
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from kafka.protocol.api_key import ApiKey
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class GetApiVersions:
|
|
5
|
+
COMMAND = 'api-versions'
|
|
6
|
+
HELP = 'Get Supported Api Versions'
|
|
7
|
+
|
|
8
|
+
@classmethod
|
|
9
|
+
def add_arguments(cls, parser):
|
|
10
|
+
parser.add_argument('-k', '--api-key', type=str, action='append', dest='api_keys', default=None)
|
|
11
|
+
parser.add_argument('--raw', action='store_true')
|
|
12
|
+
|
|
13
|
+
@classmethod
|
|
14
|
+
def command(cls, client, args):
|
|
15
|
+
api_keys = set(ApiKey[k] for k in args.api_keys) if args.api_keys else set(ApiKey)
|
|
16
|
+
api_versions = client.api_versions()
|
|
17
|
+
return {(k.value if args.raw else k.name): v for k, v in api_versions.items()
|
|
18
|
+
if k in api_keys}
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class GetBrokerVersion:
|
|
22
|
+
COMMAND = 'broker-version'
|
|
23
|
+
HELP = 'Get Version for Broker'
|
|
24
|
+
|
|
25
|
+
@classmethod
|
|
26
|
+
def add_arguments(cls, parser):
|
|
27
|
+
parser.add_argument('--broker', required=True)
|
|
28
|
+
|
|
29
|
+
@classmethod
|
|
30
|
+
def command(cls, client, args):
|
|
31
|
+
broker_id = int(args.broker)
|
|
32
|
+
bvd = client.get_broker_version_data(broker_id)
|
|
33
|
+
return {broker_id: '.'.join(map(str, bvd.broker_version))}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
from .alter import AlterConfigs
|
|
2
|
+
from .describe import DescribeConfigs
|
|
3
|
+
from .list import ListConfigResources
|
|
4
|
+
from .reset import ResetConfigs
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class ConfigsCommandGroup:
|
|
8
|
+
GROUP = 'configs'
|
|
9
|
+
HELP = 'Manage Kafka Configuration'
|
|
10
|
+
COMMANDS = [DescribeConfigs, AlterConfigs, ListConfigResources, ResetConfigs]
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import re
|
|
2
|
+
|
|
3
|
+
from kafka.admin import AlterConfigOp
|
|
4
|
+
from .common import add_resource_arguments, parse_resources
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class AlterConfigs:
|
|
8
|
+
COMMAND = 'alter'
|
|
9
|
+
HELP = 'Alter Kafka Configs'
|
|
10
|
+
|
|
11
|
+
@classmethod
|
|
12
|
+
def add_arguments(cls, parser):
|
|
13
|
+
add_resource_arguments(parser)
|
|
14
|
+
parser.add_argument('-c', '--config', type=str, action='append', dest='configs', required=True, help='key=value to alter')
|
|
15
|
+
parser.add_argument('-v', '--validate-only', action='store_true', default=False)
|
|
16
|
+
parser.add_argument('--allow-unknown', action='store_false', dest='raise_on_unknown', default=True)
|
|
17
|
+
incremental = parser.add_mutually_exclusive_group()
|
|
18
|
+
incremental.add_argument('--force-incremental', action='store_true', dest='incremental', default=None)
|
|
19
|
+
incremental.add_argument('--force-alter', action='store_false', dest='incremental', default=None)
|
|
20
|
+
|
|
21
|
+
@classmethod
|
|
22
|
+
def command(cls, client, args):
|
|
23
|
+
try:
|
|
24
|
+
configs = dict(config.split('=') for config in args.configs)
|
|
25
|
+
regex = r'^(set|del|add|sub)\((.*)\)$'
|
|
26
|
+
ops = {
|
|
27
|
+
'set': AlterConfigOp.SET,
|
|
28
|
+
'del': AlterConfigOp.DELETE,
|
|
29
|
+
'add': AlterConfigOp.APPEND,
|
|
30
|
+
'sub': AlterConfigOp.SUBTRACT,
|
|
31
|
+
}
|
|
32
|
+
for key in configs:
|
|
33
|
+
match = re.match(regex, configs[key])
|
|
34
|
+
if match:
|
|
35
|
+
op_str, val = match.groups()
|
|
36
|
+
configs[key] = (ops[op_str], val)
|
|
37
|
+
except ValueError:
|
|
38
|
+
raise ValueError(f'Unable to parse configs! {args.configs}')
|
|
39
|
+
resources = parse_resources(args, configs=configs)
|
|
40
|
+
return client.alter_configs(resources,
|
|
41
|
+
validate_only=args.validate_only,
|
|
42
|
+
raise_on_unknown=args.raise_on_unknown,
|
|
43
|
+
incremental=args.incremental)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from kafka.admin import ConfigResource
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def add_resource_arguments(parser):
|
|
5
|
+
"""Add arguments for specifying ConfigResource"""
|
|
6
|
+
parser.add_argument(
|
|
7
|
+
'-r', '--resource-type', type=str, required=True,
|
|
8
|
+
help='Type of resource to describe: topic, broker, broker_logger, '
|
|
9
|
+
'client_metrics, group.')
|
|
10
|
+
parser.add_argument(
|
|
11
|
+
'-n', '--resource-name', type=str, action='append', dest='resource_names', required=True,
|
|
12
|
+
help='Name of resource(s) to describe. May be repeated.')
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def parse_resources(args, configs=None):
|
|
16
|
+
return [ConfigResource(args.resource_type.upper().replace('-', '_'), resource_name, configs)
|
|
17
|
+
for resource_name in args.resource_names]
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from .common import add_resource_arguments, parse_resources
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class DescribeConfigs:
|
|
5
|
+
COMMAND = 'describe'
|
|
6
|
+
HELP = 'Describe Kafka Configs'
|
|
7
|
+
|
|
8
|
+
@classmethod
|
|
9
|
+
def add_arguments(cls, parser):
|
|
10
|
+
add_resource_arguments(parser)
|
|
11
|
+
parser.add_argument('-c', '--config', type=str, action='append', dest='configs', default=None)
|
|
12
|
+
parser.add_argument('--dynamic', action='store_true', default=False)
|
|
13
|
+
parser.add_argument('--modified', action='store_true', default=False)
|
|
14
|
+
parser.add_argument('--static', action='store_true', default=False)
|
|
15
|
+
parser.add_argument('--default', action='store_true', default=False)
|
|
16
|
+
|
|
17
|
+
@classmethod
|
|
18
|
+
def command(cls, client, args):
|
|
19
|
+
resources = parse_resources(args, configs=args.configs)
|
|
20
|
+
if args.modified:
|
|
21
|
+
config_filter = 'modified'
|
|
22
|
+
elif args.dynamic:
|
|
23
|
+
config_filter = 'dynamic'
|
|
24
|
+
elif args.static:
|
|
25
|
+
config_filter = 'static'
|
|
26
|
+
elif args.default:
|
|
27
|
+
config_filter = 'default'
|
|
28
|
+
else:
|
|
29
|
+
config_filter = 'all'
|
|
30
|
+
return client.describe_configs(resources, config_filter=config_filter)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
class ListConfigResources:
|
|
2
|
+
COMMAND = 'list'
|
|
3
|
+
HELP = 'List config resources known to the cluster (requires broker >= 4.1 for non client_metrics types)'
|
|
4
|
+
|
|
5
|
+
@classmethod
|
|
6
|
+
def add_arguments(cls, parser):
|
|
7
|
+
parser.add_argument(
|
|
8
|
+
'-r', '--resource-type', type=str, action='append', dest='resource_types', default=[],
|
|
9
|
+
help='Filter by resource type (repeatable): topic, broker, '
|
|
10
|
+
'broker_logger, client_metrics, group. Omit to list all '
|
|
11
|
+
'supported types.')
|
|
12
|
+
|
|
13
|
+
@classmethod
|
|
14
|
+
def command(cls, client, args):
|
|
15
|
+
return client.list_config_resources(
|
|
16
|
+
resource_types=args.resource_types or None)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from .common import add_resource_arguments, parse_resources
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class ResetConfigs:
|
|
5
|
+
COMMAND = 'reset'
|
|
6
|
+
HELP = 'Reset Kafka Configs'
|
|
7
|
+
|
|
8
|
+
@classmethod
|
|
9
|
+
def add_arguments(cls, parser):
|
|
10
|
+
add_resource_arguments(parser)
|
|
11
|
+
parser.add_argument('-c', '--config', type=str, action='append', dest='configs', default=[], help='key to reset')
|
|
12
|
+
parser.add_argument('-v', '--validate-only', action='store_true', default=False)
|
|
13
|
+
parser.add_argument('--allow-unknown', action='store_false', dest='raise_on_unknown', default=True)
|
|
14
|
+
|
|
15
|
+
@classmethod
|
|
16
|
+
def command(cls, client, args):
|
|
17
|
+
resources = parse_resources(args, configs=args.configs)
|
|
18
|
+
return client.reset_configs(resources,
|
|
19
|
+
validate_only=args.validate_only,
|
|
20
|
+
raise_on_unknown=args.raise_on_unknown)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from .alter_offsets import AlterGroupOffsets
|
|
2
|
+
from .delete import DeleteGroups
|
|
3
|
+
from .delete_offsets import DeleteGroupOffsets
|
|
4
|
+
from .describe import DescribeGroups
|
|
5
|
+
from .list import ListGroups
|
|
6
|
+
from .list_offsets import ListGroupOffsets
|
|
7
|
+
from .remove_members import RemoveGroupMembers
|
|
8
|
+
from .reset_offsets import ResetGroupOffsets
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class GroupsCommandGroup:
|
|
12
|
+
GROUP = 'groups'
|
|
13
|
+
HELP = 'Manage Kafka Groups'
|
|
14
|
+
COMMANDS = [ListGroups, DescribeGroups, DeleteGroups,
|
|
15
|
+
ListGroupOffsets, AlterGroupOffsets, ResetGroupOffsets, DeleteGroupOffsets,
|
|
16
|
+
RemoveGroupMembers]
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from kafka.structs import OffsetAndMetadata, TopicPartition
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class AlterGroupOffsets:
|
|
5
|
+
COMMAND = 'alter-offsets'
|
|
6
|
+
HELP = 'Alter committed offsets for a consumer group'
|
|
7
|
+
|
|
8
|
+
@classmethod
|
|
9
|
+
def add_arguments(cls, parser):
|
|
10
|
+
parser.add_argument('-g', '--group-id', type=str, required=True)
|
|
11
|
+
parser.add_argument(
|
|
12
|
+
'-o', '--offset', type=str, action='append',
|
|
13
|
+
dest='offsets', default=[], required=True,
|
|
14
|
+
help='TOPIC:PARTITION:OFFSET triple (repeatable).')
|
|
15
|
+
parser.add_argument(
|
|
16
|
+
'--group-coordinator-id', type=int, default=None,
|
|
17
|
+
help='Send directly to this broker id, skipping coordinator lookup')
|
|
18
|
+
|
|
19
|
+
@classmethod
|
|
20
|
+
def command(cls, client, args):
|
|
21
|
+
offsets = {}
|
|
22
|
+
for spec in args.offsets:
|
|
23
|
+
topic, partition, offset = spec.rsplit(':', 2)
|
|
24
|
+
offsets[TopicPartition(topic, int(partition))] = \
|
|
25
|
+
OffsetAndMetadata(int(offset), '', None)
|
|
26
|
+
result = client.alter_group_offsets(
|
|
27
|
+
args.group_id, offsets,
|
|
28
|
+
group_coordinator_id=args.group_coordinator_id)
|
|
29
|
+
return {'%s:%d' % (tp.topic, tp.partition): err.__name__
|
|
30
|
+
for tp, err in result.items()}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
class DeleteGroups:
|
|
2
|
+
COMMAND = 'delete'
|
|
3
|
+
HELP = 'Delete Groups'
|
|
4
|
+
|
|
5
|
+
@classmethod
|
|
6
|
+
def add_arguments(cls, parser):
|
|
7
|
+
parser.add_argument('-g', '--group-id', type=str, action='append', dest='groups', required=True)
|
|
8
|
+
|
|
9
|
+
@classmethod
|
|
10
|
+
def command(cls, client, args):
|
|
11
|
+
return client.delete_groups(args.groups)
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
from kafka.structs import TopicPartition
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class DeleteGroupOffsets:
|
|
5
|
+
COMMAND = 'delete-offsets'
|
|
6
|
+
HELP = 'Delete committed offsets for a consumer group'
|
|
7
|
+
|
|
8
|
+
@classmethod
|
|
9
|
+
def add_arguments(cls, parser):
|
|
10
|
+
parser.add_argument('-g', '--group-id', type=str, required=True)
|
|
11
|
+
parser.add_argument(
|
|
12
|
+
'-p', '--partition', type=str, action='append',
|
|
13
|
+
dest='partitions', default=[], required=True,
|
|
14
|
+
help='TOPIC:PARTITION pair (repeatable).')
|
|
15
|
+
parser.add_argument(
|
|
16
|
+
'--group-coordinator-id', type=int, default=None,
|
|
17
|
+
help='Send directly to this broker id, skipping coordinator lookup')
|
|
18
|
+
|
|
19
|
+
@classmethod
|
|
20
|
+
def command(cls, client, args):
|
|
21
|
+
partitions = []
|
|
22
|
+
for spec in args.partitions:
|
|
23
|
+
topic, partition = spec.rsplit(':', 1)
|
|
24
|
+
partitions.append(TopicPartition(topic, int(partition)))
|
|
25
|
+
result = client.delete_group_offsets(
|
|
26
|
+
args.group_id, partitions,
|
|
27
|
+
group_coordinator_id=args.group_coordinator_id)
|
|
28
|
+
return {'%s:%d' % (tp.topic, tp.partition): err.__name__
|
|
29
|
+
for tp, err in result.items()}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
class DescribeGroups:
|
|
2
|
+
COMMAND = 'describe'
|
|
3
|
+
HELP = 'Describe Groups'
|
|
4
|
+
|
|
5
|
+
@classmethod
|
|
6
|
+
def add_arguments(cls, parser):
|
|
7
|
+
parser.add_argument('-g', '--group-id', type=str, action='append', dest='groups', required=True)
|
|
8
|
+
|
|
9
|
+
@classmethod
|
|
10
|
+
def command(cls, client, args):
|
|
11
|
+
return client.describe_groups(args.groups)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from kafka.admin import GroupState, GroupType
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class ListGroups:
|
|
5
|
+
COMMAND = 'list'
|
|
6
|
+
HELP = 'List Groups'
|
|
7
|
+
|
|
8
|
+
@classmethod
|
|
9
|
+
def add_arguments(cls, parser):
|
|
10
|
+
state_choices = sorted(s.value for s in GroupState)
|
|
11
|
+
type_choices = sorted(t.value for t in GroupType)
|
|
12
|
+
parser.add_argument(
|
|
13
|
+
'--state', type=str, action='append', dest='states_filter', default=[],
|
|
14
|
+
help='Filter by group state (repeatable). One of: '
|
|
15
|
+
+ ', '.join(state_choices)
|
|
16
|
+
+ '. Case-insensitive; names also accepted. '
|
|
17
|
+
'Requires broker >= 3.0 (KIP-518).')
|
|
18
|
+
parser.add_argument(
|
|
19
|
+
'--type', type=str, action='append', dest='types_filter', default=[],
|
|
20
|
+
help='Filter by group type (repeatable). One of: '
|
|
21
|
+
+ ', '.join(type_choices)
|
|
22
|
+
+ '. Requires broker >= 4.0 (KIP-848).')
|
|
23
|
+
|
|
24
|
+
@classmethod
|
|
25
|
+
def command(cls, client, args):
|
|
26
|
+
return client.list_groups(
|
|
27
|
+
states_filter=args.states_filter or None,
|
|
28
|
+
types_filter=args.types_filter or None)
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
from collections import defaultdict
|
|
2
|
+
|
|
3
|
+
from kafka.structs import TopicPartition
|
|
4
|
+
from kafka.admin import OffsetSpec
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class ListGroupOffsets:
|
|
8
|
+
COMMAND = 'list-offsets'
|
|
9
|
+
HELP = 'List Offsets for Group'
|
|
10
|
+
|
|
11
|
+
@classmethod
|
|
12
|
+
def add_arguments(cls, parser):
|
|
13
|
+
parser.add_argument('-g', '--group-id', type=str, required=True)
|
|
14
|
+
|
|
15
|
+
@classmethod
|
|
16
|
+
def command(cls, client, args):
|
|
17
|
+
offsets = client.list_group_offsets(args.group_id)[args.group_id]
|
|
18
|
+
latest = client.list_partition_offsets({tp: OffsetSpec.LATEST for tp in offsets})
|
|
19
|
+
results = defaultdict(dict)
|
|
20
|
+
for tp in latest:
|
|
21
|
+
committed = offsets[tp]
|
|
22
|
+
results[tp.topic][tp.partition] = {
|
|
23
|
+
'offset': committed.offset,
|
|
24
|
+
'leader_epoch': committed.leader_epoch,
|
|
25
|
+
'metadata': committed.metadata,
|
|
26
|
+
'latest_offset': latest[tp].offset,
|
|
27
|
+
'lag': latest[tp].offset - committed.offset,
|
|
28
|
+
}
|
|
29
|
+
return dict(results)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from kafka.admin import MemberToRemove
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class RemoveGroupMembers:
|
|
5
|
+
COMMAND = 'remove-members'
|
|
6
|
+
HELP = 'Remove members from a consumer group'
|
|
7
|
+
|
|
8
|
+
@classmethod
|
|
9
|
+
def add_arguments(cls, parser):
|
|
10
|
+
parser.add_argument('-g', '--group-id', type=str, required=True)
|
|
11
|
+
parser.add_argument(
|
|
12
|
+
'-m', '--member-id', type=str, action='append',
|
|
13
|
+
dest='member_ids', default=[],
|
|
14
|
+
help='Dynamic member id to remove (repeatable).')
|
|
15
|
+
parser.add_argument(
|
|
16
|
+
'-i', '--group-instance-id', type=str, action='append',
|
|
17
|
+
dest='group_instance_ids', default=[],
|
|
18
|
+
help='Static group.instance.id to remove (repeatable; '
|
|
19
|
+
'requires broker LeaveGroup v3+).')
|
|
20
|
+
parser.add_argument(
|
|
21
|
+
'--reason', type=str, default=None,
|
|
22
|
+
help='Optional reason; sent to broker on LeaveGroup v5+ '
|
|
23
|
+
'(KIP-800). Applied to all members.')
|
|
24
|
+
parser.add_argument(
|
|
25
|
+
'--group-coordinator-id', type=int, default=None,
|
|
26
|
+
help='Send directly to this broker id, skipping coordinator lookup')
|
|
27
|
+
|
|
28
|
+
@classmethod
|
|
29
|
+
def command(cls, client, args):
|
|
30
|
+
members = [MemberToRemove(member_id=mid, reason=args.reason)
|
|
31
|
+
for mid in args.member_ids]
|
|
32
|
+
members.extend(MemberToRemove(group_instance_id=gid, reason=args.reason)
|
|
33
|
+
for gid in args.group_instance_ids)
|
|
34
|
+
if not members:
|
|
35
|
+
raise ValueError(
|
|
36
|
+
'At least one --member-id or --group-instance-id is required.')
|
|
37
|
+
result = client.remove_group_members(
|
|
38
|
+
args.group_id, members,
|
|
39
|
+
group_coordinator_id=args.group_coordinator_id)
|
|
40
|
+
return {m: err.__name__ for m, err in result.items()}
|