fixed northbound source dest mapping and auth TELSDN-644: #close
[lispflowmapping.git] / mappingservice / northbound / src / main / java / org / opendaylight / lispflowmapping / northbound / YangTransformerNB.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.lispflowmapping.northbound;
10
11 import java.util.ArrayList;
12 import java.util.Iterator;
13 import java.util.List;
14
15 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LcafSourceDestAddress;
16 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispAFIAddress;
17 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispLcafAddress;
18 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.MapRegister;
19 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.MapRequest;
20 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidrecords.EidRecordBuilder;
21 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidtolocatorrecords.EidToLocatorRecord;
22 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidtolocatorrecords.EidToLocatorRecord.Action;
23 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidtolocatorrecords.EidToLocatorRecordBuilder;
24 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lcafsourcedestaddress.DstAddressBuilder;
25 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lcafsourcedestaddress.SrcAddressBuilder;
26 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.LispAddressContainer;
27 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.LispAddressContainerBuilder;
28 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.Address;
29 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.AS;
30 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.ASBuilder;
31 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.DistinguishedName;
32 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.Ipv4;
33 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.Ipv4Builder;
34 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.Ipv6;
35 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.Ipv6Builder;
36 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.LcafSegment;
37 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.LcafSourceDest;
38 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.LcafSourceDestBuilder;
39 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.Mac;
40 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.NoBuilder;
41 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.PrimitiveAddress;
42 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.DistinguishedNameBuilder;
43 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.MacBuilder;
44 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.locatorrecords.LocatorRecord;
45 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.locatorrecords.LocatorRecordBuilder;
46 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.mapregisternotification.MapRegisterBuilder;
47 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.maprequest.ItrRloc;
48 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.maprequest.ItrRlocBuilder;
49 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.maprequest.SourceEidBuilder;
50 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.maprequestnotification.MapRequestBuilder;
51 import org.opendaylight.lispflowmapping.type.AddressFamilyNumberEnum;
52 import org.opendaylight.lispflowmapping.type.LispCanonicalAddressFormatEnum;
53 import org.opendaylight.lispflowmapping.type.lisp.EidRecord;
54 import org.opendaylight.lispflowmapping.type.lisp.MapReplyAction;
55 import org.opendaylight.lispflowmapping.type.lisp.address.LispASAddress;
56 import org.opendaylight.lispflowmapping.type.lisp.address.LispAddress;
57 import org.opendaylight.lispflowmapping.type.lisp.address.LispIpv4Address;
58 import org.opendaylight.lispflowmapping.type.lisp.address.LispIpv6Address;
59 import org.opendaylight.lispflowmapping.type.lisp.address.LispLCAFAddress;
60 import org.opendaylight.lispflowmapping.type.lisp.address.LispSourceDestLCAFAddress;
61 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
62 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
63 import org.slf4j.Logger;
64 import org.slf4j.LoggerFactory;
65
66 public class YangTransformerNB {
67
68     protected static final Logger logger = LoggerFactory.getLogger(YangTransformerNB.class);
69
70     public static LispAddressContainer toContainer(LispAFIAddress address) {
71         if (address instanceof Address) {
72             return new LispAddressContainerBuilder().setAddress((Address) address).build();
73         } else {
74             return null;
75         }
76     }
77
78     public static LispAddressContainer transformLispAddress(LispAddress lispAddress) {
79
80         if (lispAddress == null) {
81             return null;
82         }
83
84         LispAFIAddress lispAFIAddress = null;
85         short ianaCode = lispAddress.getAfi().getIanaCode();
86
87         switch (lispAddress.getAfi()) {
88
89         case IP:
90             LispIpv4Address lispIpv4Address = (LispIpv4Address) lispAddress;
91             Ipv4Address ipv4Address = new Ipv4Address(lispIpv4Address.getAddress().getHostAddress());
92             lispAFIAddress = new Ipv4Builder().setIpv4Address(ipv4Address).setAfi(ianaCode).build();
93             break;
94         case NO_ADDRESS:
95             lispAFIAddress = new NoBuilder().setAfi(ianaCode).build();
96         case AS:
97             LispASAddress lispASAddress = (LispASAddress) lispAddress;
98             lispAFIAddress = new ASBuilder().setAS(lispASAddress.getAS()).setAfi(ianaCode).build();
99             break;
100         case DISTINGUISHED_NAME:
101             break;
102         case IP6:
103             LispIpv6Address lispIpv6Address = (LispIpv6Address) lispAddress;
104             Ipv6Address ipv6Address = new Ipv6Address(lispIpv6Address.getAddress().getHostAddress());
105             lispAFIAddress = new Ipv6Builder().setIpv6Address(ipv6Address).setAfi(ianaCode).build();
106             break;
107         case LCAF:
108             LispLCAFAddress lcafAddress = (LispLCAFAddress) lispAddress;
109             switch (lcafAddress.getType()) {
110             case SOURCE_DEST:
111                 LispSourceDestLCAFAddress sourceDest = (LispSourceDestLCAFAddress) lcafAddress;
112                 LcafSourceDestBuilder SourceDestBuider = new LcafSourceDestBuilder();
113                 SourceDestBuider
114                         .setAfi(AddressFamilyNumberEnum.LCAF.getIanaCode())
115                         .setLcafType((short) LispCanonicalAddressFormatEnum.SOURCE_DEST.getLispCode())
116                         .setSrcMaskLength((short) sourceDest.getSrcMaskLength())
117                         .setDstMaskLength((short) sourceDest.getDstMaskLength())
118                         .setSrcAddress(
119                                 new SrcAddressBuilder().setPrimitiveAddress(
120                                         toPrimitive((LispAFIAddress) transformLispAddress(sourceDest.getSrcAddress()).getAddress())).build())
121                         .setDstAddress(
122                                 new DstAddressBuilder().setPrimitiveAddress(
123                                         toPrimitive((LispAFIAddress) transformLispAddress(sourceDest.getDstAddress()).getAddress())).build());
124                 lispAFIAddress = SourceDestBuider.build();
125                 break;
126
127             default:
128                 break;
129             }
130             break;
131         case MAC:
132             break;
133         case UNKNOWN:
134             break;
135         default:
136
137             break;
138         }
139
140         return toContainer(lispAFIAddress);
141
142     }
143
144     public static LispAddress transformToLispAddress(LispAddressContainer lispAddress) {
145
146         LispAddress legacyAddres = null;
147         LispAFIAddress address = (LispAFIAddress) lispAddress.getAddress();
148         short ianaCode = address.getAfi();
149
150         // TODO: add all other cases.
151
152         switch (ianaCode) {
153
154         case 1:
155             org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispIpv4Address lispIpv4Address = (org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispIpv4Address) address;
156             legacyAddres = new LispIpv4Address(lispIpv4Address.getIpv4Address().getValue());
157             break;
158         case 2:
159             org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispIpv6Address lispIpv6Address = (org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispIpv6Address) address;
160             legacyAddres = new LispIpv6Address(lispIpv6Address.getIpv6Address().getValue());
161             break;
162         case 16387:
163             LispLcafAddress lcafAddress = (LispLcafAddress) address;
164             short lcafType = lcafAddress.getLcafType();
165             switch (lcafType) {
166             case 12:
167                 LcafSourceDest yangSourceDest = (LcafSourceDest) lcafAddress;
168                 LispSourceDestLCAFAddress sourceDest = new LispSourceDestLCAFAddress((byte) 0);
169                 sourceDest.setSrcAddress(transformToLispAddress(toContainer(toNonPrimitive(yangSourceDest.getSrcAddress().getPrimitiveAddress()))));
170                 sourceDest.setDstAddress(transformToLispAddress(toContainer(toNonPrimitive(yangSourceDest.getDstAddress().getPrimitiveAddress()))));
171                 sourceDest.setSrcMaskLength(yangSourceDest.getSrcMaskLength().byteValue());
172                 sourceDest.setDstMaskLength(yangSourceDest.getDstMaskLength().byteValue());
173                 legacyAddres = sourceDest;
174                 break;
175
176             default:
177                 break;
178             }
179         default:
180
181             break;
182         }
183
184         return legacyAddres;
185
186     }
187
188     public static MapRegister transformMapRegister(org.opendaylight.lispflowmapping.type.lisp.MapRegister legacyMapRegister) {
189
190         List<EidToLocatorRecord> listEidToLocatorRecord = new ArrayList<EidToLocatorRecord>();
191
192         // for (EidToLocatorRecord legacyRecord:
193         // legacyMapRegister.getEidToLocatorRecords()){
194         for (int i = 0; i < legacyMapRegister.getEidToLocatorRecords().size(); i++) {
195
196             listEidToLocatorRecord.add(transformEidToLocatorRecord(legacyMapRegister.getEidToLocatorRecords().get(i)));
197
198         }
199
200         MapRegisterBuilder builder = new MapRegisterBuilder();
201
202         MapRegister yangMapRegister = builder.setKeyId(legacyMapRegister.getKeyId()).setProxyMapReply(legacyMapRegister.isProxyMapReply())
203                 .setEidToLocatorRecord(listEidToLocatorRecord).setWantMapNotify(true).build();
204
205         return yangMapRegister;
206
207     }
208
209     public static EidToLocatorRecord transformEidToLocatorRecord(
210             org.opendaylight.lispflowmapping.type.lisp.EidToLocatorRecord legacyEidToLocatorRecord) {
211
212         List<LocatorRecord> listLocatorRecord = new ArrayList<LocatorRecord>();
213
214         for (int j = 0; j < legacyEidToLocatorRecord.getLocators().size(); j++) {
215
216             org.opendaylight.lispflowmapping.type.lisp.LocatorRecord legacyLocatorRecord = legacyEidToLocatorRecord.getLocators().get(j);
217
218             LispAddressContainer rloc = transformLispAddress(legacyLocatorRecord.getLocator());
219
220             LocatorRecordBuilder locatorRecordBuilder = new LocatorRecordBuilder();
221
222             LocatorRecord locatorRecord = locatorRecordBuilder.setLispAddressContainer((LispAddressContainer) rloc)
223                     .setLocalLocator(legacyLocatorRecord.isLocalLocator()).setPriority((short) legacyLocatorRecord.getPriority())
224                     .setWeight((short) legacyLocatorRecord.getWeight()).setMulticastPriority((short) legacyLocatorRecord.getMulticastPriority())
225                     .setMulticastWeight((short) legacyLocatorRecord.getMulticastWeight()).setRlocProbed(legacyLocatorRecord.isRlocProbed())
226                     .setRouted(legacyLocatorRecord.isRouted()).build();
227
228             listLocatorRecord.add(locatorRecord);
229         }
230
231         LispAddressContainer eid = transformLispAddress(legacyEidToLocatorRecord.getPrefix());
232         EidToLocatorRecordBuilder eidToLocatorRecordBuilder = new EidToLocatorRecordBuilder();
233         EidToLocatorRecord eidToLocatorRecord = eidToLocatorRecordBuilder.setLispAddressContainer((LispAddressContainer) eid)
234                 .setAction(Action.forValue(legacyEidToLocatorRecord.getAction().getCode()))
235                 .setAuthoritative(legacyEidToLocatorRecord.isAuthoritative()).setMaskLength((short) legacyEidToLocatorRecord.getMaskLength())
236                 .setRecordTtl(legacyEidToLocatorRecord.getRecordTtl()).setLocatorRecord(listLocatorRecord).build();
237         return eidToLocatorRecord;
238     }
239
240     public static org.opendaylight.lispflowmapping.type.lisp.EidToLocatorRecord reTransformEidToLocatorRecord(EidToLocatorRecord eidToLocatorRecord) {
241
242         org.opendaylight.lispflowmapping.type.lisp.EidToLocatorRecord legacyRecord = new org.opendaylight.lispflowmapping.type.lisp.EidToLocatorRecord();
243
244         for (int j = 0; j < eidToLocatorRecord.getLocatorRecord().size(); j++) {
245
246             LocatorRecord locatorRecord = eidToLocatorRecord.getLocatorRecord().get(j);
247
248             org.opendaylight.lispflowmapping.type.lisp.LocatorRecord legacyLocatorRecord = new org.opendaylight.lispflowmapping.type.lisp.LocatorRecord();
249
250             LispAddressContainer rloc = locatorRecord.getLispAddressContainer();
251
252             legacyLocatorRecord.setLocator(YangTransformerNB.transformToLispAddress(rloc));
253
254             legacyLocatorRecord.setLocalLocator(legacyLocatorRecord.isLocalLocator()).setPriority((byte) legacyLocatorRecord.getPriority())
255                     .setWeight((byte) legacyLocatorRecord.getWeight()).setMulticastPriority((byte) legacyLocatorRecord.getMulticastPriority())
256                     .setMulticastWeight((byte) legacyLocatorRecord.getMulticastWeight()).setRlocProbed(legacyLocatorRecord.isRlocProbed())
257                     .setRouted(legacyLocatorRecord.isRouted());
258
259             legacyRecord.addLocator(legacyLocatorRecord);
260         }
261
262         LispAddress eid = transformToLispAddress(eidToLocatorRecord.getLispAddressContainer());
263         legacyRecord.setPrefix(eid).setAction(MapReplyAction.valueOf(eidToLocatorRecord.getAction().getIntValue()))
264                 .setAuthoritative(eidToLocatorRecord.isAuthoritative()).setMaskLength((short) eidToLocatorRecord.getMaskLength())
265                 .setRecordTtl(eidToLocatorRecord.getRecordTtl());
266         return legacyRecord;
267     }
268
269     public static MapRequest transformMapRequest(org.opendaylight.lispflowmapping.type.lisp.MapRequest legacyMapRequest) {
270
271         MapRequestBuilder builder = new MapRequestBuilder();
272         builder.setAuthoritative(legacyMapRequest.isAuthoritative());
273         builder.setMapDataPresent(legacyMapRequest.isMapDataPresent());
274         builder.setPitr(legacyMapRequest.isPitr());
275         builder.setProbe(legacyMapRequest.isProbe());
276         builder.setSmr(legacyMapRequest.isSmr());
277         builder.setSmrInvoked(legacyMapRequest.isSmrInvoked());
278
279         builder.setEidRecord(new ArrayList<org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidrecords.EidRecord>());
280         for (EidRecord record : legacyMapRequest.getEids()) {
281             LispAddressContainer container = transformLispAddress(record.getPrefix());
282             builder.getEidRecord().add(
283
284             new EidRecordBuilder().setMask((short) record.getMaskLength()).setLispAddressContainer(container).build());
285         }
286
287         builder.setItrRloc(new ArrayList<ItrRloc>());
288         for (LispAddress itr : legacyMapRequest.getItrRlocs()) {
289             builder.getItrRloc().add(new ItrRlocBuilder().setLispAddressContainer(transformLispAddress(itr)).build());
290         }
291
292         builder.setMapReply(null);
293         builder.setNonce(legacyMapRequest.getNonce());
294         if (legacyMapRequest.getSourceEid() != null) {
295             builder.setSourceEid(new SourceEidBuilder().setLispAddressContainer(transformLispAddress(legacyMapRequest.getSourceEid())).build());
296         }
297         return builder.build();
298
299     }
300
301     public static PrimitiveAddress toPrimitive(LispAFIAddress address) {
302         if (address instanceof Ipv4) {
303             return new org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv4Builder()
304                     .setIpv4Address(((Ipv4) address).getIpv4Address()).setAfi(address.getAfi()).build();
305         }
306         if (address instanceof Ipv6) {
307             return new org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv6Builder()
308                     .setIpv6Address(((Ipv6) address).getIpv6Address()).setAfi(address.getAfi()).build();
309         }
310         if (address instanceof Mac) {
311             return new MacBuilder().setAfi(address.getAfi()).setMacAddress(((Mac) address).getMacAddress()).build();
312         }
313         if (address instanceof DistinguishedName) {
314             return new DistinguishedNameBuilder().setAfi(address.getAfi()).setDistinguishedName(((DistinguishedName) address).getDistinguishedName())
315                     .build();
316         }
317         return null;
318     }
319
320     public static LispAFIAddress toNonPrimitive(PrimitiveAddress address) {
321         if (address instanceof org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv4) {
322             return new Ipv4Builder()
323                     .setIpv4Address(
324                             ((org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv4) address)
325                                     .getIpv4Address()).setAfi(((LispAFIAddress) address).getAfi()).build();
326         }
327         if (address instanceof org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv6) {
328             return new Ipv6Builder()
329                     .setIpv6Address(
330                             ((org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv6) address)
331                                     .getIpv6Address()).setAfi(((LispAFIAddress) address).getAfi()).build();
332         }
333         if (address instanceof org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Mac) {
334             return new org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.MacBuilder()
335                     .setAfi(((LispAFIAddress) address).getAfi())
336                     .setMacAddress(
337                             ((org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Mac) address).getMacAddress())
338                     .build();
339         }
340         if (address instanceof org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.DistinguishedName) {
341             return new org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.DistinguishedNameBuilder()
342                     .setAfi(((LispAFIAddress) address).getAfi())
343                     .setDistinguishedName(
344                             ((org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.DistinguishedName) address)
345                                     .getDistinguishedName()).build();
346         }
347         return null;
348     }
349
350 }