49047bcc97fd163cfcb2030048f070255467804e
[honeycomb.git] / lisp / lisp2vpp / src / main / java / io / fd / honeycomb / lisp / translate / read / VniTableCustomizer.java
1 /*
2  * Copyright (c) 2016 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.honeycomb.lisp.translate.read;
18
19 import static com.google.common.base.Preconditions.checkState;
20 import static io.fd.honeycomb.translate.util.read.cache.EntityDumpExecutor.NO_PARAMS;
21
22 import com.google.common.base.Optional;
23 import io.fd.honeycomb.translate.read.ReadContext;
24 import io.fd.honeycomb.translate.read.ReadFailedException;
25 import io.fd.honeycomb.translate.spi.read.ListReaderCustomizer;
26 import io.fd.honeycomb.translate.util.RWUtils;
27 import io.fd.honeycomb.translate.util.read.cache.DumpCacheManager;
28 import io.fd.honeycomb.translate.vpp.util.FutureJVppCustomizer;
29 import io.fd.honeycomb.translate.vpp.util.JvppReplyConsumer;
30 import io.fd.vpp.jvpp.core.dto.LispEidTableVniDetails;
31 import io.fd.vpp.jvpp.core.dto.LispEidTableVniDetailsReplyDump;
32 import io.fd.vpp.jvpp.core.dto.LispEidTableVniDump;
33 import io.fd.vpp.jvpp.core.future.FutureJVppCore;
34 import java.util.Collections;
35 import java.util.List;
36 import java.util.stream.Collectors;
37 import javax.annotation.Nonnull;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.eid.table.grouping.EidTableBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.eid.table.grouping.eid.table.VniTable;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.eid.table.grouping.eid.table.VniTableBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.eid.table.grouping.eid.table.VniTableKey;
42 import org.opendaylight.yangtools.concepts.Builder;
43 import org.opendaylight.yangtools.yang.binding.DataObject;
44 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
45 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory;
47
48 /**
49  * Handles the reads of {@link VniTable} nodes
50  */
51 public class VniTableCustomizer extends FutureJVppCustomizer
52         implements ListReaderCustomizer<VniTable, VniTableKey, VniTableBuilder>, JvppReplyConsumer {
53
54     private static final Logger LOG = LoggerFactory.getLogger(VniTableCustomizer.class);
55
56     private final DumpCacheManager<LispEidTableVniDetailsReplyDump, Void> dumpManager;
57
58     public VniTableCustomizer(@Nonnull final FutureJVppCore futureJvpp) {
59         super(futureJvpp);
60         this.dumpManager = new DumpCacheManager.DumpCacheManagerBuilder<LispEidTableVniDetailsReplyDump, Void>()
61                 .withExecutor(((identifier, params) -> getReplyForRead(
62                         futureJvpp.lispEidTableVniDump(new LispEidTableVniDump()).toCompletableFuture(), identifier)))
63                 .build();
64     }
65
66     private static VniTableKey detailsToKey(final LispEidTableVniDetails lispEidTableMapDetails) {
67         return new VniTableKey(Integer.valueOf(lispEidTableMapDetails.vni).longValue());
68
69     }
70
71     @Override
72     public void merge(@Nonnull final Builder<? extends DataObject> builder, @Nonnull final List<VniTable> readData) {
73         ((EidTableBuilder) builder).setVniTable(readData);
74     }
75
76     @Nonnull
77     @Override
78     public VniTableBuilder getBuilder(@Nonnull final InstanceIdentifier<VniTable> id) {
79         return new VniTableBuilder();
80     }
81
82     @Nonnull
83     @Override
84     public List<VniTableKey> getAllIds(@Nonnull final InstanceIdentifier<VniTable> id,
85                                        @Nonnull final ReadContext context)
86             throws ReadFailedException {
87         LOG.trace("Reading all IDS...");
88
89         final Optional<LispEidTableVniDetailsReplyDump> optionalReply =
90                 dumpManager.getDump(id, context.getModificationCache(), NO_PARAMS);
91
92         if (!optionalReply.isPresent() || optionalReply.get().lispEidTableVniDetails.isEmpty()) {
93             return Collections.emptyList();
94         }
95
96         return optionalReply.get().lispEidTableVniDetails.stream().map(VniTableCustomizer::detailsToKey)
97                 .collect(Collectors.toList());
98     }
99
100     @Override
101     public void readCurrentAttributes(@Nonnull final InstanceIdentifier<VniTable> id,
102                                       @Nonnull final VniTableBuilder builder, @Nonnull final ReadContext ctx)
103             throws ReadFailedException {
104
105         checkState(id.firstKeyOf(VniTable.class) != null, "No VNI present");
106         VniTableKey key = new VniTableKey(id.firstKeyOf(VniTable.class).getVirtualNetworkIdentifier());
107
108         final Optional<LispEidTableVniDetailsReplyDump> optionalReply =
109                 dumpManager.getDump(id, ctx.getModificationCache(), NO_PARAMS);
110
111         if (!optionalReply.isPresent() || optionalReply.get().lispEidTableVniDetails.isEmpty()) {
112             return;
113         }
114
115         //transforming right away to single detail(specific request should do the magic)
116         final LispEidTableVniDetails details = optionalReply.get()
117                 .lispEidTableVniDetails
118                 .stream()
119                 .filter(a -> a.vni == key.getVirtualNetworkIdentifier().intValue())
120                 .collect(RWUtils.singleItemCollector());
121
122         builder.setVirtualNetworkIdentifier((long) details.vni);
123         builder.setKey(new VniTableKey(Long.valueOf(details.vni)));
124     }
125 }