2 * Copyright © 2017 AT&T, Inc. and others. All rights reserved.
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
8 package org.opendaylight.transportpce.pce;
10 import com.google.common.collect.ImmutableList;
11 import java.util.HashMap;
12 import java.util.List;
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.rev210924.OpucnTribSlotDef;
23 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirectionBuilder;
24 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirectionBuilder;
25 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZ;
26 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZBuilder;
27 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZKey;
28 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToA;
29 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToABuilder;
30 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToAKey;
31 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.Resource;
32 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.ResourceBuilder;
33 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.LinkBuilder;
34 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.NodeBuilder;
35 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.TerminationPoint;
36 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.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;
43 public class PcePathDescription {
45 private static final Logger LOG = LoggerFactory.getLogger(PcePathDescription.class);
47 private List<PceLink> pathAtoZ = null;
49 private Map<LinkId, PceLink> allPceLinks = null;
51 public PcePathDescription(List<PceLink> pathAtoZ, Map<LinkId, PceLink> allPceLinks, PceResult rc) {
53 this.allPceLinks = allPceLinks;
54 this.pathAtoZ = pathAtoZ;
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");
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);
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");
78 buildZtoA(ztoaMap, pathZtoA);
79 rc.setZtoADirection(buildZtoADirection(ztoaMap).build());
85 * Create a builder for AtoZDirection object.
86 * @param atozMap Map of AToZ object
87 * @return a builder for AtoZDirection object
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())
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()));
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));
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"));
126 LOG.warn("unknown service type : unable to set Min/Max frequencies or trib-port/trib-slot");
129 return atoZDirectionBldr;
133 * Create a builder for ZtoADirection object.
134 * @param ztoaMap Map of ZToA object
135 * @return a builder for ZtoADirection object
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())
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()));
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));
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"));
173 LOG.warn("unknown service type : unable to set Min/Max frequencies");
176 return ztoADirectionBldr;
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) {
184 PceLink lastLink = null;
185 AToZ lastResource = null;
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)
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);
199 for (PceLink pcelink : path) {
200 String srcName = pcelink.getSourceId().getValue();
202 org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501
203 .pce.resource.resource.resource.Node sourceNode = new NodeBuilder()
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();
212 atozMap.put(srcResource.key(),srcResource);
215 tpName = pcelink.getSourceTP().getValue();
216 stp = new TerminationPointBuilder()
217 .setTpNodeId(srcName).setTpId(tpName)
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();
225 atozMap.put(stpResource.key(),stpResource);
227 String linkName = pcelink.getLinkId().getValue();
229 org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501
230 .pce.resource.resource.resource.Link atozLink = new LinkBuilder()
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();
239 atozMap.put(linkResource.key(),linkResource);
241 String destName = pcelink.getDestId().getValue();
243 tpName = pcelink.getDestTP().getValue();
244 TerminationPoint dtp = new TerminationPointBuilder()
245 .setTpNodeId(destName).setTpId(tpName)
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();
253 atozMap.put(ttpResource.key(),ttpResource);
255 org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce
256 .resource.resource.resource.Node targetNode = new NodeBuilder()
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();
268 if (lastResource != null) {
269 atozMap.put(lastResource.key(),lastResource);
272 // build Z side Client TP
273 tpName = lastLink.getClient();
274 xname = lastLink.getDestId().getValue();
275 stp = new TerminationPointBuilder()
276 .setTpNodeId(xname).setTpId(tpName)
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);
287 private void buildZtoA(Map<ZToAKey, ZToA> ztoaList, List<PceLink> path) {
289 PceLink lastLink = null;
290 ZToA lastResource = null;
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)
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);
306 for (PceLink pcelinkAtoZ : path) {
308 pcelink = this.allPceLinks.get(pcelinkAtoZ.getOppositeLink());
309 LOG.debug("link to oppsite: {} to {}", pcelinkAtoZ, pcelink);
311 String srcName = pcelink.getSourceId().getValue();
315 org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce
316 .resource.resource.resource.Node sourceNode = new NodeBuilder()
317 .setNodeId(srcName).build();
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();
325 ztoaList.put(srcResource.key(),srcResource);
328 tpName = pcelink.getSourceTP().getValue();
329 stp = new TerminationPointBuilder()
330 .setTpNodeId(srcName).setTpId(tpName)
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();
338 ztoaList.put(stpResource.key(),stpResource);
340 String linkName = pcelink.getLinkId().getValue();
342 org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce
343 .resource.resource.resource.Link ztoaLink = new LinkBuilder()
344 .setLinkId(linkName).build();
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();
351 ztoaList.put(linkResource.key(),linkResource);
353 String destName = pcelink.getDestId().getValue();
355 tpName = pcelink.getDestTP().getValue();
356 TerminationPoint ttp = new TerminationPointBuilder()
357 .setTpNodeId(destName).setTpId(tpName).build();
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();
364 ztoaList.put(ttpResource.key(),ttpResource);
367 org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce
368 .resource.resource.resource.Node targetNode = new NodeBuilder()
369 .setNodeId(destName).build();
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();
377 if (lastResource != null) {
378 ztoaList.put(lastResource.key(),lastResource);
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();
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);
394 public PceResult getReturnStructure() {