2 * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.
\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
9 package org.opendaylight.nemo.renderer.cli;
\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
40 * @author Shixing Liu
\r
42 public class CliBuilder implements AutoCloseable {
\r
43 private static final Logger LOG = LoggerFactory.getLogger(CliBuilder.class);
\r
45 private final DataBroker dataProvider;
\r
47 private final TelnetUtils telnetUtils;
\r
52 * @param dataProvider
\r
54 public CliBuilder(DataBroker dataProvider) {
\r
57 this.dataProvider = dataProvider;
\r
59 LOG.info("New TelnetUtils.");
\r
60 telnetUtils = new TelnetUtils();
\r
62 LOG.info("Initialized CliBuilder.");
\r
69 * @param physicalNodes
\r
71 public void init(List<PhysicalNode> physicalNodes) {
\r
72 for ( PhysicalNode physicalNode : physicalNodes ) {
\r
82 * @param userIntentVnMapping
\r
83 * @param userVnPnMapping
\r
86 private VnPnMappingResult getNodeVnPnMappingResult(NodeId nodeId,
\r
87 UserIntentVnMapping userIntentVnMapping,
\r
88 UserVnPnMapping userVnPnMapping)
\r
90 VnPnMappingResult vnPnMappingResultforNode = null;
\r
91 List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();
\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
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
107 System.out.println("equals(virtualResource.getVirtualResourceEntityId())");
\r
108 vnPnMappingResultforNode = vnPnMappingResult;
\r
118 return vnPnMappingResultforNode;
\r
123 * @param connection
\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
142 if( isTwoExtGroup == Boolean.FALSE){
\r
146 //System.out.println("isConnectTwoExtGroup = "+ isTwoExtGroup.booleanValue());
\r
147 return isTwoExtGroup;
\r
152 * @param physicalLinkId
\r
153 * @param physicalNetwork
\r
156 private PhysicalNodeId getSrcNodeIdforLinkInPath(PhysicalLinkId physicalLinkId,
\r
157 PhysicalNetwork physicalNetwork){
\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
170 if (physicalLink.getLinkId().getValue().equals(physicalLinkId.getValue())) {
\r
171 physicalNodeId = physicalLink.getSrcNodeId();
\r
174 return physicalNodeId;
\r
179 * @param physicalLinkId
\r
180 * @param physicalNetwork
\r
183 private PhysicalPortId getSrcPortIdforLinkInPath(PhysicalLinkId physicalLinkId,
\r
184 PhysicalNetwork physicalNetwork){
\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
197 if (physicalLink.getLinkId().getValue().equals(physicalLinkId.getValue())) {
\r
198 physicalPortId = physicalLink.getSrcPortId();
\r
201 return physicalPortId;
\r
206 * @param physicalLinkId
\r
207 * @param physicalNetwork
\r
210 private PhysicalNodeId getDestNodeIdforLinkInPath(PhysicalLinkId physicalLinkId,
\r
211 PhysicalNetwork physicalNetwork){
\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
224 if (physicalLink.getLinkId().getValue().equals(physicalLinkId.getValue())) {
\r
225 physicalNodeId = physicalLink.getDestNodeId();
\r
228 return physicalNodeId;
\r
233 * @param physicalLinkId
\r
234 * @param physicalNetwork
\r
237 private PhysicalPortId getDestPortIdforLinkInPath(PhysicalLinkId physicalLinkId,
\r
238 PhysicalNetwork physicalNetwork){
\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
251 if (physicalLink.getLinkId().getValue().equals(physicalLinkId.getValue())) {
\r
252 physicalPortId = physicalLink.getDestPortId();
\r
255 return physicalPortId;
\r
260 * @param onePhysicalNodeId
\r
261 * @param otherPhysicalNodeId
\r
262 * @param physicalNetwork
\r
265 private PhysicalPath getPhysicalPathforConnection(PhysicalNodeId onePhysicalNodeId,
\r
266 PhysicalNodeId otherPhysicalNodeId,
\r
267 PhysicalNetwork physicalNetwork){
\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
276 PhysicalNodeId firstNodeIdforPath = null;
\r
277 PhysicalNodeId lastNodeIdforPath = null;
\r
278 List<PhysicalPath> physicalPathList = physicalPaths.getPhysicalPath();
\r
280 for(PhysicalPath physicalPath:physicalPathList) {
\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
287 if(physicalLinks != null && physicalLinks.size() > 0){
\r
289 PhysicalLinkId firstPhysicalLinkId = physicalLinks.get(0).getLinkId();
\r
290 PhysicalLinkId lastPhysicalLinkId = physicalLinks.get(physicalLinks.size()-1).getLinkId();
\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
299 physicalPathforConnection = soredPhysicalPath;
\r
305 return physicalPathforConnection;
\r
310 * @param physicalPath
\r
313 private PhysicalPath sortPhysicalLinksOfPhysicalPath(PhysicalPath physicalPath) {
\r
314 if ( physicalPath.getPhysicalLink().isEmpty()
\r
315 || 1 == physicalPath.getPhysicalLink().size() ) {
\r
316 return physicalPath;
\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
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
327 PhysicalPath physicalPath1 = new PhysicalPathBuilder(physicalPath)
\r
328 .setPhysicalLink(sortedPhysicalLinks)
\r
331 return physicalPath1;
\r
337 private class ConfigElementForConnection {
\r
339 public PhysicalNodeId getPhysicalNodeId() {
\r
340 return physicalNodeId;
\r
343 public void setPhysicalNodeId(PhysicalNodeId physicalNodeId) {
\r
344 this.physicalNodeId = physicalNodeId;
\r
347 public PhysicalPortId getInnerPhysicalPortId() {
\r
348 return innerPhysicalPortId;
\r
351 public void setInnerPhysicalPortId(PhysicalPortId innerPhysicalPortId) {
\r
352 this.innerPhysicalPortId = innerPhysicalPortId;
\r
355 public PhysicalPortId getOuterPhysicalPortId() {
\r
356 return outerPhysicalPortId;
\r
359 public void setOuterPhysicalPortId(PhysicalPortId outerPhysicalPortId) {
\r
360 this.outerPhysicalPortId = outerPhysicalPortId;
\r
362 private PhysicalNodeId physicalNodeId;
\r
363 private PhysicalPortId innerPhysicalPortId;
\r
364 private PhysicalPortId outerPhysicalPortId;
\r
370 * @param physicalPath
\r
371 * @param physicalNetwork
\r
372 * @param onePhysicalPortId
\r
373 * @param otherPhysicalPortId
\r
376 private List<ConfigElementForConnection> getConfigElementListForConnection(
\r
377 PhysicalPath physicalPath,
\r
378 PhysicalNetwork physicalNetwork,
\r
379 PhysicalPortId onePhysicalPortId,
\r
380 PhysicalPortId otherPhysicalPortId
\r
383 List<ConfigElementForConnection> configElementListForConnection = new ArrayList<ConfigElementForConnection>();
\r
385 if((physicalPath == null)){
\r
386 return configElementListForConnection;
\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
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
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
402 Boolean crossWAN = Boolean.FALSE;
\r
404 while (physicalLinkInPathIter.hasNext()) {
\r
406 counter = counter + 1;
\r
408 ConfigElementForConnection configElementForConnection = new ConfigElementForConnection();
\r
410 //save previous link
\r
411 previousPhysicalLink = physicalLinkInPathIter.next();
\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
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
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
434 PhysicalLinkId previousPhysicalLinkId = previousPhysicalLink.getLinkId();
\r
435 PhysicalPortId physicalDestNodeId = getDestPortIdforLinkInPath(previousPhysicalLinkId, physicalNetwork);
\r
437 if(Boolean.FALSE == crossWAN) {
\r
438 configElementForConnection.setInnerPhysicalPortId(physicalSrcPortId);
\r
439 configElementForConnection.setOuterPhysicalPortId(physicalDestNodeId);
\r
441 if(physicalSrcNodeId.getValue().contains(":PE")){
\r
443 crossWAN = Boolean.TRUE;
\r
446 configElementForConnection.setInnerPhysicalPortId(physicalDestNodeId);
\r
447 configElementForConnection.setOuterPhysicalPortId(physicalSrcPortId);
\r
450 configElementListForConnection.add(configElementForConnection);
\r
452 if((counter + 1) == physicalLinks.size()){
\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
462 previousPhysicalLink = currentPhysicalLink;// alternate
\r
466 return configElementListForConnection;
\r
471 * @param configElementListForConnection
\r
474 private List<ConfigElementForConnection> getPeersOfPEs(
\r
475 List<ConfigElementForConnection> configElementListForConnection){
\r
477 List<ConfigElementForConnection> peersOfPEs = new ArrayList<ConfigElementForConnection>();
\r
478 for(ConfigElementForConnection c: configElementListForConnection){
\r
480 if(c.getPhysicalNodeId().getValue().contains(":PE")){
\r
490 * @param anotherNode
\r
494 private Boolean isInPeersList(PhysicalNodeId oneNode,
\r
495 PhysicalNodeId anotherNode,
\r
496 List<List<ConfigElementForConnection>> peersList){
\r
498 for(List<ConfigElementForConnection> peers:peersList) {
\r
499 ConfigElementForConnection configElementOnePE = (ConfigElementForConnection) peers.get(0);
\r
500 ConfigElementForConnection configElementAnother = (ConfigElementForConnection) peers.get(1);
\r
502 if(configElementOnePE.getPhysicalNodeId().getValue().equals(oneNode.getValue())&&
\r
503 configElementAnother.getPhysicalNodeId().getValue().equals(anotherNode.getValue())){
\r
505 return Boolean.TRUE;
\r
508 System.out.println("isInPeersList() = Boolean.FALSE");
\r
509 return Boolean.FALSE;
\r
517 public Boolean isFullMeshTopology(List<List<ConfigElementForConnection>> peersList){
\r
519 List<PhysicalNodeId> beUsedPEs = new ArrayList<PhysicalNodeId>();
\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
527 if(!beUsedPEs.contains(configElementAnother.getPhysicalNodeId())){
\r
528 beUsedPEs.add(configElementAnother.getPhysicalNodeId());
\r
532 for(int i =0; i<beUsedPEs.size(); i++){
\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
539 return Boolean.FALSE;
\r
544 System.out.println("isFullMeshTopology() = Boolean.TRUE");
\r
545 return Boolean.TRUE;
\r
550 * @param physicalNodeId
\r
554 private Boolean hasThisPE(PhysicalNodeId physicalNodeId,
\r
555 List<Map<PhysicalNodeId, PhysicalPortId>> VPNPEs){
\r
557 Boolean hasThisPE = Boolean.FALSE;
\r
558 for(Map<PhysicalNodeId, PhysicalPortId> pe: VPNPEs){
\r
560 if(pe.containsKey(physicalNodeId) == true){
\r
561 hasThisPE = Boolean.TRUE;
\r
574 private String getClis(List<String> paramList, String template){
\r
576 for(int i=0;i<paramList.size();i++){
\r
578 String paramSymbol = "#"+(i+1)+"#";
\r
579 String paramValue = paramList.get(i);
\r
580 template = template.replace(paramSymbol, paramValue);
\r
589 private void buildFullMeshVPN(List<List<ConfigElementForConnection>> peersList){
\r
591 List<Map<PhysicalNodeId, PhysicalPortId>> VPNPEs = new ArrayList<Map<PhysicalNodeId, PhysicalPortId>>();
\r
592 for(List<ConfigElementForConnection> peers:peersList){
\r
594 ConfigElementForConnection configElementOnePE = (ConfigElementForConnection)peers.get(0);
\r
595 ConfigElementForConnection configElementAnother = (ConfigElementForConnection)peers.get(1);
\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
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
611 for(Map<PhysicalNodeId, PhysicalPortId> pe: VPNPEs) {
\r
612 Iterator iter = pe.entrySet().iterator();
\r
613 while (iter.hasNext()) {
\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
628 "ip vpn-instance #6#\n" +
\r
629 "route-distinguisher #7#\n" +
\r
630 "vpn-target #8#\n" +
\r
634 "interface #1#\n" +
\r
635 "ip binding vpn-instance #6#\n" +
\r
639 "ipv4-family vpn-instance #6#\n" +
\r
640 "peer #10# as-number #11#\n" +
\r
641 "import-route direct\n" +
\r
644 "interface #1#\n" +
\r
645 "ip address #2#\n" +
\r
646 "undo shutdown\n" +
\r
651 String clearL3VPNTemplate = new String(
\r
652 "interface #1#\n" +
\r
653 "undo ip address #2#\n" +
\r
657 "undo network #5#\n" +
\r
660 "undo ip vpn-instance #6#\n");
\r
662 Map.Entry entry = (Map.Entry) iter.next();
\r
663 PhysicalNodeId key = (PhysicalNodeId)entry.getKey();
\r
664 PhysicalPortId val = (PhysicalPortId)entry.getValue();
\r
667 //System.out.println("PE ="+key.getValue());
\r
668 //System.out.println("ACPort="+val.getValue());
\r
671 String deviceName = key.getValue();
\r
674 //(1)fill params from mapping result for template(2,5,10,11)
\r
675 String param_1 = getAccessPortName(val.getValue());
\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
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
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
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
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
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
713 if(deviceName.contains("PE1")){
\r
715 //(1)fill params from mapping result for template(2,5,10,11)
\r
716 param_1 = "GigabitEthernet 2/0/6";
\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
724 //(3)fill params from deivce config(3,4,9)
\r
729 //(4)fill params from automatic generation for template
\r
734 }else if(deviceName.contains("PE2")){
\r
736 //(1)fill params from mapping result for template(2,5,10,11)
\r
737 param_1 = "GigabitEthernet 3/0/3";
\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
745 //(3)fill params from deivce config(3,4,9)
\r
750 //(4)fill params from automatic generation for template
\r
755 }else if(deviceName.contains("PE3")){
\r
757 //(1)fill params from mapping result for template(2,5,10,11)
\r
758 param_1 = "GigabitEthernet 1/0/0";
\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
766 //(3)fill params from deivce config(3,4,9)
\r
771 //(4)fill params from automatic generation for template
\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
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
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
806 telnetUtils.configL3vpnOnDeviceByCli(deviceName, clearOldConfigString, cliExecutionSequences);
\r
808 //wait for execution to complete
\r
809 while (Boolean.TRUE){
\r
811 if(telnetUtils.isConfigOver()== Boolean.TRUE){
\r
816 Thread.sleep(3000);
\r
817 } catch (InterruptedException e) {
\r
818 e.printStackTrace();
\r
830 * @param virtualNetwork
\r
831 * @param userIntentVnMapping
\r
832 * @param userVnPnMapping
\r
833 * @param physicalNetwork
\r
835 public void updateCliExecutionSequence(User user,
\r
836 VirtualNetwork virtualNetwork,
\r
837 UserIntentVnMapping userIntentVnMapping,
\r
838 UserVnPnMapping userVnPnMapping,
\r
839 PhysicalNetwork physicalNetwork) {
\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
846 List<List<ConfigElementForConnection>> peersList = new ArrayList<List<ConfigElementForConnection>>();
\r
848 //search connection
\r
849 if(user.getObjects() != null) {
\r
851 List<Connection> connectionList = user.getObjects().getConnection();
\r
853 System.out.println("connection size = "+connectionList.size());
\r
854 for(Connection connection: connectionList){
\r
856 //search connection for two ex-group
\r
857 List<EndNode> endNodeList = connection.getEndNode();
\r
858 if( isConnectTwoExtGroup(connection, user) == Boolean.TRUE ){
\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
871 List<ConfigElementForConnection> configElementListForConnection = new ArrayList<ConfigElementForConnection>();
\r
872 VnPnMappingResult vnPnMappingResultforOneNode =
\r
873 getNodeVnPnMappingResult(oneNodeId, userIntentVnMapping, userVnPnMapping);
\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
887 VnPnMappingResult vnPnMappingResultforOtherNode =
\r
888 getNodeVnPnMappingResult(otherNodeId, userIntentVnMapping, userVnPnMapping);
\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
902 physicalPathforConnection = getPhysicalPathforConnection(
\r
903 onePhysicalNodeId, otherPhysicalNodeId, physicalNetwork );
\r
905 if(physicalPathforConnection != null){
\r
907 configElementListForConnection = getConfigElementListForConnection(physicalPathforConnection,
\r
910 otherPhysicalPortId);
\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
918 List<ConfigElementForConnection> peersOfPEs = getPeersOfPEs(configElementListForConnection);
\r
919 peersList.add(peersOfPEs);
\r
926 //if topo is full mesh
\r
927 if(isFullMeshTopology(peersList) == Boolean.TRUE){
\r
928 buildFullMeshVPN(peersList);
\r
935 * @throws Exception
\r
938 public void close() throws Exception {
\r
939 if (telnetUtils != null){
\r
940 telnetUtils.close();
\r