import org.opendaylight.netconf.notifications.NetconfNotification;
import org.opendaylight.netconf.sal.connect.util.MessageCounter;
import org.opendaylight.netconf.util.NetconfUtil;
-import org.opendaylight.netconf.util.NodeContainerProxy;
import org.opendaylight.netconf.util.messages.NetconfMessageUtil;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.edit.config.input.EditContent;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.CreateSubscriptionInput;
import org.opendaylight.yangtools.rfc7952.data.api.NormalizedMetadata;
import org.opendaylight.yangtools.rfc7952.data.util.ImmutableNormalizedMetadata;
import org.opendaylight.yangtools.rfc7952.data.util.ImmutableNormalizedMetadata.Builder;
+import org.opendaylight.yangtools.yang.common.ErrorSeverity;
+import org.opendaylight.yangtools.yang.common.ErrorTag;
+import org.opendaylight.yangtools.yang.common.ErrorType;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.common.RpcError;
-import org.opendaylight.yangtools.yang.common.RpcError.ErrorSeverity;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.opendaylight.yangtools.yang.common.XMLNamespace;
import org.opendaylight.yangtools.yang.common.YangConstants;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
+import org.opendaylight.yangtools.yang.data.api.schema.AnyxmlNode;
import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
import org.opendaylight.yangtools.yang.data.api.schema.DOMSourceAnyxmlNode;
import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
import org.opendaylight.yangtools.yang.data.impl.schema.SchemaOrderedNormalizedNodeWriter;
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.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.model.api.SchemaPath;
import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
import org.slf4j.Logger;
public static final @NonNull QName IETF_NETCONF_NOTIFICATIONS =
QName.create(NetconfCapabilityChange.QNAME, "ietf-netconf-notifications").intern();
- public static final URI NETCONF_URI = NETCONF_QNAME.getNamespace();
+ public static final XMLNamespace NETCONF_URI = NETCONF_QNAME.getNamespace();
public static final @NonNull NodeIdentifier NETCONF_DATA_NODEID = NodeIdentifier.create(NETCONF_DATA_QNAME);
public static final @NonNull NodeIdentifier NETCONF_FILTER_NODEID = NodeIdentifier.create(NETCONF_FILTER_QNAME);
- public static final @NonNull DataContainerChild<?, ?> EMPTY_FILTER;
-
- static {
- final Element element = getNetconfFilterElement();
- EMPTY_FILTER = buildFilterStructure(element);
- }
+ public static final @NonNull AnyxmlNode<?> EMPTY_FILTER = buildFilterStructure(getNetconfFilterElement());
/**
* Creation of the subtree filter structure using {@link YangInstanceIdentifier} path.
* @param ctx mountpoint schema context
* @return created DOM structure with subtree filter
*/
- public static DataContainerChild<?, ?> toFilterStructure(final YangInstanceIdentifier identifier,
- final EffectiveModelContext ctx) {
+ public static AnyxmlNode<?> toFilterStructure(final YangInstanceIdentifier identifier,
+ final EffectiveModelContext ctx) {
final Element element = getNetconfFilterElement();
try {
NetconfUtil.writeFilter(identifier, new DOMResult(element), SchemaPath.ROOT, ctx);
* @param ctx mountpoint schema context
* @return created DOM structure with subtree filter
*/
- public static DataContainerChild<?, ?> toFilterStructure(final List<FieldsFilter> fieldsFilters,
- final EffectiveModelContext ctx) {
+ public static AnyxmlNode<?> toFilterStructure(final List<FieldsFilter> fieldsFilters,
+ final EffectiveModelContext ctx) {
Preconditions.checkState(!fieldsFilters.isEmpty(), "An empty list of subtree filters is not allowed");
final Element element = getNetconfFilterElement();
return element;
}
- private static DataContainerChild<?, ?> buildFilterStructure(final Element element) {
+ private static AnyxmlNode<?> buildFilterStructure(final Element element) {
return Builders.anyXmlBuilder()
.withNodeIdentifier(NETCONF_FILTER_NODEID)
.withValue(new DOMSource(element))
final String outputMsgId = output.getDocument().getDocumentElement().getAttribute(MESSAGE_ID_ATTR);
if (!inputMsgId.equals(outputMsgId)) {
- final Map<String, String> errorInfo = ImmutableMap.<String, String>builder()
- .put("actual-message-id", outputMsgId)
- .put("expected-message-id", inputMsgId)
- .build();
-
- throw new NetconfDocumentedException("Response message contained unknown \"message-id\"",
- null, NetconfDocumentedException.ErrorType.PROTOCOL,
- NetconfDocumentedException.ErrorTag.BAD_ATTRIBUTE,
- NetconfDocumentedException.ErrorSeverity.ERROR, errorInfo);
+ throw new NetconfDocumentedException("Response message contained unknown \"message-id\"", null,
+ ErrorType.PROTOCOL, ErrorTag.BAD_ATTRIBUTE, ErrorSeverity.ERROR,
+ ImmutableMap.of("actual-message-id", outputMsgId, "expected-message-id", inputMsgId));
}
}
}
}
- final ErrorSeverity severity = toRpcErrorSeverity(ex.getErrorSeverity());
- return severity == ErrorSeverity.ERROR
- ? RpcResultBuilder.newError(toRpcErrorType(ex.getErrorType()), ex.getErrorTag().getTagValue(),
+ return ex.getErrorSeverity() == ErrorSeverity.ERROR
+ ? RpcResultBuilder.newError(ex.getErrorType().toLegacy(), ex.getErrorTag().elementBody(),
ex.getLocalizedMessage(), null, infoBuilder.toString(), ex.getCause())
: RpcResultBuilder.newWarning(
- toRpcErrorType(ex.getErrorType()), ex.getErrorTag().getTagValue(),
+ ex.getErrorType().toLegacy(), ex.getErrorTag().elementBody(),
ex.getLocalizedMessage(), null, infoBuilder.toString(), ex.getCause());
}
- private static ErrorSeverity toRpcErrorSeverity(final NetconfDocumentedException.ErrorSeverity severity) {
- switch (severity) {
- case WARNING:
- return RpcError.ErrorSeverity.WARNING;
- default:
- return RpcError.ErrorSeverity.ERROR;
- }
- }
-
- private static RpcError.ErrorType toRpcErrorType(final NetconfDocumentedException.ErrorType type) {
- switch (type) {
- case PROTOCOL:
- return RpcError.ErrorType.PROTOCOL;
- case RPC:
- return RpcError.ErrorType.RPC;
- case TRANSPORT:
- return RpcError.ErrorType.TRANSPORT;
- default:
- return RpcError.ErrorType.APPLICATION;
- }
- }
-
public static NodeIdentifier toId(final PathArgument qname) {
return qname instanceof NodeIdentifier ? (NodeIdentifier) qname : toId(qname.getNodeType());
}
|| NETCONF_GET_QNAME.getLocalName().equals(rpc.getLocalName()));
}
- public static @NonNull ContainerSchemaNode createSchemaForDataRead(final SchemaContext schemaContext) {
- return new NodeContainerProxy(NETCONF_DATA_QNAME, schemaContext.getChildNodes());
- }
-
- public static @NonNull ContainerSchemaNode createSchemaForNotification(final NotificationDefinition next) {
- return new NodeContainerProxy(next.getQName(), next.getChildNodes(), next.getAvailableAugmentations());
- }
-
@Deprecated
- public static @NonNull ContainerNode wrap(final QName name, final DataContainerChild<?, ?>... node) {
+ public static @NonNull ContainerNode wrap(final QName name, final DataContainerChild... node) {
return wrap(toId(name), node);
}
- public static @NonNull ContainerNode wrap(final NodeIdentifier name, final DataContainerChild<?, ?>... node) {
+ public static @NonNull ContainerNode wrap(final NodeIdentifier name, final DataContainerChild... node) {
return Builders.containerBuilder().withNodeIdentifier(name).withValue(ImmutableList.copyOf(node)).build();
}
+ /**
+ * Create edit-config structure to invoke {@code operation} with {@code lastChildOverride} data on {@code dataPath}.
+ *
+ * @param ctx {@link EffectiveModelContext} device's model context
+ * @param dataPath {@link YangInstanceIdentifier} path to data in device's data-store
+ * @param operation Optional of {@link ModifyAction} action to be invoked
+ * @param lastChildOverride Optional of {@code NormalizedNode} data on which action will be invoked
+ * @return {@link DOMSourceAnyxmlNode} containing edit-config structure
+ */
public static DOMSourceAnyxmlNode createEditConfigAnyxml(
final EffectiveModelContext ctx, final YangInstanceIdentifier dataPath,
- final Optional<ModifyAction> operation,
- final Optional<NormalizedNode<?, ?>> lastChildOverride) {
- final NormalizedNode<?, ?> configContent;
- final NormalizedMetadata metadata;
+ final Optional<ModifyAction> operation, final Optional<NormalizedNode> lastChildOverride) {
if (dataPath.isEmpty()) {
Preconditions.checkArgument(lastChildOverride.isPresent(),
"Data has to be present when creating structure for top level element");
- Preconditions.checkArgument(lastChildOverride.get() instanceof DataContainerChild<?, ?>,
+ Preconditions.checkArgument(lastChildOverride.get() instanceof DataContainerChild,
"Data has to be either container or a list node when creating structure for top level element, "
+ "but was: %s", lastChildOverride.get());
- configContent = lastChildOverride.get();
- metadata = null;
- } else {
- configContent = ImmutableNodes.fromInstanceId(ctx, dataPath, lastChildOverride);
- metadata = operation.map(oper -> leafMetadata(dataPath, oper)).orElse(null);
}
- final Element element = XmlUtil.createElement(BLANK_DOCUMENT, NETCONF_CONFIG_QNAME.getLocalName(),
+ final var element = XmlUtil.createElement(BLANK_DOCUMENT, NETCONF_CONFIG_QNAME.getLocalName(),
Optional.of(NETCONF_CONFIG_QNAME.getNamespace().toString()));
-
+ final var metadata = operation.map(o -> leafMetadata(dataPath, o)).orElse(null);
try {
- NetconfUtil.writeNormalizedNode(configContent, metadata, new DOMResult(element), SchemaPath.ROOT, ctx);
- } catch (IOException | XMLStreamException e) {
+ if (lastChildOverride.isPresent()) {
+ // FIXME remove ImmutableNodes.fromInstanceId usage
+ final var configContent = ImmutableNodes.fromInstanceId(ctx, dataPath, lastChildOverride.get());
+ NetconfUtil.writeNormalizedNode(configContent, metadata, new DOMResult(element), SchemaPath.ROOT, ctx);
+ } else {
+ NetconfUtil.writeNormalizedNode(dataPath, metadata, new DOMResult(element), SchemaPath.ROOT, ctx);
+ }
+ } catch (final IOException | XMLStreamException e) {
throw new IllegalStateException("Unable to serialize edit config content element for path " + dataPath, e);
}
}
}
- public static DataContainerChild<?, ?> createEditConfigStructure(final EffectiveModelContext ctx,
+ public static DataContainerChild createEditConfigStructure(final EffectiveModelContext ctx,
final YangInstanceIdentifier dataPath, final Optional<ModifyAction> operation,
- final Optional<NormalizedNode<?, ?>> lastChildOverride) {
+ final Optional<NormalizedNode> lastChildOverride) {
return Builders.choiceBuilder().withNodeIdentifier(EDIT_CONTENT_NODEID)
.withChild(createEditConfigAnyxml(ctx, dataPath, operation, lastChildOverride)).build();
}
XMLStreamNormalizedNodeStreamWriter.create(writer, baseNetconfCtx, inputPath)) {
try (SchemaOrderedNormalizedNodeWriter normalizedNodeWriter =
new SchemaOrderedNormalizedNodeWriter(normalizedNodeStreamWriter, baseNetconfCtx, inputPath)) {
- final Collection<DataContainerChild<?, ?>> value = normalized.getValue();
+ final Collection<DataContainerChild> value = normalized.body();
normalizedNodeWriter.write(value);
normalizedNodeWriter.flush();
}
public static RpcResult<NetconfMessage> toRpcResult(final FailedNetconfMessage message) {
return RpcResultBuilder.<NetconfMessage>failed()
- .withRpcError(
- toRpcError(
- new NetconfDocumentedException(
- message.getException().getMessage(),
- DocumentedException.ErrorType.APPLICATION,
- DocumentedException.ErrorTag.MALFORMED_MESSAGE,
- DocumentedException.ErrorSeverity.ERROR)))
+ .withRpcError(toRpcError(new NetconfDocumentedException(message.getException().getMessage(),
+ ErrorType.APPLICATION, ErrorTag.MALFORMED_MESSAGE, ErrorSeverity.ERROR)))
.build();
}
}