我是YANG的新手。在阅读Module and Submodule section时,我对子模块的访问权限感到困惑。
RFC7950#section-5.1指出:
“子模块可以在其所属的模块中以及该模块包含的所有子模块中引用任何定义”
但它也表明:
“要使模块或子模块引用外部模块中的定义,必须导入外部模块必须”
所以我的理解是,如果A有两个子模块B和C,则C导入D。 然后B可以访问C中的任何定义,但不能访问D中的任何定义。
我正确吗? 如果是,B是否可以访问在C中使用D的定义?
提前谢谢
答案 0 :(得分:0)
如果A有两个子模块B和C,则C导入D。然后B可以访问C中的任何定义,但不能访问D中的定义。
是的,您是正确的。子模块仍需要自己导入。这是为了确保每个文件(请注意,我没有说“模块”)具有定义良好的前缀映射。前缀在YANG中不是继承的。
B能否访问在C中使用D的定义?
B和C看到在A,B和C中定义了的所有定义。当您在C中导入D时,您未定义任何新定义,使重新使用已定义的成为可能。 B需要为D显式导入才能查看其定义。
RFC应该被完整阅读。我建议您除了声明的内容外,还阅读“ import”语句的内容,然后再阅读“ include”语句的内容。这些部分定义了导入和包含背后的实际机制。 “属于”部分也与此相关。
导入:
“ import”语句使一个模块的定义可用 在另一个模块或子模块中。参数是名称 导入模块,该语句后跟一个 包含详细导入信息的子语句。当一个模块 导入后,导入模块可以:
o使用在顶级中定义的任何分组和typedef 导入的模块或其子模块。
o使用导入文件中定义的任何扩展名,功能和标识 模块或其子模块。
o在“必须”中使用导入的模块的架构树中的任何节点, “ path”和“ when”语句,或作为“ augment”中的目标节点 和“偏差”语句。
包括:
“ include”语句用于从子模块制作内容 可用于该子模块的父模块。该论据是 标识符,它是要包含的子模块的名称。模块是 仅允许包含属于该模块的子模块,例如 由“属于”语句定义(请参阅第7.2.2节)。
当模块包含子模块时,它将包含以下内容: 子模块进入模块的节点层次结构。
属于:
“属于”语句指定了 子模块所属。参数是一个标识符,它是 模块。
子模块只能包含在其所在的模块中 所属或属于该模块的另一个子模块。
强制性的“前缀”子语句为模块分配前缀 子模块所属的。模块中的所有定义 该子模块所属,并且可以通过以下方式访问其所有子模块 使用前缀。
请注意,YANG 1(RFC6020)中“ include”语句的作用域规则不同。我所描述的仅适用于YANG 1.1。在YANG 1中,子模块需要显式包含另一个子模块才能看到其定义,而一个子模块则不能看到包含模块中定义的定义。
您还可以阅读更多here。