Committed by
Patrick Liu
[ONOS-4842] Leafref implementation for augment and uses
Change-Id: I919553a64d683aff65a8f16e2de783702dd5a45f
Showing
89 changed files
with
1675 additions
and
481 deletions
| ... | @@ -22,8 +22,10 @@ import org.onosproject.yangutils.datamodel.utils.ResolvableStatus; | ... | @@ -22,8 +22,10 @@ import org.onosproject.yangutils.datamodel.utils.ResolvableStatus; |
| 22 | /** | 22 | /** |
| 23 | * Abstraction of YANG resolvable information. Abstracted to obtain the | 23 | * Abstraction of YANG resolvable information. Abstracted to obtain the |
| 24 | * information required for linking resolution. | 24 | * information required for linking resolution. |
| 25 | + * | ||
| 26 | + * @param <T> YANG resolvable info | ||
| 25 | */ | 27 | */ |
| 26 | -public interface Resolvable { | 28 | +public interface Resolvable<T> { |
| 27 | 29 | ||
| 28 | /** | 30 | /** |
| 29 | * Returns the status of resolution. If completely resolved returns enum | 31 | * Returns the status of resolution. If completely resolved returns enum |
| ... | @@ -48,8 +50,9 @@ public interface Resolvable { | ... | @@ -48,8 +50,9 @@ public interface Resolvable { |
| 48 | /** | 50 | /** |
| 49 | * Resolves the linking. | 51 | * Resolves the linking. |
| 50 | * | 52 | * |
| 53 | + * @return list of entities to be added for resolution | ||
| 51 | * @throws DataModelException data model exception | 54 | * @throws DataModelException data model exception |
| 52 | */ | 55 | */ |
| 53 | - void resolve() | 56 | + T resolve() |
| 54 | throws DataModelException; | 57 | throws DataModelException; |
| 55 | } | 58 | } | ... | ... |
| ... | @@ -442,8 +442,9 @@ public class YangAugment | ... | @@ -442,8 +442,9 @@ public class YangAugment |
| 442 | } | 442 | } |
| 443 | 443 | ||
| 444 | @Override | 444 | @Override |
| 445 | - public void resolve() throws DataModelException { | 445 | + public Object resolve() throws DataModelException { |
| 446 | // Resolving of target node is being done in XPathLinker. | 446 | // Resolving of target node is being done in XPathLinker. |
| 447 | + return null; | ||
| 447 | } | 448 | } |
| 448 | 449 | ||
| 449 | /** | 450 | /** | ... | ... |
| ... | @@ -109,6 +109,7 @@ import java.io.Serializable; | ... | @@ -109,6 +109,7 @@ import java.io.Serializable; |
| 109 | } | 109 | } |
| 110 | 110 | ||
| 111 | @Override | 111 | @Override |
| 112 | - public void resolve() throws DataModelException { | 112 | + public Object resolve() throws DataModelException { |
| 113 | + return null; | ||
| 113 | } | 114 | } |
| 114 | } | 115 | } | ... | ... |
| ... | @@ -18,6 +18,7 @@ package org.onosproject.yangutils.datamodel; | ... | @@ -18,6 +18,7 @@ package org.onosproject.yangutils.datamodel; |
| 18 | import java.util.ArrayList; | 18 | import java.util.ArrayList; |
| 19 | import java.util.LinkedList; | 19 | import java.util.LinkedList; |
| 20 | import java.util.List; | 20 | import java.util.List; |
| 21 | + | ||
| 21 | import org.onosproject.yangutils.datamodel.exceptions.DataModelException; | 22 | import org.onosproject.yangutils.datamodel.exceptions.DataModelException; |
| 22 | import org.onosproject.yangutils.datamodel.utils.Parsable; | 23 | import org.onosproject.yangutils.datamodel.utils.Parsable; |
| 23 | import org.onosproject.yangutils.datamodel.utils.YangConstructType; | 24 | import org.onosproject.yangutils.datamodel.utils.YangConstructType; | ... | ... |
| ... | @@ -13,34 +13,39 @@ | ... | @@ -13,34 +13,39 @@ |
| 13 | * See the License for the specific language governing permissions and | 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. | 14 | * limitations under the License. |
| 15 | */ | 15 | */ |
| 16 | -package org.onosproject.yangutils.linker.impl; | 16 | +package org.onosproject.yangutils.datamodel; |
| 17 | 17 | ||
| 18 | import java.io.Serializable; | 18 | import java.io.Serializable; |
| 19 | 19 | ||
| 20 | -import org.onosproject.yangutils.datamodel.YangEntityToResolveInfo; | ||
| 21 | -import org.onosproject.yangutils.datamodel.YangIfFeature; | ||
| 22 | -import org.onosproject.yangutils.datamodel.YangBase; | ||
| 23 | -import org.onosproject.yangutils.datamodel.YangIdentityRef; | ||
| 24 | -import org.onosproject.yangutils.datamodel.YangNode; | ||
| 25 | -import org.onosproject.yangutils.datamodel.YangType; | ||
| 26 | -import org.onosproject.yangutils.datamodel.YangUses; | ||
| 27 | -import org.onosproject.yangutils.linker.exceptions.LinkerException; | ||
| 28 | - | ||
| 29 | /** | 20 | /** |
| 30 | * Represents implementation of information about entity being resolved. | 21 | * Represents implementation of information about entity being resolved. |
| 31 | * | 22 | * |
| 32 | * @param <T> type of entity being resolved, uses / grouping | 23 | * @param <T> type of entity being resolved, uses / grouping |
| 33 | */ | 24 | */ |
| 34 | -public class YangEntityToResolveInfoImpl<T> implements YangEntityToResolveInfo<T>, Serializable { | 25 | +public class YangEntityToResolveInfoImpl<T> implements YangEntityToResolveInfo<T>, Serializable, LocationInfo { |
| 35 | 26 | ||
| 36 | private static final long serialVersionUID = 806201659L; | 27 | private static final long serialVersionUID = 806201659L; |
| 37 | 28 | ||
| 38 | - // Parsable node for which resolution is to be performed. | 29 | + /** |
| 30 | + * Parsable node for which resolution is to be performed. | ||
| 31 | + */ | ||
| 39 | private T entityToResolve; | 32 | private T entityToResolve; |
| 40 | 33 | ||
| 41 | - // Holder of the YANG construct for which resolution has to be carried out. | 34 | + /** |
| 35 | + * Holder of the YANG construct for which resolution has to be carried out. | ||
| 36 | + */ | ||
| 42 | private YangNode holderOfEntityToResolve; | 37 | private YangNode holderOfEntityToResolve; |
| 43 | 38 | ||
| 39 | + /** | ||
| 40 | + * Error line number. | ||
| 41 | + */ | ||
| 42 | + private transient int lineNumber; | ||
| 43 | + | ||
| 44 | + /** | ||
| 45 | + * Error character position in number. | ||
| 46 | + */ | ||
| 47 | + private transient int charPositionInLine; | ||
| 48 | + | ||
| 44 | @Override | 49 | @Override |
| 45 | public T getEntityToResolve() { | 50 | public T getEntityToResolve() { |
| 46 | return entityToResolve; | 51 | return entityToResolve; |
| ... | @@ -61,33 +66,23 @@ public class YangEntityToResolveInfoImpl<T> implements YangEntityToResolveInfo<T | ... | @@ -61,33 +66,23 @@ public class YangEntityToResolveInfoImpl<T> implements YangEntityToResolveInfo<T |
| 61 | this.holderOfEntityToResolve = holderOfEntityToResolve; | 66 | this.holderOfEntityToResolve = holderOfEntityToResolve; |
| 62 | } | 67 | } |
| 63 | 68 | ||
| 64 | - /** | 69 | + @Override |
| 65 | - * Retrieves the prefix of the entity. | 70 | + public int getLineNumber() { |
| 66 | - * | 71 | + return lineNumber; |
| 67 | - * @return entities prefix | 72 | + } |
| 68 | - * @throws LinkerException linker error | ||
| 69 | - */ | ||
| 70 | - public String getEntityPrefix() | ||
| 71 | - throws LinkerException { | ||
| 72 | - if (getEntityToResolve() == null) { | ||
| 73 | - return null; | ||
| 74 | - } | ||
| 75 | 73 | ||
| 76 | - String prefix; | 74 | + @Override |
| 77 | - T entityToBeResolved = getEntityToResolve(); | 75 | + public int getCharPosition() { |
| 78 | - if (entityToBeResolved instanceof YangType) { | 76 | + return charPositionInLine; |
| 79 | - prefix = ((YangType<?>) entityToBeResolved).getPrefix(); | 77 | + } |
| 80 | - } else if (entityToBeResolved instanceof YangUses) { | 78 | + |
| 81 | - prefix = ((YangUses) entityToBeResolved).getPrefix(); | 79 | + @Override |
| 82 | - } else if (entityToBeResolved instanceof YangIfFeature) { | 80 | + public void setLineNumber(int lineNumber) { |
| 83 | - prefix = ((YangIfFeature) entityToBeResolved).getPrefix(); | 81 | + this.lineNumber = lineNumber; |
| 84 | - } else if (entityToBeResolved instanceof YangBase) { | 82 | + } |
| 85 | - prefix = ((YangBase) entityToBeResolved).getBaseIdentifier().getPrefix(); | 83 | + |
| 86 | - } else if (entityToBeResolved instanceof YangIdentityRef) { | 84 | + @Override |
| 87 | - prefix = ((YangIdentityRef) entityToBeResolved).getBaseIdentity().getPrefix(); | 85 | + public void setCharPosition(int charPositionInLine) { |
| 88 | - } else { | 86 | + this.charPositionInLine = charPositionInLine; |
| 89 | - throw new LinkerException("Linker Exception: Entity to resolved is other than type/uses"); | ||
| 90 | - } | ||
| 91 | - return prefix; | ||
| 92 | } | 87 | } |
| 93 | } | 88 | } | ... | ... |
| ... | @@ -80,7 +80,7 @@ public class YangIdentityRef extends YangNode implements Parsable, Resolvable, S | ... | @@ -80,7 +80,7 @@ public class YangIdentityRef extends YangNode implements Parsable, Resolvable, S |
| 80 | } | 80 | } |
| 81 | 81 | ||
| 82 | @Override | 82 | @Override |
| 83 | - public void resolve() throws DataModelException { | 83 | + public Object resolve() throws DataModelException { |
| 84 | 84 | ||
| 85 | // Check if the derived info is present. | 85 | // Check if the derived info is present. |
| 86 | YangIdentity identity = getReferredIdentity(); | 86 | YangIdentity identity = getReferredIdentity(); |
| ... | @@ -92,10 +92,11 @@ public class YangIdentityRef extends YangNode implements Parsable, Resolvable, S | ... | @@ -92,10 +92,11 @@ public class YangIdentityRef extends YangNode implements Parsable, Resolvable, S |
| 92 | while (identity.getBaseNode() != null) { | 92 | while (identity.getBaseNode() != null) { |
| 93 | if (identity.getBaseNode().getResolvableStatus() != ResolvableStatus.RESOLVED) { | 93 | if (identity.getBaseNode().getResolvableStatus() != ResolvableStatus.RESOLVED) { |
| 94 | setResolvableStatus(ResolvableStatus.INTRA_FILE_RESOLVED); | 94 | setResolvableStatus(ResolvableStatus.INTRA_FILE_RESOLVED); |
| 95 | - return; | 95 | + return null; |
| 96 | } | 96 | } |
| 97 | identity = identity.getBaseNode().getReferredIdentity(); | 97 | identity = identity.getBaseNode().getReferredIdentity(); |
| 98 | } | 98 | } |
| 99 | + return null; | ||
| 99 | } | 100 | } |
| 100 | 101 | ||
| 101 | /** | 102 | /** | ... | ... |
| ... | @@ -170,7 +170,7 @@ public class YangIfFeature implements Parsable, Resolvable, Serializable { | ... | @@ -170,7 +170,7 @@ public class YangIfFeature implements Parsable, Resolvable, Serializable { |
| 170 | } | 170 | } |
| 171 | 171 | ||
| 172 | @Override | 172 | @Override |
| 173 | - public void resolve() throws DataModelException { | 173 | + public Object resolve() throws DataModelException { |
| 174 | YangFeature feature = getReferredFeature(); | 174 | YangFeature feature = getReferredFeature(); |
| 175 | 175 | ||
| 176 | // check whether feature has if-feature | 176 | // check whether feature has if-feature |
| ... | @@ -181,9 +181,10 @@ public class YangIfFeature implements Parsable, Resolvable, Serializable { | ... | @@ -181,9 +181,10 @@ public class YangIfFeature implements Parsable, Resolvable, Serializable { |
| 181 | YangIfFeature ifFeature = ifFeatureIterator.next(); | 181 | YangIfFeature ifFeature = ifFeatureIterator.next(); |
| 182 | if (ifFeature.getResolvableStatus() != ResolvableStatus.RESOLVED) { | 182 | if (ifFeature.getResolvableStatus() != ResolvableStatus.RESOLVED) { |
| 183 | setResolvableStatus(ResolvableStatus.INTRA_FILE_RESOLVED); | 183 | setResolvableStatus(ResolvableStatus.INTRA_FILE_RESOLVED); |
| 184 | - return; | 184 | + return null; |
| 185 | } | 185 | } |
| 186 | } | 186 | } |
| 187 | } | 187 | } |
| 188 | + return null; | ||
| 188 | } | 189 | } |
| 189 | } | 190 | } | ... | ... |
| ... | @@ -16,17 +16,18 @@ | ... | @@ -16,17 +16,18 @@ |
| 16 | 16 | ||
| 17 | package org.onosproject.yangutils.datamodel; | 17 | package org.onosproject.yangutils.datamodel; |
| 18 | 18 | ||
| 19 | -import java.io.Serializable; | ||
| 20 | -import java.util.Iterator; | ||
| 21 | -import java.util.LinkedList; | ||
| 22 | -import java.util.List; | ||
| 23 | - | ||
| 24 | import org.onosproject.yangutils.datamodel.exceptions.DataModelException; | 19 | import org.onosproject.yangutils.datamodel.exceptions.DataModelException; |
| 25 | import org.onosproject.yangutils.datamodel.utils.Parsable; | 20 | import org.onosproject.yangutils.datamodel.utils.Parsable; |
| 26 | import org.onosproject.yangutils.datamodel.utils.ResolvableStatus; | 21 | import org.onosproject.yangutils.datamodel.utils.ResolvableStatus; |
| 27 | import org.onosproject.yangutils.datamodel.utils.YangConstructType; | 22 | import org.onosproject.yangutils.datamodel.utils.YangConstructType; |
| 28 | import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes; | 23 | import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes; |
| 29 | 24 | ||
| 25 | +import java.io.Serializable; | ||
| 26 | +import java.util.Iterator; | ||
| 27 | +import java.util.LinkedList; | ||
| 28 | +import java.util.List; | ||
| 29 | +import java.util.Map; | ||
| 30 | + | ||
| 30 | import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.INTRA_FILE_RESOLVED; | 31 | import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.INTRA_FILE_RESOLVED; |
| 31 | import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.RESOLVED; | 32 | import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.RESOLVED; |
| 32 | import static org.onosproject.yangutils.datamodel.utils.YangErrMsgConstants.DATA_MISSING_ERROR_TAG; | 33 | import static org.onosproject.yangutils.datamodel.utils.YangErrMsgConstants.DATA_MISSING_ERROR_TAG; |
| ... | @@ -47,7 +48,7 @@ import static org.onosproject.yangutils.datamodel.utils.YangErrMsgConstants.INST | ... | @@ -47,7 +48,7 @@ import static org.onosproject.yangutils.datamodel.utils.YangErrMsgConstants.INST |
| 47 | * @param <T> YANG leafref info | 48 | * @param <T> YANG leafref info |
| 48 | */ | 49 | */ |
| 49 | public class YangLeafRef<T> implements Parsable, Resolvable, Serializable, YangIfFeatureHolder, | 50 | public class YangLeafRef<T> implements Parsable, Resolvable, Serializable, YangIfFeatureHolder, |
| 50 | - YangXPathResolver, YangAppErrorHolder { | 51 | + YangXPathResolver, YangAppErrorHolder, LocationInfo { |
| 51 | 52 | ||
| 52 | private static final long serialVersionUID = 286201644L; | 53 | private static final long serialVersionUID = 286201644L; |
| 53 | 54 | ||
| ... | @@ -100,6 +101,61 @@ public class YangLeafRef<T> implements Parsable, Resolvable, Serializable, YangI | ... | @@ -100,6 +101,61 @@ public class YangLeafRef<T> implements Parsable, Resolvable, Serializable, YangI |
| 100 | private List<YangIfFeature> ifFeatureList; | 101 | private List<YangIfFeature> ifFeatureList; |
| 101 | 102 | ||
| 102 | /** | 103 | /** |
| 104 | + * Parent node of the leafref's leaf. | ||
| 105 | + */ | ||
| 106 | + private YangNode parentNodeOfLeafref; | ||
| 107 | + | ||
| 108 | + /** | ||
| 109 | + * Error line number. | ||
| 110 | + */ | ||
| 111 | + private transient int lineNumber; | ||
| 112 | + | ||
| 113 | + /** | ||
| 114 | + * Error character position in number. | ||
| 115 | + */ | ||
| 116 | + private transient int charPositionInLine; | ||
| 117 | + | ||
| 118 | + /** | ||
| 119 | + * Prefix in the nodes of the leafref path and its imported node name. | ||
| 120 | + */ | ||
| 121 | + private Map<String, String> prefixAndItsImportedModule; | ||
| 122 | + | ||
| 123 | + /** | ||
| 124 | + * Returns the prefix in the leafref path and its imported node name. | ||
| 125 | + * | ||
| 126 | + * @return the list of leafref prefix and imported node name | ||
| 127 | + */ | ||
| 128 | + public Map<String, String> getPrefixAndItsImportedModule() { | ||
| 129 | + return prefixAndItsImportedModule; | ||
| 130 | + } | ||
| 131 | + | ||
| 132 | + /** | ||
| 133 | + * Sets the prefix in the leafref path and its imported node name. | ||
| 134 | + * | ||
| 135 | + * @param prefixAndItsImportedModule the list of leafref prefix and imported node name | ||
| 136 | + */ | ||
| 137 | + public void setPrefixAndItsImportedModule(Map<String, String> prefixAndItsImportedModule) { | ||
| 138 | + this.prefixAndItsImportedModule = prefixAndItsImportedModule; | ||
| 139 | + } | ||
| 140 | + | ||
| 141 | + /** | ||
| 142 | + * Returns the parent node from the leafref's leaf. | ||
| 143 | + * | ||
| 144 | + * @return parent node of the leafref | ||
| 145 | + */ | ||
| 146 | + public YangNode getParentNodeOfLeafref() { | ||
| 147 | + return parentNodeOfLeafref; | ||
| 148 | + } | ||
| 149 | + | ||
| 150 | + /** | ||
| 151 | + * Sets the parent node from the leafref's leaf. | ||
| 152 | + * | ||
| 153 | + * @param parentNodeOfLeafref parent node of the leafref | ||
| 154 | + */ | ||
| 155 | + public void setParentNodeOfLeafref(YangNode parentNodeOfLeafref) { | ||
| 156 | + this.parentNodeOfLeafref = parentNodeOfLeafref; | ||
| 157 | + } | ||
| 158 | + /** | ||
| 103 | * YANG application error information. | 159 | * YANG application error information. |
| 104 | */ | 160 | */ |
| 105 | private YangAppErrorInfo yangAppErrorInfo; | 161 | private YangAppErrorInfo yangAppErrorInfo; |
| ... | @@ -294,7 +350,7 @@ public class YangLeafRef<T> implements Parsable, Resolvable, Serializable, YangI | ... | @@ -294,7 +350,7 @@ public class YangLeafRef<T> implements Parsable, Resolvable, Serializable, YangI |
| 294 | } | 350 | } |
| 295 | 351 | ||
| 296 | @Override | 352 | @Override |
| 297 | - public void resolve() throws DataModelException { | 353 | + public Object resolve() throws DataModelException { |
| 298 | 354 | ||
| 299 | if (getReferredLeafOrLeafList() == null) { | 355 | if (getReferredLeafOrLeafList() == null) { |
| 300 | throw new DataModelException("Linker Error: The leafref does not refer to any leaf/leaf-list."); | 356 | throw new DataModelException("Linker Error: The leafref does not refer to any leaf/leaf-list."); |
| ... | @@ -306,6 +362,7 @@ public class YangLeafRef<T> implements Parsable, Resolvable, Serializable, YangI | ... | @@ -306,6 +362,7 @@ public class YangLeafRef<T> implements Parsable, Resolvable, Serializable, YangI |
| 306 | } catch (DataModelException e) { | 362 | } catch (DataModelException e) { |
| 307 | throw new DataModelException(e.getMessage()); | 363 | throw new DataModelException(e.getMessage()); |
| 308 | } | 364 | } |
| 365 | + return null; | ||
| 309 | } | 366 | } |
| 310 | 367 | ||
| 311 | /** | 368 | /** |
| ... | @@ -443,4 +500,24 @@ public class YangLeafRef<T> implements Parsable, Resolvable, Serializable, YangI | ... | @@ -443,4 +500,24 @@ public class YangLeafRef<T> implements Parsable, Resolvable, Serializable, YangI |
| 443 | throw new DataModelException("Linker Error: The leafref must refer only to leaf/leaf-list."); | 500 | throw new DataModelException("Linker Error: The leafref must refer only to leaf/leaf-list."); |
| 444 | } | 501 | } |
| 445 | } | 502 | } |
| 503 | + | ||
| 504 | + @Override | ||
| 505 | + public int getLineNumber() { | ||
| 506 | + return lineNumber; | ||
| 507 | + } | ||
| 508 | + | ||
| 509 | + @Override | ||
| 510 | + public int getCharPosition() { | ||
| 511 | + return charPositionInLine; | ||
| 512 | + } | ||
| 513 | + | ||
| 514 | + @Override | ||
| 515 | + public void setLineNumber(int lineNumber) { | ||
| 516 | + this.lineNumber = lineNumber; | ||
| 517 | + } | ||
| 518 | + | ||
| 519 | + @Override | ||
| 520 | + public void setCharPosition(int charPositionInLine) { | ||
| 521 | + this.charPositionInLine = charPositionInLine; | ||
| 522 | + } | ||
| 446 | } | 523 | } | ... | ... |
| ... | @@ -16,15 +16,15 @@ | ... | @@ -16,15 +16,15 @@ |
| 16 | 16 | ||
| 17 | package org.onosproject.yangutils.datamodel; | 17 | package org.onosproject.yangutils.datamodel; |
| 18 | 18 | ||
| 19 | -import java.util.ArrayList; | ||
| 20 | -import java.util.LinkedList; | ||
| 21 | -import java.util.List; | ||
| 22 | - | ||
| 23 | import org.onosproject.yangutils.datamodel.exceptions.DataModelException; | 19 | import org.onosproject.yangutils.datamodel.exceptions.DataModelException; |
| 24 | import org.onosproject.yangutils.datamodel.utils.Parsable; | 20 | import org.onosproject.yangutils.datamodel.utils.Parsable; |
| 25 | import org.onosproject.yangutils.datamodel.utils.YangConstructType; | 21 | import org.onosproject.yangutils.datamodel.utils.YangConstructType; |
| 26 | import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes; | 22 | import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes; |
| 27 | 23 | ||
| 24 | +import java.util.ArrayList; | ||
| 25 | +import java.util.LinkedList; | ||
| 26 | +import java.util.List; | ||
| 27 | + | ||
| 28 | import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCollidingChildUtil; | 28 | import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCollidingChildUtil; |
| 29 | 29 | ||
| 30 | /* | 30 | /* |
| ... | @@ -119,6 +119,26 @@ public class YangList | ... | @@ -119,6 +119,26 @@ public class YangList |
| 119 | private List<String> keyList; | 119 | private List<String> keyList; |
| 120 | 120 | ||
| 121 | /** | 121 | /** |
| 122 | + * Reference RFC 6020. | ||
| 123 | + * | ||
| 124 | + * The "unique" statement is used to put constraints on valid list | ||
| 125 | + * entries. It takes as an argument a string that contains a space- | ||
| 126 | + * separated list of schema node identifiers, which MUST be given in the | ||
| 127 | + * descendant form. Each such schema node identifier MUST refer to a leaf. | ||
| 128 | + * | ||
| 129 | + * If one of the referenced leafs represents configuration data, then | ||
| 130 | + * all of the referenced leafs MUST represent configuration data. | ||
| 131 | + * | ||
| 132 | + * The "unique" constraint specifies that the combined values of all the | ||
| 133 | + * leaf instances specified in the argument string, including leafs with | ||
| 134 | + * default values, MUST be unique within all list entry instances in | ||
| 135 | + * which all referenced leafs exist. | ||
| 136 | + * | ||
| 137 | + * List of unique leaf/leaf-list names | ||
| 138 | + */ | ||
| 139 | + private List<String> uniqueList; | ||
| 140 | + | ||
| 141 | + /** | ||
| 122 | * List of leaves. | 142 | * List of leaves. |
| 123 | */ | 143 | */ |
| 124 | private List<YangLeaf> listOfLeaf; | 144 | private List<YangLeaf> listOfLeaf; |
| ... | @@ -271,6 +291,24 @@ public class YangList | ... | @@ -271,6 +291,24 @@ public class YangList |
| 271 | } | 291 | } |
| 272 | 292 | ||
| 273 | /** | 293 | /** |
| 294 | + * Returns the list of unique field names. | ||
| 295 | + * | ||
| 296 | + * @return the list of unique field names | ||
| 297 | + */ | ||
| 298 | + public List<String> getUniqueList() { | ||
| 299 | + return uniqueList; | ||
| 300 | + } | ||
| 301 | + | ||
| 302 | + /** | ||
| 303 | + * Sets the list of unique field names. | ||
| 304 | + * | ||
| 305 | + * @param uniqueList the list of unique field names | ||
| 306 | + */ | ||
| 307 | + private void setUniqueList(List<String> uniqueList) { | ||
| 308 | + this.uniqueList = uniqueList; | ||
| 309 | + } | ||
| 310 | + | ||
| 311 | + /** | ||
| 274 | * Returns the list of key field names. | 312 | * Returns the list of key field names. |
| 275 | * | 313 | * |
| 276 | * @return the list of key field names | 314 | * @return the list of key field names |
| ... | @@ -309,6 +347,24 @@ public class YangList | ... | @@ -309,6 +347,24 @@ public class YangList |
| 309 | } | 347 | } |
| 310 | 348 | ||
| 311 | /** | 349 | /** |
| 350 | + * Adds a unique field name. | ||
| 351 | + * | ||
| 352 | + * @param unique unique field name. | ||
| 353 | + * @throws DataModelException a violation of data model rules | ||
| 354 | + */ | ||
| 355 | + public void addUnique(String unique) | ||
| 356 | + throws DataModelException { | ||
| 357 | + if (getUniqueList() == null) { | ||
| 358 | + setUniqueList(new LinkedList<>()); | ||
| 359 | + } | ||
| 360 | + if (getUniqueList().contains(unique)) { | ||
| 361 | + throw new DataModelException("A leaf identifier must not appear more than once in the\n" + | ||
| 362 | + " unique"); | ||
| 363 | + } | ||
| 364 | + getUniqueList().add(unique); | ||
| 365 | + } | ||
| 366 | + | ||
| 367 | + /** | ||
| 312 | * Returns the list of leaves. | 368 | * Returns the list of leaves. |
| 313 | * | 369 | * |
| 314 | * @return the list of leaves | 370 | * @return the list of leaves |
| ... | @@ -489,11 +545,11 @@ public class YangList | ... | @@ -489,11 +545,11 @@ public class YangList |
| 489 | validateConfig(leaves, leafLists); | 545 | validateConfig(leaves, leafLists); |
| 490 | 546 | ||
| 491 | /* A list must have atleast one key leaf if config is true */ | 547 | /* A list must have atleast one key leaf if config is true */ |
| 492 | - if (isConfig && (keys == null || leaves == null && leafLists == null) && !isUsesPresentInList() | 548 | + if (isConfig && (keys == null || leaves == null) && !isUsesPresentInList() |
| 493 | && !isListPresentInGrouping()) { | 549 | && !isListPresentInGrouping()) { |
| 494 | throw new DataModelException("A list must have atleast one key leaf if config is true;"); | 550 | throw new DataModelException("A list must have atleast one key leaf if config is true;"); |
| 495 | } else if (keys != null) { | 551 | } else if (keys != null) { |
| 496 | - validateKey(leaves, leafLists, keys); | 552 | + validateKey(leaves, keys); |
| 497 | } | 553 | } |
| 498 | } | 554 | } |
| 499 | 555 | ||
| ... | @@ -501,7 +557,7 @@ public class YangList | ... | @@ -501,7 +557,7 @@ public class YangList |
| 501 | * Sets the config's value to all leaf if leaf's config statement is not | 557 | * Sets the config's value to all leaf if leaf's config statement is not |
| 502 | * specified. | 558 | * specified. |
| 503 | * | 559 | * |
| 504 | - * @param leaves list of leaf attributes of YANG list | 560 | + * @param leaves list of leaf attributes of YANG list |
| 505 | * @param leafLists list of leaf-list attributes of YANG list | 561 | * @param leafLists list of leaf-list attributes of YANG list |
| 506 | */ | 562 | */ |
| 507 | private void setDefaultConfigValueToChild(List<YangLeaf> leaves, List<YangLeafList> leafLists) { | 563 | private void setDefaultConfigValueToChild(List<YangLeaf> leaves, List<YangLeafList> leafLists) { |
| ... | @@ -534,7 +590,7 @@ public class YangList | ... | @@ -534,7 +590,7 @@ public class YangList |
| 534 | /** | 590 | /** |
| 535 | * Validates config statement of YANG list. | 591 | * Validates config statement of YANG list. |
| 536 | * | 592 | * |
| 537 | - * @param leaves list of leaf attributes of YANG list | 593 | + * @param leaves list of leaf attributes of YANG list |
| 538 | * @param leafLists list of leaf-list attributes of YANG list | 594 | * @param leafLists list of leaf-list attributes of YANG list |
| 539 | * @throws DataModelException a violation of data model rules | 595 | * @throws DataModelException a violation of data model rules |
| 540 | */ | 596 | */ |
| ... | @@ -567,16 +623,15 @@ public class YangList | ... | @@ -567,16 +623,15 @@ public class YangList |
| 567 | /** | 623 | /** |
| 568 | * Validates key statement of list. | 624 | * Validates key statement of list. |
| 569 | * | 625 | * |
| 570 | - * @param leaves list of leaf attributes of list | 626 | + * @param leaves list of leaf attributes of list |
| 571 | * @param leafLists list of leaf-list attributes of list | 627 | * @param leafLists list of leaf-list attributes of list |
| 572 | - * @param keys list of key attributes of list | 628 | + * @param keys list of key attributes of list |
| 573 | * @throws DataModelException a violation of data model rules | 629 | * @throws DataModelException a violation of data model rules |
| 574 | */ | 630 | */ |
| 575 | - private void validateKey(List<YangLeaf> leaves, List<YangLeafList> leafLists, List<String> keys) | 631 | + private void validateKey(List<YangLeaf> leaves, List<String> keys) |
| 576 | throws DataModelException { | 632 | throws DataModelException { |
| 577 | boolean leafFound = false; | 633 | boolean leafFound = false; |
| 578 | List<YangLeaf> keyLeaves = new LinkedList<>(); | 634 | List<YangLeaf> keyLeaves = new LinkedList<>(); |
| 579 | - List<YangLeafList> keyLeafLists = new LinkedList<>(); | ||
| 580 | 635 | ||
| 581 | /* | 636 | /* |
| 582 | * 1. Leaf identifier must refer to a child leaf of the list 2. A leaf | 637 | * 1. Leaf identifier must refer to a child leaf of the list 2. A leaf |
| ... | @@ -597,20 +652,6 @@ public class YangList | ... | @@ -597,20 +652,6 @@ public class YangList |
| 597 | } | 652 | } |
| 598 | } | 653 | } |
| 599 | 654 | ||
| 600 | - if (leafLists != null && !leafLists.isEmpty()) { | ||
| 601 | - for (YangLeafList leafList : leafLists) { | ||
| 602 | - if (key.equals(leafList.getName())) { | ||
| 603 | - if (leafList.getDataType().getDataType() == YangDataTypes.EMPTY) { | ||
| 604 | - throw new DataModelException(" A leaf-list that is part of the key" + | ||
| 605 | - " must not be the built-in type \"empty\"."); | ||
| 606 | - } | ||
| 607 | - leafFound = true; | ||
| 608 | - keyLeafLists.add(leafList); | ||
| 609 | - break; | ||
| 610 | - } | ||
| 611 | - } | ||
| 612 | - } | ||
| 613 | - | ||
| 614 | if (!leafFound && !isUsesPresentInList() && !isListPresentInGrouping()) { | 655 | if (!leafFound && !isUsesPresentInList() && !isListPresentInGrouping()) { |
| 615 | throw new DataModelException("An identifier, in key, must refer to a child leaf of the list"); | 656 | throw new DataModelException("An identifier, in key, must refer to a child leaf of the list"); |
| 616 | } | 657 | } |
| ... | @@ -627,17 +668,6 @@ public class YangList | ... | @@ -627,17 +668,6 @@ public class YangList |
| 627 | " \"config\" as the list itself."); | 668 | " \"config\" as the list itself."); |
| 628 | } | 669 | } |
| 629 | } | 670 | } |
| 630 | - | ||
| 631 | - /* | ||
| 632 | - * All key leafs in a list MUST have the same value for their "config" | ||
| 633 | - * as the list itself. | ||
| 634 | - */ | ||
| 635 | - for (YangLeafList keyLeafList : keyLeafLists) { | ||
| 636 | - if (isConfig() != keyLeafList.isConfig()) { | ||
| 637 | - throw new DataModelException("All key leaf-lists in a list must have the same value for their" + | ||
| 638 | - " \"config\" as the list itself."); | ||
| 639 | - } | ||
| 640 | - } | ||
| 641 | } | 671 | } |
| 642 | 672 | ||
| 643 | @Override | 673 | @Override | ... | ... |
| ... | @@ -272,12 +272,12 @@ public abstract class YangNode | ... | @@ -272,12 +272,12 @@ public abstract class YangNode |
| 272 | * @throws CloneNotSupportedException clone is not supported by the referred | 272 | * @throws CloneNotSupportedException clone is not supported by the referred |
| 273 | * node | 273 | * node |
| 274 | */ | 274 | */ |
| 275 | - public YangNode clone() | 275 | + public YangNode clone(YangUses yangUses) |
| 276 | throws CloneNotSupportedException { | 276 | throws CloneNotSupportedException { |
| 277 | YangNode clonedNode = (YangNode) super.clone(); | 277 | YangNode clonedNode = (YangNode) super.clone(); |
| 278 | if (clonedNode instanceof YangLeavesHolder) { | 278 | if (clonedNode instanceof YangLeavesHolder) { |
| 279 | try { | 279 | try { |
| 280 | - cloneLeaves((YangLeavesHolder) clonedNode); | 280 | + cloneLeaves((YangLeavesHolder) clonedNode, yangUses); |
| 281 | } catch (DataModelException e) { | 281 | } catch (DataModelException e) { |
| 282 | throw new CloneNotSupportedException(e.getMessage()); | 282 | throw new CloneNotSupportedException(e.getMessage()); |
| 283 | } | 283 | } |
| ... | @@ -299,7 +299,7 @@ public abstract class YangNode | ... | @@ -299,7 +299,7 @@ public abstract class YangNode |
| 299 | * @param dstRootNode destination node where the sub tree needs to be cloned | 299 | * @param dstRootNode destination node where the sub tree needs to be cloned |
| 300 | * @throws DataModelException data model error | 300 | * @throws DataModelException data model error |
| 301 | */ | 301 | */ |
| 302 | - public static void cloneSubTree(YangNode srcRootNode, YangNode dstRootNode) | 302 | + public static void cloneSubTree(YangNode srcRootNode, YangNode dstRootNode, YangUses yangUses) |
| 303 | throws DataModelException { | 303 | throws DataModelException { |
| 304 | 304 | ||
| 305 | YangNode nextNodeToClone = srcRootNode; | 305 | YangNode nextNodeToClone = srcRootNode; |
| ... | @@ -327,7 +327,7 @@ public abstract class YangNode | ... | @@ -327,7 +327,7 @@ public abstract class YangNode |
| 327 | throw new DataModelException("Internal error: Cloning failed, source tree null pointer reached"); | 327 | throw new DataModelException("Internal error: Cloning failed, source tree null pointer reached"); |
| 328 | } | 328 | } |
| 329 | if (curTraversal != PARENT) { | 329 | if (curTraversal != PARENT) { |
| 330 | - newNode = nextNodeToClone.clone(); | 330 | + newNode = nextNodeToClone.clone(yangUses); |
| 331 | detectCollisionWhileCloning(clonedTreeCurNode, newNode, curTraversal); | 331 | detectCollisionWhileCloning(clonedTreeCurNode, newNode, curTraversal); |
| 332 | } | 332 | } |
| 333 | 333 | ... | ... |
| ... | @@ -239,7 +239,7 @@ public class YangType<T> | ... | @@ -239,7 +239,7 @@ public class YangType<T> |
| 239 | } | 239 | } |
| 240 | 240 | ||
| 241 | @Override | 241 | @Override |
| 242 | - public void resolve() | 242 | + public Object resolve() |
| 243 | throws DataModelException { | 243 | throws DataModelException { |
| 244 | /* | 244 | /* |
| 245 | * Check whether the data type is derived. | 245 | * Check whether the data type is derived. |
| ... | @@ -260,6 +260,7 @@ public class YangType<T> | ... | @@ -260,6 +260,7 @@ public class YangType<T> |
| 260 | } catch (DataModelException e) { | 260 | } catch (DataModelException e) { |
| 261 | throw new DataModelException(e.getMessage()); | 261 | throw new DataModelException(e.getMessage()); |
| 262 | } | 262 | } |
| 263 | + return null; | ||
| 263 | } | 264 | } |
| 264 | 265 | ||
| 265 | /** | 266 | /** | ... | ... |
| ... | @@ -26,6 +26,8 @@ import org.onosproject.yangutils.datamodel.utils.YangConstructType; | ... | @@ -26,6 +26,8 @@ import org.onosproject.yangutils.datamodel.utils.YangConstructType; |
| 26 | import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCollidingChildUtil; | 26 | import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCollidingChildUtil; |
| 27 | import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.getParentNodeInGenCode; | 27 | import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.getParentNodeInGenCode; |
| 28 | import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.updateClonedLeavesUnionEnumRef; | 28 | import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.updateClonedLeavesUnionEnumRef; |
| 29 | +import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.resolveLeafrefUnderGroupingForLeaf; | ||
| 30 | +import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.resolveLeafrefUnderGroupingForLeafList; | ||
| 29 | 31 | ||
| 30 | /*- | 32 | /*- |
| 31 | * Reference RFC 6020. | 33 | * Reference RFC 6020. |
| ... | @@ -126,6 +128,16 @@ public class YangUses | ... | @@ -126,6 +128,16 @@ public class YangUses |
| 126 | private List<List<YangLeafList>> resolvedGroupingLeafLists; | 128 | private List<List<YangLeafList>> resolvedGroupingLeafLists; |
| 127 | 129 | ||
| 128 | /** | 130 | /** |
| 131 | + * Effective list of leaf lists of grouping that needs to replicated at YANG uses. | ||
| 132 | + */ | ||
| 133 | + private List<YangEntityToResolveInfoImpl> entityToResolveInfoList; | ||
| 134 | + | ||
| 135 | + /** | ||
| 136 | + * Current grouping depth for uses. | ||
| 137 | + */ | ||
| 138 | + private int currentGroupingDepth; | ||
| 139 | + | ||
| 140 | + /** | ||
| 129 | * Creates an YANG uses node. | 141 | * Creates an YANG uses node. |
| 130 | */ | 142 | */ |
| 131 | public YangUses() { | 143 | public YangUses() { |
| ... | @@ -138,6 +150,38 @@ public class YangUses | ... | @@ -138,6 +150,38 @@ public class YangUses |
| 138 | } | 150 | } |
| 139 | 151 | ||
| 140 | /** | 152 | /** |
| 153 | + * Returns the list of entity to resolve. | ||
| 154 | + * | ||
| 155 | + * @return the list of entity to resolve | ||
| 156 | + */ | ||
| 157 | + public List<YangEntityToResolveInfoImpl> getEntityToResolveInfoList() { | ||
| 158 | + return entityToResolveInfoList; | ||
| 159 | + } | ||
| 160 | + | ||
| 161 | + /** | ||
| 162 | + * Sets the list of entity to resolve. | ||
| 163 | + * | ||
| 164 | + * @param entityToResolveInfoList the list of entity to resolve | ||
| 165 | + */ | ||
| 166 | + public void setEntityToResolveInfoList(List<YangEntityToResolveInfoImpl> entityToResolveInfoList) { | ||
| 167 | + this.entityToResolveInfoList = entityToResolveInfoList; | ||
| 168 | + } | ||
| 169 | + | ||
| 170 | + /** | ||
| 171 | + * Adds an entity to resolve in list. | ||
| 172 | + * | ||
| 173 | + * @param entityToResolve entity to resolved | ||
| 174 | + * @throws DataModelException a violation of data model rules | ||
| 175 | + */ | ||
| 176 | + public void addEntityToResolve(YangEntityToResolveInfoImpl entityToResolve) | ||
| 177 | + throws DataModelException { | ||
| 178 | + if (getEntityToResolveInfoList() == null) { | ||
| 179 | + setEntityToResolveInfoList(new LinkedList<YangEntityToResolveInfoImpl>()); | ||
| 180 | + } | ||
| 181 | + getEntityToResolveInfoList().add(entityToResolve); | ||
| 182 | + } | ||
| 183 | + | ||
| 184 | + /** | ||
| 141 | * Returns the referred group. | 185 | * Returns the referred group. |
| 142 | * | 186 | * |
| 143 | * @return the referred group | 187 | * @return the referred group |
| ... | @@ -314,7 +358,7 @@ public class YangUses | ... | @@ -314,7 +358,7 @@ public class YangUses |
| 314 | } | 358 | } |
| 315 | 359 | ||
| 316 | @Override | 360 | @Override |
| 317 | - public void resolve() | 361 | + public Object resolve() |
| 318 | throws DataModelException { | 362 | throws DataModelException { |
| 319 | 363 | ||
| 320 | YangGrouping referredGrouping = getRefGroup(); | 364 | YangGrouping referredGrouping = getRefGroup(); |
| ... | @@ -337,7 +381,13 @@ public class YangUses | ... | @@ -337,7 +381,13 @@ public class YangUses |
| 337 | ((CollisionDetector) usesParentLeavesHolder).detectCollidingChild(leaf.getName(), | 381 | ((CollisionDetector) usesParentLeavesHolder).detectCollidingChild(leaf.getName(), |
| 338 | YangConstructType.LEAF_DATA); | 382 | YangConstructType.LEAF_DATA); |
| 339 | clonedLeaf = leaf.clone(); | 383 | clonedLeaf = leaf.clone(); |
| 340 | - | 384 | + if (getCurrentGroupingDepth() == 0) { |
| 385 | + YangEntityToResolveInfoImpl resolveInfo = resolveLeafrefUnderGroupingForLeaf(clonedLeaf, | ||
| 386 | + usesParentLeavesHolder, this); | ||
| 387 | + if (resolveInfo != null) { | ||
| 388 | + addEntityToResolve(resolveInfo); | ||
| 389 | + } | ||
| 390 | + } | ||
| 341 | } catch (CloneNotSupportedException | DataModelException e) { | 391 | } catch (CloneNotSupportedException | DataModelException e) { |
| 342 | throw new DataModelException(e.getMessage()); | 392 | throw new DataModelException(e.getMessage()); |
| 343 | } | 393 | } |
| ... | @@ -353,7 +403,13 @@ public class YangUses | ... | @@ -353,7 +403,13 @@ public class YangUses |
| 353 | ((CollisionDetector) usesParentLeavesHolder).detectCollidingChild(leafList.getName(), | 403 | ((CollisionDetector) usesParentLeavesHolder).detectCollidingChild(leafList.getName(), |
| 354 | YangConstructType.LEAF_LIST_DATA); | 404 | YangConstructType.LEAF_LIST_DATA); |
| 355 | clonedLeafList = leafList.clone(); | 405 | clonedLeafList = leafList.clone(); |
| 356 | - | 406 | + if (getCurrentGroupingDepth() == 0) { |
| 407 | + YangEntityToResolveInfoImpl resolveInfo = | ||
| 408 | + resolveLeafrefUnderGroupingForLeafList(clonedLeafList, usesParentLeavesHolder); | ||
| 409 | + if (resolveInfo != null) { | ||
| 410 | + addEntityToResolve(resolveInfo); | ||
| 411 | + } | ||
| 412 | + } | ||
| 357 | } catch (CloneNotSupportedException | DataModelException e) { | 413 | } catch (CloneNotSupportedException | DataModelException e) { |
| 358 | throw new DataModelException(e.getMessage()); | 414 | throw new DataModelException(e.getMessage()); |
| 359 | } | 415 | } |
| ... | @@ -364,11 +420,12 @@ public class YangUses | ... | @@ -364,11 +420,12 @@ public class YangUses |
| 364 | } | 420 | } |
| 365 | 421 | ||
| 366 | try { | 422 | try { |
| 367 | - YangNode.cloneSubTree(referredGrouping, usesParentNode); | 423 | + YangNode.cloneSubTree(referredGrouping, usesParentNode, this); |
| 368 | } catch (DataModelException e) { | 424 | } catch (DataModelException e) { |
| 369 | throw new DataModelException(e.getMessage()); | 425 | throw new DataModelException(e.getMessage()); |
| 370 | } | 426 | } |
| 371 | updateClonedLeavesUnionEnumRef(usesParentLeavesHolder); | 427 | updateClonedLeavesUnionEnumRef(usesParentLeavesHolder); |
| 428 | + return getEntityToResolveInfoList(); | ||
| 372 | } | 429 | } |
| 373 | 430 | ||
| 374 | /** | 431 | /** |
| ... | @@ -378,7 +435,7 @@ public class YangUses | ... | @@ -378,7 +435,7 @@ public class YangUses |
| 378 | * @param usesHolder holder of uses | 435 | * @param usesHolder holder of uses |
| 379 | */ | 436 | */ |
| 380 | private void addResolvedUsesInfoOfGrouping(YangUses usesInGrouping, | 437 | private void addResolvedUsesInfoOfGrouping(YangUses usesInGrouping, |
| 381 | - YangLeavesHolder usesHolder) throws DataModelException { | 438 | + YangLeavesHolder usesHolder) throws DataModelException { |
| 382 | for (YangNode usesResolvedNode : usesInGrouping.getUsesResolvedNodeList()) { | 439 | for (YangNode usesResolvedNode : usesInGrouping.getUsesResolvedNodeList()) { |
| 383 | addNodeOfGrouping(usesResolvedNode); | 440 | addNodeOfGrouping(usesResolvedNode); |
| 384 | } | 441 | } |
| ... | @@ -402,7 +459,7 @@ public class YangUses | ... | @@ -402,7 +459,7 @@ public class YangUses |
| 402 | * @throws DataModelException a violation in data model rule | 459 | * @throws DataModelException a violation in data model rule |
| 403 | */ | 460 | */ |
| 404 | private List<YangLeaf> cloneLeavesList(List<YangLeaf> listOfLeaves, | 461 | private List<YangLeaf> cloneLeavesList(List<YangLeaf> listOfLeaves, |
| 405 | - YangLeavesHolder usesParentNode) throws DataModelException { | 462 | + YangLeavesHolder usesParentNode) throws DataModelException { |
| 406 | if (listOfLeaves == null || listOfLeaves.size() == 0) { | 463 | if (listOfLeaves == null || listOfLeaves.size() == 0) { |
| 407 | throw new DataModelException("No leaves to clone"); | 464 | throw new DataModelException("No leaves to clone"); |
| 408 | } | 465 | } |
| ... | @@ -433,7 +490,7 @@ public class YangUses | ... | @@ -433,7 +490,7 @@ public class YangUses |
| 433 | * @return cloned list of leaf list | 490 | * @return cloned list of leaf list |
| 434 | */ | 491 | */ |
| 435 | private List<YangLeafList> cloneListOfLeafList(List<YangLeafList> listOfLeafList, | 492 | private List<YangLeafList> cloneListOfLeafList(List<YangLeafList> listOfLeafList, |
| 436 | - YangLeavesHolder usesParentNode) throws DataModelException { | 493 | + YangLeavesHolder usesParentNode) throws DataModelException { |
| 437 | if (listOfLeafList == null || listOfLeafList.size() == 0) { | 494 | if (listOfLeafList == null || listOfLeafList.size() == 0) { |
| 438 | throw new DataModelException("No leaf lists to clone"); | 495 | throw new DataModelException("No leaf lists to clone"); |
| 439 | } | 496 | } |
| ... | @@ -556,4 +613,13 @@ public class YangUses | ... | @@ -556,4 +613,13 @@ public class YangUses |
| 556 | public void setIfFeatureList(List<YangIfFeature> ifFeatureList) { | 613 | public void setIfFeatureList(List<YangIfFeature> ifFeatureList) { |
| 557 | this.ifFeatureList = ifFeatureList; | 614 | this.ifFeatureList = ifFeatureList; |
| 558 | } | 615 | } |
| 616 | + | ||
| 617 | + public void setCurrentGroupingDepth(int currentGroupingDepth) { | ||
| 618 | + this.currentGroupingDepth = currentGroupingDepth; | ||
| 619 | + } | ||
| 620 | + | ||
| 621 | + public int getCurrentGroupingDepth() { | ||
| 622 | + return currentGroupingDepth; | ||
| 623 | + } | ||
| 624 | + | ||
| 559 | } | 625 | } | ... | ... |
This diff is collapsed. Click to expand it.
| ... | @@ -177,11 +177,11 @@ public class YangLinkerManager | ... | @@ -177,11 +177,11 @@ public class YangLinkerManager |
| 177 | ((YangReferenceResolver) yangNode) | 177 | ((YangReferenceResolver) yangNode) |
| 178 | .resolveInterFileLinking(ResolvableType.YANG_DERIVED_DATA_TYPE); | 178 | .resolveInterFileLinking(ResolvableType.YANG_DERIVED_DATA_TYPE); |
| 179 | ((YangReferenceResolver) yangNode) | 179 | ((YangReferenceResolver) yangNode) |
| 180 | - .resolveInterFileLinking(ResolvableType.YANG_LEAFREF); | ||
| 181 | - ((YangReferenceResolver) yangNode) | ||
| 182 | .resolveInterFileLinking(ResolvableType.YANG_BASE); | 180 | .resolveInterFileLinking(ResolvableType.YANG_BASE); |
| 183 | ((YangReferenceResolver) yangNode) | 181 | ((YangReferenceResolver) yangNode) |
| 184 | .resolveInterFileLinking(ResolvableType.YANG_IDENTITYREF); | 182 | .resolveInterFileLinking(ResolvableType.YANG_IDENTITYREF); |
| 183 | + ((YangReferenceResolver) yangNode) | ||
| 184 | + .resolveInterFileLinking(ResolvableType.YANG_LEAFREF); | ||
| 185 | } catch (DataModelException e) { | 185 | } catch (DataModelException e) { |
| 186 | String errorInfo = "Error in file: " + yangNode.getName() + " at line: " | 186 | String errorInfo = "Error in file: " + yangNode.getName() + " at line: " |
| 187 | + e.getLineNumber() + " at position: " + e.getCharPositionInLine() + NEW_LINE + e.getMessage(); | 187 | + e.getLineNumber() + " at position: " + e.getCharPositionInLine() + NEW_LINE + e.getMessage(); | ... | ... |
| ... | @@ -16,18 +16,28 @@ | ... | @@ -16,18 +16,28 @@ |
| 16 | 16 | ||
| 17 | package org.onosproject.yangutils.linker.impl; | 17 | package org.onosproject.yangutils.linker.impl; |
| 18 | 18 | ||
| 19 | -import java.util.List; | ||
| 20 | - | ||
| 21 | import org.onosproject.yangutils.datamodel.YangAugment; | 19 | import org.onosproject.yangutils.datamodel.YangAugment; |
| 22 | import org.onosproject.yangutils.datamodel.YangAugmentableNode; | 20 | import org.onosproject.yangutils.datamodel.YangAugmentableNode; |
| 23 | import org.onosproject.yangutils.datamodel.YangAugmentedInfo; | 21 | import org.onosproject.yangutils.datamodel.YangAugmentedInfo; |
| 22 | +import org.onosproject.yangutils.datamodel.YangCase; | ||
| 24 | import org.onosproject.yangutils.datamodel.YangChoice; | 23 | import org.onosproject.yangutils.datamodel.YangChoice; |
| 25 | import org.onosproject.yangutils.datamodel.YangLeaf; | 24 | import org.onosproject.yangutils.datamodel.YangLeaf; |
| 26 | import org.onosproject.yangutils.datamodel.YangLeafList; | 25 | import org.onosproject.yangutils.datamodel.YangLeafList; |
| 26 | +import org.onosproject.yangutils.datamodel.YangLeafRef; | ||
| 27 | import org.onosproject.yangutils.datamodel.YangLeavesHolder; | 27 | import org.onosproject.yangutils.datamodel.YangLeavesHolder; |
| 28 | import org.onosproject.yangutils.datamodel.YangNode; | 28 | import org.onosproject.yangutils.datamodel.YangNode; |
| 29 | +import org.onosproject.yangutils.datamodel.YangNodeIdentifier; | ||
| 30 | +import org.onosproject.yangutils.datamodel.utils.YangConstructType; | ||
| 29 | import org.onosproject.yangutils.linker.exceptions.LinkerException; | 31 | import org.onosproject.yangutils.linker.exceptions.LinkerException; |
| 30 | 32 | ||
| 33 | +import java.util.ArrayList; | ||
| 34 | +import java.util.List; | ||
| 35 | +import java.util.regex.Pattern; | ||
| 36 | + | ||
| 37 | +import static org.onosproject.yangutils.utils.UtilConstants.COLON; | ||
| 38 | +import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING; | ||
| 39 | +import static org.onosproject.yangutils.utils.UtilConstants.SLASH_FOR_STRING; | ||
| 40 | + | ||
| 31 | /** | 41 | /** |
| 32 | * Represent utilities for YANG linker. | 42 | * Represent utilities for YANG linker. |
| 33 | */ | 43 | */ |
| ... | @@ -36,6 +46,10 @@ public final class YangLinkerUtils { | ... | @@ -36,6 +46,10 @@ public final class YangLinkerUtils { |
| 36 | private YangLinkerUtils() { | 46 | private YangLinkerUtils() { |
| 37 | } | 47 | } |
| 38 | 48 | ||
| 49 | + private static final int IDENTIFIER_LENGTH = 64; | ||
| 50 | + private static final Pattern IDENTIFIER_PATTERN = Pattern.compile("[a-zA-Z_][a-zA-Z0-9_.-]*"); | ||
| 51 | + private static final String XML = "xml"; | ||
| 52 | + | ||
| 39 | /** | 53 | /** |
| 40 | * Detects collision between target nodes leaf/leaf-list or child node with augmented leaf/leaf-list or child node. | 54 | * Detects collision between target nodes leaf/leaf-list or child node with augmented leaf/leaf-list or child node. |
| 41 | * | 55 | * |
| ... | @@ -119,4 +133,99 @@ public final class YangLinkerUtils { | ... | @@ -119,4 +133,99 @@ public final class YangLinkerUtils { |
| 119 | detectCollision((YangAugment) info, augment); | 133 | detectCollision((YangAugment) info, augment); |
| 120 | } | 134 | } |
| 121 | } | 135 | } |
| 136 | + | ||
| 137 | + /** | ||
| 138 | + * Returns list of path names that are needed from augment. | ||
| 139 | + * | ||
| 140 | + * @param augment instance of YANG augment | ||
| 141 | + * @param remainingAncestors ancestor count to move in augment path | ||
| 142 | + * @return list of path names needed in leafref | ||
| 143 | + */ | ||
| 144 | + public static List<String> getPathWithAugment(YangAugment augment, int remainingAncestors) { | ||
| 145 | + String augmentName = augment.getName(); | ||
| 146 | + List<String> listOfPathName = new ArrayList<>(); | ||
| 147 | + if (augmentName.contains(SLASH_FOR_STRING)) { | ||
| 148 | + String[] augmentNodeNames = augmentName.split(SLASH_FOR_STRING); | ||
| 149 | + for (String valueInAugment : augmentNodeNames) { | ||
| 150 | + if (valueInAugment != null && valueInAugment != EMPTY_STRING && !valueInAugment.isEmpty()) { | ||
| 151 | + listOfPathName.add(valueInAugment); | ||
| 152 | + } | ||
| 153 | + } | ||
| 154 | + } | ||
| 155 | + for (int countOfAncestor = 0; countOfAncestor < remainingAncestors; countOfAncestor++) { | ||
| 156 | + listOfPathName.remove(listOfPathName.size() - 1); | ||
| 157 | + } | ||
| 158 | + return listOfPathName; | ||
| 159 | + } | ||
| 160 | + | ||
| 161 | + /** | ||
| 162 | + * Skips the invalid nodes which cannot have data from YANG. | ||
| 163 | + * | ||
| 164 | + * @param currentParent current parent node reference | ||
| 165 | + * @param leafref instance of YANG leafref | ||
| 166 | + * @return parent node which can hold data | ||
| 167 | + * @throws LinkerException a violation of linker rules | ||
| 168 | + */ | ||
| 169 | + public static YangNode skipInvalidDataNodes(YangNode currentParent, YangLeafRef leafref) throws LinkerException { | ||
| 170 | + while (currentParent instanceof YangChoice || currentParent instanceof YangCase) { | ||
| 171 | + if (currentParent.getParent() == null) { | ||
| 172 | + throw new LinkerException("YANG file error: The target node, in the leafref path " + | ||
| 173 | + leafref.getPath() + ", is invalid."); | ||
| 174 | + } | ||
| 175 | + currentParent = currentParent.getParent(); | ||
| 176 | + } | ||
| 177 | + return currentParent; | ||
| 178 | + } | ||
| 179 | + | ||
| 180 | + /** | ||
| 181 | + * Checks and return valid node identifier. | ||
| 182 | + * | ||
| 183 | + * @param nodeIdentifierString string from yang file | ||
| 184 | + * @param yangConstruct yang construct for creating error message | ||
| 185 | + * @return valid node identifier | ||
| 186 | + */ | ||
| 187 | + public static YangNodeIdentifier getValidNodeIdentifier(String nodeIdentifierString, | ||
| 188 | + YangConstructType yangConstruct) { | ||
| 189 | + String[] tmpData = nodeIdentifierString.split(Pattern.quote(COLON)); | ||
| 190 | + if (tmpData.length == 1) { | ||
| 191 | + YangNodeIdentifier nodeIdentifier = new YangNodeIdentifier(); | ||
| 192 | + nodeIdentifier.setName(getValidIdentifier(tmpData[0], yangConstruct)); | ||
| 193 | + return nodeIdentifier; | ||
| 194 | + } else if (tmpData.length == 2) { | ||
| 195 | + YangNodeIdentifier nodeIdentifier = new YangNodeIdentifier(); | ||
| 196 | + nodeIdentifier.setPrefix(getValidIdentifier(tmpData[0], yangConstruct)); | ||
| 197 | + nodeIdentifier.setName(getValidIdentifier(tmpData[1], yangConstruct)); | ||
| 198 | + return nodeIdentifier; | ||
| 199 | + } else { | ||
| 200 | + throw new LinkerException("YANG file error : " + | ||
| 201 | + YangConstructType.getYangConstructType(yangConstruct) + " name " + nodeIdentifierString + | ||
| 202 | + " is not valid."); | ||
| 203 | + } | ||
| 204 | + } | ||
| 205 | + | ||
| 206 | + /** | ||
| 207 | + * Validates identifier and returns concatenated string if string contains plus symbol. | ||
| 208 | + * | ||
| 209 | + * @param identifier string from yang file | ||
| 210 | + * @param yangConstruct yang construct for creating error message= | ||
| 211 | + * @return concatenated string after removing double quotes | ||
| 212 | + */ | ||
| 213 | + public static String getValidIdentifier(String identifier, YangConstructType yangConstruct) { | ||
| 214 | + | ||
| 215 | + if (identifier.length() > IDENTIFIER_LENGTH) { | ||
| 216 | + throw new LinkerException("YANG file error : " + | ||
| 217 | + YangConstructType.getYangConstructType(yangConstruct) + " name " + identifier + " is " + | ||
| 218 | + "greater than 64 characters."); | ||
| 219 | + } else if (!IDENTIFIER_PATTERN.matcher(identifier).matches()) { | ||
| 220 | + throw new LinkerException("YANG file error : " + | ||
| 221 | + YangConstructType.getYangConstructType(yangConstruct) + " name " + identifier + " is not " + | ||
| 222 | + "valid."); | ||
| 223 | + } else if (identifier.toLowerCase().startsWith(XML)) { | ||
| 224 | + throw new LinkerException("YANG file error : " + | ||
| 225 | + YangConstructType.getYangConstructType(yangConstruct) + " identifier " + identifier + | ||
| 226 | + " must not start with (('X'|'x') ('M'|'m') ('L'|'l'))."); | ||
| 227 | + } else { | ||
| 228 | + return identifier; | ||
| 229 | + } | ||
| 230 | + } | ||
| 122 | } | 231 | } | ... | ... |
This diff is collapsed. Click to expand it.
| ... | @@ -16,31 +16,41 @@ | ... | @@ -16,31 +16,41 @@ |
| 16 | 16 | ||
| 17 | package org.onosproject.yangutils.linker.impl; | 17 | package org.onosproject.yangutils.linker.impl; |
| 18 | 18 | ||
| 19 | -import java.util.ArrayList; | ||
| 20 | -import java.util.HashMap; | ||
| 21 | -import java.util.Iterator; | ||
| 22 | -import java.util.List; | ||
| 23 | -import java.util.Map; | ||
| 24 | -import java.util.Stack; | ||
| 25 | - | ||
| 26 | import org.onosproject.yangutils.datamodel.YangAtomicPath; | 19 | import org.onosproject.yangutils.datamodel.YangAtomicPath; |
| 27 | import org.onosproject.yangutils.datamodel.YangAugment; | 20 | import org.onosproject.yangutils.datamodel.YangAugment; |
| 21 | +import org.onosproject.yangutils.datamodel.YangCase; | ||
| 22 | +import org.onosproject.yangutils.datamodel.YangChoice; | ||
| 23 | +import org.onosproject.yangutils.datamodel.YangGrouping; | ||
| 28 | import org.onosproject.yangutils.datamodel.YangImport; | 24 | import org.onosproject.yangutils.datamodel.YangImport; |
| 29 | import org.onosproject.yangutils.datamodel.YangInclude; | 25 | import org.onosproject.yangutils.datamodel.YangInclude; |
| 26 | +import org.onosproject.yangutils.datamodel.YangInput; | ||
| 30 | import org.onosproject.yangutils.datamodel.YangLeaf; | 27 | import org.onosproject.yangutils.datamodel.YangLeaf; |
| 31 | import org.onosproject.yangutils.datamodel.YangLeafList; | 28 | import org.onosproject.yangutils.datamodel.YangLeafList; |
| 29 | +import org.onosproject.yangutils.datamodel.YangLeafRef; | ||
| 32 | import org.onosproject.yangutils.datamodel.YangLeavesHolder; | 30 | import org.onosproject.yangutils.datamodel.YangLeavesHolder; |
| 33 | import org.onosproject.yangutils.datamodel.YangModule; | 31 | import org.onosproject.yangutils.datamodel.YangModule; |
| 34 | import org.onosproject.yangutils.datamodel.YangNode; | 32 | import org.onosproject.yangutils.datamodel.YangNode; |
| 35 | import org.onosproject.yangutils.datamodel.YangNodeIdentifier; | 33 | import org.onosproject.yangutils.datamodel.YangNodeIdentifier; |
| 34 | +import org.onosproject.yangutils.datamodel.YangOutput; | ||
| 36 | import org.onosproject.yangutils.datamodel.YangSubModule; | 35 | import org.onosproject.yangutils.datamodel.YangSubModule; |
| 36 | +import org.onosproject.yangutils.datamodel.YangTypeDef; | ||
| 37 | +import org.onosproject.yangutils.datamodel.YangUses; | ||
| 37 | import org.onosproject.yangutils.linker.exceptions.LinkerException; | 38 | import org.onosproject.yangutils.linker.exceptions.LinkerException; |
| 38 | 39 | ||
| 40 | +import java.util.ArrayList; | ||
| 41 | +import java.util.HashMap; | ||
| 42 | +import java.util.Iterator; | ||
| 43 | +import java.util.List; | ||
| 44 | +import java.util.Map; | ||
| 45 | +import java.util.Stack; | ||
| 46 | + | ||
| 39 | import static org.onosproject.yangutils.linker.impl.PrefixResolverType.INTER_TO_INTER; | 47 | import static org.onosproject.yangutils.linker.impl.PrefixResolverType.INTER_TO_INTER; |
| 40 | import static org.onosproject.yangutils.linker.impl.PrefixResolverType.INTER_TO_INTRA; | 48 | import static org.onosproject.yangutils.linker.impl.PrefixResolverType.INTER_TO_INTRA; |
| 41 | import static org.onosproject.yangutils.linker.impl.PrefixResolverType.INTRA_TO_INTER; | 49 | import static org.onosproject.yangutils.linker.impl.PrefixResolverType.INTRA_TO_INTER; |
| 42 | import static org.onosproject.yangutils.linker.impl.PrefixResolverType.NO_PREFIX_CHANGE_FOR_INTER; | 50 | import static org.onosproject.yangutils.linker.impl.PrefixResolverType.NO_PREFIX_CHANGE_FOR_INTER; |
| 43 | import static org.onosproject.yangutils.linker.impl.PrefixResolverType.NO_PREFIX_CHANGE_FOR_INTRA; | 51 | import static org.onosproject.yangutils.linker.impl.PrefixResolverType.NO_PREFIX_CHANGE_FOR_INTRA; |
| 52 | +import static org.onosproject.yangutils.utils.UtilConstants.INPUT; | ||
| 53 | +import static org.onosproject.yangutils.utils.UtilConstants.OUTPUT; | ||
| 44 | 54 | ||
| 45 | /** | 55 | /** |
| 46 | * Represents x-path linking. | 56 | * Represents x-path linking. |
| ... | @@ -194,31 +204,35 @@ public class YangXpathLinker<T> { | ... | @@ -194,31 +204,35 @@ public class YangXpathLinker<T> { |
| 194 | /** | 204 | /** |
| 195 | * Process absolute node path for target leaf. | 205 | * Process absolute node path for target leaf. |
| 196 | * | 206 | * |
| 197 | - * @param absPaths absolute path node list | 207 | + * @param atomicPaths atomic path node list |
| 198 | - * @param root root node | 208 | + * @param root root node |
| 209 | + * @param leafref instance of YANG leafref | ||
| 199 | * @return linked target node | 210 | * @return linked target node |
| 200 | */ | 211 | */ |
| 201 | - T processLeafRefXpathLinking(List<YangAtomicPath> absPaths, YangNode root) { | 212 | + public T processLeafRefXpathLinking(List<YangAtomicPath> atomicPaths, YangNode root, YangLeafRef leafref) { |
| 202 | 213 | ||
| 203 | YangNode targetNode = null; | 214 | YangNode targetNode = null; |
| 204 | setRootNode(root); | 215 | setRootNode(root); |
| 205 | setPrefixResolverTypes(new HashMap<>()); | 216 | setPrefixResolverTypes(new HashMap<>()); |
| 206 | - parsePrefixResolverList(absPaths); | 217 | + parsePrefixResolverList(atomicPaths); |
| 207 | - YangAtomicPath leafRefPath = absPaths.get(absPaths.size() - 1); | 218 | + YangAtomicPath leafRefPath = atomicPaths.get(atomicPaths.size() - 1); |
| 208 | 219 | ||
| 209 | // When leaf-ref path contains only one absolute path. | 220 | // When leaf-ref path contains only one absolute path. |
| 210 | - if (absPaths.size() == 1) { | 221 | + if (atomicPaths.size() == 1) { |
| 211 | - targetNode = getTargetNodewhenSizeIsOne(absPaths); | 222 | + targetNode = getTargetNodewhenSizeIsOne(atomicPaths); |
| 212 | } else { | 223 | } else { |
| 213 | - absPaths.remove(absPaths.size() - 1); | 224 | + atomicPaths.remove(atomicPaths.size() - 1); |
| 214 | 225 | ||
| 215 | - setAbsPaths(absPaths); | 226 | + setAbsPaths(atomicPaths); |
| 216 | targetNode = parseData(root); | 227 | targetNode = parseData(root); |
| 217 | } | 228 | } |
| 218 | if (targetNode == null) { | 229 | if (targetNode == null) { |
| 219 | targetNode = searchInSubModule(root); | 230 | targetNode = searchInSubModule(root); |
| 220 | } | 231 | } |
| 221 | 232 | ||
| 233 | + // Invalid path presence in the node list is checked. | ||
| 234 | + validateInvalidNodesInThePath(leafref); | ||
| 235 | + | ||
| 222 | if (targetNode != null) { | 236 | if (targetNode != null) { |
| 223 | YangLeaf targetLeaf = searchReferredLeaf(targetNode, leafRefPath.getNodeIdentifier().getName()); | 237 | YangLeaf targetLeaf = searchReferredLeaf(targetNode, leafRefPath.getNodeIdentifier().getName()); |
| 224 | if (targetLeaf == null) { | 238 | if (targetLeaf == null) { |
| ... | @@ -227,9 +241,12 @@ public class YangXpathLinker<T> { | ... | @@ -227,9 +241,12 @@ public class YangXpathLinker<T> { |
| 227 | if (targetLeafList != null) { | 241 | if (targetLeafList != null) { |
| 228 | return (T) targetLeafList; | 242 | return (T) targetLeafList; |
| 229 | } else { | 243 | } else { |
| 230 | - throw new LinkerException( | 244 | + LinkerException linkerException = new LinkerException("YANG file error: Unable to find base " + |
| 231 | - "YANG file error: Unable to find base leaf/leaf-list for given leafref " | 245 | + "leaf/leaf-list for given leafref path " |
| 232 | - + leafRefPath.getNodeIdentifier().getName()); | 246 | + + leafref.getPath()); |
| 247 | + linkerException.setCharPosition(leafref.getCharPosition()); | ||
| 248 | + linkerException.setLine(leafref.getLineNumber()); | ||
| 249 | + throw linkerException; | ||
| 233 | } | 250 | } |
| 234 | } | 251 | } |
| 235 | return (T) targetLeaf; | 252 | return (T) targetLeaf; |
| ... | @@ -238,6 +255,30 @@ public class YangXpathLinker<T> { | ... | @@ -238,6 +255,30 @@ public class YangXpathLinker<T> { |
| 238 | } | 255 | } |
| 239 | 256 | ||
| 240 | /** | 257 | /** |
| 258 | + * Validates the nodes in the path for any invalid node. | ||
| 259 | + * | ||
| 260 | + * @param leafref instance of YANG leafref | ||
| 261 | + */ | ||
| 262 | + private void validateInvalidNodesInThePath(YangLeafRef leafref) { | ||
| 263 | + Map<YangAtomicPath, YangNode> nodes = getResolvedNodes(); | ||
| 264 | + Iterator<Map.Entry<YangAtomicPath, YangNode>> nodesIterator = nodes.entrySet().iterator(); | ||
| 265 | + while (nodesIterator.hasNext()) { | ||
| 266 | + Map.Entry<YangAtomicPath, YangNode> nodeInList = nodesIterator.next(); | ||
| 267 | + YangNode nodeInPath = nodeInList.getValue(); | ||
| 268 | + | ||
| 269 | + if (nodeInPath instanceof YangGrouping || nodeInPath instanceof YangUses | ||
| 270 | + || nodeInPath instanceof YangTypeDef || nodeInPath instanceof YangCase | ||
| 271 | + || nodeInPath instanceof YangChoice) { | ||
| 272 | + LinkerException linkerException = new LinkerException("YANG file error: The target node, in the " + | ||
| 273 | + "leafref path " + leafref.getPath() + ", is invalid."); | ||
| 274 | + linkerException.setCharPosition(leafref.getCharPosition()); | ||
| 275 | + linkerException.setLine(leafref.getLineNumber()); | ||
| 276 | + throw linkerException; | ||
| 277 | + } | ||
| 278 | + } | ||
| 279 | + } | ||
| 280 | + | ||
| 281 | + /** | ||
| 241 | * Returns target node when leaf-ref has only one absolute path in list. | 282 | * Returns target node when leaf-ref has only one absolute path in list. |
| 242 | * | 283 | * |
| 243 | * @param absPaths absolute paths | 284 | * @param absPaths absolute paths |
| ... | @@ -289,9 +330,13 @@ public class YangXpathLinker<T> { | ... | @@ -289,9 +330,13 @@ public class YangXpathLinker<T> { |
| 289 | } | 330 | } |
| 290 | YangLeavesHolder holder = (YangLeavesHolder) targetNode; | 331 | YangLeavesHolder holder = (YangLeavesHolder) targetNode; |
| 291 | List<YangLeaf> leaves = holder.getListOfLeaf(); | 332 | List<YangLeaf> leaves = holder.getListOfLeaf(); |
| 292 | - for (YangLeaf leaf : leaves) { | 333 | + if (leaves != null && !leaves.isEmpty()) { |
| 293 | - if (leaf.getName().equals(leafName)) { | 334 | + Iterator<YangLeaf> leafIterator = leaves.listIterator(); |
| 294 | - return leaf; | 335 | + while (leafIterator.hasNext()) { |
| 336 | + YangLeaf leaf = leafIterator.next(); | ||
| 337 | + if (leaf.getName().equals(leafName)) { | ||
| 338 | + return leaf; | ||
| 339 | + } | ||
| 295 | } | 340 | } |
| 296 | } | 341 | } |
| 297 | return null; | 342 | return null; |
| ... | @@ -311,9 +356,13 @@ public class YangXpathLinker<T> { | ... | @@ -311,9 +356,13 @@ public class YangXpathLinker<T> { |
| 311 | } | 356 | } |
| 312 | YangLeavesHolder holder = (YangLeavesHolder) targetNode; | 357 | YangLeavesHolder holder = (YangLeavesHolder) targetNode; |
| 313 | List<YangLeafList> leavesList = holder.getListOfLeafList(); | 358 | List<YangLeafList> leavesList = holder.getListOfLeafList(); |
| 314 | - for (YangLeafList leafList : leavesList) { | 359 | + if (leavesList != null && !leavesList.isEmpty()) { |
| 315 | - if (leafList.getName().equals(leafListName)) { | 360 | + Iterator<YangLeafList> leafListIterator = leavesList.listIterator(); |
| 316 | - return leafList; | 361 | + while (leafListIterator.hasNext()) { |
| 362 | + YangLeafList leafList = leafListIterator.next(); | ||
| 363 | + if (leafList.getName().equals(leafListName)) { | ||
| 364 | + return leafList; | ||
| 365 | + } | ||
| 317 | } | 366 | } |
| 318 | } | 367 | } |
| 319 | return null; | 368 | return null; |
| ... | @@ -709,6 +758,15 @@ public class YangXpathLinker<T> { | ... | @@ -709,6 +758,15 @@ public class YangXpathLinker<T> { |
| 709 | } | 758 | } |
| 710 | 759 | ||
| 711 | while (node != null) { | 760 | while (node != null) { |
| 761 | + if (node instanceof YangInput) { | ||
| 762 | + if (curNodeId.getName().equalsIgnoreCase(INPUT)) { | ||
| 763 | + return node; | ||
| 764 | + } | ||
| 765 | + } else if (node instanceof YangOutput) { | ||
| 766 | + if (curNodeId.getName().equalsIgnoreCase(OUTPUT)) { | ||
| 767 | + return node; | ||
| 768 | + } | ||
| 769 | + } | ||
| 712 | if (node.getName().equals(curNodeId.getName())) { | 770 | if (node.getName().equals(curNodeId.getName())) { |
| 713 | return node; | 771 | return node; |
| 714 | } | 772 | } | ... | ... |
| ... | @@ -16,8 +16,6 @@ | ... | @@ -16,8 +16,6 @@ |
| 16 | 16 | ||
| 17 | package org.onosproject.yangutils.parser.impl; | 17 | package org.onosproject.yangutils.parser.impl; |
| 18 | 18 | ||
| 19 | -import java.util.Stack; | ||
| 20 | - | ||
| 21 | import org.antlr.v4.runtime.ParserRuleContext; | 19 | import org.antlr.v4.runtime.ParserRuleContext; |
| 22 | import org.antlr.v4.runtime.tree.ErrorNode; | 20 | import org.antlr.v4.runtime.tree.ErrorNode; |
| 23 | import org.antlr.v4.runtime.tree.TerminalNode; | 21 | import org.antlr.v4.runtime.tree.TerminalNode; |
| ... | @@ -42,12 +40,14 @@ import org.onosproject.yangutils.parser.impl.listeners.DefaultListener; | ... | @@ -42,12 +40,14 @@ import org.onosproject.yangutils.parser.impl.listeners.DefaultListener; |
| 42 | import org.onosproject.yangutils.parser.impl.listeners.DescriptionListener; | 40 | import org.onosproject.yangutils.parser.impl.listeners.DescriptionListener; |
| 43 | import org.onosproject.yangutils.parser.impl.listeners.EnumListener; | 41 | import org.onosproject.yangutils.parser.impl.listeners.EnumListener; |
| 44 | import org.onosproject.yangutils.parser.impl.listeners.EnumerationListener; | 42 | import org.onosproject.yangutils.parser.impl.listeners.EnumerationListener; |
| 43 | +import org.onosproject.yangutils.parser.impl.listeners.ErrorAppTagListener; | ||
| 44 | +import org.onosproject.yangutils.parser.impl.listeners.ErrorMessageListener; | ||
| 45 | import org.onosproject.yangutils.parser.impl.listeners.FeatureListener; | 45 | import org.onosproject.yangutils.parser.impl.listeners.FeatureListener; |
| 46 | import org.onosproject.yangutils.parser.impl.listeners.FractionDigitsListener; | 46 | import org.onosproject.yangutils.parser.impl.listeners.FractionDigitsListener; |
| 47 | import org.onosproject.yangutils.parser.impl.listeners.GroupingListener; | 47 | import org.onosproject.yangutils.parser.impl.listeners.GroupingListener; |
| 48 | +import org.onosproject.yangutils.parser.impl.listeners.IdentityListener; | ||
| 48 | import org.onosproject.yangutils.parser.impl.listeners.IdentityrefListener; | 49 | import org.onosproject.yangutils.parser.impl.listeners.IdentityrefListener; |
| 49 | import org.onosproject.yangutils.parser.impl.listeners.IfFeatureListener; | 50 | import org.onosproject.yangutils.parser.impl.listeners.IfFeatureListener; |
| 50 | -import org.onosproject.yangutils.parser.impl.listeners.IdentityListener; | ||
| 51 | import org.onosproject.yangutils.parser.impl.listeners.ImportListener; | 51 | import org.onosproject.yangutils.parser.impl.listeners.ImportListener; |
| 52 | import org.onosproject.yangutils.parser.impl.listeners.IncludeListener; | 52 | import org.onosproject.yangutils.parser.impl.listeners.IncludeListener; |
| 53 | import org.onosproject.yangutils.parser.impl.listeners.InputListener; | 53 | import org.onosproject.yangutils.parser.impl.listeners.InputListener; |
| ... | @@ -83,13 +83,15 @@ import org.onosproject.yangutils.parser.impl.listeners.SubModuleListener; | ... | @@ -83,13 +83,15 @@ import org.onosproject.yangutils.parser.impl.listeners.SubModuleListener; |
| 83 | import org.onosproject.yangutils.parser.impl.listeners.TypeDefListener; | 83 | import org.onosproject.yangutils.parser.impl.listeners.TypeDefListener; |
| 84 | import org.onosproject.yangutils.parser.impl.listeners.TypeListener; | 84 | import org.onosproject.yangutils.parser.impl.listeners.TypeListener; |
| 85 | import org.onosproject.yangutils.parser.impl.listeners.UnionListener; | 85 | import org.onosproject.yangutils.parser.impl.listeners.UnionListener; |
| 86 | +import org.onosproject.yangutils.parser.impl.listeners.UniqueListener; | ||
| 86 | import org.onosproject.yangutils.parser.impl.listeners.UnitsListener; | 87 | import org.onosproject.yangutils.parser.impl.listeners.UnitsListener; |
| 87 | import org.onosproject.yangutils.parser.impl.listeners.UsesListener; | 88 | import org.onosproject.yangutils.parser.impl.listeners.UsesListener; |
| 88 | import org.onosproject.yangutils.parser.impl.listeners.ValueListener; | 89 | import org.onosproject.yangutils.parser.impl.listeners.ValueListener; |
| 89 | import org.onosproject.yangutils.parser.impl.listeners.VersionListener; | 90 | import org.onosproject.yangutils.parser.impl.listeners.VersionListener; |
| 90 | import org.onosproject.yangutils.parser.impl.listeners.WhenListener; | 91 | import org.onosproject.yangutils.parser.impl.listeners.WhenListener; |
| 91 | -import org.onosproject.yangutils.parser.impl.listeners.ErrorMessageListener; | 92 | + |
| 92 | -import org.onosproject.yangutils.parser.impl.listeners.ErrorAppTagListener; | 93 | +import java.util.Stack; |
| 94 | + | ||
| 93 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.handleUnsupportedYangConstruct; | 95 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.handleUnsupportedYangConstruct; |
| 94 | import static org.onosproject.yangutils.utils.UtilConstants.CURRENTLY_UNSUPPORTED; | 96 | import static org.onosproject.yangutils.utils.UtilConstants.CURRENTLY_UNSUPPORTED; |
| 95 | import static org.onosproject.yangutils.utils.UtilConstants.UNSUPPORTED_YANG_CONSTRUCT; | 97 | import static org.onosproject.yangutils.utils.UtilConstants.UNSUPPORTED_YANG_CONSTRUCT; |
| ... | @@ -109,6 +111,34 @@ public class TreeWalkListener implements GeneratedYangListener { | ... | @@ -109,6 +111,34 @@ public class TreeWalkListener implements GeneratedYangListener { |
| 109 | private YangNode rootNode; | 111 | private YangNode rootNode; |
| 110 | 112 | ||
| 111 | /** | 113 | /** |
| 114 | + * Parent depth of grouping count for any node. | ||
| 115 | + */ | ||
| 116 | + private int groupingDepth; | ||
| 117 | + | ||
| 118 | + /** | ||
| 119 | + * Returns number of grouping parents, by a node, at any level. | ||
| 120 | + * | ||
| 121 | + * @return depth of grouping | ||
| 122 | + */ | ||
| 123 | + public int getGroupingDepth() { | ||
| 124 | + return groupingDepth; | ||
| 125 | + } | ||
| 126 | + | ||
| 127 | + /** | ||
| 128 | + * Sets number of grouping parents by a node at any level. | ||
| 129 | + */ | ||
| 130 | + public void increaseGroupingDepth() { | ||
| 131 | + groupingDepth++; | ||
| 132 | + } | ||
| 133 | + | ||
| 134 | + /** | ||
| 135 | + * Sets number of grouping parents by a node at any level. | ||
| 136 | + */ | ||
| 137 | + public void decreaseGroupingDepth() { | ||
| 138 | + groupingDepth--; | ||
| 139 | + } | ||
| 140 | + | ||
| 141 | + /** | ||
| 112 | * Returns stack of parsable data. | 142 | * Returns stack of parsable data. |
| 113 | * | 143 | * |
| 114 | * @return stack of parsable data | 144 | * @return stack of parsable data |
| ... | @@ -956,7 +986,7 @@ public class TreeWalkListener implements GeneratedYangListener { | ... | @@ -956,7 +986,7 @@ public class TreeWalkListener implements GeneratedYangListener { |
| 956 | 986 | ||
| 957 | @Override | 987 | @Override |
| 958 | public void enterUniqueStatement(GeneratedYangParser.UniqueStatementContext ctx) { | 988 | public void enterUniqueStatement(GeneratedYangParser.UniqueStatementContext ctx) { |
| 959 | - handleUnsupportedYangConstruct(YangConstructType.UNIQUE_DATA, ctx, CURRENTLY_UNSUPPORTED); | 989 | + UniqueListener.processUniqueEntry(this, ctx); |
| 960 | } | 990 | } |
| 961 | 991 | ||
| 962 | @Override | 992 | @Override | ... | ... |
| ... | @@ -106,6 +106,8 @@ public final class GroupingListener { | ... | @@ -106,6 +106,8 @@ public final class GroupingListener { |
| 106 | // Validate sub statement cardinality. | 106 | // Validate sub statement cardinality. |
| 107 | validateSubStatementsCardinality(ctx); | 107 | validateSubStatementsCardinality(ctx); |
| 108 | 108 | ||
| 109 | + // Increase the grouping count by one. | ||
| 110 | + listener.increaseGroupingDepth(); | ||
| 109 | Parsable curData = listener.getParsedDataStack().peek(); | 111 | Parsable curData = listener.getParsedDataStack().peek(); |
| 110 | 112 | ||
| 111 | // Check for identifier collision | 113 | // Check for identifier collision |
| ... | @@ -149,6 +151,8 @@ public final class GroupingListener { | ... | @@ -149,6 +151,8 @@ public final class GroupingListener { |
| 149 | // Check for stack to be non empty. | 151 | // Check for stack to be non empty. |
| 150 | checkStackIsNotEmpty(listener, MISSING_HOLDER, GROUPING_DATA, ctx.identifier().getText(), EXIT); | 152 | checkStackIsNotEmpty(listener, MISSING_HOLDER, GROUPING_DATA, ctx.identifier().getText(), EXIT); |
| 151 | 153 | ||
| 154 | + // Decrease the grouping count by one. | ||
| 155 | + listener.decreaseGroupingDepth(); | ||
| 152 | if (listener.getParsedDataStack().peek() instanceof YangGrouping) { | 156 | if (listener.getParsedDataStack().peek() instanceof YangGrouping) { |
| 153 | listener.getParsedDataStack().pop(); | 157 | listener.getParsedDataStack().pop(); |
| 154 | } else { | 158 | } else { | ... | ... |
| ... | @@ -100,6 +100,8 @@ public final class LeafrefListener { | ... | @@ -100,6 +100,8 @@ public final class LeafrefListener { |
| 100 | 100 | ||
| 101 | YangLeafRef<?> leafRef = new YangLeafRef<>(); | 101 | YangLeafRef<?> leafRef = new YangLeafRef<>(); |
| 102 | 102 | ||
| 103 | + leafRef.setLineNumber(errorLine); | ||
| 104 | + leafRef.setCharPosition(errorPosition); | ||
| 103 | Parsable typeData = listener.getParsedDataStack().pop(); | 105 | Parsable typeData = listener.getParsedDataStack().pop(); |
| 104 | 106 | ||
| 105 | if (!(typeData instanceof YangType)) { | 107 | if (!(typeData instanceof YangType)) { |
| ... | @@ -130,11 +132,13 @@ public final class LeafrefListener { | ... | @@ -130,11 +132,13 @@ public final class LeafrefListener { |
| 130 | } | 132 | } |
| 131 | 133 | ||
| 132 | leafRef.setResolvableStatus(UNRESOLVED); | 134 | leafRef.setResolvableStatus(UNRESOLVED); |
| 133 | - | 135 | + leafRef.setParentNodeOfLeafref((YangNode) parentNodeOfLeaf); |
| 134 | - // Add resolution information to the list. | 136 | + if (listener.getGroupingDepth() == 0) { |
| 135 | - YangResolutionInfoImpl resolutionInfo = new YangResolutionInfoImpl<YangLeafRef>(leafRef, | 137 | + // Add resolution information to the list. |
| 136 | - (YangNode) parentNodeOfLeaf, errorLine, errorPosition); | 138 | + YangResolutionInfoImpl resolutionInfo = new YangResolutionInfoImpl<YangLeafRef>(leafRef, |
| 137 | - addToResolutionList(resolutionInfo); | 139 | + (YangNode) parentNodeOfLeaf, errorLine, errorPosition); |
| 140 | + addToResolutionList(resolutionInfo); | ||
| 141 | + } | ||
| 138 | break; | 142 | break; |
| 139 | 143 | ||
| 140 | case LEAF_LIST_DATA: | 144 | case LEAF_LIST_DATA: |
| ... | @@ -151,14 +155,19 @@ public final class LeafrefListener { | ... | @@ -151,14 +155,19 @@ public final class LeafrefListener { |
| 151 | } | 155 | } |
| 152 | 156 | ||
| 153 | leafRef.setResolvableStatus(UNRESOLVED); | 157 | leafRef.setResolvableStatus(UNRESOLVED); |
| 158 | + leafRef.setParentNodeOfLeafref((YangNode) parentNodeOfLeafList); | ||
| 154 | 159 | ||
| 155 | - // Add resolution information to the list. | 160 | + if (listener.getGroupingDepth() == 0) { |
| 156 | - YangResolutionInfoImpl resolutionInfoImpl = new YangResolutionInfoImpl<YangLeafRef>(leafRef, | 161 | + // Add resolution information to the list. |
| 157 | - (YangNode) parentNodeOfLeafList, errorLine, errorPosition); | 162 | + YangResolutionInfoImpl resolutionInfoImpl = new YangResolutionInfoImpl<YangLeafRef>(leafRef, |
| 158 | - addToResolutionList(resolutionInfoImpl); | 163 | + (YangNode) parentNodeOfLeafList, errorLine, errorPosition); |
| 164 | + addToResolutionList(resolutionInfoImpl); | ||
| 165 | + } | ||
| 159 | break; | 166 | break; |
| 160 | 167 | ||
| 161 | case TYPEDEF_DATA: | 168 | case TYPEDEF_DATA: |
| 169 | + Parsable parentNodeOfLeafref = listener.getParsedDataStack().peek(); | ||
| 170 | + leafRef.setParentNodeOfLeafref((YangNode) parentNodeOfLeafref); | ||
| 162 | /* | 171 | /* |
| 163 | * Do not add the leaf ref to resolution list. It needs to be | 172 | * Do not add the leaf ref to resolution list. It needs to be |
| 164 | * added to resolution list, when leaf/leaf list references to | 173 | * added to resolution list, when leaf/leaf list references to | ... | ... |
| ... | @@ -54,6 +54,7 @@ import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorTyp | ... | @@ -54,6 +54,7 @@ import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorTyp |
| 54 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER; | 54 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER; |
| 55 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.UNHANDLED_PARSED_DATA; | 55 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.UNHANDLED_PARSED_DATA; |
| 56 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.getValidIdentifier; | 56 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.getValidIdentifier; |
| 57 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.validateUniqueInList; | ||
| 57 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty; | 58 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty; |
| 58 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.validateCardinalityMaxOne; | 59 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.validateCardinalityMaxOne; |
| 59 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.validateCardinalityNonZero; | 60 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.validateCardinalityNonZero; |
| ... | @@ -174,6 +175,7 @@ public final class ListListener { | ... | @@ -174,6 +175,7 @@ public final class ListListener { |
| 174 | YangList yangList = (YangList) listener.getParsedDataStack().peek(); | 175 | YangList yangList = (YangList) listener.getParsedDataStack().peek(); |
| 175 | try { | 176 | try { |
| 176 | yangList.validateDataOnExit(); | 177 | yangList.validateDataOnExit(); |
| 178 | + validateUniqueInList(yangList, ctx); | ||
| 177 | } catch (DataModelException e) { | 179 | } catch (DataModelException e) { |
| 178 | throw new ParserException(constructExtendedListenerErrorMessage(UNHANDLED_PARSED_DATA, | 180 | throw new ParserException(constructExtendedListenerErrorMessage(UNHANDLED_PARSED_DATA, |
| 179 | LIST_DATA, ctx.identifier().getText(), EXIT, e.getMessage())); | 181 | LIST_DATA, ctx.identifier().getText(), EXIT, e.getMessage())); | ... | ... |
| 1 | +/* | ||
| 2 | + * Copyright 2016-present Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | + | ||
| 17 | +package org.onosproject.yangutils.parser.impl.listeners; | ||
| 18 | + | ||
| 19 | +import org.onosproject.yangutils.datamodel.YangList; | ||
| 20 | +import org.onosproject.yangutils.datamodel.exceptions.DataModelException; | ||
| 21 | +import org.onosproject.yangutils.datamodel.utils.Parsable; | ||
| 22 | +import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser; | ||
| 23 | +import org.onosproject.yangutils.parser.exceptions.ParserException; | ||
| 24 | +import org.onosproject.yangutils.parser.impl.TreeWalkListener; | ||
| 25 | + | ||
| 26 | +import static org.onosproject.yangutils.datamodel.utils.YangConstructType.UNIQUE_DATA; | ||
| 27 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY; | ||
| 28 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction | ||
| 29 | + .constructExtendedListenerErrorMessage; | ||
| 30 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction | ||
| 31 | + .constructListenerErrorMessage; | ||
| 32 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER; | ||
| 33 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER; | ||
| 34 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.UNHANDLED_PARSED_DATA; | ||
| 35 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.removeQuotesAndHandleConcat; | ||
| 36 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty; | ||
| 37 | + | ||
| 38 | +/* | ||
| 39 | + * Reference: RFC6020 and YANG ANTLR Grammar | ||
| 40 | + * | ||
| 41 | + * ABNF grammar as per RFC6020 | ||
| 42 | + * unique-stmt = unique-keyword sep unique-arg-str stmtend | ||
| 43 | + * | ||
| 44 | + * ANTLR grammar rule | ||
| 45 | + * uniqueStatement: UNIQUE_KEYWORD unique STMTEND; | ||
| 46 | + * unique : string; | ||
| 47 | + */ | ||
| 48 | + | ||
| 49 | +/** | ||
| 50 | + * Represesnts listener based call back function corresponding to the "unique" rule | ||
| 51 | + * defined in ANTLR grammar file for corresponding ABNF rule in RFC 6020. | ||
| 52 | + */ | ||
| 53 | +public final class UniqueListener { | ||
| 54 | + | ||
| 55 | + /** | ||
| 56 | + * Creates a new unique listener. | ||
| 57 | + */ | ||
| 58 | + private UniqueListener() { | ||
| 59 | + } | ||
| 60 | + | ||
| 61 | + /** | ||
| 62 | + * It is called when parser receives an input matching the grammar rule | ||
| 63 | + * (unique), perform validations and updates the data model tree. | ||
| 64 | + * | ||
| 65 | + * @param listener listener's object | ||
| 66 | + * @param ctx context object of the grammar rule | ||
| 67 | + */ | ||
| 68 | + public static void processUniqueEntry(TreeWalkListener listener, | ||
| 69 | + GeneratedYangParser.UniqueStatementContext ctx) { | ||
| 70 | + | ||
| 71 | + // Check for stack to be non empty. | ||
| 72 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, UNIQUE_DATA, ctx.unique().getText(), ENTRY); | ||
| 73 | + | ||
| 74 | + Parsable tmpData = listener.getParsedDataStack().peek(); | ||
| 75 | + if (listener.getParsedDataStack().peek() instanceof YangList) { | ||
| 76 | + YangList yangList = (YangList) tmpData; | ||
| 77 | + String tmpUniqueValue = removeQuotesAndHandleConcat(ctx.unique().getText()); | ||
| 78 | + | ||
| 79 | + if (tmpUniqueValue.contains(" ")) { | ||
| 80 | + String[] uniqueValues = tmpUniqueValue.split(" "); | ||
| 81 | + for (String uniqueValue : uniqueValues) { | ||
| 82 | + try { | ||
| 83 | + yangList.addUnique(uniqueValue); | ||
| 84 | + } catch (DataModelException e) { | ||
| 85 | + throw new ParserException(constructExtendedListenerErrorMessage(UNHANDLED_PARSED_DATA, | ||
| 86 | + UNIQUE_DATA, | ||
| 87 | + ctx.unique().getText(), ENTRY, e.getMessage())); | ||
| 88 | + } | ||
| 89 | + } | ||
| 90 | + } else { | ||
| 91 | + try { | ||
| 92 | + yangList.addUnique(tmpUniqueValue); | ||
| 93 | + } catch (DataModelException e) { | ||
| 94 | + throw new ParserException(constructExtendedListenerErrorMessage(UNHANDLED_PARSED_DATA, UNIQUE_DATA, | ||
| 95 | + ctx.unique().getText(), ENTRY, e.getMessage())); | ||
| 96 | + } | ||
| 97 | + } | ||
| 98 | + } else { | ||
| 99 | + throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, UNIQUE_DATA, ctx.unique().getText(), | ||
| 100 | + ENTRY)); | ||
| 101 | + } | ||
| 102 | + } | ||
| 103 | +} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| ... | @@ -137,6 +137,7 @@ public final class UsesListener { | ... | @@ -137,6 +137,7 @@ public final class UsesListener { |
| 137 | YangUses usesNode = getYangUsesNode(JAVA_GENERATION); | 137 | YangUses usesNode = getYangUsesNode(JAVA_GENERATION); |
| 138 | YangNodeIdentifier nodeIdentifier = getValidNodeIdentifier(ctx.string().getText(), USES_DATA, ctx); | 138 | YangNodeIdentifier nodeIdentifier = getValidNodeIdentifier(ctx.string().getText(), USES_DATA, ctx); |
| 139 | usesNode.setNodeIdentifier(nodeIdentifier); | 139 | usesNode.setNodeIdentifier(nodeIdentifier); |
| 140 | + usesNode.setCurrentGroupingDepth(listener.getGroupingDepth()); | ||
| 140 | YangNode curNode = (YangNode) curData; | 141 | YangNode curNode = (YangNode) curData; |
| 141 | 142 | ||
| 142 | try { | 143 | try { | ... | ... |
This diff is collapsed. Click to expand it.
| ... | @@ -444,33 +444,6 @@ public class ConfigListenerTest { | ... | @@ -444,33 +444,6 @@ public class ConfigListenerTest { |
| 444 | * config statement's value. | 444 | * config statement's value. |
| 445 | */ | 445 | */ |
| 446 | @Test | 446 | @Test |
| 447 | - public void processNoConfigListSubStatementLeafList() throws IOException, ParserException { | ||
| 448 | - | ||
| 449 | - YangNode node = manager.getDataModel("src/test/resources/NoConfigListSubStatementLeafList.yang"); | ||
| 450 | - | ||
| 451 | - assertThat((node instanceof YangModule), is(true)); | ||
| 452 | - assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE)); | ||
| 453 | - YangModule yangNode = (YangModule) node; | ||
| 454 | - assertThat(yangNode.getName(), is("Test")); | ||
| 455 | - | ||
| 456 | - // Check whether the config value is set correctly. | ||
| 457 | - YangList list1 = (YangList) yangNode.getChild(); | ||
| 458 | - assertThat(list1.getName(), is("valid")); | ||
| 459 | - assertThat(list1.isConfig(), is(true)); | ||
| 460 | - | ||
| 461 | - ListIterator<YangLeafList> leafListIterator = list1.getListOfLeafList().listIterator(); | ||
| 462 | - YangLeafList leafListInfo = leafListIterator.next(); | ||
| 463 | - | ||
| 464 | - // Check whether config value is set correctly. | ||
| 465 | - assertThat(leafListInfo.getName(), is("invalid-interval")); | ||
| 466 | - assertThat(leafListInfo.isConfig(), is(true)); | ||
| 467 | - } | ||
| 468 | - | ||
| 469 | - /** | ||
| 470 | - * Checks when config is not specified, the default is same as the parent's schema node's | ||
| 471 | - * config statement's value. | ||
| 472 | - */ | ||
| 473 | - @Test | ||
| 474 | public void processNoConfigListSubStatementLeaf() throws IOException, ParserException { | 447 | public void processNoConfigListSubStatementLeaf() throws IOException, ParserException { |
| 475 | 448 | ||
| 476 | YangNode node = manager.getDataModel("src/test/resources/NoConfigListSubStatementLeaf.yang"); | 449 | YangNode node = manager.getDataModel("src/test/resources/NoConfigListSubStatementLeaf.yang"); | ... | ... |
| ... | @@ -143,26 +143,6 @@ public class KeyListenerTest { | ... | @@ -143,26 +143,6 @@ public class KeyListenerTest { |
| 143 | } | 143 | } |
| 144 | 144 | ||
| 145 | /** | 145 | /** |
| 146 | - * Checks key values are set correctly. | ||
| 147 | - */ | ||
| 148 | - @Test | ||
| 149 | - public void processConfigFalseValidKeyValidLeafList() throws IOException, ParserException { | ||
| 150 | - YangNode node = manager.getDataModel("src/test/resources/ConfigFalseValidKeyValidLeafList.yang"); | ||
| 151 | - | ||
| 152 | - assertThat((node instanceof YangModule), is(true)); | ||
| 153 | - assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE)); | ||
| 154 | - YangModule yangNode = (YangModule) node; | ||
| 155 | - assertThat(yangNode.getName(), is("Test")); | ||
| 156 | - | ||
| 157 | - // Check whether the list is child of module | ||
| 158 | - YangList yangList = (YangList) yangNode.getChild(); | ||
| 159 | - assertThat(yangList.getName(), is("valid")); | ||
| 160 | - | ||
| 161 | - ListIterator<String> keyList = yangList.getKeyList().listIterator(); | ||
| 162 | - assertThat(keyList.next(), is("invalid-interval")); | ||
| 163 | - } | ||
| 164 | - | ||
| 165 | - /** | ||
| 166 | * Checks whether exception is thrown when list's config is set to true and there is no key. | 146 | * Checks whether exception is thrown when list's config is set to true and there is no key. |
| 167 | */ | 147 | */ |
| 168 | @Test | 148 | @Test |
| ... | @@ -233,26 +213,6 @@ public class KeyListenerTest { | ... | @@ -233,26 +213,6 @@ public class KeyListenerTest { |
| 233 | } | 213 | } |
| 234 | 214 | ||
| 235 | /** | 215 | /** |
| 236 | - * Checks whether exception is thrown when key leaf-list identifier is not found in list. | ||
| 237 | - */ | ||
| 238 | - @Test | ||
| 239 | - public void processInvalidLeafListIdentifier() throws IOException, ParserException { | ||
| 240 | - thrown.expect(ParserException.class); | ||
| 241 | - thrown.expectMessage("An identifier, in key, must refer to a child leaf of the list"); | ||
| 242 | - YangNode node = manager.getDataModel("src/test/resources/InvalidLeafListIdentifier.yang"); | ||
| 243 | - } | ||
| 244 | - | ||
| 245 | - /** | ||
| 246 | - * Checks whether exception is thrown when key leaf-list is of type empty. | ||
| 247 | - */ | ||
| 248 | - @Test | ||
| 249 | - public void processKeyLeafListTypeEmpty() throws IOException, ParserException { | ||
| 250 | - thrown.expect(ParserException.class); | ||
| 251 | - thrown.expectMessage("A leaf-list that is part of the key must not be the built-in type \"empty\"."); | ||
| 252 | - YangNode node = manager.getDataModel("src/test/resources/KeyLeafListTypeEmpty.yang"); | ||
| 253 | - } | ||
| 254 | - | ||
| 255 | - /** | ||
| 256 | * Checks whether exception is thrown when key leaf is of type empty. | 216 | * Checks whether exception is thrown when key leaf is of type empty. |
| 257 | */ | 217 | */ |
| 258 | @Test | 218 | @Test | ... | ... |
| 1 | +/* | ||
| 2 | + * Copyright 2016-present Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | + | ||
| 17 | +package org.onosproject.yangutils.parser.impl.listeners; | ||
| 18 | + | ||
| 19 | +import org.junit.Rule; | ||
| 20 | +import org.junit.Test; | ||
| 21 | +import org.junit.rules.ExpectedException; | ||
| 22 | +import org.onosproject.yangutils.datamodel.YangList; | ||
| 23 | +import org.onosproject.yangutils.datamodel.YangModule; | ||
| 24 | +import org.onosproject.yangutils.datamodel.YangNode; | ||
| 25 | +import org.onosproject.yangutils.datamodel.YangNodeType; | ||
| 26 | +import org.onosproject.yangutils.parser.exceptions.ParserException; | ||
| 27 | +import org.onosproject.yangutils.parser.impl.YangUtilsParserManager; | ||
| 28 | + | ||
| 29 | +import java.io.IOException; | ||
| 30 | +import java.util.ListIterator; | ||
| 31 | + | ||
| 32 | +import static org.hamcrest.MatcherAssert.assertThat; | ||
| 33 | +import static org.hamcrest.core.Is.is; | ||
| 34 | + | ||
| 35 | +/** | ||
| 36 | + * Test cases for unique listener. | ||
| 37 | + */ | ||
| 38 | +public class UniqueListenerTest { | ||
| 39 | + | ||
| 40 | + @Rule | ||
| 41 | + public ExpectedException thrown = ExpectedException.none(); | ||
| 42 | + | ||
| 43 | + private final YangUtilsParserManager manager = new YangUtilsParserManager(); | ||
| 44 | + | ||
| 45 | + /** | ||
| 46 | + * Checks unique statement as sub-statement of list. | ||
| 47 | + */ | ||
| 48 | + @Test | ||
| 49 | + public void processListSubStatementUnique() throws IOException, ParserException { | ||
| 50 | + | ||
| 51 | + YangNode node = manager.getDataModel("src/test/resources/ListSubStatementUnique.yang"); | ||
| 52 | + | ||
| 53 | + assertThat((node instanceof YangModule), is(true)); | ||
| 54 | + | ||
| 55 | + // Check whether the node type is set properly to module. | ||
| 56 | + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE)); | ||
| 57 | + | ||
| 58 | + // Check whether the module name is set correctly. | ||
| 59 | + YangModule yangNode = (YangModule) node; | ||
| 60 | + assertThat(yangNode.getName(), is("Test")); | ||
| 61 | + | ||
| 62 | + // Check whether the list is child of module | ||
| 63 | + YangList yangList = (YangList) yangNode.getChild(); | ||
| 64 | + assertThat(yangList.getName(), is("valid")); | ||
| 65 | + assertThat(yangList.getUniqueList().listIterator().next(), is("invalid-interval")); | ||
| 66 | + } | ||
| 67 | + | ||
| 68 | + /** | ||
| 69 | + * Check multiple unique values. | ||
| 70 | + */ | ||
| 71 | + @Test | ||
| 72 | + public void processMultipleUniqueValues() throws IOException, ParserException { | ||
| 73 | + | ||
| 74 | + YangNode node = manager.getDataModel("src/test/resources/MultipleUniqueValues.yang"); | ||
| 75 | + | ||
| 76 | + assertThat((node instanceof YangModule), is(true)); | ||
| 77 | + | ||
| 78 | + // Check whether the node type is set properly to module. | ||
| 79 | + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE)); | ||
| 80 | + | ||
| 81 | + // Check whether the module name is set correctly. | ||
| 82 | + YangModule yangNode = (YangModule) node; | ||
| 83 | + assertThat(yangNode.getName(), is("Test")); | ||
| 84 | + | ||
| 85 | + // Check whether the list is child of module | ||
| 86 | + YangList yangList = (YangList) yangNode.getChild(); | ||
| 87 | + assertThat(yangList.getName(), is("valid")); | ||
| 88 | + ListIterator<String> listIterator; | ||
| 89 | + String list; | ||
| 90 | + listIterator = yangList.getUniqueList().listIterator(); | ||
| 91 | + list = listIterator.next(); | ||
| 92 | + assertThat(list, is("ospf")); | ||
| 93 | + list = listIterator.next(); | ||
| 94 | + assertThat(list, is("isis")); | ||
| 95 | + } | ||
| 96 | +} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
| ... | @@ -16,17 +16,11 @@ | ... | @@ -16,17 +16,11 @@ |
| 16 | 16 | ||
| 17 | package org.onosproject.yangutils.plugin.manager; | 17 | package org.onosproject.yangutils.plugin.manager; |
| 18 | 18 | ||
| 19 | -import java.io.IOException; | ||
| 20 | -import java.util.List; | ||
| 21 | -import java.util.ListIterator; | ||
| 22 | - | ||
| 23 | import org.junit.Test; | 19 | import org.junit.Test; |
| 24 | import org.onosproject.yangutils.datamodel.YangContainer; | 20 | import org.onosproject.yangutils.datamodel.YangContainer; |
| 25 | -import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes; | ||
| 26 | import org.onosproject.yangutils.datamodel.YangFeature; | 21 | import org.onosproject.yangutils.datamodel.YangFeature; |
| 27 | import org.onosproject.yangutils.datamodel.YangIfFeature; | 22 | import org.onosproject.yangutils.datamodel.YangIfFeature; |
| 28 | import org.onosproject.yangutils.datamodel.YangLeaf; | 23 | import org.onosproject.yangutils.datamodel.YangLeaf; |
| 29 | -import org.onosproject.yangutils.datamodel.YangLeafRef; | ||
| 30 | import org.onosproject.yangutils.datamodel.YangModule; | 24 | import org.onosproject.yangutils.datamodel.YangModule; |
| 31 | import org.onosproject.yangutils.datamodel.YangNode; | 25 | import org.onosproject.yangutils.datamodel.YangNode; |
| 32 | import org.onosproject.yangutils.datamodel.YangNodeType; | 26 | import org.onosproject.yangutils.datamodel.YangNodeType; |
| ... | @@ -35,6 +29,9 @@ import org.onosproject.yangutils.datamodel.utils.ResolvableStatus; | ... | @@ -35,6 +29,9 @@ import org.onosproject.yangutils.datamodel.utils.ResolvableStatus; |
| 35 | import org.onosproject.yangutils.parser.exceptions.ParserException; | 29 | import org.onosproject.yangutils.parser.exceptions.ParserException; |
| 36 | import org.onosproject.yangutils.parser.impl.YangUtilsParserManager; | 30 | import org.onosproject.yangutils.parser.impl.YangUtilsParserManager; |
| 37 | 31 | ||
| 32 | +import java.io.IOException; | ||
| 33 | +import java.util.List; | ||
| 34 | + | ||
| 38 | import static org.hamcrest.MatcherAssert.assertThat; | 35 | import static org.hamcrest.MatcherAssert.assertThat; |
| 39 | import static org.hamcrest.core.Is.is; | 36 | import static org.hamcrest.core.Is.is; |
| 40 | 37 | ||
| ... | @@ -221,111 +218,4 @@ public class IntraFileIfFeatureLinkingTest { | ... | @@ -221,111 +218,4 @@ public class IntraFileIfFeatureLinkingTest { |
| 221 | assertThat(ifFeature.getName().getName(), is("local-storage")); | 218 | assertThat(ifFeature.getName().getName(), is("local-storage")); |
| 222 | assertThat(ifFeature.getResolvableStatus(), is(ResolvableStatus.RESOLVED)); | 219 | assertThat(ifFeature.getResolvableStatus(), is(ResolvableStatus.RESOLVED)); |
| 223 | } | 220 | } |
| 224 | - | ||
| 225 | - /** | ||
| 226 | - * Checks addition of if-feature list to leafref. | ||
| 227 | - */ | ||
| 228 | - @Test | ||
| 229 | - public void processSelfFileLinkingWithFeatureReferredByLeafref() | ||
| 230 | - throws IOException, ParserException { | ||
| 231 | - | ||
| 232 | - YangNode node = manager | ||
| 233 | - .getDataModel("src/test/resources/SelfFileLinkingWithFeatureReferredByLeafref.yang"); | ||
| 234 | - | ||
| 235 | - // Check whether the data model tree returned is of type module. | ||
| 236 | - assertThat((node instanceof YangModule), is(true)); | ||
| 237 | - | ||
| 238 | - // Check whether the node type is set properly to module. | ||
| 239 | - assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE)); | ||
| 240 | - | ||
| 241 | - // Check whether the module name is set correctly. | ||
| 242 | - YangModule yangNode = (YangModule) node; | ||
| 243 | - assertThat(yangNode.getName(), is("syslog")); | ||
| 244 | - | ||
| 245 | - List<YangFeature> featureList = yangNode.getFeatureList(); | ||
| 246 | - YangFeature feature = featureList.iterator().next(); | ||
| 247 | - assertThat(feature.getName(), is("local-storage")); | ||
| 248 | - | ||
| 249 | - YangContainer container = (YangContainer) yangNode.getChild(); | ||
| 250 | - assertThat(container.getName(), is("speed")); | ||
| 251 | - | ||
| 252 | - List<YangLeaf> listOfLeaf = container.getListOfLeaf(); | ||
| 253 | - YangLeaf leaf = listOfLeaf.iterator().next(); | ||
| 254 | - assertThat(leaf.getName(), is("local-storage-limit")); | ||
| 255 | - | ||
| 256 | - List<YangIfFeature> ifFeatureList = leaf.getIfFeatureList(); | ||
| 257 | - YangIfFeature ifFeature = ifFeatureList.iterator().next(); | ||
| 258 | - assertThat(ifFeature.getName().getName(), is("local-storage")); | ||
| 259 | - assertThat(ifFeature.getResolvableStatus(), is(ResolvableStatus.RESOLVED)); | ||
| 260 | - | ||
| 261 | - ListIterator<YangLeaf> listOfLeafInModule = yangNode.getListOfLeaf().listIterator(); | ||
| 262 | - YangLeaf yangLeaf = listOfLeafInModule.next(); | ||
| 263 | - assertThat(yangLeaf.getName(), is("storage-value")); | ||
| 264 | - | ||
| 265 | - YangLeafRef leafRef = (YangLeafRef) yangLeaf.getDataType().getDataTypeExtendedInfo(); | ||
| 266 | - | ||
| 267 | - assertThat(leafRef.getEffectiveDataType().getDataType(), is(YangDataTypes.UINT64)); | ||
| 268 | - | ||
| 269 | - List<YangIfFeature> ifFeatureListInLeafref = leafRef.getIfFeatureList(); | ||
| 270 | - YangIfFeature ifFeatureInLeafref = ifFeatureListInLeafref.iterator().next(); | ||
| 271 | - assertThat(ifFeatureInLeafref.getName().getName(), is("local-storage")); | ||
| 272 | - assertThat(ifFeatureInLeafref.getResolvableStatus(), is(ResolvableStatus.RESOLVED)); | ||
| 273 | - } | ||
| 274 | - | ||
| 275 | - /** | ||
| 276 | - * Checks addition of if-feature list to leafref when referred leaf is again having leafref in it. | ||
| 277 | - */ | ||
| 278 | - @Test | ||
| 279 | - public void processSelfFileLinkingWithFeatureReferredByMultiLeafref() | ||
| 280 | - throws IOException, ParserException { | ||
| 281 | - | ||
| 282 | - YangNode node = manager | ||
| 283 | - .getDataModel("src/test/resources/SelfFileLinkingWithFeatureReferredByMultiLeafref.yang"); | ||
| 284 | - | ||
| 285 | - // Check whether the data model tree returned is of type module. | ||
| 286 | - assertThat((node instanceof YangModule), is(true)); | ||
| 287 | - | ||
| 288 | - // Check whether the node type is set properly to module. | ||
| 289 | - assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE)); | ||
| 290 | - | ||
| 291 | - // Check whether the module name is set correctly. | ||
| 292 | - YangModule yangNode = (YangModule) node; | ||
| 293 | - assertThat(yangNode.getName(), is("syslog")); | ||
| 294 | - | ||
| 295 | - List<YangFeature> featureList = yangNode.getFeatureList(); | ||
| 296 | - YangFeature feature = featureList.iterator().next(); | ||
| 297 | - assertThat(feature.getName(), is("local-storage")); | ||
| 298 | - | ||
| 299 | - YangContainer container = (YangContainer) yangNode.getChild(); | ||
| 300 | - assertThat(container.getName(), is("speed")); | ||
| 301 | - | ||
| 302 | - List<YangLeaf> listOfLeaf = container.getListOfLeaf(); | ||
| 303 | - YangLeaf leaf = listOfLeaf.iterator().next(); | ||
| 304 | - assertThat(leaf.getName(), is("local-storage-limit")); | ||
| 305 | - | ||
| 306 | - List<YangIfFeature> ifFeatureList = leaf.getIfFeatureList(); | ||
| 307 | - YangIfFeature ifFeature = ifFeatureList.iterator().next(); | ||
| 308 | - assertThat(ifFeature.getName().getName(), is("local-storage")); | ||
| 309 | - assertThat(ifFeature.getResolvableStatus(), is(ResolvableStatus.RESOLVED)); | ||
| 310 | - | ||
| 311 | - ListIterator<YangLeaf> listOfLeafInModule = yangNode.getListOfLeaf().listIterator(); | ||
| 312 | - YangLeaf yangLeaf = listOfLeafInModule.next(); | ||
| 313 | - assertThat(yangLeaf.getName(), is("storage-value")); | ||
| 314 | - | ||
| 315 | - YangLeafRef leafRef = (YangLeafRef) yangLeaf.getDataType().getDataTypeExtendedInfo(); | ||
| 316 | - | ||
| 317 | - assertThat(leafRef.getEffectiveDataType().getDataType(), is(YangDataTypes.UINT64)); | ||
| 318 | - | ||
| 319 | - List<YangIfFeature> ifFeatureListInLeafref = leafRef.getIfFeatureList(); | ||
| 320 | - YangIfFeature ifFeatureInLeafref = ifFeatureListInLeafref.iterator().next(); | ||
| 321 | - | ||
| 322 | - assertThat(ifFeatureInLeafref.getName().getName(), is("main-storage")); | ||
| 323 | - assertThat(ifFeatureInLeafref.getResolvableStatus(), is(ResolvableStatus.RESOLVED)); | ||
| 324 | - | ||
| 325 | - YangIfFeature ifFeatureInLeafref1 = ifFeatureListInLeafref.iterator().next(); | ||
| 326 | - | ||
| 327 | - assertThat(ifFeatureInLeafref1.getName().getName(), is("main-storage")); | ||
| 328 | - assertThat(ifFeatureInLeafref1.getResolvableStatus(), is(ResolvableStatus.RESOLVED)); | ||
| 329 | - | ||
| 330 | - } | ||
| 331 | } | 221 | } | ... | ... |
This diff is collapsed. Click to expand it.
| 1 | -module Test { | ||
| 2 | - yang-version 1; | ||
| 3 | - namespace http://huawei.com; | ||
| 4 | - prefix Ant; | ||
| 5 | - list valid { | ||
| 6 | - key "invalid-interval"; | ||
| 7 | - leaf-list invalid { | ||
| 8 | - type "string"; | ||
| 9 | - units "seconds"; | ||
| 10 | - status current; | ||
| 11 | - reference "RFC 6020"; | ||
| 12 | - } | ||
| 13 | - } | ||
| 14 | -} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | -module Test { | ||
| 2 | - yang-version 1; | ||
| 3 | - namespace http://huawei.com; | ||
| 4 | - prefix Ant; | ||
| 5 | - list valid { | ||
| 6 | - key "invalid-interval"; | ||
| 7 | - leaf-list invalid-interval { | ||
| 8 | - type "empty"; | ||
| 9 | - units "seconds"; | ||
| 10 | - status current; | ||
| 11 | - reference "RFC 6020"; | ||
| 12 | - } | ||
| 13 | - } | ||
| 14 | -} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| ... | @@ -4,7 +4,7 @@ module Test { | ... | @@ -4,7 +4,7 @@ module Test { |
| 4 | namespace http://huawei.com; | 4 | namespace http://huawei.com; |
| 5 | prefix Ant; | 5 | prefix Ant; |
| 6 | list valid { | 6 | list valid { |
| 7 | - key "invalid-interval"; | 7 | + key "invalid"; |
| 8 | leaf-list invalid-interval { | 8 | leaf-list invalid-interval { |
| 9 | type "uint16"; | 9 | type "uint16"; |
| 10 | units "seconds"; | 10 | units "seconds"; |
| ... | @@ -13,5 +13,8 @@ module Test { | ... | @@ -13,5 +13,8 @@ module Test { |
| 13 | status current; | 13 | status current; |
| 14 | reference "RFC 6020"; | 14 | reference "RFC 6020"; |
| 15 | } | 15 | } |
| 16 | + leaf invalid { | ||
| 17 | + type "uint16"; | ||
| 18 | + } | ||
| 16 | } | 19 | } |
| 17 | } | 20 | } |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -3,12 +3,15 @@ module Test { | ... | @@ -3,12 +3,15 @@ module Test { |
| 3 | namespace http://huawei.com; | 3 | namespace http://huawei.com; |
| 4 | prefix Ant; | 4 | prefix Ant; |
| 5 | list valid { | 5 | list valid { |
| 6 | - key "invalid-interval"; | 6 | + key "invalid"; |
| 7 | max-elements 3; | 7 | max-elements 3; |
| 8 | leaf-list invalid-interval { | 8 | leaf-list invalid-interval { |
| 9 | type "uint16"; | 9 | type "uint16"; |
| 10 | units "seconds"; | 10 | units "seconds"; |
| 11 | description "Interval before a route is declared invalid"; | 11 | description "Interval before a route is declared invalid"; |
| 12 | } | 12 | } |
| 13 | + leaf invalid { | ||
| 14 | + type "uint16"; | ||
| 15 | + } | ||
| 13 | } | 16 | } |
| 14 | } | 17 | } |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -3,12 +3,15 @@ module Test { | ... | @@ -3,12 +3,15 @@ module Test { |
| 3 | namespace http://huawei.com; | 3 | namespace http://huawei.com; |
| 4 | prefix Ant; | 4 | prefix Ant; |
| 5 | list valid { | 5 | list valid { |
| 6 | - key "invalid-interval"; | 6 | + key "invalid"; |
| 7 | min-elements 3; | 7 | min-elements 3; |
| 8 | leaf-list invalid-interval { | 8 | leaf-list invalid-interval { |
| 9 | type "uint16"; | 9 | type "uint16"; |
| 10 | units "seconds"; | 10 | units "seconds"; |
| 11 | description "Interval before a route is declared invalid"; | 11 | description "Interval before a route is declared invalid"; |
| 12 | } | 12 | } |
| 13 | + leaf invalid { | ||
| 14 | + type "uint16"; | ||
| 15 | + } | ||
| 13 | } | 16 | } |
| 14 | } | 17 | } |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -3,12 +3,13 @@ module Test { | ... | @@ -3,12 +3,13 @@ module Test { |
| 3 | namespace http://huawei.com; | 3 | namespace http://huawei.com; |
| 4 | prefix Ant; | 4 | prefix Ant; |
| 5 | list valid { | 5 | list valid { |
| 6 | + unique "invalid-interval"; | ||
| 6 | key "invalid-interval"; | 7 | key "invalid-interval"; |
| 7 | - leaf-list invalid-interval { | 8 | + leaf invalid-interval { |
| 8 | type "uint16"; | 9 | type "uint16"; |
| 9 | units "seconds"; | 10 | units "seconds"; |
| 10 | status current; | 11 | status current; |
| 11 | reference "RFC 6020"; | 12 | reference "RFC 6020"; |
| 12 | } | 13 | } |
| 13 | } | 14 | } |
| 14 | -} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 15 | +} | ... | ... |
| ... | @@ -3,9 +3,16 @@ module Test { | ... | @@ -3,9 +3,16 @@ module Test { |
| 3 | namespace http://huawei.com; | 3 | namespace http://huawei.com; |
| 4 | prefix Ant; | 4 | prefix Ant; |
| 5 | list valid { | 5 | list valid { |
| 6 | - key "invalid-interval"; | 6 | + key "ospf"; |
| 7 | - leaf-list invalid-interval { | 7 | + unique "ospf isis"; |
| 8 | - type "string"; | 8 | + leaf ospf { |
| 9 | + type "uint16"; | ||
| 10 | + units "seconds"; | ||
| 11 | + status current; | ||
| 12 | + reference "RFC 6020"; | ||
| 13 | + } | ||
| 14 | + leaf isis { | ||
| 15 | + type "uint16"; | ||
| 9 | units "seconds"; | 16 | units "seconds"; |
| 10 | status current; | 17 | status current; |
| 11 | reference "RFC 6020"; | 18 | reference "RFC 6020"; | ... | ... |
| ... | @@ -3,7 +3,7 @@ module Test { | ... | @@ -3,7 +3,7 @@ module Test { |
| 3 | namespace http://huawei.com; | 3 | namespace http://huawei.com; |
| 4 | prefix Ant; | 4 | prefix Ant; |
| 5 | list valid { | 5 | list valid { |
| 6 | - key "invalid-interval"; | 6 | + key "invalid"; |
| 7 | leaf-list invalid-interval { | 7 | leaf-list invalid-interval { |
| 8 | type union { | 8 | type union { |
| 9 | type int32; | 9 | type int32; |
| ... | @@ -12,5 +12,8 @@ module Test { | ... | @@ -12,5 +12,8 @@ module Test { |
| 12 | } | 12 | } |
| 13 | } | 13 | } |
| 14 | } | 14 | } |
| 15 | + leaf invalid { | ||
| 16 | + type string; | ||
| 17 | + } | ||
| 15 | } | 18 | } |
| 16 | } | 19 | } | ... | ... |
| 1 | -module ietf-network { | ||
| 2 | - yang-version 1; | ||
| 3 | - namespace "urn:ietf:params:xml:ns:yang:ietf-network"; | ||
| 4 | - prefix nd; | ||
| 5 | - container networks { | ||
| 6 | - description | ||
| 7 | - "Serves as top-level container for a list of networks."; | ||
| 8 | - leaf network-id { | ||
| 9 | - type uint8; | ||
| 10 | - description | ||
| 11 | - "Identifies a network."; | ||
| 12 | - } | ||
| 13 | - } | ||
| 14 | - leaf network-ref { | ||
| 15 | - type leafref { | ||
| 16 | - path "/define/network-id"; | ||
| 17 | - } | ||
| 18 | - } | ||
| 19 | -} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| ... | @@ -103,7 +103,11 @@ | ... | @@ -103,7 +103,11 @@ |
| 103 | description | 103 | description |
| 104 | "References a link in a specific network."; | 104 | "References a link in a specific network."; |
| 105 | leaf link-ref { | 105 | leaf link-ref { |
| 106 | - type link-id; | 106 | + type leafref { |
| 107 | + path "/nd:networks/nd:network[nd:network-id=current()/../"+ | ||
| 108 | + "network-ref]/lnk:link/lnk:link-id"; | ||
| 109 | + require-instance false; | ||
| 110 | + } | ||
| 107 | description | 111 | description |
| 108 | "A type for an absolute reference a link instance. | 112 | "A type for an absolute reference a link instance. |
| 109 | (This type should not be used for relative references. | 113 | (This type should not be used for relative references. |
| ... | @@ -116,7 +120,12 @@ | ... | @@ -116,7 +120,12 @@ |
| 116 | description | 120 | description |
| 117 | "References a termination point in a specific node."; | 121 | "References a termination point in a specific node."; |
| 118 | leaf tp-ref { | 122 | leaf tp-ref { |
| 119 | - type tp-id; | 123 | + type leafref { |
| 124 | + path "/nd:networks/nd:network[nd:network-id=current()/../"+ | ||
| 125 | + "network-ref]/nd:node[nd:node-id=current()/../"+ | ||
| 126 | + "node-ref]/lnk:termination-point/lnk:tp-id"; | ||
| 127 | + require-instance false; | ||
| 128 | + } | ||
| 120 | description | 129 | description |
| 121 | "A type for an absolute reference to a termination point. | 130 | "A type for an absolute reference to a termination point. |
| 122 | (This type should not be used for relative references. | 131 | (This type should not be used for relative references. |
| ... | @@ -150,13 +159,18 @@ | ... | @@ -150,13 +159,18 @@ |
| 150 | "This container holds the logical source of a particular | 159 | "This container holds the logical source of a particular |
| 151 | link."; | 160 | link."; |
| 152 | leaf source-node { | 161 | leaf source-node { |
| 153 | - type nd:node-id; | 162 | + type leafref { |
| 163 | + path "../../../nd:node/nd:node-id"; | ||
| 164 | + } | ||
| 154 | mandatory true; | 165 | mandatory true; |
| 155 | description | 166 | description |
| 156 | "Source node identifier, must be in same topology."; | 167 | "Source node identifier, must be in same topology."; |
| 157 | } | 168 | } |
| 158 | leaf source-tp { | 169 | leaf source-tp { |
| 159 | - type tp-id; | 170 | + type leafref { |
| 171 | + path "../../../nd:node[nd:node-id=current()/../"+ | ||
| 172 | + "source-node]/termination-point/tp-id"; | ||
| 173 | + } | ||
| 160 | description | 174 | description |
| 161 | "Termination point within source node that terminates | 175 | "Termination point within source node that terminates |
| 162 | the link."; | 176 | the link."; |
| ... | @@ -167,14 +181,19 @@ | ... | @@ -167,14 +181,19 @@ |
| 167 | "This container holds the logical destination of a | 181 | "This container holds the logical destination of a |
| 168 | particular link."; | 182 | particular link."; |
| 169 | leaf dest-node { | 183 | leaf dest-node { |
| 170 | - type nd:node-id; | 184 | + type leafref { |
| 185 | + path "../../../nd:node/nd:node-id"; | ||
| 186 | + } | ||
| 171 | mandatory true; | 187 | mandatory true; |
| 172 | description | 188 | description |
| 173 | "Destination node identifier, must be in the same | 189 | "Destination node identifier, must be in the same |
| 174 | network."; | 190 | network."; |
| 175 | } | 191 | } |
| 176 | leaf dest-tp { | 192 | leaf dest-tp { |
| 177 | - type tp-id; | 193 | + type leafref { |
| 194 | + path "../../../nd:node[nd:node-id=current()/../"+ | ||
| 195 | + "dest-node]/termination-point/tp-id"; | ||
| 196 | + } | ||
| 178 | description | 197 | description |
| 179 | "Termination point within destination node that | 198 | "Termination point within destination node that |
| 180 | terminates the link."; | 199 | terminates the link."; |
| ... | @@ -192,13 +211,20 @@ | ... | @@ -192,13 +211,20 @@ |
| 192 | "Identifies the link, or links, that this link | 211 | "Identifies the link, or links, that this link |
| 193 | is dependent on."; | 212 | is dependent on."; |
| 194 | leaf network-ref { | 213 | leaf network-ref { |
| 195 | - type nd:network-id; | 214 | + type leafref { |
| 215 | + path "../../../nd:supporting-network/nd:network-ref"; | ||
| 216 | + require-instance false; | ||
| 217 | + } | ||
| 196 | description | 218 | description |
| 197 | "This leaf identifies in which underlay topology | 219 | "This leaf identifies in which underlay topology |
| 198 | supporting link is present."; | 220 | supporting link is present."; |
| 199 | } | 221 | } |
| 200 | leaf link-ref { | 222 | leaf link-ref { |
| 201 | - type link-id; | 223 | + type leafref { |
| 224 | + path "/nd:networks/nd:network[nd:network-id=current()/"+ | ||
| 225 | + "../network-ref]/link/link-id"; | ||
| 226 | + require-instance false; | ||
| 227 | + } | ||
| 202 | description | 228 | description |
| 203 | "This leaf identifies a link which is a part | 229 | "This leaf identifies a link which is a part |
| 204 | of this link's underlay. Reference loops, in which | 230 | of this link's underlay. Reference loops, in which |
| ... | @@ -237,19 +263,30 @@ | ... | @@ -237,19 +263,30 @@ |
| 237 | The corresponding information is simply provided by the | 263 | The corresponding information is simply provided by the |
| 238 | implementing system."; | 264 | implementing system."; |
| 239 | leaf network-ref { | 265 | leaf network-ref { |
| 240 | - type nd:network-id; | 266 | + type leafref { |
| 267 | + path "../../../nd:supporting-node/nd:network-ref"; | ||
| 268 | + require-instance false; | ||
| 269 | + } | ||
| 241 | description | 270 | description |
| 242 | "This leaf identifies in which topology the | 271 | "This leaf identifies in which topology the |
| 243 | supporting termination point is present."; | 272 | supporting termination point is present."; |
| 244 | } | 273 | } |
| 245 | leaf node-ref { | 274 | leaf node-ref { |
| 246 | - type nd:node-id; | 275 | + type leafref { |
| 276 | + path "../../../nd:supporting-node/nd:node-ref"; | ||
| 277 | + require-instance false; | ||
| 278 | + } | ||
| 247 | description | 279 | description |
| 248 | "This leaf identifies in which node the supporting | 280 | "This leaf identifies in which node the supporting |
| 249 | termination point is present."; | 281 | termination point is present."; |
| 250 | } | 282 | } |
| 251 | leaf tp-ref { | 283 | leaf tp-ref { |
| 252 | - type tp-id; | 284 | + type leafref { |
| 285 | + path "/nd:networks/nd:network[nd:network-id=current()/"+ | ||
| 286 | + "../network-ref]/nd:node[nd:node-id=current()/../"+ | ||
| 287 | + "node-ref]/termination-point/tp-id"; | ||
| 288 | + require-instance false; | ||
| 289 | + } | ||
| 253 | description | 290 | description |
| 254 | "Reference to the underlay node, must be in a | 291 | "Reference to the underlay node, must be in a |
| 255 | different topology"; | 292 | different topology"; | ... | ... |
| ... | @@ -87,7 +87,10 @@ | ... | @@ -87,7 +87,10 @@ |
| 87 | "Contains the information necessary to reference a network, | 87 | "Contains the information necessary to reference a network, |
| 88 | for example an underlay network."; | 88 | for example an underlay network."; |
| 89 | leaf network-ref { | 89 | leaf network-ref { |
| 90 | - type network-id; | 90 | + type leafref { |
| 91 | + path "/nd:networks/nd:network/nd:network-id"; | ||
| 92 | + require-instance false; | ||
| 93 | + } | ||
| 91 | description | 94 | description |
| 92 | "Used to reference a network, for example an underlay | 95 | "Used to reference a network, for example an underlay |
| 93 | network."; | 96 | network."; |
| ... | @@ -98,7 +101,11 @@ | ... | @@ -98,7 +101,11 @@ |
| 98 | description | 101 | description |
| 99 | "Contains the information necessary to reference a node."; | 102 | "Contains the information necessary to reference a node."; |
| 100 | leaf node-ref { | 103 | leaf node-ref { |
| 101 | - type node-id; | 104 | + type leafref { |
| 105 | + path "/nd:networks/nd:network[nd:network-id=current()/../"+ | ||
| 106 | + "network-ref]/nd:node/nd:node-id"; | ||
| 107 | + require-instance false; | ||
| 108 | + } | ||
| 102 | description | 109 | description |
| 103 | "Used to reference a node. | 110 | "Used to reference a node. |
| 104 | Nodes are identified relative to the network they are | 111 | Nodes are identified relative to the network they are |
| ... | @@ -135,7 +142,10 @@ | ... | @@ -135,7 +142,10 @@ |
| 135 | "An underlay network, used to represent layered network | 142 | "An underlay network, used to represent layered network |
| 136 | topologies."; | 143 | topologies."; |
| 137 | leaf network-ref { | 144 | leaf network-ref { |
| 138 | - type network-id; | 145 | + type leafref { |
| 146 | + path "/networks/network/network-id"; | ||
| 147 | + require-instance false; | ||
| 148 | + } | ||
| 139 | description | 149 | description |
| 140 | "References the underlay network."; | 150 | "References the underlay network."; |
| 141 | } | 151 | } |
| ... | @@ -157,13 +167,19 @@ | ... | @@ -157,13 +167,19 @@ |
| 157 | this node is supported by. Used to represent layering | 167 | this node is supported by. Used to represent layering |
| 158 | structure."; | 168 | structure."; |
| 159 | leaf network-ref { | 169 | leaf network-ref { |
| 160 | - type network-id; | 170 | + type leafref { |
| 171 | + path "../../../supporting-network/network-ref"; | ||
| 172 | + require-instance false; | ||
| 173 | + } | ||
| 161 | description | 174 | description |
| 162 | "References the underlay network that the | 175 | "References the underlay network that the |
| 163 | underlay node is part of."; | 176 | underlay node is part of."; |
| 164 | } | 177 | } |
| 165 | leaf node-ref { | 178 | leaf node-ref { |
| 166 | - type node-id; | 179 | + type leafref { |
| 180 | + path "/networks/network/node/node-id"; | ||
| 181 | + require-instance false; | ||
| 182 | + } | ||
| 167 | description | 183 | description |
| 168 | "References the underlay node itself."; | 184 | "References the underlay node itself."; |
| 169 | } | 185 | } | ... | ... |
| ... | @@ -515,14 +515,14 @@ | ... | @@ -515,14 +515,14 @@ |
| 515 | "A container controlling performance metric throttle."; | 515 | "A container controlling performance metric throttle."; |
| 516 | container performance-metric-throttle { | 516 | container performance-metric-throttle { |
| 517 | if-feature te-performance-metric; | 517 | if-feature te-performance-metric; |
| 518 | - /*must "suppression-interval >= measure-interval" { | 518 | + must "suppression-interval >= measure-interval" { |
| 519 | error-message | 519 | error-message |
| 520 | "suppression-interval cannot be less then | 520 | "suppression-interval cannot be less then |
| 521 | measure-interval."; | 521 | measure-interval."; |
| 522 | description | 522 | description |
| 523 | "Constraint on suppression-interval and | 523 | "Constraint on suppression-interval and |
| 524 | measure-interval."; | 524 | measure-interval."; |
| 525 | - }*/ | 525 | + } |
| 526 | description | 526 | description |
| 527 | "Link performance information in real time."; | 527 | "Link performance information in real time."; |
| 528 | reference | 528 | reference |
| ... | @@ -549,7 +549,7 @@ | ... | @@ -549,7 +549,7 @@ |
| 549 | } | 549 | } |
| 550 | leaf suppression-interval { | 550 | leaf suppression-interval { |
| 551 | type uint32 { | 551 | type uint32 { |
| 552 | - range "1..max"; | 552 | + range "1 .. max"; |
| 553 | } | 553 | } |
| 554 | default 120; | 554 | default 120; |
| 555 | description | 555 | description |
| ... | @@ -633,13 +633,25 @@ | ... | @@ -633,13 +633,25 @@ |
| 633 | "Identify the sequence in the bundle."; | 633 | "Identify the sequence in the bundle."; |
| 634 | } | 634 | } |
| 635 | leaf src-tp-ref { | 635 | leaf src-tp-ref { |
| 636 | - type nt:tp-id; | 636 | + type leafref { |
| 637 | + path "../../../../../../nw:node[nw:node-id = " | ||
| 638 | + + "current()/../../../../../nt:source/" | ||
| 639 | + + "nt:source-node]/" | ||
| 640 | + + "nt:termination-point/nt:tp-id"; | ||
| 641 | + require-instance true; | ||
| 642 | + } | ||
| 637 | description | 643 | description |
| 638 | "Reference to another TE termination point on the | 644 | "Reference to another TE termination point on the |
| 639 | same souruce node."; | 645 | same souruce node."; |
| 640 | } | 646 | } |
| 641 | leaf des-tp-ref { | 647 | leaf des-tp-ref { |
| 642 | - type nt:tp-id; | 648 | + type leafref { |
| 649 | + path "../../../../../../nw:node[nw:node-id = " | ||
| 650 | + + "current()/../../../../../nt:destination/" | ||
| 651 | + + "nt:dest-node]/" | ||
| 652 | + + "nt:termination-point/nt:tp-id"; | ||
| 653 | + require-instance true; | ||
| 654 | + } | ||
| 643 | description | 655 | description |
| 644 | "Reference to another TE termination point on the | 656 | "Reference to another TE termination point on the |
| 645 | same destination node."; | 657 | same destination node."; |
| ... | @@ -682,7 +694,9 @@ | ... | @@ -682,7 +694,9 @@ |
| 682 | 694 | ||
| 683 | leaf-list te-link-template { | 695 | leaf-list te-link-template { |
| 684 | if-feature template; | 696 | if-feature template; |
| 685 | - type te-template-name; | 697 | + type leafref { |
| 698 | + path "../../../../../te/templates/link-template/name"; | ||
| 699 | + } | ||
| 686 | description | 700 | description |
| 687 | "The reference to a TE link template."; | 701 | "The reference to a TE link template."; |
| 688 | } | 702 | } |
| ... | @@ -862,12 +876,16 @@ | ... | @@ -862,12 +876,16 @@ |
| 862 | RFC4203: OSPF Extensions in Support of Generalized | 876 | RFC4203: OSPF Extensions in Support of Generalized |
| 863 | Multi-Protocol Label Switching (GMPLS)."; | 877 | Multi-Protocol Label Switching (GMPLS)."; |
| 864 | leaf switching-capability { | 878 | leaf switching-capability { |
| 865 | - type string; | 879 | + type identityref { |
| 880 | + base te-types:switching-capabilities; | ||
| 881 | + } | ||
| 866 | description | 882 | description |
| 867 | "Switching Capability for this interface."; | 883 | "Switching Capability for this interface."; |
| 868 | } | 884 | } |
| 869 | leaf encoding { | 885 | leaf encoding { |
| 870 | - type string; | 886 | + type identityref { |
| 887 | + base te-types:lsp-encoding-types; | ||
| 888 | + } | ||
| 871 | description | 889 | description |
| 872 | "Encoding supported by this interface."; | 890 | "Encoding supported by this interface."; |
| 873 | } | 891 | } |
| ... | @@ -929,12 +947,16 @@ | ... | @@ -929,12 +947,16 @@ |
| 929 | "RFC6001: Generalized MPLS (GMPLS) Protocol Extensions | 947 | "RFC6001: Generalized MPLS (GMPLS) Protocol Extensions |
| 930 | for Multi-Layer and Multi-Region Networks (MLN/MRN)."; | 948 | for Multi-Layer and Multi-Region Networks (MLN/MRN)."; |
| 931 | leaf upper-sc { | 949 | leaf upper-sc { |
| 932 | - type string; | 950 | + type identityref { |
| 951 | + base te-types:switching-capabilities; | ||
| 952 | + } | ||
| 933 | description | 953 | description |
| 934 | "Switching Capability for this interface."; | 954 | "Switching Capability for this interface."; |
| 935 | } | 955 | } |
| 936 | leaf upper-encoding { | 956 | leaf upper-encoding { |
| 937 | - type string; | 957 | + type identityref { |
| 958 | + base te-types:lsp-encoding-types; | ||
| 959 | + } | ||
| 938 | description | 960 | description |
| 939 | "Encoding supported by this interface."; | 961 | "Encoding supported by this interface."; |
| 940 | } | 962 | } |
| ... | @@ -1140,13 +1162,17 @@ | ... | @@ -1140,13 +1162,17 @@ |
| 1140 | 1162 | ||
| 1141 | uses te-node-tunnel-termination-capability; | 1163 | uses te-node-tunnel-termination-capability; |
| 1142 | leaf switching-capability { | 1164 | leaf switching-capability { |
| 1143 | - type string; | 1165 | + type identityref { |
| 1166 | + base te-types:switching-capabilities; | ||
| 1167 | + } | ||
| 1144 | mandatory true; | 1168 | mandatory true; |
| 1145 | description | 1169 | description |
| 1146 | "Switching Capability."; | 1170 | "Switching Capability."; |
| 1147 | } | 1171 | } |
| 1148 | leaf encoding { | 1172 | leaf encoding { |
| 1149 | - type string; | 1173 | + type identityref { |
| 1174 | + base te-types:lsp-encoding-types; | ||
| 1175 | + } | ||
| 1150 | mandatory true; | 1176 | mandatory true; |
| 1151 | description | 1177 | description |
| 1152 | "Encoding type."; | 1178 | "Encoding type."; |
| ... | @@ -1162,7 +1188,9 @@ | ... | @@ -1162,7 +1188,9 @@ |
| 1162 | 1188 | ||
| 1163 | leaf-list te-node-template { | 1189 | leaf-list te-node-template { |
| 1164 | if-feature template; | 1190 | if-feature template; |
| 1165 | - type te-template-name; | 1191 | + type leafref { |
| 1192 | + path "../../../../../te/templates/node-template/name"; | ||
| 1193 | + } | ||
| 1166 | description | 1194 | description |
| 1167 | "The reference to a TE node template."; | 1195 | "The reference to a TE node template."; |
| 1168 | } | 1196 | } |
| ... | @@ -1231,7 +1259,9 @@ | ... | @@ -1231,7 +1259,9 @@ |
| 1231 | } | 1259 | } |
| 1232 | container from { | 1260 | container from { |
| 1233 | leaf tp-ref { | 1261 | leaf tp-ref { |
| 1234 | - type nt:tp-id; | 1262 | + type leafref { |
| 1263 | + path "../../../../../../nt:termination-point/nt:tp-id"; | ||
| 1264 | + } | ||
| 1235 | description | 1265 | description |
| 1236 | "Relative reference to source termination point."; | 1266 | "Relative reference to source termination point."; |
| 1237 | } | 1267 | } |
| ... | @@ -1240,7 +1270,9 @@ | ... | @@ -1240,7 +1270,9 @@ |
| 1240 | } | 1270 | } |
| 1241 | container to { | 1271 | container to { |
| 1242 | leaf tp-ref { | 1272 | leaf tp-ref { |
| 1243 | - type nt:tp-id; | 1273 | + type leafref { |
| 1274 | + path "../../../../../../nt:termination-point/nt:tp-id"; | ||
| 1275 | + } | ||
| 1244 | description | 1276 | description |
| 1245 | "Relative reference to destination termination point."; | 1277 | "Relative reference to destination termination point."; |
| 1246 | } | 1278 | } |
| ... | @@ -1402,7 +1434,9 @@ | ... | @@ -1402,7 +1434,9 @@ |
| 1402 | The capability information can be used to compute | 1434 | The capability information can be used to compute |
| 1403 | the tunnel path."; | 1435 | the tunnel path."; |
| 1404 | leaf link-tp { | 1436 | leaf link-tp { |
| 1405 | - type nt:tp-id; | 1437 | + type leafref { |
| 1438 | + path "../../../../../nt:termination-point/nt:tp-id"; | ||
| 1439 | + } | ||
| 1406 | description | 1440 | description |
| 1407 | "Link termination point."; | 1441 | "Link termination point."; |
| 1408 | } | 1442 | } |
| ... | @@ -1562,22 +1596,37 @@ | ... | @@ -1562,22 +1596,37 @@ |
| 1562 | description | 1596 | description |
| 1563 | "References a TE topology."; | 1597 | "References a TE topology."; |
| 1564 | leaf provider-id-ref { | 1598 | leaf provider-id-ref { |
| 1565 | - type te-global-id; | 1599 | + type leafref { |
| 1600 | + path "/nw:networks/nw:network[nw:network-id = " | ||
| 1601 | + + "current()/../network-id-ref]/tet:te/tet:provider-id"; | ||
| 1602 | + require-instance false; | ||
| 1603 | + } | ||
| 1566 | description | 1604 | description |
| 1567 | "A reference to a provider-id."; | 1605 | "A reference to a provider-id."; |
| 1568 | } | 1606 | } |
| 1569 | leaf client-id-ref { | 1607 | leaf client-id-ref { |
| 1570 | - type te-global-id; | 1608 | + type leafref { |
| 1609 | + path "/nw:networks/nw:network[nw:network-id = " | ||
| 1610 | + + "current()/../network-id-ref]/tet:te/tet:client-id"; | ||
| 1611 | + require-instance false; | ||
| 1612 | + } | ||
| 1571 | description | 1613 | description |
| 1572 | "A reference to a client-id."; | 1614 | "A reference to a client-id."; |
| 1573 | } | 1615 | } |
| 1574 | leaf te-topology-id-ref { | 1616 | leaf te-topology-id-ref { |
| 1575 | - type tet:te-topology-id; | 1617 | + type leafref { |
| 1618 | + path "/nw:networks/nw:network[nw:network-id = " | ||
| 1619 | + + "current()/../network-id-ref]/tet:te/tet:te-topology-id"; | ||
| 1620 | + require-instance false; | ||
| 1621 | + } | ||
| 1576 | description | 1622 | description |
| 1577 | "A reference to a te-topology-id."; | 1623 | "A reference to a te-topology-id."; |
| 1578 | } | 1624 | } |
| 1579 | leaf network-id-ref { | 1625 | leaf network-id-ref { |
| 1580 | - type nw:network-id; | 1626 | + type leafref { |
| 1627 | + path "/nw:networks/nw:network/nw:network-id"; | ||
| 1628 | + require-instance false; | ||
| 1629 | + } | ||
| 1581 | description | 1630 | description |
| 1582 | "A reference to a network-id in base ietf-network module."; | 1631 | "A reference to a network-id in base ietf-network module."; |
| 1583 | } | 1632 | } | ... | ... |
| ... | @@ -580,7 +580,7 @@ | ... | @@ -580,7 +580,7 @@ |
| 580 | 580 | ||
| 581 | typedef admin-group { | 581 | typedef admin-group { |
| 582 | type binary { | 582 | type binary { |
| 583 | - length 32; | 583 | + length 32; |
| 584 | } | 584 | } |
| 585 | description | 585 | description |
| 586 | "Administrative group/Resource class/Color."; | 586 | "Administrative group/Resource class/Color."; |
| ... | @@ -680,12 +680,18 @@ | ... | @@ -680,12 +680,18 @@ |
| 680 | "The tunnel path hop limit."; | 680 | "The tunnel path hop limit."; |
| 681 | } | 681 | } |
| 682 | leaf metric-type { | 682 | leaf metric-type { |
| 683 | - type string; | 683 | + type identityref { |
| 684 | + base path-metric-type; | ||
| 685 | + } | ||
| 686 | + default path-metric-te; | ||
| 684 | description | 687 | description |
| 685 | "The tunnel path metric type."; | 688 | "The tunnel path metric type."; |
| 686 | } | 689 | } |
| 687 | leaf tiebreaker-type { | 690 | leaf tiebreaker-type { |
| 688 | - type string; | 691 | + type identityref { |
| 692 | + base path-tiebreaker-type; | ||
| 693 | + } | ||
| 694 | + default path-tiebreaker-maxfill; | ||
| 689 | description | 695 | description |
| 690 | "The tunnel path computation tie breakers."; | 696 | "The tunnel path computation tie breakers."; |
| 691 | } | 697 | } |
| ... | @@ -729,7 +735,9 @@ | ... | @@ -729,7 +735,9 @@ |
| 729 | list constraints { | 735 | list constraints { |
| 730 | key "usage"; | 736 | key "usage"; |
| 731 | leaf usage { | 737 | leaf usage { |
| 732 | - type string; | 738 | + type identityref { |
| 739 | + base resource-affinities-type; | ||
| 740 | + } | ||
| 733 | description "Affinities usage"; | 741 | description "Affinities usage"; |
| 734 | } | 742 | } |
| 735 | container constraint { | 743 | container constraint { |
| ... | @@ -765,7 +773,9 @@ | ... | @@ -765,7 +773,9 @@ |
| 765 | "Type of SRLG representation"; | 773 | "Type of SRLG representation"; |
| 766 | case values { | 774 | case values { |
| 767 | leaf usage { | 775 | leaf usage { |
| 768 | - type string; | 776 | + type identityref { |
| 777 | + base route-exclude-srlg; | ||
| 778 | + } | ||
| 769 | description "SRLG usage"; | 779 | description "SRLG usage"; |
| 770 | } | 780 | } |
| 771 | leaf-list values { | 781 | leaf-list values { |
| ... | @@ -777,7 +787,9 @@ | ... | @@ -777,7 +787,9 @@ |
| 777 | list constraints { | 787 | list constraints { |
| 778 | key "usage"; | 788 | key "usage"; |
| 779 | leaf usage { | 789 | leaf usage { |
| 780 | - type string; | 790 | + type identityref { |
| 791 | + base route-exclude-srlg; | ||
| 792 | + } | ||
| 781 | description "SRLG usage"; | 793 | description "SRLG usage"; |
| 782 | } | 794 | } |
| 783 | container constraint { | 795 | container constraint { |
| ... | @@ -829,12 +841,17 @@ | ... | @@ -829,12 +841,17 @@ |
| 829 | source."; | 841 | source."; |
| 830 | } | 842 | } |
| 831 | leaf type { | 843 | leaf type { |
| 832 | - type string; | 844 | + type identityref { |
| 845 | + base bidir-association-type; | ||
| 846 | + } | ||
| 847 | + default bidir-assoc-non-corouted; | ||
| 833 | description | 848 | description |
| 834 | "The TE tunnel association type."; | 849 | "The TE tunnel association type."; |
| 835 | } | 850 | } |
| 836 | leaf provisioing { | 851 | leaf provisioing { |
| 837 | - type string; | 852 | + type identityref { |
| 853 | + base bidir-provisioning-mode; | ||
| 854 | + } | ||
| 838 | description | 855 | description |
| 839 | "Describes the provisioning model of the | 856 | "Describes the provisioning model of the |
| 840 | associated bidirectional LSP"; | 857 | associated bidirectional LSP"; | ... | ... |
| 1 | -module ietf-network { | ||
| 2 | - yang-version 1; | ||
| 3 | - namespace "urn:ietf:params:xml:ns:yang:ietf-network"; | ||
| 4 | - prefix nd; | ||
| 5 | - container networks { | ||
| 6 | - description | ||
| 7 | - "Serves as top-level container for a list of networks."; | ||
| 8 | - leaf network-id { | ||
| 9 | - type status; | ||
| 10 | - description | ||
| 11 | - "Identifies a network."; | ||
| 12 | - } | ||
| 13 | - } | ||
| 14 | - typedef status { | ||
| 15 | - type uint8; | ||
| 16 | - } | ||
| 17 | - leaf network-ref { | ||
| 18 | - type leafref { | ||
| 19 | - path "/networks"; | ||
| 20 | - } | ||
| 21 | - } | ||
| 22 | -} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| ... | @@ -5,7 +5,7 @@ module module1 { | ... | @@ -5,7 +5,7 @@ module module1 { |
| 5 | import module2 { | 5 | import module2 { |
| 6 | prefix "nt"; | 6 | prefix "nt"; |
| 7 | } | 7 | } |
| 8 | - grouping te-node-tunnel-termination-capability { | 8 | + container te-node-tunnel-termination-capability { |
| 9 | description | 9 | description |
| 10 | "Termination capability of a tunnel termination point on a | 10 | "Termination capability of a tunnel termination point on a |
| 11 | TE node."; | 11 | TE node."; |
| ... | @@ -25,4 +25,4 @@ module module1 { | ... | @@ -25,4 +25,4 @@ module module1 { |
| 25 | } | 25 | } |
| 26 | } // termination-capability | 26 | } // termination-capability |
| 27 | } // te-node-tunnel-termination-capability | 27 | } // te-node-tunnel-termination-capability |
| 28 | -} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 28 | +} | ... | ... |
| ... | @@ -5,7 +5,7 @@ module ietf-network-topology { | ... | @@ -5,7 +5,7 @@ module ietf-network-topology { |
| 5 | import ietf-network { | 5 | import ietf-network { |
| 6 | prefix "nt"; | 6 | prefix "nt"; |
| 7 | } | 7 | } |
| 8 | - grouping te-node-tunnel-termination-capability { | 8 | + container te-node-tunnel-termination-capability { |
| 9 | description | 9 | description |
| 10 | "Termination capability of a tunnel termination point on a | 10 | "Termination capability of a tunnel termination point on a |
| 11 | TE node."; | 11 | TE node."; |
| ... | @@ -25,4 +25,4 @@ module ietf-network-topology { | ... | @@ -25,4 +25,4 @@ module ietf-network-topology { |
| 25 | } | 25 | } |
| 26 | } // termination-capability | 26 | } // termination-capability |
| 27 | } // te-node-tunnel-termination-capability | 27 | } // te-node-tunnel-termination-capability |
| 28 | -} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 28 | +} | ... | ... |
| 1 | +module GroupingCopiedInModule2 { | ||
| 2 | + yang-version 1; | ||
| 3 | + namespace "onos-yang-19:level1:newlevel"; | ||
| 4 | + prefix test; | ||
| 5 | + import LeafrefInGroupingOfModule1 { | ||
| 6 | + prefix module1; | ||
| 7 | + } | ||
| 8 | + description "leaf scenario"; | ||
| 9 | + container value { | ||
| 10 | + uses "module1:network-ref"; | ||
| 11 | + } | ||
| 12 | +} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | -module ietf-network { | 1 | +module LeafrefInGroupingOfModule1 { |
| 2 | yang-version 1; | 2 | yang-version 1; |
| 3 | - namespace "urn:ietf:params:xml:ns:yang:ietf-network"; | 3 | + namespace "onos-yang-19:level1:newlevel"; |
| 4 | - prefix nd; | 4 | + prefix test2; |
| 5 | - rpc networks { | 5 | + description "leaf scenario"; |
| 6 | - description | 6 | + container networks { |
| 7 | - "Serves as top-level container for a list of networks."; | 7 | + list network { |
| 8 | - grouping input { | 8 | + key "network-id"; |
| 9 | - leaf network-id { | 9 | + description |
| 10 | - type string; | 10 | + "Describes a network. |
| 11 | + A network typically contains an inventory of nodes, | ||
| 12 | + topological information (augmented through | ||
| 13 | + network-topology model), as well as layering | ||
| 14 | + information."; | ||
| 15 | + container network-types { | ||
| 11 | description | 16 | description |
| 12 | - "Identifies a network."; | 17 | + "Serves as an augmentation target. |
| 18 | + The network type is indicated through corresponding | ||
| 19 | + presence containers augmented into this container."; | ||
| 13 | } | 20 | } |
| 14 | - } | ||
| 15 | - input { | ||
| 16 | leaf network-id { | 21 | leaf network-id { |
| 17 | - type uint8; | 22 | + type string; |
| 18 | description | 23 | description |
| 19 | "Identifies a network."; | 24 | "Identifies a network."; |
| 20 | } | 25 | } |
| 21 | } | 26 | } |
| 22 | - output { | 27 | + leaf network-ip { |
| 28 | + type uint8; | ||
| 29 | + description | ||
| 30 | + "Identifies a network."; | ||
| 23 | } | 31 | } |
| 24 | } | 32 | } |
| 25 | - leaf network-ref { | 33 | + grouping network-ref { |
| 26 | - type leafref { | 34 | + leaf network-ref { |
| 27 | - path "/networks/input/network-id"; | 35 | + type leafref { |
| 36 | + path "/test2:networks/test2:network/test2:network-id"; | ||
| 37 | + } | ||
| 28 | } | 38 | } |
| 29 | } | 39 | } |
| 30 | } | 40 | } |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| 1 | +module ietf-te-topology { | ||
| 2 | + yang-version 1; | ||
| 3 | + namespace "onos-yang-19:level1:newlevel"; | ||
| 4 | + prefix test; | ||
| 5 | + import ietf-network { | ||
| 6 | + prefix "nw"; | ||
| 7 | + } | ||
| 8 | + description "leaf scenario"; | ||
| 9 | + typedef te-topology-event-type { | ||
| 10 | + type enumeration { | ||
| 11 | + enum "add" { | ||
| 12 | + value 0; | ||
| 13 | + description | ||
| 14 | + "A TE node or te-link has been added."; | ||
| 15 | + } | ||
| 16 | + enum "remove" { | ||
| 17 | + value 1; | ||
| 18 | + description | ||
| 19 | + "A TE node or te-link has been removed."; | ||
| 20 | + } | ||
| 21 | + enum "update" { | ||
| 22 | + value 2; | ||
| 23 | + description | ||
| 24 | + "A TE node or te-link has been updated."; | ||
| 25 | + } | ||
| 26 | + } | ||
| 27 | + description "TE Event type for notifications"; | ||
| 28 | + } // te-topology-event-type | ||
| 29 | + container te-node-event { | ||
| 30 | + leaf event-type { | ||
| 31 | + type te-topology-event-type; | ||
| 32 | + description "Event type."; | ||
| 33 | + } | ||
| 34 | + description "Notification event for TE node."; | ||
| 35 | + uses nw:node-ref; | ||
| 36 | + } | ||
| 37 | +} |
| 1 | + module ietf-network { | ||
| 2 | + yang-version 1; | ||
| 3 | + namespace "urn:ietf:params:xml:ns:yang:ietf-network"; | ||
| 4 | + prefix nd; | ||
| 5 | + | ||
| 6 | + organization | ||
| 7 | + "IETF I2RS (Interface to the Routing System) Working Group"; | ||
| 8 | + | ||
| 9 | + contact | ||
| 10 | + "WG Web: <http://tools.ietf.org/wg/i2rs/> | ||
| 11 | + WG List: <mailto:i2rs@ietf.org> | ||
| 12 | + | ||
| 13 | + WG Chair: Susan Hares | ||
| 14 | + <mailto:shares@ndzh.com> | ||
| 15 | + | ||
| 16 | + WG Chair: Jeffrey Haas | ||
| 17 | + <mailto:jhaas@pfrc.org> | ||
| 18 | + | ||
| 19 | + Editor: Alexander Clemm | ||
| 20 | + <mailto:alex@cisco.com> | ||
| 21 | + | ||
| 22 | + Editor: Jan Medved | ||
| 23 | + <mailto:jmedved@cisco.com> | ||
| 24 | + | ||
| 25 | + Editor: Robert Varga | ||
| 26 | + <mailto:rovarga@cisco.com> | ||
| 27 | + | ||
| 28 | + Editor: Tony Tkacik | ||
| 29 | + <mailto:ttkacik@cisco.com> | ||
| 30 | + | ||
| 31 | + Editor: Nitin Bahadur | ||
| 32 | + <mailto:nitin_bahadur@yahoo.com> | ||
| 33 | + | ||
| 34 | + Editor: Hariharan Ananthakrishnan | ||
| 35 | + <mailto:hari@packetdesign.com>"; | ||
| 36 | + | ||
| 37 | + description | ||
| 38 | + "This module defines a common base model for a collection | ||
| 39 | + of nodes in a network. Node definitions are further used | ||
| 40 | + in network topologies and inventories. | ||
| 41 | + | ||
| 42 | + Copyright (c) 2015 IETF Trust and the persons identified as | ||
| 43 | + authors of the code. All rights reserved. | ||
| 44 | + | ||
| 45 | + Redistribution and use in source and binary forms, with or | ||
| 46 | + without modification, is permitted pursuant to, and subject | ||
| 47 | + to the license terms contained in, the Simplified BSD License | ||
| 48 | + set forth in Section 4.c of the IETF Trust's Legal Provisions | ||
| 49 | + Relating to IETF Documents | ||
| 50 | + (http://trustee.ietf.org/license-info). | ||
| 51 | + | ||
| 52 | + This version of this YANG module is part of | ||
| 53 | + draft-ietf-i2rs-yang-network-topo-02; | ||
| 54 | + see the RFC itself for full legal notices. | ||
| 55 | + | ||
| 56 | + NOTE TO RFC EDITOR: Please replace above reference to | ||
| 57 | + draft-ietf-i2rs-yang-network-topo-02 with RFC | ||
| 58 | + number when published (i.e. RFC xxxx)."; | ||
| 59 | + | ||
| 60 | + revision 2015-12-08 { | ||
| 61 | + description | ||
| 62 | + "Initial revision. | ||
| 63 | + NOTE TO RFC EDITOR: Please replace the following reference | ||
| 64 | + to draft-ietf-i2rs-yang-network-topo-02 with | ||
| 65 | + RFC number when published (i.e. RFC xxxx)."; | ||
| 66 | + reference | ||
| 67 | + "draft-ietf-i2rs-yang-network-topo-02"; | ||
| 68 | + } | ||
| 69 | + | ||
| 70 | + typedef node-id { | ||
| 71 | + type string; | ||
| 72 | + description | ||
| 73 | + "Identifier for a node."; | ||
| 74 | + } | ||
| 75 | + | ||
| 76 | + typedef network-id { | ||
| 77 | + type string; | ||
| 78 | + description | ||
| 79 | + "Identifier for a network."; | ||
| 80 | + } | ||
| 81 | + grouping network-ref { | ||
| 82 | + description | ||
| 83 | + "Contains the information necessary to reference a network, | ||
| 84 | + for example an underlay network."; | ||
| 85 | + leaf network-ref { | ||
| 86 | + type leafref { | ||
| 87 | + path "/nd:networks/nd:network/nd:network-id"; | ||
| 88 | + require-instance false; | ||
| 89 | + } | ||
| 90 | + description | ||
| 91 | + "Used to reference a network, for example an underlay | ||
| 92 | + network."; | ||
| 93 | + } | ||
| 94 | + } | ||
| 95 | + | ||
| 96 | + grouping node-ref { | ||
| 97 | + description | ||
| 98 | + "Contains the information necessary to reference a node."; | ||
| 99 | + leaf node-ref { | ||
| 100 | + type leafref { | ||
| 101 | + path "/nd:networks/nd:network[nd:network-id=current()/../"+ | ||
| 102 | + "network-ref]/nd:node/nd:node-id"; | ||
| 103 | + require-instance false; | ||
| 104 | + } | ||
| 105 | + description | ||
| 106 | + "Used to reference a node. | ||
| 107 | + Nodes are identified relative to the network they are | ||
| 108 | + contained in."; | ||
| 109 | + } | ||
| 110 | + uses network-ref; | ||
| 111 | + } | ||
| 112 | + | ||
| 113 | + container networks { | ||
| 114 | + description | ||
| 115 | + "Serves as top-level container for a list of networks."; | ||
| 116 | + list network { | ||
| 117 | + key "network-id"; | ||
| 118 | + description | ||
| 119 | + "Describes a network. | ||
| 120 | + A network typically contains an inventory of nodes, | ||
| 121 | + topological information (augmented through | ||
| 122 | + network-topology model), as well as layering | ||
| 123 | + information."; | ||
| 124 | + container network-types { | ||
| 125 | + description | ||
| 126 | + "Serves as an augmentation target. | ||
| 127 | + The network type is indicated through corresponding | ||
| 128 | + presence containers augmented into this container."; | ||
| 129 | + } | ||
| 130 | + leaf network-id { | ||
| 131 | + type network-id; | ||
| 132 | + description | ||
| 133 | + "Identifies a network."; | ||
| 134 | + } | ||
| 135 | + list supporting-network { | ||
| 136 | + key "network-ref"; | ||
| 137 | + description | ||
| 138 | + "An underlay network, used to represent layered network | ||
| 139 | + topologies."; | ||
| 140 | + leaf network-ref { | ||
| 141 | + type leafref { | ||
| 142 | + path "/networks/network/network-id"; | ||
| 143 | + require-instance false; | ||
| 144 | + } | ||
| 145 | + description | ||
| 146 | + "References the underlay network."; | ||
| 147 | + } | ||
| 148 | + } | ||
| 149 | + list node { | ||
| 150 | + key "node-id"; | ||
| 151 | + description | ||
| 152 | + "The inventory of nodes of this network."; | ||
| 153 | + leaf node-id { | ||
| 154 | + type node-id; | ||
| 155 | + description | ||
| 156 | + "Identifies a node uniquely within the containing | ||
| 157 | + network."; | ||
| 158 | + } | ||
| 159 | + list supporting-node { | ||
| 160 | + key "network-ref node-ref"; | ||
| 161 | + description | ||
| 162 | + "Represents another node, in an underlay network, that | ||
| 163 | + this node is supported by. Used to represent layering | ||
| 164 | + structure."; | ||
| 165 | + leaf network-ref { | ||
| 166 | + type leafref { | ||
| 167 | + path "../../../supporting-network/network-ref"; | ||
| 168 | + require-instance false; | ||
| 169 | + } | ||
| 170 | + description | ||
| 171 | + "References the underlay network that the | ||
| 172 | + underlay node is part of."; | ||
| 173 | + } | ||
| 174 | + leaf node-ref { | ||
| 175 | + type leafref { | ||
| 176 | + path "/networks/network/node/node-id"; | ||
| 177 | + require-instance false; | ||
| 178 | + } | ||
| 179 | + description | ||
| 180 | + "References the underlay node itself."; | ||
| 181 | + } | ||
| 182 | + } | ||
| 183 | + } | ||
| 184 | + } | ||
| 185 | + } | ||
| 186 | + container networks-state { | ||
| 187 | + config false; | ||
| 188 | + description | ||
| 189 | + "Serves as top-level container for a list of state information | ||
| 190 | + for networks"; | ||
| 191 | + list network { | ||
| 192 | + key "network-ref"; | ||
| 193 | + description | ||
| 194 | + "Data nodes representing operational data and state of | ||
| 195 | + networks. | ||
| 196 | + An instance is automatically created for every network | ||
| 197 | + in the corresponding list under the networks container."; | ||
| 198 | + uses network-ref; | ||
| 199 | + leaf server-provided { | ||
| 200 | + type boolean; | ||
| 201 | + description | ||
| 202 | + "Indicates whether the information concerning this | ||
| 203 | + particular network is populated by the server | ||
| 204 | + (server-provided true, the general case for network | ||
| 205 | + information discovered from the server), | ||
| 206 | + or whether it is configured by a client | ||
| 207 | + (server-provided true, possible e.g. for | ||
| 208 | + service overlays managed through a controller)."; | ||
| 209 | + } | ||
| 210 | + } | ||
| 211 | + } | ||
| 212 | + } |
| 1 | -module ietf-network { | 1 | +module SelfResolutionWhenLeafrefInModuleReferToGroupingInModule { |
| 2 | yang-version 1; | 2 | yang-version 1; |
| 3 | namespace "urn:ietf:params:xml:ns:yang:ietf-network"; | 3 | namespace "urn:ietf:params:xml:ns:yang:ietf-network"; |
| 4 | prefix nd; | 4 | prefix nd; |
| ... | @@ -16,4 +16,4 @@ module ietf-network { | ... | @@ -16,4 +16,4 @@ module ietf-network { |
| 16 | } | 16 | } |
| 17 | } | 17 | } |
| 18 | } | 18 | } |
| 19 | -} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 19 | +} | ... | ... |
| 1 | -module ietf-network { | 1 | +module SelfResolutionWhenLeafrefInModuleReferToInvalidNode { |
| 2 | yang-version 1; | 2 | yang-version 1; |
| 3 | namespace "urn:ietf:params:xml:ns:yang:ietf-network"; | 3 | namespace "urn:ietf:params:xml:ns:yang:ietf-network"; |
| 4 | prefix nd; | 4 | prefix nd; |
| ... | @@ -16,4 +16,4 @@ module ietf-network { | ... | @@ -16,4 +16,4 @@ module ietf-network { |
| 16 | path "/define/network-id"; | 16 | path "/define/network-id"; |
| 17 | } | 17 | } |
| 18 | } | 18 | } |
| 19 | -} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 19 | +} | ... | ... |
| 1 | +module topology { | ||
| 2 | + yang-version 1; | ||
| 3 | + namespace "onos-yang-19:level1:newlevel"; | ||
| 4 | + prefix test; | ||
| 5 | + organization "huawei"; | ||
| 6 | + contact "adarsh.m@huawei.com"; | ||
| 7 | + description "leaf scenario"; | ||
| 8 | + container networks { | ||
| 9 | + list network { | ||
| 10 | + key "network-id"; | ||
| 11 | + description | ||
| 12 | + "Describes a network. | ||
| 13 | + A network typically contains an inventory of nodes, | ||
| 14 | + topological information (augmented through | ||
| 15 | + network-topology model), as well as layering | ||
| 16 | + information."; | ||
| 17 | + container network-types { | ||
| 18 | + description | ||
| 19 | + "Serves as an augmentation target. | ||
| 20 | + The network type is indicated through corresponding | ||
| 21 | + presence containers augmented into this container."; | ||
| 22 | + } | ||
| 23 | + leaf network-id { | ||
| 24 | + type string; | ||
| 25 | + description | ||
| 26 | + "Identifies a network."; | ||
| 27 | + } | ||
| 28 | + } | ||
| 29 | + leaf network-ip { | ||
| 30 | + type uint8; | ||
| 31 | + description | ||
| 32 | + "Identifies a network."; | ||
| 33 | + } | ||
| 34 | + } | ||
| 35 | + augment "/networks/network" { | ||
| 36 | + container config { | ||
| 37 | + description | ||
| 38 | + "Configuration data."; | ||
| 39 | + choice bundle-stack-level { | ||
| 40 | + description | ||
| 41 | + "The TE link can be partitioned into bundled | ||
| 42 | + links, or component links."; | ||
| 43 | + case bundle { | ||
| 44 | + container bundled-links { | ||
| 45 | + description | ||
| 46 | + "A set of bundled links."; | ||
| 47 | + reference | ||
| 48 | + "RFC4201: Link Bundling in MPLS Traffic Engineering | ||
| 49 | + (TE)."; | ||
| 50 | + list bundled-link { | ||
| 51 | + key "src-tp-ref"; | ||
| 52 | + leaf src-tp-ref { | ||
| 53 | + type leafref { | ||
| 54 | + path "../../../../../network-ip"; | ||
| 55 | + require-instance true; | ||
| 56 | + } | ||
| 57 | + } | ||
| 58 | + } | ||
| 59 | + } | ||
| 60 | + } | ||
| 61 | + } | ||
| 62 | + } | ||
| 63 | + } | ||
| 64 | +} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | +module ietf-network { | ||
| 2 | + yang-version 1; | ||
| 3 | + namespace "urn:ietf:params:xml:ns:yang:ietf-network"; | ||
| 4 | + prefix nd; | ||
| 5 | + | ||
| 6 | + import ietf-inet-types { | ||
| 7 | + prefix inet; | ||
| 8 | + } | ||
| 9 | + typedef node-id { | ||
| 10 | + type inet:uri; | ||
| 11 | + description | ||
| 12 | + "Identifier for a node."; | ||
| 13 | + } | ||
| 14 | + | ||
| 15 | + leaf xyz { | ||
| 16 | + type string; | ||
| 17 | + } | ||
| 18 | + typedef network-id { | ||
| 19 | + type inet:uri; | ||
| 20 | + description | ||
| 21 | + "Identifier for a network."; | ||
| 22 | + } | ||
| 23 | + grouping network-ref { | ||
| 24 | + description | ||
| 25 | + "Contains the information necessary to reference a network, | ||
| 26 | + for example an underlay network."; | ||
| 27 | + leaf network-ref { | ||
| 28 | + type leafref { | ||
| 29 | + path "/nd:xyz"; | ||
| 30 | + require-instance false; | ||
| 31 | + } | ||
| 32 | + description | ||
| 33 | + "Used to reference a network, for example an underlay | ||
| 34 | + network."; | ||
| 35 | + } | ||
| 36 | + } | ||
| 37 | + } |
| 1 | +module ietf-network { | ||
| 2 | + yang-version 1; | ||
| 3 | + namespace "urn:ietf:params:xml:ns:yang:ietf-network"; | ||
| 4 | + prefix nd; | ||
| 5 | + import network { | ||
| 6 | + prefix "nw"; | ||
| 7 | + } | ||
| 8 | + grouping xyz { | ||
| 9 | + leaf network-id-ref { | ||
| 10 | + type leafref { | ||
| 11 | + path "/nw:networks/nw:network/nw:network-id"; | ||
| 12 | + require-instance false; | ||
| 13 | + } | ||
| 14 | + description | ||
| 15 | + "A reference to a network-id in base ietf-network module."; | ||
| 16 | + } | ||
| 17 | + } | ||
| 18 | + grouping yzx { | ||
| 19 | + container hi { | ||
| 20 | + uses xyz; | ||
| 21 | + } | ||
| 22 | + } | ||
| 23 | + container fine { | ||
| 24 | + uses yzx; | ||
| 25 | + } | ||
| 26 | + container networks { | ||
| 27 | + leaf network { | ||
| 28 | + type string; | ||
| 29 | + } | ||
| 30 | + } | ||
| 31 | +} | ||
| 32 | + | ||
| 33 | + |
| 1 | + module network { | ||
| 2 | + yang-version 1; | ||
| 3 | + namespace "urn:ietf:params:xml:ns:yang:ietf-network"; | ||
| 4 | + prefix nd; | ||
| 5 | + | ||
| 6 | + organization | ||
| 7 | + "IETF I2RS (Interface to the Routing System) Working Group"; | ||
| 8 | + | ||
| 9 | + contact | ||
| 10 | + "WG Web: <http://tools.ietf.org/wg/i2rs/> | ||
| 11 | + WG List: <mailto:i2rs@ietf.org> | ||
| 12 | + | ||
| 13 | + WG Chair: Susan Hares | ||
| 14 | + <mailto:shares@ndzh.com> | ||
| 15 | + | ||
| 16 | + WG Chair: Jeffrey Haas | ||
| 17 | + <mailto:jhaas@pfrc.org> | ||
| 18 | + | ||
| 19 | + Editor: Alexander Clemm | ||
| 20 | + <mailto:alex@cisco.com> | ||
| 21 | + | ||
| 22 | + Editor: Jan Medved | ||
| 23 | + <mailto:jmedved@cisco.com> | ||
| 24 | + | ||
| 25 | + Editor: Robert Varga | ||
| 26 | + <mailto:rovarga@cisco.com> | ||
| 27 | + | ||
| 28 | + Editor: Tony Tkacik | ||
| 29 | + <mailto:ttkacik@cisco.com> | ||
| 30 | + | ||
| 31 | + Editor: Nitin Bahadur | ||
| 32 | + <mailto:nitin_bahadur@yahoo.com> | ||
| 33 | + | ||
| 34 | + Editor: Hariharan Ananthakrishnan | ||
| 35 | + <mailto:hari@packetdesign.com>"; | ||
| 36 | + | ||
| 37 | + description | ||
| 38 | + "This module defines a common base model for a collection | ||
| 39 | + of nodes in a network. Node definitions are further used | ||
| 40 | + in network topologies and inventories. | ||
| 41 | + | ||
| 42 | + Copyright (c) 2015 IETF Trust and the persons identified as | ||
| 43 | + authors of the code. All rights reserved. | ||
| 44 | + | ||
| 45 | + Redistribution and use in source and binary forms, with or | ||
| 46 | + without modification, is permitted pursuant to, and subject | ||
| 47 | + to the license terms contained in, the Simplified BSD License | ||
| 48 | + set forth in Section 4.c of the IETF Trust's Legal Provisions | ||
| 49 | + Relating to IETF Documents | ||
| 50 | + (http://trustee.ietf.org/license-info). | ||
| 51 | + | ||
| 52 | + This version of this YANG module is part of | ||
| 53 | + draft-ietf-i2rs-yang-network-topo-02; | ||
| 54 | + see the RFC itself for full legal notices. | ||
| 55 | + | ||
| 56 | + NOTE TO RFC EDITOR: Please replace above reference to | ||
| 57 | + draft-ietf-i2rs-yang-network-topo-02 with RFC | ||
| 58 | + number when published (i.e. RFC xxxx)."; | ||
| 59 | + | ||
| 60 | + revision 2015-12-08 { | ||
| 61 | + description | ||
| 62 | + "Initial revision. | ||
| 63 | + NOTE TO RFC EDITOR: Please replace the following reference | ||
| 64 | + to draft-ietf-i2rs-yang-network-topo-02 with | ||
| 65 | + RFC number when published (i.e. RFC xxxx)."; | ||
| 66 | + reference | ||
| 67 | + "draft-ietf-i2rs-yang-network-topo-02"; | ||
| 68 | + } | ||
| 69 | + | ||
| 70 | + typedef node-id { | ||
| 71 | + type string; | ||
| 72 | + description | ||
| 73 | + "Identifier for a node."; | ||
| 74 | + } | ||
| 75 | + | ||
| 76 | + typedef network-id { | ||
| 77 | + type string; | ||
| 78 | + description | ||
| 79 | + "Identifier for a network."; | ||
| 80 | + } | ||
| 81 | + grouping network-ref { | ||
| 82 | + description | ||
| 83 | + "Contains the information necessary to reference a network, | ||
| 84 | + for example an underlay network."; | ||
| 85 | + leaf network-ref { | ||
| 86 | + type leafref { | ||
| 87 | + path "/nd:networks/nd:network/nd:network-id"; | ||
| 88 | + require-instance false; | ||
| 89 | + } | ||
| 90 | + description | ||
| 91 | + "Used to reference a network, for example an underlay | ||
| 92 | + network."; | ||
| 93 | + } | ||
| 94 | + } | ||
| 95 | + | ||
| 96 | + grouping node-ref { | ||
| 97 | + description | ||
| 98 | + "Contains the information necessary to reference a node."; | ||
| 99 | + leaf node-ref { | ||
| 100 | + type leafref { | ||
| 101 | + path "/nd:networks/nd:network[nd:network-id=current()/../"+ | ||
| 102 | + "network-ref]/nd:node/nd:node-id"; | ||
| 103 | + require-instance false; | ||
| 104 | + } | ||
| 105 | + description | ||
| 106 | + "Used to reference a node. | ||
| 107 | + Nodes are identified relative to the network they are | ||
| 108 | + contained in."; | ||
| 109 | + } | ||
| 110 | + uses network-ref; | ||
| 111 | + } | ||
| 112 | + | ||
| 113 | + container networks { | ||
| 114 | + description | ||
| 115 | + "Serves as top-level container for a list of networks."; | ||
| 116 | + list network { | ||
| 117 | + key "network-id"; | ||
| 118 | + description | ||
| 119 | + "Describes a network. | ||
| 120 | + A network typically contains an inventory of nodes, | ||
| 121 | + topological information (augmented through | ||
| 122 | + network-topology model), as well as layering | ||
| 123 | + information."; | ||
| 124 | + container network-types { | ||
| 125 | + description | ||
| 126 | + "Serves as an augmentation target. | ||
| 127 | + The network type is indicated through corresponding | ||
| 128 | + presence containers augmented into this container."; | ||
| 129 | + } | ||
| 130 | + leaf network-id { | ||
| 131 | + type network-id; | ||
| 132 | + description | ||
| 133 | + "Identifies a network."; | ||
| 134 | + } | ||
| 135 | + list supporting-network { | ||
| 136 | + key "network-ref"; | ||
| 137 | + description | ||
| 138 | + "An underlay network, used to represent layered network | ||
| 139 | + topologies."; | ||
| 140 | + leaf network-ref { | ||
| 141 | + type leafref { | ||
| 142 | + path "/networks/network/network-id"; | ||
| 143 | + require-instance false; | ||
| 144 | + } | ||
| 145 | + description | ||
| 146 | + "References the underlay network."; | ||
| 147 | + } | ||
| 148 | + } | ||
| 149 | + list node { | ||
| 150 | + key "node-id"; | ||
| 151 | + description | ||
| 152 | + "The inventory of nodes of this network."; | ||
| 153 | + leaf node-id { | ||
| 154 | + type node-id; | ||
| 155 | + description | ||
| 156 | + "Identifies a node uniquely within the containing | ||
| 157 | + network."; | ||
| 158 | + } | ||
| 159 | + list supporting-node { | ||
| 160 | + key "network-ref node-ref"; | ||
| 161 | + description | ||
| 162 | + "Represents another node, in an underlay network, that | ||
| 163 | + this node is supported by. Used to represent layering | ||
| 164 | + structure."; | ||
| 165 | + leaf network-ref { | ||
| 166 | + type leafref { | ||
| 167 | + path "../../../supporting-network/network-ref"; | ||
| 168 | + require-instance false; | ||
| 169 | + } | ||
| 170 | + description | ||
| 171 | + "References the underlay network that the | ||
| 172 | + underlay node is part of."; | ||
| 173 | + } | ||
| 174 | + leaf node-ref { | ||
| 175 | + type leafref { | ||
| 176 | + path "/networks/network/node/node-id"; | ||
| 177 | + require-instance false; | ||
| 178 | + } | ||
| 179 | + description | ||
| 180 | + "References the underlay node itself."; | ||
| 181 | + } | ||
| 182 | + } | ||
| 183 | + } | ||
| 184 | + } | ||
| 185 | + } | ||
| 186 | + container networks-state { | ||
| 187 | + config false; | ||
| 188 | + description | ||
| 189 | + "Serves as top-level container for a list of state information | ||
| 190 | + for networks"; | ||
| 191 | + list network { | ||
| 192 | + key "network-ref"; | ||
| 193 | + description | ||
| 194 | + "Data nodes representing operational data and state of | ||
| 195 | + networks. | ||
| 196 | + An instance is automatically created for every network | ||
| 197 | + in the corresponding list under the networks container."; | ||
| 198 | + uses network-ref; | ||
| 199 | + leaf server-provided { | ||
| 200 | + type boolean; | ||
| 201 | + description | ||
| 202 | + "Indicates whether the information concerning this | ||
| 203 | + particular network is populated by the server | ||
| 204 | + (server-provided true, the general case for network | ||
| 205 | + information discovered from the server), | ||
| 206 | + or whether it is configured by a client | ||
| 207 | + (server-provided true, possible e.g. for | ||
| 208 | + service overlays managed through a controller)."; | ||
| 209 | + } | ||
| 210 | + } | ||
| 211 | + } | ||
| 212 | + } | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | +module ietf-network { | ||
| 2 | + yang-version 1; | ||
| 3 | + namespace "urn:ietf:params:xml:ns:yang:ietf-network"; | ||
| 4 | + prefix nd; | ||
| 5 | + | ||
| 6 | + organization | ||
| 7 | + "IETF I2RS (Interface to the Routing System) Working Group"; | ||
| 8 | + grouping node-ref { | ||
| 9 | + description | ||
| 10 | + "Contains the information necessary to reference a node."; | ||
| 11 | + container node-from-grouping { | ||
| 12 | + leaf node-ref { | ||
| 13 | + type leafref { | ||
| 14 | + path "/networks/network/node/node-id"; | ||
| 15 | + require-instance false; | ||
| 16 | + } | ||
| 17 | + } | ||
| 18 | + } | ||
| 19 | + } | ||
| 20 | + container networks { | ||
| 21 | + description | ||
| 22 | + "Serves as top-level container for a list of networks."; | ||
| 23 | + list network { | ||
| 24 | + key "network-id"; | ||
| 25 | + description | ||
| 26 | + "Describes a network. | ||
| 27 | + A network typically contains an inventory of nodes, | ||
| 28 | + topological information (augmented through | ||
| 29 | + network-topology model), as well as layering | ||
| 30 | + information."; | ||
| 31 | + container network-types { | ||
| 32 | + description | ||
| 33 | + "Serves as an augmentation target. | ||
| 34 | + The network type is indicated through corresponding | ||
| 35 | + presence containers augmented into this container."; | ||
| 36 | + } | ||
| 37 | + leaf network-id { | ||
| 38 | + type string; | ||
| 39 | + description | ||
| 40 | + "Identifies a network."; | ||
| 41 | + } | ||
| 42 | + list supporting-network { | ||
| 43 | + key "network-ref"; | ||
| 44 | + description | ||
| 45 | + "An underlay network, used to represent layered network | ||
| 46 | + topologies."; | ||
| 47 | + leaf network-ref { | ||
| 48 | + type leafref { | ||
| 49 | + path "/networks/network/network-id"; | ||
| 50 | + require-instance false; | ||
| 51 | + } | ||
| 52 | + description | ||
| 53 | + "References the underlay network."; | ||
| 54 | + } | ||
| 55 | + } | ||
| 56 | + list node { | ||
| 57 | + key "node-id"; | ||
| 58 | + description | ||
| 59 | + "The inventory of nodes of this network."; | ||
| 60 | + leaf node-id { | ||
| 61 | + type uint8; | ||
| 62 | + description | ||
| 63 | + "Identifies a node uniquely within the containing | ||
| 64 | + network."; | ||
| 65 | + } | ||
| 66 | + list supporting-node { | ||
| 67 | + key "network-ref node-ref"; | ||
| 68 | + description | ||
| 69 | + "Represents another node, in an underlay network, that | ||
| 70 | + this node is supported by. Used to represent layering | ||
| 71 | + structure."; | ||
| 72 | + leaf network-ref { | ||
| 73 | + type leafref { | ||
| 74 | + path "../../../supporting-network/network-ref"; | ||
| 75 | + require-instance false; | ||
| 76 | + } | ||
| 77 | + description | ||
| 78 | + "References the underlay network that the | ||
| 79 | + underlay node is part of."; | ||
| 80 | + } | ||
| 81 | + leaf node-ref { | ||
| 82 | + type leafref { | ||
| 83 | + path "/networks/network/node/node-id"; | ||
| 84 | + require-instance false; | ||
| 85 | + } | ||
| 86 | + description | ||
| 87 | + "References the underlay node itself."; | ||
| 88 | + } | ||
| 89 | + } | ||
| 90 | + } | ||
| 91 | + } | ||
| 92 | + uses node-ref; | ||
| 93 | + } | ||
| 94 | + | ||
| 95 | +} |
| 1 | -module ietf-network { | 1 | +module SelfResolutionWhenLeafrefInModuleReferToLeafInInputOfRpc { |
| 2 | yang-version 1; | 2 | yang-version 1; |
| 3 | namespace "urn:ietf:params:xml:ns:yang:ietf-network"; | 3 | namespace "urn:ietf:params:xml:ns:yang:ietf-network"; |
| 4 | prefix nd; | 4 | prefix nd; |
| ... | @@ -20,4 +20,4 @@ module ietf-network { | ... | @@ -20,4 +20,4 @@ module ietf-network { |
| 20 | path "/networks/input/network-id"; | 20 | path "/networks/input/network-id"; |
| 21 | } | 21 | } |
| 22 | } | 22 | } |
| 23 | -} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 23 | +} | ... | ... |
| 1 | -module ietf-network { | 1 | +module SelfResolutionWhenLeafrefInModuleReferToGroupingWithInputInRpc { |
| 2 | yang-version 1; | 2 | yang-version 1; |
| 3 | namespace "urn:ietf:params:xml:ns:yang:ietf-network"; | 3 | namespace "urn:ietf:params:xml:ns:yang:ietf-network"; |
| 4 | prefix nd; | 4 | prefix nd; |
| ... | @@ -25,4 +25,4 @@ module ietf-network { | ... | @@ -25,4 +25,4 @@ module ietf-network { |
| 25 | path "/networks/input/network-id"; | 25 | path "/networks/input/network-id"; |
| 26 | } | 26 | } |
| 27 | } | 27 | } |
| 28 | -} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 28 | +} | ... | ... |
| 1 | -module ietf-network { | 1 | +module SelfResolutionWhenLeafrefReferToContainerLeaf { |
| 2 | yang-version 1; | 2 | yang-version 1; |
| 3 | namespace "urn:ietf:params:xml:ns:yang:ietf-network"; | 3 | namespace "urn:ietf:params:xml:ns:yang:ietf-network"; |
| 4 | prefix nd; | 4 | prefix nd; |
| ... | @@ -16,4 +16,4 @@ module ietf-network { | ... | @@ -16,4 +16,4 @@ module ietf-network { |
| 16 | path "/networks/network-id"; | 16 | path "/networks/network-id"; |
| 17 | } | 17 | } |
| 18 | } | 18 | } |
| 19 | -} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 19 | +} | ... | ... |
-
Please register or login to post a comment