PCE module init
[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
12 import java.util.ArrayList;
13 import java.util.List;
14 import java.util.Map;
15
16 import org.opendaylight.transportpce.common.ResponseCodes;
17 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.path.description.AToZDirectionBuilder;
18 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.path.description.ZToADirectionBuilder;
19 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.path.description.atoz.direction.AToZ;
20 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.path.description.atoz.direction.AToZBuilder;
21 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.path.description.atoz.direction.AToZKey;
22 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.path.description.ztoa.direction.ZToA;
23 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.path.description.ztoa.direction.ZToABuilder;
24 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.path.description.ztoa.direction.ZToAKey;
25 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.pce.resource.Resource;
26 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.pce.resource.ResourceBuilder;
27 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.pce.resource.resource.resource.LinkBuilder;
28 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.pce.resource.resource.resource.NodeBuilder;
29 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.pce.resource.resource.resource.TerminationPoint;
30 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.pce.resource.resource.resource.TerminationPointBuilder;
31 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.pce.resource.resource.resource.link.LinkIdentifierBuilder;
32 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.pce.resource.resource.resource.node.NodeIdentifierBuilder;
33 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.pce.resource.resource.resource.termination.point.TerminationPointIdentifierBuilder;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.LinkId;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37
38 public class PcePathDescription {
39     /* Logging. */
40     private static final Logger LOG = LoggerFactory.getLogger(PceCalculation.class);
41
42     private List<PceLink> pathAtoZ = null;
43     private PceResult rc;
44
45     public PceResult getReturnStructure() {
46         return rc;
47     }
48
49     private Map<LinkId, PceLink> allPceLinks = null;
50
51     private List<PceLink> pathZtoA = null;
52
53     public PcePathDescription(List<PceLink> pathAtoZ, Map<LinkId, PceLink> allPceLinks, PceResult rc) {
54         super();
55         this.allPceLinks = allPceLinks;
56         this.pathAtoZ = pathAtoZ;
57         this.rc = rc;
58     }
59
60     public PceResult buildDescriptions() {
61         LOG.info("In buildDescriptions: AtoZ {}", pathAtoZ.toString());
62         List<AToZ> atozList = new ArrayList<AToZ>();
63         if (pathAtoZ == null) {
64             rc.setRC(ResponseCodes.RESPONSE_FAILED);
65             LOG.error("In buildDescriptions: there is empty AtoZ path");
66             return rc;
67         }
68
69         buildAtoZ(atozList, pathAtoZ);
70
71         rc.setAtoZDirection(new AToZDirectionBuilder().setRate(rc.getRate())
72                 .setAToZWavelengthNumber(rc.getResultWavelength()).setAToZ(atozList).build());
73
74         pathZtoA = ImmutableList.copyOf(pathAtoZ).reverse();
75         LOG.info("In buildDescriptions: ZtoA {}", pathZtoA.toString());
76
77         List<ZToA> ztoaList = new ArrayList<ZToA>();
78         if (pathZtoA == null) {
79             rc.setRC(ResponseCodes.RESPONSE_FAILED);
80             LOG.error("In buildDescriptions: there is empty ZtoA path");
81             return rc;
82         }
83         buildZtoA(ztoaList, pathZtoA);
84
85         rc.setZtoADirection(new ZToADirectionBuilder().setRate(rc.getRate())
86                 .setZToAWavelengthNumber(rc.getResultWavelength()).setZToA(ztoaList).build());
87
88         return rc;
89     }
90
91     private void buildAtoZ(List<AToZ> etoeList, List<PceLink> path) {
92
93         Integer index = 0;
94         PceLink lastLink = null;
95         AToZ lastResource = null;
96
97         // build A side Client TP
98         String tpName = path.get(0).getClient();
99         String xname = path.get(0).getSourceId().getValue();
100         TerminationPoint stp = new TerminationPointBuilder()
101                 .setTerminationPointIdentifier(new TerminationPointIdentifierBuilder()
102                         .setNodeId(xname).setTpId(tpName).build())
103                 .build();
104
105         AToZKey clientKey = new AToZKey(index.toString());
106         Resource clientResource = new ResourceBuilder().setResource(stp).build();
107         AToZ firstResource = new AToZBuilder().setId(tpName).setKey(clientKey).setResource(clientResource).build();
108         etoeList.add(firstResource);
109
110         index++;
111
112         for (PceLink pcelink : path) {
113
114             String srcName = pcelink.getSourceId().getValue();
115
116             // Nodes
117             org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.pce
118                 .resource.resource.resource.Node sourceNode = new NodeBuilder()
119                 .setNodeIdentifier(new NodeIdentifierBuilder().setNodeId(srcName).build())
120                 .build();
121
122             // Source Resource
123             AToZKey sourceKey = new AToZKey(index.toString());
124             Resource nodeResource1 = new ResourceBuilder().setResource(sourceNode).build();
125             AToZ srcResource = new AToZBuilder().setId(srcName).setKey(sourceKey).setResource(nodeResource1).build();
126             index++;
127             etoeList.add(srcResource);
128
129             // source TP
130             tpName = pcelink.getSourceTP().toString();
131             stp = new TerminationPointBuilder()
132                     .setTerminationPointIdentifier(new TerminationPointIdentifierBuilder()
133                             .setNodeId(srcName).setTpId(tpName).build())
134                     .build();
135
136             // Resource
137             AToZKey srcTPKey = new AToZKey(index.toString());// tpName);
138             Resource tpResource1 = new ResourceBuilder().setResource(stp).build();
139             AToZ stpResource = new AToZBuilder().setId(tpName).setKey(srcTPKey).setResource(tpResource1).build();
140             index++;
141             etoeList.add(stpResource);
142
143             String linkName = pcelink.getLinkId().getValue();
144             // Link
145             org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.pce
146                 .resource.resource.resource.Link atozLink = new LinkBuilder()
147                 .setLinkIdentifier(new LinkIdentifierBuilder().setLinkId(linkName).build())
148                 .build();
149
150             // Link Resource
151             AToZKey linkKey = new AToZKey(index.toString());
152             Resource nodeResource2 = new ResourceBuilder().setResource(atozLink).build();
153             AToZ linkResource = new AToZBuilder().setId(linkName).setKey(linkKey).setResource(nodeResource2).build();
154             index++;
155             etoeList.add(linkResource);
156
157             String destName = pcelink.getDestId().getValue();
158             // target TP
159             tpName = pcelink.getDestTP().toString();
160             TerminationPoint dtp = new TerminationPointBuilder()
161                     .setTerminationPointIdentifier(new TerminationPointIdentifierBuilder()
162                             .setNodeId(destName).setTpId(tpName).build())
163                     .build();
164
165             // Resource
166             AToZKey destTPKey = new AToZKey(index.toString());
167             Resource tpResource2 = new ResourceBuilder().setResource(dtp).build();
168             AToZ ttpResource = new AToZBuilder().setId(tpName).setKey(destTPKey).setResource(tpResource2).build();
169             index++;
170             etoeList.add(ttpResource);
171
172             org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.pce
173                 .resource.resource.resource.Node targetNode = new NodeBuilder()
174                 .setNodeIdentifier(new NodeIdentifierBuilder().setNodeId(destName).build())
175                 .build();
176
177             // Target Resource
178             AToZKey targetKey = new AToZKey(index.toString());
179             Resource nodeResource3 = new ResourceBuilder().setResource(targetNode).build();
180             lastResource = new AToZBuilder().setId(destName).setKey(targetKey).setResource(nodeResource3).build();
181
182             lastLink = pcelink;
183         }
184
185         etoeList.add(lastResource);
186
187         // build Z side Client TP
188         tpName = lastLink.getClient();
189         xname = lastLink.getDestId().getValue();
190         stp = new TerminationPointBuilder()
191                 .setTerminationPointIdentifier(new TerminationPointIdentifierBuilder()
192                         .setNodeId(xname).setTpId(tpName).build())
193                 .build();
194
195
196         index++;
197         clientKey = new AToZKey(index.toString());
198         clientResource = new ResourceBuilder().setResource(stp).build();
199         lastResource = new AToZBuilder().setId(tpName).setKey(clientKey).setResource(clientResource).build();
200         etoeList.add(lastResource);
201
202     }
203
204     private void buildZtoA(List<ZToA> etoelist, List<PceLink> path) {
205         Integer index = 0;
206         PceLink lastLink = null;
207         ZToA lastResource = null;
208
209         // build Z size Client TP
210         PceLink pcelink = allPceLinks.get(path.get(0).getOppositeLink());
211         String tpName = pcelink.getClient();
212         String xname = pcelink.getSourceId().getValue();
213         TerminationPoint stp = new TerminationPointBuilder()
214                 .setTerminationPointIdentifier(new TerminationPointIdentifierBuilder()
215                         .setNodeId(xname).setTpId(tpName).build())
216                 .build();
217
218         ZToAKey clientKey = new ZToAKey(index.toString());
219         Resource clientResource = new ResourceBuilder().setResource(stp).build();
220         ZToA firstResource = new ZToABuilder().setId(tpName).setKey(clientKey).setResource(clientResource).build();
221         etoelist.add(firstResource);
222         index++;
223
224         for (PceLink pcelinkAtoZ : path) {
225
226             pcelink = allPceLinks.get(pcelinkAtoZ.getOppositeLink());
227             LOG.debug("link to oppsite: {} to {}", pcelinkAtoZ.toString(), pcelink.toString());
228
229             String srcName = pcelink.getSourceId().getValue();
230
231
232             // Nodes
233             org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.pce
234                 .resource.resource.resource.Node sourceNode = new NodeBuilder()
235                 .setNodeIdentifier(new NodeIdentifierBuilder().setNodeId(srcName).build()).build();
236
237
238
239             // Source Resource
240             ZToAKey sourceKey = new ZToAKey(index.toString());
241             Resource nodeResource1 = new ResourceBuilder().setResource(sourceNode).build();
242             ZToA srcResource = new ZToABuilder().setId(srcName).setKey(sourceKey).setResource(nodeResource1).build();
243             index++;
244             etoelist.add(srcResource);
245
246             // source TP
247             tpName = pcelink.getSourceTP().toString();
248             stp = new TerminationPointBuilder()
249                     .setTerminationPointIdentifier(new TerminationPointIdentifierBuilder()
250                             .setNodeId(srcName).setTpId(tpName).build())
251                     .build();
252
253             // Resource
254             ZToAKey srcTPKey = new ZToAKey(index.toString());
255             Resource tpResource1 = new ResourceBuilder().setResource(stp).build();
256             ZToA stpResource = new ZToABuilder().setId(tpName).setKey(srcTPKey).setResource(tpResource1).build();
257             index++;
258             etoelist.add(stpResource);
259
260             String linkName = pcelink.getLinkId().getValue();
261             // Link
262             org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.pce
263                 .resource.resource.resource.Link ztoaLink = new LinkBuilder()
264                 .setLinkIdentifier(new LinkIdentifierBuilder().setLinkId(linkName).build()).build();
265
266             // Link Resource
267             ZToAKey linkKey = new ZToAKey(index.toString());
268             Resource nodeResource2 = new ResourceBuilder().setResource(ztoaLink).build();
269             ZToA linkResource = new ZToABuilder().setId(linkName).setKey(linkKey).setResource(nodeResource2).build();
270             index++;
271             etoelist.add(linkResource);
272
273             String destName = pcelink.getDestId().getValue();
274             // target TP
275             tpName = pcelink.getDestTP().toString();
276             TerminationPoint ttp = new TerminationPointBuilder()
277                     .setTerminationPointIdentifier(new TerminationPointIdentifierBuilder()
278                             .setNodeId(destName).setTpId(tpName).build())
279                     .build();
280
281             // Resource
282             ZToAKey destTPKey = new ZToAKey(index.toString());
283             Resource tpResource2 = new ResourceBuilder().setResource(ttp).build();
284             ZToA ttpResource = new ZToABuilder().setId(tpName).setKey(destTPKey).setResource(tpResource2).build();
285             index++;
286             etoelist.add(ttpResource);
287
288
289             org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.pce
290                 .resource.resource.resource.Node targetNode = new NodeBuilder()
291                 .setNodeIdentifier(new NodeIdentifierBuilder().setNodeId(destName).build()).build();
292             // Target Resource
293             ZToAKey targetKey = new ZToAKey(index.toString());
294             Resource nodeResource3 = new ResourceBuilder().setResource(targetNode).build();
295             lastResource = new ZToABuilder().setId(destName).setKey(targetKey).setResource(nodeResource3).build();
296
297             lastLink = pcelink;
298         }
299         etoelist.add(lastResource);
300
301         // build Z side Client TP
302         tpName = lastLink.getClient();
303         xname = lastLink.getDestId().getValue();
304         stp = new TerminationPointBuilder()
305                 .setTerminationPointIdentifier(new TerminationPointIdentifierBuilder()
306                         .setNodeId(xname).setTpId(tpName).build())
307                 .build();
308
309
310         index++;
311         clientKey = new ZToAKey(index.toString());
312         clientResource = new ResourceBuilder().setResource(stp).build();
313         lastResource = new ZToABuilder().setId(tpName).setKey(clientKey).setResource(clientResource).build();
314         etoelist.add(lastResource);
315
316     }
317
318 }