pulumi-kafka 3.10.3a1753328471__py3-none-any.whl → 3.11.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.

Potentially problematic release.


This version of pulumi-kafka might be problematic. Click here for more details.

@@ -1,5 +1,5 @@
1
1
  {
2
2
  "resource": true,
3
3
  "name": "kafka",
4
- "version": "3.10.3-alpha.1753328471"
4
+ "version": "3.11.0"
5
5
  }
pulumi_kafka/quota.py CHANGED
@@ -2,8 +2,7 @@
2
2
  # *** WARNING: this file was generated by pulumi-language-python. ***
3
3
  # *** Do not edit by hand unless you're certain you know what you are doing! ***
4
4
 
5
- import builtins
6
- import copy
5
+ import builtins as _builtins
7
6
  import warnings
8
7
  import sys
9
8
  import pulumi
@@ -20,14 +19,14 @@ __all__ = ['QuotaArgs', 'Quota']
20
19
  @pulumi.input_type
21
20
  class QuotaArgs:
22
21
  def __init__(__self__, *,
23
- entity_type: pulumi.Input[builtins.str],
24
- config: Optional[pulumi.Input[Mapping[str, pulumi.Input[builtins.str]]]] = None,
25
- entity_name: Optional[pulumi.Input[builtins.str]] = None):
22
+ entity_type: pulumi.Input[_builtins.str],
23
+ config: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]] = None,
24
+ entity_name: Optional[pulumi.Input[_builtins.str]] = None):
26
25
  """
27
26
  The set of arguments for constructing a Quota resource.
28
- :param pulumi.Input[builtins.str] entity_type: The type of the entity (client-id, user, ip)
29
- :param pulumi.Input[Mapping[str, pulumi.Input[builtins.str]]] config: A map of string k/v properties.
30
- :param pulumi.Input[builtins.str] entity_name: The name of the entity (if entity_name is not provided, it will create entity-default Kafka quota)
27
+ :param pulumi.Input[_builtins.str] entity_type: The type of the entity (client-id, user, ip)
28
+ :param pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]] config: A map of string k/v properties.
29
+ :param pulumi.Input[_builtins.str] entity_name: The name of the entity (if entity_name is not provided, it will create entity-default Kafka quota)
31
30
  """
32
31
  pulumi.set(__self__, "entity_type", entity_type)
33
32
  if config is not None:
@@ -35,54 +34,54 @@ class QuotaArgs:
35
34
  if entity_name is not None:
36
35
  pulumi.set(__self__, "entity_name", entity_name)
37
36
 
38
- @property
37
+ @_builtins.property
39
38
  @pulumi.getter(name="entityType")
40
- def entity_type(self) -> pulumi.Input[builtins.str]:
39
+ def entity_type(self) -> pulumi.Input[_builtins.str]:
41
40
  """
42
41
  The type of the entity (client-id, user, ip)
43
42
  """
44
43
  return pulumi.get(self, "entity_type")
45
44
 
46
45
  @entity_type.setter
47
- def entity_type(self, value: pulumi.Input[builtins.str]):
46
+ def entity_type(self, value: pulumi.Input[_builtins.str]):
48
47
  pulumi.set(self, "entity_type", value)
49
48
 
50
- @property
49
+ @_builtins.property
51
50
  @pulumi.getter
52
- def config(self) -> Optional[pulumi.Input[Mapping[str, pulumi.Input[builtins.str]]]]:
51
+ def config(self) -> Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]]:
53
52
  """
54
53
  A map of string k/v properties.
55
54
  """
56
55
  return pulumi.get(self, "config")
57
56
 
58
57
  @config.setter
59
- def config(self, value: Optional[pulumi.Input[Mapping[str, pulumi.Input[builtins.str]]]]):
58
+ def config(self, value: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]]):
60
59
  pulumi.set(self, "config", value)
61
60
 
62
- @property
61
+ @_builtins.property
63
62
  @pulumi.getter(name="entityName")
