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