From: Andrej Mak Date: Wed, 6 Apr 2016 09:14:45 +0000 (+0200) Subject: Add IPv6 to NetconfHelloMessageAdditionalHeader X-Git-Tag: release/boron~147^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=ed7b5f6ecdff528f93dc485b42c9311366c5ca63;p=netconf.git Add IPv6 to NetconfHelloMessageAdditionalHeader Address is no longer validated via regex. Instead, InetAddresses.isInetAddress(address) is used. Change-Id: I54438405125c1c4fa411a741eab6b3e2d3d13e22 Signed-off-by: Andrej Mak --- diff --git a/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/messages/NetconfHelloMessageAdditionalHeader.java b/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/messages/NetconfHelloMessageAdditionalHeader.java index 03b211d472..32557653c0 100644 --- a/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/messages/NetconfHelloMessageAdditionalHeader.java +++ b/netconf/netconf-api/src/main/java/org/opendaylight/netconf/api/messages/NetconfHelloMessageAdditionalHeader.java @@ -9,6 +9,7 @@ package org.opendaylight.netconf.api.messages; import com.google.common.base.Preconditions; +import com.google.common.net.InetAddresses; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -90,11 +91,10 @@ public class NetconfHelloMessageAdditionalHeader { return sb.toString(); } - // TODO IPv6 private static final Pattern PATTERN = Pattern - .compile("\\[(?[^;]+);(?
[0-9\\.]+)[:/](?[0-9]+);(?[a-z]+)[^\\]]+\\]"); + .compile("\\[(?[^;]+);(?
.+)[:/](?[0-9]+);(?[a-z]+)[^\\]]+\\]"); private static final Pattern CUSTOM_HEADER_PATTERN = Pattern - .compile("\\[(?[^;]+);(?
[0-9\\.]+)[:/](?[0-9]+);(?[a-z]+);(?[a-z]+)[^\\]]+\\]"); + .compile("\\[(?[^;]+);(?
.+)[:/](?[0-9]+);(?[a-z]+);(?[a-z]+)[^\\]]+\\]"); /** * Parse additional header from a formatted string @@ -108,6 +108,7 @@ public class NetconfHelloMessageAdditionalHeader { String username = matcher.group("username"); String address = matcher.group("address"); + Preconditions.checkArgument(InetAddresses.isInetAddress(address)); String port = matcher.group("port"); String transport = matcher.group("transport"); String sessionIdentifier = "client"; diff --git a/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/NetconfServerSession.java b/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/NetconfServerSession.java index 16e9285d70..b6c88a60b2 100644 --- a/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/NetconfServerSession.java +++ b/netconf/netconf-impl/src/main/java/org/opendaylight/netconf/impl/NetconfServerSession.java @@ -9,11 +9,14 @@ package org.opendaylight.netconf.impl; import com.google.common.base.Preconditions; +import com.google.common.net.InetAddresses; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; import io.netty.handler.codec.ByteToMessageDecoder; import io.netty.handler.codec.MessageToByteEncoder; +import java.net.Inet4Address; +import java.net.InetAddress; import java.time.Instant; import java.time.ZoneId; import java.time.ZonedDateTime; @@ -26,8 +29,10 @@ import org.opendaylight.netconf.api.monitoring.NetconfManagementSession; import org.opendaylight.netconf.nettyutil.AbstractNetconfSession; import org.opendaylight.netconf.nettyutil.handler.NetconfMessageToXMLEncoder; import org.opendaylight.netconf.nettyutil.handler.NetconfXMLToMessageDecoder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.DomainName; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Host; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.extension.rev131210.NetconfTcp; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.extension.rev131210.Session1; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.extension.rev131210.Session1Builder; @@ -109,7 +114,14 @@ public final class NetconfServerSession extends AbstractNetconfSession1" + + "0" + + "0" + + "2010-10-10T12:32:32Z" + + "0" + + "0" + + "client" + + "%s" + + "ncme:netconf-tcp" + + "username" + + ""; + + @Mock + private NetconfMonitoringService monitoringService; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + doReturn(new SessionsBuilder().setSession(Lists.newArrayList( + getMockIPv4Session(NetconfTcp.class), + getMockIPv4Session(NetconfSsh.class), + getMockIPv6Session(NetconfTcp.class), + getMockIPv6Session(NetconfSsh.class) + )).build()) + .when(monitoringService).getSessions(); + doReturn(new SchemasBuilder().setSchema(Lists.newArrayList(getMockSchema("id", "v1", Yang.class), getMockSchema("id2", "", Yang.class))).build()) + .when(monitoringService).getSchemas(); + } + @Test public void testSerialization() throws Exception { - final NetconfMonitoringService service = new NetconfMonitoringService() { - - @Override - public void onCapabilitiesChanged(Set added, Set removed) { - - } - - @Override - public void onSessionUp(final NetconfManagementSession session) { - - } - - @Override - public void onSessionDown(final NetconfManagementSession session) { - - } - - @Override - public Sessions getSessions() { - return new SessionsBuilder().setSession(Lists.newArrayList(getMockSession(NetconfTcp.class), getMockSession(NetconfSsh.class))).build(); - } - - @Override - public Schemas getSchemas() { - return new SchemasBuilder().setSchema(Lists.newArrayList(getMockSchema("id", "v1", Yang.class), getMockSchema("id2", "", Yang.class))).build(); - } - - @Override - public String getSchemaForCapability(final String moduleName, final Optional revision) { - return null; - } - - @Override - public Capabilities getCapabilities() { - return null; - } - - @Override - public AutoCloseable registerListener(final MonitoringListener listener) { - return new AutoCloseable() { - @Override - public void close() throws Exception { - // NOOP - } - }; - } - }; - final NetconfState model = new NetconfState(service); + final NetconfState model = new NetconfState(monitoringService); final String xml = XmlUtil.toString(new JaxBSerializer().toXml(model)).replaceAll("\\s", ""); - + System.out.println(xml); assertThat(xml, CoreMatchers.containsString( "" + "yang" + @@ -106,18 +89,9 @@ public class JaxBSerializerTest { "")); assertThat(xml, CoreMatchers.containsString( - "" + - "1" + - "0" + - "0" + - "2010-10-10T12:32:32Z" + - "0" + - "0" + - "client" + - "192.168.1.1" + - "ncme:netconf-tcp" + - "username" + - "")); + String.format(SESSION_XML, IPV4))); + assertThat(xml, CoreMatchers.containsString( + String.format(SESSION_XML, IPV6))); } private Schema getMockSchema(final String id, final String version, final Class format) { @@ -132,13 +106,24 @@ public class JaxBSerializerTest { return mock; } + private Session getMockIPv4Session(final Class transportType) { + final Session mocked = getMockSession(transportType); + doReturn(new Host(new IpAddress(new Ipv4Address(IPV4)))).when(mocked).getSourceHost(); + return mocked; + } + + private Session getMockIPv6Session(final Class transportType) { + final Session mocked = getMockSession(transportType); + doReturn(new Host(new IpAddress(new Ipv6Address(IPV6)))).when(mocked).getSourceHost(); + return mocked; + } + private Session getMockSession(final Class transportType) { final Session mocked = mock(Session.class); final Session1 mockedSession1 = mock(Session1.class); doReturn("client").when(mockedSession1).getSessionIdentifier(); doReturn(1L).when(mocked).getSessionId(); doReturn(new DateAndTime("2010-10-10T12:32:32Z")).when(mocked).getLoginTime(); - doReturn(new Host(new DomainName("192.168.1.1"))).when(mocked).getSourceHost(); doReturn(new ZeroBasedCounter32(0L)).when(mocked).getInBadRpcs(); doReturn(new ZeroBasedCounter32(0L)).when(mocked).getInRpcs(); doReturn(new ZeroBasedCounter32(0L)).when(mocked).getOutNotifications();