diff options
Diffstat (limited to 'routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read')
9 files changed, 287 insertions, 637 deletions
diff --git a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/RoutingProtocolCustomizer.java b/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/ControlPlaneProtocolCustomizer.java index bbc9727a6..372da27c6 100644 --- a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/RoutingProtocolCustomizer.java +++ b/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/ControlPlaneProtocolCustomizer.java @@ -32,31 +32,31 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; import javax.annotation.Nonnull; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.Static; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.state.routing.instance.RoutingProtocolsBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.state.routing.instance.routing.protocols.RoutingProtocol; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.state.routing.instance.routing.protocols.RoutingProtocolBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.state.routing.instance.routing.protocols.RoutingProtocolKey; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev170917.RoutingProtocolStateVppAttr; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev170917.RoutingProtocolStateVppAttrBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev170917.VniReference; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev170917.routing.state.routing.instance.routing.protocols.routing.protocol.VppProtocolStateAttributesBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev180313.Static; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev180313.routing.ControlPlaneProtocolsBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev180313.routing.control.plane.protocols.ControlPlaneProtocol; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev180313.routing.control.plane.protocols.ControlPlaneProtocolBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev180313.routing.control.plane.protocols.ControlPlaneProtocolKey; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev180319.RoutingProtocolVppAttr; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev180319.RoutingProtocolVppAttrBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev180319.routing.control.plane.protocols.control.plane.protocol.VppProtocolAttributesBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.types.rev180406.VniReference; import org.opendaylight.yangtools.concepts.Builder; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; - -public class RoutingProtocolCustomizer - implements ListReaderCustomizer<RoutingProtocol, RoutingProtocolKey, RoutingProtocolBuilder>, RouteMapper { +final class ControlPlaneProtocolCustomizer + implements ListReaderCustomizer<ControlPlaneProtocol, ControlPlaneProtocolKey, ControlPlaneProtocolBuilder>, + RouteMapper { private final NamingContext routingProtocolContext; private final DumpCacheManager<IpFibDetailsReplyDump, Void> ipv4RoutesDumpManager; private final DumpCacheManager<Ip6FibDetailsReplyDump, Void> ipv6RoutesDumpManager; - public RoutingProtocolCustomizer(@Nonnull final NamingContext routingProtocolContext, - @Nonnull final DumpCacheManager<IpFibDetailsReplyDump, Void> ipv4RoutesDumpManager, - @Nonnull final DumpCacheManager<Ip6FibDetailsReplyDump, Void> ipv6RoutesDumpManager) { + ControlPlaneProtocolCustomizer(@Nonnull final NamingContext routingProtocolContext, + @Nonnull final DumpCacheManager<IpFibDetailsReplyDump, Void> ipv4RoutesDumpManager, + @Nonnull final DumpCacheManager<Ip6FibDetailsReplyDump, Void> ipv6RoutesDumpManager) { this.routingProtocolContext = routingProtocolContext; this.ipv4RoutesDumpManager = ipv4RoutesDumpManager; this.ipv6RoutesDumpManager = ipv6RoutesDumpManager; @@ -64,8 +64,8 @@ public class RoutingProtocolCustomizer @Nonnull @Override - public List<RoutingProtocolKey> getAllIds(@Nonnull final InstanceIdentifier<RoutingProtocol> instanceIdentifier, - @Nonnull final ReadContext readContext) throws ReadFailedException { + public List<ControlPlaneProtocolKey> getAllIds(@Nonnull final InstanceIdentifier<ControlPlaneProtocol> instanceIdentifier, + @Nonnull final ReadContext readContext) throws ReadFailedException { final ModificationCache modificationCache = readContext.getModificationCache(); @@ -76,11 +76,11 @@ public class RoutingProtocolCustomizer .flatMap(Collection::stream) .map(tableId -> routingProtocolContext.getName(tableId, readContext.getMappingContext())) .distinct() - .map(RoutingProtocolKey::new) + .map(name -> new ControlPlaneProtocolKey(name, Static.class)) .collect(Collectors.toList()); } - private List<Integer> ipv4TableIds(final InstanceIdentifier<RoutingProtocol> instanceIdentifier, + private List<Integer> ipv4TableIds(final InstanceIdentifier<ControlPlaneProtocol> instanceIdentifier, final ModificationCache modificationCache) throws ReadFailedException { final Optional<IpFibDetailsReplyDump> ipv4Routes = ipv4RoutesDumpManager.getDump(instanceIdentifier, modificationCache); @@ -93,7 +93,7 @@ public class RoutingProtocolCustomizer return Collections.emptyList(); } - private List<Integer> ipv6TableIds(final InstanceIdentifier<RoutingProtocol> instanceIdentifier, + private List<Integer> ipv6TableIds(final InstanceIdentifier<ControlPlaneProtocol> instanceIdentifier, final ModificationCache modificationCache) throws ReadFailedException { final Optional<Ip6FibDetailsReplyDump> ipv6Routes = ipv6RoutesDumpManager.getDump(instanceIdentifier, modificationCache); @@ -107,28 +107,34 @@ public class RoutingProtocolCustomizer } @Override - public void merge(@Nonnull final Builder<? extends DataObject> builder, @Nonnull final List<RoutingProtocol> list) { - RoutingProtocolsBuilder.class.cast(builder).setRoutingProtocol(list); + public void merge(@Nonnull final Builder<? extends DataObject> builder, + @Nonnull final List<ControlPlaneProtocol> list) { + ((ControlPlaneProtocolsBuilder) builder).setControlPlaneProtocol(list); } @Nonnull @Override - public RoutingProtocolBuilder getBuilder(@Nonnull final InstanceIdentifier<RoutingProtocol> instanceIdentifier) { - return new RoutingProtocolBuilder(); + public ControlPlaneProtocolBuilder getBuilder(@Nonnull final InstanceIdentifier<ControlPlaneProtocol> instanceIdentifier) { + return new ControlPlaneProtocolBuilder(); } @Override - public void readCurrentAttributes(@Nonnull final InstanceIdentifier<RoutingProtocol> instanceIdentifier, - @Nonnull final RoutingProtocolBuilder routingProtocolBuilder, + public void readCurrentAttributes(@Nonnull final InstanceIdentifier<ControlPlaneProtocol> instanceIdentifier, + @Nonnull final ControlPlaneProtocolBuilder routingProtocolBuilder, @Nonnull final ReadContext readContext) throws ReadFailedException { - - final RoutingProtocolKey key = instanceIdentifier.firstKeyOf(RoutingProtocol.class); - routingProtocolBuilder.setName(key.getName()).setKey(key).setType(Static.class) - .addAugmentation(RoutingProtocolStateVppAttr.class, new RoutingProtocolStateVppAttrBuilder() - .setVppProtocolStateAttributes(new VppProtocolStateAttributesBuilder() - .setPrimaryVrf(new VniReference(Long.valueOf(routingProtocolContext - .getIndex(key.getName(), readContext.getMappingContext())))) - .build()) - .build()); + final ControlPlaneProtocolKey key = instanceIdentifier.firstKeyOf(ControlPlaneProtocol.class); + routingProtocolBuilder + .setName(key.getName()) + .setKey(key) + .setType(Static.class) + .addAugmentation(RoutingProtocolVppAttr.class, new RoutingProtocolVppAttrBuilder().setVppProtocolAttributes( + new VppProtocolAttributesBuilder() + .setPrimaryVrf( + new VniReference( + Long.valueOf(routingProtocolContext.getIndex(key.getName(), + readContext.getMappingContext())))) + .build()) + .build()) + .build(); } } diff --git a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/Ipv4ReadRoutingNodes.java b/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/Ipv4ReadRoutingNodes.java deleted file mode 100644 index b42fd558a..000000000 --- a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/Ipv4ReadRoutingNodes.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2016 Cisco and/or its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.fd.hc2vpp.routing.read; - - -import com.google.common.collect.ImmutableSet; -import io.fd.hc2vpp.common.translate.util.JvppReplyConsumer; -import io.fd.hc2vpp.common.translate.util.MultiNamingContext; -import io.fd.hc2vpp.common.translate.util.NamingContext; -import io.fd.hc2vpp.routing.RoutingConfiguration; -import io.fd.honeycomb.translate.impl.read.GenericListReader; -import io.fd.honeycomb.translate.read.registry.ModifiableReaderRegistryBuilder; -import io.fd.honeycomb.translate.util.read.cache.DumpCacheManager; -import io.fd.vpp.jvpp.core.dto.IpFibDetailsReplyDump; -import io.fd.vpp.jvpp.core.dto.IpFibDump; -import io.fd.vpp.jvpp.core.future.FutureJVppCore; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev170917.StaticRoutes2; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev170917.StaticRoutes2Builder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev170917.routing.state.routing.instance.routing.protocols.routing.protocol._static.routes.Ipv4; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev170917.routing.state.routing.instance.routing.protocols.routing.protocol._static.routes.Ipv4Builder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev170917.routing.state.routing.instance.routing.protocols.routing.protocol._static.routes.ipv4.Route; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev170917.routing.state.routing.instance.routing.protocols.routing.protocol._static.routes.ipv4.route.VppIpv4RouteState; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev170917.routing.state.routing.instance.routing.protocols.routing.protocol._static.routes.ipv4.route.next.hop.options.next.hop.list.NextHopList; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev170917.routing.state.routing.instance.routing.protocols.routing.protocol._static.routes.ipv4.route.next.hop.options.next.hop.list.next.hop.list.NextHop; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev170917.routing.state.routing.instance.routing.protocols.routing.protocol._static.routes.ipv4.route.next.hop.options.table.lookup.TableLookupParams; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.state.routing.instance.routing.protocols.routing.protocol.StaticRoutes; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; - -import javax.annotation.Nonnull; -import java.util.Set; - -interface Ipv4ReadRoutingNodes extends JvppReplyConsumer { - - static InstanceIdentifier<StaticRoutes2> staticRoutesInstanceIdentifier( - final InstanceIdentifier<StaticRoutes> staticRoutesInstanceIdentifier) { - return staticRoutesInstanceIdentifier.augmentation(StaticRoutes2.class); - } - - static InstanceIdentifier<Ipv4> ipv4Identifier( - final InstanceIdentifier<StaticRoutes2> staticRoutes2InstanceIdentifier) { - return staticRoutes2InstanceIdentifier.child(Ipv4.class); - } - - default DumpCacheManager<IpFibDetailsReplyDump, Void> newIpv4RoutesDumpManager( - @Nonnull final FutureJVppCore vppApi) { - return new DumpCacheManager.DumpCacheManagerBuilder<IpFibDetailsReplyDump, Void>() - .withExecutor( - (identifier, params) -> getReplyForRead(vppApi.ipFibDump(new IpFibDump()).toCompletableFuture(), - identifier)) - .acceptOnly(IpFibDetailsReplyDump.class) - .build(); - } - - default void registerIpv4Routes(@Nonnull final InstanceIdentifier<StaticRoutes> subTreeId, - @Nonnull final ModifiableReaderRegistryBuilder registry, - @Nonnull final DumpCacheManager<IpFibDetailsReplyDump, Void> ipv4DumpManager, - @Nonnull final RoutingConfiguration configuration, - @Nonnull final MultiNamingContext routeHopContext, - @Nonnull final NamingContext interfaceContext, - @Nonnull final NamingContext routeContext, - @Nonnull final NamingContext routingProtocolContext) { - - final InstanceIdentifier<StaticRoutes2> staticRoutes2InstanceIdentifier = - staticRoutesInstanceIdentifier(subTreeId); - final InstanceIdentifier<Ipv4> ipv4InstanceIdentifier = ipv4Identifier(staticRoutes2InstanceIdentifier); - - registry.addStructuralReader(staticRoutes2InstanceIdentifier, StaticRoutes2Builder.class); - - registry.addStructuralReader(ipv4InstanceIdentifier, Ipv4Builder.class); - registry.subtreeAdd(ipv4RoutingHandledChildren(InstanceIdentifier.create(Route.class)), - new GenericListReader<>(ipv4InstanceIdentifier.child(Route.class), - new Ipv4RouteCustomizer(ipv4DumpManager, configuration, routeHopContext, interfaceContext, - routeContext, routingProtocolContext))); - } - - default Set<InstanceIdentifier<?>> ipv4RoutingHandledChildren( - final InstanceIdentifier<Route> parent) { - return ImmutableSet.of( - parent.child(TableLookupParams.class), - parent.child(NextHopList.class), - parent.child(NextHopList.class).child(NextHop.class), - parent.child(VppIpv4RouteState.class)); - } - -} diff --git a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/Ipv4RouteCustomizer.java b/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/Ipv4RouteCustomizer.java index 53d4f8335..1c5665839 100644 --- a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/Ipv4RouteCustomizer.java +++ b/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/Ipv4RouteCustomizer.java @@ -35,20 +35,21 @@ import java.util.Collections; import java.util.List; import java.util.stream.Collectors; import javax.annotation.Nonnull; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev170917.routing.state.routing.instance.routing.protocols.routing.protocol._static.routes.Ipv4Builder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev170917.routing.state.routing.instance.routing.protocols.routing.protocol._static.routes.ipv4.Route; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev170917.routing.state.routing.instance.routing.protocols.routing.protocol._static.routes.ipv4.RouteBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev170917.routing.state.routing.instance.routing.protocols.routing.protocol._static.routes.ipv4.RouteKey; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev170917.routing.state.routing.instance.routing.protocols.routing.protocol._static.routes.ipv4.route.VppIpv4RouteStateBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.state.routing.instance.routing.protocols.RoutingProtocol; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev180313.routing.control.plane.protocols.control.plane.protocol._static.routes.Ipv4Builder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev180313.routing.control.plane.protocols.control.plane.protocol._static.routes.ipv4.Route; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev180313.routing.control.plane.protocols.control.plane.protocol._static.routes.ipv4.RouteBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev180313.routing.control.plane.protocols.control.plane.protocol._static.routes.ipv4.RouteKey; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev180313.routing.control.plane.protocols.ControlPlaneProtocol; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.ipv4.unicast.routing.rev180319.VppIpv4RouteAttributesAugmentation; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.ipv4.unicast.routing.rev180319.VppIpv4RouteAttributesAugmentationBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.ipv4.unicast.routing.rev180319.routing.control.plane.protocols.control.plane.protocol._static.routes.ipv4.route.VppIpv4RouteBuilder; import org.opendaylight.yangtools.concepts.Builder; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -public class Ipv4RouteCustomizer +final class Ipv4RouteCustomizer implements ListReaderCustomizer<Route, RouteKey, RouteBuilder>, RouteMapper, Ipv4RoutePathParser { - private final DumpCacheManager<IpFibDetailsReplyDump, Void> ipv4RoutesDumpManager; private final RoutingConfiguration configuration; private final MultiNamingContext routeHopContext; @@ -58,12 +59,12 @@ public class Ipv4RouteCustomizer private final Ipv4RouteNamesFactory namesFactory; - public Ipv4RouteCustomizer(@Nonnull final DumpCacheManager<IpFibDetailsReplyDump, Void> ipv4RoutesDumpManager, - @Nonnull final RoutingConfiguration configuration, - @Nonnull final MultiNamingContext routeHopContext, - @Nonnull final NamingContext interfaceContext, - @Nonnull final NamingContext routesContext, - @Nonnull final NamingContext routingProtocolContext) { + Ipv4RouteCustomizer(@Nonnull final DumpCacheManager<IpFibDetailsReplyDump, Void> ipv4RoutesDumpManager, + @Nonnull final RoutingConfiguration configuration, + @Nonnull final MultiNamingContext routeHopContext, + @Nonnull final NamingContext interfaceContext, + @Nonnull final NamingContext routesContext, + @Nonnull final NamingContext routingProtocolContext) { this.ipv4RoutesDumpManager = ipv4RoutesDumpManager; this.configuration = configuration; this.interfaceContext = interfaceContext; @@ -81,7 +82,7 @@ public class Ipv4RouteCustomizer final Optional<IpFibDetailsReplyDump> ipv4RoutesDump = ipv4RoutesDumpManager.getDump(instanceIdentifier, readContext.getModificationCache()); - final String protocolName = instanceIdentifier.firstKeyOf(RoutingProtocol.class).getName(); + final String protocolName = instanceIdentifier.firstKeyOf(ControlPlaneProtocol.class).getName(); final int protocolTableId = routingProtocolContext.getIndex(protocolName, readContext.getMappingContext()); return ipv4RoutesDump.isPresent() @@ -104,14 +105,19 @@ public class Ipv4RouteCustomizer if (!routesContext.containsIndex(learnedRouteName, mappingContext)) { routesContext.addName(learnedRouteName, mappingContext); } - return keyForName(mappingContext, learnedRouteName); + return keyForLearnedName(learnedRouteName); } - return keyForName(mappingContext, routeName); + return keyForName(routeName); + } + + private RouteKey keyForName(final String name) { + // example learned-protocol-0_0-0-0-0_0 + return new RouteKey(namesFactory.ipv4PrefixFromUniqueRouteName(name)); } - private RouteKey keyForName(final MappingContext mappingContext, final String name) { - return new RouteKey( - Long.valueOf(routesContext.getIndex(name, mappingContext))); + private RouteKey keyForLearnedName(final String name) { + // example learned-route_learned-protocol-0_0-0-0-0_0 + return new RouteKey(namesFactory.ipv4PrefixFromUniqueRouteName(name.replace("learned-route_", ""))); } @Override @@ -130,8 +136,9 @@ public class Ipv4RouteCustomizer @Nonnull final RouteBuilder routeBuilder, @Nonnull final ReadContext readContext) throws ReadFailedException { final RouteKey key = instanceIdentifier.firstKeyOf(Route.class); - final String mappedName = routesContext.getName(key.getId().intValue(), readContext.getMappingContext()); - final String protocolName = instanceIdentifier.firstKeyOf(RoutingProtocol.class).getName(); + final String protocolName = instanceIdentifier.firstKeyOf(ControlPlaneProtocol.class).getName(); + final String mappedName = namesFactory.uniqueRouteName(protocolName, key.getDestinationPrefix()); + final int protocolTableId = routingProtocolContext.getIndex(protocolName, readContext.getMappingContext()); final Optional<IpFibDetailsReplyDump> ipv4RoutesDump = ipv4RoutesDumpManager.getDump(instanceIdentifier, readContext.getModificationCache()); @@ -147,13 +154,16 @@ public class Ipv4RouteCustomizer if (opDetail.isPresent()) { final IpFibDetails detail = opDetail.get(); - routeBuilder.setNextHopOptions( + routeBuilder.setNextHop( resolveHopType(mappedName, Arrays.asList(detail.path), interfaceContext, routeHopContext, readContext.getMappingContext(), namesFactory)) .setKey(key) - .setId(key.getId()) .setDestinationPrefix(toIpv4Prefix(detail.address, toJavaByte(detail.addressLength))) - .setVppIpv4RouteState(new VppIpv4RouteStateBuilder().build()); + .addAugmentation(VppIpv4RouteAttributesAugmentation.class, + new VppIpv4RouteAttributesAugmentationBuilder() + .setVppIpv4Route(new VppIpv4RouteBuilder() + .build()) + .build()); } } } diff --git a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/Ipv6ReadRoutingNodes.java b/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/Ipv6ReadRoutingNodes.java deleted file mode 100644 index e37b4a05e..000000000 --- a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/Ipv6ReadRoutingNodes.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2016 Cisco and/or its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.fd.hc2vpp.routing.read; - -import com.google.common.collect.ImmutableSet; -import io.fd.hc2vpp.common.translate.util.JvppReplyConsumer; -import io.fd.hc2vpp.common.translate.util.MultiNamingContext; -import io.fd.hc2vpp.common.translate.util.NamingContext; -import io.fd.hc2vpp.routing.RoutingConfiguration; -import io.fd.honeycomb.translate.impl.read.GenericListReader; -import io.fd.honeycomb.translate.read.registry.ModifiableReaderRegistryBuilder; -import io.fd.honeycomb.translate.util.read.cache.DumpCacheManager; -import io.fd.vpp.jvpp.core.dto.Ip6FibDetailsReplyDump; -import io.fd.vpp.jvpp.core.dto.Ip6FibDump; -import io.fd.vpp.jvpp.core.future.FutureJVppCore; -import java.util.Set; -import javax.annotation.Nonnull; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev170917.StaticRoutes2; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev170917.StaticRoutes2Builder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev170917.routing.state.routing.instance.routing.protocols.routing.protocol._static.routes.Ipv6; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev170917.routing.state.routing.instance.routing.protocols.routing.protocol._static.routes.Ipv6Builder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev170917.routing.state.routing.instance.routing.protocols.routing.protocol._static.routes.ipv6.Route; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev170917.routing.state.routing.instance.routing.protocols.routing.protocol._static.routes.ipv6.route.VppIpv6RouteState; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev170917.routing.state.routing.instance.routing.protocols.routing.protocol._static.routes.ipv6.route.next.hop.options.next.hop.list.NextHopList; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev170917.routing.state.routing.instance.routing.protocols.routing.protocol._static.routes.ipv6.route.next.hop.options.next.hop.list.next.hop.list.NextHop; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev170917.routing.state.routing.instance.routing.protocols.routing.protocol._static.routes.ipv6.route.next.hop.options.table.lookup.TableLookupParams; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.state.routing.instance.routing.protocols.routing.protocol.StaticRoutes; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; - -interface Ipv6ReadRoutingNodes extends JvppReplyConsumer { - - static InstanceIdentifier<StaticRoutes2> staticRoutesInstanceIdentifier( - final InstanceIdentifier<StaticRoutes> staticRoutesInstanceIdentifier) { - return staticRoutesInstanceIdentifier.augmentation(StaticRoutes2.class); - } - - static InstanceIdentifier<Ipv6> ipv6Identifier( - final InstanceIdentifier<StaticRoutes2> staticRoutes2InstanceIdentifier) { - return staticRoutes2InstanceIdentifier.child(Ipv6.class); - } - - default DumpCacheManager<Ip6FibDetailsReplyDump, Void> newIpv6RoutesDumpManager( - @Nonnull final FutureJVppCore vppApi) { - return new DumpCacheManager.DumpCacheManagerBuilder<Ip6FibDetailsReplyDump, Void>() - .withExecutor( - (identifier, params) -> getReplyForRead( - vppApi.ip6FibDump(new Ip6FibDump()).toCompletableFuture(), identifier)) - .acceptOnly(Ip6FibDetailsReplyDump.class) - .build(); - } - - default void registerIpv6Routes(@Nonnull final InstanceIdentifier<StaticRoutes> subTreeId, - @Nonnull final ModifiableReaderRegistryBuilder registry, - @Nonnull final DumpCacheManager<Ip6FibDetailsReplyDump, Void> ipv6DumpManager, - @Nonnull final RoutingConfiguration configuration, - @Nonnull final MultiNamingContext routeHopContext, - @Nonnull final NamingContext interfaceContext, - @Nonnull final NamingContext routeContext, - @Nonnull final NamingContext routingProtocolContext) { - - final InstanceIdentifier<StaticRoutes2> staticRoutes2InstanceIdentifier = - staticRoutesInstanceIdentifier(subTreeId); - final InstanceIdentifier<Ipv6> ipv6InstanceIdentifier = ipv6Identifier(staticRoutes2InstanceIdentifier); - - registry.addStructuralReader(staticRoutes2InstanceIdentifier, StaticRoutes2Builder.class); - - registry.addStructuralReader(ipv6InstanceIdentifier, Ipv6Builder.class); - registry.subtreeAdd(ipv6RoutingHandledChildren(InstanceIdentifier.create(Route.class)), - new GenericListReader<>(ipv6InstanceIdentifier.child(Route.class), - new Ipv6RouteCustomizer(ipv6DumpManager, configuration, routeHopContext, interfaceContext, - routeContext, routingProtocolContext))); - } - - default Set<InstanceIdentifier<?>> ipv6RoutingHandledChildren( - final InstanceIdentifier<Route> parent) { - return ImmutableSet.of( - parent.child(TableLookupParams.class), - parent.child(NextHopList.class), - parent.child(NextHopList.class).child(NextHop.class), - parent.child(VppIpv6RouteState.class)); - } - -} diff --git a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/Ipv6RouteCustomizer.java b/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/Ipv6RouteCustomizer.java index a7ec37733..6003cf88b 100644 --- a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/Ipv6RouteCustomizer.java +++ b/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/Ipv6RouteCustomizer.java @@ -35,17 +35,19 @@ import java.util.Collections; import java.util.List; import java.util.stream.Collectors; import javax.annotation.Nonnull; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev170917.routing.state.routing.instance.routing.protocols.routing.protocol._static.routes.Ipv6Builder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev170917.routing.state.routing.instance.routing.protocols.routing.protocol._static.routes.ipv6.Route; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev170917.routing.state.routing.instance.routing.protocols.routing.protocol._static.routes.ipv6.RouteBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev170917.routing.state.routing.instance.routing.protocols.routing.protocol._static.routes.ipv6.RouteKey; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev170917.routing.state.routing.instance.routing.protocols.routing.protocol._static.routes.ipv6.route.VppIpv6RouteStateBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.state.routing.instance.routing.protocols.RoutingProtocol; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev180313.routing.control.plane.protocols.control.plane.protocol._static.routes.Ipv6Builder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev180313.routing.control.plane.protocols.control.plane.protocol._static.routes.ipv6.Route; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev180313.routing.control.plane.protocols.control.plane.protocol._static.routes.ipv6.RouteBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev180313.routing.control.plane.protocols.control.plane.protocol._static.routes.ipv6.RouteKey; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev180313.routing.control.plane.protocols.ControlPlaneProtocol; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.ipv6.unicast.routing.rev180319.VppIpv6RouteAttributesAugmentation; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.ipv6.unicast.routing.rev180319.VppIpv6RouteAttributesAugmentationBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.ipv6.unicast.routing.rev180319.routing.control.plane.protocols.control.plane.protocol._static.routes.ipv6.route.VppIpv6RouteBuilder; import org.opendaylight.yangtools.concepts.Builder; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -public class Ipv6RouteCustomizer +final class Ipv6RouteCustomizer implements ListReaderCustomizer<Route, RouteKey, RouteBuilder>, RouteMapper, Ipv6RoutePathParser { private final DumpCacheManager<Ip6FibDetailsReplyDump, Void> ipv6RoutesDumpManager; @@ -56,12 +58,12 @@ public class Ipv6RouteCustomizer private final NamingContext routingProtocolContext; private final Ipv6RouteNamesFactory namesFactory; - public Ipv6RouteCustomizer(@Nonnull final DumpCacheManager<Ip6FibDetailsReplyDump, Void> ipv6RoutesDumpManager, - @Nonnull final RoutingConfiguration configuration, - @Nonnull final MultiNamingContext routeHopContext, - @Nonnull final NamingContext interfaceContext, - @Nonnull final NamingContext routesContext, - @Nonnull final NamingContext routingProtocolContext) { + Ipv6RouteCustomizer(@Nonnull final DumpCacheManager<Ip6FibDetailsReplyDump, Void> ipv6RoutesDumpManager, + @Nonnull final RoutingConfiguration configuration, + @Nonnull final MultiNamingContext routeHopContext, + @Nonnull final NamingContext interfaceContext, + @Nonnull final NamingContext routesContext, + @Nonnull final NamingContext routingProtocolContext) { this.ipv6RoutesDumpManager = ipv6RoutesDumpManager; this.configuration = configuration; this.interfaceContext = interfaceContext; @@ -79,7 +81,7 @@ public class Ipv6RouteCustomizer final Optional<Ip6FibDetailsReplyDump> ipv6RoutesDump = ipv6RoutesDumpManager.getDump(instanceIdentifier, readContext.getModificationCache()); - final String protocolName = instanceIdentifier.firstKeyOf(RoutingProtocol.class).getName(); + final String protocolName = instanceIdentifier.firstKeyOf(ControlPlaneProtocol.class).getName(); final int protocolTableId = routingProtocolContext.getIndex(protocolName, readContext.getMappingContext()); return ipv6RoutesDump.isPresent() @@ -102,13 +104,18 @@ public class Ipv6RouteCustomizer if (!routesContext.containsIndex(learnedRouteName, mappingContext)) { routesContext.addName(learnedRouteName, mappingContext); } - return keyForName(mappingContext, learnedRouteName); + return keyForLearnedName(learnedRouteName); } - return keyForName(mappingContext, routeName); + return keyForName(routeName); } - private RouteKey keyForName(final MappingContext mappingContext, final String name) { - return new RouteKey(Long.valueOf(routesContext.getIndex(name, mappingContext))); + private RouteKey keyForName(final String name) { + return new RouteKey(namesFactory.ipv6PrefixFromUniqueRouteName(name)); + } + + private RouteKey keyForLearnedName(final String name) { + String learnedPrefix = configuration.getLearnedRouteNamePrefix() + "_"; + return new RouteKey(namesFactory.ipv6PrefixFromUniqueRouteName(name.replace(learnedPrefix, ""))); } @Override @@ -127,8 +134,8 @@ public class Ipv6RouteCustomizer @Nonnull final RouteBuilder routeBuilder, @Nonnull final ReadContext readContext) throws ReadFailedException { final RouteKey key = instanceIdentifier.firstKeyOf(Route.class); - final String mappedName = routesContext.getName(key.getId().intValue(), readContext.getMappingContext()); - final String protocolName = instanceIdentifier.firstKeyOf(RoutingProtocol.class).getName(); + final String protocolName = instanceIdentifier.firstKeyOf(ControlPlaneProtocol.class).getName(); + final String mappedName = namesFactory.uniqueRouteName(protocolName, key.getDestinationPrefix()); final int protocolTableId = routingProtocolContext.getIndex(protocolName, readContext.getMappingContext()); final Optional<Ip6FibDetailsReplyDump> ipv6RoutesDump = ipv6RoutesDumpManager.getDump(instanceIdentifier, readContext.getModificationCache()); @@ -144,13 +151,17 @@ public class Ipv6RouteCustomizer if (opDetail.isPresent()) { final Ip6FibDetails detail = opDetail.get(); - routeBuilder.setNextHopOptions( + routeBuilder.setNextHop( resolveHopType(mappedName, Arrays.asList(detail.path), interfaceContext, routeHopContext, readContext.getMappingContext(), namesFactory)) .setKey(key) - .setId(key.getId()) + .setDestinationPrefix(key.getDestinationPrefix()) .setDestinationPrefix(toIpv6Prefix(detail.address, toJavaByte(detail.addressLength))) - .setVppIpv6RouteState(new VppIpv6RouteStateBuilder().build()); + .addAugmentation(VppIpv6RouteAttributesAugmentation.class, + new VppIpv6RouteAttributesAugmentationBuilder() + .setVppIpv6Route(new VppIpv6RouteBuilder() + .build()) + .build()); } } } diff --git a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/RoutingInstanceCustomizer.java b/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/RoutingInstanceCustomizer.java deleted file mode 100644 index 78e869f9a..000000000 --- a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/RoutingInstanceCustomizer.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c) 2016 Cisco and/or its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.fd.hc2vpp.routing.read; - -import com.google.common.collect.ImmutableList; -import io.fd.hc2vpp.routing.RoutingConfiguration; -import io.fd.honeycomb.translate.read.ReadContext; -import io.fd.honeycomb.translate.read.ReadFailedException; -import io.fd.honeycomb.translate.spi.read.ListReaderCustomizer; -import java.util.List; -import javax.annotation.Nonnull; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.RoutingStateBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.StandardRoutingInstance; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.state.RoutingInstance; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.state.RoutingInstanceBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.state.RoutingInstanceKey; -import org.opendaylight.yangtools.concepts.Builder; -import org.opendaylight.yangtools.yang.binding.DataObject; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; - -/** - * Returns default instance of routing instance - */ -public class RoutingInstanceCustomizer - implements ListReaderCustomizer<RoutingInstance, RoutingInstanceKey, RoutingInstanceBuilder> { - - private RoutingInstanceKey defaultKey; - - public RoutingInstanceCustomizer(@Nonnull final RoutingConfiguration configuration) { - defaultKey = new RoutingInstanceKey(configuration.getDefaultRoutingInstanceName()); - } - - @Nonnull - @Override - public List<RoutingInstanceKey> getAllIds(@Nonnull final InstanceIdentifier<RoutingInstance> instanceIdentifier, - @Nonnull final ReadContext readContext) throws ReadFailedException { - return ImmutableList.of(defaultKey); - } - - @Override - public void merge(@Nonnull final Builder<? extends DataObject> builder, @Nonnull final List<RoutingInstance> list) { - RoutingStateBuilder.class.cast(builder).setRoutingInstance(list); - } - - @Nonnull - @Override - public RoutingInstanceBuilder getBuilder(@Nonnull final InstanceIdentifier<RoutingInstance> instanceIdentifier) { - return new RoutingInstanceBuilder(); - } - - @Override - public void readCurrentAttributes(@Nonnull final InstanceIdentifier<RoutingInstance> instanceIdentifier, - @Nonnull final RoutingInstanceBuilder routingInstanceBuilder, - @Nonnull final ReadContext readContext) throws ReadFailedException { - routingInstanceBuilder.setType(StandardRoutingInstance.class) - .setKey(defaultKey) - .setName(defaultKey.getName()); - } -} diff --git a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/RoutingReaderFactory.java b/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/RoutingReaderFactory.java new file mode 100644 index 000000000..9ec765c86 --- /dev/null +++ b/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/RoutingReaderFactory.java @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2016 Cisco and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.fd.hc2vpp.routing.read; + +import com.google.inject.Inject; +import com.google.inject.name.Named; +import io.fd.hc2vpp.common.translate.util.MultiNamingContext; +import io.fd.hc2vpp.common.translate.util.NamingContext; +import io.fd.hc2vpp.routing.Ipv4RoutingNodes; +import io.fd.hc2vpp.routing.Ipv6RoutingNodes; +import io.fd.hc2vpp.routing.RoutingConfiguration; +import io.fd.hc2vpp.routing.RoutingIIds; +import io.fd.honeycomb.translate.impl.read.GenericListReader; +import io.fd.honeycomb.translate.read.ReaderFactory; +import io.fd.honeycomb.translate.read.registry.ModifiableReaderRegistryBuilder; +import io.fd.honeycomb.translate.util.read.cache.DumpCacheManager; +import io.fd.vpp.jvpp.core.dto.Ip6FibDetailsReplyDump; +import io.fd.vpp.jvpp.core.dto.Ip6FibDump; +import io.fd.vpp.jvpp.core.dto.IpFibDetailsReplyDump; +import io.fd.vpp.jvpp.core.dto.IpFibDump; +import io.fd.vpp.jvpp.core.future.FutureJVppCore; +import javax.annotation.Nonnull; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev180313.StaticRoutes1; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev180313.StaticRoutes1Builder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev180313.routing.control.plane.protocols.control.plane.protocol._static.routes.Ipv4; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev180313.routing.control.plane.protocols.control.plane.protocol._static.routes.Ipv4Builder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev180313.routing.control.plane.protocols.control.plane.protocol._static.routes.ipv4.Route; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev180313.routing.control.plane.protocols.control.plane.protocol._static.routes.Ipv6; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev180313.routing.control.plane.protocols.control.plane.protocol._static.routes.Ipv6Builder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev180313.RoutingBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev180313.routing.ControlPlaneProtocolsBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev180313.routing.control.plane.protocols.control.plane.protocol.StaticRoutesBuilder; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +/** + * Factory producing readers for routing plugin's data. + */ +public final class RoutingReaderFactory implements ReaderFactory, Ipv4RoutingNodes, Ipv6RoutingNodes { + + @Inject + private RoutingConfiguration configuration; + + @Inject + @Named("interface-context") + private NamingContext interfaceContext; + + @Inject + @Named(RoutingConfiguration.ROUTING_PROTOCOL_CONTEXT) + private NamingContext routingProtocolContext; + + @Inject + @Named(RoutingConfiguration.ROUTE_CONTEXT) + private NamingContext routeContext; + + @Inject + @Named(RoutingConfiguration.ROUTE_HOP_CONTEXT) + private MultiNamingContext routeHopContext; + + @Inject + private FutureJVppCore vppApi; + + @Override + public void init(@Nonnull final ModifiableReaderRegistryBuilder registry) { + final DumpCacheManager<IpFibDetailsReplyDump, Void> ipv4DumpManager = newIpv4RoutesDumpManager(vppApi); + final DumpCacheManager<Ip6FibDetailsReplyDump, Void> ipv6DumpManager = newIpv6RoutesDumpManager(vppApi); + + registry.addStructuralReader(RoutingIIds.ROUTING, RoutingBuilder.class); + registry.addStructuralReader(RoutingIIds.RT_CPS, ControlPlaneProtocolsBuilder.class); + registry.add(new GenericListReader<>(RoutingIIds.RT_CPS_CP, + new ControlPlaneProtocolCustomizer(routingProtocolContext, + ipv4DumpManager, + ipv6DumpManager))); + registry.addStructuralReader(RoutingIIds.RT_CPS_CP_SR, StaticRoutesBuilder.class); + + registerIpv4RoutesReaders(registry, ipv4DumpManager, configuration, routeHopContext, + interfaceContext, routeContext, routingProtocolContext); + registerIpv6RoutesReaders(registry, ipv6DumpManager, configuration, routeHopContext, + interfaceContext, routeContext, routingProtocolContext); + } + + private static InstanceIdentifier<Ipv4> ipv4Identifier( + final InstanceIdentifier<StaticRoutes1> staticRoutes2InstanceIdentifier) { + return staticRoutes2InstanceIdentifier.child(Ipv4.class); + } + + private static InstanceIdentifier<Ipv6> ipv6Identifier( + final InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev180313.StaticRoutes1> staticRoutes2InstanceIdentifier) { + return staticRoutes2InstanceIdentifier.child(Ipv6.class); + } + + private static InstanceIdentifier<StaticRoutes1> staticRoutesIpv4Iid() { + return RoutingIIds.RT_CPS_CP_SR.augmentation(StaticRoutes1.class); + } + + private static InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev180313.StaticRoutes1> staticRoutesIpv6Iid() { + return RoutingIIds.RT_CPS_CP_SR.augmentation( + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev180313.StaticRoutes1.class); + } + + private DumpCacheManager<IpFibDetailsReplyDump, Void> newIpv4RoutesDumpManager( + @Nonnull final FutureJVppCore vppApi) { + return new DumpCacheManager.DumpCacheManagerBuilder<IpFibDetailsReplyDump, Void>() + .withExecutor( + (identifier, params) -> getReplyForRead(vppApi.ipFibDump(new IpFibDump()).toCompletableFuture(), + identifier)) + .acceptOnly(IpFibDetailsReplyDump.class) + .build(); + } + + private DumpCacheManager<Ip6FibDetailsReplyDump, Void> newIpv6RoutesDumpManager( + @Nonnull final FutureJVppCore vppApi) { + return new DumpCacheManager.DumpCacheManagerBuilder<Ip6FibDetailsReplyDump, Void>() + .withExecutor( + (identifier, params) -> getReplyForRead( + vppApi.ip6FibDump(new Ip6FibDump()).toCompletableFuture(), identifier)) + .acceptOnly(Ip6FibDetailsReplyDump.class) + .build(); + } + + private void registerIpv4RoutesReaders(@Nonnull final ModifiableReaderRegistryBuilder registry, + @Nonnull final DumpCacheManager<IpFibDetailsReplyDump, Void> ipv4DumpManager, + @Nonnull final RoutingConfiguration configuration, + @Nonnull final MultiNamingContext routeHopContext, + @Nonnull final NamingContext interfaceContext, + @Nonnull final NamingContext routeContext, + @Nonnull final NamingContext routingProtocolContext) { + + final InstanceIdentifier<StaticRoutes1> staticRoutes2InstanceIdentifier = + staticRoutesIpv4Iid(); + final InstanceIdentifier<Ipv4> ipv4InstanceIdentifier = ipv4Identifier(staticRoutes2InstanceIdentifier); + + registry.addStructuralReader(staticRoutes2InstanceIdentifier, StaticRoutes1Builder.class); + + registry.addStructuralReader(ipv4InstanceIdentifier, Ipv4Builder.class); + registry.subtreeAdd(ipv4RoutingHandledChildren(InstanceIdentifier.create(Route.class)), + new GenericListReader<>(ipv4InstanceIdentifier.child(Route.class), + new Ipv4RouteCustomizer(ipv4DumpManager, configuration, + routeHopContext, interfaceContext, + routeContext, routingProtocolContext))); + } + + private void registerIpv6RoutesReaders(@Nonnull final ModifiableReaderRegistryBuilder registry, + @Nonnull final DumpCacheManager<Ip6FibDetailsReplyDump, Void> ipv6DumpManager, + @Nonnull final RoutingConfiguration configuration, + @Nonnull final MultiNamingContext routeHopContext, + @Nonnull final NamingContext interfaceContext, + @Nonnull final NamingContext routeContext, + @Nonnull final NamingContext routingProtocolContext) { + + final InstanceIdentifier<Ipv6> ipv6InstanceIdentifier = ipv6Identifier(staticRoutesIpv6Iid()); + + registry.addStructuralReader(staticRoutesIpv6Iid(), + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev180313.StaticRoutes1Builder.class); + registry.addStructuralReader(ipv6InstanceIdentifier, Ipv6Builder.class); + registry.subtreeAdd(ipv6RoutingHandledChildren(InstanceIdentifier.create( + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev180313.routing.control.plane.protocols.control.plane.protocol._static.routes.ipv6.Route.class)), + new GenericListReader<>(ipv6InstanceIdentifier.child( + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev180313.routing.control.plane.protocols.control.plane.protocol._static.routes.ipv6.Route.class), + new Ipv6RouteCustomizer(ipv6DumpManager, configuration, + routeHopContext, interfaceContext, + routeContext, routingProtocolContext))); + } +} diff --git a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/RoutingStateCustomizer.java b/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/RoutingStateCustomizer.java deleted file mode 100644 index ce88825b7..000000000 --- a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/RoutingStateCustomizer.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright (c) 2016 Cisco and/or its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.fd.hc2vpp.routing.read; - -import io.fd.hc2vpp.routing.write.Ipv4WriteRoutingNodes; -import io.fd.hc2vpp.routing.write.Ipv6WriteRoutingNodes; -import io.fd.honeycomb.translate.read.ReadContext; -import io.fd.honeycomb.translate.read.ReadFailedException; -import io.fd.honeycomb.translate.spi.read.Initialized; -import io.fd.honeycomb.translate.spi.read.InitializingReaderCustomizer; -import java.util.List; -import java.util.stream.Collectors; -import javax.annotation.Nonnull; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.Routing; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.RoutingBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.RoutingState; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.RoutingStateBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.StandardRoutingInstance; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.RoutingInstance; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.RoutingInstanceBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.routing.instance.RoutingProtocols; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.routing.instance.RoutingProtocolsBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.routing.instance.routing.protocols.RoutingProtocol; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.routing.instance.routing.protocols.RoutingProtocolBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.routing.instance.routing.protocols.routing.protocol.StaticRoutes; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.routing.instance.routing.protocols.routing.protocol.StaticRoutesBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev170917.RoutingProtocolStateVppAttr; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev170917.RoutingProtocolVppAttr; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev170917.RoutingProtocolVppAttrBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev170917.routing.routing.instance.routing.protocols.routing.protocol.VppProtocolAttributesBuilder; -import org.opendaylight.yangtools.concepts.Builder; -import org.opendaylight.yangtools.yang.binding.DataObject; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class RoutingStateCustomizer - implements InitializingReaderCustomizer<RoutingState, RoutingStateBuilder>, Ipv4WriteRoutingNodes { - - private static final Logger LOG = LoggerFactory.getLogger(RoutingStateCustomizer.class); - - private static RoutingInstance mapRoutingInstances( - final org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.state.RoutingInstance state) { - return new RoutingInstanceBuilder() - .setName(state.getName()) - .setEnabled(true) - .setRouterId(state.getRouterId()) - .setType(StandardRoutingInstance.class) - .setRoutingProtocols(RoutingStateCustomizer.mapRoutingProtocols(state.getRoutingProtocols())) - .build(); - } - - private static RoutingProtocols mapRoutingProtocols( - final org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.state.routing.instance.RoutingProtocols state) { - - if (state != null) { - return new RoutingProtocolsBuilder() - .setRoutingProtocol(state.getRoutingProtocol() != null - ? RoutingStateCustomizer.mapRoutingProtocol(state.getRoutingProtocol()) - : null) - .build(); - } else { - return null; - } - } - - private static List<RoutingProtocol> mapRoutingProtocol( - final List<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.state.routing.instance.routing.protocols.RoutingProtocol> state) { - return state.stream() - .map(routingProtocol -> new RoutingProtocolBuilder() - .setName(routingProtocol.getName()) - .setEnabled(true) - .setType(routingProtocol.getType()) - .setStaticRoutes(RoutingStateCustomizer.mapStaticRoutes(routingProtocol.getStaticRoutes())) - .addAugmentation(RoutingProtocolVppAttr.class, - mapVppAttr(routingProtocol.getAugmentation(RoutingProtocolStateVppAttr.class))) - .build()) - .collect(Collectors.toList()); - } - - private static RoutingProtocolVppAttr mapVppAttr(final RoutingProtocolStateVppAttr attrState) { - return new RoutingProtocolVppAttrBuilder() - .setVppProtocolAttributes(attrState.getVppProtocolStateAttributes() == null - ? null - : - new VppProtocolAttributesBuilder() - .setPrimaryVrf(attrState.getVppProtocolStateAttributes().getPrimaryVrf()) - .build()) - .build(); - } - - private static StaticRoutes mapStaticRoutes( - final org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.state.routing.instance.routing.protocols.routing.protocol.StaticRoutes state) { - return new StaticRoutesBuilder() - .addAugmentation(CONFIG_IPV4_AUG_CLASS, - Ipv4WriteRoutingNodes.INSTANCE.mapIpv4Augmentation(state.getAugmentation(STATE_IPV4_AUG_CLASS))) - .addAugmentation(Ipv6WriteRoutingNodes.CONFIG_IPV6_AUG_CLASS, - Ipv6WriteRoutingNodes.INSTANCE.mapIpv6Augmentation(state.getAugmentation( - Ipv6WriteRoutingNodes.STATE_IPV6_AUG_CLASS))) - .build(); - } - - @Nonnull - @Override - public RoutingStateBuilder getBuilder(@Nonnull final InstanceIdentifier<RoutingState> instanceIdentifier) { - return new RoutingStateBuilder(); - } - - @Override - public void readCurrentAttributes(@Nonnull final InstanceIdentifier<RoutingState> instanceIdentifier, - @Nonnull final RoutingStateBuilder routingStateBuilder, - @Nonnull final ReadContext readContext) throws ReadFailedException { - // does nothing - LOG.info("Reading {}", instanceIdentifier); - } - - @Override - public void merge(@Nonnull final Builder<? extends DataObject> builder, @Nonnull final RoutingState routingState) { - //Routing state is root - } - - @Nonnull - @Override - public Initialized<? extends DataObject> init(@Nonnull final InstanceIdentifier<RoutingState> id, - @Nonnull final RoutingState readValue, - @Nonnull final ReadContext ctx) { - - return Initialized.create(InstanceIdentifier.create(Routing.class), new RoutingBuilder() - .setRoutingInstance(readValue.getRoutingInstance() - .stream() - .map(routingInstance -> mapRoutingInstances(routingInstance)) - .collect(Collectors.toList())) - .build()); - } -} diff --git a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/RoutingStateReaderFactory.java b/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/RoutingStateReaderFactory.java deleted file mode 100644 index ad0bf7494..000000000 --- a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/read/RoutingStateReaderFactory.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (c) 2016 Cisco and/or its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.fd.hc2vpp.routing.read; - -import com.google.common.collect.ImmutableSet; -import com.google.inject.Inject; -import com.google.inject.name.Named; -import io.fd.hc2vpp.common.translate.util.MultiNamingContext; -import io.fd.hc2vpp.common.translate.util.NamingContext; -import io.fd.hc2vpp.routing.RoutingConfiguration; -import io.fd.honeycomb.translate.impl.read.GenericListReader; -import io.fd.honeycomb.translate.impl.read.GenericReader; -import io.fd.honeycomb.translate.read.ReaderFactory; -import io.fd.honeycomb.translate.read.registry.ModifiableReaderRegistryBuilder; -import io.fd.honeycomb.translate.util.read.cache.DumpCacheManager; -import io.fd.vpp.jvpp.core.dto.Ip6FibDetailsReplyDump; -import io.fd.vpp.jvpp.core.dto.IpFibDetailsReplyDump; -import io.fd.vpp.jvpp.core.future.FutureJVppCore; -import javax.annotation.Nonnull; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.RoutingState; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.state.RoutingInstance; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.state.routing.instance.RoutingProtocols; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.state.routing.instance.RoutingProtocolsBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.state.routing.instance.routing.protocols.RoutingProtocol; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.state.routing.instance.routing.protocols.routing.protocol.StaticRoutes; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.state.routing.instance.routing.protocols.routing.protocol.StaticRoutesBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev170917.RoutingProtocolStateVppAttr; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev170917.routing.state.routing.instance.routing.protocols.routing.protocol.VppProtocolStateAttributes; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; - -/** - * Factory producing readers for routing plugin's data. - */ -public final class RoutingStateReaderFactory implements ReaderFactory, Ipv4ReadRoutingNodes, Ipv6ReadRoutingNodes { - - private static final InstanceIdentifier<RoutingState> ROOT_STATE_CONTAINER_ID = - InstanceIdentifier.create(RoutingState.class); - - @Inject - private RoutingConfiguration configuration; - - @Inject - @Named("interface-context") - private NamingContext interfaceContext; - - @Inject - @Named(RoutingConfiguration.ROUTING_PROTOCOL_CONTEXT) - private NamingContext routingProtocolContext; - - @Inject - @Named(RoutingConfiguration.ROUTE_CONTEXT) - private NamingContext routeContext; - - @Inject - @Named(RoutingConfiguration.ROUTE_HOP_CONTEXT) - private MultiNamingContext routeHopContext; - - @Inject - private FutureJVppCore vppApi; - - @Override - public void init(@Nonnull final ModifiableReaderRegistryBuilder registry) { - final DumpCacheManager<IpFibDetailsReplyDump, Void> ipv4DumpManager = newIpv4RoutesDumpManager(vppApi); - final DumpCacheManager<Ip6FibDetailsReplyDump, Void> ipv6DumpManager = newIpv6RoutesDumpManager(vppApi); - - final InstanceIdentifier<RoutingInstance> routingInstanceInstanceIdentifier = - routingInstanceIdentifier(ROOT_STATE_CONTAINER_ID); - final InstanceIdentifier<RoutingProtocols> routingProtocolsInstanceIdentifier = - routingProtocolsId(routingInstanceInstanceIdentifier); - final InstanceIdentifier<RoutingProtocol> routingProtocolInstanceIdentifier = - routingProtocolInstanceIdentifier(routingProtocolsInstanceIdentifier); - final InstanceIdentifier<StaticRoutes> staticRoutesInstanceIdentifier = - staticRoutesInstanceIdentifier(routingProtocolInstanceIdentifier); - - // RoutingState - registry.add(new GenericReader<>(ROOT_STATE_CONTAINER_ID, new RoutingStateCustomizer())); - // RoutingInstance - registry.add(new GenericListReader<>(routingInstanceInstanceIdentifier, - new RoutingInstanceCustomizer(configuration))); - - // RoutingProtocols - registry.addStructuralReader(routingProtocolsInstanceIdentifier, RoutingProtocolsBuilder.class); - - // RoutingProtocol - registry.subtreeAdd(routingProtocolHandledChildren(), new GenericListReader<>(routingProtocolInstanceIdentifier, - new RoutingProtocolCustomizer(routingProtocolContext, ipv4DumpManager, ipv6DumpManager))); - - // StaticRoutes - registry.addStructuralReader(staticRoutesInstanceIdentifier, StaticRoutesBuilder.class); - - registerIpv4Routes(staticRoutesInstanceIdentifier, registry, ipv4DumpManager, configuration, routeHopContext, - interfaceContext, routeContext, routingProtocolContext); - registerIpv6Routes(staticRoutesInstanceIdentifier, registry, ipv6DumpManager, configuration, routeHopContext, - interfaceContext, routeContext, routingProtocolContext); - } - - private static ImmutableSet<InstanceIdentifier<?>> routingProtocolHandledChildren() { - return ImmutableSet - .of(InstanceIdentifier.create(RoutingProtocol.class).augmentation(RoutingProtocolStateVppAttr.class) - .child(VppProtocolStateAttributes.class)); - } - - private InstanceIdentifier<StaticRoutes> staticRoutesInstanceIdentifier( - final InstanceIdentifier<RoutingProtocol> routingProtocolInstanceIdentifier) { - return routingProtocolInstanceIdentifier.child(StaticRoutes.class); - } - - private InstanceIdentifier<RoutingProtocol> routingProtocolInstanceIdentifier( - final InstanceIdentifier<RoutingProtocols> routingProtocolsInstanceIdentifier) { - return routingProtocolsInstanceIdentifier.child(RoutingProtocol.class); - } - - private InstanceIdentifier<RoutingProtocols> routingProtocolsId( - final InstanceIdentifier<RoutingInstance> routingInstanceInstanceIdentifier) { - return routingInstanceInstanceIdentifier.child(RoutingProtocols.class); - } - - private InstanceIdentifier<RoutingInstance> routingInstanceIdentifier( - final InstanceIdentifier<RoutingState> routingStateId) { - return routingStateId.child(RoutingInstance.class); - } -} |