blob: f0d5a29419633ea4386a602dc8a7b4ff38c4a19a [file] [log] [blame]
Radek Krejci7931b192020-06-25 17:05:03 +02001/**
2 * @file parser_data.h
3 * @author Radek Krejci <rkrejci@cesnet.cz>
4 * @brief Data parsers for libyang
5 *
6 * Copyright (c) 2015-2020 CESNET, z.s.p.o.
7 *
8 * This source code is licensed under BSD 3-Clause License (the "License").
9 * You may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * https://opensource.org/licenses/BSD-3-Clause
13 */
14
15#ifndef LY_PARSER_DATA_H_
16#define LY_PARSER_DATA_H_
17
18#include "tree_data.h"
19
20#ifdef __cplusplus
21extern "C" {
22#endif
23
24struct ly_in;
25
26/**
27 * @addtogroup datatree
28 * @{
29 */
30
31/**
32 * @defgroup dataparseroptions Data parser options
33 *
34 * Various options to change the data tree parsers behavior.
35 *
36 * Default parser behavior:
37 * - complete input file is always parsed. In case of XML, even not well-formed XML document (multiple top-level
38 * elements) is parsed in its entirety,
39 * - parser silently ignores data without matching schema node definition,
40 * - list instances are checked whether they have all the keys, error is raised if not.
41 *
42 * Default parser validation behavior:
43 * - the provided data are expected to provide complete datastore content (both the configuration and state data)
44 * and performs data validation according to all YANG rules, specifics follow,
45 * - list instances are expected to have all the keys (it is not checked),
46 * - instantiated (status) obsolete data print a warning,
47 * - all types are fully resolved (leafref/instance-identifier targets, unions) and must be valid (lists have
48 * all the keys, leaf(-lists) correct values),
49 * - when statements on existing nodes are evaluated, if not satisfied, a validation error is raised,
50 * - if-feature statements are evaluated,
51 * - invalid multiple data instances/data from several cases cause a validation error,
52 * - default values are added.
53 * @{
54 */
55/* note: keep the lower 16bits free for use by LYD_VALIDATE_ flags. They are not supposed to be combined together,
56 * but since they are used (as a separate parameter) together in some functions, we want to keep them in a separated
57 * range to be able detect that the caller put wrong flags into the parser/validate options parameter. */
58#define LYD_PARSE_ONLY 0x010000 /**< Data will be only parsed and no validation will be performed. When statements
59 are kept unevaluated, union types may not be fully resolved, if-feature
60 statements are not checked, and default values are not added (only the ones
61 parsed are present). */
62#define LYD_PARSE_TRUSTED 0x020000 /**< Data are considered trusted so they will be parsed as validated. If the parsed
63 data are not valid, using this flag may lead to some unexpected behavior!
64 This flag can be used only with #LYD_OPT_PARSE_ONLY. */
65#define LYD_PARSE_STRICT 0x040000 /**< Instead of silently ignoring data without schema definition raise an error.
66 Do not combine with #LYD_OPT_OPAQ. */
67#define LYD_PARSE_OPAQ 0x080000 /**< Instead of silently ignoring data without definition, parse them into
68 an opaq node. Do not combine with #LYD_OPT_STRICT and use only for a generic
69 YANG data tree (opaq Notifications, RPCs or actions are not allowed). */
70#define LYD_PARSE_NO_STATE 0x100000 /**< Forbid state data in the parsed data. */
71
72#define LYD_PARSE_LYB_MOD_UPDATE 0x200000 /**< Only for LYB format, allow parsing data printed using a specific module
73 revision to be loaded even with a module with the same name but newer
74 revision. */
75/** @} dataparseroptions */
76
77
78/**
79 * @defgroup datavalidationoptions Data validation options
80 * @ingroup datatree
81 *
82 * Various options to change data validation behaviour, both for the parser and separate validation.
83 *
84 * Default separate validation behavior:
85 * - the provided data are expected to provide complete datastore content (both the configuration and state data)
86 * and performs data validation according to all YANG rules, specifics follow,
87 * - instantiated (status) obsolete data print a warning,
88 * - all types are fully resolved (leafref/instance-identifier targets, unions) and must be valid (lists have
89 * all the keys, leaf(-lists) correct values),
90 * - when statements on existing nodes are evaluated. Depending on the previous when state (from previous validation
91 * or parsing), the node is silently auto-deleted if the state changed from true to false, otherwise a validation error
92 * is raised if it evaluates to false,
93 * - if-feature statements are evaluated,
94 * - data from several cases behave based on their previous state (from previous validation or parsing). If there existed
95 * already a case and another one was added, the previous one is silently auto-deleted. Otherwise (if data from 2 or
96 * more cases were created) a validation error is raised,
97 * - default values are added.
98 *
99 * @{
100 */
101#define LYD_VALIDATE_NO_STATE 0x0001 /**< Consider state data not allowed and raise an error if they are found. */
102#define LYD_VALIDATE_PRESENT 0x0002 /**< Validate only modules whose data actually exist. */
103//#define LYD_VALIDATE_DIFF 0x0004 /**< Flag only for validation, store all the data node changes performed by the validation
104// in a diff structure. */
Radek Krejci7931b192020-06-25 17:05:03 +0200105
106/** @} datavalidationoptions */
107
108/**
109 * @defgroup datavalidateop Operation to validate
110 * @ingroup datatree
111 *
112 * Operation provided to lyd_validate_op() to validate. The operation cannot be determined automatically since RPC/action and a reply to it
113 * share the common top level node referencing the RPC/action schema node and may not have any input/output children to use for distinction.
114 */
115typedef enum {
116 LYD_VALIDATE_OP_RPC = 1, /**< Validate RPC/action request (input parameters). */
117 LYD_VALIDATE_OP_REPLY, /**< Validate RPC/action reply (output parameters). */
118 LYD_VALIDATE_OP_NOTIF /**< Validate Notification operation. */
119} LYD_VALIDATE_OP;
120
121/** @} datavalidateop */
122
123/**
124 * @brief Parse (and validate) data from the input handler as a YANG data tree.
125 *
126 * @param[in] ctx Context to connect with the tree being built here.
127 * @param[in] in The input handle to provide the dumped data in the specified @p format to parse (and validate).
128 * @param[in] format Format of the input data to be parsed. Can be 0 to try to detect format from the input handler.
129 * @param[in] parse_options Options for parser, see @ref dataparseroptions.
130 * @param[in] validate_options Options for the validation phase, see @ref datavalidationoptions.
131 * @param[out] tree Resulting data tree built from the input data. Note that NULL can be a valid result as a representation of an empty YANG data tree.
132 * The returned data are expected to be freed using lyd_free_all().
133 * @return LY_SUCCESS in case of successful parsing (and validation).
Michal Vasko6d497662020-07-08 10:42:57 +0200134 * @return LY_ERR value in case of error. Additional error information can be obtained from the context using ly_err* functions.
Radek Krejci7931b192020-06-25 17:05:03 +0200135 */
136LY_ERR lyd_parse_data(const struct ly_ctx *ctx, struct ly_in *in, LYD_FORMAT format, int parse_options, int validate_options, struct lyd_node **tree);
137
138/**
139 * @brief Parse (and validate) input data as a YANG data tree.
140 *
141 * Wrapper around lyd_parse_data() hiding work with the input handler.
142 *
143 * @param[in] ctx Context to connect with the tree being built here.
144 * @param[in] data The input data in the specified @p format to parse (and validate).
145 * @param[in] format Format of the input data to be parsed. Can be 0 to try to detect format from the input handler.
146 * @param[in] parse_options Options for parser, see @ref dataparseroptions.
147 * @param[in] validate_options Options for the validation phase, see @ref datavalidationoptions.
148 * @param[out] tree Resulting data tree built from the input data. Note that NULL can be a valid result as a representation of an empty YANG data tree.
149 * The returned data are expected to be freed using lyd_free_all().
150 * @return LY_SUCCESS in case of successful parsing (and validation).
Michal Vasko6d497662020-07-08 10:42:57 +0200151 * @return LY_ERR value in case of error. Additional error information can be obtained from the context using ly_err* functions.
Radek Krejci7931b192020-06-25 17:05:03 +0200152 */
153LY_ERR lyd_parse_data_mem(const struct ly_ctx *ctx, const char *data, LYD_FORMAT format, int parse_options, int validate_options, struct lyd_node **tree);
154
155/**
156 * @brief Parse (and validate) input data as a YANG data tree.
157 *
158 * Wrapper around lyd_parse_data() hiding work with the input handler.
159 *
160 * @param[in] ctx Context to connect with the tree being built here.
161 * @param[in] fd File descriptor of a regular file (e.g. sockets are not supported) containing the input data in the specified @p format to parse (and validate).
162 * @param[in] format Format of the input data to be parsed. Can be 0 to try to detect format from the input handler.
163 * @param[in] parse_options Options for parser, see @ref dataparseroptions.
164 * @param[in] validate_options Options for the validation phase, see @ref datavalidationoptions.
165 * @param[out] tree Resulting data tree built from the input data. Note that NULL can be a valid result as a representation of an empty YANG data tree.
166 * The returned data are expected to be freed using lyd_free_all().
167 * @return LY_SUCCESS in case of successful parsing (and validation).
Michal Vasko6d497662020-07-08 10:42:57 +0200168 * @return LY_ERR value in case of error. Additional error information can be obtained from the context using ly_err* functions.
Radek Krejci7931b192020-06-25 17:05:03 +0200169 */
170LY_ERR lyd_parse_data_fd(const struct ly_ctx *ctx, int fd, LYD_FORMAT format, int parse_options, int validate_options, struct lyd_node **tree);
171
172/**
173 * @brief Parse (and validate) input data as a YANG data tree.
174 *
175 * Wrapper around lyd_parse_data() hiding work with the input handler.
176 *
177 * @param[in] ctx Context to connect with the tree being built here.
178 * @param[in] path Path to the file with the input data in the specified @p format to parse (and validate).
179 * @param[in] format Format of the input data to be parsed. Can be 0 to try to detect format from the input handler.
180 * @param[in] parse_options Options for parser, see @ref dataparseroptions.
181 * @param[in] validate_options Options for the validation phase, see @ref datavalidationoptions.
182 * @param[out] tree Resulting data tree built from the input data. Note that NULL can be a valid result as a representation of an empty YANG data tree.
183 * The returned data are expected to be freed using lyd_free_all().
184 * @return LY_SUCCESS in case of successful parsing (and validation).
Michal Vasko6d497662020-07-08 10:42:57 +0200185 * @return LY_ERR value in case of error. Additional error information can be obtained from the context using ly_err* functions.
Radek Krejci7931b192020-06-25 17:05:03 +0200186 */
187LY_ERR lyd_parse_data_path(const struct ly_ctx *ctx, const char *path, LYD_FORMAT format, int parse_options, int validate_options, struct lyd_node **tree);
188
189/**
190 * @brief Parse (and validate) data from the input handler as a YANG RPC/action invocation.
191 *
192 * In case o LYD_XML @p format, the \<rpc\> envelope element is accepted if present. It is [checked](https://tools.ietf.org/html/rfc6241#section-4.1), an opaq
193 * data node (lyd_node_opaq) is created and all its XML attributes are parsed and inserted into the node. As a content of the enveloper, an RPC data or
194 * \<action\> envelope element is expected. The \<action\> envelope element is also [checked](https://tools.ietf.org/html/rfc7950#section-7.15.2) and parsed as
195 * the \<rpc\> envelope. Inside the \<action\> envelope, only an action data are expected.
196 *
197 * @param[in] ctx Context to connect with the tree being built here.
198 * @param[in] in The input handle to provide the dumped data in the specified @p format to parse (and validate).
199 * @param[in] format Format of the input data to be parsed.
200 * @param[out] tree Resulting full RPC/action tree built from the input data. The returned data are expected to be freed using lyd_free_all().
201 * In contrast to YANG data tree, result of parsing RPC/action cannot be NULL until an error occurs.
202 * @param[out] op Optional pointer to the actual operation node inside the full action @p tree, useful only for action.
203 * @return LY_SUCCESS in case of successful parsing (and validation).
Michal Vasko6d497662020-07-08 10:42:57 +0200204 * @return LY_ERR value in case of error. Additional error information can be obtained from the context using ly_err* functions.
Radek Krejci7931b192020-06-25 17:05:03 +0200205 */
206LY_ERR lyd_parse_rpc(const struct ly_ctx *ctx, struct ly_in *in, LYD_FORMAT format, struct lyd_node **tree, struct lyd_node **op);
207
208/**
209 * @brief Parse (and validate) data from the input handler as a YANG RPC/action reply.
210 *
211 * In case o LYD_XML @p format, the \<rpc-reply\> envelope element is accepted if present. It is [checked](https://tools.ietf.org/html/rfc6241#section-4.2), an opaq
212 * data node (lyd_node_opaq) is created and all its XML attributes are parsed and inserted into the node.
213 *
214 * The reply data are strictly expected to be related to the provided RPC/action @p request.
215 *
216 * @param[in] request The RPC/action tree (result of lyd_parse_rpc()) of the request for the reply being parsed.
217 * @param[in] in The input handle to provide the dumped data in the specified @p format to parse (and validate).
218 * @param[in] format Format of the input data to be parsed.
219 * @param[out] tree Resulting full RPC/action reply tree built from the input data. The returned data are expected to be freed using lyd_free_all().
220 * The reply tree always includes duplicated operation node (and its parents) of the @p request, so in contrast to YANG data tree,
221 * the result of parsing RPC/action reply cannot be NULL until an error occurs.
222 * @param[out] op Optional pointer to the actual operation node inside the full action reply @p tree, useful only for action.
223 * @return LY_SUCCESS in case of successful parsing (and validation).
Michal Vasko6d497662020-07-08 10:42:57 +0200224 * @return LY_ERR value in case of error. Additional error information can be obtained from the request's context using ly_err* functions.
Radek Krejci7931b192020-06-25 17:05:03 +0200225 */
226LY_ERR lyd_parse_reply(const struct lyd_node *request, struct ly_in *in, LYD_FORMAT format, struct lyd_node **tree, struct lyd_node **op);
227
228/**
229 * @brief Parse XML string as YANG notification.
230 *
231 * In case o LYD_XML @p format, the \<notification\> envelope element in combination with the child \<eventTime\> element are accepted if present. They are
232 * [checked](https://tools.ietf.org/html/rfc5277#page-25), opaq data nodes (lyd_node_opaq) are created and all their XML attributes are parsed and inserted into the nodes.
233 *
234 * @param[in] ctx Context to connect with the tree being built here.
235 * @param[in] in The input handle to provide the dumped data in the specified @p format to parse (and validate).
236 * @param[in] format Format of the input data to be parsed.
237 * @param[out] tree Resulting full Notification tree built from the input data. The returned data are expected to be freed using lyd_free_all().
238 * In contrast to YANG data tree, result of parsing Notification cannot be NULL until an error occurs.
239 * @param[out] ntf Optional pointer to the actual notification node inside the full Notification @p tree, useful for nested notifications.
240 * @return LY_SUCCESS in case of successful parsing (and validation).
Michal Vasko6d497662020-07-08 10:42:57 +0200241 * @return LY_ERR value in case of error. Additional error information can be obtained from the context using ly_err* functions.
Radek Krejci7931b192020-06-25 17:05:03 +0200242 */
243LY_ERR lyd_parse_notif(const struct ly_ctx *ctx, struct ly_in *in, LYD_FORMAT format, struct lyd_node **tree, struct lyd_node **ntf);
244
245/**
246 * @brief Fully validate a data tree.
247 *
248 * @param[in,out] tree Data tree to recursively validate. May be changed by validation.
249 * @param[in] ctx libyang context. Can be NULL if @p tree is set.
250 * @param[in] val_opts Validation options (@ref datavalidationoptions).
251 * @return LY_SUCCESS on success.
252 * @return LY_ERR error on error.
253 */
254LY_ERR lyd_validate(struct lyd_node **tree, const struct ly_ctx *ctx, int val_opts);
255
256/**
257 * @brief Fully validate a data tree.
258 *
259 * @param[in,out] tree Data tree to recursively validate. May be changed by validation.
260 * @param[in] modules Array of modules to validate.
261 * @param[in] mod_count Number of @p modules.
262 * @param[in] val_opts Validation options (@ref datavalidationoptions).
263 * @return LY_SUCCESS on success.
264 * @return LY_ERR error on error.
265 */
266LY_ERR lyd_validate_modules(struct lyd_node **tree, const struct lys_module **modules, int mod_count, int val_opts);
267
268/**
269 * @brief Validate an RPC/action, notification, or RPC/action reply.
270 *
271 * @param[in,out] op_tree Operation tree with any parents. It can point to the operation itself or any of
272 * its parents, only the operation subtree is actually validated.
273 * @param[in] tree Tree to be used for validating references from the operation subtree.
274 * @param[in] op Operation to validate (@ref datavalidateop), the given @p op_tree must correspond to this value. Note that
275 * it isn't possible to detect the operation simply from the @p op_tree since RPC/action and their reply share the same
276 * RPC/action data node and in case one of the input and output do not define any data node children, it is not passible
277 * to get know what is here given for validation and if it is really valid.
278 * @return LY_SUCCESS on success.
279 * @return LY_ERR error on error.
280 */
281LY_ERR lyd_validate_op(struct lyd_node *op_tree, const struct lyd_node *tree, LYD_VALIDATE_OP op);
282
283/** @} datatree */
284
285#ifdef __cplusplus
286}
287#endif
288
289#endif /* LY_PARSER_DATA_H_ */