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;
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;
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
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
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
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
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
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());
}
private CheckedFuture<Void, TransactionCommitFailedException> 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<Optional<NormalizedNode<?, ?>>> futureDatastoreData = rWTransaction.read(datastore, path);
+ private void checkItemDoesNotExists(final DOMDataReadWriteTransaction rWTransaction,final LogicalDatastoreType store, final YangInstanceIdentifier path) {
+ final ListenableFuture<Boolean> futureDatastoreData = rWTransaction.exists(store, path);
try {
- final Optional<NormalizedNode<?, ?>> 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();
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<Void, TransactionCommitFailedException> putDataViaTransaction(