pulumi-kafka 3.11.0a1753336924__tar.gz → 3.11.0a1753501206__tar.gz
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-3.11.0a1753336924 → pulumi_kafka-3.11.0a1753501206}/PKG-INFO +1 -1
- {pulumi_kafka-3.11.0a1753336924 → pulumi_kafka-3.11.0a1753501206}/pulumi_kafka/__init__.py +3 -1
- pulumi_kafka-3.11.0a1753501206/pulumi_kafka/acl.py +587 -0
- {pulumi_kafka-3.11.0a1753336924 → pulumi_kafka-3.11.0a1753501206}/pulumi_kafka/config/__init__.py +1 -1
- {pulumi_kafka-3.11.0a1753336924 → pulumi_kafka-3.11.0a1753501206}/pulumi_kafka/config/__init__.pyi +1 -2
- {pulumi_kafka-3.11.0a1753336924 → pulumi_kafka-3.11.0a1753501206}/pulumi_kafka/config/vars.py +29 -30
- {pulumi_kafka-3.11.0a1753336924 → pulumi_kafka-3.11.0a1753501206}/pulumi_kafka/get_topic.py +13 -14
- pulumi_kafka-3.11.0a1753501206/pulumi_kafka/get_topics.py +85 -0
- pulumi_kafka-3.11.0a1753501206/pulumi_kafka/outputs.py +71 -0
- {pulumi_kafka-3.11.0a1753336924 → pulumi_kafka-3.11.0a1753501206}/pulumi_kafka/provider.py +268 -269
- {pulumi_kafka-3.11.0a1753336924 → pulumi_kafka-3.11.0a1753501206}/pulumi_kafka/pulumi-plugin.json +1 -1
- pulumi_kafka-3.11.0a1753501206/pulumi_kafka/quota.py +486 -0
- pulumi_kafka-3.11.0a1753501206/pulumi_kafka/topic.py +514 -0
- pulumi_kafka-3.11.0a1753501206/pulumi_kafka/user_scram_credential.py +355 -0
- {pulumi_kafka-3.11.0a1753336924 → pulumi_kafka-3.11.0a1753501206}/pulumi_kafka.egg-info/PKG-INFO +1 -1
- {pulumi_kafka-3.11.0a1753336924 → pulumi_kafka-3.11.0a1753501206}/pulumi_kafka.egg-info/SOURCES.txt +2 -0
- {pulumi_kafka-3.11.0a1753336924 → pulumi_kafka-3.11.0a1753501206}/pyproject.toml +1 -1
- pulumi_kafka-3.11.0a1753336924/pulumi_kafka/acl.py +0 -360
- pulumi_kafka-3.11.0a1753336924/pulumi_kafka/quota.py +0 -245
- pulumi_kafka-3.11.0a1753336924/pulumi_kafka/topic.py +0 -293
- pulumi_kafka-3.11.0a1753336924/pulumi_kafka/user_scram_credential.py +0 -296
- {pulumi_kafka-3.11.0a1753336924 → pulumi_kafka-3.11.0a1753501206}/README.md +0 -0
- {pulumi_kafka-3.11.0a1753336924 → pulumi_kafka-3.11.0a1753501206}/pulumi_kafka/_utilities.py +0 -0
- {pulumi_kafka-3.11.0a1753336924 → pulumi_kafka-3.11.0a1753501206}/pulumi_kafka/py.typed +0 -0
- {pulumi_kafka-3.11.0a1753336924 → pulumi_kafka-3.11.0a1753501206}/pulumi_kafka.egg-info/dependency_links.txt +0 -0
- {pulumi_kafka-3.11.0a1753336924 → pulumi_kafka-3.11.0a1753501206}/pulumi_kafka.egg-info/requires.txt +0 -0
- {pulumi_kafka-3.11.0a1753336924 → pulumi_kafka-3.11.0a1753501206}/pulumi_kafka.egg-info/top_level.txt +0 -0
- {pulumi_kafka-3.11.0a1753336924 → pulumi_kafka-3.11.0a1753501206}/setup.cfg +0 -0
@@ -2,16 +2,18 @@
|
|
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
|
5
|
+
import builtins as _builtins
|
6
6
|
from . import _utilities
|
7
7
|
import typing
|
8
8
|
# Export this package's modules as members:
|
9
9
|
from .acl import *
|
10
10
|
from .get_topic import *
|
11
|
+
from .get_topics import *
|
11
12
|
from .provider import *
|
12
13
|
from .quota import *
|
13
14
|
from .topic import *
|
14
15
|
from .user_scram_credential import *
|
16
|
+
from . import outputs
|
15
17
|
|
16
18
|
# Make subpackages available:
|
17
19
|
if typing.TYPE_CHECKING:
|
@@ -0,0 +1,587 @@
|
|
1
|
+
# coding=utf-8
|
2
|
+
# *** WARNING: this file was generated by pulumi-language-python. ***
|
3
|
+
# *** Do not edit by hand unless you're certain you know what you are doing! ***
|
4
|
+
|
5
|
+
import builtins as _builtins
|
6
|
+
import warnings
|
7
|
+
import sys
|
8
|
+
import pulumi
|
9
|
+
import pulumi.runtime
|
10
|
+
from typing import Any, Mapping, Optional, Sequence, Union, overload
|
11
|
+
if sys.version_info >= (3, 11):
|
12
|
+
from typing import NotRequired, TypedDict, TypeAlias
|
13
|
+
else:
|
14
|
+
from typing_extensions import NotRequired, TypedDict, TypeAlias
|
15
|
+
from . import _utilities
|
16
|
+
|
17
|
+
__all__ = ['AclArgs', 'Acl']
|
18
|
+
|
19
|
+
@pulumi.input_type
|
20
|
+
class AclArgs:
|
21
|
+
def __init__(__self__, *,
|
22
|
+
acl_host: pulumi.Input[_builtins.str],
|
23
|
+
acl_operation: pulumi.Input[_builtins.str],
|
24
|
+
acl_permission_type: pulumi.Input[_builtins.str],
|
25
|
+
acl_principal: pulumi.Input[_builtins.str],
|
26
|
+
acl_resource_name: pulumi.Input[_builtins.str],
|
27
|
+
acl_resource_type: pulumi.Input[_builtins.str],
|
28
|
+
resource_pattern_type_filter: Optional[pulumi.Input[_builtins.str]] = None):
|
29
|
+
"""
|
30
|
+
The set of arguments for constructing a Acl resource.
|
31
|
+
:param pulumi.Input[_builtins.str] acl_resource_name: The name of the resource
|
32
|
+
"""
|
33
|
+
pulumi.set(__self__, "acl_host", acl_host)
|
34
|
+
pulumi.set(__self__, "acl_operation", acl_operation)
|
35
|
+
pulumi.set(__self__, "acl_permission_type", acl_permission_type)
|
36
|
+
pulumi.set(__self__, "acl_principal", acl_principal)
|
37
|
+
pulumi.set(__self__, "acl_resource_name", acl_resource_name)
|
38
|
+
pulumi.set(__self__, "acl_resource_type", acl_resource_type)
|
39
|
+
if resource_pattern_type_filter is not None:
|
40
|
+
pulumi.set(__self__, "resource_pattern_type_filter", resource_pattern_type_filter)
|
41
|
+
|
42
|
+
@_builtins.property
|
43
|
+
@pulumi.getter(name="aclHost")
|
44
|
+
def acl_host(self) -> pulumi.Input[_builtins.str]:
|
45
|
+
return pulumi.get(self, "acl_host")
|
46
|
+
|
47
|
+
@acl_host.setter
|
48
|
+
def acl_host(self, value: pulumi.Input[_builtins.str]):
|
49
|
+
pulumi.set(self, "acl_host", value)
|
50
|
+
|
51
|
+
@_builtins.property
|
52
|
+
@pulumi.getter(name="aclOperation")
|
53
|
+
def acl_operation(self) -> pulumi.Input[_builtins.str]:
|
54
|
+
return pulumi.get(self, "acl_operation")
|
55
|
+
|
56
|
+
@acl_operation.setter
|
57
|
+
def acl_operation(self, value: pulumi.Input[_builtins.str]):
|
58
|
+
pulumi.set(self, "acl_operation", value)
|
59
|
+
|
60
|
+
@_builtins.property
|
61
|
+
@pulumi.getter(name="aclPermissionType")
|
62
|
+
def acl_permission_type(self) -> pulumi.Input[_builtins.str]:
|
63
|
+
return pulumi.get(self, "acl_permission_type")
|
64
|
+
|
65
|
+
@acl_permission_type.setter
|
66
|
+
def acl_permission_type(self, value: pulumi.Input[_builtins.str]):
|
67
|
+
pulumi.set(self, "acl_permission_type", value)
|
68
|
+
|
69
|
+
@_builtins.property
|
70
|
+
@pulumi.getter(name="aclPrincipal")
|
71
|
+
def acl_principal(self) -> pulumi.Input[_builtins.str]:
|
72
|
+
return pulumi.get(self, "acl_principal")
|
73
|
+
|
74
|
+
@acl_principal.setter
|
75
|
+
def acl_principal(self, value: pulumi.Input[_builtins.str]):
|
76
|
+
pulumi.set(self, "acl_principal", value)
|
77
|
+
|
78
|
+
@_builtins.property
|
79
|
+
@pulumi.getter(name="aclResourceName")
|
80
|
+
def acl_resource_name(self) -> pulumi.Input[_builtins.str]:
|
81
|
+
"""
|
82
|
+
The name of the resource
|
83
|
+
"""
|
84
|
+
return pulumi.get(self, "acl_resource_name")
|
85
|
+
|
86
|
+
@acl_resource_name.setter
|
87
|
+
def acl_resource_name(self, value: pulumi.Input[_builtins.str]):
|
88
|
+
pulumi.set(self, "acl_resource_name", value)
|
89
|
+
|
90
|
+
@_builtins.property
|
91
|
+
@pulumi.getter(name="aclResourceType")
|
92
|
+
def acl_resource_type(self) -> pulumi.Input[_builtins.str]:
|
93
|
+
return pulumi.get(self, "acl_resource_type")
|
94
|
+
|
95
|
+
@acl_resource_type.setter
|
96
|
+
def acl_resource_type(self, value: pulumi.Input[_builtins.str]):
|
97
|
+
pulumi.set(self, "acl_resource_type", value)
|
98
|
+
|
99
|
+
@_builtins.property
|
100
|
+
@pulumi.getter(name="resourcePatternTypeFilter")
|
101
|
+
def resource_pattern_type_filter(self) -> Optional[pulumi.Input[_builtins.str]]:
|
102
|
+
return pulumi.get(self, "resource_pattern_type_filter")
|
103
|
+
|
104
|
+
@resource_pattern_type_filter.setter
|
105
|
+
def resource_pattern_type_filter(self, value: Optional[pulumi.Input[_builtins.str]]):
|
106
|
+
pulumi.set(self, "resource_pattern_type_filter", value)
|
107
|
+
|
108
|
+
|
109
|
+
@pulumi.input_type
|
110
|
+
class _AclState:
|
111
|
+
def __init__(__self__, *,
|
112
|
+
acl_host: Optional[pulumi.Input[_builtins.str]] = None,
|
113
|
+
acl_operation: Optional[pulumi.Input[_builtins.str]] = None,
|
114
|
+
acl_permission_type: Optional[pulumi.Input[_builtins.str]] = None,
|
115
|
+
acl_principal: Optional[pulumi.Input[_builtins.str]] = None,
|
116
|
+
acl_resource_name: Optional[pulumi.Input[_builtins.str]] = None,
|
117
|
+
acl_resource_type: Optional[pulumi.Input[_builtins.str]] = None,
|
118
|
+
resource_pattern_type_filter: Optional[pulumi.Input[_builtins.str]] = None):
|
119
|
+
"""
|
120
|
+
Input properties used for looking up and filtering Acl resources.
|
121
|
+
:param pulumi.Input[_builtins.str] acl_resource_name: The name of the resource
|
122
|
+
"""
|
123
|
+
if acl_host is not None:
|
124
|
+
pulumi.set(__self__, "acl_host", acl_host)
|
125
|
+
if acl_operation is not None:
|
126
|
+
pulumi.set(__self__, "acl_operation", acl_operation)
|
127
|
+
if acl_permission_type is not None:
|
128
|
+
pulumi.set(__self__, "acl_permission_type", acl_permission_type)
|
129
|
+
if acl_principal is not None:
|
130
|
+
pulumi.set(__self__, "acl_principal", acl_principal)
|
131
|
+
if acl_resource_name is not None:
|
132
|
+
pulumi.set(__self__, "acl_resource_name", acl_resource_name)
|
133
|
+
if acl_resource_type is not None:
|
134
|
+
pulumi.set(__self__, "acl_resource_type", acl_resource_type)
|
135
|
+
if resource_pattern_type_filter is not None:
|
136
|
+
pulumi.set(__self__, "resource_pattern_type_filter", resource_pattern_type_filter)
|
137
|
+
|
138
|
+
@_builtins.property
|
139
|
+
@pulumi.getter(name="aclHost")
|
140
|
+
def acl_host(self) -> Optional[pulumi.Input[_builtins.str]]:
|
141
|
+
return pulumi.get(self, "acl_host")
|
142
|
+
|
143
|
+
@acl_host.setter
|
144
|
+
def acl_host(self, value: Optional[pulumi.Input[_builtins.str]]):
|
145
|
+
pulumi.set(self, "acl_host", value)
|
146
|
+
|
147
|
+
@_builtins.property
|
148
|
+
@pulumi.getter(name="aclOperation")
|
149
|
+
def acl_operation(self) -> Optional[pulumi.Input[_builtins.str]]:
|
150
|
+
return pulumi.get(self, "acl_operation")
|
151
|
+
|
152
|
+
@acl_operation.setter
|
153
|
+
def acl_operation(self, value: Optional[pulumi.Input[_builtins.str]]):
|
154
|
+
pulumi.set(self, "acl_operation", value)
|
155
|
+
|
156
|
+
@_builtins.property
|
157
|
+
@pulumi.getter(name="aclPermissionType")
|
158
|
+
def acl_permission_type(self) -> Optional[pulumi.Input[_builtins.str]]:
|
159
|
+
return pulumi.get(self, "acl_permission_type")
|
160
|
+
|
161
|
+
@acl_permission_type.setter
|
162
|
+
def acl_permission_type(self, value: Optional[pulumi.Input[_builtins.str]]):
|
163
|
+
pulumi.set(self, "acl_permission_type", value)
|
164
|
+
|
165
|
+
@_builtins.property
|
166
|
+
@pulumi.getter(name="aclPrincipal")
|
167
|
+
def acl_principal(self) -> Optional[pulumi.Input[_builtins.str]]:
|
168
|
+
return pulumi.get(self, "acl_principal")
|
169
|
+
|
170
|
+
@acl_principal.setter
|
171
|
+
def acl_principal(self, value: Optional[pulumi.Input[_builtins.str]]):
|
172
|
+
pulumi.set(self, "acl_principal", value)
|
173
|
+
|
174
|
+
@_builtins.property
|
175
|
+
@pulumi.getter(name="aclResourceName")
|
176
|
+
def acl_resource_name(self) -> Optional[pulumi.Input[_builtins.str]]:
|
177
|
+
"""
|
178
|
+
The name of the resource
|
179
|
+
"""
|
180
|
+
return pulumi.get(self, "acl_resource_name")
|
181
|
+
|
182
|
+
@acl_resource_name.setter
|
183
|
+
def acl_resource_name(self, value: Optional[pulumi.Input[_builtins.str]]):
|
184
|
+
pulumi.set(self, "acl_resource_name", value)
|
185
|
+
|
186
|
+
@_builtins.property
|
187
|
+
@pulumi.getter(name="aclResourceType")
|
188
|
+
def acl_resource_type(self) -> Optional[pulumi.Input[_builtins.str]]:
|
189
|
+
return pulumi.get(self, "acl_resource_type")
|
190
|
+
|
191
|
+
@acl_resource_type.setter
|
192
|
+
def acl_resource_type(self, value: Optional[pulumi.Input[_builtins.str]]):
|
193
|
+
pulumi.set(self, "acl_resource_type", value)
|
194
|
+
|
195
|
+
@_builtins.property
|
196
|
+
@pulumi.getter(name="resourcePatternTypeFilter")
|
197
|
+
def resource_pattern_type_filter(self) -> Optional[pulumi.Input[_builtins.str]]:
|
198
|
+
return pulumi.get(self, "resource_pattern_type_filter")
|
199
|
+
|
200
|
+
@resource_pattern_type_filter.setter
|
201
|
+
def resource_pattern_type_filter(self, value: Optional[pulumi.Input[_builtins.str]]):
|
202
|
+
pulumi.set(self, "resource_pattern_type_filter", value)
|
203
|
+
|
204
|
+
|
205
|
+
@pulumi.type_token("kafka:index/acl:Acl")
|
206
|
+
class Acl(pulumi.CustomResource):
|
207
|
+
@overload
|
208
|
+
def __init__(__self__,
|
209
|
+
resource_name: str,
|
210
|
+
opts: Optional[pulumi.ResourceOptions] = None,
|
211
|
+
acl_host: Optional[pulumi.Input[_builtins.str]] = None,
|
212
|
+
acl_operation: Optional[pulumi.Input[_builtins.str]] = None,
|
213
|
+
acl_permission_type: Optional[pulumi.Input[_builtins.str]] = None,
|
214
|
+
acl_principal: Optional[pulumi.Input[_builtins.str]] = None,
|
215
|
+
acl_resource_name: Optional[pulumi.Input[_builtins.str]] = None,
|
216
|
+
acl_resource_type: Optional[pulumi.Input[_builtins.str]] = None,
|
217
|
+
resource_pattern_type_filter: Optional[pulumi.Input[_builtins.str]] = None,
|
218
|
+
__props__=None):
|
219
|
+
"""
|
220
|
+
The `Acl` resource manages Apache Kafka Access Control Lists (ACLs). ACLs control access to Kafka resources like topics, consumer groups, and clusters by defining which principals (users or services) can perform specific operations on these resources.
|
221
|
+
|
222
|
+
## Example Usage
|
223
|
+
|
224
|
+
### Allow Producer Access to Topic
|
225
|
+
|
226
|
+
```python
|
227
|
+
import pulumi
|
228
|
+
import pulumi_kafka as kafka
|
229
|
+
|
230
|
+
producer = kafka.Acl("producer",
|
231
|
+
acl_resource_name="orders",
|
232
|
+
acl_resource_type="Topic",
|
233
|
+
acl_principal="User:producer-service",
|
234
|
+
acl_host="*",
|
235
|
+
acl_operation="Write",
|
236
|
+
acl_permission_type="Allow")
|
237
|
+
# Also grant describe permission for producers
|
238
|
+
producer_describe = kafka.Acl("producer_describe",
|
239
|
+
acl_resource_name="orders",
|
240
|
+
acl_resource_type="Topic",
|
241
|
+
acl_principal="User:producer-service",
|
242
|
+
acl_host="*",
|
243
|
+
acl_operation="Describe",
|
244
|
+
acl_permission_type="Allow")
|
245
|
+
```
|
246
|
+
|
247
|
+
### Allow Consumer Group Access
|
248
|
+
|
249
|
+
```python
|
250
|
+
import pulumi
|
251
|
+
import pulumi_kafka as kafka
|
252
|
+
|
253
|
+
# Allow read access to topic
|
254
|
+
consumer_read = kafka.Acl("consumer_read",
|
255
|
+
acl_resource_name="orders",
|
256
|
+
acl_resource_type="Topic",
|
257
|
+
acl_principal="User:consumer-service",
|
258
|
+
acl_host="*",
|
259
|
+
acl_operation="Read",
|
260
|
+
acl_permission_type="Allow")
|
261
|
+
# Allow access to consumer group
|
262
|
+
consumer_group = kafka.Acl("consumer_group",
|
263
|
+
acl_resource_name="order-processors",
|
264
|
+
acl_resource_type="Group",
|
265
|
+
acl_principal="User:consumer-service",
|
266
|
+
acl_host="*",
|
267
|
+
acl_operation="Read",
|
268
|
+
acl_permission_type="Allow")
|
269
|
+
```
|
270
|
+
|
271
|
+
### Prefix-Based Access Control
|
272
|
+
|
273
|
+
```python
|
274
|
+
import pulumi
|
275
|
+
import pulumi_kafka as kafka
|
276
|
+
|
277
|
+
# Grant access to all topics with prefix "logs-"
|
278
|
+
logs_access = kafka.Acl("logs_access",
|
279
|
+
acl_resource_name="logs-",
|
280
|
+
acl_resource_type="Topic",
|
281
|
+
resource_pattern_type_filter="Prefixed",
|
282
|
+
acl_principal="User:log-aggregator",
|
283
|
+
acl_host="*",
|
284
|
+
acl_operation="Read",
|
285
|
+
acl_permission_type="Allow")
|
286
|
+
```
|
287
|
+
|
288
|
+
### Admin User with Full Access
|
289
|
+
|
290
|
+
```python
|
291
|
+
import pulumi
|
292
|
+
import pulumi_kafka as kafka
|
293
|
+
|
294
|
+
# Grant cluster-level admin access
|
295
|
+
admin_cluster = kafka.Acl("admin_cluster",
|
296
|
+
acl_resource_name="kafka-cluster",
|
297
|
+
acl_resource_type="Cluster",
|
298
|
+
acl_principal="User:admin",
|
299
|
+
acl_host="*",
|
300
|
+
acl_operation="All",
|
301
|
+
acl_permission_type="Allow")
|
302
|
+
```
|
303
|
+
|
304
|
+
## Common ACL Patterns
|
305
|
+
|
306
|
+
### Producer ACLs
|
307
|
+
Producers typically need:
|
308
|
+
- `Write` and `Describe` on topics
|
309
|
+
- `Write` on `TransactionalID` (for transactional producers)
|
310
|
+
- `IdempotentWrite` on `Cluster` (for idempotent producers)
|
311
|
+
|
312
|
+
### Consumer ACLs
|
313
|
+
Consumers typically need:
|
314
|
+
- `Read` on topics
|
315
|
+
- `Read` on consumer groups
|
316
|
+
- `Describe` on topics (optional, for metadata)
|
317
|
+
|
318
|
+
### Admin ACLs
|
319
|
+
Administrators typically need:
|
320
|
+
- `All` on `Cluster`
|
321
|
+
- Or specific operations like `Alter`, `AlterConfigs`, `Create`, `Delete`
|
322
|
+
|
323
|
+
> **Warning:** Be cautious with `Deny` ACLs as they take precedence over `Allow` ACLs. A deny rule will block access even if an allow rule exists.
|
324
|
+
|
325
|
+
## Import
|
326
|
+
|
327
|
+
Kafka ACLs can be imported using a pipe-delimited string containing all ACL properties:
|
328
|
+
|
329
|
+
Format: ${acl_principal}|${acl_host}|${acl_operation}|${acl_permission_type}|${resource_type}|${resource_name}|${resource_pattern_type_filter}
|
330
|
+
|
331
|
+
```sh
|
332
|
+
$ pulumi import kafka:index/acl:Acl example 'User:producer|*|Write|Allow|Topic|orders|Literal'
|
333
|
+
```
|
334
|
+
|
335
|
+
:param str resource_name: The name of the resource.
|
336
|
+
:param pulumi.ResourceOptions opts: Options for the resource.
|
337
|
+
:param pulumi.Input[_builtins.str] acl_resource_name: The name of the resource
|
338
|
+
"""
|
339
|
+
...
|
340
|
+
@overload
|
341
|
+
def __init__(__self__,
|
342
|
+
resource_name: str,
|
343
|
+
args: AclArgs,
|
344
|
+
opts: Optional[pulumi.ResourceOptions] = None):
|
345
|
+
"""
|
346
|
+
The `Acl` resource manages Apache Kafka Access Control Lists (ACLs). ACLs control access to Kafka resources like topics, consumer groups, and clusters by defining which principals (users or services) can perform specific operations on these resources.
|
347
|
+
|
348
|
+
## Example Usage
|
349
|
+
|
350
|
+
### Allow Producer Access to Topic
|
351
|
+
|
352
|
+
```python
|
353
|
+
import pulumi
|
354
|
+
import pulumi_kafka as kafka
|
355
|
+
|
356
|
+
producer = kafka.Acl("producer",
|
357
|
+
acl_resource_name="orders",
|
358
|
+
acl_resource_type="Topic",
|
359
|
+
acl_principal="User:producer-service",
|
360
|
+
acl_host="*",
|
361
|
+
acl_operation="Write",
|
362
|
+
acl_permission_type="Allow")
|
363
|
+
# Also grant describe permission for producers
|
364
|
+
producer_describe = kafka.Acl("producer_describe",
|
365
|
+
acl_resource_name="orders",
|
366
|
+
acl_resource_type="Topic",
|
367
|
+
acl_principal="User:producer-service",
|
368
|
+
acl_host="*",
|
369
|
+
acl_operation="Describe",
|
370
|
+
acl_permission_type="Allow")
|
371
|
+
```
|
372
|
+
|
373
|
+
### Allow Consumer Group Access
|
374
|
+
|
375
|
+
```python
|
376
|
+
import pulumi
|
377
|
+
import pulumi_kafka as kafka
|
378
|
+
|
379
|
+
# Allow read access to topic
|
380
|
+
consumer_read = kafka.Acl("consumer_read",
|
381
|
+
acl_resource_name="orders",
|
382
|
+
acl_resource_type="Topic",
|
383
|
+
acl_principal="User:consumer-service",
|
384
|
+
acl_host="*",
|
385
|
+
acl_operation="Read",
|
386
|
+
acl_permission_type="Allow")
|
387
|
+
# Allow access to consumer group
|
388
|
+
consumer_group = kafka.Acl("consumer_group",
|
389
|
+
acl_resource_name="order-processors",
|
390
|
+
acl_resource_type="Group",
|
391
|
+
acl_principal="User:consumer-service",
|
392
|
+
acl_host="*",
|
393
|
+
acl_operation="Read",
|
394
|
+
acl_permission_type="Allow")
|
395
|
+
```
|
396
|
+
|
397
|
+
### Prefix-Based Access Control
|
398
|
+
|
399
|
+
```python
|
400
|
+
import pulumi
|
401
|
+
import pulumi_kafka as kafka
|
402
|
+
|
403
|
+
# Grant access to all topics with prefix "logs-"
|
404
|
+
logs_access = kafka.Acl("logs_access",
|
405
|
+
acl_resource_name="logs-",
|
406
|
+
acl_resource_type="Topic",
|
407
|
+
resource_pattern_type_filter="Prefixed",
|
408
|
+
acl_principal="User:log-aggregator",
|
409
|
+
acl_host="*",
|
410
|
+
acl_operation="Read",
|
411
|
+
acl_permission_type="Allow")
|
412
|
+
```
|
413
|
+
|
414
|
+
### Admin User with Full Access
|
415
|
+
|
416
|
+
```python
|
417
|
+
import pulumi
|
418
|
+
import pulumi_kafka as kafka
|
419
|
+
|
420
|
+
# Grant cluster-level admin access
|
421
|
+
admin_cluster = kafka.Acl("admin_cluster",
|
422
|
+
acl_resource_name="kafka-cluster",
|
423
|
+
acl_resource_type="Cluster",
|
424
|
+
acl_principal="User:admin",
|
425
|
+
acl_host="*",
|
426
|
+
acl_operation="All",
|
427
|
+
acl_permission_type="Allow")
|
428
|
+
```
|
429
|
+
|
430
|
+
## Common ACL Patterns
|
431
|
+
|
432
|
+
### Producer ACLs
|
433
|
+
Producers typically need:
|
434
|
+
- `Write` and `Describe` on topics
|
435
|
+
- `Write` on `TransactionalID` (for transactional producers)
|
436
|
+
- `IdempotentWrite` on `Cluster` (for idempotent producers)
|
437
|
+
|
438
|
+
### Consumer ACLs
|
439
|
+
Consumers typically need:
|
440
|
+
- `Read` on topics
|
441
|
+
- `Read` on consumer groups
|
442
|
+
- `Describe` on topics (optional, for metadata)
|
443
|
+
|
444
|
+
### Admin ACLs
|
445
|
+
Administrators typically need:
|
446
|
+
- `All` on `Cluster`
|
447
|
+
- Or specific operations like `Alter`, `AlterConfigs`, `Create`, `Delete`
|
448
|
+
|
449
|
+
> **Warning:** Be cautious with `Deny` ACLs as they take precedence over `Allow` ACLs. A deny rule will block access even if an allow rule exists.
|
450
|
+
|
451
|
+
## Import
|
452
|
+
|
453
|
+
Kafka ACLs can be imported using a pipe-delimited string containing all ACL properties:
|
454
|
+
|
455
|
+
Format: ${acl_principal}|${acl_host}|${acl_operation}|${acl_permission_type}|${resource_type}|${resource_name}|${resource_pattern_type_filter}
|
456
|
+
|
457
|
+
```sh
|
458
|
+
$ pulumi import kafka:index/acl:Acl example 'User:producer|*|Write|Allow|Topic|orders|Literal'
|
459
|
+
```
|
460
|
+
|
461
|
+
:param str resource_name: The name of the resource.
|
462
|
+
:param AclArgs args: The arguments to use to populate this resource's properties.
|
463
|
+
:param pulumi.ResourceOptions opts: Options for the resource.
|
464
|
+
"""
|
465
|
+
...
|
466
|
+
def __init__(__self__, resource_name: str, *args, **kwargs):
|
467
|
+
resource_args, opts = _utilities.get_resource_args_opts(AclArgs, pulumi.ResourceOptions, *args, **kwargs)
|
468
|
+
if resource_args is not None:
|
469
|
+
__self__._internal_init(resource_name, opts, **resource_args.__dict__)
|
470
|
+
else:
|
471
|
+
__self__._internal_init(resource_name, *args, **kwargs)
|
472
|
+
|
473
|
+
def _internal_init(__self__,
|
474
|
+
resource_name: str,
|
475
|
+
opts: Optional[pulumi.ResourceOptions] = None,
|
476
|
+
acl_host: Optional[pulumi.Input[_builtins.str]] = None,
|
477
|
+
acl_operation: Optional[pulumi.Input[_builtins.str]] = None,
|
478
|
+
acl_permission_type: Optional[pulumi.Input[_builtins.str]] = None,
|
479
|
+
acl_principal: Optional[pulumi.Input[_builtins.str]] = None,
|
480
|
+
acl_resource_name: Optional[pulumi.Input[_builtins.str]] = None,
|
481
|
+
acl_resource_type: Optional[pulumi.Input[_builtins.str]] = None,
|
482
|
+
resource_pattern_type_filter: Optional[pulumi.Input[_builtins.str]] = None,
|
483
|
+
__props__=None):
|
484
|
+
opts = pulumi.ResourceOptions.merge(_utilities.get_resource_opts_defaults(), opts)
|
485
|
+
if not isinstance(opts, pulumi.ResourceOptions):
|
486
|
+
raise TypeError('Expected resource options to be a ResourceOptions instance')
|
487
|
+
if opts.id is None:
|
488
|
+
if __props__ is not None:
|
489
|
+
raise TypeError('__props__ is only valid when passed in combination with a valid opts.id to get an existing resource')
|
490
|
+
__props__ = AclArgs.__new__(AclArgs)
|
491
|
+
|
492
|
+
if acl_host is None and not opts.urn:
|
493
|
+
raise TypeError("Missing required property 'acl_host'")
|
494
|
+
__props__.__dict__["acl_host"] = acl_host
|
495
|
+
if acl_operation is None and not opts.urn:
|
496
|
+
raise TypeError("Missing required property 'acl_operation'")
|
497
|
+
__props__.__dict__["acl_operation"] = acl_operation
|
498
|
+
if acl_permission_type is None and not opts.urn:
|
499
|
+
raise TypeError("Missing required property 'acl_permission_type'")
|
500
|
+
__props__.__dict__["acl_permission_type"] = acl_permission_type
|
501
|
+
if acl_principal is None and not opts.urn:
|
502
|
+
raise TypeError("Missing required property 'acl_principal'")
|
503
|
+
__props__.__dict__["acl_principal"] = acl_principal
|
504
|
+
if acl_resource_name is None and not opts.urn:
|
505
|
+
raise TypeError("Missing required property 'acl_resource_name'")
|
506
|
+
__props__.__dict__["acl_resource_name"] = acl_resource_name
|
507
|
+
if acl_resource_type is None and not opts.urn:
|
508
|
+
raise TypeError("Missing required property 'acl_resource_type'")
|
509
|
+
__props__.__dict__["acl_resource_type"] = acl_resource_type
|
510
|
+
__props__.__dict__["resource_pattern_type_filter"] = resource_pattern_type_filter
|
511
|
+
super(Acl, __self__).__init__(
|
512
|
+
'kafka:index/acl:Acl',
|
513
|
+
resource_name,
|
514
|
+
__props__,
|
515
|
+
opts)
|
516
|
+
|
517
|
+
@staticmethod
|
518
|
+
def get(resource_name: str,
|
519
|
+
id: pulumi.Input[str],
|
520
|
+
opts: Optional[pulumi.ResourceOptions] = None,
|
521
|
+
acl_host: Optional[pulumi.Input[_builtins.str]] = None,
|
522
|
+
acl_operation: Optional[pulumi.Input[_builtins.str]] = None,
|
523
|
+
acl_permission_type: Optional[pulumi.Input[_builtins.str]] = None,
|
524
|
+
acl_principal: Optional[pulumi.Input[_builtins.str]] = None,
|
525
|
+
acl_resource_name: Optional[pulumi.Input[_builtins.str]] = None,
|
526
|
+
acl_resource_type: Optional[pulumi.Input[_builtins.str]] = None,
|
527
|
+
resource_pattern_type_filter: Optional[pulumi.Input[_builtins.str]] = None) -> 'Acl':
|
528
|
+
"""
|
529
|
+
Get an existing Acl resource's state with the given name, id, and optional extra
|
530
|
+
properties used to qualify the lookup.
|
531
|
+
|
532
|
+
:param str resource_name: The unique name of the resulting resource.
|
533
|
+
:param pulumi.Input[str] id: The unique provider ID of the resource to lookup.
|
534
|
+
:param pulumi.ResourceOptions opts: Options for the resource.
|
535
|
+
:param pulumi.Input[_builtins.str] acl_resource_name: The name of the resource
|
536
|
+
"""
|
537
|
+
opts = pulumi.ResourceOptions.merge(opts, pulumi.ResourceOptions(id=id))
|
538
|
+
|
539
|
+
__props__ = _AclState.__new__(_AclState)
|
540
|
+
|
541
|
+
__props__.__dict__["acl_host"] = acl_host
|
542
|
+
__props__.__dict__["acl_operation"] = acl_operation
|
543
|
+
__props__.__dict__["acl_permission_type"] = acl_permission_type
|
544
|
+
__props__.__dict__["acl_principal"] = acl_principal
|
545
|
+
__props__.__dict__["acl_resource_name"] = acl_resource_name
|
546
|
+
__props__.__dict__["acl_resource_type"] = acl_resource_type
|
547
|
+
__props__.__dict__["resource_pattern_type_filter"] = resource_pattern_type_filter
|
548
|
+
return Acl(resource_name, opts=opts, __props__=__props__)
|
549
|
+
|
550
|
+
@_builtins.property
|
551
|
+
@pulumi.getter(name="aclHost")
|
552
|
+
def acl_host(self) -> pulumi.Output[_builtins.str]:
|
553
|
+
return pulumi.get(self, "acl_host")
|
554
|
+
|
555
|
+
@_builtins.property
|
556
|
+
@pulumi.getter(name="aclOperation")
|
557
|
+
def acl_operation(self) -> pulumi.Output[_builtins.str]:
|
558
|
+
return pulumi.get(self, "acl_operation")
|
559
|
+
|
560
|
+
@_builtins.property
|
561
|
+
@pulumi.getter(name="aclPermissionType")
|
562
|
+
def acl_permission_type(self) -> pulumi.Output[_builtins.str]:
|
563
|
+
return pulumi.get(self, "acl_permission_type")
|
564
|
+
|
565
|
+
@_builtins.property
|
566
|
+
@pulumi.getter(name="aclPrincipal")
|
567
|
+
def acl_principal(self) -> pulumi.Output[_builtins.str]:
|
568
|
+
return pulumi.get(self, "acl_principal")
|
569
|
+
|
570
|
+
@_builtins.property
|
571
|
+
@pulumi.getter(name="aclResourceName")
|
572
|
+
def acl_resource_name(self) -> pulumi.Output[_builtins.str]:
|
573
|
+
"""
|
574
|
+
The name of the resource
|
575
|
+
"""
|
576
|
+
return pulumi.get(self, "acl_resource_name")
|
577
|
+
|
578
|
+
@_builtins.property
|
579
|
+
@pulumi.getter(name="aclResourceType")
|
580
|
+
def acl_resource_type(self) -> pulumi.Output[_builtins.str]:
|
581
|
+
return pulumi.get(self, "acl_resource_type")
|
582
|
+
|
583
|
+
@_builtins.property
|
584
|
+
@pulumi.getter(name="resourcePatternTypeFilter")
|
585
|
+
def resource_pattern_type_filter(self) -> pulumi.Output[Optional[_builtins.str]]:
|
586
|
+
return pulumi.get(self, "resource_pattern_type_filter")
|
587
|
+
|
{pulumi_kafka-3.11.0a1753336924 → pulumi_kafka-3.11.0a1753501206}/pulumi_kafka/config/__init__.pyi
RENAMED
@@ -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
|