64
- def entity_name(self) -> Optional[pulumi.Input[builtins.str]]:
63
+ def entity_name(self) -> Optional[pulumi.Input[_builtins.str]]:
65
64
  """
66
65
  The name of the entity (if entity_name is not provided, it will create entity-default Kafka quota)
67
66
  """
68
67
  return pulumi.get(self, "entity_name")
69
68
 
70
69
  @entity_name.setter
71
- def entity_name(self, value: Optional[pulumi.Input[builtins.str]]):
70
+ def entity_name(self, value: Optional[pulumi.Input[_builtins.str]]):
72
71
  pulumi.set(self, "entity_name", value)
73
72
 
74
73
 
75
74
  @pulumi.input_type
76
75
  class _QuotaState:
77
76
  def __init__(__self__, *,
78
- config: Optional[pulumi.Input[Mapping[str, pulumi.Input[builtins.str]]]] = None,
79
- entity_name: Optional[pulumi.Input[builtins.str]] = None,
80
- entity_type: Optional[pulumi.Input[builtins.str]] = None):
77
+ config: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]] = None,
78
+ entity_name: Optional[pulumi.Input[_builtins.str]] = None,
79
+ entity_type: Optional[pulumi.Input[_builtins.str]] = None):
81
80
  """
82
81
  Input properties used for looking up and filtering Quota resources.
83
- :param pulumi.Input[Mapping[str, pulumi.Input[builtins.str]]] config: A map of string k/v properties.
84
- :param pulumi.Input[builtins.str] entity_name: The name of the entity (if entity_name is not provided, it will create entity-default Kafka quota)
85
- :param pulumi.Input[builtins.str] entity_type: The type of the entity (client-id, user, ip)
82
+ :param pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]] config: A map of string k/v properties.
83
+ :param pulumi.Input[_builtins.str] entity_name: The name of the entity (if entity_name is not provided, it will create entity-default Kafka quota)
84
+ :param pulumi.Input[_builtins.str] entity_type: The type of the entity (client-id, user, ip)
86
85
  """
87
86
  if config is not None:
88
87
  pulumi.set(__self__, "config", config)
@@ -91,40 +90,40 @@ class _QuotaState:
91
90
  if entity_type is not None:
92
91
  pulumi.set(__self__, "entity_type", entity_type)
93
92
 
94
- @property
93
+ @_builtins.property
95
94
  @pulumi.getter
96
- def config(self) -> Optional[pulumi.Input[Mapping[str, pulumi.Input[builtins.str]]]]:
95
+ def config(self) -> Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]]:
97
96
  """
98
97
  A map of string k/v properties.
99
98
  """
100
99
  return pulumi.get(self, "config")
101
100
 
102
101
  @config.setter
103
- def config(self, value: Optional[pulumi.Input[Mapping[str, pulumi.Input[builtins.str]]]]):
102
+ def config(self, value: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]]):
104
103
  pulumi.set(self, "config", value)
105
104
 
106
- @property
105
+ @_builtins.property
107
106
  @pulumi.getter(name="entityName")
108
- def entity_name(self) -> Optional[pulumi.Input[builtins.str]]:
107
+ def entity_name(self) -> Optional[pulumi.Input[_builtins.str]]:
109
108
  """
110
109
  The name of the entity (if entity_name is not provided, it will create entity-default Kafka quota)
111
110
  """
112
111
  return pulumi.get(self, "entity_name")
113
112
 
114
113
  @entity_name.setter
115
- def entity_name(self, value: Optional[pulumi.Input[builtins.str]]):
114
+ def entity_name(self, value: Optional[pulumi.Input[_builtins.str]]):
116
115
  pulumi.set(self, "entity_name", value)
117
116
 
118
- @property
117
+ @_builtins.property
119
118
  @pulumi.getter(name="entityType")
120
- def entity_type(self) -> Optional[pulumi.Input[builtins.str]]:
119
+ def entity_type(self) -> Optional[pulumi.Input[_builtins.str]]:
121
120
  """
122
121
  The type of the entity (client-id, user, ip)
123
122
  """
124
123
  return pulumi.get(self, "entity_type")
125
124
 
126
125
  @entity_type.setter
