pulumi-kafka 3.9.0a1736849387__py3-none-any.whl → 3.13.0a1763619276__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.
- pulumi_kafka/__init__.py +4 -1
- pulumi_kafka/_utilities.py +9 -5
- pulumi_kafka/acl.py +293 -242
- pulumi_kafka/config/__init__.py +2 -1
- pulumi_kafka/config/__init__.pyi +28 -4
- pulumi_kafka/config/vars.py +61 -27
- pulumi_kafka/get_topic.py +14 -14
- pulumi_kafka/get_topics.py +85 -0
- pulumi_kafka/outputs.py +71 -0
- pulumi_kafka/provider.py +369 -228
- pulumi_kafka/pulumi-plugin.json +1 -1
- pulumi_kafka/quota.py +289 -79
- pulumi_kafka/topic.py +261 -88
- pulumi_kafka/user_scram_credential.py +202 -87
- {pulumi_kafka-3.9.0a1736849387.dist-info → pulumi_kafka-3.13.0a1763619276.dist-info}/METADATA +4 -4
- pulumi_kafka-3.13.0a1763619276.dist-info/RECORD +19 -0
- {pulumi_kafka-3.9.0a1736849387.dist-info → pulumi_kafka-3.13.0a1763619276.dist-info}/WHEEL +1 -1
- pulumi_kafka-3.9.0a1736849387.dist-info/RECORD +0 -17
- {pulumi_kafka-3.9.0a1736849387.dist-info → pulumi_kafka-3.13.0a1763619276.dist-info}/top_level.txt +0 -0
pulumi_kafka/pulumi-plugin.json
CHANGED
pulumi_kafka/quota.py
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# coding=utf-8
|
|
2
|
-
# *** WARNING: this file was generated by
|
|
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
|
|
5
|
+
import builtins as _builtins
|
|
6
6
|
import warnings
|
|
7
7
|
import sys
|
|
8
8
|
import pulumi
|
|
@@ -19,68 +19,69 @@ __all__ = ['QuotaArgs', 'Quota']
|
|
|
19
19
|
@pulumi.input_type
|
|
20
20
|
class QuotaArgs:
|
|
21
21
|
def __init__(__self__, *,
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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):
|
|
25
25
|
"""
|
|
26
26
|
The set of arguments for constructing a Quota resource.
|
|
27
|
-
:param pulumi.Input[str]
|
|
28
|
-
:param pulumi.Input[str]
|
|
29
|
-
:param pulumi.Input[
|
|
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)
|
|
30
30
|
"""
|
|
31
|
-
pulumi.set(__self__, "entity_name", entity_name)
|
|
32
31
|
pulumi.set(__self__, "entity_type", entity_type)
|
|
33
32
|
if config is not None:
|
|
34
33
|
pulumi.set(__self__, "config", config)
|
|
34
|
+
if entity_name is not None:
|
|
35
|
+
pulumi.set(__self__, "entity_name", entity_name)
|
|
35
36
|
|
|
36
|
-
@property
|
|
37
|
-
@pulumi.getter(name="entityName")
|
|
38
|
-
def entity_name(self) -> pulumi.Input[str]:
|
|
39
|
-
"""
|
|
40
|
-
The name of the entity to target.
|
|
41
|
-
"""
|
|
42
|
-
return pulumi.get(self, "entity_name")
|
|
43
|
-
|
|
44
|
-
@entity_name.setter
|
|
45
|
-
def entity_name(self, value: pulumi.Input[str]):
|
|
46
|
-
pulumi.set(self, "entity_name", value)
|
|
47
|
-
|
|
48
|
-
@property
|
|
37
|
+
@_builtins.property
|
|
49
38
|
@pulumi.getter(name="entityType")
|
|
50
|
-
def entity_type(self) -> pulumi.Input[str]:
|
|
39
|
+
def entity_type(self) -> pulumi.Input[_builtins.str]:
|
|
51
40
|
"""
|
|
52
|
-
The type of entity
|
|
41
|
+
The type of the entity (client-id, user, ip)
|
|
53
42
|
"""
|
|
54
43
|
return pulumi.get(self, "entity_type")
|
|
55
44
|
|
|
56
45
|
@entity_type.setter
|
|
57
|
-
def entity_type(self, value: pulumi.Input[str]):
|
|
46
|
+
def entity_type(self, value: pulumi.Input[_builtins.str]):
|
|
58
47
|
pulumi.set(self, "entity_type", value)
|
|
59
48
|
|
|
60
|
-
@property
|
|
49
|
+
@_builtins.property
|
|
61
50
|
@pulumi.getter
|
|
62
|
-
def config(self) -> Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]]:
|
|
51
|
+
def config(self) -> Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]]:
|
|
63
52
|
"""
|
|
64
|
-
A map of string k/v
|
|
53
|
+
A map of string k/v properties.
|
|
65
54
|
"""
|
|
66
55
|
return pulumi.get(self, "config")
|
|
67
56
|
|
|
68
57
|
@config.setter
|
|
69
|
-
def config(self, value: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]]):
|
|
58
|
+
def config(self, value: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]]):
|
|
70
59
|
pulumi.set(self, "config", value)
|
|
71
60
|
|
|
61
|
+
@_builtins.property
|
|
62
|
+
@pulumi.getter(name="entityName")
|
|
63
|
+
def entity_name(self) -> Optional[pulumi.Input[_builtins.str]]:
|
|
64
|
+
"""
|
|
65
|
+
The name of the entity (if entity_name is not provided, it will create entity-default Kafka quota)
|
|
66
|
+
"""
|
|
67
|
+
return pulumi.get(self, "entity_name")
|
|
68
|
+
|
|
69
|
+
@entity_name.setter
|
|
70
|
+
def entity_name(self, value: Optional[pulumi.Input[_builtins.str]]):
|
|
71
|
+
pulumi.set(self, "entity_name", value)
|
|
72
|
+
|
|
72
73
|
|
|
73
74
|
@pulumi.input_type
|
|
74
75
|
class _QuotaState:
|
|
75
76
|
def __init__(__self__, *,
|
|
76
|
-
config: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]] = None,
|
|
77
|
-
entity_name: Optional[pulumi.Input[str]] = None,
|
|
78
|
-
entity_type: Optional[pulumi.Input[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):
|
|
79
80
|
"""
|
|
80
81
|
Input properties used for looking up and filtering Quota resources.
|
|
81
|
-
:param pulumi.Input[Mapping[str, pulumi.Input[str]]] config: A map of string k/v
|
|
82
|
-
:param pulumi.Input[str] entity_name: The name of the entity
|
|
83
|
-
:param pulumi.Input[str] entity_type: The type of entity
|
|
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)
|
|
84
85
|
"""
|
|
85
86
|
if config is not None:
|
|
86
87
|
pulumi.set(__self__, "config", config)
|
|
@@ -89,75 +90,181 @@ class _QuotaState:
|
|
|
89
90
|
if entity_type is not None:
|
|
90
91
|
pulumi.set(__self__, "entity_type", entity_type)
|
|
91
92
|
|
|
92
|
-
@property
|
|
93
|
+
@_builtins.property
|
|
93
94
|
@pulumi.getter
|
|
94
|
-
def config(self) -> Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]]:
|
|
95
|
+
def config(self) -> Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]]:
|
|
95
96
|
"""
|
|
96
|
-
A map of string k/v
|
|
97
|
+
A map of string k/v properties.
|
|
97
98
|
"""
|
|
98
99
|
return pulumi.get(self, "config")
|
|
99
100
|
|
|
100
101
|
@config.setter
|
|
101
|
-
def config(self, value: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]]):
|
|
102
|
+
def config(self, value: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]]):
|
|
102
103
|
pulumi.set(self, "config", value)
|
|
103
104
|
|
|
104
|
-
@property
|
|
105
|
+
@_builtins.property
|
|
105
106
|
@pulumi.getter(name="entityName")
|
|
106
|
-
def entity_name(self) -> Optional[pulumi.Input[str]]:
|
|
107
|
+
def entity_name(self) -> Optional[pulumi.Input[_builtins.str]]:
|
|
107
108
|
"""
|
|
108
|
-
The name of the entity
|
|
109
|
+
The name of the entity (if entity_name is not provided, it will create entity-default Kafka quota)
|
|
109
110
|
"""
|
|
110
111
|
return pulumi.get(self, "entity_name")
|
|
111
112
|
|
|
112
113
|
@entity_name.setter
|
|
113
|
-
def entity_name(self, value: Optional[pulumi.Input[str]]):
|
|
114
|
+
def entity_name(self, value: Optional[pulumi.Input[_builtins.str]]):
|
|
114
115
|
pulumi.set(self, "entity_name", value)
|
|
115
116
|
|
|
116
|
-
@property
|
|
117
|
+
@_builtins.property
|
|
117
118
|
@pulumi.getter(name="entityType")
|
|
118
|
-
def entity_type(self) -> Optional[pulumi.Input[str]]:
|
|
119
|
+
def entity_type(self) -> Optional[pulumi.Input[_builtins.str]]:
|
|
119
120
|
"""
|
|
120
|
-
The type of entity
|
|
121
|
+
The type of the entity (client-id, user, ip)
|
|
121
122
|
"""
|
|
122
123
|
return pulumi.get(self, "entity_type")
|
|
123
124
|
|
|
124
125
|
@entity_type.setter
|
|
125
|
-
def entity_type(self, value: Optional[pulumi.Input[str]]):
|
|
126
|
+
def entity_type(self, value: Optional[pulumi.Input[_builtins.str]]):
|
|
126
127
|
pulumi.set(self, "entity_type", value)
|
|
127
128
|
|
|
128
129
|
|
|
130
|
+
@pulumi.type_token("kafka:index/quota:Quota")
|
|
129
131
|
class Quota(pulumi.CustomResource):
|
|
130
132
|
@overload
|
|
131
133
|
def __init__(__self__,
|
|
132
134
|
resource_name: str,
|
|
133
135
|
opts: Optional[pulumi.ResourceOptions] = None,
|
|
134
|
-
config: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]] = None,
|
|
135
|
-
entity_name: Optional[pulumi.Input[str]] = None,
|
|
136
|
-
entity_type: Optional[pulumi.Input[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,
|
|
137
139
|
__props__=None):
|
|
138
140
|
"""
|
|
139
|
-
|
|
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.
|
|
140
142
|
|
|
141
143
|
## Example Usage
|
|
142
144
|
|
|
145
|
+
### Client ID Quota
|
|
146
|
+
|
|
143
147
|
```python
|
|
144
148
|
import pulumi
|
|
145
149
|
import pulumi_kafka as kafka
|
|
146
150
|
|
|
147
|
-
|
|
148
|
-
|
|
151
|
+
# Limit a specific client's bandwidth
|
|
152
|
+
mobile_app = kafka.Quota("mobile_app",
|
|
153
|
+
entity_name="mobile-app-v1",
|
|
149
154
|
entity_type="client-id",
|
|
150
155
|
config={
|
|
151
156
|
"consumer_byte_rate": "5000000",
|
|
152
157
|
"producer_byte_rate": "2500000",
|
|
158
|
+
"request_percentage": "200",
|
|
153
159
|
})
|
|
154
160
|
```
|
|
155
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
|
+
|
|
156
263
|
:param str resource_name: The name of the resource.
|
|
157
264
|
:param pulumi.ResourceOptions opts: Options for the resource.
|
|
158
|
-
:param pulumi.Input[Mapping[str, pulumi.Input[str]]] config: A map of string k/v
|
|
159
|
-
:param pulumi.Input[str] entity_name: The name of the entity
|
|
160
|
-
:param pulumi.Input[str] entity_type: The type of entity
|
|
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)
|
|
161
268
|
"""
|
|
162
269
|
...
|
|
163
270
|
@overload
|
|
@@ -166,23 +273,128 @@ class Quota(pulumi.CustomResource):
|
|
|
166
273
|
args: QuotaArgs,
|
|
167
274
|
opts: Optional[pulumi.ResourceOptions] = None):
|
|
168
275
|
"""
|
|
169
|
-
|
|
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.
|
|
170
277
|
|
|
171
278
|
## Example Usage
|
|
172
279
|
|
|
280
|
+
### Client ID Quota
|
|
281
|
+
|
|
173
282
|
```python
|
|
174
283
|
import pulumi
|
|
175
284
|
import pulumi_kafka as kafka
|
|
176
285
|
|
|
177
|
-
|
|
178
|
-
|
|
286
|
+
# Limit a specific client's bandwidth
|
|
287
|
+
mobile_app = kafka.Quota("mobile_app",
|
|
288
|
+
entity_name="mobile-app-v1",
|
|
179
289
|
entity_type="client-id",
|
|
180
290
|
config={
|
|
181
291
|
"consumer_byte_rate": "5000000",
|
|
182
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",
|
|
183
311
|
})
|
|
184
312
|
```
|
|
185
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
|
+
|
|
186
398
|
:param str resource_name: The name of the resource.
|
|
187
399
|
:param QuotaArgs args: The arguments to use to populate this resource's properties.
|
|
188
400
|
:param pulumi.ResourceOptions opts: Options for the resource.
|
|
@@ -198,9 +410,9 @@ class Quota(pulumi.CustomResource):
|
|
|
198
410
|
def _internal_init(__self__,
|
|
199
411
|
resource_name: str,
|
|
200
412
|
opts: Optional[pulumi.ResourceOptions] = None,
|
|
201
|
-
config: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]] = None,
|
|
202
|
-
entity_name: Optional[pulumi.Input[str]] = None,
|
|
203
|
-
entity_type: Optional[pulumi.Input[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,
|
|
204
416
|
__props__=None):
|
|
205
417
|
opts = pulumi.ResourceOptions.merge(_utilities.get_resource_opts_defaults(), opts)
|
|
206
418
|
if not isinstance(opts, pulumi.ResourceOptions):
|
|
@@ -211,8 +423,6 @@ class Quota(pulumi.CustomResource):
|
|
|
211
423
|
__props__ = QuotaArgs.__new__(QuotaArgs)
|
|
212
424
|
|
|
213
425
|
__props__.__dict__["config"] = config
|
|
214
|
-
if entity_name is None and not opts.urn:
|
|
215
|
-
raise TypeError("Missing required property 'entity_name'")
|
|
216
426
|
__props__.__dict__["entity_name"] = entity_name
|
|
217
427
|
if entity_type is None and not opts.urn:
|
|
218
428
|
raise TypeError("Missing required property 'entity_type'")
|
|
@@ -227,9 +437,9 @@ class Quota(pulumi.CustomResource):
|
|
|
227
437
|
def get(resource_name: str,
|
|
228
438
|
id: pulumi.Input[str],
|
|
229
439
|
opts: Optional[pulumi.ResourceOptions] = None,
|
|
230
|
-
config: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]] = None,
|
|
231
|
-
entity_name: Optional[pulumi.Input[str]] = None,
|
|
232
|
-
entity_type: Optional[pulumi.Input[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':
|
|
233
443
|
"""
|
|
234
444
|
Get an existing Quota resource's state with the given name, id, and optional extra
|
|
235
445
|
properties used to qualify the lookup.
|
|
@@ -237,9 +447,9 @@ class Quota(pulumi.CustomResource):
|
|
|
237
447
|
:param str resource_name: The unique name of the resulting resource.
|
|
238
448
|
:param pulumi.Input[str] id: The unique provider ID of the resource to lookup.
|
|
239
449
|
:param pulumi.ResourceOptions opts: Options for the resource.
|
|
240
|
-
:param pulumi.Input[Mapping[str, pulumi.Input[str]]] config: A map of string k/v
|
|
241
|
-
:param pulumi.Input[str] entity_name: The name of the entity
|
|
242
|
-
:param pulumi.Input[str] entity_type: The type of entity
|
|
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)
|
|
243
453
|
"""
|
|
244
454
|
opts = pulumi.ResourceOptions.merge(opts, pulumi.ResourceOptions(id=id))
|
|
245
455
|
|
|
@@ -250,27 +460,27 @@ class Quota(pulumi.CustomResource):
|
|
|
250
460
|
__props__.__dict__["entity_type"] = entity_type
|
|
251
461
|
return Quota(resource_name, opts=opts, __props__=__props__)
|
|
252
462
|
|
|
253
|
-
@property
|
|
463
|
+
@_builtins.property
|
|
254
464
|
@pulumi.getter
|
|
255
|
-
def config(self) -> pulumi.Output[Optional[Mapping[str, str]]]:
|
|
465
|
+
def config(self) -> pulumi.Output[Optional[Mapping[str, _builtins.str]]]:
|
|
256
466
|
"""
|
|
257
|
-
A map of string k/v
|
|
467
|
+
A map of string k/v properties.
|
|
258
468
|
"""
|
|
259
469
|
return pulumi.get(self, "config")
|
|
260
470
|
|
|
261
|
-
@property
|
|
471
|
+
@_builtins.property
|
|
262
472
|
@pulumi.getter(name="entityName")
|
|
263
|
-
def entity_name(self) -> pulumi.Output[str]:
|
|
473
|
+
def entity_name(self) -> pulumi.Output[Optional[_builtins.str]]:
|
|
264
474
|
"""
|
|
265
|
-
The name of the entity
|
|
475
|
+
The name of the entity (if entity_name is not provided, it will create entity-default Kafka quota)
|
|
266
476
|
"""
|
|
267
477
|
return pulumi.get(self, "entity_name")
|
|
268
478
|
|
|
269
|
-
@property
|
|
479
|
+
@_builtins.property
|
|
270
480
|
@pulumi.getter(name="entityType")
|
|
271
|
-
def entity_type(self) -> pulumi.Output[str]:
|
|
481
|
+
def entity_type(self) -> pulumi.Output[_builtins.str]:
|
|
272
482
|
"""
|
|
273
|
-
The type of entity
|
|
483
|
+
The type of the entity (client-id, user, ip)
|
|
274
484
|
"""
|
|
275
485
|
return pulumi.get(self, "entity_type")
|
|
276
486
|
|