Skip to content

Commit df41312

Browse files
committed
Add first version
The API coverage is incomplete for now. Some opinionated choices were made for a more "pythonic" approach compared to the C library. Signed-off-by: Robin Jarry <[email protected]>
1 parent f3333d8 commit df41312

20 files changed

+3425
-0
lines changed

.editorconfig

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# ex: ft=dosini
2+
3+
root = true
4+
5+
[*]
6+
end_of_line = lf
7+
insert_final_newline = true
8+
charset = utf-8
9+
10+
[*.py]
11+
indent_style = space
12+
indent_size = 4
13+
max_line_length = 88
14+
15+
[*.{yang,yml}]
16+
indent_style = space
17+
indent_size = 2
18+
19+
[*.rst]
20+
indent_style = space
21+
indent_size = 3
22+
23+
[Makefile]
24+
indent_style = tabs
25+
indent_size = tab
26+
27+
[*.sh]
28+
indent_style = tabs
29+
indent_size = tab
30+
31+
[*.{h,c}]
32+
indent_style = tabs
33+
indent_size = tab

.gitattributes

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
setup.py export-subst
2+
.gitattributes export-ignore
3+
.gitignore export-ignore

.gitignore

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
__pycache__/
2+
*.py[cod]
3+
*.so
4+
/build/
5+
/dist/
6+
/*.egg-info/
7+
/.tox/
8+
/.eggs/

MANIFEST.in

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
include README.rst
2+
include cffi/build.py
3+
include cffi/cdefs.h
4+
include pyproject.toml
5+
include setup.cfg
6+
include setup.py
7+
include sysrepo/*.py
8+
include sysrepo/py.typed

README.rst

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
==============
2+
sysrepo-python
3+
==============

cffi/build.py

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Copyright (c) 2020 6WIND S.A.
2+
# SPDX-License-Identifier: BSD-3-Clause
3+
4+
import os
5+
import shlex
6+
7+
import cffi
8+
9+
10+
HERE = os.path.dirname(__file__)
11+
12+
BUILDER = cffi.FFI()
13+
with open(os.path.join(HERE, "cdefs.h")) as f:
14+
BUILDER.cdef(f.read())
15+
16+
HEADERS = os.environ.get("SYSREPO_HEADERS", "").strip().split(":")
17+
LIBRARIES = os.environ.get("SYSREPO_LIBRARIES", "").strip().split(":")
18+
EXTRA_CFLAGS = ["-Werror", "-std=c99"]
19+
EXTRA_CFLAGS += shlex.split(os.environ.get("SYSREPO_EXTRA_CFLAGS", ""))
20+
EXTRA_LDFLAGS = shlex.split(os.environ.get("SYSREPO_EXTRA_LDFLAGS", ""))
21+
22+
BUILDER.set_source(
23+
"_sysrepo",
24+
"#include <sysrepo.h>",
25+
libraries=["sysrepo", "yang"],
26+
extra_compile_args=EXTRA_CFLAGS,
27+
extra_link_args=EXTRA_LDFLAGS,
28+
include_dirs=HEADERS,
29+
library_dirs=LIBRARIES,
30+
py_limited_api=False,
31+
)
32+
33+
if __name__ == "__main__":
34+
BUILDER.compile()

cffi/cdefs.h

+244
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,244 @@
1+
/*
2+
* Copyright (c) 2020 6WIND S.A.
3+
* SPDX-License-Identifier: BSD-3-Clause
4+
*/
5+
6+
typedef enum sr_error_e {
7+
SR_ERR_OK,
8+
SR_ERR_INVAL_ARG,
9+
SR_ERR_LY,
10+
SR_ERR_SYS,
11+
SR_ERR_NOMEM,
12+
SR_ERR_NOT_FOUND,
13+
SR_ERR_EXISTS,
14+
SR_ERR_INTERNAL,
15+
SR_ERR_UNSUPPORTED,
16+
SR_ERR_VALIDATION_FAILED,
17+
SR_ERR_OPERATION_FAILED,
18+
SR_ERR_UNAUTHORIZED,
19+
SR_ERR_LOCKED,
20+
SR_ERR_TIME_OUT,
21+
SR_ERR_CALLBACK_FAILED,
22+
SR_ERR_CALLBACK_SHELVE,
23+
...
24+
} sr_error_t;
25+
26+
const char *sr_strerror(int);
27+
28+
typedef enum {
29+
SR_LL_NONE,
30+
SR_LL_ERR,
31+
SR_LL_WRN,
32+
SR_LL_INF,
33+
SR_LL_DBG,
34+
...
35+
} sr_log_level_t;
36+
37+
extern "Python" void srpy_log_cb(sr_log_level_t, const char *);
38+
void sr_log_set_cb(void (*)(sr_log_level_t, const char *));
39+
40+
typedef struct sr_conn_ctx_s sr_conn_ctx_t;
41+
typedef struct sr_session_ctx_s sr_session_ctx_t;
42+
typedef enum sr_conn_flag_e {
43+
SR_CONN_CACHE_RUNNING,
44+
SR_CONN_NO_SCHED_CHANGES,
45+
SR_CONN_ERR_ON_SCHED_FAIL,
46+
...
47+
} sr_conn_flag_t;
48+
typedef uint32_t sr_conn_options_t;
49+
typedef enum sr_datastore_e {
50+
SR_DS_STARTUP,
51+
SR_DS_RUNNING,
52+
SR_DS_CANDIDATE,
53+
SR_DS_OPERATIONAL,
54+
...
55+
} sr_datastore_t;
56+
typedef struct sr_error_info_msg_s {
57+
char *message;
58+
char *xpath;
59+
} sr_error_info_msg_t;
60+
typedef struct sr_error_info_s {
61+
sr_error_t err_code;
62+
sr_error_info_msg_t *err;
63+
size_t err_count;
64+
} sr_error_info_t;
65+
66+
/* forward declarations from libyang */
67+
struct ly_ctx;
68+
struct lyd_node;
69+
70+
int sr_connect(const sr_conn_options_t, sr_conn_ctx_t **);
71+
int sr_disconnect(sr_conn_ctx_t *);
72+
const struct ly_ctx *sr_get_context(sr_conn_ctx_t *);
73+
int sr_install_module(sr_conn_ctx_t *, const char *, const char *, const char **, int);
74+
int sr_remove_module(sr_conn_ctx_t *, const char *);
75+
int sr_update_module(sr_conn_ctx_t *, const char *, const char *);
76+
int sr_enable_module_feature(sr_conn_ctx_t *, const char *, const char *);
77+
int sr_disable_module_feature(sr_conn_ctx_t *, const char *, const char *);
78+
79+
int sr_session_start(sr_conn_ctx_t *, const sr_datastore_t, sr_session_ctx_t **);
80+
int sr_session_stop(sr_session_ctx_t *);
81+
int sr_session_switch_ds(sr_session_ctx_t *, sr_datastore_t);
82+
sr_datastore_t sr_session_get_ds(sr_session_ctx_t *);
83+
sr_conn_ctx_t *sr_session_get_connection(sr_session_ctx_t *);
84+
int sr_get_error(sr_session_ctx_t *, const sr_error_info_t **);
85+
int sr_set_error(sr_session_ctx_t *, const char *, const char *, ...);
86+
87+
typedef enum sr_type_e {
88+
SR_UNKNOWN_T,
89+
SR_LIST_T,
90+
SR_CONTAINER_T,
91+
SR_CONTAINER_PRESENCE_T,
92+
SR_LEAF_EMPTY_T,
93+
SR_BINARY_T,
94+
SR_BITS_T,
95+
SR_BOOL_T,
96+
SR_DECIMAL64_T,
97+
SR_ENUM_T,
98+
SR_IDENTITYREF_T,
99+
SR_INSTANCEID_T,
100+
SR_INT8_T,
101+
SR_INT16_T,
102+
SR_INT32_T,
103+
SR_INT64_T,
104+
SR_STRING_T,
105+
SR_UINT8_T,
106+
SR_UINT16_T,
107+
SR_UINT32_T,
108+
SR_UINT64_T,
109+
SR_ANYXML_T,
110+
SR_ANYDATA_T,
111+
...
112+
} sr_type_t;
113+
typedef union sr_data_u {
114+
char *binary_val;
115+
char *bits_val;
116+
bool bool_val;
117+
double decimal64_val;
118+
char *enum_val;
119+
char *identityref_val;
120+
char *instanceid_val;
121+
int8_t int8_val;
122+
int16_t int16_val;
123+
int32_t int32_val;
124+
int64_t int64_val;
125+
char *string_val;
126+
uint8_t uint8_val;
127+
uint16_t uint16_val;
128+
uint32_t uint32_val;
129+
uint64_t uint64_val;
130+
char *anyxml_val;
131+
char *anydata_val;
132+
...;
133+
} sr_data_t;
134+
typedef struct sr_val_s {
135+
char *xpath;
136+
sr_type_t type;
137+
sr_data_t data;
138+
...;
139+
} sr_val_t;
140+
typedef enum sr_edit_flag_e {
141+
SR_EDIT_NON_RECURSIVE,
142+
SR_EDIT_STRICT,
143+
SR_EDIT_ISOLATE,
144+
...
145+
} sr_edit_flag_t;
146+
typedef uint32_t sr_edit_options_t;
147+
typedef enum sr_get_oper_flag_e {
148+
SR_OPER_NO_STATE,
149+
SR_OPER_NO_CONFIG,
150+
SR_OPER_NO_SUBS,
151+
SR_OPER_NO_STORED,
152+
...
153+
} sr_get_oper_flag_t;
154+
typedef uint32_t sr_get_oper_options_t;
155+
156+
void sr_free_val(sr_val_t *);
157+
void sr_free_values(sr_val_t *, size_t);
158+
159+
int sr_get_item(sr_session_ctx_t *, const char *, uint32_t, sr_val_t **);
160+
int sr_get_items(sr_session_ctx_t *, const char *, uint32_t,
161+
const sr_get_oper_options_t, sr_val_t **, size_t *);
162+
int sr_get_data(sr_session_ctx_t *, const char *, uint32_t, uint32_t,
163+
const sr_get_oper_options_t, struct lyd_node **);
164+
int sr_rpc_send_tree(
165+
sr_session_ctx_t *, struct lyd_node *, uint32_t, struct lyd_node **);
166+
167+
int sr_set_item_str(sr_session_ctx_t *, const char *, const char *, const char *, const sr_edit_options_t);
168+
int sr_delete_item(sr_session_ctx_t *, const char *, const sr_edit_options_t);
169+
int sr_edit_batch(sr_session_ctx_t *, const struct lyd_node *, const char *);
170+
int sr_replace_config(sr_session_ctx_t *, const char *, struct lyd_node *, uint32_t, int);
171+
int sr_validate(sr_session_ctx_t *, const char *, uint32_t);
172+
int sr_apply_changes(sr_session_ctx_t *, uint32_t, int);
173+
int sr_discard_changes(sr_session_ctx_t *);
174+
175+
typedef enum sr_subscr_flag_e {
176+
SR_SUBSCR_CTX_REUSE,
177+
SR_SUBSCR_NO_THREAD,
178+
SR_SUBSCR_PASSIVE,
179+
SR_SUBSCR_DONE_ONLY,
180+
SR_SUBSCR_ENABLED,
181+
SR_SUBSCR_UPDATE,
182+
SR_SUBSCR_UNLOCKED,
183+
...
184+
} sr_subscr_flag_t;
185+
186+
typedef struct sr_subscription_ctx_s sr_subscription_ctx_t;
187+
typedef uint32_t sr_subscr_options_t;
188+
189+
int sr_get_event_pipe(sr_subscription_ctx_t *, int *);
190+
typedef int... time_t;
191+
int sr_process_events(sr_subscription_ctx_t *, sr_session_ctx_t *, time_t *);
192+
int sr_unsubscribe(sr_subscription_ctx_t *);
193+
194+
typedef enum sr_event_e {
195+
SR_EV_UPDATE,
196+
SR_EV_CHANGE,
197+
SR_EV_DONE,
198+
SR_EV_ABORT,
199+
SR_EV_ENABLED,
200+
SR_EV_RPC,
201+
...
202+
} sr_event_t;
203+
typedef enum sr_change_oper_e {
204+
SR_OP_CREATED,
205+
SR_OP_MODIFIED,
206+
SR_OP_DELETED,
207+
SR_OP_MOVED,
208+
...
209+
} sr_change_oper_t;
210+
typedef struct sr_change_iter_s sr_change_iter_t;
211+
int sr_get_changes_iter(sr_session_ctx_t *, const char *, sr_change_iter_t **);
212+
int sr_get_change_next(
213+
sr_session_ctx_t *, sr_change_iter_t *, sr_change_oper_t *,
214+
sr_val_t **, sr_val_t **);
215+
int sr_get_change_tree_next(
216+
sr_session_ctx_t *, sr_change_iter_t *, sr_change_oper_t *,
217+
const struct lyd_node **, const char **prev_val,
218+
const char **prev_list, bool *prev_dflt);
219+
void sr_free_change_iter(sr_change_iter_t *);
220+
221+
222+
extern "Python" int srpy_module_change_cb(
223+
sr_session_ctx_t *, const char *module, const char *xpath,
224+
sr_event_t, uint32_t req_id, void *priv);
225+
int sr_module_change_subscribe(
226+
sr_session_ctx_t *, const char *module, const char *xpath,
227+
int (*)(sr_session_ctx_t *, const char *, const char *, sr_event_t, uint32_t, void *),
228+
void *priv, uint32_t priority, sr_subscr_options_t, sr_subscription_ctx_t **);
229+
230+
extern "Python" int srpy_rpc_tree_cb(
231+
sr_session_ctx_t *, const char *, const struct lyd_node *input,
232+
sr_event_t, uint32_t req_id, struct lyd_node *output, void *priv);
233+
int sr_rpc_subscribe_tree(
234+
sr_session_ctx_t *, const char *xpath,
235+
int (*)(sr_session_ctx_t *, const char *, const struct lyd_node *, sr_event_t, uint32_t, struct lyd_node *, void *),
236+
void *priv, uint32_t priority, sr_subscr_options_t, sr_subscription_ctx_t **);
237+
238+
extern "Python" int srpy_oper_data_cb(
239+
sr_session_ctx_t *, const char *module, const char *xpath,
240+
const char *req_xpath, uint32_t req_id, struct lyd_node **, void *priv);
241+
int sr_oper_get_items_subscribe(
242+
sr_session_ctx_t *, const char *module, const char *xpath,
243+
int (*)(sr_session_ctx_t *, const char *, const char *, const char *, uint32_t, struct lyd_node **, void *),
244+
void *priv, sr_subscr_options_t, sr_subscription_ctx_t **);

0 commit comments

Comments
 (0)