From 20529403b5f257298670f839ad630fbf0c215a7d Mon Sep 17 00:00:00 2001 From: Michal Cmarada Date: Mon, 9 Jul 2018 13:59:31 +0200 Subject: Fix binding name for route In specific case when route uses 128 mask and this value is converted to byte value it is changed to -128, which breaks internal naming of routes. This needed to be fixed because routes with 128 mask are not being read from VPP to operational state. Change-Id: Ic3b6ded721e7996587982b6a2b3bc8c9ebe03b43 Signed-off-by: Michal Cmarada --- .../routing/naming/Ipv6RouteNamesFactory.java | 5 +-- .../hc2vpp/routing/Ipv6RouteNamesFactoryTest.java | 17 +++++++++ .../routing/read/Ipv6RouteCustomizerTest.java | 42 ++++++++++++++++++++-- .../routing/write/Ipv6RouteCustomizerTest.java | 13 +++++++ .../ipv6/simplehop/simpleHopRoute128.json | 18 ++++++++++ 5 files changed, 91 insertions(+), 4 deletions(-) create mode 100644 routing/routing-impl/src/test/resources/ipv6/simplehop/simpleHopRoute128.json diff --git a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/naming/Ipv6RouteNamesFactory.java b/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/naming/Ipv6RouteNamesFactory.java index da8affb7b..91370c7fd 100644 --- a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/naming/Ipv6RouteNamesFactory.java +++ b/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/naming/Ipv6RouteNamesFactory.java @@ -56,7 +56,7 @@ public final class Ipv6RouteNamesFactory implements RouteMapper, RouteRequestPro return bindName(parentProtocolName, // to have address in compressed form doubleDotlessAddress(route.getDestinationPrefix()), - String.valueOf(extractPrefix(route.getDestinationPrefix()))); + route.getDestinationPrefix().getValue().substring(route.getDestinationPrefix().getValue().indexOf('/') + 1)); } /** @@ -72,7 +72,8 @@ public final class Ipv6RouteNamesFactory implements RouteMapper, RouteRequestPro * Construct unique name from provided parentProtocolName and {@code Ipv6Prefix} */ public String uniqueRouteName(@Nonnull final String parentProtocolName, @Nonnull final Ipv6Prefix prefix) { - return bindName(parentProtocolName, doubleDotlessAddress(prefix), String.valueOf(extractPrefix(prefix))); + return bindName(parentProtocolName, doubleDotlessAddress(prefix), + prefix.getValue().substring(prefix.getValue().indexOf('/') + 1)); } diff --git a/routing/routing-impl/src/test/java/io/fd/hc2vpp/routing/Ipv6RouteNamesFactoryTest.java b/routing/routing-impl/src/test/java/io/fd/hc2vpp/routing/Ipv6RouteNamesFactoryTest.java index 2acf9fe4f..76326bf04 100644 --- a/routing/routing-impl/src/test/java/io/fd/hc2vpp/routing/Ipv6RouteNamesFactoryTest.java +++ b/routing/routing-impl/src/test/java/io/fd/hc2vpp/routing/Ipv6RouteNamesFactoryTest.java @@ -53,6 +53,7 @@ public class Ipv6RouteNamesFactoryTest implements RoutingRequestTestHelper, Sche private NamingContext interfaceContext; private NamingContext routingProtocolContext; private Ip6FibDetails vppRoute; + private Ip6FibDetails vppRoute128; private FibPath vppPath; private Ipv6RouteNamesFactory factory; @@ -66,6 +67,11 @@ public class Ipv6RouteNamesFactoryTest implements RoutingRequestTestHelper, Sche vppRoute.addressLength = 64; vppRoute.tableId = 1; + vppRoute128 = new Ip6FibDetails(); + vppRoute128.address = FIRST_ADDRESS_AS_ARRAY; + vppRoute128.addressLength = (byte) 128; + vppRoute128.tableId = 1; + vppPath = new FibPath(); vppPath.nextHop = FIRST_ADDRESS_AS_ARRAY; vppPath.swIfIndex = 2; @@ -86,6 +92,17 @@ public class Ipv6RouteNamesFactoryTest implements RoutingRequestTestHelper, Sche assertEquals("tst-protocol_2001-db8-a0b-12f0--1_64", factory.uniqueRouteName(vppRoute, mappingContext)); } + @Test + public void testUniqueRouteName128( + @InjectTestData(resourcePath = "/ipv6/simplehop/simpleHopRoute128.json", id = STATIC_ROUTE_PATH) + StaticRoutes data) { + assertEquals("tst-protocol_2001-db8-a0b-12f0--1_128", + factory.uniqueRouteName(ROUTE_PROTOCOL_NAME, + getIpv6RouteWithId(data, + new Ipv6Prefix("2001:0db8:0a0b:12f0:0000:0000:0000:0001/128")))); + assertEquals("tst-protocol_2001-db8-a0b-12f0--1_128", factory.uniqueRouteName(vppRoute128, mappingContext)); + } + @Test public void testUniqueRouteHopName() { assertEquals("iface_2001-db8-a0b-12f0--1_3", factory.uniqueRouteHopName( diff --git a/routing/routing-impl/src/test/java/io/fd/hc2vpp/routing/read/Ipv6RouteCustomizerTest.java b/routing/routing-impl/src/test/java/io/fd/hc2vpp/routing/read/Ipv6RouteCustomizerTest.java index 81dae7bfd..fd2844bd6 100644 --- a/routing/routing-impl/src/test/java/io/fd/hc2vpp/routing/read/Ipv6RouteCustomizerTest.java +++ b/routing/routing-impl/src/test/java/io/fd/hc2vpp/routing/read/Ipv6RouteCustomizerTest.java @@ -101,6 +101,7 @@ public class Ipv6RouteCustomizerTest extends ListReaderCustomizerTest routeIdSpecialHop; private InstanceIdentifier routeIdSimpleHop; + private InstanceIdentifier routeIdSimpleHop128; private InstanceIdentifier routeIdListHop; private Ipv6RouteNamesFactory factory; @@ -131,6 +132,8 @@ public class Ipv6RouteCustomizerTest extends ListReaderCustomizerTest keys = getCustomizer().getAllIds(routeIdSpecialHop, ctx); - assertThat(keys, hasSize(3)); + assertThat(keys, hasSize(4)); assertThat(keys, hasItems(new RouteKey(new Ipv6Prefix("2001:db8:a0b:12f0::1/24")), new RouteKey(new Ipv6Prefix("2001:db8:a0b:12f0::2/22")), + new RouteKey(new Ipv6Prefix("2001:db8:a0b:12f0::2/128")), new RouteKey(new Ipv6Prefix("2001:db8:a0b:12f0::2/16")))); } @@ -256,6 +277,23 @@ public class Ipv6RouteCustomizerTest extends ListReaderCustomizerTest ROUTE_IID = CONTROL_PROTOCOL_IID .child(StaticRoutes.class) @@ -110,6 +111,18 @@ public class Ipv6RouteCustomizerTest extends RouteCustomizerTest { 0, CLASSIFY_TABLE_INDEX, 1)), api, requestCaptor); } + @Test + public void testWriteSingleHop128( + @InjectTestData(resourcePath = "/ipv6/simplehop/simpleHopRoute128.json", id = STATIC_ROUTE_PATH) StaticRoutes route) + throws WriteFailedException { + whenAddRouteThenSuccess(api); + customizer.writeCurrentAttributes(ROUTE_IID, getIpv6RouteWithId(route, IPV_6_PREFIX_128), writeContext); + verifyInvocation(1, ImmutableList + .of(desiredFlaglessResult(1, 1, 0, Ipv6RouteData.FIRST_ADDRESS_AS_ARRAY, 128, + Ipv6RouteData.SECOND_ADDRESS_AS_ARRAY, INTERFACE_INDEX, 0, TABLE_ID.intValue(), + 0, CLASSIFY_TABLE_INDEX, 1)), api, requestCaptor); + } + //TODO - https://jira.fd.io/browse/HONEYCOMB-396 @Test public void testWriteTableLookup() throws WriteFailedException { diff --git a/routing/routing-impl/src/test/resources/ipv6/simplehop/simpleHopRoute128.json b/routing/routing-impl/src/test/resources/ipv6/simplehop/simpleHopRoute128.json new file mode 100644 index 000000000..2e7510607 --- /dev/null +++ b/routing/routing-impl/src/test/resources/ipv6/simplehop/simpleHopRoute128.json @@ -0,0 +1,18 @@ +{ + "static-routes": { + "ipv6": { + "route": [ + { + "destination-prefix": "2001:0db8:0a0b:12f0:0000:0000:0000:0001/128", + "next-hop": { + "next-hop-address" : "2001:0db8:0a0b:12f0:0000:0000:0000:0002", + "outgoing-interface": "iface" + }, + "vpp-ipv6-route" : { + "classify-table": "classify-table-one" + } + } + ] + } + } +} -- cgit 1.2.3-korg