30c9ee84fc96fbdd580009d82642f40f5fcef534
[hc2vpp.git] /
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.translate.v3po.interfaces.ip;
18
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;
22
23 import io.fd.honeycomb.translate.MappingContext;
24 import io.fd.honeycomb.translate.spi.write.ListWriterCustomizer;
25 import io.fd.honeycomb.translate.vpp.util.AddressTranslator;
26 import io.fd.honeycomb.translate.vpp.util.ByteDataTranslator;
27 import io.fd.honeycomb.translate.vpp.util.FutureJVppCustomizer;
28 import io.fd.honeycomb.translate.vpp.util.JvppReplyConsumer;
29 import io.fd.honeycomb.translate.vpp.util.NamingContext;
30 import io.fd.honeycomb.translate.vpp.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;
44
45
46 /**
47  * Customizer for writing {@link Neighbor} for {@link Ipv4}.
48  */
49 public class Ipv4NeighbourCustomizer extends FutureJVppCustomizer
50         implements ListWriterCustomizer<Neighbor, NeighborKey>, ByteDataTranslator, AddressTranslator,
51         JvppReplyConsumer {
52
53
54     private static final Logger LOG = LoggerFactory.getLogger(Ipv4NeighbourCustomizer.class);
55     final NamingContext interfaceContext;
56
57     public Ipv4NeighbourCustomizer(final FutureJVppCore futureJVppCore, final NamingContext interfaceContext) {
58         super(futureJVppCore);
59         this.interfaceContext = interfaceContext;
60     }
61
62     @Override
63     public void writeCurrentAttributes(@Nonnull InstanceIdentifier<Neighbor> id, @Nonnull Neighbor dataAfter,
64                                        @Nonnull WriteContext writeContext)
65             throws WriteFailedException {
66
67         checkNotNull(dataAfter, "Cannot write null neighbour");
68         checkArgument(id.firstKeyOf(Interface.class) != null, "No parent interface key found");
69
70         LOG.debug("Processing request for Neigbour write");
71         String interfaceName = id.firstKeyOf(Interface.class).getName();
72         MappingContext mappingContext = writeContext.getMappingContext();
73
74         checkState(interfaceContext.containsIndex(interfaceName, mappingContext),
75                 "Mapping does not contains mapping for provider interface name ".concat(interfaceName));
76
77         LOG.debug("Parent interface index found");
78         try {
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);
84         }
85     }
86
87     @Override
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");
92     }
93
94     @Override
95     public void deleteCurrentAttributes(@Nonnull InstanceIdentifier<Neighbor> id, @Nonnull Neighbor dataBefore,
96                                         @Nonnull WriteContext writeContext)
97             throws WriteFailedException {
98
99         checkNotNull(dataBefore, "Cannot delete null neighbour");
100         checkArgument(id.firstKeyOf(Interface.class) != null, "No parent interface key found");
101
102         LOG.debug("Processing request for Neigbour delete");
103         String interfaceName = id.firstKeyOf(Interface.class).getName();
104         MappingContext mappingContext = writeContext.getMappingContext();
105
106         checkState(interfaceContext.containsIndex(interfaceName, mappingContext),
107                 "Mapping does not contains mapping for provider interface name %s", interfaceName);
108
109         LOG.debug("Parent interface[{}] index found", interfaceName);
110         try {
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);
116         }
117     }
118
119     private void addDelNeighbourAndReply(InstanceIdentifier<Neighbor> id, boolean add, int parentInterfaceIndex,
120                                          Neighbor data)
121             throws VppBaseCallException, WriteTimeoutException {
122
123         IpNeighborAddDel request = new IpNeighborAddDel();
124
125         request.isAdd = booleanToByte(add);
126         request.isIpv6 = 0;
127         request.isStatic = 1;
128         request.dstAddress = ipv4AddressNoZoneToArray(data.getIp());
129         request.macAddress = parseMac(data.getLinkLayerAddress().getValue());
130         request.swIfIndex = parentInterfaceIndex;
131
132         //TODO HONEYCOMB-182 if it is necessary for future use ,make adjustments to be able to set vrfid
133         //request.vrfId
134         getReplyForWrite(getFutureJVpp().ipNeighborAddDel(request).toCompletableFuture(), id);
135     }
136 }