Skip to content

Commit c291fbe

Browse files
authored
Merge pull request #42 from d4rkstar/main
fix(milvus): milvus 2.5.2 permissions
2 parents 1e84f6a + 25a187f commit c291fbe

File tree

3 files changed

+69
-16
lines changed

3 files changed

+69
-16
lines changed

nuvolaris/milvus_admin_client.py

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@
1818
import logging
1919

2020
import nuvolaris.config as cfg
21+
# from pymilvus import MilvusClient, connections, db
2122
from nuvolaris.milvus_simple_client import MilvusSimpleClient as MilvusClient
22-
#from pymilvus import MilvusClient, connections, db
23+
2324

2425
class MilvusAdminClient:
2526
"""
@@ -33,6 +34,15 @@ def __init__(self, db_name="default"):
3334
self.milvus_url = f"http://{self.milvus_api_host}:{self.milvus_api_port}"
3435
self.milvus_admin_token = f"root:{self.admin_password}"
3536

37+
#self.global_privileges_v1 = ['CreateCollection', 'DropCollection', 'DescribeCollection', 'ShowCollections',
38+
# 'RenameCollection']
39+
self.global_privileges_v1 = []
40+
41+
# references:
42+
# https://milvus.io/docs/privilege_group.md
43+
# https://milvus.io/docs/grant_privileges.md#Grant-a-privilege-or-a-privilege-group-to-a-role
44+
self.global_privileges_v2 = ['CollectionAdmin','DatabaseAdmin']
45+
3646
def setup_user(self, username, password,database):
3747
"""
3848
Creates a user into MILVUS, creates a corresponding database
@@ -53,12 +63,11 @@ def setup_user(self, username, password,database):
5363
# rest of action are performed specifying the database
5464
client = MilvusClient(uri=self.milvus_url,token=self.milvus_admin_token, db_name=database)
5565
client.create_role(role_name=role,db_name=database)
56-
client.grant_privilege(role_name=role, object_type='Global', object_name='*', privilege='CreateCollection', db_name=database)
57-
client.grant_privilege(role_name=role, object_type='Global', object_name='*', privilege='DropCollection', db_name=database)
58-
client.grant_privilege(role_name=role, object_type='Global', object_name='*', privilege='DescribeCollection', db_name=database)
59-
client.grant_privilege(role_name=role, object_type='Global', object_name='*', privilege='ShowCollections', db_name=database)
60-
client.grant_privilege(role_name=role, object_type='Global', object_name='*', privilege='RenameCollection', db_name=database)
61-
client.grant_privilege(role_name=role, object_type='Collection', object_name='*', privilege='*', db_name=database)
66+
for priv in self.global_privileges_v1:
67+
client.grant_privilege(role_name=role, object_type='Global', object_name='*', privilege=priv, db_name=database)
68+
for priv in self.global_privileges_v2:
69+
client.grant_privilege_v2(role_name=role, object_type='Global', object_name='*', collection_name='*', privilege=priv, db_name=database)
70+
6271
client.grant_role(user_name=username,role_name=role,db_name=database)
6372
client.close()
6473
return True
@@ -82,7 +91,16 @@ def remove_user(self, username, database):
8291
client.drop_collection(collection_name=collection)
8392
client.close()
8493

85-
client = MilvusClient(uri=self.milvus_url,token=self.milvus_admin_token)
94+
client = MilvusClient(uri=self.milvus_url,token=self.milvus_admin_token)
95+
96+
for privilege in self.global_privileges_v1:
97+
client.revoke_privilege(role_name=role, object_type='Global', object_name='*', privilege=privilege,
98+
db_name=database)
99+
for privilege in self.global_privileges_v2:
100+
client.revoke_privilege_v2(role_name=role, object_type='Global', object_name='*', collection_name='*',
101+
privilege=privilege, db_name=database)
102+
103+
86104
client.drop_role(role_name=role,db_name=database)
87105
client.drop_user(user_name=username)
88106
client.drop_database(db_name=database)

nuvolaris/milvus_simple_client.py

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#
1818
from types import NoneType
1919
from typing import Optional
20+
from requests.exceptions import HTTPError
2021

2122
import requests
2223

@@ -29,6 +30,10 @@ def __init__(self, code: int, message: str):
2930
def __str__(self):
3031
return f"{self.message} ({self.code})"
3132

33+
class MilvusUnauthorizedException(MilvusSimpleException):
34+
def __init__(self):
35+
super().__init__(0, "Unauthorized")
36+
3237

3338
class MilvusSimpleClient:
3439

@@ -46,12 +51,17 @@ def _request(self, endpoint: str, json=None, method: str = "POST", api_level="v2
4651
if json is None:
4752
json = {}
4853
response = requests.request(method, url, headers=headers, json=json)
49-
response.raise_for_status()
50-
res = response.json()
51-
if type(res.get('data')) is not NoneType:
52-
return res['data']
53-
else:
54-
raise MilvusSimpleException(code=res.get('code'), message=res.get('message'))
54+
try:
55+
response.raise_for_status()
56+
res = response.json()
57+
if type(res.get('data')) is not NoneType:
58+
return res['data']
59+
else:
60+
raise MilvusSimpleException(code=res.get('code'), message=res.get('message'))
61+
except HTTPError as e:
62+
if e.response.status_code == 403:
63+
raise MilvusUnauthorizedException()
64+
5565

5666
def close(self):
5767
pass
@@ -162,6 +172,31 @@ def revoke_privilege(self, role_name: str, object_type: str, object_name: str, p
162172
payload["dbName"] = db_name
163173
return self._request(f"roles/revoke_privilege", json=payload)
164174

175+
176+
def grant_privilege_v2(self, role_name: str, object_type: str, object_name: str, collection_name: str, privilege: str, db_name: Optional[str] = None):
177+
payload = {
178+
"roleName": role_name,
179+
"objectType": object_type,
180+
"objectName": object_name,
181+
"privilege": privilege,
182+
"collectionName": collection_name,
183+
}
184+
if db_name is not None:
185+
payload["dbName"] = db_name
186+
return self._request(f"roles/grant_privilege_v2", json=payload)
187+
188+
def revoke_privilege_v2(self, role_name: str, object_type: str, object_name: str, collection_name: str, privilege: str, db_name: Optional[str] = None):
189+
payload = {
190+
"roleName": role_name,
191+
"objectType": object_type,
192+
"objectName": object_name,
193+
"privilege": privilege,
194+
"collectionName": collection_name,
195+
}
196+
if db_name is not None:
197+
payload["dbName"] = db_name
198+
return self._request(f"roles/revoke_privilege_v2", json=payload)
199+
165200
# Collection operations
166201

167202
def create_collection(self,

tests/kind/whisk.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,6 @@ spec:
173173
ledgers: 25
174174
replicas: 1
175175
password:
176-
root: x£VqD7G6712o
176+
root: An0therPa55
177177
etcd: 97Vk2{qe8o>S
178-
s3: 8_d$8zCrl7£m
178+
s3: 8_d$8zCrl7£m

0 commit comments

Comments
 (0)