Skip to content
This repository was archived by the owner on Sep 22, 2023. It is now read-only.

Commit b6512e2

Browse files
authored
fix: Regression in "admin vfolders" command (#140)
1 parent fc29f08 commit b6512e2

File tree

3 files changed

+74
-17
lines changed

3 files changed

+74
-17
lines changed

changes/140.fix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix regression of the `admin vfolders` command since introduction of paginated GraphQL queries

src/ai/backend/client/cli/admin/vfolders.py

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,24 @@
55
from tabulate import tabulate
66

77
from . import admin
8-
from ...session import Session
8+
from ..pagination import (
9+
get_preferred_page_size,
10+
echo_via_pager,
11+
tabulate_items,
12+
)
913
from ..pretty import print_error
14+
from ...session import Session
15+
from ...exceptions import NoItems
1016

1117

1218
@admin.group(invoke_without_command=True)
1319
@click.pass_context
1420
@click.option('--access-key', type=str, default=None,
1521
help='Get vfolders for the given access key '
1622
'(only works if you are a super-admin)')
17-
def vfolders(ctx, access_key):
23+
@click.option('-g', '--group', type=str, default=None,
24+
help='Filter by group ID.')
25+
def vfolders(ctx, access_key, group):
1826
'''
1927
List and manage virtual folders.
2028
'''
@@ -23,25 +31,34 @@ def vfolders(ctx, access_key):
2331

2432
fields = [
2533
('Name', 'name'),
34+
('Host', 'host'),
35+
('Group', 'group'),
36+
('Creator', 'creator'),
37+
('Permission', 'permission'),
38+
('Usage Mode', 'usage_mode'),
39+
('Ownership Type', 'ownership_type'),
2640
('Created At', 'created_at'),
2741
('Last Used', 'last_used'),
28-
('Max Files', 'max_files'),
2942
('Max Size', 'max_size'),
3043
]
31-
if access_key is None:
32-
q = 'query { vfolders { $fields } }'
33-
else:
34-
q = 'query($ak:String) { vfolders(access_key:$ak) { $fields } }'
35-
q = q.replace('$fields', ' '.join(item[1] for item in fields))
36-
v = {'ak': access_key}
37-
with Session() as session:
38-
try:
39-
resp = session.Admin.query(q, v)
40-
except Exception as e:
41-
print_error(e)
42-
sys.exit(1)
43-
print(tabulate((item.values() for item in resp['vfolders']),
44-
headers=(item[0] for item in fields)))
44+
45+
try:
46+
with Session() as session:
47+
page_size = get_preferred_page_size()
48+
try:
49+
items = session.VFolder.paginated_list(
50+
group, access_key,
51+
fields=[f[1] for f in fields],
52+
page_size=page_size,
53+
)
54+
echo_via_pager(
55+
tabulate_items(items, fields)
56+
)
57+
except NoItems:
58+
print("There are no matching vfolders.")
59+
except Exception as e:
60+
print_error(e)
61+
sys.exit(1)
4562

4663

4764
@vfolders.command()

src/ai/backend/client/func/vfolder.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import asyncio
22
from pathlib import Path
33
from typing import (
4+
AsyncIterator,
45
Sequence,
56
Union
67
)
@@ -15,12 +16,23 @@
1516
from .base import api_function, BaseFunction
1617
from ..compat import current_loop
1718
from ..config import DEFAULT_CHUNK_SIZE, MAX_INFLIGHT_CHUNKS
19+
from ..pagination import generate_paginated_results
1820
from ..request import Request
1921

2022
__all__ = (
2123
'VFolder',
2224
)
2325

26+
_default_list_fields = (
27+
'host',
28+
'name',
29+
'created_at',
30+
'creator',
31+
'group',
32+
'permission',
33+
'ownership_type',
34+
)
35+
2436

2537
class VFolder(BaseFunction):
2638

@@ -70,6 +82,33 @@ async def list(cls, list_all=False):
7082
async with rqst.fetch() as resp:
7183
return await resp.json()
7284

85+
@api_function
86+
@classmethod
87+
async def paginated_list(
88+
cls,
89+
group: str = None,
90+
access_key: str = None,
91+
*,
92+
fields: Sequence[str] = _default_list_fields,
93+
page_size: int = 20,
94+
) -> AsyncIterator[dict]:
95+
"""
96+
Fetches the list of vfolders. Domain admins can only get domain vfolders.
97+
98+
:param group: Fetch vfolders in a specific group.
99+
:param fields: Additional per-vfolder query fields to fetch.
100+
"""
101+
async for item in generate_paginated_results(
102+
'vfolder_list',
103+
{
104+
'group_id': (group, 'UUID'),
105+
'access_key': (access_key, 'String'),
106+
},
107+
fields,
108+
page_size=page_size,
109+
):
110+
yield item
111+
73112
@api_function
74113
@classmethod
75114
async def list_hosts(cls):

0 commit comments

Comments
 (0)