YANG parser cardinality checked (https://github.com/clicon/clixon/issues/48)
This commit is contained in:
parent
9377986c81
commit
7d5bfe5c81
5 changed files with 335 additions and 18 deletions
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
### Major New features
|
### Major New features
|
||||||
* More complete Yang parser
|
* More complete Yang parser
|
||||||
* YANG parser cardinality checked (only modules level yet)
|
* YANG parser cardinality checked (https://github.com/clicon/clixon/issues/48)
|
||||||
* See https://github.com/clicon/clixon/issues/84
|
* See https://github.com/clicon/clixon/issues/84
|
||||||
* Support of submodule, include and belongs-to.
|
* Support of submodule, include and belongs-to.
|
||||||
* Openconfig yang specs parsed: https://github.com/openconfig/public
|
* Openconfig yang specs parsed: https://github.com/openconfig/public
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
# Clixon example
|
# Clixon example
|
||||||
|
|
||||||
This directory contains a Clixon example which includes a simple
|
This directory contains a Clixon example which includes a simple example. It contains the following files:
|
||||||
routing example. It contains the following files:
|
|
||||||
* example.xml The configuration file. See yang/clixon-config@<date>.yang for all available fields.
|
* example.xml The configuration file. See yang/clixon-config@<date>.yang for all available fields.
|
||||||
* example.yang The yang spec of the example. It mainly includes ietf routing and IP modules.
|
* example.yang The yang spec of the example. It mainly includes ietf routing and IP modules.
|
||||||
* example_cli.cli CLIgen specification.
|
* example_cli.cli CLIgen specification.
|
||||||
|
|
|
||||||
|
|
@ -108,6 +108,217 @@ struct ycard{
|
||||||
*/
|
*/
|
||||||
#define NMAX 1000000 /* Just a large number */
|
#define NMAX 1000000 /* Just a large number */
|
||||||
static const struct ycard yclist[] = {
|
static const struct ycard yclist[] = {
|
||||||
|
{Y_ACTION, Y_DESCRIPTION, 0, 1},
|
||||||
|
{Y_ACTION, Y_GROUPING, 0, NMAX},
|
||||||
|
{Y_ACTION, Y_IF_FEATURE, 0, NMAX},
|
||||||
|
{Y_ACTION, Y_INPUT, 0, 1},
|
||||||
|
{Y_ACTION, Y_OUTPUT, 0, 1},
|
||||||
|
{Y_ACTION, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_ACTION, Y_STATUS, 0, 1},
|
||||||
|
{Y_ACTION, Y_TYPEDEF, 0, NMAX},
|
||||||
|
{Y_ANYDATA, Y_CONFIG, 0, 1},
|
||||||
|
{Y_ANYDATA, Y_DESCRIPTION, 0, 1},
|
||||||
|
{Y_ANYDATA, Y_IF_FEATURE, 0, NMAX},
|
||||||
|
{Y_ANYDATA, Y_MANDATORY, 0, 1},
|
||||||
|
{Y_ANYDATA, Y_MUST, 0, NMAX},
|
||||||
|
{Y_ANYDATA, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_ANYDATA, Y_STATUS, 0, 1},
|
||||||
|
{Y_ANYDATA, Y_WHEN, 0, 1},
|
||||||
|
{Y_ANYXML, Y_CONFIG, 0, 1},
|
||||||
|
{Y_ANYXML, Y_DESCRIPTION, 0, 1},
|
||||||
|
{Y_ANYXML, Y_IF_FEATURE, 0, NMAX},
|
||||||
|
{Y_ANYXML, Y_MANDATORY, 0, 1},
|
||||||
|
{Y_ANYXML, Y_MUST, 0, NMAX},
|
||||||
|
{Y_ANYXML, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_ANYXML, Y_STATUS, 0, 1},
|
||||||
|
{Y_ANYXML, Y_WHEN, 0, 1},
|
||||||
|
{Y_ARGUMENT, Y_YIN_ELEMENT, 0, 1},
|
||||||
|
{Y_AUGMENT, Y_ACTION, 0, NMAX},
|
||||||
|
{Y_AUGMENT, Y_ANYDATA, 0, NMAX},
|
||||||
|
{Y_AUGMENT, Y_ANYXML, 0, NMAX},
|
||||||
|
{Y_AUGMENT, Y_CASE, 0, NMAX},
|
||||||
|
{Y_AUGMENT, Y_CHOICE, 0, NMAX},
|
||||||
|
{Y_AUGMENT, Y_CONTAINER, 0, NMAX},
|
||||||
|
{Y_AUGMENT, Y_DESCRIPTION, 0, 1},
|
||||||
|
{Y_AUGMENT, Y_IF_FEATURE, 0, NMAX},
|
||||||
|
{Y_AUGMENT, Y_LEAF, 0, NMAX},
|
||||||
|
{Y_AUGMENT, Y_LEAF_LIST, 0, NMAX},
|
||||||
|
{Y_AUGMENT, Y_LIST, 0, NMAX},
|
||||||
|
{Y_AUGMENT, Y_NOTIFICATION, 0, NMAX},
|
||||||
|
{Y_AUGMENT, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_AUGMENT, Y_STATUS, 0, 1},
|
||||||
|
{Y_AUGMENT, Y_USES, 0, NMAX},
|
||||||
|
{Y_AUGMENT, Y_WHEN, 0, 1},
|
||||||
|
{Y_BELONGS_TO, Y_PREFIX, 1, 1},
|
||||||
|
{Y_BIT, Y_DESCRIPTION, 0, 1},
|
||||||
|
{Y_BIT, Y_IF_FEATURE, 0, NMAX},
|
||||||
|
{Y_BIT, Y_POSITION, 0, 1},
|
||||||
|
{Y_BIT, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_BIT, Y_STATUS, 0, 1},
|
||||||
|
{Y_CASE, Y_ANYDATA, 0, NMAX},
|
||||||
|
{Y_CASE, Y_ANYXML, 0, NMAX},
|
||||||
|
{Y_CASE, Y_CHOICE, 0, NMAX},
|
||||||
|
{Y_CASE, Y_CONTAINER, 0, NMAX},
|
||||||
|
{Y_CASE, Y_DESCRIPTION, 0, 1},
|
||||||
|
{Y_CASE, Y_IF_FEATURE, 0, NMAX},
|
||||||
|
{Y_CASE, Y_LEAF, 0, NMAX},
|
||||||
|
{Y_CASE, Y_LEAF_LIST, 0, NMAX},
|
||||||
|
{Y_CASE, Y_LIST, 0, NMAX},
|
||||||
|
{Y_CASE, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_CASE, Y_STATUS, 0, 1},
|
||||||
|
{Y_CASE, Y_USES, 0, NMAX},
|
||||||
|
{Y_CASE, Y_WHEN, 0, 1},
|
||||||
|
{Y_CHOICE, Y_ANYXML, 0, NMAX},
|
||||||
|
{Y_CHOICE, Y_CASE, 0, NMAX},
|
||||||
|
{Y_CHOICE, Y_CHOICE, 0, NMAX},
|
||||||
|
{Y_CHOICE, Y_CONFIG, 0, 1},
|
||||||
|
{Y_CHOICE, Y_CONTAINER, 0, NMAX},
|
||||||
|
{Y_CHOICE, Y_DEFAULT, 0, 1},
|
||||||
|
{Y_CHOICE, Y_DESCRIPTION, 0, 1},
|
||||||
|
{Y_CHOICE, Y_IF_FEATURE, 0, NMAX},
|
||||||
|
{Y_CHOICE, Y_LEAF, 0, NMAX},
|
||||||
|
{Y_CHOICE, Y_LEAF_LIST, 0, NMAX},
|
||||||
|
{Y_CHOICE, Y_LIST, 0, NMAX},
|
||||||
|
{Y_CHOICE, Y_MANDATORY, 0, 1},
|
||||||
|
{Y_CHOICE, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_CHOICE, Y_STATUS, 0, 1},
|
||||||
|
{Y_CHOICE, Y_WHEN, 0, 1},
|
||||||
|
{Y_CHOICE, Y_ANYDATA, 0, NMAX},
|
||||||
|
{Y_CONTAINER, Y_ACTION, 0, NMAX},
|
||||||
|
{Y_CONTAINER, Y_ANYDATA, 0, NMAX},
|
||||||
|
{Y_CONTAINER, Y_ANYXML, 0, NMAX},
|
||||||
|
{Y_CONTAINER, Y_CHOICE, 0, NMAX},
|
||||||
|
{Y_CONTAINER, Y_CONFIG, 0, 1},
|
||||||
|
{Y_CONTAINER, Y_CONTAINER, 0, NMAX},
|
||||||
|
{Y_CONTAINER, Y_DESCRIPTION, 0, 1},
|
||||||
|
{Y_CONTAINER, Y_GROUPING, 0, NMAX},
|
||||||
|
{Y_CONTAINER, Y_IF_FEATURE, 0, NMAX},
|
||||||
|
{Y_CONTAINER, Y_LEAF, 0, NMAX},
|
||||||
|
{Y_CONTAINER, Y_LEAF_LIST, 0, NMAX},
|
||||||
|
{Y_CONTAINER, Y_LIST, 0, NMAX},
|
||||||
|
{Y_CONTAINER, Y_MUST, 0, NMAX},
|
||||||
|
{Y_CONTAINER, Y_NOTIFICATION, 0, NMAX},
|
||||||
|
{Y_CONTAINER, Y_PRESENCE, 0, 1},
|
||||||
|
{Y_CONTAINER, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_CONTAINER, Y_STATUS, 0, 1},
|
||||||
|
{Y_CONTAINER, Y_TYPEDEF, 0, NMAX},
|
||||||
|
{Y_CONTAINER, Y_USES, 0, NMAX},
|
||||||
|
{Y_CONTAINER, Y_WHEN, 0, 1},
|
||||||
|
{Y_DEVIATE, Y_CONFIG, 0, 1},
|
||||||
|
{Y_DEVIATE, Y_DEFAULT, 0, NMAX},
|
||||||
|
{Y_DEVIATE, Y_MANDATORY, 0, 1},
|
||||||
|
{Y_DEVIATE, Y_MAX_ELEMENTS, 0, 1},
|
||||||
|
{Y_DEVIATE, Y_MIN_ELEMENTS, 0, 1},
|
||||||
|
{Y_DEVIATE, Y_MUST, 0, NMAX},
|
||||||
|
{Y_DEVIATE, Y_TYPE, 0, 1},
|
||||||
|
{Y_DEVIATE, Y_UNIQUE, 0, NMAX},
|
||||||
|
{Y_DEVIATE, Y_UNITS, 0, 1},
|
||||||
|
{Y_DEVIATION, Y_DESCRIPTION, 0, 1},
|
||||||
|
{Y_DEVIATION, Y_DEVIATE, 1, NMAX},
|
||||||
|
{Y_DEVIATION, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_ENUM, Y_DESCRIPTION, 0, 1},
|
||||||
|
{Y_ENUM, Y_IF_FEATURE, 0, NMAX},
|
||||||
|
{Y_ENUM, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_ENUM, Y_STATUS, 0, 1},
|
||||||
|
{Y_ENUM, Y_VALUE, 0, 1},
|
||||||
|
{Y_EXTENSION, Y_ARGUMENT, 0, 1},
|
||||||
|
{Y_EXTENSION, Y_DESCRIPTION, 0, 1},
|
||||||
|
{Y_EXTENSION, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_EXTENSION, Y_STATUS, 0, 1},
|
||||||
|
{Y_FEATURE, Y_DESCRIPTION, 0, 1},
|
||||||
|
{Y_FEATURE, Y_IF_FEATURE, 0, NMAX},
|
||||||
|
{Y_FEATURE, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_FEATURE, Y_STATUS, 0, 1},
|
||||||
|
{Y_GROUPING, Y_ACTION, 0, NMAX},
|
||||||
|
{Y_GROUPING, Y_ANYDATA, 0, NMAX},
|
||||||
|
{Y_GROUPING, Y_ANYXML, 0, NMAX},
|
||||||
|
{Y_GROUPING, Y_CHOICE, 0, NMAX},
|
||||||
|
{Y_GROUPING, Y_CONTAINER, 0, NMAX},
|
||||||
|
{Y_GROUPING, Y_DESCRIPTION, 0, 1},
|
||||||
|
{Y_GROUPING, Y_GROUPING, 0, NMAX},
|
||||||
|
{Y_GROUPING, Y_LEAF, 0, NMAX},
|
||||||
|
{Y_GROUPING, Y_LEAF_LIST, 0, NMAX},
|
||||||
|
{Y_GROUPING, Y_LIST, 0, NMAX},
|
||||||
|
{Y_GROUPING, Y_NOTIFICATION, 0, NMAX},
|
||||||
|
{Y_GROUPING, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_GROUPING, Y_STATUS, 0, 1},
|
||||||
|
{Y_GROUPING, Y_TYPEDEF, 0, NMAX},
|
||||||
|
{Y_GROUPING, Y_USES, 0, NMAX},
|
||||||
|
{Y_IDENTITY, Y_BASE, 0, NMAX},
|
||||||
|
{Y_IDENTITY, Y_DESCRIPTION, 0, 1},
|
||||||
|
{Y_IDENTITY, Y_IF_FEATURE, 0, NMAX},
|
||||||
|
{Y_IDENTITY, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_IDENTITY, Y_STATUS, 0, 1},
|
||||||
|
{Y_IMPORT, Y_DESCRIPTION, 0, 1},
|
||||||
|
{Y_IMPORT, Y_PREFIX, 1, 1},
|
||||||
|
{Y_IMPORT, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_IMPORT, Y_REVISION_DATE,0, 1},
|
||||||
|
{Y_INCLUDE, Y_DESCRIPTION, 0, 1},
|
||||||
|
{Y_INCLUDE, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_INCLUDE, Y_REVISION_DATE,0, 1},
|
||||||
|
{Y_INPUT, Y_ANYDATA, 0, NMAX},
|
||||||
|
{Y_INPUT, Y_ANYXML, 0, NMAX},
|
||||||
|
{Y_INPUT, Y_CHOICE, 0, NMAX},
|
||||||
|
{Y_INPUT, Y_CONTAINER, 0, NMAX},
|
||||||
|
{Y_INPUT, Y_GROUPING, 0, NMAX},
|
||||||
|
{Y_INPUT, Y_LEAF, 0, NMAX},
|
||||||
|
{Y_INPUT, Y_LEAF_LIST, 0, NMAX},
|
||||||
|
{Y_INPUT, Y_LIST, 0, NMAX},
|
||||||
|
{Y_INPUT, Y_MUST, 0, NMAX},
|
||||||
|
{Y_INPUT, Y_TYPEDEF, 0, NMAX},
|
||||||
|
{Y_INPUT, Y_USES, 0, NMAX},
|
||||||
|
{Y_LEAF, Y_CONFIG, 0, 1},
|
||||||
|
{Y_LEAF, Y_DEFAULT, 0, 1},
|
||||||
|
{Y_LEAF, Y_DESCRIPTION, 0, 1},
|
||||||
|
{Y_LEAF, Y_IF_FEATURE, 0, NMAX},
|
||||||
|
{Y_LEAF, Y_MANDATORY, 0, 1},
|
||||||
|
{Y_LEAF, Y_MUST, 0, NMAX},
|
||||||
|
{Y_LEAF, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_LEAF, Y_STATUS, 0, 1},
|
||||||
|
{Y_LEAF, Y_TYPE, 1, 1},
|
||||||
|
{Y_LEAF, Y_UNITS, 0, 1},
|
||||||
|
{Y_LEAF, Y_WHEN, 0, 1},
|
||||||
|
{Y_LEAF_LIST, Y_CONFIG, 0, 1},
|
||||||
|
{Y_LEAF_LIST, Y_DEFAULT, 0, NMAX},
|
||||||
|
{Y_LEAF_LIST, Y_DESCRIPTION, 0, 1},
|
||||||
|
{Y_LEAF_LIST, Y_IF_FEATURE, 0, NMAX},
|
||||||
|
{Y_LEAF_LIST, Y_MAX_ELEMENTS, 0, 1},
|
||||||
|
{Y_LEAF_LIST, Y_MIN_ELEMENTS, 0, 1},
|
||||||
|
{Y_LEAF_LIST, Y_MUST, 0, NMAX},
|
||||||
|
{Y_LEAF_LIST, Y_ORDERED_BY, 0, 1},
|
||||||
|
{Y_LEAF_LIST, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_LEAF_LIST, Y_STATUS, 0, 1},
|
||||||
|
{Y_LEAF_LIST, Y_TYPE, 1, 1},
|
||||||
|
{Y_LEAF_LIST, Y_UNITS, 0, 1},
|
||||||
|
{Y_LEAF_LIST, Y_WHEN, 0, 1},
|
||||||
|
{Y_LENGTH, Y_DESCRIPTION, 0, 1},
|
||||||
|
{Y_LENGTH, Y_ERROR_APP_TAG, 0, 1},
|
||||||
|
{Y_LENGTH, Y_ERROR_MESSAGE, 0, 1},
|
||||||
|
{Y_LENGTH, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_LIST, Y_ACTION, 0, NMAX},
|
||||||
|
{Y_LIST, Y_ANYDATA, 0, NMAX},
|
||||||
|
{Y_LIST, Y_ANYXML, 0, NMAX},
|
||||||
|
{Y_LIST, Y_CHOICE, 0, NMAX},
|
||||||
|
{Y_LIST, Y_CONFIG, 0, 1},
|
||||||
|
{Y_LIST, Y_CONTAINER, 0, NMAX},
|
||||||
|
{Y_LIST, Y_DESCRIPTION, 0, 1},
|
||||||
|
{Y_LIST, Y_GROUPING, 0, NMAX},
|
||||||
|
{Y_LIST, Y_IF_FEATURE, 0, NMAX},
|
||||||
|
{Y_LIST, Y_KEY, 0, 1},
|
||||||
|
{Y_LIST, Y_LEAF, 0, NMAX},
|
||||||
|
{Y_LIST, Y_LEAF_LIST, 0, NMAX},
|
||||||
|
{Y_LIST, Y_LIST, 0, NMAX},
|
||||||
|
{Y_LIST, Y_MAX_ELEMENTS, 0, 1},
|
||||||
|
{Y_LIST, Y_MIN_ELEMENTS, 0, 1},
|
||||||
|
{Y_LIST, Y_MUST, 0, NMAX},
|
||||||
|
{Y_LIST, Y_NOTIFICATION, 0, NMAX},
|
||||||
|
{Y_LIST, Y_ORDERED_BY, 0, 1},
|
||||||
|
{Y_LIST, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_LIST, Y_STATUS, 0, 1},
|
||||||
|
{Y_LIST, Y_TYPEDEF, 0, NMAX},
|
||||||
|
{Y_LIST, Y_UNIQUE, 0, NMAX},
|
||||||
|
{Y_LIST, Y_USES, 0, NMAX},
|
||||||
|
{Y_LIST, Y_WHEN, 0,1},
|
||||||
{Y_MODULE, Y_ANYDATA, 0, NMAX},
|
{Y_MODULE, Y_ANYDATA, 0, NMAX},
|
||||||
{Y_MODULE, Y_ANYXML, 0, NMAX},
|
{Y_MODULE, Y_ANYXML, 0, NMAX},
|
||||||
{Y_MODULE, Y_AUGMENT, 0, NMAX},
|
{Y_MODULE, Y_AUGMENT, 0, NMAX},
|
||||||
|
|
@ -135,16 +346,114 @@ static const struct ycard yclist[] = {
|
||||||
{Y_MODULE, Y_TYPEDEF, 0, NMAX},
|
{Y_MODULE, Y_TYPEDEF, 0, NMAX},
|
||||||
{Y_MODULE, Y_USES, 0, NMAX},
|
{Y_MODULE, Y_USES, 0, NMAX},
|
||||||
{Y_MODULE, Y_YANG_VERSION, 0, 1},
|
{Y_MODULE, Y_YANG_VERSION, 0, 1},
|
||||||
|
{Y_MUST, Y_DESCRIPTION, 0, 1},
|
||||||
|
{Y_MUST, Y_ERROR_APP_TAG, 0, 1},
|
||||||
|
{Y_MUST, Y_ERROR_MESSAGE, 0, 1},
|
||||||
|
{Y_MUST, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_NOTIFICATION, Y_ANYDATA, 0, NMAX},
|
||||||
|
{Y_NOTIFICATION, Y_ANYXML, 0, NMAX},
|
||||||
|
{Y_NOTIFICATION, Y_CHOICE, 0, NMAX},
|
||||||
|
{Y_NOTIFICATION, Y_CONTAINER, 0, NMAX},
|
||||||
|
{Y_NOTIFICATION, Y_DESCRIPTION, 0, 1},
|
||||||
|
{Y_NOTIFICATION, Y_GROUPING, 0, NMAX},
|
||||||
|
{Y_NOTIFICATION, Y_IF_FEATURE, 0, NMAX},
|
||||||
|
{Y_NOTIFICATION, Y_LEAF, 0, NMAX},
|
||||||
|
{Y_NOTIFICATION, Y_LEAF_LIST, 0, NMAX},
|
||||||
|
{Y_NOTIFICATION, Y_LIST, 0, NMAX},
|
||||||
|
{Y_NOTIFICATION, Y_MUST, 0, NMAX},
|
||||||
|
{Y_NOTIFICATION, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_NOTIFICATION, Y_STATUS, 0, 1},
|
||||||
|
{Y_NOTIFICATION, Y_TYPEDEF, 0, NMAX},
|
||||||
|
{Y_NOTIFICATION, Y_USES, 0, NMAX},
|
||||||
|
{Y_OUTPUT, Y_ANYDATA, 0, NMAX},
|
||||||
|
{Y_OUTPUT, Y_ANYXML, 0, NMAX},
|
||||||
|
{Y_OUTPUT, Y_CHOICE, 0, NMAX},
|
||||||
|
{Y_OUTPUT, Y_CONTAINER, 0, NMAX},
|
||||||
|
{Y_OUTPUT, Y_GROUPING, 0, NMAX},
|
||||||
|
{Y_OUTPUT, Y_LEAF, 0, NMAX},
|
||||||
|
{Y_OUTPUT, Y_LEAF_LIST, 0, NMAX},
|
||||||
|
{Y_OUTPUT, Y_LIST, 0, NMAX},
|
||||||
|
{Y_OUTPUT, Y_MUST, 0, NMAX},
|
||||||
|
{Y_OUTPUT, Y_TYPEDEF, 0, NMAX},
|
||||||
|
{Y_OUTPUT, Y_USES, 0, NMAX},
|
||||||
|
{Y_PATTERN, Y_DESCRIPTION, 0, 1},
|
||||||
|
{Y_PATTERN, Y_ERROR_APP_TAG, 0, 1},
|
||||||
|
{Y_PATTERN, Y_ERROR_MESSAGE, 0, 1},
|
||||||
|
{Y_PATTERN, Y_MODIFIER, 0, 1},
|
||||||
|
{Y_PATTERN, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_RANGE, Y_DESCRIPTION, 0, 1},
|
||||||
|
{Y_RANGE, Y_ERROR_APP_TAG, 0, 1},
|
||||||
|
{Y_RANGE, Y_ERROR_MESSAGE, 0, 1},
|
||||||
|
{Y_RANGE, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_REVISION, Y_DESCRIPTION, 0, 1},
|
||||||
|
{Y_REVISION, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_RPC, Y_DESCRIPTION, 0, 1},
|
||||||
|
{Y_RPC, Y_GROUPING, 0, NMAX},
|
||||||
|
{Y_RPC, Y_IF_FEATURE, 0, NMAX},
|
||||||
|
{Y_RPC, Y_INPUT, 0, 1},
|
||||||
|
{Y_RPC, Y_OUTPUT, 0, 1},
|
||||||
|
{Y_RPC, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_RPC, Y_STATUS, 0, 1},
|
||||||
|
{Y_RPC, Y_TYPEDEF, 0, NMAX},
|
||||||
|
{Y_SUBMODULE, Y_ANYDATA, 0, NMAX},
|
||||||
|
{Y_SUBMODULE, Y_AUGMENT, 0, NMAX},
|
||||||
|
{Y_SUBMODULE, Y_BELONGS_TO, 1, 1},
|
||||||
|
{Y_SUBMODULE, Y_CHOICE, 0, NMAX},
|
||||||
|
{Y_SUBMODULE, Y_CONTACT, 0, 1},
|
||||||
|
{Y_SUBMODULE, Y_CONTAINER, 0, NMAX},
|
||||||
|
{Y_SUBMODULE, Y_DESCRIPTION,0, 1},
|
||||||
|
{Y_SUBMODULE, Y_DEVIATION, 0, NMAX},
|
||||||
|
{Y_SUBMODULE, Y_EXTENSION, 0, NMAX},
|
||||||
|
{Y_SUBMODULE, Y_FEATURE, 0, NMAX},
|
||||||
|
{Y_SUBMODULE, Y_GROUPING, 0, NMAX},
|
||||||
|
{Y_SUBMODULE, Y_IDENTITY, 0, NMAX},
|
||||||
|
{Y_SUBMODULE, Y_IMPORT, 0, NMAX},
|
||||||
|
{Y_SUBMODULE, Y_INCLUDE, 0, NMAX},
|
||||||
|
{Y_SUBMODULE, Y_LEAF, 0, NMAX},
|
||||||
|
{Y_SUBMODULE, Y_LEAF_LIST, 0, NMAX},
|
||||||
|
{Y_SUBMODULE, Y_LIST, 0, NMAX},
|
||||||
|
{Y_SUBMODULE, Y_NOTIFICATION,0, NMAX},
|
||||||
|
{Y_SUBMODULE, Y_ORGANIZATION,0, 1},
|
||||||
|
{Y_SUBMODULE, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_SUBMODULE, Y_REVISION, 0, NMAX},
|
||||||
|
{Y_SUBMODULE, Y_RPC, 0, NMAX},
|
||||||
|
{Y_SUBMODULE, Y_TYPEDEF, 0, NMAX},
|
||||||
|
{Y_SUBMODULE, Y_USES, 0, NMAX},
|
||||||
|
{Y_SUBMODULE, Y_YANG_VERSION,0, 1}, /* "yang-version" statement is mandatory in YANG version "1.1". */
|
||||||
|
{Y_TYPE, Y_BASE, 0, NMAX},
|
||||||
|
{Y_TYPE, Y_BIT, 0, NMAX},
|
||||||
|
{Y_TYPE, Y_ENUM, 0, NMAX},
|
||||||
|
{Y_TYPE, Y_FRACTION_DIGITS, 0, 1},
|
||||||
|
{Y_TYPE, Y_LENGTH, 0, 1},
|
||||||
|
{Y_TYPE, Y_PATH, 0, 1},
|
||||||
|
{Y_TYPE, Y_PATTERN, 0, NMAX},
|
||||||
|
{Y_TYPE, Y_RANGE, 0, 1},
|
||||||
|
{Y_TYPE, Y_REQUIRE_INSTANCE, 0, 1},
|
||||||
|
{Y_TYPE, Y_TYPE, 0, NMAX},
|
||||||
|
{Y_TYPEDEF, Y_DEFAULT, 0, 1},
|
||||||
|
{Y_TYPEDEF, Y_DESCRIPTION,0, 1},
|
||||||
|
{Y_TYPEDEF, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_TYPEDEF, Y_STATUS, 0, 1},
|
||||||
|
{Y_TYPEDEF, Y_TYPE, 1, 1},
|
||||||
|
{Y_TYPEDEF, Y_UNITS, 0, 1},
|
||||||
|
{Y_USES, Y_AUGMENT, 0, NMAX},
|
||||||
|
{Y_USES, Y_DESCRIPTION, 0, 1},
|
||||||
|
{Y_USES, Y_IF_FEATURE, 0, NMAX},
|
||||||
|
{Y_USES, Y_REFERENCE, 0, 1},
|
||||||
|
{Y_USES, Y_REFINE, 0, NMAX},
|
||||||
|
{Y_USES, Y_STATUS, 0, 1},
|
||||||
|
{Y_USES, Y_WHEN, 0, 1},
|
||||||
{0,}
|
{0,}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*! Find yang parent and child combination in yang cardinality table
|
/*! Find yang parent and child combination in yang cardinality table
|
||||||
* @param[in] parent Parent Yang spec
|
* @param[in] parent Parent Yang spec
|
||||||
* @param[in] child Child yang spec if -1 first
|
* @param[in] child Child yang spec if 0 first
|
||||||
* @param[in] yc Yang cardinality map
|
* @param[in] yc Yang cardinality map
|
||||||
* @param[in] p If set, quit as soon as parents dont match
|
* @param[in] p If set, quit as soon as parents dont match
|
||||||
* @retval NULL Not found
|
* @retval NULL Not found
|
||||||
* @retval yp Found
|
* @retval yp Found
|
||||||
|
* @note if cardinal list above is sorted, this search could do binary
|
||||||
*/
|
*/
|
||||||
static const struct ycard *
|
static const struct ycard *
|
||||||
ycard_find(enum rfc_6020 parent,
|
ycard_find(enum rfc_6020 parent,
|
||||||
|
|
@ -202,6 +511,7 @@ yang_cardinality(clicon_handle h,
|
||||||
ck = ys->ys_keyword;
|
ck = ys->ys_keyword;
|
||||||
if (ck == Y_UNKNOWN) /* special case */
|
if (ck == Y_UNKNOWN) /* special case */
|
||||||
continue;
|
continue;
|
||||||
|
/* Find entry in yang cardinality table from parent/child keyword pair */
|
||||||
if ((yc = ycard_find(pk, ck, ycplist, 1)) == NULL){
|
if ((yc = ycard_find(pk, ck, ycplist, 1)) == NULL){
|
||||||
clicon_err(OE_YANG, 0, "%s: \"%s\" is child of \"%s\", but should not be",
|
clicon_err(OE_YANG, 0, "%s: \"%s\" is child of \"%s\", but should not be",
|
||||||
modname, yang_key2str(ck), yang_key2str(pk));
|
modname, yang_key2str(ck), yang_key2str(pk));
|
||||||
|
|
@ -231,7 +541,7 @@ yang_cardinality(clicon_handle h,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0) { /* Notyet */
|
if (1) { /* Notyet */
|
||||||
/* 4) Recurse */
|
/* 4) Recurse */
|
||||||
i = 0;
|
i = 0;
|
||||||
while (i<yt->ys_len){ /* Note, children may be removed */
|
while (i<yt->ys_len){ /* Note, children may be removed */
|
||||||
|
|
|
||||||
|
|
@ -490,8 +490,10 @@ import_substmt : prefix_stmt { clicon_debug(2,"import-stmt -> prefix-stmt"); }
|
||||||
include_stmt : K_INCLUDE identifier_str ';'
|
include_stmt : K_INCLUDE identifier_str ';'
|
||||||
{ if (ysp_add(_yy, Y_INCLUDE, $2, NULL)== NULL) _YYERROR("include_stmt");
|
{ if (ysp_add(_yy, Y_INCLUDE, $2, NULL)== NULL) _YYERROR("include_stmt");
|
||||||
clicon_debug(2,"include-stmt -> id-str"); }
|
clicon_debug(2,"include-stmt -> id-str"); }
|
||||||
| K_INCLUDE identifier_str '{' include_substmts '}'
|
| K_INCLUDE identifier_str
|
||||||
{ if (ysp_add(_yy, Y_INCLUDE, $2, NULL)== NULL) _YYERROR("include_stmt");
|
{ if (ysp_add_push(_yy, Y_INCLUDE, $2) == NULL) _YYERROR("include_stmt"); }
|
||||||
|
'{' include_substmts '}'
|
||||||
|
{ if (ystack_pop(_yy) < 0) _YYERROR("include_stmt");
|
||||||
clicon_debug(2,"include-stmt -> id-str { include-substmts }"); }
|
clicon_debug(2,"include-stmt -> id-str { include-substmts }"); }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
@ -518,9 +520,13 @@ prefix_stmt : K_PREFIX identifier_str stmtend /* XXX prefix-arg-str */
|
||||||
clicon_debug(2,"prefix-stmt -> PREFIX string ;");}
|
clicon_debug(2,"prefix-stmt -> PREFIX string ;");}
|
||||||
;
|
;
|
||||||
|
|
||||||
belongs_to_stmt : K_BELONGS_TO identifier_str '{' prefix_stmt '}'
|
belongs_to_stmt : K_BELONGS_TO identifier_str
|
||||||
{ if (ysp_add(_yy, Y_BELONGS_TO, $2, NULL)== NULL) _YYERROR("belongs_to_stmt");
|
{ if (ysp_add_push(_yy, Y_BELONGS_TO, $2) == NULL) _YYERROR("belongs_to_stmt"); }
|
||||||
clicon_debug(2,"belongs-to-stmt -> BELONGS-TO id-arg-str { prefix-stmt } ");}
|
|
||||||
|
'{' prefix_stmt '}'
|
||||||
|
{ if (ystack_pop(_yy) < 0) _YYERROR("belongs_to_stmt");
|
||||||
|
clicon_debug(2,"belongs-to-stmt -> BELONGS-TO id-arg-str { prefix-stmt } ");
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
organization_stmt: K_ORGANIZATION string stmtend
|
organization_stmt: K_ORGANIZATION string stmtend
|
||||||
|
|
@ -1469,10 +1475,10 @@ deviation_substmt : description_stmt { clicon_debug(2,"deviation-substmt -> des
|
||||||
;
|
;
|
||||||
|
|
||||||
deviate_not_supported_stmt : K_DEVIATE string stmtend
|
deviate_not_supported_stmt : K_DEVIATE string stmtend
|
||||||
{ clicon_debug(2,"deviate-not-supported-stmt -> DEVIATE string"); }
|
{ if (ysp_add(_yy, Y_DEVIATE, $2, NULL) == NULL) _YYERROR("notification_stmt");
|
||||||
|
clicon_debug(2,"deviate-not-supported-stmt -> DEVIATE string ;"); }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
/* body */
|
/* body */
|
||||||
body_stmts : body_stmts body_stmt { clicon_debug(2,"body-stmts -> body-stmts body-stmt"); }
|
body_stmts : body_stmts body_stmt { clicon_debug(2,"body-stmts -> body-stmts body-stmt"); }
|
||||||
| body_stmt { clicon_debug(2,"body-stmts -> body-stmt");}
|
| body_stmt { clicon_debug(2,"body-stmts -> body-stmt");}
|
||||||
|
|
|
||||||
|
|
@ -6,16 +6,18 @@
|
||||||
# - release/models/wifi/types/openconfig-wifi-types.yang
|
# - release/models/wifi/types/openconfig-wifi-types.yang
|
||||||
# issue: https://github.com/clicon/clixon/issues/59
|
# issue: https://github.com/clicon/clixon/issues/59
|
||||||
#
|
#
|
||||||
#PROG="valgrind --leak-check=full --show-leak-kinds=all ../util/clixon_util_yang"
|
|
||||||
PROG=../util/clixon_util_yang
|
|
||||||
OPENCONFIG=public
|
OPENCONFIG=public
|
||||||
OCDIR=$OPENCONFIG/release/models
|
OCDIR=$OPENCONFIG/release/models
|
||||||
|
|
||||||
# Clone openconfig dir if not there
|
# Clone openconfig dir if not there
|
||||||
|
if false; then
|
||||||
if [ ! -d public ]; then
|
if [ ! -d public ]; then
|
||||||
git clone https://github.com/openconfig/public
|
git clone https://github.com/openconfig/public
|
||||||
else
|
else
|
||||||
(cd public; git pull)
|
(cd public;
|
||||||
|
#git pull
|
||||||
|
)
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# include err() and new() functions and creates $dir
|
# include err() and new() functions and creates $dir
|
||||||
|
|
@ -91,7 +93,7 @@ for f in $files; do
|
||||||
let m++;
|
let m++;
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
echo "Number of modules:$m"
|
new "Openconfig test: $clixon_cli -1f $cfg -y $f show version ($m modules)"
|
||||||
for f in $files; do
|
for f in $files; do
|
||||||
if [ -n "$(head -1 $f|grep '^module')" ]; then
|
if [ -n "$(head -1 $f|grep '^module')" ]; then
|
||||||
new "cli $f"
|
new "cli $f"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue