2 * Copyright (c) 2016 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.honeycomb.v3po.translate.v3po.interfacesstate.ip;
19 import com.google.common.base.Optional;
20 import io.fd.honeycomb.v3po.translate.ModificationCache;
21 import io.fd.honeycomb.v3po.translate.read.ReadContext;
22 import io.fd.honeycomb.v3po.translate.read.ReadFailedException;
23 import io.fd.honeycomb.v3po.translate.spi.read.ListReaderCustomizer;
24 import io.fd.honeycomb.v3po.translate.util.RWUtils;
25 import io.fd.honeycomb.v3po.translate.v3po.util.FutureJVppCustomizer;
26 import io.fd.honeycomb.v3po.translate.v3po.util.TranslateUtils;
27 import java.util.Arrays;
28 import java.util.Collections;
29 import java.util.List;
30 import java.util.stream.Collectors;
31 import javax.annotation.Nonnull;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces.state._interface.Ipv4;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces.state._interface.Ipv4Builder;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces.state._interface.ipv4.Address;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces.state._interface.ipv4.AddressBuilder;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces.state._interface.ipv4.AddressKey;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces.state._interface.ipv4.address.subnet.PrefixLengthBuilder;
38 import org.opendaylight.yangtools.concepts.Builder;
39 import org.opendaylight.yangtools.yang.binding.DataObject;
40 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
41 import org.openvpp.jvpp.VppBaseCallException;
42 import org.openvpp.jvpp.dto.IpAddressDetails;
43 import org.openvpp.jvpp.dto.IpAddressDetailsReplyDump;
44 import org.openvpp.jvpp.dto.IpAddressDump;
45 import org.openvpp.jvpp.future.FutureJVpp;
46 import org.slf4j.Logger;
47 import org.slf4j.LoggerFactory;
50 * Customizer for read operations for {@link Address} of {@link Ipv4}
52 public class Ipv4AddressCustomizer extends FutureJVppCustomizer
53 implements ListReaderCustomizer<Address, AddressKey, AddressBuilder> {
55 private static final Logger LOG = LoggerFactory.getLogger(Ipv4AddressCustomizer.class);
57 private static final String CACHE_KEY = Ipv4AddressCustomizer.class.getName();
59 public Ipv4AddressCustomizer(FutureJVpp futureJvpp) {
64 public AddressBuilder getBuilder(@Nonnull InstanceIdentifier<Address> id) {
65 return new AddressBuilder();
69 public void readCurrentAttributes(@Nonnull InstanceIdentifier<Address> id, @Nonnull AddressBuilder builder,
70 @Nonnull ReadContext ctx)
71 throws ReadFailedException {
72 LOG.debug("Reading attributes...");
74 Optional<IpAddressDetailsReplyDump> dumpOptional = dumpAddresses(id, ctx);
76 if (dumpOptional.isPresent() && dumpOptional.get().ipAddressDetails != null) {
77 List<IpAddressDetails> details = dumpOptional.get().ipAddressDetails;
79 AddressKey key = id.firstKeyOf(Address.class);
80 byte[] identifingIpBytes = TranslateUtils.ipv4AddressNoZoneToArray(key.getIp());
82 IpAddressDetails detail = details.stream()
83 .filter(singleDetail -> Arrays.equals(identifingIpBytes, singleDetail.ip))
84 .collect(RWUtils.singleItemCollector());
86 builder.setIp(TranslateUtils.arrayToIpv4AddressNoZone(detail.ip))
87 .setSubnet(new PrefixLengthBuilder()
88 .setPrefixLength(Short.valueOf(detail.prefixLength)).build());
89 LOG.info("Address read successfull");
92 LOG.warn("No address dump present");
97 public List<AddressKey> getAllIds(@Nonnull InstanceIdentifier<Address> id, @Nonnull ReadContext context)
98 throws ReadFailedException {
99 LOG.debug("Extracting keys..");
101 Optional<IpAddressDetailsReplyDump> dumpOptional = dumpAddresses(id, context);
103 if (dumpOptional.isPresent() && dumpOptional.get().ipAddressDetails != null) {
105 List<IpAddressDetails> details = dumpOptional.get().ipAddressDetails;
107 return details.stream()
108 .map(detail -> new AddressKey(TranslateUtils.arrayToIpv4AddressNoZone(detail.ip)))
109 .collect(Collectors.toList());
111 LOG.warn("No dump present");
112 return Collections.emptyList();
117 public void merge(@Nonnull Builder<? extends DataObject> builder, @Nonnull List<Address> readData) {
118 ((Ipv4Builder) builder).setAddress(readData);
121 // TODO refactor after there is an more generic implementation of cache
123 private Optional<IpAddressDetailsReplyDump> dumpAddresses(InstanceIdentifier<Address> id, ReadContext ctx)
124 throws ReadFailedException {
125 Optional<IpAddressDetailsReplyDump> dumpFromCache = dumpAddressFromCache(ctx.getModificationCache());
127 if (dumpFromCache.isPresent()) {
128 return dumpFromCache;
131 Optional<IpAddressDetailsReplyDump> dumpFromOperational;
133 dumpFromOperational = dumpAddressFromOperationalData();
134 } catch (VppBaseCallException e) {
135 throw new ReadFailedException(id, e);
138 if (dumpFromOperational.isPresent()) {
139 ctx.getModificationCache().put(CACHE_KEY, dumpFromOperational.get());
142 return dumpFromOperational;
145 private Optional<IpAddressDetailsReplyDump> dumpAddressFromCache(ModificationCache cache) {
146 LOG.debug("Dumping from cache...");
147 return Optional.fromNullable((IpAddressDetailsReplyDump) cache.get(CACHE_KEY));
150 private Optional<IpAddressDetailsReplyDump> dumpAddressFromOperationalData() throws VppBaseCallException {
151 LOG.debug("Dumping from operational data...");
152 return Optional.fromNullable(
153 TranslateUtils.getReply(getFutureJVpp().ipAddressDump(new IpAddressDump()).toCompletableFuture()));