Skip to content

Commit ae3cc64

Browse files
committed
chore: add XAPI SMAPIv3 API stubs
Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.tech>
1 parent abf7a3d commit ae3cc64

11 files changed

Lines changed: 535 additions & 1 deletion

File tree

‎pyproject.toml‎

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,47 @@ disable_error_code = [
6060
]
6161
disallow_untyped_defs = false
6262

63+
# To generate XAPI SMAPIv3 API stubs, run the following commands in an XCP-ng environment:
64+
#
65+
# # Clone xen-api.
66+
# yum install git
67+
# git clone https://github.com/xapi-project/xen-api
68+
# cd xen-api/
69+
#
70+
# # Init build env.
71+
# yum install opam gcc make
72+
# export OCAML_VERSION_FULL="4.14.2"
73+
# opam init
74+
# opam switch create xen-api ocaml-base-compiler.$OCAML_VERSION_FULL
75+
# eval $(opam env --switch=xen-api --set-switch)
76+
# opam repo add xs-opam https://github.com/xapi-project/xs-opam.git
77+
# opam repo remove default
78+
#
79+
# # Install deps.
80+
# opam install dune rpclib ppx_deriving_rpc rresult lwt fmt alcotest -y
81+
#
82+
# # Build.
83+
# dune build ocaml/xapi-storage
84+
#
85+
# # Build python API.
86+
# cd _build/default/ocaml/xapi-storage/python/
87+
# make
88+
#
89+
# # Clean env.
90+
# opam clean
91+
# rm -rf /root/.opam
92+
#
93+
# # Copy python dir in your dev env and then:
94+
# stubgen --include-private python/ -o <XCP_STORAGE_PATH>/stubs/
95+
# # Replace invalid return types caused by "raise Unimplemented" calls.
96+
# find <XCP_STORAGE_PATH>/stubs/xapi/ -name "*.pyi" -exec sed -i 's/ -> None:/:/g' {} +
97+
[[tool.mypy.overrides]]
98+
module = "xapi.*"
99+
disable_error_code = [
100+
"explicit-override",
101+
"no-untyped-def"
102+
]
103+
63104
[tool.pyrefly]
64105
python-version = "3.14"
65106
search-path = [".", "stubs"]
@@ -138,7 +179,7 @@ case-sensitive = false
138179
combine-as-imports = true
139180
force-sort-within-sections = true
140181
known-first-party = ["xcp_storage"]
141-
known-third-party = ["linstor"]
182+
known-third-party = ["linstor", "xapi"]
142183
lines-after-imports = 1
143184
order-by-type = false
144185
section-order = [

‎stubs/xapi/__init__.pyi‎

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import argparse
2+
from _typeshed import Incomplete
3+
4+
def success(result): ...
5+
def handle_exception(e, code=None, params=None): ...
6+
7+
class XenAPIException(Exception):
8+
code: Incomplete
9+
params: Incomplete
10+
def __init__(self, code, params): ...
11+
12+
class MissingDependency(Exception):
13+
missing: Incomplete
14+
def __init__(self, missing): ...
15+
def __str__(self) -> str: ...
16+
17+
class Rpc_light_failure(Exception):
18+
name: Incomplete
19+
args: Incomplete
20+
def __init__(self, name, args): ...
21+
def failure(self): ...
22+
23+
class Unimplemented(Rpc_light_failure):
24+
def __init__(self, name): ...
25+
26+
class InternalError(Rpc_light_failure):
27+
def __init__(self, error): ...
28+
29+
class UnmarshalException(InternalError):
30+
def __init__(self, thing, ty, desc): ...
31+
32+
class TypeError(InternalError):
33+
def __init__(self, expected, actual): ...
34+
35+
class UnknownMethod(InternalError):
36+
def __init__(self, name): ...
37+
38+
def is_long(x): ...
39+
40+
class ListAction(argparse.Action):
41+
def __call__(self, parser, namespace, values, option_string=None): ...

‎stubs/xapi/storage/__init__.pyi‎

Whitespace-only changes.

‎stubs/xapi/storage/api/__init__.pyi‎

Whitespace-only changes.

‎stubs/xapi/storage/api/v5/__init__.pyi‎

Whitespace-only changes.
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
from xapi import *
2+
from _typeshed import Incomplete
3+
4+
get_str = str
5+
long = int
6+
unicode = str
7+
str = bytes
8+
9+
class Datapath_server_dispatcher:
10+
_impl: Incomplete
11+
_dispatcher_dict: Incomplete
12+
def __init__(self, impl): ...
13+
def open(self, args): ...
14+
def attach(self, args): ...
15+
def activate(self, args): ...
16+
def activate_readonly(self, args): ...
17+
def import_activate(self, args): ...
18+
def deactivate(self, args): ...
19+
def detach(self, args): ...
20+
def close(self, args): ...
21+
def _dispatch(self, method, params): ...
22+
23+
class Datapath_skeleton:
24+
def __init__(self): ...
25+
def open(self, dbg, uri, persistent): ...
26+
def attach(self, dbg, uri, domain): ...
27+
def activate(self, dbg, uri, domain): ...
28+
def activate_readonly(self, dbg, uri, domain): ...
29+
def import_activate(self, dbg, uri, domain): ...
30+
def deactivate(self, dbg, uri, domain): ...
31+
def detach(self, dbg, uri, domain): ...
32+
def close(self, dbg, uri): ...
33+
34+
class Datapath_test:
35+
def __init__(self): ...
36+
def open(self, dbg, uri, persistent): ...
37+
def attach(self, dbg, uri, domain): ...
38+
def activate(self, dbg, uri, domain): ...
39+
def activate_readonly(self, dbg, uri, domain): ...
40+
def import_activate(self, dbg, uri, domain): ...
41+
def deactivate(self, dbg, uri, domain): ...
42+
def detach(self, dbg, uri, domain): ...
43+
def close(self, dbg, uri): ...
44+
45+
class Datapath_commandline:
46+
impl: Incomplete
47+
dispatcher: Incomplete
48+
def __init__(self, impl): ...
49+
def _parse_open(self): ...
50+
def _parse_attach(self): ...
51+
def _parse_activate(self): ...
52+
def _parse_activate_readonly(self): ...
53+
def _parse_import_activate(self): ...
54+
def _parse_deactivate(self): ...
55+
def _parse_detach(self): ...
56+
def _parse_close(self): ...
57+
def open(self): ...
58+
def attach(self): ...
59+
def activate(self): ...
60+
def activate_readonly(self): ...
61+
def import_activate(self): ...
62+
def deactivate(self): ...
63+
def detach(self): ...
64+
def close(self): ...
65+
66+
class Data_server_dispatcher:
67+
_impl: Incomplete
68+
_dispatcher_dict: Incomplete
69+
def __init__(self, impl): ...
70+
def copy(self, args): ...
71+
def mirror(self, args): ...
72+
def stat(self, args): ...
73+
def cancel(self, args): ...
74+
def destroy(self, args): ...
75+
def ls(self, args): ...
76+
def _dispatch(self, method, params): ...
77+
78+
class Data_skeleton:
79+
def __init__(self): ...
80+
def copy(self, dbg, uri, domain, remote, blocklist): ...
81+
def mirror(self, dbg, uri, domain, remote): ...
82+
def stat(self, dbg, operation): ...
83+
def cancel(self, dbg, operation): ...
84+
def destroy(self, dbg, operation): ...
85+
def ls(self, dbg): ...
86+
87+
class Data_test:
88+
def __init__(self): ...
89+
def copy(self, dbg, uri, domain, remote, blocklist): ...
90+
def mirror(self, dbg, uri, domain, remote): ...
91+
def stat(self, dbg, operation): ...
92+
def cancel(self, dbg, operation): ...
93+
def destroy(self, dbg, operation): ...
94+
def ls(self, dbg): ...
95+
96+
class Data_commandline:
97+
impl: Incomplete
98+
dispatcher: Incomplete
99+
def __init__(self, impl): ...
100+
def _parse_copy(self): ...
101+
def _parse_mirror(self): ...
102+
def _parse_stat(self): ...
103+
def _parse_cancel(self): ...
104+
def _parse_destroy(self): ...
105+
def _parse_ls(self): ...
106+
def copy(self): ...
107+
def mirror(self): ...
108+
def stat(self): ...
109+
def cancel(self): ...
110+
def destroy(self): ...
111+
def ls(self): ...
112+
113+
class datapath_server_dispatcher:
114+
Datapath: Incomplete
115+
Data: Incomplete
116+
_dispatcher_dict: Incomplete
117+
def __init__(self, Datapath=None, Data=None): ...
118+
def _dispatch(self, method, params): ...
119+
120+
class datapath_server_test(datapath_server_dispatcher):
121+
def __init__(self): ...
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
from xapi import *
2+
from _typeshed import Incomplete
3+
4+
get_str = str
5+
long = int
6+
unicode = str
7+
str = bytes
8+
9+
class Plugin_server_dispatcher:
10+
_impl: Incomplete
11+
_dispatcher_dict: Incomplete
12+
def __init__(self, impl): ...
13+
def query(self, args): ...
14+
def ls(self, args): ...
15+
def diagnostics(self, args): ...
16+
def _dispatch(self, method, params): ...
17+
18+
class Plugin_skeleton:
19+
def __init__(self): ...
20+
def query(self, dbg): ...
21+
def ls(self, dbg): ...
22+
def diagnostics(self, dbg): ...
23+
24+
class Plugin_test:
25+
def __init__(self): ...
26+
def query(self, dbg): ...
27+
def ls(self, dbg): ...
28+
def diagnostics(self, dbg): ...
29+
30+
class Plugin_commandline:
31+
impl: Incomplete
32+
dispatcher: Incomplete
33+
def __init__(self, impl): ...
34+
def _parse_query(self): ...
35+
def _parse_ls(self): ...
36+
def _parse_diagnostics(self): ...
37+
def query(self): ...
38+
def ls(self): ...
39+
def diagnostics(self): ...
40+
41+
class plugin_server_dispatcher:
42+
Plugin: Incomplete
43+
_dispatcher_dict: Incomplete
44+
def __init__(self, Plugin=None): ...
45+
def _dispatch(self, method, params): ...
46+
47+
class plugin_server_test(plugin_server_dispatcher):
48+
def __init__(self): ...

‎stubs/xapi/storage/api/v5/task.pyi‎

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
from xapi import *
2+
from _typeshed import Incomplete
3+
4+
get_str = str
5+
long = int
6+
unicode = str
7+
str = bytes
8+
9+
class Task_server_dispatcher:
10+
_impl: Incomplete
11+
_dispatcher_dict: Incomplete
12+
def __init__(self, impl): ...
13+
def stat(self, args): ...
14+
def cancel(self, args): ...
15+
def destroy(self, args): ...
16+
def ls(self, args): ...
17+
def _dispatch(self, method, params): ...
18+
19+
class Task_skeleton:
20+
def __init__(self): ...
21+
def stat(self, dbg, id): ...
22+
def cancel(self, dbg, id): ...
23+
def destroy(self, dbg, id): ...
24+
def ls(self, dbg): ...
25+
26+
class Task_test:
27+
def __init__(self): ...
28+
def stat(self, dbg, id): ...
29+
def cancel(self, dbg, id): ...
30+
def destroy(self, dbg, id): ...
31+
def ls(self, dbg): ...
32+
33+
class Task_commandline:
34+
impl: Incomplete
35+
dispatcher: Incomplete
36+
def __init__(self, impl): ...
37+
def _parse_stat(self): ...
38+
def _parse_cancel(self): ...
39+
def _parse_destroy(self): ...
40+
def _parse_ls(self): ...
41+
def stat(self): ...
42+
def cancel(self): ...
43+
def destroy(self): ...
44+
def ls(self): ...
45+
46+
class task_server_dispatcher:
47+
Task: Incomplete
48+
_dispatcher_dict: Incomplete
49+
def __init__(self, Task=None): ...
50+
def _dispatch(self, method, params): ...
51+
52+
class task_server_test(task_server_dispatcher):
53+
def __init__(self): ...

0 commit comments

Comments
 (0)