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.translate.v3po.interfaces.ip;
19 import static com.google.common.base.Preconditions.checkArgument;
20 import static com.google.common.base.Preconditions.checkNotNull;
21 import static com.google.common.base.Preconditions.checkState;
23 import io.fd.honeycomb.translate.MappingContext;
24 import io.fd.honeycomb.translate.spi.write.ListWriterCustomizer;
25 import io.fd.honeycomb.translate.v3po.util.AddressTranslator;
26 import io.fd.honeycomb.translate.v3po.util.ByteDataTranslator;
27 import io.fd.honeycomb.translate.v3po.util.FutureJVppCustomizer;
28 import io.fd.honeycomb.translate.v3po.util.JvppReplyConsumer;
29 import io.fd.honeycomb.translate.v3po.util.NamingContext;
30 import io.fd.honeycomb.translate.v3po.util.WriteTimeoutException;
31 import io.fd.honeycomb.translate.write.WriteContext;
32 import io.fd.honeycomb.translate.write.WriteFailedException;
33 import javax.annotation.Nonnull;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.Ipv4;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.ipv4.Neighbor;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.ipv4.NeighborKey;
38 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
39 import org.openvpp.jvpp.VppBaseCallException;
40 import org.openvpp.jvpp.core.dto.IpNeighborAddDel;
41 import org.openvpp.jvpp.core.future.FutureJVppCore;
42 import org.slf4j.Logger;
43 import org.slf4j.LoggerFactory;
47 * Customizer for writing {@link Neighbor} for {@link Ipv4}.
49 public class Ipv4NeighbourCustomizer extends FutureJVppCustomizer
50 implements ListWriterCustomizer<Neighbor, NeighborKey>, ByteDataTranslator, AddressTranslator,
54 private static final Logger LOG = LoggerFactory.getLogger(Ipv4NeighbourCustomizer.class);
55 final NamingContext interfaceContext;
57 public Ipv4NeighbourCustomizer(final FutureJVppCore futureJVppCore, final NamingContext interfaceContext) {
58 super(futureJVppCore);
59 this.interfaceContext = interfaceContext;
63 public void writeCurrentAttributes(@Nonnull InstanceIdentifier<Neighbor> id, @Nonnull Neighbor dataAfter,
64 @Nonnull WriteContext writeContext)
65 throws WriteFailedException {
67 checkNotNull(dataAfter, "Cannot write null neighbour");
68 checkArgument(id.firstKeyOf(Interface.class) != null, "No parent interface key found");
70 LOG.debug("Processing request for Neigbour write");
71 String interfaceName = id.firstKeyOf(Interface.class).getName();
72 MappingContext mappingContext = writeContext.getMappingContext();
74 checkState(interfaceContext.containsIndex(interfaceName, mappingContext),
75 "Mapping does not contains mapping for provider interface name ".concat(interfaceName));
77 LOG.debug("Parent interface index found");
79 addDelNeighbourAndReply(id, true,
80 interfaceContext.getIndex(interfaceName, mappingContext), dataAfter);
81 LOG.info("Neighbour successfully written");
82 } catch (VppBaseCallException e) {
83 throw new WriteFailedException.CreateFailedException(id, dataAfter, e);
88 public void updateCurrentAttributes(@Nonnull InstanceIdentifier<Neighbor> id, @Nonnull Neighbor dataBefore,
89 @Nonnull Neighbor dataAfter,
90 @Nonnull WriteContext writeContext) throws WriteFailedException {
91 throw new UnsupportedOperationException("Operation not supported");
95 public void deleteCurrentAttributes(@Nonnull InstanceIdentifier<Neighbor> id, @Nonnull Neighbor dataBefore,
96 @Nonnull WriteContext writeContext)
97 throws WriteFailedException {
99 checkNotNull(dataBefore, "Cannot delete null neighbour");
100 checkArgument(id.firstKeyOf(Interface.class) != null, "No parent interface key found");
102 LOG.debug("Processing request for Neigbour delete");
103 String interfaceName = id.firstKeyOf(Interface.class).getName();
104 MappingContext mappingContext = writeContext.getMappingContext();
106 checkState(interfaceContext.containsIndex(interfaceName, mappingContext),
107 "Mapping does not contains mapping for provider interface name %s", interfaceName);
109 LOG.debug("Parent interface[{}] index found", interfaceName);
111 addDelNeighbourAndReply(id, false,
112 interfaceContext.getIndex(interfaceName, mappingContext), dataBefore);
113 LOG.info("Neighbour {} successfully deleted", id);
114 } catch (VppBaseCallException e) {
115 throw new WriteFailedException.DeleteFailedException(id, e);
119 private void addDelNeighbourAndReply(InstanceIdentifier<Neighbor> id, boolean add, int parentInterfaceIndex,
121 throws VppBaseCallException, WriteTimeoutException {
123 IpNeighborAddDel request = new IpNeighborAddDel();
125 request.isAdd = booleanToByte(add);
127 request.isStatic = 1;
128 request.dstAddress = ipv4AddressNoZoneToArray(data.getIp());
129 request.macAddress = parseMac(data.getLinkLayerAddress().getValue());
130 request.swIfIndex = parentInterfaceIndex;
132 //TODO HONEYCOMB-182 if it is necessary for future use ,make adjustments to be able to set vrfid
134 getReplyForWrite(getFutureJVpp().ipNeighborAddDel(request).toCompletableFuture(), id);