127
- def entity_type(self, value: Optional[pulumi.Input[builtins.str]]):
126
+ def entity_type(self, value: Optional[pulumi.Input[_builtins.str]]):
128
127
  pulumi.set(self, "entity_type", value)
129
128
 
130
129
 
@@ -134,17 +133,138 @@ class Quota(pulumi.CustomResource):
134
133
  def __init__(__self__,
135
134
  resource_name: str,
136
135
  opts: Optional[pulumi.ResourceOptions] = None,
137
- config: Optional[pulumi.Input[Mapping[str, pulumi.Input[builtins.str]]]] = None,
138
- entity_name: Optional[pulumi.Input[builtins.str]] = None,
139
- entity_type: Optional[pulumi.Input[builtins.str]] = None,
136
+ config: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]] = None,
137
+ entity_name: Optional[pulumi.Input[_builtins.str]] = None,
138
+ entity_type: Optional[pulumi.Input[_builtins.str]] = None,
140
139
  __props__=None):
141
140
  """
142
- Create a Quota resource with the given unique name, props, and options.
141
+ The `Quota` resource manages Kafka quotas, which are used to limit resource usage and prevent any single client from monopolizing broker resources. Quotas can be applied to clients, users, or IP addresses to control bandwidth and request rates.
142
+
143
+ ## Example Usage
144
+
145
+ ### Client ID Quota
146
+
147
+ ```python
148
+ import pulumi
149
+ import pulumi_kafka as kafka
150
+
151
+ # Limit a specific client's bandwidth
152
+ mobile_app = kafka.Quota("mobile_app",
153
+ entity_name="mobile-app-v1",
154
+ entity_type="client-id",
155
+ config={
156
+ "consumer_byte_rate": "5000000",
157
+ "producer_byte_rate": "2500000",
158
+ "request_percentage": "200",
159
+ })
160
+ ```
161
+
162
+ ### User Quota
163
+
164
+ ```python
165
+ import pulumi
166
+ import pulumi_kafka as kafka
167
+
168
+ # Set quotas for a specific user
169
+ service_account = kafka.Quota("service_account",
170
+ entity_name="payment-service",
171
+ entity_type="user",
172
+ config={
173
+ "consumer_byte_rate": "10000000",
174
+ "producer_byte_rate": "10000000",
175
+ "request_percentage": "400",
176
+ })
177
+ ```
178
+
179
+ ### Default User Quota
180
+
181
+ ```python
182
+ import pulumi
183
+ import pulumi_kafka as kafka
184
+
185
+ # Set default quotas for all users (when entity_name is omitted)
186
+ default_user = kafka.Quota("default_user",
187
+ entity_type="user",
188
+ config={
189
+ "consumer_byte_rate": "2000000",
190
+ "producer_byte_rate": "1000000",
191
+ "request_percentage": "100",
192
+ })
193
+ ```
194
+
195
+ ### IP Address Quota
196
+
197
+ ```python
198
+ import pulumi
199
+ import pulumi_kafka as kafka
200
+
201
+ # Rate limit connections from a specific IP
202
+ external_ip = kafka.Quota("external_ip",
203
+ entity_name="203.0.113.0",
204
+ entity_type="ip",
205
+ config={
206
+ "connection_creation_rate": "10",
207
+ })
208
+ ```
209
+
210
+ ## Quota Configuration Options
211
+
212
+ ### Bandwidth Quotas
213
+ - `producer_byte_rate` - The maximum bytes per second that can be produced by the entity
214
+ - `consumer_byte_rate` - The maximum bytes per second that can be consumed by the entity
215
+
216
+ ### Request Rate Quotas
217
+ - `request_percentage` - The percentage of CPU time on each broker that the entity can use for requests. Values > 100% indicate multiple CPUs (e.g., 200% = 2 CPUs)
218
+
219
+ ### Connection Quotas (IP-based only)
220
+ - `connection_creation_rate` - The maximum rate of new connections per second from the IP address
221
+
222
+ ## Quota Precedence
223
+
224
+ When multiple quotas apply to a request, Kafka uses the most specific quota:
225
+
226
+ 1. `/config/users/<user>/clients/<client-id>` (most specific)
227
+ 2. `/config/users/<user>/clients/<default>`
228
+ 3. `/config/users/<user>`
229
+ 4. `/config/users/<default>/clients/<client-id>`
230
+ 5. `/config/users/<default>/clients/<default>`
231
+ 6. `/config/users/<default>` (least specific)
232
+
233
+ ## Best Practices
234
+
235
+ 1. **Start with Conservative Defaults**: Set reasonable default quotas for all users/clients and then create specific quotas for services that need higher limits.
236
+
237
+ 2. **Monitor Quota Usage**: Use Kafka metrics to monitor quota utilization and adjust as needed. Look for throttling metrics to identify when quotas are being hit.
238
+
239
+ 3. **Use Request Percentage Carefully**: The `request_percentage` quota affects CPU usage. Values over 100% mean the client can use more than one CPU core.
240
+
241
+ 4. **Plan for Growth**: Set quotas with some headroom to accommodate traffic growth, but not so high that a misbehaving client can impact the cluster.
242
+
243
+ 5. **Different Quotas for Different Environments**: Use stricter quotas in development/staging environments compared to production.
244
+
245
+ > **Note:** Quotas are applied immediately but may take a few seconds to propagate across all brokers.
246
+
247
+ ## Import
248
+
249
+ Kafka quotas can be imported using the entity type and name:
250
+
251
+ For named entities
252
+
253
+ ```sh
254
+ $ pulumi import kafka:index/quota:Quota example client-id:my-client
255
+ ```
256
+
257
+ For default quotas (no entity name)
258
+
259
+ ```sh
260
+ $ pulumi import kafka:index/quota:Quota default_user user:
261
+ ```
262
+
143
263
  :param str resource_name: The name of the resource.
144
264
  :param pulumi.ResourceOptions opts: Options for the resource.
145
- :param pulumi.Input[Mapping[str, pulumi.Input[builtins.str]]] config: A map of string k/v properties.
146
- :param pulumi.Input[builtins.str] entity_name: The name of the entity (if entity_name is not provided, it will create entity-default Kafka quota)
147
- :param pulumi.Input[builtins.str] entity_type: The type of the entity (client-id, user, ip)
265
+ :param pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]] config: A map of string k/v properties.
266
+ :param pulumi.Input[_builtins.str] entity_name: The name of the entity (if entity_name is not provided, it will create entity-default Kafka quota)
267
+ :param pulumi.Input[_builtins.str] entity_type: The type of the entity (client-id, user, ip)
148
268
  """
