summaryrefslogtreecommitdiffstats
path: root/doc/transition.dox
blob: fb0c63895127e7e365ff0e2b1807e79ea0a57d7f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
/**
 * @page transition Transition Manual (1.x -> 2.0)
 *
 * [TOC]
 *
 * Rewriting libyang codebase and creating libyang version 2.0 was motivated mainly by improving long term maintainability.
 * Especially some of the features and design decisions become killers for further development and maintaining the libyang
 * codebase. On the other hand, most of the principles introduced in libyang 1.x to handle YANG schemas and manipulate
 * instantiated data have proved successful. Therefore, we have decided to keep the basic mechanisms from version 1.x and
 * remove the problematic features and modify the improper design decisions. Despite the vision to keep with the mechanisms
 * also the API, the new version became a great opportunity to clean up the API and improve its usability mainly by unifying
 * how the libyang functions are used. So, in the end, this manual is not just a description of the removed features listing
 * removed, modified or added functions. The API should be even better prepared for adding new features and functions.
 * Shortly, almost everything has changed at least a little, so you cannot move from version 1.x to 2.0 just by replacing
 * code snippets. However, we believe that the change is good and libyang 2.0 is simply better.
 *
 * In this Manual, we want to introduce the differences between libyang 1.x and 2.0. It is intended for the transition
 * from 1.x to 2.0, so if you are new to libyang, simply go to the @ref howto section, this Manual is not for you.
 *
 * The complete generated list of changes (without any additional notes) can be found in
 * <a href="../compat_report.html">the compatibility report</a>.
 *
 * @section transitionGeneral General Changes
 *
 *
 * @subsection transitionGeneralErros Errors Handling
 *
 * The most visible change is probably the changed approach to handling errors. While libyang 1.x was using variable
 * *ly_errno* to provide error information in case the called function failed, there is no such variable in libyang 2.0.
 * On the other hand, most API functions now return ::LY_ERR values directly stating the result. In addition, in case
 * the error is somehow connected with the [context](@ref howtoContext), more detailed error information can be obtained
 * from the context handler itself. Mainly this change is responsible for the backward incompatibility of almost all
 * functions between versions 1.x and 2.0.
 *
 * Here is the overview of the changed / removed / added functions connected with errors and logging.
 *
 * libyang 1.x               | libyang 2.0                          | Notes
 * :-------------------------|:-------------------------------------|:-------------------------------------------------------
 * -                         | ::ly_err_last()                      | New API for handling errors.
 * -                         | ::ly_errcode()                       | ^
 * ly_verb_dbg()             | ::ly_log_dbg_groups()                | Rename to align with the names of the accepted values.
 * ly_verb()                 | ::ly_log_level()                     | ^
 *
 * More information about error handling in libyang 2.0 can be found at @ref howtoErrors page.
 *
 * @subsection transitionGeneralInOut Input / Output Processing
 *
 * libyang 2.0 introduces input (::ly_in) and output (::ly_out) handlers covering the specific input sources for parsers and
 * output targets for printers. They are supposed mainly to simplify parser's and printer's API to avoid the need for
 * separate functions for each source/target. The handlers can be used repeatedly to split the inputs or join the outputs.
 *
 * More information can be found at @ref howtoInput and @ref howtoOutput pages.
 *
 *
 * @subsection transitionGeneralOutputFormatting Output Formatting
 *
 * In libyang 1.x, there was an inconsistency in printing schemas and data. While the schemas were always printed formatted,
 * the data were printed by default without additional indentation. It is clearly visible in the YIN format of the schema,
 * which is XML, and the XML encoding of the data. While there was a possibility to format data output with the LYP_FORMAT
 * flag, it wasn't possible to change schema output formatting.
 *
 * libyang 2.0 unifies the behavior of all printers. By default, all the output formats are formatted now. Both, the data as
 * well as the schema printers, accept the option to remove additional formatting (different for the specific format, usually
 * indentations and blank lines): ::LYD_PRINT_SHRINK for the data printer and ::LYS_PRINT_SHRINK for the schema printer.
 *
 *
 * @subsection transitionGeneralXPath Addressing
 *
 * If you compare the @ref howtoXPath page from libyang 1.x and 2.0 documentation, you will be probably confused since they
 * seem very different. In fact, we have tried to simplify the API by removing the original Schema path format from the
 * public API. Since this format is used in YANG format, libyang still supports it internally, but it is not possible to use
 * it anywhere in the API. The new formats XPath and Path, mentioned at the @ref howtoXPath page, are both the Data paths
 * used in libyang 1.x. The Path format is a subset of XPath format limited to refer to a single node.
 *
 * This change was reflected in functions serving to get a node based on the specified path. Unfortunately, when comparing
 * old and new API, the transition can be confusing since the names are sometimes overloaded (be careful mainly of
 * ::lys_find_path()). The following table depicts the changes, but probably a better approach is to handle the functions as
 * a completely new API.
 *
 * libyang 1.x               | libyang 2.0                          | Notes
 * :-------------------------|:-------------------------------------|:-------------------------------------------------------
 * ly_ctx_find_path()        | -                                    | To simplify the different [types of paths](@ref howtoXPath), the Schema path format is not supported for now. If there will be use cases for it, it can be re-added later, but for now try using ::lys_find_xpath().
 * %lys_find_path()          | -                                    | To simplify the different [types of paths](@ref howtoXPath), the Schema path format is not supported for now. If there will be use cases for it, it can be re-added later, but for now try using ::lys_find_xpath().
 * ly_ctx_get_node()         | ::lys_find_path()                    | Renamed to unify API functions, note that there was lys_find_path in libyang 1.x with different functionality in comparison to the function of the same name from libyang 2.0.
 * -                         | ::lys_find_path_atoms()              | Extension of ::lys_find_path().
 * -                         | ::lys_find_lypath_atoms()            | ^
 * -                         | ::lys_find_xpath()                   | New function reflecting updated @ref howtoXPath\.
 * lys_xpath_atomize()       | ::lys_find_xpath_atoms()             | Rename to unify with the new API, extends ::lys_find_xpath().
 * -                         | ::lys_find_expr_atoms()              | Extension of ::lys_find_xpath().
 * %lyd_path()               | ::lyd_path()                         | Same purpose, just extended functionality.
 * lyd_find_path()           | ::lyd_find_xpath()                   | Rename to unify with the new API.
 * -                         | ::lyd_find_path()                    | Simplified version of ::lyd_find_path().
 * -                         | ::lyxp_get_expr()                    | Added functionality due to the changed representation of XPath expressions.
 * ly_path_data2schema()     | -                                    | Removed since the schema path is not available in API.
 * ly_path_xml2json()        | -                                    | Removed since done internally, note that even the generic XML parser is not available now.
 * lys_node_xpath_atomize()  | -                                    | Removed as useless/redundant, use ::lys_find_xpath_atoms().
 *
 * @section transitionContext Context
 *
 * Context, as a concept of a storage interconnecting YANG modules into a YANG schema and YANG schema with the instantiated
 * data, was preserved. However, it is now more supposed to be prepared just once before connecting it with any instantiated
 * data. The possibility of removing YANG modules from the context was completely dropped. Furthermore, we would like to
 * introduce some kind of context lock to completely abandon any change of the YANG modules after starting work with the
 * instantiated data.
 *
 * Another change to note is the removed destructor of private data (::lysc_node.priv) in ::ly_ctx_destroy(). The mechanism
 * was not reliable with the context recompilation and the splitted parsed and compiled schema trees or the complexity of
 * YANG extensions. It is better to let the caller maintain the allocated data directly via some memory pool or using
 * ::lysc_tree_dfs_full() since he is the best to know where the additional data were added.
 * 
 * The meaining of the ::lysc_node.priv pointer can be now also changed by ::LY_CTX_SET_PRIV_PARSED context option, which
 * makes libyang to connect the original parsed schema node structure (::lysp_node) into the compiled nodes via their 'priv'
 * pointer. 
 *
 * Other significant changes connected with the context are depicted in the following table.
 *
 * libyang 1.x               | libyang 2.0                          | Notes
 * :-------------------------|:-------------------------------------|:-------------------------------------------------------
 * ly_ctx_clean()            | -                                    | Removed functionality of manipulating with the context and the modules already placed in the context.
 * ly_ctx_remove_module()    | -                                    | ^
 * ly_ctx_set_module_data_clb() and the associated ly_module_data_clb type. | - | ^
 * ly_ctx_get_disabled_module() and the associated ly_ctx_get_disabled_module_iter() | - | ^
 * ly_ctx_info()             | ::ly_ctx_get_yanglib_data()          | Clarification of what to expect as the output of the function and possibility to specify custom content ID.
 * ly_ctx_get_module_set_id() | ::ly_ctx_get_change_count()          | The functionality is the same but the exact meaning of the value was clarified.
 * -                         | ::ly_ctx_unset_searchdir_last()      | Extend the functionality of the ::ly_ctx_unset_searchdir() to make its use easier.
 * ly_ctx_get_module_older() | -                                    | Removed functionality.
 * -                         | ::ly_ctx_get_module_implemented()    | Supplement for ::ly_ctx_get_module()
 * -                         | ::ly_ctx_get_module_latest()         | ^
 * -                         | ::ly_ctx_get_module_implemented_ns() | Supplement for ::ly_ctx_get_module_ns()
 * -                         | ::ly_ctx_get_module_latest_ns()      | ^
 * -                         | ::ly_ctx_get_submodule_latest()      | Supplement for ::ly_ctx_get_submodule()
 * -                         | ::ly_ctx_get_submodule2_latest()     | Supplement for ::ly_ctx_get_submodule2()
 * ly_ctx_get_module_by_ns() | ::ly_ctx_get_module_ns ()            | Redesign the API - replace some of the parameters with standalone supplement functions.
 * -                         | ::ly_ctx_reset_latests()             | The new functionality of maintaining the latest module revision flag.
 * ly_ctx_unset_searchdirs() | ::ly_ctx_unset_searchdir()           | Simplify API and instead of index numbers, work with the values themselves.
 * ly_ctx_set*()             | ::ly_ctx_set_options()               | API simplification.
 * ly_ctx_unset*()           | ::ly_ctx_unset_options()             | ^
 * ly_ctx_destroy()          | ::ly_ctx_destroy()                   | The destructor callback parameter was removed, see the notes above.
 *
 *
 * @section transitionSchemas YANG Modules (Schema)
 *
 * The most significant change between libyang 1.x and 2.0 can be found in schema structures. The schema tree now has two
 * different forms - parsed and compiled trees. While the parsed tree reflects the source of the YANG module, the compiled
 * tree represents the final tree used to validate the instantiated data. Both formats can be found inside the covering
 * ::lys_module structure. More about the new structures can be found at @ref howtoSchema page.
 *
 * This is an essential change allowing speed up and simplification of data validation, but requiring carefully determine
 * which format is more suitable for the specific use case. As mentioned, the compiled trees are better for data validation
 * and getting information about the intentioned structure of the schema with all the applied groupings, type modifications,
 * augments, deviations, and any defined if-features. On the other hand, the parsed trees are useful for the schema format conversions since they
 * provide the original structure of the modules. There is a number of new functions intended to work only with the
 * parsed or the compiled tree. These functions are prefixed with `lysp_` and `lysp_` prefixes.
 *
 * Schema parser, as well as printer functions, are now extended to accept new
 * [input / output handlers](@ref transitionGeneralInOut). The previous API working directly with inputs and outputs is
 * preserved (or slightly changed), but the functions can be limited in the functionality of the new API. More information
 * can be found at @ref howtoSchemaParsers and @ref howtoSchemaPrinters pages.
 *
 * libyang 1.x                  | libyang 2.0                     | Notes
 * :----------------------------|:--------------------------------|:---------------------------------------------------------
 * -                            | ::lys_parse()                   | New generic schema parser API using [generic input handler](@ref howtoInput).
 * -                            | ::lys_print_module()            | New generic schema printer API using [generic output handler](@ref howtoOutput).
 * -                            | ::lys_print_node()              | ^
 * -                            | ::lys_print_submodule()         | ^
 *
 *
 * The following table introduces other significant changes in the API functions connected with the schema.
 *
 * libyang 1.x                  | libyang 2.0                     | Notes
 * :----------------------------|:--------------------------------|:---------------------------------------------------------
 * lys_set_private()            | -                               | Not needed, all ::lysc_node compatible structures have this pointer so it can be accessed directly.
 * lys_is_disabled()            | -                               | Make no sense since the nodes disabled by if-feature are not present in the compiled tree.
 * lys_features_list()          | -                               | Not needed, the list of features is available in the parsed tree of the module and submodule.
 * lys_features_enable(), lys_features_enable_force() | ::lys_set_implemented()         | Set of enabled features can be changed but it causes the whole context (all the modules) to recompile.
 * lys_features_disable(), lys_features_disable_force() | -       | ^
 * lys_features_state()         | -                               | Redesign of the features handling in the schema tree, the feature's status is newly directly visible as ::LYS_FENABLED flag (in parsed feature structure).
 * -                            | ::lys_feature_value()           | Simplified API to get feature's state only based on a feature name string.
 * -                            | ::lysp_feature_next()           | After redesigning features handling, this function helps to iterate over all features connected with the module.
 * lys_iffeature_value()        | ::lysc_iffeature_value()        | Renamed, but note that after features handling redesign, the compiled if-feature structure to evaluate is only in ::lysp_feature.iffeatures_c.
 * lys_iffeature_value()        | -                               | Not needed since the if-feature statements are directly applied onto the compiled tree.
 * lys_is_disabled()            | -                               | ^
 * lys_parent()                 | -                               | The compiled tree is more straightforward without the need to take care of nodes added via augments.
 * lys_main_module()            | -                               | The compiled tree does not include submodules, so there is always only the main module.
 * lys_node_module()            | -                               | ^
 * lys_set_enabled()            | -                               | It is not possible to change context this way (remove or disable modules).
 * lys_set_disabled()           | -                               | ^
 * -                            | ::lys_find_child()              | Helpers wrapper around ::lys_getnext().
 * -                            | ::lys_getnext_ext()             | Alternative to ::lys_getnext() allowing processing schema trees inside extension instances.
 * -                            | ::lys_nodetype2str()            | New functionality.
 * lys_is_key()                 | ::lysc_is_key()                 | Renamed to connect with the compiled schema tree.
 * -                            | ::lysc_is_userordered()         | Added functionality to simplify the examination of generic compiled schema nodes.
 * -                            | ::lysc_is_np_cont()             | ^
 * -                            | ::lysc_node_child()             | ^
 * -                            | ::lysc_node_actions()           | ^
 * -                            | ::lysc_node_notifs()            | ^
 * -                            | ::lysp_node_child()             | Added functionality to simplify the examination of generic parsed schema nodes.
 * -                            | ::lysp_node_actions()           | ^
 * -                            | ::lysp_node_notifs()            | ^
 * -                            | ::lysp_node_groupings()         | ^
 * -                            | ::lysp_node_typedefs()          | ^
 * -                            | ::lysc_tree_dfs_full()          | Alternative DFS passing implementation to ::LYSC_TREE_DFS_BEGIN macro.
 * -                            | ::lysc_module_dfs_full()        | Supplement functionality to ::lysc_tree_dfs_full().
 * lys_path(), lys_data_path()  | ::lysc_path()                   | Redesigned functionality.
 * lys_data_path_pattern()      | -                               | Removed as useless
 * lys_implemented_module()     | ::ly_ctx_get_module_implemented() | Removed, the same result can be simply achieved using ::ly_ctx_get_module_implemented().
 *
 * There is a set of functions available to implement data type plugins for storing and manipulating data values in a more
 * natural way to the specific data type. For example, IPv4 address type is defined as a string with a pattern, but it is
 * more effective and usual to store and handle IPv4 as a 32-bit number.
 *
 * libyang 1.x                  | libyang 2.0                      | Notes
 * :----------------------------|:---------------------------------|:--------------------------------------------------------
 * lys_getnext_union_type()     | -                                | Removed after the type representation redesign.
 * -                            | ::lyplg_type_identity_isderived()| Helper functions for base types.
 * -                            | ::lyplg_type_parse_dec64()       | ^
 * -                            | ::lyplg_type_parse_int()         | ^
 * -                            | ::lyplg_type_parse_uint()        | ^
 * -                            | ::lyplg_type_validate_patterns() | ^
 * -                            | ::lyplg_type_validate_range()    | ^
 * -                            | ::lyplg_type_get_prefix()        | Helper functions for processing prefixes in data values.
 * -                            | ::lyplg_type_prefix_data_new()   | ^
 * -                            | ::lyplg_type_prefix_data_dup()   | ^
 * -                            | ::lyplg_type_prefix_data_free()  | ^
 *
 *
 * YANG extensions are supported via [extension plugins API](@ref pluginsExtensions) allowing to implement specific extension
 * and load its support into libyang as a shared module. libyang implements several extensions on its own (see
 * @ref howtoPluginsExtensions), but even these internal implementations use the same API. The API and [mechanism of loading
 * external plugins](@ref howtoPlugins) changed a lot in contrast to libyang 1.x. The plugins are now loaded automatically
 * with creating the first libyang context. The only public function to handle external plugins is ::lyplg_add().
 *
 *
 * libyang 1.x                  | libyang 2.0                     | Notes
 * :----------------------------|:--------------------------------|:---------------------------------------------------------
 * lys_ext_complex_get_substmt()| lysc_ext_substmt()              | Changed design of the extensions and the way how it's substatements are accessed.
 * lys_ext_instance_presence()  | lysc_ext_substmt()              | ^
 * lys_ext_instance_substmt()   | lysc_ext_substmt()              | ^
 * ly_clean_plugins()           | -                               | Manipulating external plugins (from plugins directories) is now automatically connected with creating (first) and destroying (last) libyang contexts.
 * ly_get_loaded_plugins()      | -                               | ^
 * ly_load_plugins()            | -                               | ^
 * ly_register_exts()           | ::lyplg_add()                   | Redesigned to a common function for any plugin type.
 * ly_register_types()          | ::lyplg_add()                   | ^
 *
 *
 * @section transitionData Data Instances
 *
 * Conceptually, the data tree did not change as much as the schema tree. There is still a generic ::lyd_node structure that
 * maps according to the schema node's nodetype to some of the other lyd_node_* structures. All the data nodes were extended
 * by hashes to improve performance when searching and processing data trees. The hashes are used for example in the
 * lyd_find_* functions.
 *
 * All the data nodes are also implicitly ordered following the order of the schema nodes. This is the
 * reason to change the insertion function. Only the user-ordered lists and leaf-lists can be now placed relative to other
 * instances of the same list/leaf-list. Otherwise, the data instance is always inserted/created at the correct place beside
 * the right sibling nodes.
 *
 * For any functions that are available on inputs of different scale (node, subtree, all siblings, whole data tree),
 * there are several variants of the specific function with suffix specifying what exactly the processed input will be
 * (_single, _tree, _siblings, _all). This way the behavior is always clear in the code.
 *
 * libyang 1.x                  | libyang 2.0                     | Notes
 * :----------------------------|:--------------------------------|:---------------------------------------------------------
 * %lyd_insert_after()          | ::lyd_insert_after()            | Changed meaning by limiting applicability only to user-ordered list and leaf-list instances.
 * %lyd_insert_before()         | ::lyd_insert_before()           | ^
 * lyd_schema_sort()            | -                               | Not necessary since the nodes are sorted implicitly.
 *
 *
 * Parsing data instances in XML format is newly done directly, without any interstep. Therefore, complete XML API
 * (lyxml_*() functions) from libyang 1.x was removed.
 *
 * Parser's API was simplified to avoid variadic parameters. The functions are newly split to parsed data, notifications,
 * RPCs and replies to the RPCs. Similarly to the schema parsers, also the new data parser API works with
 * [input handlers](@ref transitionGeneralInOut). The data printer's API was also extended to use new
 * [output handlers](@ref transitionGeneralInOut). However, part of the previous API working directly with inputs
 * and outputs was preserved. More information about the data parser and printer can be found at
 * @ref howtoDataParsers and @ref howtoDataPrinters pages.
 *
 * libyang 1.x                  | libyang 2.0                     | Notes
 * :----------------------------|:--------------------------------|:---------------------------------------------------------
 * -                            | ::lyd_parse_data()              | Redesigned data tree parser.
 * lyd_parse_xml()              | -                               | XML tree format was removed.
 * lyd_parse_fd()               | ::lyd_parse_data_fd()           | Renamed and limited to data trees only.
 * lyd_parse_mem()              | ::lyd_parse_data_mem()          | ^
 * lyd_parse_path()             | ::lyd_parse_data_path()         | ^
 * -                            | ::lyd_parse_ext_data()          | Separated function for parsing data trees matching a schema tree of the given extension instance.
 * -                            | ::lyd_parse_op()                | Separated function for parsing RPCs, actions, replies, and notifications.
 * -                            | ::lyd_parse_ext_op()            | Separated function for parsing RPCs, actions, replies, and notifications of the given extension instance.
 * -                            | ::lyd_print_all()               | New API accepting ::ly_out.
 * -                            | ::lyd_print_tree()              | ^
 *
 *
 * Data validation is still done as part of the parser's process. The standalone functionality is available to check the
 * result of data manipulation with the values of the terminal nodes or with the structure of the data tree. In contrast to
 * libyang 1.x, adding the default nodes was made available as a standalone function to simplify the data manipulation
 * process before the final validation.
 *
 * Many validation flags were removed because they became obsolete (LYD_OPT_DESTRUCT, LYD_OPT_WHENAUTODEL,
 * LYD_OPT_NOEXTDEPS, LYD_OPT_DATA_NO_YANGLIB, LYD_OPT_VAL_DIFF) or we consider them redundant (LYD_OPT_OBSOLETE,
 * LYD_OPT_NOSIBLINGS, LYD_OPT_DATA_ADD_YANGLIB). As for LYD_OPT_TRUSTED, this option was mostly replaced with
 * ::LYD_PARSE_ONLY because both skip validation but with the significant difference that LYD_OPT_TRUSTED also sets
 * the data node flags to be considered validated. The current option ::LYD_PARSE_ONLY does not do this because
 * there is now much better support for working with non-validated data trees. Also, in case an invalid tree was marked
 * as validated, it could lead to some undesired behavior, which is now avoided.
 *
 * Worth mentioning is a difference in the LYB format, which now also stores its validation flags. So, in case
 * a validated data tree is stored, it is also loaded as validated.
 *
 * libyang 1.x                  | libyang 2.0                     | Notes
 * :----------------------------|:--------------------------------|:---------------------------------------------------------
 * lyd_validate()               | ::lyd_validate_all(), ::lyd_validate_op() | Redesigned functionality.
 * lyd_validate_modules()       | ::lyd_validate_module()         | ^
 * lyd_validate_value(), lyd_value_type() | ::lyd_value_validate()          | Redesigned functionality.
 * -                            | ::lyd_new_implicit_all()        | New in API to explicitly add default nodes, previously done only as part of the validation process.
 * -                            | ::lyd_new_implicit_module()     | Supplement functionality to ::lyd_new_implicit_all().
 * -                            | ::lyd_new_implicit_tree()       | ^
 *
 *
 * The `diff` functionality was completely redesigned. Instead of the array of operations to transform one tree into another,
 * the difference between two data trees has newly a form of the annotated data tree describing the differences. A number of
 * functions to use the diff tree was added into API. To simply compare just nodes, there are the `compare` functions.
 *
 * libyang 1.x                  | libyang 2.0                     | Notes
 * :----------------------------|:--------------------------------|:---------------------------------------------------------
 * lyd_diff()                   | ::lyd_diff_tree()               | Redesigned functionality.
 * -                            | ::lyd_diff_siblings()           | Supplement functionality to ::lyd_diff_tree().
 * -                            | ::lyd_diff_apply_all()          | ^
 * -                            | ::lyd_diff_apply_module()       | ^
 * -                            | ::lyd_diff_merge_all()          | ^
 * -                            | ::lyd_diff_merge_module()       | ^
 * -                            | ::lyd_diff_merge_tree()         | ^
 * -                            | ::lyd_diff_reverse_all()        | ^
 * lyd_free_diff()              | -                               | Removed.
 * lyd_free_val_diff()          | -                               | Removed.
 * -                            | ::lyd_compare_single()          | Added functionality.
 * -                            | ::lyd_compare_meta()            | Supplement functionality to ::lyd_compare_single()
 * -                            | ::lyd_compare_siblings()        | ^
 *
 *
 * For now, the functionality of moving data between two different contexts is not implemented. If you have a real use case
 * for this functionality, let us know.
 *
 * libyang 1.x                  | libyang 2.0                     | Notes
 * :----------------------------|:--------------------------------|:---------------------------------------------------------
 * lyd_dup()                    | ::lyd_dup_single()              | Redesigned functionality.
 * lyd_dup_withsiblings()       | ::lyd_dup_siblings()            | ^
 * -                            | ::lyd_dup_meta_single()         | Supplement functionality to ::lyd_dup_single().
 * lyd_dup_to_ctx()             | -                               | Transferring data from one context to another is not supported.
 * lyd_merge()                  | ::lyd_merge_tree()              | Renamed.
 * -                            | ::lyd_merge_siblings()          | Supplement functionality to ::lyd_merge_tree()
 * lyd_merge_to_ctx()           | -                               | Transferring data from one context to another is not supported.
 *
 *
 * There is a significant change in the value structure in terminal nodes. Thanks to the changes in the schema tree,
 * it is now much more straightforward to get the type of the value and work with the alternative representation of the value
 * fitting better to its type. There is also a new API for the type plugins (see @ref howtoPluginsTypes). Even the base YANG
 * data types are now implemented using this API and can be taken as examples for implementing derived data types.
 *
 * libyang 1.x                  | libyang 2.0                     | Notes
 * :----------------------------|:--------------------------------|:---------------------------------------------------------
 * lyd_new(), lyd_new_output()  | ::lyd_new_inner(), ::lyd_new_list(), ::lyd_new_list2() | Redesigned functionality to better fit new lyd_node structures, creating RPC's output data is now done via a flag parameter of the functions.
 * lyd_new_leaf(), lyd_new_output_leaf() | ::lyd_new_term()       | ^
 * lyd_new_anydata(), lyd_new_output_anydata() | ::lyd_new_any()  | ^
 * lyd_new_yangdata()           | ::lyd_new_ext_inner(), ::lyd_new_ext_list(), ::lyd_new_ext_term(), ::lyd_new_ext_any() | Additional functionality to lyd_new_* functions to cover top-level nodes in extension instances.
 * lyd_insert_attr()            | ::lyd_new_meta()                | Unify naming used in other functions with the similar functionality.
 * -                            | ::lyd_new_attr()                | Added functionality to store the data (temporarily) not connected with schema definitions.
 * -                            | ::lyd_new_attr2()               | ^
 * -                            | ::lyd_new_opaq()                | ^
 * -                            | ::lyd_new_opaq2()               | ^
 * -                            | ::lyd_new_path2()               | Supplement functionality to ::lyd_new_path().
 * LYD_PATH_OPT_NOPARENTRET     | ::lyd_new_path2()               | ::lyd_new_path2() returns both the first parent and the wanted node.
 * LYD_PATH_OPT_EDIT            | ::LYD_NEW_PATH_OPAQ             | This functionality was replaced by opaq nodes.
 * -                            | ::lyd_new_ext_path()            | Supplement functionality to ::lyd_new_path() covering data defined in extension instances.
 * lyd_insert()                 | ::lyd_insert_child()            | Renamed to better distinguish from ::lyd_insert_sibling().
 * lyd_change_leaf()            | ::lyd_change_term()             | Align naming with changed names of data structures.
 * -                            | ::lyd_change_meta()             | Transferred functionality of ::lyd_change_term() to metadata.
 * -                            | ::lyd_any_copy_value()          | Added functionality.
 * lyd_free()                   | ::lyd_free_tree()               | Renamed.
 * lyd_free_withsiblings()      | ::lyd_free_all()                | ^
 * -                            | ::lyd_free_siblings()           | Supplement functionality to ::lyd_free_siblings().
 * lyd_free_attr()              | ::lyd_free_attr_single()        | Renamed.
 * -                            | ::lyd_free_attr_siblings()      | Supplement functionality to ::lyd_free_attr_single().
 * -                            | ::lyd_free_meta_single()        | Added functionality.
 * -                            | ::lyd_free_meta_siblings()      | ^
 * lyd_unlink()                 | ::lyd_unlink_tree()             | Renamed.
 *
 *
 * Here is the table of other changes in data API.
 *
 * libyang 1.x                  | libyang 2.0                     | Notes
 * :----------------------------|:--------------------------------|:---------------------------------------------------------
 * lyd_find_instance()          | -                               | Removed.
 * lyd_find_sibling()           | -                               | Removed, functionality can be replaced by ::lyd_find_sibling_val().
 * lyd_find_sibling_set()       | -                               | ^
 * -                            | ::lyd_find_sibling_first()      | Alternative function to ::lyd_find_sibling_val().
 * -                            | ::lyd_find_meta()               | New functionality.
 * lyd_wd_default()             | ::lyd_is_default()              | Renamed to unlink from with-default capability.
 * -                            | ::lyd_parent()                  | New wrapper to get generic ::lyd_node pointer of the parent.
 * -                            | ::lyd_child(), ::lyd_child_no_keys() | New wrapper to cover all children possibilities hidden behind a generic ::lyd_node structure.
 * -                            | ::lyd_owner_module()            | Added functionality.
 * -                            | ::lyd_value_compare()           | Added Functionality.
 * -                            | ::lyd_target()                  | Added functionality for the instance-identifier representation.
 * lyd_node_module()            | -                               | Not necessary since the connection with the compiled modules is much more straightforward.
 * lyd_leaf_type()              | -                               | Not necessary since the real type information is much more clear from the new ::lyd_value.
 * lyd_dec64_to_double()        | -                               | Removed as useless.
 * lyd_node_should_print()      | -                               | ^

 */