X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-netconf-connector%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Fconnect%2Fnetconf%2Fsal%2Ftx%2FAbstractWriteTx.java;h=93efc18b21e077e81312017502396d9725477e96;hb=refs%2Fchanges%2F23%2F22223%2F2;hp=f896559c1c8bc33ef46158c84c4ed8512bedb783;hpb=5b3c73132a0745f93be4d2f798a2802e62f7bd52;p=controller.git diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/AbstractWriteTx.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/AbstractWriteTx.java index f896559c1c..93efc18b21 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/AbstractWriteTx.java +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/tx/AbstractWriteTx.java @@ -18,10 +18,15 @@ import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.data.api.ModifyAction; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; +import org.opendaylight.yangtools.yang.data.api.schema.MixinNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public abstract class AbstractWriteTx implements DOMDataWriteTransaction { + private static final Logger LOG = LoggerFactory.getLogger(AbstractWriteTx.class); + private final long defaultRequestTimeoutMillis; protected final RemoteDeviceId id; protected final NetconfBaseOps netOps; @@ -89,6 +94,12 @@ public abstract class AbstractWriteTx implements DOMDataWriteTransaction { public synchronized void put(final LogicalDatastoreType store, final YangInstanceIdentifier path, final NormalizedNode data) { checkEditable(store); + // trying to write only mixin nodes (not visible when serialized). Ignoring. Some devices cannot handle empty edit-config rpc + if(containsOnlyNonVisibleData(path, data)) { + LOG.debug("Ignoring put for {} and data {}. Resulting data structure is empty.", path, data); + return; + } + try { editConfig( netOps.createEditConfigStrcture(Optional.>fromNullable(data), Optional.of(ModifyAction.REPLACE), path), Optional.of(ModifyAction.NONE)); @@ -104,6 +115,12 @@ public abstract class AbstractWriteTx implements DOMDataWriteTransaction { public synchronized void merge(final LogicalDatastoreType store, final YangInstanceIdentifier path, final NormalizedNode data) { checkEditable(store); + // trying to write only mixin nodes (not visible when serialized). Ignoring. Some devices cannot handle empty edit-config rpc + if (containsOnlyNonVisibleData(path, data)) { + LOG.debug("Ignoring merge for {} and data {}. Resulting data structure is empty.", path, data); + return; + } + try { editConfig( netOps.createEditConfigStrcture(Optional.>fromNullable(data), Optional.absent(), path), Optional.absent()); @@ -112,6 +129,15 @@ public abstract class AbstractWriteTx implements DOMDataWriteTransaction { } } + /** + * Check whether the data to be written consists only from mixins + */ + private static boolean containsOnlyNonVisibleData(final YangInstanceIdentifier path, final NormalizedNode data) { + // There's only one such case:top level list (pathArguments == 1 && data is Mixin) + // any other mixin nodes are contained by a "regular" node thus visible when serialized + return path.getPathArguments().size() == 1 && data instanceof MixinNode; + } + @Override public synchronized void delete(final LogicalDatastoreType store, final YangInstanceIdentifier path) { checkEditable(store);