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.initializers;
19 import com.google.common.collect.Lists;
20 import io.fd.honeycomb.v3po.vpp.data.init.AbstractDataTreeConverter;
21 import javax.annotation.Nonnull;
22 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesBuilder;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.AdminStatus;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceAugmentation;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceAugmentationBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceStateAugmentation;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VxlanVni;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VxlanGpeVni;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.EthernetBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.L2Builder;
37 // import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.SubInterfaceBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.TapBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.VhostUserBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.VxlanBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.VxlanGpeBuilder;
42 // import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.l2.VlanTagRewriteBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.Ethernet;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.L2;
45 // import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.SubInterface;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.Tap;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.VhostUser;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.Vxlan;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.VxlanGpe;
50 // import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.l2.VlanTagRewrite;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.base.attributes.Interconnection;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.base.attributes.interconnection.BridgeBased;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.base.attributes.interconnection.BridgeBasedBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.base.attributes.interconnection.XconnectBased;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.base.attributes.interconnection.XconnectBasedBuilder;
56 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
57 import org.slf4j.Logger;
58 import org.slf4j.LoggerFactory;
61 * Initializes ietf-interfaces config data based on operational state
63 public class InterfacesInitializer extends AbstractDataTreeConverter<InterfacesState, Interfaces> {
64 private static final Logger LOG = LoggerFactory.getLogger(InterfacesInitializer.class);
66 public InterfacesInitializer(@Nonnull final DataBroker bindingDataBroker) {
67 super(bindingDataBroker, InstanceIdentifier.create(InterfacesState.class),
68 InstanceIdentifier.create(Interfaces.class));
72 protected Interfaces convert(final InterfacesState operationalData) {
73 LOG.debug("InterfacesInitializer.convert()");
74 InterfacesBuilder interfacesBuilder = new InterfacesBuilder();
76 .setInterface(Lists.transform(operationalData.getInterface(), InterfacesInitializer::initialize));
77 return interfacesBuilder.build();
80 // FIXME https://jira.fd.io/browse/HONEYCOMB-73 this kind of initialization/transformation is bad
81 // There is no relation to readers, it cannot be extended (readers can) and its hard to keep in sync with readers
83 // TODO add IP v4/ v6 initializer
85 private static Interface initialize(
86 final org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface input) {
87 InterfaceBuilder builder = new InterfaceBuilder();
88 builder.setKey(new InterfaceKey(input.getKey().getName()));
89 builder.setName(input.getName());
90 builder.setType(input.getType());
91 builder.setEnabled(AdminStatus.Up.equals(input.getAdminStatus()));
92 // builder.setLinkUpDownTrapEnable(); not present in interfaces-state
94 final VppInterfaceStateAugmentation vppIfcAugmentation =
95 input.getAugmentation(VppInterfaceStateAugmentation.class);
96 if(vppIfcAugmentation != null) {
97 final VppInterfaceAugmentationBuilder augmentBuilder = new VppInterfaceAugmentationBuilder();
98 builder.setDescription(vppIfcAugmentation.getDescription());
100 final Vxlan vxlan = vppIfcAugmentation.getVxlan();
102 setVxlan(augmentBuilder, vxlan);
105 final VxlanGpe vxlanGpe = vppIfcAugmentation.getVxlanGpe();
106 if(vxlanGpe != null) {
107 setVxlanGpe(augmentBuilder, vxlanGpe);
110 final Tap tap = vppIfcAugmentation.getTap();
112 setTap(input, augmentBuilder, tap);
115 final VhostUser vhostUser = vppIfcAugmentation.getVhostUser();
116 if(vhostUser != null) {
117 setVhostUser(augmentBuilder, vhostUser);
120 final L2 l2 = vppIfcAugmentation.getL2();
122 setL2(augmentBuilder, l2);
125 // FIXME new vlan model
126 // final SubInterface subInterface = vppIfcAugmentation.getSubInterface();
127 // if(subInterface != null) {
128 // setSubinterface(augmentBuilder, subInterface);
131 final Ethernet ethernet = vppIfcAugmentation.getEthernet();
132 if(ethernet != null) {
133 setEthernet(augmentBuilder, ethernet);
136 // TODO set routing, not present in interface-state
138 builder.addAugmentation(VppInterfaceAugmentation.class, augmentBuilder.build());
141 return builder.build();
144 // FIXME vlan new modele
145 // private static void setSubinterface(final VppInterfaceAugmentationBuilder augmentBuilder,
146 // final SubInterface subInterface) {
147 // final SubInterfaceBuilder subIfcBuilder = new SubInterfaceBuilder();
149 // if(subInterface.isDefaultSubif() != null) {
150 // subIfcBuilder.setDefaultSubif(subInterface.isDefaultSubif());
152 // if(subInterface.isExactMatch() != null) {
153 // subIfcBuilder.setExactMatch(subInterface.isExactMatch());
155 // if(subInterface.isMatchAnyInnerId() != null) {
156 // subIfcBuilder.setMatchAnyInnerId(subInterface.isMatchAnyInnerId());
158 // if(subInterface.isMatchAnyOuterId() != null) {
159 // subIfcBuilder.setMatchAnyOuterId(subInterface.isMatchAnyOuterId());
162 // subIfcBuilder.setIdentifier(subInterface.getIdentifier());
163 // subIfcBuilder.setInnerId(subInterface.getInnerId());
164 // subIfcBuilder.setNumberOfTags(subInterface.getNumberOfTags());
165 // subIfcBuilder.setOuterId(subInterface.getOuterId());
166 // subIfcBuilder.setSuperInterface(subInterface.getSuperInterface());
167 // subIfcBuilder.setVlanType(subInterface.getVlanType());
169 // augmentBuilder.setSubInterface(subIfcBuilder.build());
172 private static void setEthernet(final VppInterfaceAugmentationBuilder augmentBuilder, final Ethernet ethernet) {
173 final EthernetBuilder ethernetBuilder = new EthernetBuilder();
174 ethernetBuilder.setMtu(ethernet.getMtu());
175 augmentBuilder.setEthernet(ethernetBuilder.build());
178 private static void setL2(final VppInterfaceAugmentationBuilder augmentBuilder, final L2 l2) {
179 final L2Builder l2Builder = new L2Builder();
181 final Interconnection interconnection = l2.getInterconnection();
182 if(interconnection != null) {
183 if (interconnection instanceof XconnectBased) {
184 final XconnectBasedBuilder xconnectBasedBuilder = new XconnectBasedBuilder();
185 xconnectBasedBuilder.setXconnectOutgoingInterface(
186 ((XconnectBased) interconnection).getXconnectOutgoingInterface());
187 l2Builder.setInterconnection(xconnectBasedBuilder.build());
188 } else if (interconnection instanceof BridgeBased) {
189 final BridgeBasedBuilder bridgeBasedBuilder = new BridgeBasedBuilder();
190 bridgeBasedBuilder.setBridgeDomain(((BridgeBased) interconnection).getBridgeDomain());
192 .setBridgedVirtualInterface(((BridgeBased) interconnection).isBridgedVirtualInterface());
193 bridgeBasedBuilder.setSplitHorizonGroup(((BridgeBased) interconnection).getSplitHorizonGroup());
194 l2Builder.setInterconnection(bridgeBasedBuilder.build());
198 // FIXME new vlan model
199 // final VlanTagRewrite vlanTagRewrite = l2.getVlanTagRewrite();
200 // if(vlanTagRewrite != null) {
201 // final VlanTagRewriteBuilder vlanTagRewriteBuilder = new VlanTagRewriteBuilder();
202 // vlanTagRewriteBuilder.setFirstPushed(vlanTagRewrite.getFirstPushed());
203 // vlanTagRewriteBuilder.setRewriteOperation(vlanTagRewrite.getRewriteOperation());
204 // vlanTagRewriteBuilder.setTag1(vlanTagRewrite.getTag1());
205 // vlanTagRewriteBuilder.setTag2(vlanTagRewrite.getTag2());
206 // l2Builder.setVlanTagRewrite(vlanTagRewriteBuilder.build());
209 augmentBuilder.setL2(l2Builder.build());
212 private static void setVhostUser(final VppInterfaceAugmentationBuilder augmentBuilder, final VhostUser vhostUser) {
213 final VhostUserBuilder vhostUserBuilder = new VhostUserBuilder();
214 vhostUserBuilder.setRole(vhostUser.getRole());
215 vhostUserBuilder.setSocket(vhostUser.getSocket());
216 augmentBuilder.setVhostUser(vhostUserBuilder.build());
219 private static void setTap(
220 final @Nonnull org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface input,
221 final VppInterfaceAugmentationBuilder augmentBuilder,
223 final TapBuilder tapBuilder = new TapBuilder();
224 tapBuilder.setMac(input.getPhysAddress());
225 tapBuilder.setTapName(tap.getTapName());
226 // tapBuilder.setDeviceInstance();
227 augmentBuilder.setTap(tapBuilder.build());
230 private static void setVxlan(final VppInterfaceAugmentationBuilder augmentBuilder, final Vxlan vxlan) {
231 final VxlanBuilder vxlanBuilder = new VxlanBuilder();
232 vxlanBuilder.setDst(vxlan.getDst());
233 vxlanBuilder.setSrc(vxlan.getSrc());
234 vxlanBuilder.setEncapVrfId(vxlan.getEncapVrfId());
235 vxlanBuilder.setVni(new VxlanVni(vxlan.getVni()));
236 augmentBuilder.setVxlan(vxlanBuilder.build());
239 private static void setVxlanGpe(final VppInterfaceAugmentationBuilder augmentBuilder, final VxlanGpe vxlanGpe) {
240 final VxlanGpeBuilder vxlanGpeBuilder = new VxlanGpeBuilder();
241 vxlanGpeBuilder.setLocal(vxlanGpe.getLocal());
242 vxlanGpeBuilder.setRemote(vxlanGpe.getRemote());
243 vxlanGpeBuilder.setVni(new VxlanGpeVni(vxlanGpe.getVni()));
244 vxlanGpeBuilder.setNextProtocol(vxlanGpe.getNextProtocol());
245 vxlanGpeBuilder.setEncapVrfId(vxlanGpe.getEncapVrfId());
246 vxlanGpeBuilder.setDecapVrfId(vxlanGpe.getDecapVrfId());
247 augmentBuilder.setVxlanGpe(vxlanGpeBuilder.build());