Skip to content

Commit 373dc16

Browse files
committed
Add backup permissions to Roles and filter on collection.
Up to know backup permissions could be filter on backend however it has been decided to filter on collection name.
1 parent 43e12ac commit 373dc16

File tree

4 files changed

+50
-17
lines changed

4 files changed

+50
-17
lines changed

.github/workflows/main.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ env:
1717
WEAVIATE_125: 1.25.24
1818
WEAVIATE_126: 1.26.8
1919
WEAVIATE_127: 1.27.1
20-
WEAVIATE_128: 1.28.0-dev-86bd591
20+
WEAVIATE_128: 1.28.0-dev-a6402ab
2121

2222
jobs:
2323
lint-and-format:
@@ -418,4 +418,4 @@ jobs:
418418
with:
419419
generate_release_notes: true
420420
draft: true
421-
files: dist/*.whl
421+
files: dist/*.whl

.pre-commit-config.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ repos:
1313
- id: trailing-whitespace
1414

1515
- repo: https://github.com/myint/autoflake
16-
rev: v1.4
16+
rev: v2.2.1 # autoflake v2.2.1 is the latest version that supports Python 3.12
1717
hooks:
1818
- id: autoflake
1919
args: [--in-place, --remove-all-unused-imports, --exclude=weaviate/proto/*]
@@ -36,13 +36,13 @@ repos:
3636
]
3737
files: '^weaviate/collections'
3838

39-
- repo: local
40-
hooks:
39+
- repo: local
40+
hooks:
4141
- id: mypy
4242
name: mypy
4343
entry: ./run-mypy.sh
4444
language: python
45-
language_version: "3.11"
45+
language_version: "3.12"
4646
# use require_serial so that script
4747
# is only called once per commit
4848
require_serial: true

integration/test_rbac.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
Role,
88
ConfigPermission,
99
RolesPermission,
10+
BackupsPermission,
1011
)
1112

1213
RBAC_PORTS = (8092, 50063)
@@ -27,6 +28,7 @@
2728
],
2829
roles_permissions=None,
2930
data_permissions=None,
31+
backups_permissions=None,
3032
),
3133
),
3234
(
@@ -38,6 +40,21 @@
3840
config_permissions=None,
3941
roles_permissions=[RolesPermission(role="*", action=RBAC.actions.roles.MANAGE)],
4042
data_permissions=None,
43+
backups_permissions=None,
44+
),
45+
),
46+
(
47+
RBAC.permissions.backups.manage(collection="Test"),
48+
Role(
49+
name="ManageAllBackups",
50+
cluster_actions=None,
51+
users_permissions=None,
52+
config_permissions=None,
53+
roles_permissions=None,
54+
data_permissions=None,
55+
backups_permissions=[
56+
BackupsPermission(collection="Test", action=RBAC.actions.backups.MANAGE)
57+
],
4158
),
4259
),
4360
],

weaviate/rbac/models.py

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88

99
class PermissionBackup(TypedDict):
10-
backend: str
10+
collection: str
1111

1212

1313
class WeaviatePermission(TypedDict):
@@ -99,7 +99,7 @@ def _to_weaviate(self) -> WeaviatePermission:
9999
return {
100100
"action": self.action,
101101
"backup": {
102-
"backend": "*",
102+
"collection": "*",
103103
},
104104
"collection": self.collection,
105105
"role": "*",
@@ -116,7 +116,7 @@ def _to_weaviate(self) -> WeaviatePermission:
116116
return {
117117
"action": self.action,
118118
"backup": {
119-
"backend": "*",
119+
"collection": "*",
120120
},
121121
"collection": "*",
122122
"role": self.role,
@@ -133,7 +133,7 @@ def _to_weaviate(self) -> WeaviatePermission:
133133
return {
134134
"action": self.action,
135135
"backup": {
136-
"backend": "*",
136+
"collection": "*",
137137
},
138138
"user": self.user,
139139
"role": "*",
@@ -143,7 +143,7 @@ def _to_weaviate(self) -> WeaviatePermission:
143143

144144

145145
class _BackupsPermission(_Permission):
146-
backend: str
146+
collection: str
147147
action: BackupsAction
148148

149149
def _to_weaviate(self) -> WeaviatePermission:
@@ -154,7 +154,7 @@ def _to_weaviate(self) -> WeaviatePermission:
154154
"user": "*",
155155
"collection": "*",
156156
"backup": {
157-
"backend": self.backend,
157+
"collection": self.collection,
158158
},
159159
}
160160

@@ -166,7 +166,7 @@ def _to_weaviate(self) -> WeaviatePermission:
166166
return {
167167
"action": self.action,
168168
"backup": {
169-
"backend": "*",
169+
"collection": "*",
170170
},
171171
"role": "*",
172172
"tenant": "*",
@@ -184,7 +184,7 @@ def _to_weaviate(self) -> WeaviatePermission:
184184
return {
185185
"action": self.action,
186186
"backup": {
187-
"backend": "*",
187+
"collection": "*",
188188
},
189189
"collection": self.collection,
190190
"role": "*",
@@ -218,6 +218,12 @@ class UsersPermission:
218218
action: UsersAction
219219

220220

221+
@dataclass
222+
class BackupsPermission:
223+
collection: str
224+
action: BackupsAction
225+
226+
221227
@dataclass
222228
class Role:
223229
name: str
@@ -226,6 +232,7 @@ class Role:
226232
data_permissions: Optional[List[DataPermission]]
227233
roles_permissions: Optional[List[RolesPermission]]
228234
users_permissions: Optional[List[UsersPermission]]
235+
backups_permissions: Optional[List[BackupsPermission]]
229236

230237
@classmethod
231238
def _from_weaviate_role(cls, role: WeaviateRole) -> "Role":
@@ -234,6 +241,7 @@ def _from_weaviate_role(cls, role: WeaviateRole) -> "Role":
234241
config_permissions: List[ConfigPermission] = []
235242
roles_permissions: List[RolesPermission] = []
236243
data_permissions: List[DataPermission] = []
244+
backups_permissions: List[BackupsPermission] = []
237245

238246
for permission in role["permissions"]:
239247
if permission["action"] in ClusterAction.values():
@@ -265,6 +273,13 @@ def _from_weaviate_role(cls, role: WeaviateRole) -> "Role":
265273
action=DataAction(permission["action"]),
266274
)
267275
)
276+
elif permission["action"] in BackupsAction.values():
277+
backups_permissions.append(
278+
BackupsPermission(
279+
collection=permission["backup"]["collection"],
280+
action=BackupsAction(permission["action"]),
281+
)
282+
)
268283
else:
269284
raise ValueError(
270285
f"The actions of role {role['name']} are mixed between levels somehow!"
@@ -275,7 +290,8 @@ def _from_weaviate_role(cls, role: WeaviateRole) -> "Role":
275290
users_permissions=up if len(up := users_permissions) > 0 else None,
276291
config_permissions=cp if len(cp := config_permissions) > 0 else None,
277292
roles_permissions=rp if len(rp := roles_permissions) > 0 else None,
278-
data_permissions=(dp if len(dp := data_permissions) > 0 else None),
293+
data_permissions=dp if len(dp := data_permissions) > 0 else None,
294+
backups_permissions=bp if len(bp := backups_permissions) > 0 else None,
279295
)
280296

281297

@@ -354,8 +370,8 @@ def manage() -> _ClusterPermission:
354370

355371
class _BackupsFactory:
356372
@staticmethod
357-
def manage(*, backend: Optional[str] = None) -> _BackupsPermission:
358-
return _BackupsPermission(backend=backend or "*", action=BackupsAction.MANAGE)
373+
def manage(*, collection: Optional[str] = None) -> _BackupsPermission:
374+
return _BackupsPermission(collection=collection or "*", action=BackupsAction.MANAGE)
359375

360376

361377
class ActionsFactory:

0 commit comments

Comments
 (0)