b2f495782c50e9e411fc143f22fe612c80779724
[nemo.git] / nemo-renderers / cli-renderer / src / main / java / org / opendaylight / nemo / renderer / cli / CliBuilder.java
1 /*\r
2  * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 \r
9 package org.opendaylight.nemo.renderer.cli;\r
10 \r
11 import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalNetwork;\r
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.PhysicalLinks;\r
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.PhysicalPaths;\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNode;\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.paths.PhysicalPath;\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.paths.PhysicalPathBuilder;\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.VirtualNetwork;\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.UserIntentVnMapping;\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.user.intent.vn.mapping.IntentVnMappingResult;\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.user.intent.vn.mapping.intent.vn.mapping.result.VirtualResource;\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.vn.pn.mapping.results.UserVnPnMapping;\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.vn.pn.mapping.results.user.vn.pn.mapping.VnPnMappingResult;\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.ConnectionId;\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.NodeId;\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalLinkId;\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalNodeId;\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalPortId;\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Connection;\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Node;\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.User;\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.connection.instance.EndNode;\r
33 import org.slf4j.Logger;\r
34 import org.slf4j.LoggerFactory;\r
35 \r
36 import java.util.*;\r
37 \r
38 /**\r
39  *\r
40  * @author Shixing Liu\r
41  */\r
42 public class CliBuilder implements AutoCloseable {\r
43     private static final Logger LOG = LoggerFactory.getLogger(CliBuilder.class);\r
44 \r
45     private final DataBroker dataProvider;\r
46 \r
47     private final TelnetUtils telnetUtils;\r
48 \r
49     /**\r
50      * Constructor\r
51      *\r
52      * @param dataProvider\r
53      */\r
54     public CliBuilder(DataBroker dataProvider) {\r
55         super();\r
56 \r
57         this.dataProvider = dataProvider;\r
58 \r
59         LOG.info("New TelnetUtils.");\r
60         telnetUtils = new TelnetUtils();\r
61 \r
62         LOG.info("Initialized CliBuilder.");\r
63 \r
64                 return;\r
65     }\r
66 \r
67     /**\r
68      *\r
69      * @param physicalNodes\r
70      */\r
71     public void init(List<PhysicalNode> physicalNodes) {\r
72         for ( PhysicalNode physicalNode : physicalNodes ) {\r
73             // TODO:\r
74         }\r
75 \r
76                 return;\r
77     }\r
78 \r
79     /**\r
80      *\r
81      * @param nodeId\r
82      * @param userIntentVnMapping\r
83      * @param userVnPnMapping\r
84      * @return\r
85      */\r
86     private VnPnMappingResult getNodeVnPnMappingResult(NodeId nodeId,\r
87                                                        UserIntentVnMapping userIntentVnMapping,\r
88                                                        UserVnPnMapping userVnPnMapping)\r
89     {\r
90         VnPnMappingResult vnPnMappingResultforNode = null;\r
91         List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
92 \r
93         //System.out.println("intentVnMappingResults size = " + intentVnMappingResults.size());\r
94         for(IntentVnMappingResult intentVnMappingResult: intentVnMappingResults){\r
95             if(intentVnMappingResult.getIntentId().getValue().equals(nodeId.getValue())){\r
96 \r
97                 List<VirtualResource> virtualResources = intentVnMappingResult.getVirtualResource();\r
98                 //System.out.println("virtualResources size()= "+ virtualResources.size());\r
99                 for(VirtualResource virtualResource: virtualResources){\r
100                     if(VirtualResource.VirtualResourceType.Vport\r
101                             == virtualResource.getVirtualResourceType()){\r
102                         List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();\r
103                         for(VnPnMappingResult vnPnMappingResult: vnPnMappingResults){\r
104                             if(vnPnMappingResult.getVirtualResourceEntityId().getValue()\r
105                                     .equals(virtualResource.getVirtualResourceEntityId().getValue())){\r
106 \r
107                                 System.out.println("equals(virtualResource.getVirtualResourceEntityId())");\r
108                                 vnPnMappingResultforNode = vnPnMappingResult;\r
109                                 break;\r
110                             }\r
111                         }\r
112                         break;\r
113                     }\r
114                 }\r
115                 break;\r
116             }\r
117         }\r
118         return  vnPnMappingResultforNode;\r
119     }\r
120 \r
121     /**\r
122      *\r
123      * @param connection\r
124      * @param user\r
125      * @return\r
126      */\r
127     private Boolean isConnectTwoExtGroup(Connection connection, User user){\r
128         List<EndNode> endNodeList = connection.getEndNode();\r
129         Boolean isTwoExtGroup = Boolean.TRUE;\r
130         for(EndNode endnode:endNodeList){\r
131             NodeId nodeId =  endnode.getNodeId();\r
132             List<Node> nodeList = user.getObjects().getNode();\r
133             for(Node node:nodeList){\r
134                 if(node.getNodeId().equals(nodeId)){\r
135                     //System.out.println(node.getNodeType().getValue());\r
136                     if(! node.getNodeType().getValue().equals("ext-group")){\r
137                         isTwoExtGroup = Boolean.FALSE;\r
138                         break;\r
139                     }\r
140                 }\r
141             }\r
142             if( isTwoExtGroup == Boolean.FALSE){\r
143                 break;\r
144             }\r
145         }\r
146         //System.out.println("isConnectTwoExtGroup = "+ isTwoExtGroup.booleanValue());\r
147         return  isTwoExtGroup;\r
148     }\r
149 \r
150     /**\r
151      *\r
152      * @param physicalLinkId\r
153      * @param physicalNetwork\r
154      * @return\r
155      */\r
156     private PhysicalNodeId getSrcNodeIdforLinkInPath(PhysicalLinkId physicalLinkId,\r
157                                                      PhysicalNetwork physicalNetwork){\r
158 \r
159         PhysicalNodeId physicalNodeId = null;\r
160         PhysicalLinks physicalLinksInNetwork = physicalNetwork.getPhysicalLinks();\r
161         List<org.opendaylight.yang.gen.v1.urn.opendaylight.params\r
162                 .xml.ns.yang.generic.physical.network.rev151010\r
163                 .physical.network.physical.links.PhysicalLink>\r
164                 physicalLinksInNetworkList = physicalLinksInNetwork.getPhysicalLink();\r
165         for(org.opendaylight.yang.gen.v1.urn.opendaylight.params\r
166                 .xml.ns.yang.generic.physical.network.rev151010\r
167                 .physical.network.physical.links\r
168                 .PhysicalLink physicalLink :physicalLinksInNetworkList) {\r
169 \r
170             if (physicalLink.getLinkId().getValue().equals(physicalLinkId.getValue())) {\r
171                 physicalNodeId = physicalLink.getSrcNodeId();\r
172             }\r
173         }\r
174         return  physicalNodeId;\r
175     }\r
176 \r
177     /**\r
178      *\r
179      * @param physicalLinkId\r
180      * @param physicalNetwork\r
181      * @return\r
182      */\r
183     private PhysicalPortId getSrcPortIdforLinkInPath(PhysicalLinkId physicalLinkId,\r
184                                                      PhysicalNetwork physicalNetwork){\r
185 \r
186         PhysicalPortId physicalPortId = null;\r
187         PhysicalLinks physicalLinksInNetwork = physicalNetwork.getPhysicalLinks();\r
188         List<org.opendaylight.yang.gen.v1.urn.opendaylight.params\r
189                 .xml.ns.yang.generic.physical.network.rev151010\r
190                 .physical.network.physical.links.PhysicalLink>\r
191                 physicalLinksInNetworkList = physicalLinksInNetwork.getPhysicalLink();\r
192         for(org.opendaylight.yang.gen.v1.urn.opendaylight.params\r
193                 .xml.ns.yang.generic.physical.network.rev151010\r
194                 .physical.network.physical.links\r
195                 .PhysicalLink physicalLink :physicalLinksInNetworkList) {\r
196 \r
197             if (physicalLink.getLinkId().getValue().equals(physicalLinkId.getValue())) {\r
198                 physicalPortId = physicalLink.getSrcPortId();\r
199             }\r
200         }\r
201         return  physicalPortId;\r
202     }\r
203 \r
204     /**\r
205      *\r
206      * @param physicalLinkId\r
207      * @param physicalNetwork\r
208      * @return\r
209      */\r
210     private PhysicalNodeId getDestNodeIdforLinkInPath(PhysicalLinkId physicalLinkId,\r
211                                                      PhysicalNetwork physicalNetwork){\r
212 \r
213         PhysicalNodeId physicalNodeId = null;\r
214         PhysicalLinks physicalLinksInNetwork = physicalNetwork.getPhysicalLinks();\r
215         List<org.opendaylight.yang.gen.v1.urn.opendaylight.params\r
216                 .xml.ns.yang.generic.physical.network.rev151010\r
217                 .physical.network.physical.links.PhysicalLink>\r
218                 physicalLinksInNetworkList = physicalLinksInNetwork.getPhysicalLink();\r
219         for(org.opendaylight.yang.gen.v1.urn.opendaylight.params\r
220                 .xml.ns.yang.generic.physical.network.rev151010\r
221                 .physical.network.physical.links\r
222                 .PhysicalLink physicalLink :physicalLinksInNetworkList) {\r
223 \r
224             if (physicalLink.getLinkId().getValue().equals(physicalLinkId.getValue())) {\r
225                 physicalNodeId = physicalLink.getDestNodeId();\r
226             }\r
227         }\r
228         return  physicalNodeId;\r
229     }\r
230 \r
231     /**\r
232      *\r
233      * @param physicalLinkId\r
234      * @param physicalNetwork\r
235      * @return\r
236      */\r
237     private PhysicalPortId getDestPortIdforLinkInPath(PhysicalLinkId physicalLinkId,\r
238                                                       PhysicalNetwork physicalNetwork){\r
239 \r
240         PhysicalPortId physicalPortId = null;\r
241         PhysicalLinks physicalLinksInNetwork = physicalNetwork.getPhysicalLinks();\r
242         List<org.opendaylight.yang.gen.v1.urn.opendaylight.params\r
243                 .xml.ns.yang.generic.physical.network.rev151010\r
244                 .physical.network.physical.links.PhysicalLink>\r
245                 physicalLinksInNetworkList = physicalLinksInNetwork.getPhysicalLink();\r
246         for(org.opendaylight.yang.gen.v1.urn.opendaylight.params\r
247                 .xml.ns.yang.generic.physical.network.rev151010\r
248                 .physical.network.physical.links\r
249                 .PhysicalLink physicalLink :physicalLinksInNetworkList) {\r
250 \r
251             if (physicalLink.getLinkId().getValue().equals(physicalLinkId.getValue())) {\r
252                 physicalPortId = physicalLink.getDestPortId();\r
253             }\r
254         }\r
255         return  physicalPortId;\r
256     }\r
257 \r
258     /**\r
259      *\r
260      * @param onePhysicalNodeId\r
261      * @param otherPhysicalNodeId\r
262      * @param physicalNetwork\r
263      * @return\r
264      */\r
265     private PhysicalPath getPhysicalPathforConnection(PhysicalNodeId onePhysicalNodeId,\r
266                                                       PhysicalNodeId otherPhysicalNodeId,\r
267                                                       PhysicalNetwork physicalNetwork){\r
268 \r
269         PhysicalPath physicalPathforConnection = null;\r
270         PhysicalPaths physicalPaths = physicalNetwork.getPhysicalPaths();\r
271         if(null == physicalPaths.getPhysicalPath()){\r
272             LOG.info("PhysicalPath are null");\r
273             return physicalPathforConnection;\r
274         }\r
275 \r
276         PhysicalNodeId firstNodeIdforPath = null;\r
277         PhysicalNodeId lastNodeIdforPath = null;\r
278         List<PhysicalPath> physicalPathList = physicalPaths.getPhysicalPath();\r
279 \r
280         for(PhysicalPath physicalPath:physicalPathList) {\r
281 \r
282             PhysicalPath soredPhysicalPath = sortPhysicalLinksOfPhysicalPath(physicalPath);\r
283             List< org.opendaylight.yang.gen.v1.urn.opendaylight.params\r
284                     .xml.ns.yang.generic.physical.network.rev151010\r
285                     .physical.path.instance.PhysicalLink> physicalLinks = soredPhysicalPath.getPhysicalLink();\r
286 \r
287             if(physicalLinks != null && physicalLinks.size() > 0){\r
288 \r
289                 PhysicalLinkId firstPhysicalLinkId = physicalLinks.get(0).getLinkId();\r
290                 PhysicalLinkId lastPhysicalLinkId = physicalLinks.get(physicalLinks.size()-1).getLinkId();\r
291 \r
292                 firstNodeIdforPath = getSrcNodeIdforLinkInPath(firstPhysicalLinkId, physicalNetwork);\r
293                 lastNodeIdforPath = getDestNodeIdforLinkInPath(lastPhysicalLinkId, physicalNetwork);\r
294                 if((firstNodeIdforPath != null)\r
295                         && (lastNodeIdforPath != null)\r
296                         && (firstNodeIdforPath.getValue().equals(onePhysicalNodeId.getValue()))\r
297                         && (lastNodeIdforPath.getValue().equals(otherPhysicalNodeId.getValue()))){\r
298 \r
299                     physicalPathforConnection = soredPhysicalPath;\r
300                     break;\r
301                 }\r
302             }\r
303         }\r
304 \r
305         return  physicalPathforConnection;\r
306     }\r
307 \r
308     /**\r
309      *\r
310      * @param physicalPath\r
311      * @return\r
312      */\r
313     private PhysicalPath sortPhysicalLinksOfPhysicalPath(PhysicalPath physicalPath) {\r
314         if ( physicalPath.getPhysicalLink().isEmpty()\r
315                 || 1 == physicalPath.getPhysicalLink().size() ) {\r
316             return physicalPath;\r
317         }\r
318 \r
319         List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.path.instance.PhysicalLink> sortedPhysicalLinks =\r
320                 new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.path.instance.PhysicalLink>(physicalPath.getPhysicalLink().size());\r
321         sortedPhysicalLinks.addAll(physicalPath.getPhysicalLink());\r
322 \r
323         for ( org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.path.instance.PhysicalLink\r
324                 physicalLink : physicalPath.getPhysicalLink() ) {\r
325             sortedPhysicalLinks.set(physicalLink.getOrder().intValue(), physicalLink);\r
326         }\r
327         PhysicalPath physicalPath1 = new PhysicalPathBuilder(physicalPath)\r
328                 .setPhysicalLink(sortedPhysicalLinks)\r
329                 .build();\r
330 \r
331         return physicalPath1;\r
332     }\r
333 \r
334     /**\r
335      *\r
336      */\r
337     private class ConfigElementForConnection {\r
338 \r
339         public PhysicalNodeId getPhysicalNodeId() {\r
340             return physicalNodeId;\r
341         }\r
342 \r
343         public void setPhysicalNodeId(PhysicalNodeId physicalNodeId) {\r
344             this.physicalNodeId = physicalNodeId;\r
345         }\r
346 \r
347         public PhysicalPortId getInnerPhysicalPortId() {\r
348             return innerPhysicalPortId;\r
349         }\r
350 \r
351         public void setInnerPhysicalPortId(PhysicalPortId innerPhysicalPortId) {\r
352             this.innerPhysicalPortId = innerPhysicalPortId;\r
353         }\r
354 \r
355         public PhysicalPortId getOuterPhysicalPortId() {\r
356             return outerPhysicalPortId;\r
357         }\r
358 \r
359         public void setOuterPhysicalPortId(PhysicalPortId outerPhysicalPortId) {\r
360             this.outerPhysicalPortId = outerPhysicalPortId;\r
361         }\r
362         private PhysicalNodeId physicalNodeId;\r
363         private PhysicalPortId innerPhysicalPortId;\r
364         private PhysicalPortId outerPhysicalPortId;\r
365 \r
366     }\r
367 \r
368     /**\r
369      *\r
370      * @param physicalPath\r
371      * @param physicalNetwork\r
372      * @param onePhysicalPortId\r
373      * @param otherPhysicalPortId\r
374      * @return\r
375      */\r
376     private List<ConfigElementForConnection> getConfigElementListForConnection(\r
377                                                                            PhysicalPath physicalPath,\r
378                                                                            PhysicalNetwork physicalNetwork,\r
379                                                                            PhysicalPortId onePhysicalPortId,\r
380                                                                            PhysicalPortId otherPhysicalPortId\r
381                                                                            ){\r
382 \r
383         List<ConfigElementForConnection> configElementListForConnection = new ArrayList<ConfigElementForConnection>();\r
384 \r
385         if((physicalPath == null)){\r
386             return  configElementListForConnection;\r
387         }\r
388         List< org.opendaylight.yang.gen.v1.urn.opendaylight.params\r
389                 .xml.ns.yang.generic.physical.network.rev151010\r
390                 .physical.path.instance.PhysicalLink> physicalLinks = physicalPath.getPhysicalLink();\r
391 \r
392         Iterator<org.opendaylight.yang.gen.v1.urn.opendaylight.params\r
393                 .xml.ns.yang.generic.physical.network.rev151010\r
394                 .physical.path.instance.PhysicalLink> physicalLinkInPathIter = physicalLinks.iterator();\r
395 \r
396         int counter = -1;\r
397 \r
398         org.opendaylight.yang.gen.v1.urn.opendaylight.params\r
399                 .xml.ns.yang.generic.physical.network.rev151010\r
400                 .physical.path.instance.PhysicalLink previousPhysicalLink = null;\r
401 \r
402         Boolean crossWAN = Boolean.FALSE;\r
403 \r
404         while (physicalLinkInPathIter.hasNext()) {\r
405             //first device\r
406             counter = counter + 1;\r
407             if(0 == counter){\r
408                 ConfigElementForConnection configElementForConnection = new ConfigElementForConnection();\r
409 \r
410                 //save previous link\r
411                 previousPhysicalLink = physicalLinkInPathIter.next();\r
412 \r
413                 PhysicalLinkId physicalLinkId = previousPhysicalLink.getLinkId();\r
414                 PhysicalNodeId physicalSrcNodeId = getSrcNodeIdforLinkInPath(physicalLinkId, physicalNetwork);\r
415                 PhysicalPortId physicalSrcPortId = getSrcPortIdforLinkInPath(physicalLinkId, physicalNetwork);\r
416                 configElementForConnection.setPhysicalNodeId(physicalSrcNodeId);\r
417                 configElementForConnection.setInnerPhysicalPortId(physicalSrcPortId);\r
418                 configElementForConnection.setOuterPhysicalPortId(onePhysicalPortId);\r
419                 configElementListForConnection.add(configElementForConnection);\r
420             }\r
421             else {\r
422 \r
423                 //for middle devices\r
424                 ConfigElementForConnection configElementForConnection = new ConfigElementForConnection();\r
425                 org.opendaylight.yang.gen.v1.urn.opendaylight.params\r
426                         .xml.ns.yang.generic.physical.network.rev151010\r
427                         .physical.path.instance.PhysicalLink currentPhysicalLink = physicalLinkInPathIter.next();\r
428 \r
429                 PhysicalLinkId currentPhysicalLinkId = currentPhysicalLink.getLinkId();\r
430                 PhysicalNodeId physicalSrcNodeId = getSrcNodeIdforLinkInPath(currentPhysicalLinkId, physicalNetwork);\r
431                 PhysicalPortId physicalSrcPortId = getSrcPortIdforLinkInPath(currentPhysicalLinkId, physicalNetwork);\r
432                 configElementForConnection.setPhysicalNodeId(physicalSrcNodeId);\r
433 \r
434                 PhysicalLinkId previousPhysicalLinkId = previousPhysicalLink.getLinkId();\r
435                 PhysicalPortId physicalDestNodeId = getDestPortIdforLinkInPath(previousPhysicalLinkId, physicalNetwork);\r
436 \r
437                 if(Boolean.FALSE == crossWAN) {\r
438                     configElementForConnection.setInnerPhysicalPortId(physicalSrcPortId);\r
439                     configElementForConnection.setOuterPhysicalPortId(physicalDestNodeId);\r
440                     //if cross WAN\r
441                     if(physicalSrcNodeId.getValue().contains(":PE")){\r
442 \r
443                         crossWAN = Boolean.TRUE;\r
444                     }\r
445                 }else{\r
446                     configElementForConnection.setInnerPhysicalPortId(physicalDestNodeId);\r
447                     configElementForConnection.setOuterPhysicalPortId(physicalSrcPortId);\r
448 \r
449                 }\r
450                 configElementListForConnection.add(configElementForConnection);\r
451                 //for last device\r
452                 if((counter + 1) == physicalLinks.size()){\r
453 \r
454                     ConfigElementForConnection lastconfigElementForConnection = new ConfigElementForConnection();\r
455                     PhysicalNodeId lastphysicalDestNodeId = getDestNodeIdforLinkInPath(currentPhysicalLinkId, physicalNetwork);\r
456                     PhysicalPortId lastphysicalDestPortId = getDestPortIdforLinkInPath(currentPhysicalLinkId, physicalNetwork);\r
457                     lastconfigElementForConnection.setPhysicalNodeId(lastphysicalDestNodeId);\r
458                     lastconfigElementForConnection.setInnerPhysicalPortId(lastphysicalDestPortId);\r
459                     lastconfigElementForConnection.setOuterPhysicalPortId(otherPhysicalPortId);\r
460                     configElementListForConnection.add(lastconfigElementForConnection);\r
461                 }\r
462                 previousPhysicalLink = currentPhysicalLink;// alternate\r
463             }\r
464         }\r
465 \r
466         return  configElementListForConnection;\r
467     }\r
468 \r
469     /**\r
470      *\r
471      * @param configElementListForConnection\r
472      * @return\r
473      */\r
474     private List<ConfigElementForConnection> getPeersOfPEs(\r
475             List<ConfigElementForConnection> configElementListForConnection){\r
476 \r
477         List<ConfigElementForConnection> peersOfPEs = new ArrayList<ConfigElementForConnection>();\r
478         for(ConfigElementForConnection c: configElementListForConnection){\r
479 \r
480             if(c.getPhysicalNodeId().getValue().contains(":PE")){\r
481                 peersOfPEs.add(c);\r
482             }\r
483         }\r
484         return  peersOfPEs;\r
485     }\r
486 \r
487     /**\r
488      *\r
489      * @param oneNode\r
490      * @param anotherNode\r
491      * @param peersList\r
492      * @return\r
493      */\r
494     private Boolean isInPeersList(PhysicalNodeId oneNode,\r
495                                   PhysicalNodeId anotherNode,\r
496                                   List<List<ConfigElementForConnection>> peersList){\r
497 \r
498         for(List<ConfigElementForConnection> peers:peersList) {\r
499             ConfigElementForConnection configElementOnePE = (ConfigElementForConnection) peers.get(0);\r
500             ConfigElementForConnection configElementAnother = (ConfigElementForConnection) peers.get(1);\r
501 \r
502            if(configElementOnePE.getPhysicalNodeId().getValue().equals(oneNode.getValue())&&\r
503               configElementAnother.getPhysicalNodeId().getValue().equals(anotherNode.getValue())){\r
504 \r
505                return  Boolean.TRUE;\r
506            }\r
507         }\r
508         System.out.println("isInPeersList() = Boolean.FALSE");\r
509         return  Boolean.FALSE;\r
510     }\r
511 \r
512     /**\r
513      *\r
514      * @param peersList\r
515      * @return\r
516      */\r
517     public Boolean isFullMeshTopology(List<List<ConfigElementForConnection>> peersList){\r
518 \r
519         List<PhysicalNodeId> beUsedPEs = new ArrayList<PhysicalNodeId>();\r
520 \r
521         for(List<ConfigElementForConnection> peers:peersList){\r
522             ConfigElementForConnection configElementOnePE  = (ConfigElementForConnection)peers.get(0);\r
523             ConfigElementForConnection configElementAnother  = (ConfigElementForConnection)peers.get(1);\r
524             if(!beUsedPEs.contains(configElementOnePE.getPhysicalNodeId())){\r
525                 beUsedPEs.add(configElementOnePE.getPhysicalNodeId());\r
526             }\r
527             if(!beUsedPEs.contains(configElementAnother.getPhysicalNodeId())){\r
528                 beUsedPEs.add(configElementAnother.getPhysicalNodeId());\r
529             }\r
530         }\r
531 \r
532         for(int i =0; i<beUsedPEs.size(); i++){\r
533 \r
534             PhysicalNodeId oneNode = (PhysicalNodeId)beUsedPEs.get(i);\r
535             for(int j= i+1; j<beUsedPEs.size(); j++){\r
536                 PhysicalNodeId anotherNode = (PhysicalNodeId)beUsedPEs.get(j);\r
537                 if(isInPeersList(oneNode, anotherNode, peersList)== Boolean.FALSE){\r
538 \r
539                     return  Boolean.FALSE;\r
540                 }\r
541             }\r
542         }\r
543 \r
544         System.out.println("isFullMeshTopology() =  Boolean.TRUE");\r
545         return  Boolean.TRUE;\r
546     }\r
547 \r
548     /**\r
549      *\r
550      * @param physicalNodeId\r
551      * @param VPNPEs\r
552      * @return\r
553      */\r
554     private Boolean hasThisPE(PhysicalNodeId physicalNodeId,\r
555                               List<Map<PhysicalNodeId, PhysicalPortId>> VPNPEs){\r
556 \r
557         Boolean hasThisPE = Boolean.FALSE;\r
558         for(Map<PhysicalNodeId, PhysicalPortId> pe: VPNPEs){\r
559 \r
560             if(pe.containsKey(physicalNodeId) == true){\r
561                 hasThisPE = Boolean.TRUE;\r
562                 break;\r
563             }\r
564         }\r
565         return  hasThisPE;\r
566     }\r
567 \r
568     /**\r
569      *\r
570      * @param paramList\r
571      * @param template\r
572      * @return\r
573      */\r
574     private String getClis(List<String> paramList, String template){\r
575 \r
576         for(int i=0;i<paramList.size();i++){\r
577 \r
578             String paramSymbol = "#"+(i+1)+"#";\r
579             String paramValue = paramList.get(i);\r
580             template = template.replace(paramSymbol, paramValue);\r
581         }\r
582         return  template;\r
583     }\r
584 \r
585     /**\r
586      *\r
587      * @param peersList\r
588      */\r
589     private void buildFullMeshVPN(List<List<ConfigElementForConnection>> peersList){\r
590 \r
591         List<Map<PhysicalNodeId, PhysicalPortId>> VPNPEs = new ArrayList<Map<PhysicalNodeId, PhysicalPortId>>();\r
592         for(List<ConfigElementForConnection> peers:peersList){\r
593 \r
594             ConfigElementForConnection configElementOnePE  = (ConfigElementForConnection)peers.get(0);\r
595             ConfigElementForConnection configElementAnother  = (ConfigElementForConnection)peers.get(1);\r
596 \r
597             if(hasThisPE(configElementOnePE.getPhysicalNodeId(), VPNPEs)== Boolean.FALSE){\r
598                 Map<PhysicalNodeId, PhysicalPortId> accessPEInfo = new HashMap<PhysicalNodeId, PhysicalPortId>() ;\r
599                 accessPEInfo.put(configElementOnePE.getPhysicalNodeId(),\r
600                         configElementOnePE.getOuterPhysicalPortId());\r
601                 VPNPEs.add(accessPEInfo);\r
602             }\r
603             if(hasThisPE(configElementAnother.getPhysicalNodeId(), VPNPEs)== Boolean.FALSE){\r
604                 Map<PhysicalNodeId, PhysicalPortId> accessPEInfo = new HashMap<PhysicalNodeId, PhysicalPortId>() ;\r
605                 accessPEInfo.put(configElementAnother.getPhysicalNodeId(),\r
606                         configElementAnother.getOuterPhysicalPortId());\r
607                 VPNPEs.add(accessPEInfo);\r
608             }\r
609         }\r
610 \r
611         for(Map<PhysicalNodeId, PhysicalPortId> pe: VPNPEs) {\r
612             Iterator iter = pe.entrySet().iterator();\r
613             while (iter.hasNext()) {\r
614 \r
615                 //build cli according to template\r
616                 String l3VPNTemplate = new String(\r
617                                 "interface  #1#\n" +\r
618                                 "ip address   #2#\n" +\r
619                                 "undo shutdown\n" +\r
620                                 "quit\n" +\r
621                                 "\n" +\r
622                                 "ospf  #3#\n" +\r
623                                 "area  #4#\n" +\r
624                                 "network   #5#\n" +\r
625                                 "quit\n" +\r
626                                 "quit\n" +\r
627                                 "\n" +\r
628                                 "ip vpn-instance  #6#\n" +\r
629                                 "route-distinguisher   #7#\n" +\r
630                                 "vpn-target  #8#\n" +\r
631                                 "quit\n" +\r
632                                 "quit\n" +\r
633                                 "\n" +\r
634                                 "interface  #1#\n" +\r
635                                 "ip binding vpn-instance  #6#\n" +\r
636                                 "quit\n" +\r
637                                 "\n" +\r
638                                 "bgp  #9#\n" +\r
639                                 "ipv4-family vpn-instance  #6#\n" +\r
640                                 "peer  #10#  as-number  #11#\n" +\r
641                                 "import-route direct\n" +\r
642                                 "quit\n" +\r
643                                 "quit\n" +\r
644                                 "interface  #1#\n" +\r
645                                 "ip address   #2#\n" +\r
646                                 "undo shutdown\n" +\r
647                                 "quit\n" +\r
648                                 "\n");\r
649 \r
650 \r
651                 String clearL3VPNTemplate = new String(\r
652                         "interface #1#\n" +\r
653                         "undo ip address #2#\n" +\r
654                         "quit\n" +\r
655                         "ospf #3# \n" +\r
656                         "area #4# \n" +\r
657                         "undo network #5#\n" +\r
658                         "quit\n" +\r
659                         "quit\n" +\r
660                         "undo ip vpn-instance #6#\n");\r
661 \r
662                 Map.Entry entry = (Map.Entry) iter.next();\r
663                 PhysicalNodeId key = (PhysicalNodeId)entry.getKey();\r
664                 PhysicalPortId val = (PhysicalPortId)entry.getValue();\r
665 \r
666                 //for test\r
667                 //System.out.println("PE ="+key.getValue());\r
668                 //System.out.println("ACPort="+val.getValue());\r
669 \r
670                 //find the deivce\r
671                 String deviceName = key.getValue();\r
672 \r
673                 /*\r
674                 //(1)fill params from mapping result for template(2,5,10,11)\r
675                 String param_1 = getAccessPortName(val.getValue());\r
676 \r
677                 //(2)fill params from ACInfo config file for template\r
678                 String param_2 = getCEPortIpAddressAndMask();\r
679                 String param_5 = getCEAndPEIpPrefix();\r
680                 String param_10 = getPEAccessPortIpAddress();\r
681                 String param_11 = getCEBGPNumber();\r
682 \r
683                 //(3)fill params from deivce config(3,4,9)\r
684                 String param_3 = getOSPFNumberforPE();\r
685                 String param_4 = getAreaNumberforPE();\r
686                 String param_9 = getBGPNumberforPE();\r
687 \r
688                 //(4)fill params from automatic generation for template\r
689                 String param_6 = generateVPNName();\r
690                 String param_7 = generateVPNRD();\r
691                 String param_8 = generateVPNTarget();\r
692                 */\r
693 \r
694 \r
695                 //(1)fill params from mapping result for template(2,5,10,11)\r
696                 String param_1 = "";\r
697                 //(2)fill params from ACInfo config file for template\r
698                 String param_2 = "";\r
699                 String param_5 = "";\r
700                 String param_10 = "";\r
701                 String param_11 = "";\r
702 \r
703                 //(3)fill params from deivce config(3,4,9)\r
704                 String param_3 = "";\r
705                 String param_4 = "";\r
706                 String param_9 = "";\r
707 \r
708                 //(4)fill params from automatic generation for template\r
709                 String param_6 = "";\r
710                 String param_7 = "";\r
711                 String param_8 = "";\r
712 \r
713                 if(deviceName.contains("PE1")){\r
714 \r
715                     //(1)fill params from mapping result for template(2,5,10,11)\r
716                     param_1 = "GigabitEthernet 2/0/6";\r
717 \r
718                     //(2)fill params from ACInfo config file for template\r
719                     param_2 = "168.1.1.3 255.255.255.0";\r
720                     param_5 = "168.1.1.0  0.0.0.255";\r
721                     param_10 = "168.1.1.2";\r
722                     param_11 = "100";\r
723 \r
724                     //(3)fill params from deivce config(3,4,9)\r
725                     param_3 = "1";\r
726                     param_4 = "0";\r
727                     param_9 = "200";\r
728 \r
729                     //(4)fill params from automatic generation for template\r
730                     param_6 = "vpn1";\r
731                     param_7 = "100:1";\r
732                     param_8 = "1:1";\r
733 \r
734                 }else if(deviceName.contains("PE2")){\r
735 \r
736                     //(1)fill params from mapping result for template(2,5,10,11)\r
737                     param_1 = "GigabitEthernet 3/0/3";\r
738 \r
739                     //(2)fill params from ACInfo config file for template\r
740                     param_2 = "174.1.1.3 255.255.255.0";\r
741                     param_5 = "174.1.1.0  0.0.0.255";\r
742                     param_10 = "174.1.1.2";\r
743                     param_11 = "100";\r
744 \r
745                     //(3)fill params from deivce config(3,4,9)\r
746                     param_3 = "1";\r
747                     param_4 = "0";\r
748                     param_9 = "200";\r
749 \r
750                     //(4)fill params from automatic generation for template\r
751                     param_6 = "vpn1";\r
752                     param_7 = "100:1";\r
753                     param_8 = "1:1";\r
754 \r
755                 }else if(deviceName.contains("PE3")){\r
756 \r
757                     //(1)fill params from mapping result for template(2,5,10,11)\r
758                     param_1 = "GigabitEthernet 1/0/0";\r
759 \r
760                     //(2)fill params from ACInfo config file for template\r
761                     param_2 = "172.1.1.2 255.255.255.0";\r
762                     param_5 = "172.1.1.0 0.0.0.255";\r
763                     param_10 = "172.1.1.3";\r
764                     param_11 = "100";\r
765 \r
766                     //(3)fill params from deivce config(3,4,9)\r
767                     param_3 = "1";\r
768                     param_4 = "0";\r
769                     param_9 = "200";\r
770 \r
771                     //(4)fill params from automatic generation for template\r
772                     param_6 = "vpn1";\r
773                     param_7 = "100:1";\r
774                     param_8 = "1:1";\r
775                 }\r
776 \r
777                 List<String> paramListForL3VPNConfig = new ArrayList<String>();\r
778                 paramListForL3VPNConfig.add(param_1);\r
779                 paramListForL3VPNConfig.add(param_2);\r
780                 paramListForL3VPNConfig.add(param_3);\r
781                 paramListForL3VPNConfig.add(param_4);\r
782                 paramListForL3VPNConfig.add(param_5);\r
783                 paramListForL3VPNConfig.add(param_6);\r
784                 paramListForL3VPNConfig.add(param_7);\r
785                 paramListForL3VPNConfig.add(param_8);\r
786                 paramListForL3VPNConfig.add(param_9);\r
787                 paramListForL3VPNConfig.add(param_10);\r
788                 paramListForL3VPNConfig.add(param_11);\r
789                 String cliExecutionSequences = getClis(paramListForL3VPNConfig, l3VPNTemplate);\r
790 \r
791                 List<String> clearPramListForL3VPNConfig = new ArrayList<String>();\r
792                 clearPramListForL3VPNConfig.add(param_1);\r
793                 clearPramListForL3VPNConfig.add(param_2);\r
794                 clearPramListForL3VPNConfig.add(param_3);\r
795                 clearPramListForL3VPNConfig.add(param_4);\r
796                 clearPramListForL3VPNConfig.add(param_5);\r
797                 clearPramListForL3VPNConfig.add(param_6);\r
798                 String clearOldConfigString = getClis(clearPramListForL3VPNConfig, clearL3VPNTemplate);\r
799 \r
800                 //TODO: write data to DataStore\r
801                 //Current Test means to call telnet client to send down command lines\r
802                 System.out.println();\r
803                 System.out.println("telnetUtils.executionCliOnDevice for "+ deviceName);\r
804                 System.out.println();\r
805 \r
806                 telnetUtils.configL3vpnOnDeviceByCli(deviceName, clearOldConfigString, cliExecutionSequences);\r
807 \r
808                 //wait for execution to complete\r
809                 while (Boolean.TRUE){\r
810 \r
811                     if(telnetUtils.isConfigOver()== Boolean.TRUE){\r
812 \r
813                         break;\r
814                     }else{\r
815                         try {\r
816                             Thread.sleep(3000);\r
817                         } catch (InterruptedException e) {\r
818                             e.printStackTrace();\r
819                         }\r
820                     }\r
821                 }\r
822             }\r
823         }\r
824 \r
825     }\r
826 \r
827     /**\r
828      *\r
829      * @param user\r
830      * @param virtualNetwork\r
831      * @param userIntentVnMapping\r
832      * @param userVnPnMapping\r
833      * @param physicalNetwork\r
834      */\r
835     public void updateCliExecutionSequence(User user,\r
836                                            VirtualNetwork virtualNetwork,\r
837                                            UserIntentVnMapping userIntentVnMapping,\r
838                                            UserVnPnMapping userVnPnMapping,\r
839                                            PhysicalNetwork physicalNetwork) {\r
840 \r
841         LOG.info("CliBuilder is updating cli execution sequences.");\r
842         System.out.println();\r
843         System.out.println("CliBuilder is updating cli execution sequences.");\r
844         System.out.println();\r
845 \r
846         List<List<ConfigElementForConnection>> peersList = new ArrayList<List<ConfigElementForConnection>>();\r
847 \r
848         //search connection\r
849         if(user.getObjects() != null) {\r
850 \r
851             List<Connection> connectionList = user.getObjects().getConnection();\r
852 \r
853             System.out.println("connection size = "+connectionList.size());\r
854             for(Connection connection: connectionList){\r
855 \r
856                 //search connection for two ex-group\r
857                 List<EndNode> endNodeList = connection.getEndNode();\r
858                 if( isConnectTwoExtGroup(connection, user) == Boolean.TRUE ){\r
859 \r
860                     ConnectionId connectionId = connection.getConnectionId();\r
861                     NodeId  oneNodeId = endNodeList.get(0).getNodeId();\r
862                     //System.out.println("endNodeList.get(0).getNodeId()"+endNodeList.get(1).getNodeId().getValue());\r
863                     NodeId  otherNodeId = endNodeList.get(1).getNodeId();\r
864                     //System.out.println("endNodeList.get(1).getNodeId()"+endNodeList.get(1).getNodeId().getValue());\r
865                     PhysicalPortId onePhysicalPortId = null;\r
866                     PhysicalPortId otherPhysicalPortId = null;\r
867                     PhysicalNodeId onePhysicalNodeId = null;\r
868                     PhysicalNodeId otherPhysicalNodeId = null;\r
869                     PhysicalPath physicalPathforConnection = null;\r
870 \r
871                     List<ConfigElementForConnection> configElementListForConnection = new ArrayList<ConfigElementForConnection>();\r
872                     VnPnMappingResult vnPnMappingResultforOneNode =\r
873                             getNodeVnPnMappingResult(oneNodeId, userIntentVnMapping, userVnPnMapping);\r
874 \r
875                     if(vnPnMappingResultforOneNode != null) {\r
876                         onePhysicalPortId = new PhysicalPortId(\r
877                                 vnPnMappingResultforOneNode.getPhysicalResourceEntityId().getValue());\r
878                         System.out.println(\r
879                                 vnPnMappingResultforOneNode.getPhysicalResourceEntityId().getValue());\r
880                         onePhysicalNodeId = new PhysicalNodeId(\r
881                                 vnPnMappingResultforOneNode.getParentPhysicalResourceEntityId().getValue());\r
882                         System.out.println(\r
883                                 vnPnMappingResultforOneNode.getParentPhysicalResourceEntityId().getValue());\r
884 \r
885                     }\r
886 \r
887                     VnPnMappingResult vnPnMappingResultforOtherNode =\r
888                             getNodeVnPnMappingResult(otherNodeId, userIntentVnMapping, userVnPnMapping);\r
889 \r
890                     if(vnPnMappingResultforOtherNode != null) {\r
891                         otherPhysicalPortId = new PhysicalPortId(\r
892                                 vnPnMappingResultforOtherNode.getPhysicalResourceEntityId().getValue());\r
893                         System.out.println(\r
894                                 vnPnMappingResultforOtherNode.getPhysicalResourceEntityId().getValue());\r
895                         otherPhysicalNodeId = new PhysicalNodeId(\r
896                                 vnPnMappingResultforOtherNode.getParentPhysicalResourceEntityId().getValue());\r
897                         System.out.println(\r
898                                 vnPnMappingResultforOtherNode.getParentPhysicalResourceEntityId().getValue());\r
899 \r
900                     }\r
901 \r
902                     physicalPathforConnection = getPhysicalPathforConnection(\r
903                                                  onePhysicalNodeId, otherPhysicalNodeId, physicalNetwork );\r
904 \r
905                     if(physicalPathforConnection != null){\r
906 \r
907                         configElementListForConnection = getConfigElementListForConnection(physicalPathforConnection,\r
908                                                                                            physicalNetwork,\r
909                                                                                            onePhysicalPortId,\r
910                                                                                            otherPhysicalPortId);\r
911                         /*//for test\r
912                         for (ConfigElementForConnection c : configElementListForConnection) {\r
913                             System.out.println();\r
914                             System.out.println(c.getPhysicalNodeId().getValue());\r
915                             System.out.println(c.getOuterPhysicalPortId().getValue());\r
916                             System.out.println(c.getInnerPhysicalPortId().getValue());\r
917                         }*/\r
918                         List<ConfigElementForConnection> peersOfPEs = getPeersOfPEs(configElementListForConnection);\r
919                         peersList.add(peersOfPEs);\r
920 \r
921                     }\r
922                 }\r
923 \r
924             }\r
925 \r
926             //if topo is full mesh\r
927             if(isFullMeshTopology(peersList) == Boolean.TRUE){\r
928                 buildFullMeshVPN(peersList);\r
929             }\r
930         }\r
931     }\r
932 \r
933     /**\r
934      *\r
935      * @throws Exception\r
936      */\r
937         @Override\r
938     public void close() throws Exception {\r
939         if (telnetUtils != null){\r
940             telnetUtils.close();\r
941         }\r
942 \r
943                 return;\r
944     }\r
945 }\r