055f38ae8bfe6e611c561d02033031a3d39dfd0d
[hc2vpp.git] /
1 /*
2  * Copyright (c) 2017 Cisco and/or its affiliates.
3  *
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:
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 package io.fd.hc2vpp.lisp.gpe.translate.read;
18
19 import static io.fd.honeycomb.translate.util.read.cache.EntityDumpExecutor.NO_PARAMS;
20
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;
49
50 public class NativeForwardPathsTableCustomizer extends FutureJVppCustomizer implements
51         InitializingListReaderCustomizer<NativeForwardPathsTable, NativeForwardPathsTableKey, NativeForwardPathsTableBuilder>,
52         JvppReplyConsumer {
53
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;
61
62     public NativeForwardPathsTableCustomizer(@Nonnull final FutureJVppCore futureJVppCore) {
63         super(futureJVppCore);
64
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(),
71                         identifier)).build();
72
73         dumpCacheManagerV6 = new DumpCacheManagerBuilder<Ip6FibDetailsReplyDump, Void>()
74                 .acceptOnly(Ip6FibDetailsReplyDump.class)
75                 .withExecutor((identifier, params) -> getReplyForRead(
76                         getFutureJVpp().ip6FibDump(REQUEST_V6).toCompletableFuture(),
77                         identifier)).build();
78     }
79
80     @Nonnull
81     @Override
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
86                 cfgValue =
87                 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables.NativeForwardPathsTableBuilder()
88                         .setTableId(readValue.getTableId())
89                         .build();
90
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(
95                                 cfgValue.getKey()));
96
97         return Initialized.create(cfgKey, cfgValue);
98     }
99
100     @Nonnull
101     @Override
102     public List<NativeForwardPathsTableKey> getAllIds(@Nonnull final InstanceIdentifier<NativeForwardPathsTable> id,
103                                                       @Nonnull final ReadContext context) throws ReadFailedException {
104
105         return Stream.concat(v4FibsStream(id, context), v6FibsStream(id, context))
106                 .mapToLong(UnsignedInts::toLong)
107                 .distinct()
108                 .mapToObj(NativeForwardPathsTableKey::new)
109                 .collect(Collectors.toList());
110     }
111
112
113     @Override
114     public void merge(@Nonnull final Builder<? extends DataObject> builder,
115                       @Nonnull final List<NativeForwardPathsTable> readData) {
116         ((NativeForwardPathsTablesStateBuilder) builder).setNativeForwardPathsTable(readData);
117     }
118
119     @Nonnull
120     @Override
121     public NativeForwardPathsTableBuilder getBuilder(@Nonnull final InstanceIdentifier<NativeForwardPathsTable> id) {
122         return new NativeForwardPathsTableBuilder();
123     }
124
125     @Override
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();
131
132         final OptionalLong optionalTable = Stream.concat(v4FibsStream(id, ctx), v6FibsStream(id, ctx))
133                 .mapToLong(UnsignedInts::toLong)
134                 .distinct()
135                 .filter(tblId -> tblId == tableId)
136                 .findAny();
137
138         if (optionalTable.isPresent()) {
139             final long existingTableId = optionalTable.getAsLong();
140             builder.setTableId(existingTableId);
141             builder.setKey(new NativeForwardPathsTableKey(existingTableId));
142         }
143     }
144
145     private Stream<Integer> v4FibsStream(final InstanceIdentifier<NativeForwardPathsTable> id,
146                                          final ReadContext ctx) throws ReadFailedException {
147
148         return dumpCacheManagerV4.getDump(id, ctx.getModificationCache(), NO_PARAMS).or(DEFAULT_REPLY_V4)
149                 .ipFibDetails.stream()
150                 .map(ipFibDetails -> ipFibDetails.tableId);
151     }
152
153     private Stream<Integer> v6FibsStream(final InstanceIdentifier<NativeForwardPathsTable> id,
154                                          final ReadContext ctx) throws ReadFailedException {
155
156         return dumpCacheManagerV6.getDump(id, ctx.getModificationCache(), NO_PARAMS).or(DEFAULT_REPLY_V6)
157                 .ip6FibDetails.stream()
158                 .map(ip6FibDetails -> ip6FibDetails.tableId);
159     }
160 }