openbayes-cli 0.4.5__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.
- bayes/__init__.py +0 -0
- bayes/client/__init__.py +0 -0
- bayes/client/base.py +20 -0
- bayes/client/dataset_version_client.py +91 -0
- bayes/client/gear_client.py +468 -0
- bayes/client/job_run_client.py +504 -0
- bayes/client/job_upload_client.py +114 -0
- bayes/client/org_client.py +67 -0
- bayes/client/resource_client.py +108 -0
- bayes/client/runtime_client.py +32 -0
- bayes/client/ssh_client.py +66 -0
- bayes/client/status_client.py +14 -0
- bayes/client/user_client.py +58 -0
- bayes/commands/__init__.py +0 -0
- bayes/commands/gear.py +691 -0
- bayes/commands/org.py +100 -0
- bayes/commands/ssh.py +70 -0
- bayes/error.py +9 -0
- bayes/model/__init__.py +0 -0
- bayes/model/dataset_version.py +14 -0
- bayes/model/file/__init__.py +0 -0
- bayes/model/file/data_bindings.py +42 -0
- bayes/model/file/openbayes_data.py +133 -0
- bayes/model/file/openbayes_gear.py +72 -0
- bayes/model/file/openbayes_ignore.py +75 -0
- bayes/model/file/openbayes_yaml.py +180 -0
- bayes/model/file/settings.py +157 -0
- bayes/model/party.py +35 -0
- bayes/model/resource.py +147 -0
- bayes/model/runtime.py +34 -0
- bayes/root.py +170 -0
- bayes/templates/openbayes_zh-Hans.yaml +134 -0
- bayes/templates/openbayesignore.yaml +3 -0
- bayes/usercases/__init__.py +0 -0
- bayes/usercases/archive_usecase.py +79 -0
- bayes/usercases/auth_usecase.py +35 -0
- bayes/usercases/dataset_version_usecase.py +61 -0
- bayes/usercases/disk_usecase.py +98 -0
- bayes/usercases/gear_download_usecese.py +113 -0
- bayes/usercases/gear_logs_usecase.py +44 -0
- bayes/usercases/gear_open_usecase.py +16 -0
- bayes/usercases/gear_run_usecase.py +123 -0
- bayes/usercases/gear_upload_usecase.py +248 -0
- bayes/usercases/gear_usecase.py +301 -0
- bayes/usercases/openbayes_data_usecase.py +73 -0
- bayes/usercases/org_usecase.py +85 -0
- bayes/usercases/resource_usecase.py +74 -0
- bayes/usercases/runtime_usecase.py +58 -0
- bayes/usercases/ssh_usecase.py +110 -0
- bayes/usercases/switch_usercase.py +19 -0
- bayes/utils.py +163 -0
- openbayes_cli-0.4.5.dist-info/METADATA +62 -0
- openbayes_cli-0.4.5.dist-info/RECORD +55 -0
- openbayes_cli-0.4.5.dist-info/WHEEL +4 -0
- openbayes_cli-0.4.5.dist-info/entry_points.txt +3 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
from gql.transport.exceptions import TransportQueryError
|
|
2
|
+
|
|
3
|
+
from bayes.client.base import BayesGQLClient
|
|
4
|
+
from bayes.error import Error
|
|
5
|
+
from bayes.model.resource import ResourceData, Quota, Limitations
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def get_resources(client: BayesGQLClient, partyId, type, labels):
|
|
9
|
+
query = """
|
|
10
|
+
query NormalClusterResources($partyId: String, $type: [DeployType], $labels: [String]) {
|
|
11
|
+
normalClusterResources(partyId: $partyId, type: $type, labels: $labels) {
|
|
12
|
+
name
|
|
13
|
+
memory
|
|
14
|
+
type
|
|
15
|
+
cpu {
|
|
16
|
+
type
|
|
17
|
+
millicores
|
|
18
|
+
count
|
|
19
|
+
}
|
|
20
|
+
disk {
|
|
21
|
+
type
|
|
22
|
+
size
|
|
23
|
+
}
|
|
24
|
+
gpu {
|
|
25
|
+
verboseName
|
|
26
|
+
vendor
|
|
27
|
+
type
|
|
28
|
+
name
|
|
29
|
+
mode
|
|
30
|
+
memory
|
|
31
|
+
group
|
|
32
|
+
description
|
|
33
|
+
count
|
|
34
|
+
}
|
|
35
|
+
verboseName
|
|
36
|
+
gpuResource
|
|
37
|
+
labels
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
"""
|
|
41
|
+
variables = {"partyId": partyId, "type": type, "labels": labels}
|
|
42
|
+
try:
|
|
43
|
+
response = client.exec(query, variables)
|
|
44
|
+
except TransportQueryError as e:
|
|
45
|
+
raise Error(e.errors[0]['message'] if e.errors else str(e))
|
|
46
|
+
|
|
47
|
+
resource_data_list = response.get("normalClusterResources", [])
|
|
48
|
+
if resource_data_list is None or not resource_data_list:
|
|
49
|
+
return None
|
|
50
|
+
|
|
51
|
+
return [ResourceData(**resource_data) for resource_data in resource_data_list]
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def get_resource_quota(client: BayesGQLClient, partyId):
|
|
55
|
+
query = """
|
|
56
|
+
query Quota($partyId: ID!) {
|
|
57
|
+
party(id: $partyId) {
|
|
58
|
+
quota {
|
|
59
|
+
computationQuota {
|
|
60
|
+
value {
|
|
61
|
+
availableMinutes
|
|
62
|
+
}
|
|
63
|
+
key
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
"""
|
|
69
|
+
variables = {"partyId": partyId}
|
|
70
|
+
try:
|
|
71
|
+
response = client.exec(query, variables)
|
|
72
|
+
except TransportQueryError as e:
|
|
73
|
+
raise Error(e.errors[0]['message'] if e.errors else str(e))
|
|
74
|
+
|
|
75
|
+
result = response.get("party", {}).get("quota", {})
|
|
76
|
+
if not result:
|
|
77
|
+
return None
|
|
78
|
+
|
|
79
|
+
return Quota(**result)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def get_resource_limitation(client: BayesGQLClient, partyId):
|
|
83
|
+
query = """
|
|
84
|
+
query Resources($partyId: ID!) {
|
|
85
|
+
party(id: $partyId) {
|
|
86
|
+
limitations {
|
|
87
|
+
resources {
|
|
88
|
+
key
|
|
89
|
+
value {
|
|
90
|
+
current
|
|
91
|
+
limit
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
"""
|
|
98
|
+
variables = {"partyId": partyId}
|
|
99
|
+
try:
|
|
100
|
+
response = client.exec(query, variables)
|
|
101
|
+
except TransportQueryError as e:
|
|
102
|
+
raise Error(e.errors[0]['message'] if e.errors else str(e))
|
|
103
|
+
|
|
104
|
+
result = response.get("party", {}).get("limitations", {})
|
|
105
|
+
if not result:
|
|
106
|
+
return None
|
|
107
|
+
|
|
108
|
+
return Limitations(**result)
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from gql.transport.exceptions import TransportQueryError
|
|
2
|
+
|
|
3
|
+
from bayes.client.base import BayesGQLClient
|
|
4
|
+
from bayes.error import Error
|
|
5
|
+
from bayes.model.runtime import ClusterRuntime
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def get_runtimes(client: BayesGQLClient, partyId, type, labels, runtimeType):
|
|
9
|
+
query = """
|
|
10
|
+
query NormalClusterRuntimes($partyId: String, $type: [DeployType], $labels: [String!], $runtimeType: [RuntimeType]) {
|
|
11
|
+
normalClusterRuntimes(partyId: $partyId, type: $type, labels: $labels, runtimeType: $runtimeType) {
|
|
12
|
+
framework
|
|
13
|
+
name
|
|
14
|
+
version
|
|
15
|
+
type
|
|
16
|
+
device
|
|
17
|
+
deprecated
|
|
18
|
+
labels
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
"""
|
|
22
|
+
variables = {"partyId": partyId, "type": type, "labels": labels, "runtimeType": runtimeType}
|
|
23
|
+
try:
|
|
24
|
+
response = client.exec(query, variables)
|
|
25
|
+
except TransportQueryError as e:
|
|
26
|
+
raise Error(e.errors[0]['message'] if e.errors else str(e))
|
|
27
|
+
|
|
28
|
+
runtime_data_list = response.get("normalClusterRuntimes", [])
|
|
29
|
+
if runtime_data_list is None or not runtime_data_list:
|
|
30
|
+
return None
|
|
31
|
+
|
|
32
|
+
return [ClusterRuntime(**runtime_data) for runtime_data in runtime_data_list]
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
from datetime import datetime
|
|
3
|
+
|
|
4
|
+
from gql.transport.exceptions import TransportQueryError
|
|
5
|
+
from pydantic import BaseModel
|
|
6
|
+
|
|
7
|
+
from bayes.client.base import BayesGQLClient
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class SSHKey(BaseModel):
|
|
11
|
+
id: int
|
|
12
|
+
name: str
|
|
13
|
+
fingerprint: str
|
|
14
|
+
createdAt: datetime
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def get_keys(client: BayesGQLClient, username: str):
|
|
18
|
+
query = """
|
|
19
|
+
query Keys($userId: String!) {
|
|
20
|
+
keys(userId: $userId) {
|
|
21
|
+
id
|
|
22
|
+
name
|
|
23
|
+
fingerprint
|
|
24
|
+
createdAt
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
"""
|
|
28
|
+
variables = {"userId": username}
|
|
29
|
+
try:
|
|
30
|
+
response = client.exec(query, variables)
|
|
31
|
+
except TransportQueryError as e:
|
|
32
|
+
error_message = e.errors[0]['message'] if e.errors else str(e)
|
|
33
|
+
print(error_message, file=sys.stderr)
|
|
34
|
+
sys.exit(1)
|
|
35
|
+
|
|
36
|
+
keys_list = response.get("keys", [])
|
|
37
|
+
if keys_list is None or not keys_list:
|
|
38
|
+
return None
|
|
39
|
+
|
|
40
|
+
return [SSHKey(**key) for key in keys_list]
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def create_key(client: BayesGQLClient, userId, name, content):
|
|
44
|
+
query = """
|
|
45
|
+
mutation CreateSSHKey($userId: String!, $name: String!, $content: String!) {
|
|
46
|
+
createSSHKey(userId: $userId, name: $name, content: $content) {
|
|
47
|
+
id
|
|
48
|
+
name
|
|
49
|
+
fingerprint
|
|
50
|
+
createdAt
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
"""
|
|
54
|
+
variables = {"userId": userId, "name": name, "content": content}
|
|
55
|
+
try:
|
|
56
|
+
response = client.exec(query, variables)
|
|
57
|
+
except TransportQueryError as e:
|
|
58
|
+
error_message = e.errors[0]['message'] if e.errors else str(e)
|
|
59
|
+
print(error_message, file=sys.stderr)
|
|
60
|
+
sys.exit(1)
|
|
61
|
+
|
|
62
|
+
result = response.get("createSSHKey")
|
|
63
|
+
if result is None:
|
|
64
|
+
raise Exception("create SSHKey result is none")
|
|
65
|
+
|
|
66
|
+
return SSHKey(**result)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from .base import BayesGQLClient
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def health_check(endpoint):
|
|
5
|
+
client = BayesGQLClient(endpoint, None)
|
|
6
|
+
query = """
|
|
7
|
+
query { __typename }
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
try:
|
|
11
|
+
response = client.exec(query)
|
|
12
|
+
return response is not None
|
|
13
|
+
except Exception as e:
|
|
14
|
+
return False
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
from gql.transport.exceptions import TransportQueryError
|
|
2
|
+
|
|
3
|
+
from .base import BayesGQLClient
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel
|
|
6
|
+
|
|
7
|
+
from ..error import Error
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class LoginModel(BaseModel):
|
|
11
|
+
email: str
|
|
12
|
+
token: str
|
|
13
|
+
username: str
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def login(client: BayesGQLClient, username: str, password: str) -> LoginModel:
|
|
17
|
+
query = """
|
|
18
|
+
mutation Login($username: String!, $password: String!) {
|
|
19
|
+
login(username: $username, password: $password) {
|
|
20
|
+
email
|
|
21
|
+
token
|
|
22
|
+
username
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
"""
|
|
26
|
+
variables = {"username": username, "password": password}
|
|
27
|
+
try:
|
|
28
|
+
response = client.exec(query, variables)
|
|
29
|
+
except TransportQueryError as e:
|
|
30
|
+
raise Error(e.errors[0]['message'] if e.errors else str(e))
|
|
31
|
+
|
|
32
|
+
login_data = response.get("login")
|
|
33
|
+
if login_data is None:
|
|
34
|
+
raise Error("Login failed: Unexpected response format")
|
|
35
|
+
|
|
36
|
+
return LoginModel(**login_data)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def login_with_token(client: BayesGQLClient, token):
|
|
40
|
+
query = """
|
|
41
|
+
query LoginWithToken($token: String!) {
|
|
42
|
+
loginWithToken(token: $token) {
|
|
43
|
+
email
|
|
44
|
+
username
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
"""
|
|
48
|
+
variables = {"token": token}
|
|
49
|
+
try:
|
|
50
|
+
response = client.exec(query, variables)
|
|
51
|
+
except TransportQueryError as e:
|
|
52
|
+
raise Error(e.errors[0]['message'] if e.errors else str(e))
|
|
53
|
+
|
|
54
|
+
login_data = response.get("loginWithToken")
|
|
55
|
+
if login_data is None:
|
|
56
|
+
raise Error("Login failed: Unexpected response format")
|
|
57
|
+
|
|
58
|
+
return LoginModel(token=token, **login_data)
|
|
File without changes
|