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.
Files changed (373) hide show
  1. kafka/__init__.py +34 -0
  2. kafka/__main__.py +5 -0
  3. kafka/admin/__init__.py +29 -0
  4. kafka/admin/__main__.py +5 -0
  5. kafka/admin/_acls.py +355 -0
  6. kafka/admin/_cluster.py +359 -0
  7. kafka/admin/_configs.py +479 -0
  8. kafka/admin/_groups.py +754 -0
  9. kafka/admin/_partitions.py +595 -0
  10. kafka/admin/_topics.py +281 -0
  11. kafka/admin/_transactions.py +450 -0
  12. kafka/admin/_users.py +194 -0
  13. kafka/admin/client.py +373 -0
  14. kafka/benchmarks/__init__.py +0 -0
  15. kafka/benchmarks/consumer_performance.py +138 -0
  16. kafka/benchmarks/load_example.py +109 -0
  17. kafka/benchmarks/producer_encode_path.py +201 -0
  18. kafka/benchmarks/producer_performance.py +161 -0
  19. kafka/benchmarks/profile_protocol.py +138 -0
  20. kafka/benchmarks/protocol_old_vs_new.py +447 -0
  21. kafka/benchmarks/record_batch_compose.py +77 -0
  22. kafka/benchmarks/record_batch_read.py +82 -0
  23. kafka/benchmarks/varint_speed.py +426 -0
  24. kafka/cli/__init__.py +36 -0
  25. kafka/cli/admin/__init__.py +117 -0
  26. kafka/cli/admin/acls/__init__.py +9 -0
  27. kafka/cli/admin/acls/common.py +76 -0
  28. kafka/cli/admin/acls/create.py +19 -0
  29. kafka/cli/admin/acls/delete.py +23 -0
  30. kafka/cli/admin/acls/describe.py +16 -0
  31. kafka/cli/admin/cluster/__init__.py +14 -0
  32. kafka/cli/admin/cluster/describe.py +11 -0
  33. kafka/cli/admin/cluster/describe_quorum.py +11 -0
  34. kafka/cli/admin/cluster/features.py +52 -0
  35. kafka/cli/admin/cluster/log_dirs.py +43 -0
  36. kafka/cli/admin/cluster/versions.py +33 -0
  37. kafka/cli/admin/configs/__init__.py +10 -0
  38. kafka/cli/admin/configs/alter.py +43 -0
  39. kafka/cli/admin/configs/common.py +17 -0
  40. kafka/cli/admin/configs/describe.py +30 -0
  41. kafka/cli/admin/configs/list.py +16 -0
  42. kafka/cli/admin/configs/reset.py +20 -0
  43. kafka/cli/admin/groups/__init__.py +16 -0
  44. kafka/cli/admin/groups/alter_offsets.py +30 -0
  45. kafka/cli/admin/groups/delete.py +11 -0
  46. kafka/cli/admin/groups/delete_offsets.py +29 -0
  47. kafka/cli/admin/groups/describe.py +11 -0
  48. kafka/cli/admin/groups/list.py +28 -0
  49. kafka/cli/admin/groups/list_offsets.py +29 -0
  50. kafka/cli/admin/groups/remove_members.py +40 -0
  51. kafka/cli/admin/groups/reset_offsets.py +139 -0
  52. kafka/cli/admin/partitions/__init__.py +21 -0
  53. kafka/cli/admin/partitions/alter_reassignments.py +37 -0
  54. kafka/cli/admin/partitions/create.py +27 -0
  55. kafka/cli/admin/partitions/delete_records.py +31 -0
  56. kafka/cli/admin/partitions/describe.py +36 -0
  57. kafka/cli/admin/partitions/elect_leaders.py +53 -0
  58. kafka/cli/admin/partitions/list_offsets.py +88 -0
  59. kafka/cli/admin/partitions/list_reassignments.py +35 -0
  60. kafka/cli/admin/topics/__init__.py +10 -0
  61. kafka/cli/admin/topics/create.py +13 -0
  62. kafka/cli/admin/topics/delete.py +19 -0
  63. kafka/cli/admin/topics/describe.py +18 -0
  64. kafka/cli/admin/topics/list.py +11 -0
  65. kafka/cli/admin/transactions/__init__.py +17 -0
  66. kafka/cli/admin/transactions/abort.py +38 -0
  67. kafka/cli/admin/transactions/describe.py +24 -0
  68. kafka/cli/admin/transactions/describe_producers.py +29 -0
  69. kafka/cli/admin/transactions/find_hanging.py +26 -0
  70. kafka/cli/admin/transactions/list.py +37 -0
  71. kafka/cli/admin/users/__init__.py +8 -0
  72. kafka/cli/admin/users/alter_user_scram_credentials.py +34 -0
  73. kafka/cli/admin/users/describe_user_scram_credentials.py +15 -0
  74. kafka/cli/common.py +95 -0
  75. kafka/cli/consumer/__init__.py +63 -0
  76. kafka/cli/producer/__init__.py +57 -0
  77. kafka/cluster.py +824 -0
  78. kafka/codec.py +325 -0
  79. kafka/consumer/__init__.py +5 -0
  80. kafka/consumer/__main__.py +5 -0
  81. kafka/consumer/fetcher.py +2012 -0
  82. kafka/consumer/group.py +1347 -0
  83. kafka/consumer/subscription_state.py +897 -0
  84. kafka/coordinator/__init__.py +0 -0
  85. kafka/coordinator/assignors/__init__.py +0 -0
  86. kafka/coordinator/assignors/abstract.py +90 -0
  87. kafka/coordinator/assignors/cooperative_sticky.py +167 -0
  88. kafka/coordinator/assignors/range.py +81 -0
  89. kafka/coordinator/assignors/roundrobin.py +101 -0
  90. kafka/coordinator/assignors/sticky/StickyAssignorUserData.json +37 -0
  91. kafka/coordinator/assignors/sticky/__init__.py +0 -0
  92. kafka/coordinator/assignors/sticky/partition_movements.py +149 -0
  93. kafka/coordinator/assignors/sticky/sorted_set.py +63 -0
  94. kafka/coordinator/assignors/sticky/sticky_assignor.py +665 -0
  95. kafka/coordinator/assignors/sticky/user_data.py +8 -0
  96. kafka/coordinator/base.py +1215 -0
  97. kafka/coordinator/consumer.py +1224 -0
  98. kafka/coordinator/heartbeat.py +82 -0
  99. kafka/coordinator/subscription.py +34 -0
  100. kafka/errors.py +1004 -0
  101. kafka/future.py +166 -0
  102. kafka/metrics/__init__.py +13 -0
  103. kafka/metrics/compound_stat.py +33 -0
  104. kafka/metrics/dict_reporter.py +81 -0
  105. kafka/metrics/kafka_metric.py +36 -0
  106. kafka/metrics/measurable.py +27 -0
  107. kafka/metrics/measurable_stat.py +13 -0
  108. kafka/metrics/metric_config.py +33 -0
  109. kafka/metrics/metric_name.py +105 -0
  110. kafka/metrics/metrics.py +261 -0
  111. kafka/metrics/metrics_reporter.py +53 -0
  112. kafka/metrics/quota.py +41 -0
  113. kafka/metrics/stat.py +19 -0
  114. kafka/metrics/stats/__init__.py +15 -0
  115. kafka/metrics/stats/avg.py +24 -0
  116. kafka/metrics/stats/count.py +17 -0
  117. kafka/metrics/stats/histogram.py +99 -0
  118. kafka/metrics/stats/max_stat.py +17 -0
  119. kafka/metrics/stats/min_stat.py +19 -0
  120. kafka/metrics/stats/percentile.py +14 -0
  121. kafka/metrics/stats/percentiles.py +75 -0
  122. kafka/metrics/stats/rate.py +118 -0
  123. kafka/metrics/stats/sampled_stat.py +99 -0
  124. kafka/metrics/stats/sensor.py +136 -0
  125. kafka/metrics/stats/total.py +15 -0
  126. kafka/net/__init__.py +19 -0
  127. kafka/net/compat.py +165 -0
  128. kafka/net/connection.py +593 -0
  129. kafka/net/http_connect.py +144 -0
  130. kafka/net/inet.py +122 -0
  131. kafka/net/manager.py +451 -0
  132. kafka/net/metrics.py +149 -0
  133. kafka/net/sasl/__init__.py +32 -0
  134. kafka/net/sasl/abc.py +28 -0
  135. kafka/net/sasl/gssapi.py +95 -0
  136. kafka/net/sasl/msk.py +245 -0
  137. kafka/net/sasl/oauth.py +98 -0
  138. kafka/net/sasl/plain.py +42 -0
  139. kafka/net/sasl/scram.py +135 -0
  140. kafka/net/sasl/sspi.py +111 -0
  141. kafka/net/selector.py +644 -0
  142. kafka/net/socks5.py +262 -0
  143. kafka/net/transport.py +415 -0
  144. kafka/net/wakeup_notifier.py +72 -0
  145. kafka/partitioner/__init__.py +8 -0
  146. kafka/partitioner/abc.py +8 -0
  147. kafka/partitioner/default.py +89 -0
  148. kafka/partitioner/sticky.py +109 -0
  149. kafka/producer/__init__.py +5 -0
  150. kafka/producer/__main__.py +5 -0
  151. kafka/producer/future.py +101 -0
  152. kafka/producer/kafka.py +1123 -0
  153. kafka/producer/producer_batch.py +192 -0
  154. kafka/producer/record_accumulator.py +647 -0
  155. kafka/producer/sender.py +884 -0
  156. kafka/producer/transaction_manager.py +1326 -0
  157. kafka/protocol/__init__.py +0 -0
  158. kafka/protocol/admin/__init__.py +29 -0
  159. kafka/protocol/admin/acl.py +83 -0
  160. kafka/protocol/admin/acl.pyi +375 -0
  161. kafka/protocol/admin/client_quotas.py +14 -0
  162. kafka/protocol/admin/client_quotas.pyi +265 -0
  163. kafka/protocol/admin/cluster.py +31 -0
  164. kafka/protocol/admin/cluster.pyi +620 -0
  165. kafka/protocol/admin/configs.py +22 -0
  166. kafka/protocol/admin/configs.pyi +437 -0
  167. kafka/protocol/admin/groups.py +24 -0
  168. kafka/protocol/admin/groups.pyi +261 -0
  169. kafka/protocol/admin/topics.py +53 -0
  170. kafka/protocol/admin/topics.pyi +982 -0
  171. kafka/protocol/admin/transactions.py +18 -0
  172. kafka/protocol/admin/transactions.pyi +311 -0
  173. kafka/protocol/admin/users.py +14 -0
  174. kafka/protocol/admin/users.pyi +223 -0
  175. kafka/protocol/api_data.py +125 -0
  176. kafka/protocol/api_header.py +55 -0
  177. kafka/protocol/api_key.py +97 -0
  178. kafka/protocol/api_message.py +277 -0
  179. kafka/protocol/broker_version_data.py +246 -0
  180. kafka/protocol/consumer/__init__.py +13 -0
  181. kafka/protocol/consumer/fetch.py +16 -0
  182. kafka/protocol/consumer/fetch.pyi +298 -0
  183. kafka/protocol/consumer/group.py +38 -0
  184. kafka/protocol/consumer/group.pyi +824 -0
  185. kafka/protocol/consumer/metadata.py +30 -0
  186. kafka/protocol/consumer/metadata.pyi +89 -0
  187. kafka/protocol/consumer/offsets.py +75 -0
  188. kafka/protocol/consumer/offsets.pyi +288 -0
  189. kafka/protocol/data_container.py +166 -0
  190. kafka/protocol/frame.py +30 -0
  191. kafka/protocol/generate_stubs.py +468 -0
  192. kafka/protocol/metadata/__init__.py +10 -0
  193. kafka/protocol/metadata/api_versions.py +41 -0
  194. kafka/protocol/metadata/api_versions.pyi +128 -0
  195. kafka/protocol/metadata/find_coordinator.py +19 -0
  196. kafka/protocol/metadata/find_coordinator.pyi +105 -0
  197. kafka/protocol/metadata/metadata.py +34 -0
  198. kafka/protocol/metadata/metadata.pyi +160 -0
  199. kafka/protocol/old/__init__.py +0 -0
  200. kafka/protocol/old/abstract.py +17 -0
  201. kafka/protocol/old/add_offsets_to_txn.py +54 -0
  202. kafka/protocol/old/add_partitions_to_txn.py +71 -0
  203. kafka/protocol/old/admin.py +1086 -0
  204. kafka/protocol/old/api.py +205 -0
  205. kafka/protocol/old/api_versions.py +133 -0
  206. kafka/protocol/old/commit.py +355 -0
  207. kafka/protocol/old/consumer_protocol.py +36 -0
  208. kafka/protocol/old/end_txn.py +53 -0
  209. kafka/protocol/old/fetch.py +408 -0
  210. kafka/protocol/old/find_coordinator.py +72 -0
  211. kafka/protocol/old/group.py +451 -0
  212. kafka/protocol/old/init_producer_id.py +42 -0
  213. kafka/protocol/old/list_offsets.py +186 -0
  214. kafka/protocol/old/metadata.py +290 -0
  215. kafka/protocol/old/offset_for_leader_epoch.py +133 -0
  216. kafka/protocol/old/produce.py +247 -0
  217. kafka/protocol/old/sasl_authenticate.py +38 -0
  218. kafka/protocol/old/sasl_handshake.py +39 -0
  219. kafka/protocol/old/struct.py +87 -0
  220. kafka/protocol/old/txn_offset_commit.py +73 -0
  221. kafka/protocol/old/types.py +440 -0
  222. kafka/protocol/parser.py +191 -0
  223. kafka/protocol/producer/__init__.py +7 -0
  224. kafka/protocol/producer/produce.py +17 -0
  225. kafka/protocol/producer/produce.pyi +197 -0
  226. kafka/protocol/producer/transaction.py +30 -0
  227. kafka/protocol/producer/transaction.pyi +663 -0
  228. kafka/protocol/sasl.py +52 -0
  229. kafka/protocol/sasl.pyi +126 -0
  230. kafka/protocol/schemas/__init__.py +7 -0
  231. kafka/protocol/schemas/fields/__init__.py +7 -0
  232. kafka/protocol/schemas/fields/array.py +127 -0
  233. kafka/protocol/schemas/fields/base.py +156 -0
  234. kafka/protocol/schemas/fields/codecs/__init__.py +12 -0
  235. kafka/protocol/schemas/fields/codecs/encode_buffer.py +82 -0
  236. kafka/protocol/schemas/fields/codecs/tagged_fields.py +109 -0
  237. kafka/protocol/schemas/fields/codecs/types.py +505 -0
  238. kafka/protocol/schemas/fields/codegen.py +40 -0
  239. kafka/protocol/schemas/fields/simple.py +127 -0
  240. kafka/protocol/schemas/fields/struct.py +357 -0
  241. kafka/protocol/schemas/fields/struct_array.py +142 -0
  242. kafka/protocol/schemas/load_json.py +42 -0
  243. kafka/protocol/schemas/resources/AddOffsetsToTxnRequest.json +40 -0
  244. kafka/protocol/schemas/resources/AddOffsetsToTxnResponse.json +35 -0
  245. kafka/protocol/schemas/resources/AddPartitionsToTxnRequest.json +65 -0
  246. kafka/protocol/schemas/resources/AddPartitionsToTxnResponse.json +60 -0
  247. kafka/protocol/schemas/resources/AlterClientQuotasRequest.json +47 -0
  248. kafka/protocol/schemas/resources/AlterClientQuotasResponse.json +41 -0
  249. kafka/protocol/schemas/resources/AlterConfigsRequest.json +43 -0
  250. kafka/protocol/schemas/resources/AlterConfigsResponse.json +39 -0
  251. kafka/protocol/schemas/resources/AlterPartitionReassignmentsRequest.json +42 -0
  252. kafka/protocol/schemas/resources/AlterPartitionReassignmentsResponse.json +47 -0
  253. kafka/protocol/schemas/resources/AlterReplicaLogDirsRequest.json +41 -0
  254. kafka/protocol/schemas/resources/AlterReplicaLogDirsResponse.json +41 -0
  255. kafka/protocol/schemas/resources/AlterUserScramCredentialsRequest.json +45 -0
  256. kafka/protocol/schemas/resources/AlterUserScramCredentialsResponse.json +35 -0
  257. kafka/protocol/schemas/resources/ApiVersionsRequest.json +34 -0
  258. kafka/protocol/schemas/resources/ApiVersionsResponse.json +79 -0
  259. kafka/protocol/schemas/resources/ConsumerProtocolAssignment.json +42 -0
  260. kafka/protocol/schemas/resources/ConsumerProtocolSubscription.json +49 -0
  261. kafka/protocol/schemas/resources/CreateAclsRequest.json +46 -0
  262. kafka/protocol/schemas/resources/CreateAclsResponse.json +37 -0
  263. kafka/protocol/schemas/resources/CreatePartitionsRequest.json +47 -0
  264. kafka/protocol/schemas/resources/CreatePartitionsResponse.json +41 -0
  265. kafka/protocol/schemas/resources/CreateTopicsRequest.json +65 -0
  266. kafka/protocol/schemas/resources/CreateTopicsResponse.json +72 -0
  267. kafka/protocol/schemas/resources/DeleteAclsRequest.json +46 -0
  268. kafka/protocol/schemas/resources/DeleteAclsResponse.json +59 -0
  269. kafka/protocol/schemas/resources/DeleteGroupsRequest.json +30 -0
  270. kafka/protocol/schemas/resources/DeleteGroupsResponse.json +36 -0
  271. kafka/protocol/schemas/resources/DeleteRecordsRequest.json +42 -0
  272. kafka/protocol/schemas/resources/DeleteRecordsResponse.json +43 -0
  273. kafka/protocol/schemas/resources/DeleteTopicsRequest.json +43 -0
  274. kafka/protocol/schemas/resources/DeleteTopicsResponse.json +52 -0
  275. kafka/protocol/schemas/resources/DescribeAclsRequest.json +43 -0
  276. kafka/protocol/schemas/resources/DescribeAclsResponse.json +55 -0
  277. kafka/protocol/schemas/resources/DescribeClientQuotasRequest.json +37 -0
  278. kafka/protocol/schemas/resources/DescribeClientQuotasResponse.json +47 -0
  279. kafka/protocol/schemas/resources/DescribeClusterRequest.json +35 -0
  280. kafka/protocol/schemas/resources/DescribeClusterResponse.json +56 -0
  281. kafka/protocol/schemas/resources/DescribeConfigsRequest.json +42 -0
  282. kafka/protocol/schemas/resources/DescribeConfigsResponse.json +69 -0
  283. kafka/protocol/schemas/resources/DescribeGroupsRequest.json +38 -0
  284. kafka/protocol/schemas/resources/DescribeGroupsResponse.json +74 -0
  285. kafka/protocol/schemas/resources/DescribeLogDirsRequest.json +38 -0
  286. kafka/protocol/schemas/resources/DescribeLogDirsResponse.json +65 -0
  287. kafka/protocol/schemas/resources/DescribeProducersRequest.json +32 -0
  288. kafka/protocol/schemas/resources/DescribeProducersResponse.json +55 -0
  289. kafka/protocol/schemas/resources/DescribeQuorumRequest.json +39 -0
  290. kafka/protocol/schemas/resources/DescribeQuorumResponse.json +82 -0
  291. kafka/protocol/schemas/resources/DescribeTopicPartitionsRequest.json +40 -0
  292. kafka/protocol/schemas/resources/DescribeTopicPartitionsResponse.json +66 -0
  293. kafka/protocol/schemas/resources/DescribeTransactionsRequest.json +27 -0
  294. kafka/protocol/schemas/resources/DescribeTransactionsResponse.json +52 -0
  295. kafka/protocol/schemas/resources/DescribeUserScramCredentialsRequest.json +30 -0
  296. kafka/protocol/schemas/resources/DescribeUserScramCredentialsResponse.json +45 -0
  297. kafka/protocol/schemas/resources/ElectLeadersRequest.json +41 -0
  298. kafka/protocol/schemas/resources/ElectLeadersResponse.json +45 -0
  299. kafka/protocol/schemas/resources/EndTxnRequest.json +43 -0
  300. kafka/protocol/schemas/resources/EndTxnResponse.json +41 -0
  301. kafka/protocol/schemas/resources/FetchRequest.json +125 -0
  302. kafka/protocol/schemas/resources/FetchResponse.json +124 -0
  303. kafka/protocol/schemas/resources/FindCoordinatorRequest.json +43 -0
  304. kafka/protocol/schemas/resources/FindCoordinatorResponse.json +58 -0
  305. kafka/protocol/schemas/resources/HeartbeatRequest.json +39 -0
  306. kafka/protocol/schemas/resources/HeartbeatResponse.json +35 -0
  307. kafka/protocol/schemas/resources/IncrementalAlterConfigsRequest.json +44 -0
  308. kafka/protocol/schemas/resources/IncrementalAlterConfigsResponse.json +38 -0
  309. kafka/protocol/schemas/resources/InitProducerIdRequest.json +50 -0
  310. kafka/protocol/schemas/resources/InitProducerIdResponse.json +47 -0
  311. kafka/protocol/schemas/resources/JoinGroupRequest.json +63 -0
  312. kafka/protocol/schemas/resources/JoinGroupResponse.json +69 -0
  313. kafka/protocol/schemas/resources/LeaveGroupRequest.json +47 -0
  314. kafka/protocol/schemas/resources/LeaveGroupResponse.json +47 -0
  315. kafka/protocol/schemas/resources/ListConfigResourcesRequest.json +31 -0
  316. kafka/protocol/schemas/resources/ListConfigResourcesResponse.json +37 -0
  317. kafka/protocol/schemas/resources/ListGroupsRequest.json +36 -0
  318. kafka/protocol/schemas/resources/ListGroupsResponse.json +49 -0
  319. kafka/protocol/schemas/resources/ListOffsetsRequest.json +72 -0
  320. kafka/protocol/schemas/resources/ListOffsetsResponse.json +71 -0
  321. kafka/protocol/schemas/resources/ListPartitionReassignmentsRequest.json +34 -0
  322. kafka/protocol/schemas/resources/ListPartitionReassignmentsResponse.json +46 -0
  323. kafka/protocol/schemas/resources/ListTransactionsRequest.json +40 -0
  324. kafka/protocol/schemas/resources/ListTransactionsResponse.json +42 -0
  325. kafka/protocol/schemas/resources/MetadataRequest.json +56 -0
  326. kafka/protocol/schemas/resources/MetadataResponse.json +101 -0
  327. kafka/protocol/schemas/resources/OffsetCommitRequest.json +76 -0
  328. kafka/protocol/schemas/resources/OffsetCommitResponse.json +71 -0
  329. kafka/protocol/schemas/resources/OffsetDeleteRequest.json +39 -0
  330. kafka/protocol/schemas/resources/OffsetDeleteResponse.json +42 -0
  331. kafka/protocol/schemas/resources/OffsetFetchRequest.json +76 -0
  332. kafka/protocol/schemas/resources/OffsetFetchResponse.json +107 -0
  333. kafka/protocol/schemas/resources/OffsetForLeaderEpochRequest.json +52 -0
  334. kafka/protocol/schemas/resources/OffsetForLeaderEpochResponse.json +51 -0
  335. kafka/protocol/schemas/resources/ProduceRequest.json +73 -0
  336. kafka/protocol/schemas/resources/ProduceResponse.json +96 -0
  337. kafka/protocol/schemas/resources/RequestHeader.json +44 -0
  338. kafka/protocol/schemas/resources/ResponseHeader.json +26 -0
  339. kafka/protocol/schemas/resources/SaslAuthenticateRequest.json +29 -0
  340. kafka/protocol/schemas/resources/SaslAuthenticateResponse.json +34 -0
  341. kafka/protocol/schemas/resources/SaslHandshakeRequest.json +31 -0
  342. kafka/protocol/schemas/resources/SaslHandshakeResponse.json +32 -0
  343. kafka/protocol/schemas/resources/SyncGroupRequest.json +56 -0
  344. kafka/protocol/schemas/resources/SyncGroupResponse.json +46 -0
  345. kafka/protocol/schemas/resources/TxnOffsetCommitRequest.json +68 -0
  346. kafka/protocol/schemas/resources/TxnOffsetCommitResponse.json +47 -0
  347. kafka/protocol/schemas/resources/UpdateFeaturesRequest.json +43 -0
  348. kafka/protocol/schemas/resources/UpdateFeaturesResponse.json +39 -0
  349. kafka/protocol/schemas/resources/WriteTxnMarkersRequest.json +49 -0
  350. kafka/protocol/schemas/resources/WriteTxnMarkersResponse.json +45 -0
  351. kafka/protocol/schemas/resources/__init__.py +0 -0
  352. kafka/record/__init__.py +3 -0
  353. kafka/record/_crc32c.py +161 -0
  354. kafka/record/abc.py +144 -0
  355. kafka/record/default_records.py +782 -0
  356. kafka/record/legacy_records.py +587 -0
  357. kafka/record/memory_records.py +255 -0
  358. kafka/record/util.py +135 -0
  359. kafka/serializer/__init__.py +4 -0
  360. kafka/serializer/abstract.py +20 -0
  361. kafka/serializer/default.py +16 -0
  362. kafka/serializer/json.py +17 -0
  363. kafka/serializer/wrapper.py +21 -0
  364. kafka/structs.py +69 -0
  365. kafka/util.py +159 -0
  366. kafka/vendor/__init__.py +0 -0
  367. kafka/version.py +1 -0
  368. kafka_python-3.0.0.dist-info/METADATA +319 -0
  369. kafka_python-3.0.0.dist-info/RECORD +373 -0
  370. kafka_python-3.0.0.dist-info/WHEEL +5 -0
  371. kafka_python-3.0.0.dist-info/entry_points.txt +2 -0
  372. kafka_python-3.0.0.dist-info/licenses/LICENSE +202 -0
  373. 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,11 @@
1
+ class DescribeCluster:
2
+ COMMAND = 'describe'
3
+ HELP = 'Describe Kafka Cluster'
4
+
5
+ @classmethod
6
+ def add_arguments(cls, parser):
7
+ pass
8
+
9
+ @classmethod
10
+ def command(cls, client, args):
11
+ return client.describe_cluster()
@@ -0,0 +1,11 @@
1
+ class DescribeQuorum:
2
+ COMMAND = 'describe-quorum'
3
+ HELP = 'Describe the KRaft metadata quorum'
4
+
5
+ @classmethod
6
+ def add_arguments(cls, parser):
7
+ pass
8
+
9
+ @classmethod
10
+ def command(cls, client, args):
11
+ return client.describe_metadata_quorum()
@@ -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()}