X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-rest-connector%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Frestconf%2Fimpl%2FBrokerFacade.java;h=b8d9561a26069aab4fbfc94bd134f729b4dd4a23;hb=9ba2b4eca79bcc0e78099b133296801c8d45a6c4;hp=0378ae40ee39aa09a2c2a40199b4a5161964bd50;hpb=17cc9d5b4c8258515573512fecb1a307b39aabc2;p=controller.git diff --git a/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/BrokerFacade.java b/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/BrokerFacade.java index 0378ae40ee..b8d9561a26 100644 --- a/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/BrokerFacade.java +++ b/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/BrokerFacade.java @@ -9,7 +9,6 @@ package org.opendaylight.controller.sal.restconf.impl; import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.CONFIGURATION; import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.OPERATIONAL; - import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.util.concurrent.CheckedFuture; @@ -39,6 +38,7 @@ import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; +import org.opendaylight.yangtools.yang.data.api.schema.MapNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; import org.opendaylight.yangtools.yang.model.api.SchemaContext; @@ -86,7 +86,9 @@ public class BrokerFacade { if (domDataBrokerService.isPresent()) { return readDataViaTransaction(domDataBrokerService.get().newReadOnlyTransaction(), CONFIGURATION, path); } - throw new RestconfDocumentedException("DOM data broker service isn't available for mount point."); + final String errMsg = "DOM data broker service isn't available for mount point " + path; + LOG.warn(errMsg); + throw new RestconfDocumentedException(errMsg); } // READ operational @@ -100,7 +102,9 @@ public class BrokerFacade { if (domDataBrokerService.isPresent()) { return readDataViaTransaction(domDataBrokerService.get().newReadOnlyTransaction(), OPERATIONAL, path); } - throw new RestconfDocumentedException("DOM data broker service isn't available for mount point."); + final String errMsg = "DOM data broker service isn't available for mount point " + path; + LOG.warn(errMsg); + throw new RestconfDocumentedException(errMsg); } // PUT configuration @@ -117,7 +121,9 @@ public class BrokerFacade { return putDataViaTransaction(domDataBrokerService.get().newReadWriteTransaction(), CONFIGURATION, path, payload, mountPoint.getSchemaContext()); } - throw new RestconfDocumentedException("DOM data broker service isn't available for mount point."); + final String errMsg = "DOM data broker service isn't available for mount point " + path; + LOG.warn(errMsg); + throw new RestconfDocumentedException(errMsg); } // POST configuration @@ -134,7 +140,9 @@ public class BrokerFacade { return postDataViaTransaction(domDataBrokerService.get().newReadWriteTransaction(), CONFIGURATION, path, payload, mountPoint.getSchemaContext()); } - throw new RestconfDocumentedException("DOM data broker service isn't available for mount point."); + final String errMsg = "DOM data broker service isn't available for mount point " + path; + LOG.warn(errMsg); + throw new RestconfDocumentedException(errMsg); } // DELETE configuration @@ -150,7 +158,9 @@ public class BrokerFacade { if (domDataBrokerService.isPresent()) { return deleteDataViaTransaction(domDataBrokerService.get().newWriteOnlyTransaction(), CONFIGURATION, path); } - throw new RestconfDocumentedException("DOM data broker service isn't available for mount point."); + final String errMsg = "DOM data broker service isn't available for mount point " + path; + LOG.warn(errMsg); + throw new RestconfDocumentedException(errMsg); } // RPC @@ -187,6 +197,7 @@ public class BrokerFacade { LOG.debug("Reading result data from transaction."); optional = listenableFuture.get(); } catch (InterruptedException | ExecutionException e) { + LOG.warn("Exception by reading " + datastore.name() + " via Restconf: {}", path, e); throw new RestconfDocumentedException("Problem to get data from transaction.", e.getCause()); } @@ -201,20 +212,30 @@ public class BrokerFacade { private CheckedFuture postDataViaTransaction( final DOMDataReadWriteTransaction rWTransaction, final LogicalDatastoreType datastore, - final YangInstanceIdentifier parentPath, final NormalizedNode payload, final SchemaContext schemaContext) { + final YangInstanceIdentifier path, final NormalizedNode payload, final SchemaContext schemaContext) { // FIXME: This is doing correct post for container and list children // not sure if this will work for choice case - final YangInstanceIdentifier path; - if(payload instanceof MapEntryNode) { - path = parentPath.node(payload.getNodeType()).node(payload.getIdentifier()); + if(payload instanceof MapNode) { + final NormalizedNode emptySubtree = ImmutableNodes.fromInstanceId(schemaContext, path); + rWTransaction.merge(datastore, YangInstanceIdentifier.create(emptySubtree.getIdentifier()), emptySubtree); + ensureParentsByMerge(datastore, path, rWTransaction, schemaContext); + for(final MapEntryNode child : ((MapNode) payload).getValue()) { + final YangInstanceIdentifier childPath = path.node(child.getIdentifier()); + checkItemDoesNotExists(rWTransaction, datastore, childPath); + rWTransaction.put(datastore, childPath, child); + } } else { - path = parentPath.node(payload.getIdentifier()); + checkItemDoesNotExists(rWTransaction,datastore, path); + ensureParentsByMerge(datastore, path, rWTransaction, schemaContext); + rWTransaction.put(datastore, path, payload); } + return rWTransaction.submit(); + } - final ListenableFuture>> futureDatastoreData = rWTransaction.read(datastore, path); + private void checkItemDoesNotExists(final DOMDataReadWriteTransaction rWTransaction,final LogicalDatastoreType store, final YangInstanceIdentifier path) { + final ListenableFuture futureDatastoreData = rWTransaction.exists(store, path); try { - final Optional> optionalDatastoreData = futureDatastoreData.get(); - if (optionalDatastoreData.isPresent() && payload.equals(optionalDatastoreData.get())) { + if (futureDatastoreData.get()) { final String errMsg = "Post Configuration via Restconf was not executed because data already exists"; LOG.trace(errMsg + ":{}", path); rWTransaction.cancel(); @@ -222,13 +243,9 @@ public class BrokerFacade { ErrorTag.DATA_EXISTS); } } catch (InterruptedException | ExecutionException e) { - LOG.trace("It wasn't possible to get data loaded from datastore at path " + path); + LOG.warn("It wasn't possible to get data loaded from datastore at path " + path, e); } - ensureParentsByMerge(datastore, path, rWTransaction, schemaContext); - rWTransaction.merge(datastore, path, payload); - LOG.trace("Post " + datastore.name() + " via Restconf: {}", path); - return rWTransaction.submit(); } private CheckedFuture putDataViaTransaction(