Michal Vasko | cde73ac | 2019-11-14 16:10:27 +0100 | [diff] [blame] | 1 | /** |
| 2 | * @file validation.h |
| 3 | * @author Michal Vasko <mvasko@cesnet.cz> |
| 4 | * @brief Validation routines. |
| 5 | * |
| 6 | * Copyright (c) 2019 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_VALIDATION_H_ |
| 16 | #define LY_VALIDATION_H_ |
| 17 | |
Radek Krejci | 47fab89 | 2020-11-05 17:02:41 +0100 | [diff] [blame] | 18 | #include <stdint.h> |
| 19 | |
Michal Vasko | f07286b | 2021-09-22 12:18:05 +0200 | [diff] [blame] | 20 | #include "diff.h" |
Michal Vasko | cde73ac | 2019-11-14 16:10:27 +0100 | [diff] [blame] | 21 | #include "log.h" |
Radek Krejci | 47fab89 | 2020-11-05 17:02:41 +0100 | [diff] [blame] | 22 | |
Radek Krejci | 7711410 | 2021-03-10 15:21:57 +0100 | [diff] [blame] | 23 | struct ly_ctx; |
Radek Krejci | 47fab89 | 2020-11-05 17:02:41 +0100 | [diff] [blame] | 24 | struct ly_set; |
| 25 | struct lyd_node; |
| 26 | struct lys_module; |
| 27 | struct lysc_node; |
Michal Vasko | cde73ac | 2019-11-14 16:10:27 +0100 | [diff] [blame] | 28 | |
Michal Vasko | a6669ba | 2020-08-06 16:14:26 +0200 | [diff] [blame] | 29 | /** |
Radek Krejci | 4f2e3e5 | 2021-03-30 14:20:28 +0200 | [diff] [blame] | 30 | * @brief Add information about the node's extensions having their own validation callback into an unres set. |
| 31 | * |
| 32 | * @param[in,out] node_exts Unres set for holding information for validating extension instances. |
| 33 | * @param[in] node Data node to be examined. |
| 34 | * @return LY_ERR values. |
| 35 | */ |
| 36 | LY_ERR lysc_node_ext_tovalidate(struct ly_set *node_exts, struct lyd_node *node); |
| 37 | |
| 38 | /** |
Michal Vasko | a6669ba | 2020-08-06 16:14:26 +0200 | [diff] [blame] | 39 | * @brief Add new changes into a diff. They are always merged. |
| 40 | * |
| 41 | * @param[in] node Node/subtree to add. |
| 42 | * @param[in] op Operation of the change. |
| 43 | * @param[in,out] diff Diff to update. |
| 44 | * @return LY_ERR value. |
| 45 | */ |
| 46 | LY_ERR lyd_val_diff_add(const struct lyd_node *node, enum lyd_diff_op op, struct lyd_node **diff); |
| 47 | |
Michal Vasko | cde73ac | 2019-11-14 16:10:27 +0100 | [diff] [blame] | 48 | /** |
Michal Vasko | b1b5c26 | 2020-03-05 14:29:47 +0100 | [diff] [blame] | 49 | * @brief Finish validation of nodes and attributes. Specifically, when (is processed first) and type validation. |
Michal Vasko | cde73ac | 2019-11-14 16:10:27 +0100 | [diff] [blame] | 50 | * |
Michal Vasko | b1b5c26 | 2020-03-05 14:29:47 +0100 | [diff] [blame] | 51 | * !! It is assumed autodeleted nodes cannot be in the unresolved node type set !! |
| 52 | * |
| 53 | * @param[in,out] tree Data tree, is updated if some nodes are autodeleted. |
Michal Vasko | d3bb12f | 2020-12-04 14:33:09 +0100 | [diff] [blame] | 54 | * @param[in] mod Module of the @p tree to take into consideration when deleting @p tree and moving it. |
| 55 | * If set, it is expected @p tree should point to the first node of @p mod. Otherwise it will simply be |
| 56 | * the first top-level sibling. |
Michal Vasko | b1b5c26 | 2020-03-05 14:29:47 +0100 | [diff] [blame] | 57 | * @param[in] node_when Set with nodes with "when" conditions, can be NULL. |
Michal Vasko | 0110cc9 | 2021-12-06 15:42:22 +0100 | [diff] [blame] | 58 | * @param[in] when_xp_opts Additional XPath options to use for evaluating "when". |
Radek Krejci | 4f2e3e5 | 2021-03-30 14:20:28 +0200 | [diff] [blame] | 59 | * @param[in] node_exts Set with nodes with extension instances with validation plugin callback, can be NULL. |
Michal Vasko | cde73ac | 2019-11-14 16:10:27 +0100 | [diff] [blame] | 60 | * @param[in] node_types Set with nodes with unresolved types, can be NULL |
aPiecek | b0445f2 | 2021-06-24 11:34:07 +0200 | [diff] [blame] | 61 | * @param[in] meta_types Set with metadata with unresolved types, can be NULL. |
Michal Vasko | 8104fd4 | 2020-07-13 11:09:51 +0200 | [diff] [blame] | 62 | * @param[in,out] diff Validation diff. |
Michal Vasko | cde73ac | 2019-11-14 16:10:27 +0100 | [diff] [blame] | 63 | * @return LY_ERR value. |
| 64 | */ |
Michal Vasko | d3bb12f | 2020-12-04 14:33:09 +0100 | [diff] [blame] | 65 | LY_ERR lyd_validate_unres(struct lyd_node **tree, const struct lys_module *mod, struct ly_set *node_when, |
Michal Vasko | 0110cc9 | 2021-12-06 15:42:22 +0100 | [diff] [blame] | 66 | uint32_t when_xp_opts, struct ly_set *node_exts, struct ly_set *node_types, struct ly_set *meta_types, |
| 67 | struct lyd_node **diff); |
Michal Vasko | cde73ac | 2019-11-14 16:10:27 +0100 | [diff] [blame] | 68 | |
| 69 | /** |
Michal Vasko | b1b5c26 | 2020-03-05 14:29:47 +0100 | [diff] [blame] | 70 | * @brief Validate new siblings. Specifically, check duplicated instances, autodelete default values and cases. |
Michal Vasko | cde73ac | 2019-11-14 16:10:27 +0100 | [diff] [blame] | 71 | * |
Michal Vasko | b1b5c26 | 2020-03-05 14:29:47 +0100 | [diff] [blame] | 72 | * !! It is assumed autodeleted nodes cannot yet be in the unresolved node type set !! |
| 73 | * |
| 74 | * @param[in,out] first First sibling. |
| 75 | * @param[in] sparent Schema parent of the siblings, NULL for top-level siblings. |
| 76 | * @param[in] mod Module of the siblings, NULL for nested siblings. |
Michal Vasko | 8104fd4 | 2020-07-13 11:09:51 +0200 | [diff] [blame] | 77 | * @param[in,out] diff Validation diff. |
Michal Vasko | b1b5c26 | 2020-03-05 14:29:47 +0100 | [diff] [blame] | 78 | * @return LY_ERR value. |
| 79 | */ |
Michal Vasko | 8104fd4 | 2020-07-13 11:09:51 +0200 | [diff] [blame] | 80 | LY_ERR lyd_validate_new(struct lyd_node **first, const struct lysc_node *sparent, const struct lys_module *mod, |
Radek Krejci | 0f96988 | 2020-08-21 16:56:47 +0200 | [diff] [blame] | 81 | struct lyd_node **diff); |
Michal Vasko | b1b5c26 | 2020-03-05 14:29:47 +0100 | [diff] [blame] | 82 | |
| 83 | /** |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 84 | * @brief Validate a data tree. |
Michal Vasko | b1b5c26 | 2020-03-05 14:29:47 +0100 | [diff] [blame] | 85 | * |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 86 | * @param[in,out] tree Data tree to validate, nodes may be autodeleted. |
| 87 | * @param[in] module Module whose data (and schema restrictions) to validate, NULL for all modules. |
| 88 | * @param[in] ctx libyang context. |
| 89 | * @param[in] val_opts Validation options, see @ref datavalidationoptions. |
| 90 | * @param[in] validate_subtree Whether subtree was already validated (as part of data parsing) or not (separate validation). |
| 91 | * @param[in] node_when_p Set of nodes with when conditions, if NULL a local set is used. |
Radek Krejci | 84d7fd7 | 2021-07-14 18:32:21 +0200 | [diff] [blame] | 92 | * @param[in] node_exts_p Set with nodes with extension instances with validation plugin callback, if NULL a local set is used. |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 93 | * @param[in] node_types_p Set of unres node types, if NULL a local set is used. |
| 94 | * @param[in] meta_types_p Set of unres metadata types, if NULL a local set is used. |
| 95 | * @param[out] diff Generated validation diff, not generated if NULL. |
Michal Vasko | cde73ac | 2019-11-14 16:10:27 +0100 | [diff] [blame] | 96 | * @return LY_ERR value. |
| 97 | */ |
Michal Vasko | e066574 | 2021-02-11 11:08:44 +0100 | [diff] [blame] | 98 | LY_ERR lyd_validate(struct lyd_node **tree, const struct lys_module *module, const struct ly_ctx *ctx, uint32_t val_opts, |
Radek Krejci | 4f2e3e5 | 2021-03-30 14:20:28 +0200 | [diff] [blame] | 99 | ly_bool validate_subtree, struct ly_set *node_when_p, struct ly_set *node_exts_p, |
| 100 | struct ly_set *node_types_p, struct ly_set *meta_types_p, struct lyd_node **diff); |
Michal Vasko | 9b368d3 | 2020-02-14 13:53:31 +0100 | [diff] [blame] | 101 | |
Michal Vasko | cde73ac | 2019-11-14 16:10:27 +0100 | [diff] [blame] | 102 | #endif /* LY_VALIDATION_H_ */ |