From a485cbb1eda100ba2cc51e89a48ec1647552eec1 Mon Sep 17 00:00:00 2001 From: David Goldberg Date: Thu, 2 Mar 2017 18:16:03 +0200 Subject: [PATCH] Handle shcema without namespace. currently when the ODL connects to a device and recieves a schema without a namespace it disconnects. This fix allows the ODL to ignore schemas without namespaces, but still maintains the connection and handles the rest of the schemas which do have a namespace. Change-Id: I9134fce17a85a2b5111e5acd0c63516f4c356db8 Signed-off-by: David Goldberg --- .../connect/netconf/NetconfStateSchemas.java | 17 +++++++++++++---- .../netconf/NetconfStateSchemasTest.java | 7 +++++-- .../resources/netconf-state.schemas.payload.xml | 5 +---- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/NetconfStateSchemas.java b/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/NetconfStateSchemas.java index d9ca7df3e9..3986c8f371 100644 --- a/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/NetconfStateSchemas.java +++ b/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/NetconfStateSchemas.java @@ -121,7 +121,7 @@ public final class NetconfStateSchemas implements NetconfDeviceSchemas { if(schemasNode.isPresent()) { Preconditions.checkState(schemasNode.get() instanceof ContainerNode, "Expecting container containing schemas, but was %s", schemasNode.get()); - return create(id, ((ContainerNode) schemasNode.get())); + return create(id, (ContainerNode) schemasNode.get()); } else { LOG.warn("{}: Unable to detect available schemas, get to {} was empty", id, STATE_SCHEMAS_IDENTIFIER); return EMPTY; @@ -198,7 +198,12 @@ public final class NetconfStateSchemas implements NetconfDeviceSchemas { } childNode = NetconfMessageTransformUtil.IETF_NETCONF_MONITORING_SCHEMA_NAMESPACE; - final String namespaceAsString = getSingleChildNodeValue(schemaNode, childNode).get(); + final Optional namespaceValue = getSingleChildNodeValue(schemaNode, childNode); + if (!namespaceValue.isPresent()) { + LOG.warn("{}: Ignoring schema due to missing namespace", id); + return Optional.absent(); + } + final String namespaceAsString = namespaceValue.get(); childNode = NetconfMessageTransformUtil.IETF_NETCONF_MONITORING_SCHEMA_VERSION; // Revision does not have to be filled @@ -230,8 +235,12 @@ public final class NetconfStateSchemas implements NetconfDeviceSchemas { private static Optional getSingleChildNodeValue(final DataContainerNode schemaNode, final QName childNode) { final Optional> node = schemaNode.getChild(toId(childNode)); - Preconditions.checkArgument(node.isPresent(), "Child node %s not present", childNode); - return getValueOfSimpleNode(node.get()); + if (node.isPresent()) { + return getValueOfSimpleNode(node.get()); + } else { + LOG.debug("Child node {} not present", childNode); + return Optional.absent(); + } } private static Optional getValueOfSimpleNode(final NormalizedNode node) { diff --git a/netconf/sal-netconf-connector/src/test/java/org/opendaylight/netconf/sal/connect/netconf/NetconfStateSchemasTest.java b/netconf/sal-netconf-connector/src/test/java/org/opendaylight/netconf/sal/connect/netconf/NetconfStateSchemasTest.java index c8564975b6..92d31ab734 100644 --- a/netconf/sal-netconf-connector/src/test/java/org/opendaylight/netconf/sal/connect/netconf/NetconfStateSchemasTest.java +++ b/netconf/sal-netconf-connector/src/test/java/org/opendaylight/netconf/sal/connect/netconf/NetconfStateSchemasTest.java @@ -66,6 +66,9 @@ public class NetconfStateSchemasTest { private static final NetconfSessionPreferences CAPS = NetconfSessionPreferences.fromStrings(Collections.singleton("urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?module=ietf-netconf-monitoring&revision=2010-10-04")); private final RemoteDeviceId deviceId = new RemoteDeviceId("device", new InetSocketAddress(99)); private ContainerNode compositeNodeSchemas; + private final int NUMBER_OF_SCHEMAS = 73; + private final int NUMBER_OF_LEGAL_SCHEMAS = NUMBER_OF_SCHEMAS - 3; + @Mock private DOMRpcService rpc; @@ -87,7 +90,7 @@ public class NetconfStateSchemasTest { final NetconfStateSchemas schemas = NetconfStateSchemas.create(deviceId, compositeNodeSchemas); final Set availableYangSchemasQNames = schemas.getAvailableYangSchemasQNames(); - assertEquals(73, availableYangSchemasQNames.size()); + assertEquals(NUMBER_OF_LEGAL_SCHEMAS, availableYangSchemasQNames.size()); assertThat(availableYangSchemasQNames, hasItem(QName.create("urn:TBD:params:xml:ns:yang:network-topology", "2013-07-12", "network-topology"))); @@ -110,7 +113,7 @@ public class NetconfStateSchemasTest { when(rpc.invokeRpc(eq(toPath(NETCONF_GET_QNAME)), any())).thenReturn(Futures.immediateCheckedFuture(new DefaultDOMRpcResult(rpcReply))); final NetconfStateSchemas stateSchemas = NetconfStateSchemas.create(rpc, CAPS, deviceId); final Set availableYangSchemasQNames = stateSchemas.getAvailableYangSchemasQNames(); - assertEquals(73, availableYangSchemasQNames.size()); + assertEquals(NUMBER_OF_LEGAL_SCHEMAS, availableYangSchemasQNames.size()); assertThat(availableYangSchemasQNames, hasItem(QName.create("urn:TBD:params:xml:ns:yang:network-topology", "2013-07-12", "network-topology"))); diff --git a/netconf/sal-netconf-connector/src/test/resources/netconf-state.schemas.payload.xml b/netconf/sal-netconf-connector/src/test/resources/netconf-state.schemas.payload.xml index 0213415f8d..25adca7034 100644 --- a/netconf/sal-netconf-connector/src/test/resources/netconf-state.schemas.payload.xml +++ b/netconf/sal-netconf-connector/src/test/resources/netconf-state.schemas.payload.xml @@ -491,24 +491,21 @@ 2014-01-31 - urn:opendaylight:flow:types NETCONF opendaylight-flow-types prefix:yang 2013-10-26 - urn:opendaylight:params:xml:ns:yang:controller:shutdown:impl NETCONF shutdown-impl prefix:yang 2013-12-18 - urn:opendaylight:model:topology:inventory NETCONF opendaylight-topology-inventory prefix:yang 2013-10-30 - \ No newline at end of file + -- 2.36.6