import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
+import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree;
import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
import org.opendaylight.yangtools.yang.model.api.ActionNodeContainer;
import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
if (actionDefinition.getInput().getChildNodes().isEmpty()) {
return new NetconfMessage(NetconfMessageTransformUtil.prepareDomResultForActionRequest(
- domDataTreeIdentifier, action, counter, actionDefinition.getQName().getLocalName())
+ DataSchemaContextTree.from(schemaContext), domDataTreeIdentifier, action, counter,
+ actionDefinition.getQName().getLocalName())
.getNode().getOwnerDocument());
}
// Set the path to the input of rpc for the node stream writer
action = action.createChild(QName.create(action.getLastComponent(), "input").intern());
final DOMResult result = NetconfMessageTransformUtil.prepareDomResultForActionRequest(
- domDataTreeIdentifier, action, counter, actionDefinition.getQName().getLocalName());
+ DataSchemaContextTree.from(schemaContext), domDataTreeIdentifier, action, counter,
+ actionDefinition.getQName().getLocalName());
try {
NetconfMessageTransformUtil.writeNormalizedRpc((ContainerNode) payload, result,
import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
import org.opendaylight.yangtools.yang.data.impl.schema.SchemaOrderedNormalizedNodeWriter;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeAttrBuilder;
+import org.opendaylight.yangtools.yang.data.util.DataSchemaContextNode;
+import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree;
import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
return new DOMResult(elementNS);
}
- public static DOMResult prepareDomResultForActionRequest(final DOMDataTreeIdentifier domDataTreeIdentifier,
- final SchemaPath actionSchemaPath, final MessageCounter counter, final String action) {
+ public static DOMResult prepareDomResultForActionRequest(final DataSchemaContextTree dataSchemaContextTree,
+ final DOMDataTreeIdentifier domDataTreeIdentifier, final SchemaPath actionSchemaPath,
+ final MessageCounter counter, final String action) {
final Document document = XmlUtil.newDocument();
final Element rpcNS =
document.createElementNS(NETCONF_RPC_QNAME.getNamespace().toString(), NETCONF_RPC_QNAME.getLocalName());
rpcNS.setAttribute(MESSAGE_ID_ATTR, counter.getNewMessageId(MESSAGE_ID_PREFIX));
final Element actionNS = document.createElementNS(NETCONF_ACTION_NAMESPACE.toString(), NETCONF_ACTION);
-
- final Element actionData = prepareActionData(actionNS,
+ final DataSchemaContextNode<?> rootSchemaContextNode = dataSchemaContextTree.getRoot();
+ final Element actionData = prepareActionData(rootSchemaContextNode, actionNS,
domDataTreeIdentifier.getRootIdentifier().getPathArguments().iterator(), document);
Element specificActionElement = document.createElement(action);
return new DOMResult(specificActionElement);
}
- private static Element prepareActionData(final Element actionNS, final Iterator<PathArgument> iterator,
- final Document document) {
+ private static Element prepareActionData(final DataSchemaContextNode<?> currentParentSchemaNode,
+ final Element actionNS, final Iterator<PathArgument> iterator, final Document document) {
if (iterator.hasNext()) {
- PathArgument next = iterator.next();
+ final PathArgument next = iterator.next();
final QName actualNS = next.getNodeType();
+ DataSchemaContextNode<?> current = currentParentSchemaNode.getChild(next);
+ Preconditions.checkArgument(current != null, "Invalid input: schema for argument %s not found", next);
+
+ if (current.isMixin()) {
+ return prepareActionData(current, actionNS, iterator, document);
+ }
+
final Element actualElement = document.createElementNS(actualNS.getNamespace().toString(),
actualNS.getLocalName());
if (next instanceof NodeWithValue) {
}
}
actionNS.appendChild(actualElement);
- return prepareActionData(actualElement, iterator, document);
+ return prepareActionData(current, actualElement, iterator, document);
} else {
return actionNS;
}
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
QName reset = QName.create(URN_EXAMPLE_SERVER_FARM, REVISION_EXAMPLE_SERVER_FARM, "reset");
QName start = QName.create(reset, "start");
QName open = QName.create(start, "open");
- Set<QName> qnames = new HashSet<>(Arrays.asList(reset, start, open));
+ QName enable = QName.create(open, "enable");
+ Set<QName> qnames = new HashSet<>(Arrays.asList(reset, start, open, enable));
Set<ActionDefinition> actions = actionNetconfMessageTransformer.getActions();
assertTrue(!actions.isEmpty());
for (ActionDefinition actionDefinition : actions) {
QName qname = QName.create(URN_EXAMPLE_SERVER_FARM, REVISION_EXAMPLE_SERVER_FARM, "server");
QName nameQname = QName.create(qname, "name");
QName actionResetQName = QName.create(qname, "reset");
-
- Set<PathArgument> nodeIdentifiers =
- Collections.singleton(new NodeIdentifierWithPredicates(qname, nameQname, "test"));
+ List<PathArgument> nodeIdentifiers = new ArrayList<>();
+ nodeIdentifiers.add(new NodeIdentifier(qname));
+ nodeIdentifiers.add(new NodeIdentifierWithPredicates(qname, nameQname, "test"));
DOMDataTreeIdentifier domDataTreeIdentifier = prepareDataTreeId(nodeIdentifiers);
ContainerNode data = initInputAction(QName.create(qname, "reset-at"), "now");
QName qname = QName.create(URN_EXAMPLE_SERVER_FARM, REVISION_EXAMPLE_SERVER_FARM, "device");
QName actionStartQName = QName.create(qname, "start");
- Set<PathArgument> nodeIdentifiers = Collections.singleton(NodeIdentifier.create(qname));
+ List<PathArgument> nodeIdentifiers = Collections.singletonList(NodeIdentifier.create(qname));
DOMDataTreeIdentifier domDataTreeIdentifier = prepareDataTreeId(nodeIdentifiers);
NormalizedNode<?, ?> payload = initInputAction(QName.create(qname, "start-at"), "now");
QName boxInQName = QName.create(URN_EXAMPLE_SERVER_FARM, REVISION_EXAMPLE_SERVER_FARM, "box-in");
QName actionOpenQName = QName.create(boxOutQName, "open");
- Set<PathArgument> nodeIdentifiers = new HashSet<>();
+ List<PathArgument> nodeIdentifiers = new ArrayList<>();
nodeIdentifiers.add(NodeIdentifier.create(boxOutQName));
nodeIdentifiers.add(NodeIdentifier.create(boxInQName));
checkNode(action, null, actionOpenQName.getLocalName(), null);
}
+ @Test
+ public void toActionRequestListInContainerTest() {
+ QName qnameDevice = QName.create(URN_EXAMPLE_SERVER_FARM, REVISION_EXAMPLE_SERVER_FARM, "device");
+ QName qnameInterface = QName.create(URN_EXAMPLE_SERVER_FARM, REVISION_EXAMPLE_SERVER_FARM, "interface");
+ QName nameQname = QName.create(qnameInterface, "name");
+ QName actionEnableQName = QName.create(qnameInterface, "enable");
+
+ List<PathArgument> nodeIdentifiers = new ArrayList<>();
+ nodeIdentifiers.add(NodeIdentifier.create(qnameDevice));
+ nodeIdentifiers.add(NodeIdentifier.create(qnameInterface));
+ nodeIdentifiers.add(new NodeIdentifierWithPredicates(qnameInterface, nameQname, "test"));
+
+ DOMDataTreeIdentifier domDataTreeIdentifier = prepareDataTreeId(nodeIdentifiers);
+
+ NormalizedNode<?, ?> payload = initEmptyInputAction(qnameInterface);
+ NetconfMessage actionRequest = actionNetconfMessageTransformer.toActionRequest(
+ SchemaPath.create(true, actionEnableQName), domDataTreeIdentifier, payload);
+
+ Node childAction = checkBasePartOfActionRequest(actionRequest);
+
+ Node childDevice = childAction.getFirstChild();
+ checkNode(childDevice, "device", "device", qnameDevice.getNamespace().toString());
+
+ Node childInterface = childDevice.getFirstChild();
+ checkNode(childInterface, "interface", "interface", qnameInterface.getNamespace().toString());
+
+ Node childName = childInterface.getFirstChild();
+ checkNode(childName, "name", "name", nameQname.getNamespace().toString());
+
+ Node childTest = childName.getFirstChild();
+ assertEquals(childTest.getNodeValue(), "test");
+
+ Node action = childInterface.getLastChild();
+ checkNode(action, null, actionEnableQName.getLocalName(), null);
+ }
+
@SuppressWarnings({ "rawtypes", "unchecked" })
@Test
public void toActionResultTest() throws Exception {
return childAction;
}
- private static DOMDataTreeIdentifier prepareDataTreeId(final Set<PathArgument> nodeIdentifiers) {
+ private static DOMDataTreeIdentifier prepareDataTreeId(final List<PathArgument> nodeIdentifiers) {
YangInstanceIdentifier yangInstanceIdentifier =
YangInstanceIdentifier.builder().append(nodeIdentifiers).build();
DOMDataTreeIdentifier domDataTreeIdentifier =
return data;
}
+ private static ContainerNode initEmptyInputAction(final QName qname) {
+ return ImmutableContainerNodeBuilder.create().withNodeIdentifier(NodeIdentifier.create(
+ QName.create(qname, "input"))).build();
+ }
+
private static void checkNode(final Node childServer, final String expectedLocalName, final String expectedNodeName,
final String expectedNamespace) {
assertNotNull(childServer);