149
269
  ...
150
270
  @overload
@@ -153,7 +273,128 @@ class Quota(pulumi.CustomResource):
153
273
  args: QuotaArgs,
154
274
  opts: Optional[pulumi.ResourceOptions] = None):
155
275
  """
156
- Create a Quota resource with the given unique name, props, and options.
276
+ The `Quota` resource manages Kafka quotas, which are used to limit resource usage and prevent any single client from monopolizing broker resources. Quotas can be applied to clients, users, or IP addresses to control bandwidth and request rates.
277
+
278
+ ## Example Usage
279
+
280
+ ### Client ID Quota
281
+
282
+ ```python
283
+ import pulumi
284
+ import pulumi_kafka as kafka
285
+
286
+ # Limit a specific client's bandwidth
287
+ mobile_app = kafka.Quota("mobile_app",
288
+ entity_name="mobile-app-v1",
289
+ entity_type="client-id",
290
+ config={
291
+ "consumer_byte_rate": "5000000",
292
+ "producer_byte_rate": "2500000",
293
+ "request_percentage": "200",
294
+ })
295
+ ```
296
+
297
+ ### User Quota
298
+
299
+ ```python
300
+ import pulumi
301
+ import pulumi_kafka as kafka
302
+
303
+ # Set quotas for a specific user
304
+ service_account = kafka.Quota("service_account",
305
+ entity_name="payment-service",
306
+ entity_type="user",
307
+ config={
308
+ "consumer_byte_rate": "10000000",
309
+ "producer_byte_rate": "10000000",
310
+ "request_percentage": "400",
311
+ })
312
+ ```
313
+
314
+ ### Default User Quota
315
+
316
+ ```python
317
+ import pulumi
318
+ import pulumi_kafka as kafka
319
+
320
+ # Set default quotas for all users (when entity_name is omitted)
321
+ default_user = kafka.Quota("default_user",
322
+ entity_type="user",
323
+ config={
324
+ "consumer_byte_rate": "2000000",
325
+ "producer_byte_rate": "1000000",
326
+ "request_percentage": "100",
327
+ })
328
+ ```
329
+
330
+ ### IP Address Quota
331
+
332
+ ```python
333
+ import pulumi
334
+ import pulumi_kafka as kafka
335
+
336
+ # Rate limit connections from a specific IP
337
+ external_ip = kafka.Quota("external_ip",
338
+ entity_name="203.0.113.0",
339
+ entity_type="ip",
340
+ config={
341
+ "connection_creation_rate": "10",
342
+ })
343
+ ```
344
+
345
+ ## Quota Configuration Options
346
+
347
+ ### Bandwidth Quotas
348
+ - `producer_byte_rate` - The maximum bytes per second that can be produced by the entity
349
+ - `consumer_byte_rate` - The maximum bytes per second that can be consumed by the entity
350
+
351
+ ### Request Rate Quotas
352
+ - `request_percentage` - The percentage of CPU time on each broker that the entity can use for requests. Values > 100% indicate multiple CPUs (e.g., 200% = 2 CPUs)
353
+
354
+ ### Connection Quotas (IP-based only)
355
+ - `connection_creation_rate` - The maximum rate of new connections per second from the IP address
356
+
357
+ ## Quota Precedence
358
+
359
+ When multiple quotas apply to a request, Kafka uses the most specific quota:
360
+
361
+ 1. `/config/users/<user>/clients/<client-id>` (most specific)
362
+ 2. `/config/users/<user>/clients/<default>`
363
+ 3. `/config/users/<user>`
364
+ 4. `/config/users/<default>/clients/<client-id>`
365
+ 5. `/config/users/<default>/clients/<default>`
366
+ 6. `/config/users/<default>` (least specific)
367
+
368
+ ## Best Practices
369
+
370
+ 1. **Start with Conservative Defaults**: Set reasonable default quotas for all users/clients and then create specific quotas for services that need higher limits.
371
+
372
+ 2. **Monitor Quota Usage**: Use Kafka metrics to monitor quota utilization and adjust as needed. Look for throttling metrics to identify when quotas are being hit.
373
+
374
+ 3. **Use Request Percentage Carefully**: The `request_percentage` quota affects CPU usage. Values over 100% mean the client can use more than one CPU core.
375
+
376
+ 4. **Plan for Growth**: Set quotas with some headroom to accommodate traffic growth, but not so high that a misbehaving client can impact the cluster.
377
+
378
+ 5. **Different Quotas for Different Environments**: Use stricter quotas in development/staging environments compared to production.
379
+
380
+ > **Note:** Quotas are applied immediately but may take a few seconds to propagate across all brokers.
381
+
382
+ ## Import
383
+
384
+ Kafka quotas can be imported using the entity type and name:
385
+
386
+ For named entities
387
+
388
+ ```sh
389
+ $ pulumi import kafka:index/quota:Quota example client-id:my-client
390
+ ```
391
+
392
+ For default quotas (no entity name)
393
+
394
+ ```sh
395
+ $ pulumi import kafka:index/quota:Quota default_user user:
396
+ ```
397
+
157
398
  :param str resource_name: The name of the resource.
158
399
  :param QuotaArgs args: The arguments to use to populate this resource's properties.
159
400
  :param pulumi.ResourceOptions opts: Options for the resource.
@@ -169,9 +410,9 @@ class Quota(pulumi.CustomResource):
169
410
  def _internal_init(__self__,
170
411
  resource_name: str,
171
412
  opts: Optional[pulumi.ResourceOptions] = None,
172
- config: Optional[pulumi.Input[Mapping[str, pulumi.Input[builtins.str]]]] = None,
173
- entity_name: Optional[pulumi.Input[builtins.str]] = None,
174
- entity_type: Optional[pulumi.Input[builtins.str]] = None,
413
+ config: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]] = None,
414
+ entity_name: Optional[pulumi.Input[_builtins.str]] = None,
415
+ entity_type: Optional[pulumi.Input[_builtins.str]] = None,
175
416
  __props__=None):
176
417
  opts = pulumi.ResourceOptions.merge(_utilities.get_resource_opts_defaults(), opts)
177
418
  if not isinstance(opts, pulumi.ResourceOptions):
@@ -196,9 +437,9 @@ class Quota(pulumi.CustomResource):
196
437
  def get(resource_name: str,
197
438
  id: pulumi.Input[str],
198
439
  opts: Optional[pulumi.ResourceOptions] = None,
199
- config: Optional[pulumi.Input[Mapping[str, pulumi.Input[builtins.str]]]] = None,
200
- entity_name: Optional[pulumi.Input[builtins.str]] = None,
201
- entity_type: Optional[pulumi.Input[builtins.str]] = None) -> 'Quota':
440
+ config: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]] = None,
441
+ entity_name: Optional[pulumi.Input[_builtins.str]] = None,
442
+ entity_type: Optional[pulumi.Input[_builtins.str]] = None) -> 'Quota':
202
443
  """
