2 * Copyright (c) 2017 Cisco and/or its affiliates.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at:
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package io.fd.hc2vpp.lisp.gpe.translate.read;
19 import static io.fd.honeycomb.translate.util.read.cache.EntityDumpExecutor.NO_PARAMS;
21 import com.google.common.primitives.UnsignedInts;
22 import io.fd.hc2vpp.common.translate.util.FutureJVppCustomizer;
23 import io.fd.hc2vpp.common.translate.util.JvppReplyConsumer;
24 import io.fd.honeycomb.translate.read.ReadContext;
25 import io.fd.honeycomb.translate.read.ReadFailedException;
26 import io.fd.honeycomb.translate.spi.read.Initialized;
27 import io.fd.honeycomb.translate.spi.read.InitializingListReaderCustomizer;
28 import io.fd.honeycomb.translate.util.read.cache.DumpCacheManager;
29 import io.fd.honeycomb.translate.util.read.cache.DumpCacheManager.DumpCacheManagerBuilder;
30 import io.fd.vpp.jvpp.core.dto.Ip6FibDetailsReplyDump;
31 import io.fd.vpp.jvpp.core.dto.Ip6FibDump;
32 import io.fd.vpp.jvpp.core.dto.IpFibDetailsReplyDump;
33 import io.fd.vpp.jvpp.core.dto.IpFibDump;
34 import io.fd.vpp.jvpp.core.future.FutureJVppCore;
35 import java.util.List;
36 import java.util.OptionalLong;
37 import java.util.stream.Collectors;
38 import java.util.stream.Stream;
39 import javax.annotation.Nonnull;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.NativeForwardPathsTables;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.NativeForwardPathsTablesStateBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables.state.NativeForwardPathsTable;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables.state.NativeForwardPathsTableBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables.state.NativeForwardPathsTableKey;
45 import org.opendaylight.yangtools.concepts.Builder;
46 import org.opendaylight.yangtools.yang.binding.DataObject;
47 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
48 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
50 public class NativeForwardPathsTableCustomizer extends FutureJVppCustomizer implements
51 InitializingListReaderCustomizer<NativeForwardPathsTable, NativeForwardPathsTableKey, NativeForwardPathsTableBuilder>,
54 // no need to recreate, has no params
55 private static final IpFibDump REQUEST_V4 = new IpFibDump();
56 private static final Ip6FibDump REQUEST_V6 = new Ip6FibDump();
57 private static final IpFibDetailsReplyDump DEFAULT_REPLY_V4 = new IpFibDetailsReplyDump();
58 private static final Ip6FibDetailsReplyDump DEFAULT_REPLY_V6 = new Ip6FibDetailsReplyDump();
59 private DumpCacheManager<IpFibDetailsReplyDump, Void> dumpCacheManagerV4;
60 private DumpCacheManager<Ip6FibDetailsReplyDump, Void> dumpCacheManagerV6;
62 public NativeForwardPathsTableCustomizer(@Nonnull final FutureJVppCore futureJVppCore) {
63 super(futureJVppCore);
65 // there's no lisp specific dump for tables created by gpe_add_del_iface,
66 // so have to use standard fib dump
67 dumpCacheManagerV4 = new DumpCacheManagerBuilder<IpFibDetailsReplyDump, Void>()
68 .acceptOnly(IpFibDetailsReplyDump.class)
69 .withExecutor((identifier, params) -> getReplyForRead(
70 getFutureJVpp().ipFibDump(REQUEST_V4).toCompletableFuture(),
73 dumpCacheManagerV6 = new DumpCacheManagerBuilder<Ip6FibDetailsReplyDump, Void>()
74 .acceptOnly(Ip6FibDetailsReplyDump.class)
75 .withExecutor((identifier, params) -> getReplyForRead(
76 getFutureJVpp().ip6FibDump(REQUEST_V6).toCompletableFuture(),
82 public Initialized<? extends DataObject> init(@Nonnull final InstanceIdentifier<NativeForwardPathsTable> id,
83 @Nonnull final NativeForwardPathsTable readValue,
84 @Nonnull final ReadContext ctx) {
85 final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables.NativeForwardPathsTable
87 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables.NativeForwardPathsTableBuilder()
88 .setTableId(readValue.getTableId())
91 final KeyedInstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables.NativeForwardPathsTable, org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables.NativeForwardPathsTableKey>
92 cfgKey = InstanceIdentifier.create(NativeForwardPathsTables.class)
93 .child(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables.NativeForwardPathsTable.class,
94 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables.NativeForwardPathsTableKey(
97 return Initialized.create(cfgKey, cfgValue);
102 public List<NativeForwardPathsTableKey> getAllIds(@Nonnull final InstanceIdentifier<NativeForwardPathsTable> id,
103 @Nonnull final ReadContext context) throws ReadFailedException {
105 return Stream.concat(v4FibsStream(id, context), v6FibsStream(id, context))
106 .mapToLong(UnsignedInts::toLong)
108 .mapToObj(NativeForwardPathsTableKey::new)
109 .collect(Collectors.toList());
114 public void merge(@Nonnull final Builder<? extends DataObject> builder,
115 @Nonnull final List<NativeForwardPathsTable> readData) {
116 ((NativeForwardPathsTablesStateBuilder) builder).setNativeForwardPathsTable(readData);
121 public NativeForwardPathsTableBuilder getBuilder(@Nonnull final InstanceIdentifier<NativeForwardPathsTable> id) {
122 return new NativeForwardPathsTableBuilder();
126 public void readCurrentAttributes(@Nonnull final InstanceIdentifier<NativeForwardPathsTable> id,
127 @Nonnull final NativeForwardPathsTableBuilder builder,
128 @Nonnull final ReadContext ctx)
129 throws ReadFailedException {
130 final Long tableId = id.firstKeyOf(NativeForwardPathsTable.class).getTableId();
132 final OptionalLong optionalTable = Stream.concat(v4FibsStream(id, ctx), v6FibsStream(id, ctx))
133 .mapToLong(UnsignedInts::toLong)
135 .filter(tblId -> tblId == tableId)
138 if (optionalTable.isPresent()) {
139 final long existingTableId = optionalTable.getAsLong();
140 builder.setTableId(existingTableId);
141 builder.setKey(new NativeForwardPathsTableKey(existingTableId));
145 private Stream<Integer> v4FibsStream(final InstanceIdentifier<NativeForwardPathsTable> id,
146 final ReadContext ctx) throws ReadFailedException {
148 return dumpCacheManagerV4.getDump(id, ctx.getModificationCache(), NO_PARAMS).or(DEFAULT_REPLY_V4)
149 .ipFibDetails.stream()
150 .map(ipFibDetails -> ipFibDetails.tableId);
153 private Stream<Integer> v6FibsStream(final InstanceIdentifier<NativeForwardPathsTable> id,
154 final ReadContext ctx) throws ReadFailedException {
156 return dumpCacheManagerV6.getDump(id, ctx.getModificationCache(), NO_PARAMS).or(DEFAULT_REPLY_V6)
157 .ip6FibDetails.stream()
158 .map(ip6FibDetails -> ip6FibDetails.tableId);