Update docs conf.yaml version to Sulfur
[transportpce.git] / pce / src / main / java / org / opendaylight / transportpce / pce / PcePathDescription.java
1 /*
2  * Copyright © 2017 AT&T, 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 package org.opendaylight.transportpce.pce;
9
10 import com.google.common.collect.ImmutableList;
11 import java.util.HashMap;
12 import java.util.List;
13 import java.util.Map;
14 import org.opendaylight.transportpce.common.ResponseCodes;
15 import org.opendaylight.transportpce.common.StringConstants;
16 import org.opendaylight.transportpce.common.fixedflex.GridConstant;
17 import org.opendaylight.transportpce.pce.networkanalyzer.PceLink;
18 import org.opendaylight.transportpce.pce.networkanalyzer.PceResult;
19 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev211210.FrequencyTHz;
20 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
21 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.ModulationFormat;
22 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev181130.OpucnTribSlotDef;
23 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirectionBuilder;
24 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirectionBuilder;
25 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZ;
26 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZBuilder;
27 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZKey;
28 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToA;
29 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToABuilder;
30 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToAKey;
31 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.Resource;
32 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.ResourceBuilder;
33 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.LinkBuilder;
34 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.NodeBuilder;
35 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.TerminationPoint;
36 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.TerminationPointBuilder;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId;
38 import org.opendaylight.yangtools.yang.common.Decimal64;
39 import org.opendaylight.yangtools.yang.common.Uint32;
40 import org.slf4j.Logger;
41 import org.slf4j.LoggerFactory;
42
43 public class PcePathDescription {
44     /* Logging. */
45     private static final Logger LOG = LoggerFactory.getLogger(PcePathDescription.class);
46
47     private List<PceLink> pathAtoZ = null;
48     private PceResult rc;
49     private Map<LinkId, PceLink> allPceLinks = null;
50
51     public PcePathDescription(List<PceLink> pathAtoZ, Map<LinkId, PceLink> allPceLinks, PceResult rc) {
52         super();
53         this.allPceLinks = allPceLinks;
54         this.pathAtoZ = pathAtoZ;
55         this.rc = rc;
56     }
57
58     public PceResult buildDescriptions() {
59         LOG.info("In buildDescriptions: AtoZ =  {}", pathAtoZ);
60         Map<AToZKey,AToZ> atozMap = new HashMap<>();
61         if (pathAtoZ == null) {
62             rc.setRC(ResponseCodes.RESPONSE_FAILED);
63             LOG.error("In buildDescriptions: there is empty AtoZ path");
64             return rc;
65         }
66
67         buildAtoZ(atozMap, pathAtoZ);
68         rc.setAtoZDirection(buildAtoZDirection(atozMap).build());
69         List<PceLink> pathZtoA = ImmutableList.copyOf(pathAtoZ).reverse();
70         LOG.info("In buildDescriptions: ZtoA {}", pathZtoA);
71
72         Map<ZToAKey,ZToA> ztoaMap = new HashMap<>();
73         if (pathZtoA == null) {
74             rc.setRC(ResponseCodes.RESPONSE_FAILED);
75             LOG.error("In buildDescriptions: there is empty ZtoA path");
76             return rc;
77         }
78         buildZtoA(ztoaMap, pathZtoA);
79         rc.setZtoADirection(buildZtoADirection(ztoaMap).build());
80
81         return rc;
82     }
83
84     /**
85      * Create a builder for AtoZDirection object.
86      * @param atozMap Map of AToZ object
87      * @return a builder for AtoZDirection object
88      */
89     private AToZDirectionBuilder buildAtoZDirection(Map<AToZKey, AToZ> atozMap) {
90         AToZDirectionBuilder atoZDirectionBldr = new AToZDirectionBuilder()
91             .setRate(Uint32.valueOf(rc.getRate()))
92             .setModulationFormat(GridConstant.RATE_MODULATION_FORMAT_MAP
93                     .getOrDefault(Uint32.valueOf(rc.getRate()), ModulationFormat.DpQpsk).getName())
94             .setAToZ(atozMap);
95         switch (rc.getServiceType()) {
96             case StringConstants.SERVICE_TYPE_400GE:
97             case StringConstants.SERVICE_TYPE_OTUC2:
98             case StringConstants.SERVICE_TYPE_OTUC3:
99             case StringConstants.SERVICE_TYPE_OTUC4:
100             case StringConstants.SERVICE_TYPE_100GE_T:
101             case StringConstants.SERVICE_TYPE_OTU4:
102                 atoZDirectionBldr.setAToZMaxFrequency(new FrequencyTHz(Decimal64.valueOf(rc.getMaxFreq())));
103                 atoZDirectionBldr.setAToZMinFrequency(new FrequencyTHz(Decimal64.valueOf(rc.getMinFreq())));
104                 atoZDirectionBldr.setAToZWavelengthNumber(Uint32.valueOf(rc.getResultWavelength()));
105                 break;
106             case StringConstants.SERVICE_TYPE_100GE_M:
107             case StringConstants.SERVICE_TYPE_100GE_S:
108             case StringConstants.SERVICE_TYPE_10GE:
109             case StringConstants.SERVICE_TYPE_1GE:
110             case StringConstants.SERVICE_TYPE_ODU4:
111             case StringConstants.SERVICE_TYPE_ODUC2:
112             case StringConstants.SERVICE_TYPE_ODUC3:
113             case StringConstants.SERVICE_TYPE_ODUC4:
114                 if (rc.getResultTribPortTribSlot() != null && rc.getResultTribPortTribSlot().get(0) != null
115                     && rc.getResultTribPortTribSlot().get(1) != null) {
116                     atoZDirectionBldr.setAToZWavelengthNumber(Uint32.valueOf(0))
117                             .setMinTribSlot(rc.getResultTribPortTribSlot().get(0))
118                             .setMaxTribSlot(rc.getResultTribPortTribSlot().get(1));
119                 } else {
120                     LOG.warn("Trib port and trib slot number should be present");
121                     atoZDirectionBldr.setMinTribSlot(new OpucnTribSlotDef("0.0"))
122                         .setMaxTribSlot(new OpucnTribSlotDef("0.0"));
123                 }
124                 break;
125             default:
126                 LOG.warn("unknown service type : unable to set Min/Max frequencies or trib-port/trib-slot");
127                 break;
128         }
129         return atoZDirectionBldr;
130     }
131
132     /**
133      * Create a builder for ZtoADirection object.
134      * @param ztoaMap Map of ZToA object
135      * @return a builder for ZtoADirection object
136      */
137     private ZToADirectionBuilder buildZtoADirection(Map<ZToAKey, ZToA> ztoaMap) {
138         ZToADirectionBuilder ztoADirectionBldr = new ZToADirectionBuilder().setRate(Uint32.valueOf(rc.getRate()))
139                 .setModulationFormat(GridConstant.RATE_MODULATION_FORMAT_MAP
140                         .getOrDefault(Uint32.valueOf(rc.getRate()), ModulationFormat.DpQpsk).getName())
141                 .setZToA(ztoaMap);
142         switch (rc.getServiceType()) {
143             case StringConstants.SERVICE_TYPE_400GE:
144             case StringConstants.SERVICE_TYPE_OTUC2:
145             case StringConstants.SERVICE_TYPE_OTUC3:
146             case StringConstants.SERVICE_TYPE_OTUC4:
147             case StringConstants.SERVICE_TYPE_100GE_T:
148             case StringConstants.SERVICE_TYPE_OTU4:
149                 ztoADirectionBldr.setZToAMaxFrequency(new FrequencyTHz(Decimal64.valueOf(rc.getMaxFreq())));
150                 ztoADirectionBldr.setZToAMinFrequency(new FrequencyTHz(Decimal64.valueOf(rc.getMinFreq())));
151                 ztoADirectionBldr.setZToAWavelengthNumber(Uint32.valueOf(rc.getResultWavelength()));
152                 break;
153             case StringConstants.SERVICE_TYPE_100GE_M:
154             case StringConstants.SERVICE_TYPE_100GE_S:
155             case StringConstants.SERVICE_TYPE_10GE:
156             case StringConstants.SERVICE_TYPE_1GE:
157             case StringConstants.SERVICE_TYPE_ODU4:
158             case StringConstants.SERVICE_TYPE_ODUC2:
159             case StringConstants.SERVICE_TYPE_ODUC3:
160             case StringConstants.SERVICE_TYPE_ODUC4:
161                 if (rc.getResultTribPortTribSlot() != null && rc.getResultTribPortTribSlot().get(0) != null
162                     && rc.getResultTribPortTribSlot().get(1) != null) {
163                     ztoADirectionBldr.setZToAWavelengthNumber(Uint32.valueOf(0))
164                             .setMinTribSlot(rc.getResultTribPortTribSlot().get(0))
165                             .setMaxTribSlot(rc.getResultTribPortTribSlot().get(1));
166                 } else {
167                     LOG.warn("Trib port and trib slot number should be present");
168                     ztoADirectionBldr.setMinTribSlot(new OpucnTribSlotDef("0.0"))
169                         .setMaxTribSlot(new OpucnTribSlotDef("0.0"));
170                 }
171                 break;
172             default:
173                 LOG.warn("unknown service type : unable to set Min/Max frequencies");
174                 break;
175         }
176         return ztoADirectionBldr;
177     }
178
179     @SuppressWarnings("java:S138")
180     //sonar issue This method has 77 lines, which is greater than the 75 lines authorized. Split it into smaller
181     //ignore as it's not relevant to split it from functional point
182     private void buildAtoZ(Map<AToZKey, AToZ> atozMap, List<PceLink> path) {
183         Integer index = 0;
184         PceLink lastLink = null;
185         AToZ lastResource = null;
186
187         // build A side Client TP
188         String tpName = path.get(0).getClient();
189         String xname = path.get(0).getSourceId().getValue();
190         TerminationPoint stp = new TerminationPointBuilder()
191                 .setTpId(tpName).setTpNodeId(xname)
192                 .build();
193
194         AToZKey clientKey = new AToZKey(index.toString());
195         Resource clientResource = new ResourceBuilder().setResource(stp).setState(State.InService).build();
196         AToZ firstResource = new AToZBuilder().setId(tpName).withKey(clientKey).setResource(clientResource).build();
197         atozMap.put(firstResource.key(),firstResource);
198         index += 1;
199         for (PceLink pcelink : path) {
200             String srcName = pcelink.getSourceId().getValue();
201             // Nodes
202             org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce
203                 .resource.resource.resource.Node sourceNode = new NodeBuilder()
204                 .setNodeId(srcName)
205                 .build();
206
207             // Source Resource
208             AToZKey sourceKey = new AToZKey(index.toString());
209             Resource nodeResource1 = new ResourceBuilder().setResource(sourceNode).setState(State.InService).build();
210             AToZ srcResource = new AToZBuilder().setId(srcName).withKey(sourceKey).setResource(nodeResource1).build();
211             index += 1;
212             atozMap.put(srcResource.key(),srcResource);
213
214             // source TP
215             tpName = pcelink.getSourceTP().getValue();
216             stp = new TerminationPointBuilder()
217                     .setTpNodeId(srcName).setTpId(tpName)
218                     .build();
219
220             // Resource
221             AToZKey srcTPKey = new AToZKey(index.toString());
222             Resource tpResource1 = new ResourceBuilder().setResource(stp).setState(State.InService).build();
223             AToZ stpResource = new AToZBuilder().setId(tpName).withKey(srcTPKey).setResource(tpResource1).build();
224             index += 1;
225             atozMap.put(stpResource.key(),stpResource);
226
227             String linkName = pcelink.getLinkId().getValue();
228             // Link
229             org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce
230                 .resource.resource.resource.Link atozLink = new LinkBuilder()
231                 .setLinkId(linkName)
232                 .build();
233
234             // Link Resource
235             AToZKey linkKey = new AToZKey(index.toString());
236             Resource nodeResource2 = new ResourceBuilder().setResource(atozLink).setState(pcelink.getState()).build();
237             AToZ linkResource = new AToZBuilder().setId(linkName).withKey(linkKey).setResource(nodeResource2).build();
238             index += 1;
239             atozMap.put(linkResource.key(),linkResource);
240
241             String destName = pcelink.getDestId().getValue();
242             // target TP
243             tpName = pcelink.getDestTP().getValue();
244             TerminationPoint dtp = new TerminationPointBuilder()
245                 .setTpNodeId(destName).setTpId(tpName)
246                 .build();
247
248             // Resource
249             AToZKey destTPKey = new AToZKey(index.toString());
250             Resource tpResource2 = new ResourceBuilder().setResource(dtp).setState(State.InService).build();
251             AToZ ttpResource = new AToZBuilder().setId(tpName).withKey(destTPKey).setResource(tpResource2).build();
252             index += 1;
253             atozMap.put(ttpResource.key(),ttpResource);
254
255             org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce
256                 .resource.resource.resource.Node targetNode = new NodeBuilder()
257                 .setNodeId(destName)
258                 .build();
259
260             // Target Resource
261             AToZKey targetKey = new AToZKey(index.toString());
262             Resource nodeResource3 = new ResourceBuilder().setResource(targetNode).setState(State.InService).build();
263             lastResource = new AToZBuilder().setId(destName).withKey(targetKey).setResource(nodeResource3).build();
264
265             lastLink = pcelink;
266         }
267
268         if (lastResource != null) {
269             atozMap.put(lastResource.key(),lastResource);
270         }
271
272         // build Z side Client TP
273         tpName = lastLink.getClient();
274         xname = lastLink.getDestId().getValue();
275         stp = new TerminationPointBuilder()
276                 .setTpNodeId(xname).setTpId(tpName)
277                 .build();
278
279         index += 1;
280         clientKey = new AToZKey(index.toString());
281         clientResource = new ResourceBuilder().setResource(stp).setState(State.InService).build();
282         lastResource = new AToZBuilder().setId(tpName).withKey(clientKey).setResource(clientResource).build();
283         atozMap.put(lastResource.key(),lastResource);
284
285     }
286
287     private void buildZtoA(Map<ZToAKey, ZToA> ztoaList, List<PceLink> path) {
288         Integer index = 0;
289         PceLink lastLink = null;
290         ZToA lastResource = null;
291
292         // build Z size Client TP
293         PceLink pcelink = this.allPceLinks.get(path.get(0).getOppositeLink());
294         String tpName = pcelink.getClient();
295         String xname = pcelink.getSourceId().getValue();
296         TerminationPoint stp = new TerminationPointBuilder()
297                 .setTpNodeId(xname).setTpId(tpName)
298                 .build();
299
300         ZToAKey clientKey = new ZToAKey(index.toString());
301         Resource clientResource = new ResourceBuilder().setResource(stp).setState(State.InService).build();
302         ZToA firstResource = new ZToABuilder().setId(tpName).withKey(clientKey).setResource(clientResource).build();
303         ztoaList.put(firstResource.key(),firstResource);
304         index += 1;
305
306         for (PceLink pcelinkAtoZ : path) {
307
308             pcelink = this.allPceLinks.get(pcelinkAtoZ.getOppositeLink());
309             LOG.debug("link to oppsite: {} to {}", pcelinkAtoZ, pcelink);
310
311             String srcName = pcelink.getSourceId().getValue();
312
313
314             // Nodes
315             org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce
316                 .resource.resource.resource.Node sourceNode = new NodeBuilder()
317                 .setNodeId(srcName).build();
318
319
320             // Source Resource
321             ZToAKey sourceKey = new ZToAKey(index.toString());
322             Resource nodeResource1 = new ResourceBuilder().setResource(sourceNode).setState(State.InService).build();
323             ZToA srcResource = new ZToABuilder().setId(srcName).withKey(sourceKey).setResource(nodeResource1).build();
324             index += 1;
325             ztoaList.put(srcResource.key(),srcResource);
326
327             // source TP
328             tpName = pcelink.getSourceTP().getValue();
329             stp = new TerminationPointBuilder()
330                     .setTpNodeId(srcName).setTpId(tpName)
331                     .build();
332
333             // Resource
334             ZToAKey srcTPKey = new ZToAKey(index.toString());
335             Resource tpResource1 = new ResourceBuilder().setResource(stp).setState(State.InService).build();
336             ZToA stpResource = new ZToABuilder().setId(tpName).withKey(srcTPKey).setResource(tpResource1).build();
337             index += 1;
338             ztoaList.put(stpResource.key(),stpResource);
339
340             String linkName = pcelink.getLinkId().getValue();
341             // Link
342             org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce
343                 .resource.resource.resource.Link ztoaLink = new LinkBuilder()
344                 .setLinkId(linkName).build();
345
346             // Link Resource
347             ZToAKey linkKey = new ZToAKey(index.toString());
348             Resource nodeResource2 = new ResourceBuilder().setResource(ztoaLink).setState(State.InService).build();
349             ZToA linkResource = new ZToABuilder().setId(linkName).withKey(linkKey).setResource(nodeResource2).build();
350             index += 1;
351             ztoaList.put(linkResource.key(),linkResource);
352
353             String destName = pcelink.getDestId().getValue();
354             // target TP
355             tpName = pcelink.getDestTP().getValue();
356             TerminationPoint ttp = new TerminationPointBuilder()
357                     .setTpNodeId(destName).setTpId(tpName).build();
358
359             // Resource
360             ZToAKey destTPKey = new ZToAKey(index.toString());
361             Resource tpResource2 = new ResourceBuilder().setResource(ttp).setState(State.InService).build();
362             ZToA ttpResource = new ZToABuilder().setId(tpName).withKey(destTPKey).setResource(tpResource2).build();
363             index += 1;
364             ztoaList.put(ttpResource.key(),ttpResource);
365
366
367             org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce
368                 .resource.resource.resource.Node targetNode = new NodeBuilder()
369                 .setNodeId(destName).build();
370             // Target Resource
371             ZToAKey targetKey = new ZToAKey(index.toString());
372             Resource nodeResource3 = new ResourceBuilder().setResource(targetNode).setState(State.InService).build();
373             lastResource = new ZToABuilder().setId(destName).withKey(targetKey).setResource(nodeResource3).build();
374
375             lastLink = pcelink;
376         }
377         if (lastResource != null) {
378             ztoaList.put(lastResource.key(),lastResource);
379         }
380
381         // build Z side Client TP
382         tpName = lastLink.getClient();
383         xname = lastLink.getDestId().getValue();
384         stp = new TerminationPointBuilder()
385                 .setTpNodeId(xname).setTpId(tpName).build();
386
387         index += 1;
388         clientKey = new ZToAKey(index.toString());
389         clientResource = new ResourceBuilder().setResource(stp).setState(State.InService).build();
390         lastResource = new ZToABuilder().setId(tpName).withKey(clientKey).setResource(clientResource).build();
391         ztoaList.put(lastResource.key(),lastResource);
392     }
393
394     public PceResult getReturnStructure() {
395         return rc;
396     }
397 }