203
444
  Get an existing Quota resource's state with the given name, id, and optional extra
204
445
  properties used to qualify the lookup.
@@ -206,9 +447,9 @@ class Quota(pulumi.CustomResource):
206
447
  :param str resource_name: The unique name of the resulting resource.
207
448
  :param pulumi.Input[str] id: The unique provider ID of the resource to lookup.
208
449
  :param pulumi.ResourceOptions opts: Options for the resource.
209
- :param pulumi.Input[Mapping[str, pulumi.Input[builtins.str]]] config: A map of string k/v properties.
210
- :param pulumi.Input[builtins.str] entity_name: The name of the entity (if entity_name is not provided, it will create entity-default Kafka quota)
211
- :param pulumi.Input[builtins.str] entity_type: The type of the entity (client-id, user, ip)
450
+ :param pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]] config: A map of string k/v properties.
451
+ :param pulumi.Input[_builtins.str] entity_name: The name of the entity (if entity_name is not provided, it will create entity-default Kafka quota)
452
+ :param pulumi.Input[_builtins.str] entity_type: The type of the entity (client-id, user, ip)
212
453
  """
213
454
  opts = pulumi.ResourceOptions.merge(opts, pulumi.ResourceOptions(id=id))
214
455
 
@@ -219,25 +460,25 @@ class Quota(pulumi.CustomResource):
219
460
  __props__.__dict__["entity_type"] = entity_type
220
461
  return Quota(resource_name, opts=opts, __props__=__props__)
221
462
 
222
- @property
463
+ @_builtins.property
223
464
  @pulumi.getter
224
- def config(self) -> pulumi.Output[Optional[Mapping[str, builtins.str]]]:
465
+ def config(self) -> pulumi.Output[Optional[Mapping[str, _builtins.str]]]:
225
466
  """
226
467
  A map of string k/v properties.
227
468
  """
228
469
  return pulumi.get(self, "config")
229
470
 
230
- @property
471
+ @_builtins.property
231
472
  @pulumi.getter(name="entityName")
232
- def entity_name(self) -> pulumi.Output[Optional[builtins.str]]:
473
+ def entity_name(self) -> pulumi.Output[Optional[_builtins.str]]:
233
474
  """
234
475
  The name of the entity (if entity_name is not provided, it will create entity-default Kafka quota)
235
476
  """
236
477
  return pulumi.get(self, "entity_name")
237
478
 
238
- @property
479
+ @_builtins.property
239
480
  @pulumi.getter(name="entityType")
240
- def entity_type(self) -> pulumi.Output[builtins.str]:
481
+ def entity_type(self) -> pulumi.Output[_builtins.str]:
241
482
  """
242
483
  The type of the entity (client-id, user, ip)
243
484
  """