Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 1 | /** |
| 2 | * @file parser_data.h |
| 3 | * @author Radek Krejci <rkrejci@cesnet.cz> |
Michal Vasko | af5a8dd | 2023-03-02 11:25:02 +0100 | [diff] [blame] | 4 | * @author Michal Vasko <mvasko@cesnet.cz> |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 5 | * @brief Data parsers for libyang |
| 6 | * |
Michal Vasko | af5a8dd | 2023-03-02 11:25:02 +0100 | [diff] [blame] | 7 | * Copyright (c) 2015-2023 CESNET, z.s.p.o. |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 8 | * |
| 9 | * This source code is licensed under BSD 3-Clause License (the "License"). |
| 10 | * You may not use this file except in compliance with the License. |
| 11 | * You may obtain a copy of the License at |
| 12 | * |
| 13 | * https://opensource.org/licenses/BSD-3-Clause |
| 14 | */ |
| 15 | |
| 16 | #ifndef LY_PARSER_DATA_H_ |
| 17 | #define LY_PARSER_DATA_H_ |
| 18 | |
| 19 | #include "tree_data.h" |
| 20 | |
| 21 | #ifdef __cplusplus |
| 22 | extern "C" { |
| 23 | #endif |
| 24 | |
| 25 | struct ly_in; |
| 26 | |
| 27 | /** |
Radek Krejci | 8678fa4 | 2020-08-18 16:07:28 +0200 | [diff] [blame] | 28 | * @page howtoDataParsers Parsing Data |
| 29 | * |
| 30 | * Data parser allows to read instances from a specific format. libyang supports the following data formats: |
| 31 | * |
| 32 | * - XML |
| 33 | * |
| 34 | * Original data format used in NETCONF protocol. XML mapping is part of the YANG specification |
| 35 | * ([RFC 6020](http://tools.ietf.org/html/rfc6020)). |
| 36 | * |
| 37 | * - JSON |
| 38 | * |
| 39 | * The alternative data format available in RESTCONF protocol. Specification of JSON encoding of data modeled by YANG |
| 40 | * can be found in [RFC 7951](http://tools.ietf.org/html/rfc7951). The specification does not cover RPCs, actions and |
| 41 | * Notifications, so the representation of these data trees is proprietary and corresponds to the representation of these |
| 42 | * trees in XML. |
| 43 | * |
| 44 | * While the parsers themselves process the input data only syntactically, all the parser functions actually incorporate |
| 45 | * the [common validator](@ref howtoDataValidation) checking the input data semantically. Therefore, the parser functions |
| 46 | * accepts two groups of options - @ref dataparseroptions and @ref datavalidationoptions. |
| 47 | * |
| 48 | * In contrast to the schema parser, data parser also accepts empty input data if such an empty data tree is valid |
| 49 | * according to the schemas in the libyang context (i.e. there are no top level mandatory nodes). |
| 50 | * |
| 51 | * There are individual functions to process different types of the data instances trees: |
| 52 | * - ::lyd_parse_data() is intended for standard configuration data trees. According to the given |
| 53 | * [parser options](@ref dataparseroptions), the caller can further specify which kind of data tree is expected: |
| 54 | * - *complete :running datastore*: this is the default case, possibly with the use of (some of) the |
| 55 | * ::LYD_PARSE_STRICT, ::LYD_PARSE_OPAQ or ::LYD_VALIDATE_PRESENT options. |
| 56 | * - *complete configuration-only datastore* (such as :startup): in this case it is necessary to except all state data |
| 57 | * using ::LYD_PARSE_NO_STATE option. |
| 58 | * - *incomplete datastore*: there are situation when the data tree is incomplete or invalid by specification. For |
| 59 | * example the *:operational* datastore is not necessarily valid and results of the NETCONF's \<get\> or \<get-config\> |
| 60 | * oprations used with filters will be incomplete (and thus invalid). This can be allowed using ::LYD_PARSE_ONLY, |
| 61 | * the ::LYD_PARSE_NO_STATE should be used for the data returned by \<get-config\> operation. |
Radek Krejci | f16e254 | 2021-02-17 15:39:23 +0100 | [diff] [blame] | 62 | * - ::lyd_parse_ext_data() is used for parsing configuration data trees defined inside extension instances, such as |
| 63 | * instances of yang-data extension specified in [RFC 8040](http://tools.ietf.org/html/rfc8040). |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 64 | * - ::lyd_parse_op() is used for parsing RPCs/actions, replies, and notifications. Even NETCONF rpc, rpc-reply, and |
Radek Krejci | f16e254 | 2021-02-17 15:39:23 +0100 | [diff] [blame] | 65 | * notification messages are supported. |
| 66 | * - ::lyd_parse_ext_op() is used for parsing RPCs/actions, replies, and notifications defined inside extension instances. |
Radek Krejci | 8678fa4 | 2020-08-18 16:07:28 +0200 | [diff] [blame] | 67 | * |
| 68 | * Further information regarding the processing input instance data can be found on the following pages. |
| 69 | * - @subpage howtoDataValidation |
| 70 | * - @subpage howtoDataWD |
| 71 | * |
| 72 | * Functions List |
| 73 | * -------------- |
| 74 | * - ::lyd_parse_data() |
| 75 | * - ::lyd_parse_data_mem() |
| 76 | * - ::lyd_parse_data_fd() |
| 77 | * - ::lyd_parse_data_path() |
Radek Krejci | f16e254 | 2021-02-17 15:39:23 +0100 | [diff] [blame] | 78 | * - ::lyd_parse_ext_data() |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 79 | * - ::lyd_parse_op() |
Radek Krejci | f16e254 | 2021-02-17 15:39:23 +0100 | [diff] [blame] | 80 | * - ::lyd_parse_ext_op() |
Radek Krejci | 8678fa4 | 2020-08-18 16:07:28 +0200 | [diff] [blame] | 81 | */ |
| 82 | |
| 83 | /** |
| 84 | * @page howtoDataValidation Validating Data |
| 85 | * |
| 86 | * Data validation is performed implicitly to the input data processed by the [parser](@ref howtoDataParsers) and |
| 87 | * on demand via the lyd_validate_*() functions. The explicit validation process is supposed to be used when a (complex or |
| 88 | * simple) change is done on the data tree (via [data manipulation](@ref howtoDataManipulation) functions) and the data |
| 89 | * tree is expected to be valid (it doesn't make sense to validate modified result of filtered \<get\> operation). |
| 90 | * |
| 91 | * Similarly to the [data parser](@ref howtoDataParsers), there are individual functions to validate standard data tree |
| 92 | * (::lyd_validate_all()) and RPC, Action and Notification (::lyd_validate_op()). For the standard data trees, it is possible |
| 93 | * to modify the validation process by @ref datavalidationoptions. This way the state data can be prohibited |
| 94 | * (::LYD_VALIDATE_NO_STATE) and checking for mandatory nodes can be limited to the YANG modules with already present data |
| 95 | * instances (::LYD_VALIDATE_PRESENT). Validation of the standard data tree can be also limited with ::lyd_validate_module() |
| 96 | * function, which scopes only to a specified single YANG module. |
| 97 | * |
| 98 | * Since the operation data trees (RPCs, Actions or Notifications) can reference (leafref, instance-identifier, when/must |
| 99 | * expressions) data from a datastore tree, ::lyd_validate_op() may require additional data tree to be provided. This is a |
| 100 | * difference in contrast to the parsing process, when the data are loaded from an external source and invalid reference |
| 101 | * outside the operation tree is acceptable. |
| 102 | * |
| 103 | * Functions List |
| 104 | * -------------- |
| 105 | * - ::lyd_validate_all() |
| 106 | * - ::lyd_validate_module() |
| 107 | * - ::lyd_validate_op() |
| 108 | */ |
| 109 | |
| 110 | /** |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 111 | * @addtogroup datatree |
| 112 | * @{ |
| 113 | */ |
| 114 | |
| 115 | /** |
Radek Krejci | 8678fa4 | 2020-08-18 16:07:28 +0200 | [diff] [blame] | 116 | * @ingroup datatree |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 117 | * @defgroup dataparseroptions Data parser options |
| 118 | * |
| 119 | * Various options to change the data tree parsers behavior. |
| 120 | * |
| 121 | * Default parser behavior: |
| 122 | * - complete input file is always parsed. In case of XML, even not well-formed XML document (multiple top-level |
| 123 | * elements) is parsed in its entirety, |
Michal Vasko | 78041d1 | 2022-11-29 14:11:07 +0100 | [diff] [blame] | 124 | * - parser silently ignores data without matching schema node definition (for LYB format an error), |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 125 | * - list instances are checked whether they have all the keys, error is raised if not. |
| 126 | * |
| 127 | * Default parser validation behavior: |
| 128 | * - the provided data are expected to provide complete datastore content (both the configuration and state data) |
| 129 | * and performs data validation according to all YANG rules, specifics follow, |
| 130 | * - list instances are expected to have all the keys (it is not checked), |
| 131 | * - instantiated (status) obsolete data print a warning, |
| 132 | * - all types are fully resolved (leafref/instance-identifier targets, unions) and must be valid (lists have |
| 133 | * all the keys, leaf(-lists) correct values), |
| 134 | * - when statements on existing nodes are evaluated, if not satisfied, a validation error is raised, |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 135 | * - invalid multiple data instances/data from several cases cause a validation error, |
Michal Vasko | a6669ba | 2020-08-06 16:14:26 +0200 | [diff] [blame] | 136 | * - implicit nodes (NP containers and default values) are added. |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 137 | * @{ |
| 138 | */ |
| 139 | /* note: keep the lower 16bits free for use by LYD_VALIDATE_ flags. They are not supposed to be combined together, |
| 140 | * but since they are used (as a separate parameter) together in some functions, we want to keep them in a separated |
| 141 | * range to be able detect that the caller put wrong flags into the parser/validate options parameter. */ |
Michal Vasko | abd34fb | 2024-02-21 09:53:56 +0100 | [diff] [blame] | 142 | #define LYD_PARSE_ONLY 0x010000 /**< Data will be only parsed and no data validation will be performed but |
| 143 | type value restrictions will be checked (unlike ::LYD_PARSE_STORE_ONLY). |
| 144 | When statements are kept unevaluated, union types may not be fully |
| 145 | resolved, and default values are not added (only the ones parsed are |
| 146 | present). */ |
Michal Vasko | 0f3377d | 2020-11-09 20:56:11 +0100 | [diff] [blame] | 147 | #define LYD_PARSE_STRICT 0x020000 /**< Instead of silently ignoring data without schema definition raise an error. |
Michal Vasko | 369f7a6 | 2021-02-01 08:59:36 +0100 | [diff] [blame] | 148 | Do not combine with ::LYD_PARSE_OPAQ (except for ::LYD_LYB). */ |
Michal Vasko | 0f3377d | 2020-11-09 20:56:11 +0100 | [diff] [blame] | 149 | #define LYD_PARSE_OPAQ 0x040000 /**< Instead of silently ignoring data without definition, parse them into |
Michal Vasko | 369f7a6 | 2021-02-01 08:59:36 +0100 | [diff] [blame] | 150 | an opaq node. Do not combine with ::LYD_PARSE_STRICT (except for ::LYD_LYB). */ |
| 151 | #define LYD_PARSE_NO_STATE 0x080000 /**< Forbid state data in the parsed data. Usually used with ::LYD_VALIDATE_NO_STATE. */ |
Michal Vasko | 0f3377d | 2020-11-09 20:56:11 +0100 | [diff] [blame] | 152 | #define LYD_PARSE_LYB_MOD_UPDATE 0x100000 /**< Only for LYB format, allow parsing data printed using a specific module |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 153 | revision to be loaded even with a module with the same name but newer |
| 154 | revision. */ |
Michal Vasko | 6ee6f43 | 2021-07-16 09:49:14 +0200 | [diff] [blame] | 155 | #define LYD_PARSE_ORDERED 0x200000 /**< Do not search for the correct place of each node but instead expect |
| 156 | that the nodes are being parsed in the correct schema-based order, |
| 157 | which is always true if the data were printed by libyang and not |
| 158 | modified manually. If this flag is used incorrectly (for unordered data), |
| 159 | the behavior is undefined and most functions executed with these |
| 160 | data will not work correctly. */ |
Jan Kundrát | d49adf8 | 2023-11-01 15:46:36 +0100 | [diff] [blame] | 161 | #define LYD_PARSE_SUBTREE 0x400000 /**< Parse only the first child item along with any descendants, but no |
| 162 | siblings. This flag is not required when parsing data which do not |
| 163 | start at the schema root; for that purpose, use lyd_parse_data's parent |
| 164 | argument. |
Michal Vasko | ddd7659 | 2022-01-17 13:34:48 +0100 | [diff] [blame] | 165 | Also, a new return value ::LY_ENOT is returned if there is a sibling |
Michal Vasko | 0820b5b | 2023-10-03 12:00:01 +0200 | [diff] [blame] | 166 | subtree following in the input data. Note that if validation is requested, |
Jan Kundrát | d49adf8 | 2023-11-01 15:46:36 +0100 | [diff] [blame] | 167 | only the newly parsed subtree is validated. This might result in |
| 168 | an invalid datastore content. */ |
Michal Vasko | fbb48c2 | 2022-11-30 13:28:03 +0100 | [diff] [blame] | 169 | #define LYD_PARSE_WHEN_TRUE 0x800000 /**< Mark all the parsed nodes dependend on a when condition with the flag |
| 170 | that means the condition was satisifed before. This allows for |
| 171 | auto-deletion of these nodes during validation. */ |
Michal Vasko | bc9f76f | 2022-12-01 10:31:38 +0100 | [diff] [blame] | 172 | #define LYD_PARSE_NO_NEW 0x1000000 /**< Do not set ::LYD_NEW (non-validated node flag) for any nodes. Use |
| 173 | when parsing validated data to skip some validation tasks and modify |
| 174 | some validation behavior (auto-deletion of cases). */ |
Michal Vasko | a5c4fa4 | 2024-02-26 14:04:00 +0100 | [diff] [blame] | 175 | #define LYD_PARSE_STORE_ONLY 0x2010000 /**< Similar to ::LYD_PARSE_ONLY but even type value restrictions will not |
Michal Vasko | abd34fb | 2024-02-21 09:53:56 +0100 | [diff] [blame] | 176 | be checked (length, range, pattern, ...) and if a value can be stored, |
| 177 | it is. Calling separate validation on these data always checks all the |
| 178 | restrictions as well. */ |
steweg | b3e420c | 2024-04-05 08:05:29 +0200 | [diff] [blame] | 179 | #define LYD_PARSE_JSON_NULL 0x4000000 /**< Allow using JSON empty value 'null' within JSON input. By default such value |
| 180 | is not supported and according to RFC 7951 '[null]' shall be used instead. */ |
Michal Vasko | afac782 | 2020-10-20 14:22:26 +0200 | [diff] [blame] | 181 | |
| 182 | #define LYD_PARSE_OPTS_MASK 0xFFFF0000 /**< Mask for all the LYD_PARSE_ options. */ |
| 183 | |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 184 | /** @} dataparseroptions */ |
| 185 | |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 186 | /** |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 187 | * @ingroup datatree |
Radek Krejci | 8678fa4 | 2020-08-18 16:07:28 +0200 | [diff] [blame] | 188 | * @defgroup datavalidationoptions Data validation options |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 189 | * |
| 190 | * Various options to change data validation behaviour, both for the parser and separate validation. |
| 191 | * |
| 192 | * Default separate validation behavior: |
| 193 | * - the provided data are expected to provide complete datastore content (both the configuration and state data) |
| 194 | * and performs data validation according to all YANG rules, specifics follow, |
| 195 | * - instantiated (status) obsolete data print a warning, |
| 196 | * - all types are fully resolved (leafref/instance-identifier targets, unions) and must be valid (lists have |
| 197 | * all the keys, leaf(-lists) correct values), |
| 198 | * - when statements on existing nodes are evaluated. Depending on the previous when state (from previous validation |
| 199 | * or parsing), the node is silently auto-deleted if the state changed from true to false, otherwise a validation error |
| 200 | * is raised if it evaluates to false, |
| 201 | * - if-feature statements are evaluated, |
| 202 | * - data from several cases behave based on their previous state (from previous validation or parsing). If there existed |
| 203 | * already a case and another one was added, the previous one is silently auto-deleted. Otherwise (if data from 2 or |
| 204 | * more cases were created) a validation error is raised, |
| 205 | * - default values are added. |
| 206 | * |
| 207 | * @{ |
| 208 | */ |
Michal Vasko | 369f7a6 | 2021-02-01 08:59:36 +0100 | [diff] [blame] | 209 | #define LYD_VALIDATE_NO_STATE 0x0001 /**< Consider state data not allowed and raise an error if they are found. |
| 210 | Also, no implicit state data are added. */ |
Michal Vasko | afac782 | 2020-10-20 14:22:26 +0200 | [diff] [blame] | 211 | #define LYD_VALIDATE_PRESENT 0x0002 /**< Validate only modules whose data actually exist. */ |
Michal Vasko | d027f38 | 2023-02-10 09:13:25 +0100 | [diff] [blame] | 212 | #define LYD_VALIDATE_MULTI_ERROR 0x0004 /**< Do not stop validation on the first error but generate all the detected errors. */ |
Michal Vasko | 6b14c7e | 2023-11-09 12:08:14 +0100 | [diff] [blame] | 213 | #define LYD_VALIDATE_OPERATIONAL 0x0008 /**< Semantic constraint violations are reported only as warnings instead of |
| 214 | errors (see [RFC 8342 sec. 5.3](https://datatracker.ietf.org/doc/html/rfc8342#section-5.3)). */ |
Michal Vasko | af5a8dd | 2023-03-02 11:25:02 +0100 | [diff] [blame] | 215 | #define LYD_VALIDATE_NO_DEFAULTS 0x0010 /**< Do not add any default nodes during validation, other implicit nodes |
| 216 | (such as NP containers) are still added. Validation will fail if a |
| 217 | default node is required for it to pass. */ |
Michal Vasko | 6b14c7e | 2023-11-09 12:08:14 +0100 | [diff] [blame] | 218 | #define LYD_VALIDATE_NOT_FINAL 0x0020 /**< Skip final validation tasks that require for all the data nodes to |
| 219 | either exist or not, based on the YANG constraints. Once the data |
| 220 | satisfy this requirement, the final validation should be performed. */ |
Michal Vasko | afac782 | 2020-10-20 14:22:26 +0200 | [diff] [blame] | 221 | |
| 222 | #define LYD_VALIDATE_OPTS_MASK 0x0000FFFF /**< Mask for all the LYD_VALIDATE_* options. */ |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 223 | |
| 224 | /** @} datavalidationoptions */ |
| 225 | |
| 226 | /** |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 227 | * @brief Parse (and validate) data from the input handler as a YANG data tree. |
| 228 | * |
| 229 | * @param[in] ctx Context to connect with the tree being built here. |
Jan Kundrát | d49adf8 | 2023-11-01 15:46:36 +0100 | [diff] [blame] | 230 | * @param[in] parent Optional parent to connect the parsed nodes to. If provided, the data are expected to describe |
| 231 | * a subtree of the YANG model instead of starting at the schema root. |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 232 | * @param[in] in The input handle to provide the dumped data in the specified @p format to parse (and validate). |
| 233 | * @param[in] format Format of the input data to be parsed. Can be 0 to try to detect format from the input handler. |
| 234 | * @param[in] parse_options Options for parser, see @ref dataparseroptions. |
| 235 | * @param[in] validate_options Options for the validation phase, see @ref datavalidationoptions. |
Michal Vasko | b36c56f | 2024-01-31 12:50:07 +0100 | [diff] [blame] | 236 | * @param[out] tree Full parsed data tree, note that NULL can be a valid tree. If @p parent is set, the first parsed child. |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 237 | * @return LY_SUCCESS in case of successful parsing (and validation). |
Michal Vasko | 6d49766 | 2020-07-08 10:42:57 +0200 | [diff] [blame] | 238 | * @return LY_ERR value in case of error. Additional error information can be obtained from the context using ly_err* functions. |
Jan Kundrát | d49adf8 | 2023-11-01 15:46:36 +0100 | [diff] [blame] | 239 | * |
| 240 | * When parsing subtrees (i.e., when @p parent is non-NULL), validation is only performed on the newly parsed data. |
| 241 | * This might result in allowing invalid datastore content when the schema contains cross-branch constraints, |
| 242 | * complicated `must` statements, etc. When a full-datastore validation is desirable, parse all subtrees |
| 243 | * first, and then request validation of the complete datastore content. |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 244 | */ |
Jan Kundrát | c53a7ec | 2021-12-09 16:01:19 +0100 | [diff] [blame] | 245 | LIBYANG_API_DECL LY_ERR lyd_parse_data(const struct ly_ctx *ctx, struct lyd_node *parent, struct ly_in *in, LYD_FORMAT format, |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 246 | uint32_t parse_options, uint32_t validate_options, struct lyd_node **tree); |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 247 | |
| 248 | /** |
| 249 | * @brief Parse (and validate) input data as a YANG data tree. |
| 250 | * |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 251 | * Wrapper around ::lyd_parse_data() hiding work with the input handler and some obscure options. |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 252 | * |
| 253 | * @param[in] ctx Context to connect with the tree being built here. |
| 254 | * @param[in] data The input data in the specified @p format to parse (and validate). |
Michal Vasko | 107c816 | 2021-09-23 11:21:53 +0200 | [diff] [blame] | 255 | * @param[in] format Format of the input data to be parsed. |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 256 | * @param[in] parse_options Options for parser, see @ref dataparseroptions. |
| 257 | * @param[in] validate_options Options for the validation phase, see @ref datavalidationoptions. |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 258 | * @param[out] tree Full parsed data tree, note that NULL can be a valid tree |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 259 | * @return LY_SUCCESS in case of successful parsing (and validation). |
Michal Vasko | 6d49766 | 2020-07-08 10:42:57 +0200 | [diff] [blame] | 260 | * @return LY_ERR value in case of error. Additional error information can be obtained from the context using ly_err* functions. |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 261 | */ |
Jan Kundrát | c53a7ec | 2021-12-09 16:01:19 +0100 | [diff] [blame] | 262 | LIBYANG_API_DECL LY_ERR lyd_parse_data_mem(const struct ly_ctx *ctx, const char *data, LYD_FORMAT format, uint32_t parse_options, |
Radek Krejci | 1deb5be | 2020-08-26 16:43:36 +0200 | [diff] [blame] | 263 | uint32_t validate_options, struct lyd_node **tree); |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 264 | |
| 265 | /** |
| 266 | * @brief Parse (and validate) input data as a YANG data tree. |
| 267 | * |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 268 | * Wrapper around ::lyd_parse_data() hiding work with the input handler and some obscure options. |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 269 | * |
| 270 | * @param[in] ctx Context to connect with the tree being built here. |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 271 | * @param[in] fd File descriptor of a regular file (e.g. sockets are not supported) containing the input data in the |
| 272 | * specified @p format to parse. |
Michal Vasko | 107c816 | 2021-09-23 11:21:53 +0200 | [diff] [blame] | 273 | * @param[in] format Format of the input data to be parsed. |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 274 | * @param[in] parse_options Options for parser, see @ref dataparseroptions. |
| 275 | * @param[in] validate_options Options for the validation phase, see @ref datavalidationoptions. |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 276 | * @param[out] tree Full parsed data tree, note that NULL can be a valid tree |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 277 | * @return LY_SUCCESS in case of successful parsing (and validation). |
Michal Vasko | 6d49766 | 2020-07-08 10:42:57 +0200 | [diff] [blame] | 278 | * @return LY_ERR value in case of error. Additional error information can be obtained from the context using ly_err* functions. |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 279 | */ |
Jan Kundrát | c53a7ec | 2021-12-09 16:01:19 +0100 | [diff] [blame] | 280 | LIBYANG_API_DECL LY_ERR lyd_parse_data_fd(const struct ly_ctx *ctx, int fd, LYD_FORMAT format, uint32_t parse_options, |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 281 | uint32_t validate_options, struct lyd_node **tree); |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 282 | |
| 283 | /** |
| 284 | * @brief Parse (and validate) input data as a YANG data tree. |
| 285 | * |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 286 | * Wrapper around ::lyd_parse_data() hiding work with the input handler and some obscure options. |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 287 | * |
| 288 | * @param[in] ctx Context to connect with the tree being built here. |
| 289 | * @param[in] path Path to the file with the input data in the specified @p format to parse (and validate). |
Michal Vasko | 107c816 | 2021-09-23 11:21:53 +0200 | [diff] [blame] | 290 | * @param[in] format Format of the input data to be parsed. Can be 0 to try to detect format from @p path extension. |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 291 | * @param[in] parse_options Options for parser, see @ref dataparseroptions. |
| 292 | * @param[in] validate_options Options for the validation phase, see @ref datavalidationoptions. |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 293 | * @param[out] tree Full parsed data tree, note that NULL can be a valid tree |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 294 | * @return LY_SUCCESS in case of successful parsing (and validation). |
Michal Vasko | 6d49766 | 2020-07-08 10:42:57 +0200 | [diff] [blame] | 295 | * @return LY_ERR value in case of error. Additional error information can be obtained from the context using ly_err* functions. |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 296 | */ |
Michal Vasko | ddd7659 | 2022-01-17 13:34:48 +0100 | [diff] [blame] | 297 | LIBYANG_API_DECL LY_ERR lyd_parse_data_path(const struct ly_ctx *ctx, const char *path, LYD_FORMAT format, |
| 298 | uint32_t parse_options, uint32_t validate_options, struct lyd_node **tree); |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 299 | |
| 300 | /** |
Radek Krejci | 7510412 | 2021-04-01 15:37:45 +0200 | [diff] [blame] | 301 | * @brief Parse (and validate) data from the input handler as an extension data tree following the schema tree of the given |
Radek Krejci | f16e254 | 2021-02-17 15:39:23 +0100 | [diff] [blame] | 302 | * extension instance. |
| 303 | * |
| 304 | * Note that the data being parsed are limited only to the schema tree specified by the given extension, it does not allow |
| 305 | * to mix them with the standard data from any module. |
| 306 | * |
Radek Krejci | 7510412 | 2021-04-01 15:37:45 +0200 | [diff] [blame] | 307 | * Directly applicable to data defined as [yang-data](@ref howtoDataYangdata). |
| 308 | * |
Radek Krejci | f16e254 | 2021-02-17 15:39:23 +0100 | [diff] [blame] | 309 | * @param[in] ext Extension instance providing the specific schema tree to match with the data being parsed. |
| 310 | * @param[in] parent Optional parent to connect the parsed nodes to. |
| 311 | * @param[in] in The input handle to provide the dumped data in the specified @p format to parse (and validate). |
| 312 | * @param[in] format Format of the input data to be parsed. Can be 0 to try to detect format from the input handler. |
| 313 | * @param[in] parse_options Options for parser, see @ref dataparseroptions. |
| 314 | * @param[in] validate_options Options for the validation phase, see @ref datavalidationoptions. |
| 315 | * @param[out] tree Full parsed data tree, note that NULL can be a valid tree. If @p parent is set, set to NULL. |
| 316 | * @return LY_SUCCESS in case of successful parsing (and validation). |
| 317 | * @return LY_ERR value in case of error. Additional error information can be obtained from the context using ly_err* functions. |
| 318 | */ |
Michal Vasko | ddd7659 | 2022-01-17 13:34:48 +0100 | [diff] [blame] | 319 | LIBYANG_API_DECL LY_ERR lyd_parse_ext_data(const struct lysc_ext_instance *ext, struct lyd_node *parent, struct ly_in *in, |
| 320 | LYD_FORMAT format, uint32_t parse_options, uint32_t validate_options, struct lyd_node **tree); |
Radek Krejci | f16e254 | 2021-02-17 15:39:23 +0100 | [diff] [blame] | 321 | |
| 322 | /** |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 323 | * @ingroup datatree |
| 324 | * @defgroup datatype Data operation type |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 325 | * |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 326 | * Operation provided to ::lyd_validate_op() to validate. |
| 327 | * |
| 328 | * The operation cannot be determined automatically since RPC/action and a reply to it share the common top level node |
| 329 | * referencing the RPC/action schema node and may not have any input/output children to use for distinction. |
| 330 | * |
| 331 | * @{ |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 332 | */ |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 333 | enum lyd_type { |
Michal Vasko | 820efe8 | 2023-05-12 15:47:43 +0200 | [diff] [blame] | 334 | LYD_TYPE_DATA_YANG = 0, /* generic YANG instance data */ |
| 335 | LYD_TYPE_RPC_YANG, /* instance of a YANG RPC/action request with only "input" data children, |
Michal Vasko | 6459269 | 2023-06-12 13:50:11 +0200 | [diff] [blame] | 336 | including all parents and optional top-level "action" element in case of an action */ |
Michal Vasko | 820efe8 | 2023-05-12 15:47:43 +0200 | [diff] [blame] | 337 | LYD_TYPE_NOTIF_YANG, /* instance of a YANG notification, including all parents in case of a nested one */ |
| 338 | LYD_TYPE_REPLY_YANG, /* instance of a YANG RPC/action reply with only "output" data children, |
| 339 | including all parents in case of an action */ |
Michal Vasko | 1e4c68e | 2021-02-18 15:03:01 +0100 | [diff] [blame] | 340 | |
Michal Vasko | 820efe8 | 2023-05-12 15:47:43 +0200 | [diff] [blame] | 341 | LYD_TYPE_RPC_NETCONF, /* complete NETCONF RPC invocation as defined for |
| 342 | [RPC](https://tools.ietf.org/html/rfc7950#section-7.14.4) and |
| 343 | [action](https://tools.ietf.org/html/rfc7950#section-7.15.2) */ |
| 344 | LYD_TYPE_NOTIF_NETCONF, /* complete NETCONF notification message as defined for |
| 345 | [notification](https://tools.ietf.org/html/rfc7950#section-7.16.2) */ |
| 346 | LYD_TYPE_REPLY_NETCONF, /* complete NETCONF RPC reply as defined for |
| 347 | [RPC](https://tools.ietf.org/html/rfc7950#section-7.14.4) and |
| 348 | [action](https://tools.ietf.org/html/rfc7950#section-7.15.2) */ |
| 349 | |
| 350 | LYD_TYPE_RPC_RESTCONF, /* message-body of a RESTCONF operation input parameters |
| 351 | ([ref](https://www.rfc-editor.org/rfc/rfc8040.html#section-3.6.1)) */ |
| 352 | LYD_TYPE_NOTIF_RESTCONF, /* RESTCONF JSON notification data |
| 353 | ([ref](https://www.rfc-editor.org/rfc/rfc8040.html#section-6.4)), to parse |
| 354 | a notification in XML, use ::LYD_TYPE_NOTIF_NETCONF */ |
| 355 | LYD_TYPE_REPLY_RESTCONF /* message-body of a RESTCONF operation output parameters |
| 356 | ([ref](https://www.rfc-editor.org/rfc/rfc8040.html#section-3.6.2)) */ |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 357 | }; |
| 358 | /** @} datatype */ |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 359 | |
| 360 | /** |
Michal Vasko | 2d4d369 | 2023-05-04 08:52:03 +0200 | [diff] [blame] | 361 | * @brief Parse YANG data into an operation data tree. Specific parsing flags ::LYD_PARSE_ONLY, ::LYD_PARSE_STRICT and |
| 362 | * no validation flags are used. |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 363 | * |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 364 | * At least one of @p parent, @p tree, or @p op must always be set. |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 365 | * |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 366 | * Specific @p data_type values have different parameter meaning as follows: |
Michal Vasko | 1e4c68e | 2021-02-18 15:03:01 +0100 | [diff] [blame] | 367 | * - ::LYD_TYPE_RPC_NETCONF: |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 368 | * - @p parent - must be NULL, the whole RPC is expected; |
| 369 | * - @p format - must be ::LYD_XML, NETCONF supports only this format; |
| 370 | * - @p tree - must be provided, all the NETCONF-specific XML envelopes will be returned here as |
Michal Vasko | 299d5d1 | 2021-02-16 16:36:37 +0100 | [diff] [blame] | 371 | * a separate opaque data tree, even if the function fails, this may be returned; |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 372 | * - @p op - must be provided, the RPC/action data tree itself will be returned here, pointing to the operation; |
| 373 | * |
Michal Vasko | 1e4c68e | 2021-02-18 15:03:01 +0100 | [diff] [blame] | 374 | * - ::LYD_TYPE_NOTIF_NETCONF: |
| 375 | * - @p parent - must be NULL, the whole notification is expected; |
| 376 | * - @p format - must be ::LYD_XML, NETCONF supports only this format; |
| 377 | * - @p tree - must be provided, all the NETCONF-specific XML envelopes will be returned here as |
Michal Vasko | f4da889 | 2021-02-19 09:15:18 +0100 | [diff] [blame] | 378 | * a separate opaque data tree, even if the function fails, this may be returned; |
Michal Vasko | 1e4c68e | 2021-02-18 15:03:01 +0100 | [diff] [blame] | 379 | * - @p op - must be provided, the notification data tree itself will be returned here, pointing to the operation; |
| 380 | * |
| 381 | * - ::LYD_TYPE_REPLY_NETCONF: |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 382 | * - @p parent - must be set, pointing to the invoked RPC operation (RPC or action) node; |
| 383 | * - @p format - must be ::LYD_XML, NETCONF supports only this format; |
| 384 | * - @p tree - must be provided, all the NETCONF-specific XML envelopes will be returned here as |
Michal Vasko | f4da889 | 2021-02-19 09:15:18 +0100 | [diff] [blame] | 385 | * a separate opaque data tree, even if the function fails, this may be returned; |
Michal Vasko | 1e4c68e | 2021-02-18 15:03:01 +0100 | [diff] [blame] | 386 | * - @p op - must be NULL, the reply is appended to the RPC; |
| 387 | * Note that there are 3 kinds of NETCONF replies - ok, error, and data. Only data reply appends any nodes to the RPC. |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 388 | * |
Michal Vasko | 820efe8 | 2023-05-12 15:47:43 +0200 | [diff] [blame] | 389 | * - ::LYD_TYPE_RPC_RESTCONF: |
| 390 | * - @p parent - must be set, pointing to the invoked RPC operation (RPC or action) node; |
| 391 | * - @p format - can be both ::LYD_JSON and ::LYD_XML; |
| 392 | * - @p tree - must be provided, all the RESTCONF-specific JSON objects will be returned here as |
| 393 | * a separate opaque data tree, even if the function fails, this may be returned; |
| 394 | * - @p op - must be NULL, @p parent points to the operation; |
| 395 | * |
| 396 | * - ::LYD_TYPE_NOTIF_RESTCONF: |
| 397 | * - @p parent - must be NULL, the whole notification is expected; |
| 398 | * - @p format - must be ::LYD_JSON, XML-formatted notifications are parsed using ::LYD_TYPE_NOTIF_NETCONF; |
| 399 | * - @p tree - must be provided, all the RESTCONF-specific JSON objects will be returned here as |
| 400 | * a separate opaque data tree, even if the function fails, this may be returned; |
| 401 | * - @p op - must be provided, the notification data tree itself will be returned here, pointing to the operation; |
| 402 | * |
| 403 | * - ::LYD_TYPE_REPLY_RESTCONF: |
| 404 | * - @p parent - must be set, pointing to the invoked RPC operation (RPC or action) node; |
| 405 | * - @p format - can be both ::LYD_JSON and ::LYD_XML; |
| 406 | * - @p tree - must be provided, all the RESTCONF-specific JSON objects will be returned here as |
| 407 | * a separate opaque data tree, even if the function fails, this may be returned; |
| 408 | * - @p op - must be NULL, @p parent points to the operation; |
| 409 | * Note that error reply should be parsed as 'yang-data' extension data. |
| 410 | * |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 411 | * @param[in] ctx libyang context. |
| 412 | * @param[in] parent Optional parent to connect the parsed nodes to. |
| 413 | * @param[in] in Input handle to read the input from. |
| 414 | * @param[in] format Expected format of the data in @p in. |
| 415 | * @param[in] data_type Expected operation to parse (@ref datatype). |
| 416 | * @param[out] tree Optional full parsed data tree. If @p parent is set, set to NULL. |
Michal Vasko | 438b529 | 2021-06-09 14:31:25 +0200 | [diff] [blame] | 417 | * @param[out] op Optional pointer to the operation (action/RPC) node. |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 418 | * @return LY_ERR value. |
Michal Vasko | b7dba86 | 2021-02-18 16:10:02 +0100 | [diff] [blame] | 419 | * @return LY_ENOT if @p data_type is a NETCONF message and the root XML element is not the expected one. |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 420 | */ |
Jan Kundrát | c53a7ec | 2021-12-09 16:01:19 +0100 | [diff] [blame] | 421 | LIBYANG_API_DECL LY_ERR lyd_parse_op(const struct ly_ctx *ctx, struct lyd_node *parent, struct ly_in *in, LYD_FORMAT format, |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 422 | enum lyd_type data_type, struct lyd_node **tree, struct lyd_node **op); |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 423 | |
| 424 | /** |
Radek Krejci | 7510412 | 2021-04-01 15:37:45 +0200 | [diff] [blame] | 425 | * @brief Parse extension data into an operation data tree following only the specification from the given extension instance. |
| 426 | * |
| 427 | * Directly applicable to data defined as [yang-data](@ref howtoDataYangdata). |
Radek Krejci | f16e254 | 2021-02-17 15:39:23 +0100 | [diff] [blame] | 428 | * |
| 429 | * At least one of @p parent, @p tree, or @p op must always be set. |
| 430 | * |
| 431 | * Specific @p data_type values have different parameter meaning as follows: |
| 432 | * - ::LYD_TYPE_RPC_NETCONF: |
| 433 | * - @p parent - must be NULL, the whole RPC is expected; |
| 434 | * - @p format - must be ::LYD_XML, NETCONF supports only this format; |
| 435 | * - @p tree - must be provided, all the NETCONF-specific XML envelopes will be returned here as |
| 436 | * a separate opaque data tree, even if the function fails, this may be returned; |
| 437 | * - @p op - must be provided, the RPC/action data tree itself will be returned here, pointing to the operation; |
| 438 | * |
| 439 | * - ::LYD_TYPE_NOTIF_NETCONF: |
| 440 | * - @p parent - must be NULL, the whole notification is expected; |
| 441 | * - @p format - must be ::LYD_XML, NETCONF supports only this format; |
| 442 | * - @p tree - must be provided, all the NETCONF-specific XML envelopes will be returned here as |
| 443 | * a separate opaque data tree, even if the function fails, this may be returned; |
| 444 | * - @p op - must be provided, the notification data tree itself will be returned here, pointing to the operation; |
| 445 | * |
| 446 | * - ::LYD_TYPE_REPLY_NETCONF: |
| 447 | * - @p parent - must be set, pointing to the invoked RPC operation (RPC or action) node; |
| 448 | * - @p format - must be ::LYD_XML, NETCONF supports only this format; |
| 449 | * - @p tree - must be provided, all the NETCONF-specific XML envelopes will be returned here as |
| 450 | * a separate opaque data tree, even if the function fails, this may be returned; |
| 451 | * - @p op - must be NULL, the reply is appended to the RPC; |
| 452 | * Note that there are 3 kinds of NETCONF replies - ok, error, and data. Only data reply appends any nodes to the RPC. |
| 453 | * |
| 454 | * @param[in] ext Extension instance providing the specific schema tree to match with the data being parsed. |
| 455 | * @param[in] parent Optional parent to connect the parsed nodes to. |
| 456 | * @param[in] in Input handle to read the input from. |
| 457 | * @param[in] format Expected format of the data in @p in. |
| 458 | * @param[in] data_type Expected operation to parse (@ref datatype). |
| 459 | * @param[out] tree Optional full parsed data tree. If @p parent is set, set to NULL. |
Michal Vasko | 438b529 | 2021-06-09 14:31:25 +0200 | [diff] [blame] | 460 | * @param[out] op Optional pointer to the operation (action/RPC) node. |
Radek Krejci | f16e254 | 2021-02-17 15:39:23 +0100 | [diff] [blame] | 461 | * @return LY_ERR value. |
| 462 | * @return LY_ENOT if @p data_type is a NETCONF message and the root XML element is not the expected one. |
| 463 | */ |
Michal Vasko | ddd7659 | 2022-01-17 13:34:48 +0100 | [diff] [blame] | 464 | LIBYANG_API_DECL LY_ERR lyd_parse_ext_op(const struct lysc_ext_instance *ext, struct lyd_node *parent, struct ly_in *in, |
| 465 | LYD_FORMAT format, enum lyd_type data_type, struct lyd_node **tree, struct lyd_node **op); |
Radek Krejci | f16e254 | 2021-02-17 15:39:23 +0100 | [diff] [blame] | 466 | |
| 467 | /** |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 468 | * @brief Fully validate a data tree. |
| 469 | * |
Michal Vasko | ddd7659 | 2022-01-17 13:34:48 +0100 | [diff] [blame] | 470 | * The data tree is modified in-place. As a result of the validation, some data might be removed |
Jan Kundrát | 9474763 | 2021-10-14 16:23:09 +0200 | [diff] [blame] | 471 | * from the tree. In that case, the removed items are freed, not just unlinked. |
| 472 | * |
| 473 | * @param[in,out] tree Data tree to recursively validate. May be changed by validation, might become NULL. |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 474 | * @param[in] ctx libyang context. Can be NULL if @p tree is set. |
| 475 | * @param[in] val_opts Validation options (@ref datavalidationoptions). |
Michal Vasko | 8104fd4 | 2020-07-13 11:09:51 +0200 | [diff] [blame] | 476 | * @param[out] diff Optional diff with any changes made by the validation. |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 477 | * @return LY_SUCCESS on success. |
| 478 | * @return LY_ERR error on error. |
| 479 | */ |
Michal Vasko | ddd7659 | 2022-01-17 13:34:48 +0100 | [diff] [blame] | 480 | LIBYANG_API_DECL LY_ERR lyd_validate_all(struct lyd_node **tree, const struct ly_ctx *ctx, uint32_t val_opts, |
| 481 | struct lyd_node **diff); |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 482 | |
| 483 | /** |
Michal Vasko | 26e8001 | 2020-07-08 10:55:46 +0200 | [diff] [blame] | 484 | * @brief Fully validate a data tree of a module. |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 485 | * |
Michal Vasko | ddd7659 | 2022-01-17 13:34:48 +0100 | [diff] [blame] | 486 | * The data tree is modified in-place. As a result of the validation, some data might be removed |
Jan Kundrát | 9474763 | 2021-10-14 16:23:09 +0200 | [diff] [blame] | 487 | * from the tree. In that case, the removed items are freed, not just unlinked. |
| 488 | * |
Michal Vasko | 6b14c7e | 2023-11-09 12:08:14 +0100 | [diff] [blame] | 489 | * If several modules need to be validated, the flag ::LYD_VALIDATE_NOT_FINAL should be used first for validation |
| 490 | * of each module and then ::lyd_validate_module_final() should be called also for each module. Otherwise, |
| 491 | * false-positive validation errors for foreign dependencies may occur. |
| 492 | * |
Jan Kundrát | 9474763 | 2021-10-14 16:23:09 +0200 | [diff] [blame] | 493 | * @param[in,out] tree Data tree to recursively validate. May be changed by validation, might become NULL. |
Michal Vasko | 26e8001 | 2020-07-08 10:55:46 +0200 | [diff] [blame] | 494 | * @param[in] module Module whose data (and schema restrictions) to validate. |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 495 | * @param[in] val_opts Validation options (@ref datavalidationoptions). |
Michal Vasko | 8104fd4 | 2020-07-13 11:09:51 +0200 | [diff] [blame] | 496 | * @param[out] diff Optional diff with any changes made by the validation. |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 497 | * @return LY_SUCCESS on success. |
| 498 | * @return LY_ERR error on error. |
| 499 | */ |
Michal Vasko | ddd7659 | 2022-01-17 13:34:48 +0100 | [diff] [blame] | 500 | LIBYANG_API_DECL LY_ERR lyd_validate_module(struct lyd_node **tree, const struct lys_module *module, uint32_t val_opts, |
| 501 | struct lyd_node **diff); |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 502 | |
| 503 | /** |
Michal Vasko | 6b14c7e | 2023-11-09 12:08:14 +0100 | [diff] [blame] | 504 | * @brief Finish validation of a module data that have previously been validated with ::LYD_VALIDATE_NOT_FINAL flag. |
| 505 | * |
| 506 | * This final validation will not add or remove any nodes. |
| 507 | * |
| 508 | * @param[in] tree Data tree to recursively validate. |
| 509 | * @param[in] module Module whose data (and schema restrictions) to validate. |
| 510 | * @param[in] val_opts Validation options (@ref datavalidationoptions). |
| 511 | * @return LY_SUCCESS on success. |
| 512 | * @return LY_ERR error on error. |
| 513 | */ |
| 514 | LIBYANG_API_DECL LY_ERR lyd_validate_module_final(struct lyd_node *tree, const struct lys_module *module, |
| 515 | uint32_t val_opts); |
| 516 | |
| 517 | /** |
Michal Vasko | 0bec322 | 2022-04-22 07:46:00 +0200 | [diff] [blame] | 518 | * @brief Validate an RPC/action request, reply, or notification. Only the operation data tree (input/output/notif) |
| 519 | * is validate, any parents are ignored. |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 520 | * |
| 521 | * @param[in,out] op_tree Operation tree with any parents. It can point to the operation itself or any of |
| 522 | * its parents, only the operation subtree is actually validated. |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 523 | * @param[in] dep_tree Tree to be used for validating references from the operation subtree. |
| 524 | * @param[in] data_type Operation type to validate (only YANG operations are accepted, @ref datatype). |
Michal Vasko | 8104fd4 | 2020-07-13 11:09:51 +0200 | [diff] [blame] | 525 | * @param[out] diff Optional diff with any changes made by the validation. |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 526 | * @return LY_SUCCESS on success. |
| 527 | * @return LY_ERR error on error. |
| 528 | */ |
Jan Kundrát | c53a7ec | 2021-12-09 16:01:19 +0100 | [diff] [blame] | 529 | LIBYANG_API_DECL LY_ERR lyd_validate_op(struct lyd_node *op_tree, const struct lyd_node *dep_tree, enum lyd_type data_type, |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 530 | struct lyd_node **diff); |
Radek Krejci | 7931b19 | 2020-06-25 17:05:03 +0200 | [diff] [blame] | 531 | |
| 532 | /** @} datatree */ |
| 533 | |
| 534 | #ifdef __cplusplus |
| 535 | } |
| 536 | #endif |
| 537 | |
| 538 | #endif /* LY_PARSER_DATA_H_ */ |