--- /dev/null
+/*\r
+ * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.nemo.renderer.cli;\r
+\r
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalNetwork;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.PhysicalLinks;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.PhysicalPaths;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNode;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.paths.PhysicalPath;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.paths.PhysicalPathBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.VirtualNetwork;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.UserIntentVnMapping;\r
+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
+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
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.vn.pn.mapping.results.UserVnPnMapping;\r
+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
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.ConnectionId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.NodeId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalLinkId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalNodeId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalPortId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Connection;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Node;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.User;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.connection.instance.EndNode;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+import java.util.*;\r
+\r
+/**\r
+ *\r
+ * @author Shixing Liu\r
+ */\r
+\r
+public class CliBuilder implements AutoCloseable {\r
+\r
+ private static final Logger LOG = LoggerFactory.getLogger(CliBuilder.class);\r
+\r
+ private final DataBroker dataProvider;\r
+\r
+ private final TelnetUtils telnetUtils;\r
+\r
+ /**\r
+ * Constructor\r
+ *\r
+ * @param dataProvider\r
+ */\r
+ public CliBuilder(DataBroker dataProvider) {\r
+\r
+ super();\r
+ this.dataProvider = dataProvider;\r
+\r
+ LOG.info("New TelnetUtils.");\r
+ telnetUtils = new TelnetUtils();\r
+\r
+ LOG.info("Initialized CliBuilder.");\r
+ }\r
+\r
+ /**\r
+ *\r
+ * @param physicalNodes\r
+ */\r
+ public void init(List<PhysicalNode> physicalNodes) {\r
+ for ( PhysicalNode physicalNode : physicalNodes ) {\r
+ //TODO:\r
+ }\r
+ }\r
+\r
+ /**\r
+ *\r
+ * @param nodeId\r
+ * @param userIntentVnMapping\r
+ * @param userVnPnMapping\r
+ * @return\r
+ */\r
+ private VnPnMappingResult getNodeVnPnMappingResult(NodeId nodeId,\r
+ UserIntentVnMapping userIntentVnMapping,\r
+ UserVnPnMapping userVnPnMapping)\r
+ {\r
+ VnPnMappingResult vnPnMappingResultforNode = null;\r
+ List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
+\r
+ //System.out.println("intentVnMappingResults size = " + intentVnMappingResults.size());\r
+ for(IntentVnMappingResult intentVnMappingResult: intentVnMappingResults){\r
+ if(intentVnMappingResult.getIntentId().getValue().equals(nodeId.getValue())){\r
+\r
+ List<VirtualResource> virtualResources = intentVnMappingResult.getVirtualResource();\r
+ //System.out.println("virtualResources size()= "+ virtualResources.size());\r
+ for(VirtualResource virtualResource: virtualResources){\r
+ if(VirtualResource.VirtualResourceType.Vport\r
+ == virtualResource.getVirtualResourceType()){\r
+ List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();\r
+ for(VnPnMappingResult vnPnMappingResult: vnPnMappingResults){\r
+ if(vnPnMappingResult.getVirtualResourceEntityId().getValue()\r
+ .equals(virtualResource.getVirtualResourceEntityId().getValue())){\r
+\r
+ System.out.println("equals(virtualResource.getVirtualResourceEntityId())");\r
+ vnPnMappingResultforNode = vnPnMappingResult;\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ return vnPnMappingResultforNode;\r
+ }\r
+\r
+\r
+ /**\r
+ *\r
+ * @param connection\r
+ * @param user\r
+ * @return\r
+ */\r
+ private Boolean isConnectTwoExtGroup(Connection connection, User user){\r
+ List<EndNode> endNodeList = connection.getEndNode();\r
+ Boolean isTwoExtGroup = Boolean.TRUE;\r
+ for(EndNode endnode:endNodeList){\r
+ NodeId nodeId = endnode.getNodeId();\r
+ List<Node> nodeList = user.getObjects().getNode();\r
+ for(Node node:nodeList){\r
+ if(node.getNodeId().equals(nodeId)){\r
+ //System.out.println(node.getNodeType().getValue());\r
+ if(! node.getNodeType().getValue().equals("ext-group")){\r
+ isTwoExtGroup = Boolean.FALSE;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ if( isTwoExtGroup == Boolean.FALSE){\r
+ break;\r
+ }\r
+ }\r
+ //System.out.println("isConnectTwoExtGroup = "+ isTwoExtGroup.booleanValue());\r
+ return isTwoExtGroup;\r
+ }\r
+\r
+\r
+ /**\r
+ *\r
+ * @param physicalLinkId\r
+ * @param physicalNetwork\r
+ * @return\r
+ */\r
+ private PhysicalNodeId getSrcNodeIdforLinkInPath(PhysicalLinkId physicalLinkId,\r
+ PhysicalNetwork physicalNetwork){\r
+\r
+ PhysicalNodeId physicalNodeId = null;\r
+ PhysicalLinks physicalLinksInNetwork = physicalNetwork.getPhysicalLinks();\r
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.params\r
+ .xml.ns.yang.generic.physical.network.rev151010\r
+ .physical.network.physical.links.PhysicalLink>\r
+ physicalLinksInNetworkList = physicalLinksInNetwork.getPhysicalLink();\r
+ for(org.opendaylight.yang.gen.v1.urn.opendaylight.params\r
+ .xml.ns.yang.generic.physical.network.rev151010\r
+ .physical.network.physical.links\r
+ .PhysicalLink physicalLink :physicalLinksInNetworkList) {\r
+\r
+ if (physicalLink.getLinkId().getValue().equals(physicalLinkId.getValue())) {\r
+ physicalNodeId = physicalLink.getSrcNodeId();\r
+ }\r
+ }\r
+ return physicalNodeId;\r
+ }\r
+\r
+ /**\r
+ *\r
+ * @param physicalLinkId\r
+ * @param physicalNetwork\r
+ * @return\r
+ */\r
+ private PhysicalPortId getSrcPortIdforLinkInPath(PhysicalLinkId physicalLinkId,\r
+ PhysicalNetwork physicalNetwork){\r
+\r
+ PhysicalPortId physicalPortId = null;\r
+ PhysicalLinks physicalLinksInNetwork = physicalNetwork.getPhysicalLinks();\r
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.params\r
+ .xml.ns.yang.generic.physical.network.rev151010\r
+ .physical.network.physical.links.PhysicalLink>\r
+ physicalLinksInNetworkList = physicalLinksInNetwork.getPhysicalLink();\r
+ for(org.opendaylight.yang.gen.v1.urn.opendaylight.params\r
+ .xml.ns.yang.generic.physical.network.rev151010\r
+ .physical.network.physical.links\r
+ .PhysicalLink physicalLink :physicalLinksInNetworkList) {\r
+\r
+ if (physicalLink.getLinkId().getValue().equals(physicalLinkId.getValue())) {\r
+ physicalPortId = physicalLink.getSrcPortId();\r
+ }\r
+ }\r
+ return physicalPortId;\r
+ }\r
+\r
+\r
+ /**\r
+ *\r
+ * @param physicalLinkId\r
+ * @param physicalNetwork\r
+ * @return\r
+ */\r
+ private PhysicalNodeId getDestNodeIdforLinkInPath(PhysicalLinkId physicalLinkId,\r
+ PhysicalNetwork physicalNetwork){\r
+\r
+ PhysicalNodeId physicalNodeId = null;\r
+ PhysicalLinks physicalLinksInNetwork = physicalNetwork.getPhysicalLinks();\r
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.params\r
+ .xml.ns.yang.generic.physical.network.rev151010\r
+ .physical.network.physical.links.PhysicalLink>\r
+ physicalLinksInNetworkList = physicalLinksInNetwork.getPhysicalLink();\r
+ for(org.opendaylight.yang.gen.v1.urn.opendaylight.params\r
+ .xml.ns.yang.generic.physical.network.rev151010\r
+ .physical.network.physical.links\r
+ .PhysicalLink physicalLink :physicalLinksInNetworkList) {\r
+\r
+ if (physicalLink.getLinkId().getValue().equals(physicalLinkId.getValue())) {\r
+ physicalNodeId = physicalLink.getDestNodeId();\r
+ }\r
+ }\r
+ return physicalNodeId;\r
+ }\r
+\r
+\r
+ /**\r
+ *\r
+ * @param physicalLinkId\r
+ * @param physicalNetwork\r
+ * @return\r
+ */\r
+ private PhysicalPortId getDestPortIdforLinkInPath(PhysicalLinkId physicalLinkId,\r
+ PhysicalNetwork physicalNetwork){\r
+\r
+ PhysicalPortId physicalPortId = null;\r
+ PhysicalLinks physicalLinksInNetwork = physicalNetwork.getPhysicalLinks();\r
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.params\r
+ .xml.ns.yang.generic.physical.network.rev151010\r
+ .physical.network.physical.links.PhysicalLink>\r
+ physicalLinksInNetworkList = physicalLinksInNetwork.getPhysicalLink();\r
+ for(org.opendaylight.yang.gen.v1.urn.opendaylight.params\r
+ .xml.ns.yang.generic.physical.network.rev151010\r
+ .physical.network.physical.links\r
+ .PhysicalLink physicalLink :physicalLinksInNetworkList) {\r
+\r
+ if (physicalLink.getLinkId().getValue().equals(physicalLinkId.getValue())) {\r
+ physicalPortId = physicalLink.getDestPortId();\r
+ }\r
+ }\r
+ return physicalPortId;\r
+ }\r
+\r
+\r
+ /**\r
+ *\r
+ * @param onePhysicalNodeId\r
+ * @param otherPhysicalNodeId\r
+ * @param physicalNetwork\r
+ * @return\r
+ */\r
+ private PhysicalPath getPhysicalPathforConnection(PhysicalNodeId onePhysicalNodeId,\r
+ PhysicalNodeId otherPhysicalNodeId,\r
+ PhysicalNetwork physicalNetwork){\r
+\r
+ PhysicalPath physicalPathforConnection = null;\r
+ PhysicalPaths physicalPaths = physicalNetwork.getPhysicalPaths();\r
+ if(null == physicalPaths.getPhysicalPath()){\r
+ LOG.info("PhysicalPath are null");\r
+ return physicalPathforConnection;\r
+ }\r
+\r
+ PhysicalNodeId firstNodeIdforPath = null;\r
+ PhysicalNodeId lastNodeIdforPath = null;\r
+ List<PhysicalPath> physicalPathList = physicalPaths.getPhysicalPath();\r
+\r
+ for(PhysicalPath physicalPath:physicalPathList) {\r
+\r
+ PhysicalPath soredPhysicalPath = sortPhysicalLinksOfPhysicalPath(physicalPath);\r
+ List< org.opendaylight.yang.gen.v1.urn.opendaylight.params\r
+ .xml.ns.yang.generic.physical.network.rev151010\r
+ .physical.path.instance.PhysicalLink> physicalLinks = soredPhysicalPath.getPhysicalLink();\r
+\r
+ if(physicalLinks != null && physicalLinks.size() > 0){\r
+\r
+ PhysicalLinkId firstPhysicalLinkId = physicalLinks.get(0).getLinkId();\r
+ PhysicalLinkId lastPhysicalLinkId = physicalLinks.get(physicalLinks.size()-1).getLinkId();\r
+\r
+ firstNodeIdforPath = getSrcNodeIdforLinkInPath(firstPhysicalLinkId, physicalNetwork);\r
+ lastNodeIdforPath = getDestNodeIdforLinkInPath(lastPhysicalLinkId, physicalNetwork);\r
+ if((firstNodeIdforPath != null)\r
+ && (lastNodeIdforPath != null)\r
+ && (firstNodeIdforPath.getValue().equals(onePhysicalNodeId.getValue()))\r
+ && (lastNodeIdforPath.getValue().equals(otherPhysicalNodeId.getValue()))){\r
+\r
+ physicalPathforConnection = soredPhysicalPath;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ return physicalPathforConnection;\r
+ }\r
+\r
+ /**\r
+ *\r
+ * @param physicalPath\r
+ * @return\r
+ */\r
+ private PhysicalPath sortPhysicalLinksOfPhysicalPath(PhysicalPath physicalPath) {\r
+ if ( physicalPath.getPhysicalLink().isEmpty()\r
+ || 1 == physicalPath.getPhysicalLink().size() ) {\r
+ return physicalPath;\r
+ }\r
+\r
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.path.instance.PhysicalLink> sortedPhysicalLinks =\r
+ 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
+ sortedPhysicalLinks.addAll(physicalPath.getPhysicalLink());\r
+\r
+ for ( org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.path.instance.PhysicalLink\r
+ physicalLink : physicalPath.getPhysicalLink() ) {\r
+ sortedPhysicalLinks.set(physicalLink.getOrder().intValue(), physicalLink);\r
+ }\r
+ PhysicalPath physicalPath1 = new PhysicalPathBuilder(physicalPath)\r
+ .setPhysicalLink(sortedPhysicalLinks)\r
+ .build();\r
+\r
+ return physicalPath1;\r
+ }\r
+\r
+\r
+ /**\r
+ *\r
+ */\r
+ private class ConfigElementForConnection {\r
+\r
+ public PhysicalNodeId getPhysicalNodeId() {\r
+ return physicalNodeId;\r
+ }\r
+\r
+ public void setPhysicalNodeId(PhysicalNodeId physicalNodeId) {\r
+ this.physicalNodeId = physicalNodeId;\r
+ }\r
+\r
+ public PhysicalPortId getInnerPhysicalPortId() {\r
+ return innerPhysicalPortId;\r
+ }\r
+\r
+ public void setInnerPhysicalPortId(PhysicalPortId innerPhysicalPortId) {\r
+ this.innerPhysicalPortId = innerPhysicalPortId;\r
+ }\r
+\r
+ public PhysicalPortId getOuterPhysicalPortId() {\r
+ return outerPhysicalPortId;\r
+ }\r
+\r
+ public void setOuterPhysicalPortId(PhysicalPortId outerPhysicalPortId) {\r
+ this.outerPhysicalPortId = outerPhysicalPortId;\r
+ }\r
+ private PhysicalNodeId physicalNodeId;\r
+ private PhysicalPortId innerPhysicalPortId;\r
+ private PhysicalPortId outerPhysicalPortId;\r
+\r
+ }\r
+\r
+ /**\r
+ *\r
+ * @param physicalPath\r
+ * @param physicalNetwork\r
+ * @param onePhysicalPortId\r
+ * @param otherPhysicalPortId\r
+ * @return\r
+ */\r
+ private List<ConfigElementForConnection> getConfigElementListForConnection(\r
+ PhysicalPath physicalPath,\r
+ PhysicalNetwork physicalNetwork,\r
+ PhysicalPortId onePhysicalPortId,\r
+ PhysicalPortId otherPhysicalPortId\r
+ ){\r
+\r
+ List<ConfigElementForConnection> configElementListForConnection = new ArrayList<ConfigElementForConnection>();\r
+\r
+ if((physicalPath == null)){\r
+ return configElementListForConnection;\r
+ }\r
+ List< org.opendaylight.yang.gen.v1.urn.opendaylight.params\r
+ .xml.ns.yang.generic.physical.network.rev151010\r
+ .physical.path.instance.PhysicalLink> physicalLinks = physicalPath.getPhysicalLink();\r
+\r
+ Iterator<org.opendaylight.yang.gen.v1.urn.opendaylight.params\r
+ .xml.ns.yang.generic.physical.network.rev151010\r
+ .physical.path.instance.PhysicalLink> physicalLinkInPathIter = physicalLinks.iterator();\r
+\r
+ int counter = -1;\r
+\r
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params\r
+ .xml.ns.yang.generic.physical.network.rev151010\r
+ .physical.path.instance.PhysicalLink previousPhysicalLink = null;\r
+\r
+ Boolean crossWAN = Boolean.FALSE;\r
+\r
+ while (physicalLinkInPathIter.hasNext()) {\r
+ //first device\r
+ counter = counter + 1;\r
+ if(0 == counter){\r
+ ConfigElementForConnection configElementForConnection = new ConfigElementForConnection();\r
+\r
+ //save previous link\r
+ previousPhysicalLink = physicalLinkInPathIter.next();\r
+\r
+ PhysicalLinkId physicalLinkId = previousPhysicalLink.getLinkId();\r
+ PhysicalNodeId physicalSrcNodeId = getSrcNodeIdforLinkInPath(physicalLinkId, physicalNetwork);\r
+ PhysicalPortId physicalSrcPortId = getSrcPortIdforLinkInPath(physicalLinkId, physicalNetwork);\r
+ configElementForConnection.setPhysicalNodeId(physicalSrcNodeId);\r
+ configElementForConnection.setInnerPhysicalPortId(physicalSrcPortId);\r
+ configElementForConnection.setOuterPhysicalPortId(onePhysicalPortId);\r
+ configElementListForConnection.add(configElementForConnection);\r
+ }\r
+ else {\r
+\r
+ //for middle devices\r
+ ConfigElementForConnection configElementForConnection = new ConfigElementForConnection();\r
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params\r
+ .xml.ns.yang.generic.physical.network.rev151010\r
+ .physical.path.instance.PhysicalLink currentPhysicalLink = physicalLinkInPathIter.next();\r
+\r
+ PhysicalLinkId currentPhysicalLinkId = currentPhysicalLink.getLinkId();\r
+ PhysicalNodeId physicalSrcNodeId = getSrcNodeIdforLinkInPath(currentPhysicalLinkId, physicalNetwork);\r
+ PhysicalPortId physicalSrcPortId = getSrcPortIdforLinkInPath(currentPhysicalLinkId, physicalNetwork);\r
+ configElementForConnection.setPhysicalNodeId(physicalSrcNodeId);\r
+\r
+ PhysicalLinkId previousPhysicalLinkId = previousPhysicalLink.getLinkId();\r
+ PhysicalPortId physicalDestNodeId = getDestPortIdforLinkInPath(previousPhysicalLinkId, physicalNetwork);\r
+\r
+ if(Boolean.FALSE == crossWAN) {\r
+ configElementForConnection.setInnerPhysicalPortId(physicalSrcPortId);\r
+ configElementForConnection.setOuterPhysicalPortId(physicalDestNodeId);\r
+ //if cross WAN\r
+ if(physicalSrcNodeId.getValue().contains(":PE")){\r
+\r
+ crossWAN = Boolean.TRUE;\r
+ }\r
+ }else{\r
+ configElementForConnection.setInnerPhysicalPortId(physicalDestNodeId);\r
+ configElementForConnection.setOuterPhysicalPortId(physicalSrcPortId);\r
+\r
+ }\r
+ configElementListForConnection.add(configElementForConnection);\r
+ //for last device\r
+ if((counter + 1) == physicalLinks.size()){\r
+\r
+ ConfigElementForConnection lastconfigElementForConnection = new ConfigElementForConnection();\r
+ PhysicalNodeId lastphysicalDestNodeId = getDestNodeIdforLinkInPath(currentPhysicalLinkId, physicalNetwork);\r
+ PhysicalPortId lastphysicalDestPortId = getDestPortIdforLinkInPath(currentPhysicalLinkId, physicalNetwork);\r
+ lastconfigElementForConnection.setPhysicalNodeId(lastphysicalDestNodeId);\r
+ lastconfigElementForConnection.setInnerPhysicalPortId(lastphysicalDestPortId);\r
+ lastconfigElementForConnection.setOuterPhysicalPortId(otherPhysicalPortId);\r
+ configElementListForConnection.add(lastconfigElementForConnection);\r
+ }\r
+ previousPhysicalLink = currentPhysicalLink;// alternate\r
+ }\r
+ }\r
+\r
+ return configElementListForConnection;\r
+ }\r
+\r
+ /**\r
+ *\r
+ * @param configElementListForConnection\r
+ * @return\r
+ */\r
+ private List<ConfigElementForConnection> getPeersOfPEs(\r
+ List<ConfigElementForConnection> configElementListForConnection){\r
+\r
+ List<ConfigElementForConnection> peersOfPEs = new ArrayList<ConfigElementForConnection>();\r
+ for(ConfigElementForConnection c: configElementListForConnection){\r
+\r
+ if(c.getPhysicalNodeId().getValue().contains(":PE")){\r
+ peersOfPEs.add(c);\r
+ }\r
+ }\r
+ return peersOfPEs;\r
+ }\r
+\r
+\r
+ /**\r
+ *\r
+ * @param oneNode\r
+ * @param anotherNode\r
+ * @param peersList\r
+ * @return\r
+ */\r
+ private Boolean isInPeersList(PhysicalNodeId oneNode,\r
+ PhysicalNodeId anotherNode,\r
+ List<List<ConfigElementForConnection>> peersList){\r
+\r
+ for(List<ConfigElementForConnection> peers:peersList) {\r
+ ConfigElementForConnection configElementOnePE = (ConfigElementForConnection) peers.get(0);\r
+ ConfigElementForConnection configElementAnother = (ConfigElementForConnection) peers.get(1);\r
+\r
+ if(configElementOnePE.getPhysicalNodeId().getValue().equals(oneNode.getValue())&&\r
+ configElementAnother.getPhysicalNodeId().getValue().equals(anotherNode.getValue())){\r
+\r
+ return Boolean.TRUE;\r
+ }\r
+ }\r
+ System.out.println("isInPeersList() = Boolean.FALSE");\r
+ return Boolean.FALSE;\r
+ }\r
+\r
+\r
+ /**\r
+ *\r
+ * @param peersList\r
+ * @return\r
+ */\r
+ public Boolean isFullMeshTopology(List<List<ConfigElementForConnection>> peersList){\r
+\r
+ List<PhysicalNodeId> beUsedPEs = new ArrayList<PhysicalNodeId>();\r
+\r
+ for(List<ConfigElementForConnection> peers:peersList){\r
+ ConfigElementForConnection configElementOnePE = (ConfigElementForConnection)peers.get(0);\r
+ ConfigElementForConnection configElementAnother = (ConfigElementForConnection)peers.get(1);\r
+ if(!beUsedPEs.contains(configElementOnePE.getPhysicalNodeId())){\r
+ beUsedPEs.add(configElementOnePE.getPhysicalNodeId());\r
+ }\r
+ if(!beUsedPEs.contains(configElementAnother.getPhysicalNodeId())){\r
+ beUsedPEs.add(configElementAnother.getPhysicalNodeId());\r
+ }\r
+ }\r
+\r
+ for(int i =0; i<beUsedPEs.size(); i++){\r
+\r
+ PhysicalNodeId oneNode = (PhysicalNodeId)beUsedPEs.get(i);\r
+ for(int j= i+1; j<beUsedPEs.size(); j++){\r
+ PhysicalNodeId anotherNode = (PhysicalNodeId)beUsedPEs.get(j);\r
+ if(isInPeersList(oneNode, anotherNode, peersList)== Boolean.FALSE){\r
+\r
+ return Boolean.FALSE;\r
+ }\r
+ }\r
+ }\r
+\r
+ System.out.println("isFullMeshTopology() = Boolean.TRUE");\r
+ return Boolean.TRUE;\r
+ }\r
+\r
+\r
+ /**\r
+ *\r
+ * @param physicalNodeId\r
+ * @param VPNPEs\r
+ * @return\r
+ */\r
+ private Boolean hasThisPE(PhysicalNodeId physicalNodeId,\r
+ List<Map<PhysicalNodeId, PhysicalPortId>> VPNPEs){\r
+\r
+ Boolean hasThisPE = Boolean.FALSE;\r
+ for(Map<PhysicalNodeId, PhysicalPortId> pe: VPNPEs){\r
+\r
+ if(pe.containsKey(physicalNodeId) == true){\r
+ hasThisPE = Boolean.TRUE;\r
+ break;\r
+ }\r
+ }\r
+ return hasThisPE;\r
+ }\r
+\r
+ /**\r
+ *\r
+ * @param paramList\r
+ * @param template\r
+ * @return\r
+ */\r
+ private String getClis(List<String> paramList, String template){\r
+\r
+ for(int i=0;i<paramList.size();i++){\r
+\r
+ String paramSymbol = "#"+(i+1)+"#";\r
+ String paramValue = paramList.get(i);\r
+ template = template.replace(paramSymbol, paramValue);\r
+ }\r
+ return template;\r
+ }\r
+\r
+\r
+ /**\r
+ *\r
+ * @param peersList\r
+ */\r
+ private void buildFullMeshVPN(List<List<ConfigElementForConnection>> peersList){\r
+\r
+ List<Map<PhysicalNodeId, PhysicalPortId>> VPNPEs = new ArrayList<Map<PhysicalNodeId, PhysicalPortId>>();\r
+ for(List<ConfigElementForConnection> peers:peersList){\r
+\r
+ ConfigElementForConnection configElementOnePE = (ConfigElementForConnection)peers.get(0);\r
+ ConfigElementForConnection configElementAnother = (ConfigElementForConnection)peers.get(1);\r
+\r
+ if(hasThisPE(configElementOnePE.getPhysicalNodeId(), VPNPEs)== Boolean.FALSE){\r
+ Map<PhysicalNodeId, PhysicalPortId> accessPEInfo = new HashMap<PhysicalNodeId, PhysicalPortId>() ;\r
+ accessPEInfo.put(configElementOnePE.getPhysicalNodeId(),\r
+ configElementOnePE.getOuterPhysicalPortId());\r
+ VPNPEs.add(accessPEInfo);\r
+ }\r
+ if(hasThisPE(configElementAnother.getPhysicalNodeId(), VPNPEs)== Boolean.FALSE){\r
+ Map<PhysicalNodeId, PhysicalPortId> accessPEInfo = new HashMap<PhysicalNodeId, PhysicalPortId>() ;\r
+ accessPEInfo.put(configElementAnother.getPhysicalNodeId(),\r
+ configElementAnother.getOuterPhysicalPortId());\r
+ VPNPEs.add(accessPEInfo);\r
+ }\r
+ }\r
+\r
+ for(Map<PhysicalNodeId, PhysicalPortId> pe: VPNPEs) {\r
+ Iterator iter = pe.entrySet().iterator();\r
+ while (iter.hasNext()) {\r
+\r
+ //build cli according to template\r
+ String l3VPNTemplate = new String(\r
+ "interface #1#\n" +\r
+ "ip address #2#\n" +\r
+ "undo shutdown\n" +\r
+ "quit\n" +\r
+ "\n" +\r
+ "ospf #3#\n" +\r
+ "area #4#\n" +\r
+ "network #5#\n" +\r
+ "quit\n" +\r
+ "quit\n" +\r
+ "\n" +\r
+ "ip vpn-instance #6#\n" +\r
+ "route-distinguisher #7#\n" +\r
+ "vpn-target #8#\n" +\r
+ "quit\n" +\r
+ "quit\n" +\r
+ "\n" +\r
+ "interface #1#\n" +\r
+ "ip binding vpn-instance #6#\n" +\r
+ "quit\n" +\r
+ "\n" +\r
+ "bgp #9#\n" +\r
+ "ipv4-family vpn-instance #6#\n" +\r
+ "peer #10# as-number #11#\n" +\r
+ "import-route direct\n" +\r
+ "quit\n" +\r
+ "quit\n" +\r
+ "interface #1#\n" +\r
+ "ip address #2#\n" +\r
+ "undo shutdown\n" +\r
+ "quit\n" +\r
+ "\n");\r
+\r
+\r
+ String clearL3VPNTemplate = new String(\r
+ "interface #1#\n" +\r
+ "undo ip address #2#\n" +\r
+ "quit\n" +\r
+ "ospf #3# \n" +\r
+ "area #4# \n" +\r
+ "undo network #5#\n" +\r
+ "quit\n" +\r
+ "quit\n" +\r
+ "undo ip vpn-instance #6#\n");\r
+\r
+ Map.Entry entry = (Map.Entry) iter.next();\r
+ PhysicalNodeId key = (PhysicalNodeId)entry.getKey();\r
+ PhysicalPortId val = (PhysicalPortId)entry.getValue();\r
+\r
+ //for test\r
+ //System.out.println("PE ="+key.getValue());\r
+ //System.out.println("ACPort="+val.getValue());\r
+\r
+ //find the deivce\r
+ String deviceName = key.getValue();\r
+\r
+ /*\r
+ //(1)fill params from mapping result for template(2,5,10,11)\r
+ String param_1 = getAccessPortName(val.getValue());\r
+\r
+ //(2)fill params from ACInfo config file for template\r
+ String param_2 = getCEPortIpAddressAndMask();\r
+ String param_5 = getCEAndPEIpPrefix();\r
+ String param_10 = getPEAccessPortIpAddress();\r
+ String param_11 = getCEBGPNumber();\r
+\r
+ //(3)fill params from deivce config(3,4,9)\r
+ String param_3 = getOSPFNumberforPE();\r
+ String param_4 = getAreaNumberforPE();\r
+ String param_9 = getBGPNumberforPE();\r
+\r
+ //(4)fill params from automatic generation for template\r
+ String param_6 = generateVPNName();\r
+ String param_7 = generateVPNRD();\r
+ String param_8 = generateVPNTarget();\r
+ */\r
+\r
+\r
+ //(1)fill params from mapping result for template(2,5,10,11)\r
+ String param_1 = "";\r
+ //(2)fill params from ACInfo config file for template\r
+ String param_2 = "";\r
+ String param_5 = "";\r
+ String param_10 = "";\r
+ String param_11 = "";\r
+\r
+ //(3)fill params from deivce config(3,4,9)\r
+ String param_3 = "";\r
+ String param_4 = "";\r
+ String param_9 = "";\r
+\r
+ //(4)fill params from automatic generation for template\r
+ String param_6 = "";\r
+ String param_7 = "";\r
+ String param_8 = "";\r
+\r
+ if(deviceName.contains("PE1")){\r
+\r
+ //(1)fill params from mapping result for template(2,5,10,11)\r
+ param_1 = "GigabitEthernet 2/0/6";\r
+\r
+ //(2)fill params from ACInfo config file for template\r
+ param_2 = "168.1.1.3 255.255.255.0";\r
+ param_5 = "168.1.1.0 0.0.0.255";\r
+ param_10 = "168.1.1.2";\r
+ param_11 = "100";\r
+\r
+ //(3)fill params from deivce config(3,4,9)\r
+ param_3 = "1";\r
+ param_4 = "0";\r
+ param_9 = "200";\r
+\r
+ //(4)fill params from automatic generation for template\r
+ param_6 = "vpn1";\r
+ param_7 = "100:1";\r
+ param_8 = "1:1";\r
+\r
+ }else if(deviceName.contains("PE2")){\r
+\r
+ //(1)fill params from mapping result for template(2,5,10,11)\r
+ param_1 = "GigabitEthernet 3/0/3";\r
+\r
+ //(2)fill params from ACInfo config file for template\r
+ param_2 = "174.1.1.3 255.255.255.0";\r
+ param_5 = "174.1.1.0 0.0.0.255";\r
+ param_10 = "174.1.1.2";\r
+ param_11 = "100";\r
+\r
+ //(3)fill params from deivce config(3,4,9)\r
+ param_3 = "1";\r
+ param_4 = "0";\r
+ param_9 = "200";\r
+\r
+ //(4)fill params from automatic generation for template\r
+ param_6 = "vpn1";\r
+ param_7 = "100:1";\r
+ param_8 = "1:1";\r
+\r
+ }else if(deviceName.contains("PE3")){\r
+\r
+ //(1)fill params from mapping result for template(2,5,10,11)\r
+ param_1 = "GigabitEthernet 1/0/0";\r
+\r
+ //(2)fill params from ACInfo config file for template\r
+ param_2 = "172.1.1.2 255.255.255.0";\r
+ param_5 = "172.1.1.0 0.0.0.255";\r
+ param_10 = "172.1.1.3";\r
+ param_11 = "100";\r
+\r
+ //(3)fill params from deivce config(3,4,9)\r
+ param_3 = "1";\r
+ param_4 = "0";\r
+ param_9 = "200";\r
+\r
+ //(4)fill params from automatic generation for template\r
+ param_6 = "vpn1";\r
+ param_7 = "100:1";\r
+ param_8 = "1:1";\r
+ }\r
+\r
+ List<String> paramListForL3VPNConfig = new ArrayList<String>();\r
+ paramListForL3VPNConfig.add(param_1);\r
+ paramListForL3VPNConfig.add(param_2);\r
+ paramListForL3VPNConfig.add(param_3);\r
+ paramListForL3VPNConfig.add(param_4);\r
+ paramListForL3VPNConfig.add(param_5);\r
+ paramListForL3VPNConfig.add(param_6);\r
+ paramListForL3VPNConfig.add(param_7);\r
+ paramListForL3VPNConfig.add(param_8);\r
+ paramListForL3VPNConfig.add(param_9);\r
+ paramListForL3VPNConfig.add(param_10);\r
+ paramListForL3VPNConfig.add(param_11);\r
+ String cliExecutionSequences = getClis(paramListForL3VPNConfig, l3VPNTemplate);\r
+\r
+ List<String> clearPramListForL3VPNConfig = new ArrayList<String>();\r
+ clearPramListForL3VPNConfig.add(param_1);\r
+ clearPramListForL3VPNConfig.add(param_2);\r
+ clearPramListForL3VPNConfig.add(param_3);\r
+ clearPramListForL3VPNConfig.add(param_4);\r
+ clearPramListForL3VPNConfig.add(param_5);\r
+ clearPramListForL3VPNConfig.add(param_6);\r
+ String clearOldConfigString = getClis(clearPramListForL3VPNConfig, clearL3VPNTemplate);\r
+\r
+ //TODO: write data to DataStore\r
+ //Current Test means to call telnet client to send down command lines\r
+ System.out.println();\r
+ System.out.println("telnetUtils.executionCliOnDevice for "+ deviceName);\r
+ System.out.println();\r
+\r
+ telnetUtils.configL3vpnOnDeviceByCli(deviceName, clearOldConfigString, cliExecutionSequences);\r
+\r
+ //wait for execution to complete\r
+ while (Boolean.TRUE){\r
+\r
+ if(telnetUtils.isConfigOver()== Boolean.TRUE){\r
+\r
+ break;\r
+ }else{\r
+ try {\r
+ Thread.sleep(3000);\r
+ } catch (InterruptedException e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ }\r
+\r
+\r
+ /**\r
+ *\r
+ * @param user\r
+ * @param virtualNetwork\r
+ * @param userIntentVnMapping\r
+ * @param userVnPnMapping\r
+ * @param physicalNetwork\r
+ */\r
+ public void updateCliExecutionSequence(User user,\r
+ VirtualNetwork virtualNetwork,\r
+ UserIntentVnMapping userIntentVnMapping,\r
+ UserVnPnMapping userVnPnMapping,\r
+ PhysicalNetwork physicalNetwork) {\r
+\r
+ LOG.info("CliBuilder is updating cli execution sequences.");\r
+ System.out.println();\r
+ System.out.println("CliBuilder is updating cli execution sequences.");\r
+ System.out.println();\r
+\r
+ List<List<ConfigElementForConnection>> peersList = new ArrayList<List<ConfigElementForConnection>>();\r
+\r
+ //search connection\r
+ if(user.getObjects() != null) {\r
+\r
+ List<Connection> connectionList = user.getObjects().getConnection();\r
+\r
+ System.out.println("connection size = "+connectionList.size());\r
+ for(Connection connection: connectionList){\r
+\r
+ //search connection for two ex-group\r
+ List<EndNode> endNodeList = connection.getEndNode();\r
+ if( isConnectTwoExtGroup(connection, user) == Boolean.TRUE ){\r
+\r
+ ConnectionId connectionId = connection.getConnectionId();\r
+ NodeId oneNodeId = endNodeList.get(0).getNodeId();\r
+ //System.out.println("endNodeList.get(0).getNodeId()"+endNodeList.get(1).getNodeId().getValue());\r
+ NodeId otherNodeId = endNodeList.get(1).getNodeId();\r
+ //System.out.println("endNodeList.get(1).getNodeId()"+endNodeList.get(1).getNodeId().getValue());\r
+ PhysicalPortId onePhysicalPortId = null;\r
+ PhysicalPortId otherPhysicalPortId = null;\r
+ PhysicalNodeId onePhysicalNodeId = null;\r
+ PhysicalNodeId otherPhysicalNodeId = null;\r
+ PhysicalPath physicalPathforConnection = null;\r
+\r
+ List<ConfigElementForConnection> configElementListForConnection = new ArrayList<ConfigElementForConnection>();\r
+ VnPnMappingResult vnPnMappingResultforOneNode =\r
+ getNodeVnPnMappingResult(oneNodeId, userIntentVnMapping, userVnPnMapping);\r
+\r
+ if(vnPnMappingResultforOneNode != null) {\r
+ onePhysicalPortId = new PhysicalPortId(\r
+ vnPnMappingResultforOneNode.getPhysicalResourceEntityId().getValue());\r
+ System.out.println(\r
+ vnPnMappingResultforOneNode.getPhysicalResourceEntityId().getValue());\r
+ onePhysicalNodeId = new PhysicalNodeId(\r
+ vnPnMappingResultforOneNode.getParentPhysicalResourceEntityId().getValue());\r
+ System.out.println(\r
+ vnPnMappingResultforOneNode.getParentPhysicalResourceEntityId().getValue());\r
+\r
+ }\r
+\r
+ VnPnMappingResult vnPnMappingResultforOtherNode =\r
+ getNodeVnPnMappingResult(otherNodeId, userIntentVnMapping, userVnPnMapping);\r
+\r
+ if(vnPnMappingResultforOtherNode != null) {\r
+ otherPhysicalPortId = new PhysicalPortId(\r
+ vnPnMappingResultforOtherNode.getPhysicalResourceEntityId().getValue());\r
+ System.out.println(\r
+ vnPnMappingResultforOtherNode.getPhysicalResourceEntityId().getValue());\r
+ otherPhysicalNodeId = new PhysicalNodeId(\r
+ vnPnMappingResultforOtherNode.getParentPhysicalResourceEntityId().getValue());\r
+ System.out.println(\r
+ vnPnMappingResultforOtherNode.getParentPhysicalResourceEntityId().getValue());\r
+\r
+ }\r
+\r
+ physicalPathforConnection = getPhysicalPathforConnection(\r
+ onePhysicalNodeId, otherPhysicalNodeId, physicalNetwork );\r
+\r
+ if(physicalPathforConnection != null){\r
+\r
+ configElementListForConnection = getConfigElementListForConnection(physicalPathforConnection,\r
+ physicalNetwork,\r
+ onePhysicalPortId,\r
+ otherPhysicalPortId);\r
+ /*//for test\r
+ for (ConfigElementForConnection c : configElementListForConnection) {\r
+ System.out.println();\r
+ System.out.println(c.getPhysicalNodeId().getValue());\r
+ System.out.println(c.getOuterPhysicalPortId().getValue());\r
+ System.out.println(c.getInnerPhysicalPortId().getValue());\r
+ }*/\r
+ List<ConfigElementForConnection> peersOfPEs = getPeersOfPEs(configElementListForConnection);\r
+ peersList.add(peersOfPEs);\r
+\r
+ }\r
+ }\r
+\r
+ }\r
+\r
+ //if topo is full mesh\r
+ if(isFullMeshTopology(peersList) == Boolean.TRUE){\r
+ buildFullMeshVPN(peersList);\r
+ }\r
+ }\r
+ }\r
+\r
+\r
+ /**\r
+ *\r
+ * @throws Exception\r
+ */\r
+ public void close() throws Exception {\r
+\r
+ if (telnetUtils != null){\r
+ telnetUtils.close();\r
+ }\r
+ }\r
+\r
+\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.nemo.renderer.cli;\r
+\r
+import com.google.common.base.Optional;\r
+import com.google.common.util.concurrent.FutureCallback;\r
+import com.google.common.util.concurrent.Futures;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+import java.util.concurrent.Executors;\r
+import java.util.concurrent.ScheduledExecutorService;\r
+import com.google.common.util.concurrent.CheckedFuture;\r
+\r
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
+import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;\r
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;\r
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;\r
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
+import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;\r
+import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;\r
+\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalNetwork;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.PhysicalNodes;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNode;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.VirtualNetworks;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.VirtualNetwork;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.VirtualNetworkKey;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.IntentVnMappingResults;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.VnPnMappingResults;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.UserIntentVnMapping;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.UserIntentVnMappingKey;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.vn.pn.mapping.results.UserVnPnMapping;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.VirtualNetworkId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.Users;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.User;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.UserKey;\r
+\r
+import org.opendaylight.yangtools.concepts.ListenerRegistration;\r
+import org.opendaylight.yangtools.yang.binding.DataObject;\r
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
+\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+import java.util.Map;\r
+import java.util.Set;\r
+\r
+\r
+/**\r
+ *\r
+ * @author Shixing Liu\r
+ */\r
+public class CliTrigger implements AutoCloseable {\r
+\r
+ private static final Logger LOG = LoggerFactory.getLogger(CliTrigger.class);\r
+ private final DataBroker dataProvider;\r
+ private ListenerRegistration<DataChangeListener> userVnPnMappingChangeListenerReg;\r
+ private final CliBuilder cliBuilder;\r
+\r
+ /**\r
+ *\r
+ * @param dataProvider\r
+ */\r
+ public CliTrigger(DataBroker dataProvider) {\r
+\r
+ super();\r
+\r
+ this.dataProvider = dataProvider;\r
+ cliBuilder = new CliBuilder(dataProvider);\r
+ //register listener\r
+ registerUserVnPnMappingListener();\r
+ LOG.info("Initialized CliTrigger.");\r
+ }\r
+\r
+ /**\r
+ *\r
+ */\r
+ private void registerUserVnPnMappingListener() {\r
+\r
+ //build userVnPnMappingIid\r
+ InstanceIdentifier<UserVnPnMapping> userVnPnMappingIid = InstanceIdentifier\r
+ .builder(VnPnMappingResults.class)\r
+ .child(UserVnPnMapping.class)\r
+ .build();\r
+ //register\r
+ userVnPnMappingChangeListenerReg = dataProvider.registerDataChangeListener(\r
+ LogicalDatastoreType.CONFIGURATION, userVnPnMappingIid,\r
+ new UserVnPnMappingChangeListener(), DataChangeScope.BASE);\r
+ }\r
+\r
+ /**\r
+ *\r
+ * @param userId\r
+ * @return\r
+ */\r
+ private User getUser(UserId userId) {\r
+\r
+ ReadOnlyTransaction readOnlyTransaction = dataProvider.newReadOnlyTransaction();\r
+ InstanceIdentifier<User> userIid = InstanceIdentifier.builder(Users.class)\r
+ .child(User.class, new UserKey(userId))\r
+ .build();\r
+ Optional<User> result = null;\r
+\r
+ try {\r
+ result = readOnlyTransaction.read(LogicalDatastoreType.CONFIGURATION, userIid).get();\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ }\r
+ if (result.isPresent()){\r
+ LOG.info("getUser OK");\r
+ return (result.get());\r
+\r
+ }else{\r
+ LOG.info("getUser ERROR");\r
+ return null;\r
+ }\r
+ }\r
+\r
+ /**\r
+ *\r
+ * @param userId\r
+ * @return\r
+ */\r
+ private VirtualNetwork getVirtualNetwork(UserId userId) {\r
+\r
+ VirtualNetworkId virtualNetworkId = new VirtualNetworkId(userId.getValue());\r
+ VirtualNetworkKey virtualNetworkKey = new VirtualNetworkKey(virtualNetworkId);\r
+\r
+ ReadOnlyTransaction readOnlyTransaction = dataProvider.newReadOnlyTransaction();\r
+ InstanceIdentifier<VirtualNetwork> virtualNetworkIid = InstanceIdentifier\r
+ .builder(VirtualNetworks.class)\r
+ .child(VirtualNetwork.class, virtualNetworkKey)\r
+ .build();\r
+ Optional<VirtualNetwork> result = null;\r
+\r
+ try {\r
+ result = readOnlyTransaction.read(LogicalDatastoreType.CONFIGURATION, virtualNetworkIid).get();\r
+\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ }\r
+ if (result.isPresent()) {\r
+ LOG.info("getVirtualNetwork OK");\r
+ return (result.get());\r
+\r
+ }else{\r
+ LOG.info("getVirtualNetwork ERROR");\r
+ return null;\r
+ }\r
+ }\r
+\r
+ /**\r
+ *\r
+ * @param userId\r
+ * @return\r
+ */\r
+ private UserIntentVnMapping getUserIntentVnMapping(UserId userId) {\r
+\r
+ ReadOnlyTransaction readOnlyTransaction = dataProvider.newReadOnlyTransaction();\r
+ InstanceIdentifier<UserIntentVnMapping> userIntentVnMappingIid = InstanceIdentifier\r
+ .builder(IntentVnMappingResults.class)\r
+ .child(UserIntentVnMapping.class, new UserIntentVnMappingKey(userId))\r
+ .build();\r
+ Optional<UserIntentVnMapping> result = null;\r
+ try {\r
+ result = readOnlyTransaction.read(LogicalDatastoreType.CONFIGURATION, userIntentVnMappingIid).get();\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ }\r
+ if (result.isPresent()) {\r
+ LOG.info("getUserIntentVnMapping OK");\r
+ return (result.get());\r
+\r
+ }else{\r
+ LOG.info("getUserIntentVnMapping ERROR");\r
+ return null;\r
+ }\r
+ }\r
+\r
+ /**\r
+ *\r
+ * @return\r
+ */\r
+ private PhysicalNetwork getPhysicalNetwork() {\r
+\r
+ ReadOnlyTransaction readOnlyTransaction = dataProvider.newReadOnlyTransaction();\r
+ InstanceIdentifier<PhysicalNetwork> physicalNetworkIid = InstanceIdentifier\r
+ .builder(PhysicalNetwork.class)\r
+ .build();\r
+ Optional<PhysicalNetwork> result = null;\r
+ try {\r
+ result = readOnlyTransaction.read(LogicalDatastoreType.OPERATIONAL, physicalNetworkIid).get();\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ }\r
+ if (result.isPresent()) {\r
+ LOG.info("getPhysicalNetwork OK");\r
+ return (result.get());\r
+\r
+ }else{\r
+ LOG.info("getPhysicalNetwork ERROR");\r
+ return null;\r
+ }\r
+ }\r
+\r
+\r
+ /**\r
+ *\r
+ */\r
+ private class UserVnPnMappingChangeListener implements DataChangeListener {\r
+\r
+ @Override\r
+ public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {\r
+ if ( null == change ) {\r
+ return;\r
+ }\r
+ System.out.println();\r
+ System.out.println("Data changed for UserVnPnMapping.");\r
+ System.out.println();\r
+\r
+ Map<InstanceIdentifier<?>, DataObject> createdData = change.getCreatedData();\r
+ if ( null != createdData && !createdData.isEmpty() ) {\r
+ for ( DataObject dataObject : createdData.values() ) {\r
+ if ( dataObject instanceof UserVnPnMapping ) {\r
+\r
+ LOG.info("Ready to call function to generate cli execution sequences for related devices.");\r
+\r
+ UserVnPnMapping userVnPnMapping = (UserVnPnMapping)dataObject;\r
+ UserId userId = userVnPnMapping.getUserId();\r
+\r
+ User user = getUser(userId);\r
+ VirtualNetwork virtualNetwork = getVirtualNetwork(userId);\r
+ UserIntentVnMapping userIntentVnMapping = getUserIntentVnMapping(userId);\r
+ PhysicalNetwork physicalNetwork = getPhysicalNetwork();\r
+ if(null == physicalNetwork)\r
+ {\r
+ LOG.info("Physical Network data are not present.");\r
+ return;\r
+ }\r
+ PhysicalNodes physicalNodes= physicalNetwork.getPhysicalNodes();\r
+ List<PhysicalNode> physicalNodeList = physicalNodes.getPhysicalNode();\r
+ cliBuilder.init(physicalNodeList);\r
+\r
+ cliBuilder.updateCliExecutionSequence(user, virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
+\r
+ LOG.info("Already call cliBuilder.updateCliExecutionSequence().");\r
+ }\r
+ }\r
+ }\r
+\r
+ Map<InstanceIdentifier<?>, DataObject> updatedData = change.getUpdatedData();\r
+ if ( null != updatedData && !updatedData.isEmpty() ) {\r
+ for ( DataObject dataObject : updatedData.values() ) {\r
+ if ( dataObject instanceof UserVnPnMapping ) {\r
+\r
+ LOG.info("Ready to call function to generate cli execution sequences for related devices.");\r
+\r
+ UserVnPnMapping userVnPnMapping = (UserVnPnMapping)dataObject;\r
+ UserId userId = userVnPnMapping.getUserId();\r
+\r
+ //TO DO :flowUtils.deleteFlowEntries(userId);??????\r
+\r
+ User user = getUser(userId);\r
+ VirtualNetwork virtualNetwork = getVirtualNetwork(userId);\r
+ UserIntentVnMapping userIntentVnMapping = getUserIntentVnMapping(userId);\r
+ PhysicalNetwork physicalNetwork = getPhysicalNetwork();\r
+ if(physicalNetwork == null)\r
+ {\r
+ LOG.info("Physical Network data are not present.");\r
+ return;\r
+ }\r
+\r
+ cliBuilder.updateCliExecutionSequence(user, virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
+\r
+ LOG.info("Already call cliBuilder.updateCliExecutionSequence().");\r
+ }\r
+ }\r
+ }\r
+\r
+ Map<InstanceIdentifier<?>, DataObject> originalData = change.getOriginalData();\r
+ Set<InstanceIdentifier<?>> removedPaths = change.getRemovedPaths();\r
+ if ( null != removedPaths && !removedPaths.isEmpty() ) {\r
+\r
+ DataObject dataObject;\r
+\r
+ for ( InstanceIdentifier<?> instanceId : removedPaths ) {\r
+ dataObject = originalData.get(instanceId);\r
+ if ( null != dataObject && dataObject instanceof UserVnPnMapping ) {\r
+ UserVnPnMapping userVnPnMapping = (UserVnPnMapping)dataObject;\r
+\r
+ //TO DO\r
+ //flowUtils.deleteFlowEntries(userVnPnMapping.getUserId());\r
+ }\r
+ }\r
+ }\r
+ return;\r
+\r
+ }\r
+ }\r
+\r
+\r
+ public void close() throws Exception {\r
+\r
+ if ( null != this.userVnPnMappingChangeListenerReg ) {\r
+ this.userVnPnMappingChangeListenerReg.close();\r
+ }\r
+\r
+ if(null != this.cliBuilder){\r
+ this.cliBuilder.close();\r
+ }\r
+ }\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.nemo.renderer.cli;\r
+\r
+import org.jboss.netty.bootstrap.ClientBootstrap;\r
+import org.jboss.netty.channel.ChannelFactory;\r
+import org.jboss.netty.channel.ChannelPipeline;\r
+import org.jboss.netty.channel.ChannelPipelineFactory;\r
+import org.jboss.netty.channel.Channels;\r
+import org.jboss.netty.buffer.ChannelBuffer;\r
+import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;\r
+import org.jboss.netty.handler.codec.string.StringDecoder;\r
+import org.jboss.netty.handler.codec.string.StringEncoder;\r
+import org.jboss.netty.channel.*;\r
+\r
+import java.net.InetSocketAddress;\r
+import java.util.concurrent.Executors;\r
+\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+/**\r
+ *\r
+ * @author Shixing Liu\r
+ */\r
+public class TelnetUtils implements AutoCloseable {\r
+\r
+ private static final Logger LOG = LoggerFactory.getLogger(TelnetUtils.class);\r
+\r
+ private static Boolean ClearOver = Boolean.TRUE;\r
+ private static String instanceOfClearCliTemplate = null;\r
+ private static String instanceOfNewCliTemplate = null;\r
+ private static String currentDeviceName = null;\r
+ private static Boolean ConfigOver = Boolean.FALSE;\r
+\r
+ /**\r
+ *\r
+ */\r
+ public TelnetUtils(){\r
+\r
+ LOG.info("TelnetUtils constructor");\r
+ }\r
+\r
+ /**\r
+ *\r
+ * @throws Exception\r
+ */\r
+ public void close() throws Exception {\r
+\r
+ }\r
+\r
+ /**\r
+ *\r
+ * @return\r
+ */\r
+ public static Boolean isClearOver() {\r
+ return ClearOver;\r
+ }\r
+\r
+ /**\r
+ *\r
+ * @param clearOver\r
+ */\r
+ public static void setClearOver(Boolean clearOver) {\r
+ ClearOver = clearOver;\r
+ }\r
+\r
+ /**\r
+ *\r
+ * @return\r
+ */\r
+ public static String getInstanceOfClearCliTemplate() {\r
+ return instanceOfClearCliTemplate;\r
+ }\r
+\r
+ /**\r
+ *\r
+ * @param instanceOfClearCliTemplate\r
+ */\r
+ public static void setInstanceOfClearCliTemplate(String instanceOfClearCliTemplate) {\r
+ TelnetUtils.instanceOfClearCliTemplate = instanceOfClearCliTemplate;\r
+ }\r
+\r
+ /**\r
+ *\r
+ * @return\r
+ */\r
+ public static String getInstanceOfNewCliTemplate() {\r
+ return instanceOfNewCliTemplate;\r
+ }\r
+\r
+ /**\r
+ *\r
+ * @param instanceOfNewCliTemplate\r
+ */\r
+ public static void setInstanceOfNewCliTemplate(String instanceOfNewCliTemplate) {\r
+ TelnetUtils.instanceOfNewCliTemplate = instanceOfNewCliTemplate;\r
+ }\r
+\r
+ /**\r
+ *\r
+ * @return\r
+ */\r
+ public static String getCurrentDeviceName() {\r
+ return currentDeviceName;\r
+ }\r
+\r
+ /**\r
+ *\r
+ * @param currentDeviceName\r
+ */\r
+ public static void setCurrentDeviceName(String currentDeviceName) {\r
+ TelnetUtils.currentDeviceName = currentDeviceName;\r
+ }\r
+\r
+ /**\r
+ *\r
+ * @return\r
+ */\r
+ public static Boolean isConfigOver() {\r
+ return ConfigOver.booleanValue();\r
+ }\r
+\r
+ /**\r
+ *\r
+ * @param configOver\r
+ */\r
+ public static void setConfigOver(Boolean configOver) {\r
+ ConfigOver = configOver;\r
+ }\r
+\r
+ /**\r
+ *\r
+ * @param simpleChannelUpstreamHandler\r
+ */\r
+ private void startConnectAndConfig(SimpleChannelUpstreamHandler simpleChannelUpstreamHandler){\r
+ ChannelFactory factory = new NioClientSocketChannelFactory(\r
+ Executors.newCachedThreadPool(),\r
+ Executors.newCachedThreadPool());\r
+ ClientBootstrap bootstrap = new ClientBootstrap(factory);\r
+ bootstrap.setPipelineFactory(new ChannelPipelineFactory() {\r
+ public ChannelPipeline getPipeline() {\r
+ ChannelPipeline p = Channels.pipeline();\r
+ p.addLast("encode", new StringEncoder());\r
+ p.addLast("decode", new StringDecoder());\r
+ p.addLast("handler", new ClientHandlerForClearOldConfig());\r
+ return p;\r
+ }\r
+ });\r
+ bootstrap.setOption("tcpNoDelay" , true);\r
+ bootstrap.setOption("keepAlive", true);\r
+ bootstrap.setOption("connectTimeoutMillis", 5000);\r
+\r
+ String ipAddress = null;\r
+ String deviceName = getCurrentDeviceName();\r
+ if(deviceName.contains("PE1")) {\r
+ ipAddress = "191.4.1.114";\r
+ }else if(deviceName.contains("PE2")){\r
+ ipAddress = "191.4.1.77";\r
+ }else if(deviceName.contains("PE3")){\r
+ ipAddress = "191.4.1.103";\r
+ }\r
+ System.out.println("Try to clear old configuration for device "+ deviceName+"\n");\r
+ bootstrap.connect(new InetSocketAddress(ipAddress, 23));\r
+\r
+ }\r
+\r
+ /**\r
+ *\r
+ */\r
+ private void clearOldConfig(){\r
+\r
+ ChannelFactory factory = new NioClientSocketChannelFactory(\r
+ Executors.newCachedThreadPool(),\r
+ Executors.newCachedThreadPool());\r
+ ClientBootstrap bootstrap = new ClientBootstrap(factory);\r
+ bootstrap.setPipelineFactory(new ChannelPipelineFactory() {\r
+ public ChannelPipeline getPipeline() {\r
+ ChannelPipeline p = Channels.pipeline();\r
+ p.addLast("encode", new StringEncoder());\r
+ p.addLast("decode", new StringDecoder());\r
+ p.addLast("handler", new ClientHandlerForClearOldConfig());\r
+ return p;\r
+ }\r
+ });\r
+ bootstrap.setOption("tcpNoDelay" , true);\r
+ bootstrap.setOption("keepAlive", true);\r
+ bootstrap.setOption("connectTimeoutMillis", 5000);\r
+\r
+ String ipAddress = null;\r
+ String deviceName = getCurrentDeviceName();\r
+ if(deviceName.contains("PE1")) {\r
+ ipAddress = "191.4.1.114";\r
+ }else if(deviceName.contains("PE2")){\r
+ ipAddress = "191.4.1.77";\r
+ }else if(deviceName.contains("PE3")){\r
+ ipAddress = "191.4.1.103";\r
+ }\r
+ System.out.println("Try to clear old configuration for device "+ deviceName+"\n");\r
+ bootstrap.connect(new InetSocketAddress(ipAddress, 23));\r
+ }\r
+\r
+ /**\r
+ *\r
+ */\r
+ private static class ClientHandlerForClearOldConfig extends SimpleChannelUpstreamHandler {\r
+ @Override\r
+ public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) {\r
+ }\r
+\r
+ @Override\r
+ public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)throws Exception {\r
+\r
+ String str = (String)(e.getMessage());\r
+ System.out.println(e.getMessage());\r
+ if(str.contains("Username")){\r
+ e.getChannel().write("lfk\n");\r
+ }\r
+ else if(str.contains("Password")){\r
+ e.getChannel().write("123!@#\n");\r
+ }\r
+ else if(str.contains("The current login time is")){\r
+ //System.out.println("------------b1----------");\r
+ setClearOver(Boolean.FALSE);\r
+ e.getChannel().write("system-view\n");\r
+ e.getChannel().write("undo ip vpn-instance vpn1\n");\r
+\r
+ }else if(str.contains("Error: The VPN instance does not exist.")){\r
+ //System.out.println("------------b2----------");\r
+ setClearOver(Boolean.TRUE);\r
+ e.getChannel().close();\r
+ System.out.println("Clear is completed for device " + getCurrentDeviceName());\r
+ //start send down new config cli\r
+ sendNewConfig();\r
+ }else if(str.contains("Error: The VPN instance is in stale state.")){\r
+ //System.out.println("------------b3----------");\r
+ e.getChannel().write("undo ip vpn-instance vpn1\n");\r
+ }\r
+ else if((isClearOver() == Boolean.FALSE)\r
+ &&(!str.contains("Error: The VPN instance does not exist."))\r
+ &&(!str.contains("Error: The VPN instance is in stale state."))){\r
+ //System.out.println("------------b4----------");\r
+ e.getChannel().write("undo ip vpn-instance vpn1\n");\r
+ }\r
+ super.messageReceived(ctx, e);\r
+ }\r
+\r
+ @Override\r
+ public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {\r
+ e.getCause().printStackTrace();\r
+ e.getChannel().close();\r
+ }\r
+ }\r
+\r
+ /**\r
+ *\r
+ */\r
+ private static void sendNewConfig(){\r
+\r
+ ChannelFactory factory = new NioClientSocketChannelFactory(\r
+ Executors.newCachedThreadPool(),\r
+ Executors.newCachedThreadPool());\r
+ ClientBootstrap bootstrap = new ClientBootstrap(factory);\r
+ bootstrap.setPipelineFactory(new ChannelPipelineFactory() {\r
+ public ChannelPipeline getPipeline() {\r
+ ChannelPipeline p = Channels.pipeline();\r
+ p.addLast("encode",new StringEncoder());\r
+ p.addLast("decode",new StringDecoder());\r
+ p.addLast("handler",new ClientHandlerForSendNewConfig());\r
+ return p;\r
+ }\r
+ });\r
+ bootstrap.setOption("connectTimeoutMillis", 6000);\r
+ bootstrap.setOption("tcpNoDelay" , true);\r
+ bootstrap.setOption("keepAlive", true);\r
+\r
+ String ipAddress = null;\r
+ String deviceName = getCurrentDeviceName();\r
+ if(deviceName.contains("PE1")) {\r
+ ipAddress = "191.4.1.114";\r
+ }else if(deviceName.contains("PE2")){\r
+ ipAddress = "191.4.1.77";\r
+ }else if(deviceName.contains("PE3")){\r
+ ipAddress = "191.4.1.103";\r
+ }\r
+ System.out.println("Start to configure device " + deviceName + " with CLI.");\r
+ bootstrap.connect(new InetSocketAddress(ipAddress, 23));\r
+ }\r
+\r
+\r
+ /**\r
+ *\r
+ * @param deviceName\r
+ * @param clearOldConfigString\r
+ * @param cliExecutionSequences\r
+ */\r
+ public void configL3vpnOnDeviceByCli(String deviceName,\r
+ String clearOldConfigString,\r
+ String cliExecutionSequences){\r
+\r
+ setConfigOver(Boolean.FALSE);\r
+ setInstanceOfClearCliTemplate(clearOldConfigString);\r
+ setInstanceOfNewCliTemplate(cliExecutionSequences);\r
+ setCurrentDeviceName(deviceName);\r
+ clearOldConfig();\r
+ }\r
+\r
+ /**\r
+ *\r
+ */\r
+ private static class ClientHandlerForSendNewConfig extends SimpleChannelUpstreamHandler {\r
+ @Override\r
+ public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) {\r
+ }\r
+\r
+ @Override\r
+ public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {\r
+\r
+ String str = (String)(e.getMessage());\r
+ System.out.println(e.getMessage());\r
+ if(str.contains("Username")){\r
+ e.getChannel().write("lfk\n");\r
+ }\r
+ else if(str.contains("Password")){\r
+ e.getChannel().write("123!@#\n");\r
+ }\r
+ if (str.contains("The current login time is")) {\r
+ System.out.println("ClientHandlerForConfig ");\r
+ e.getChannel().write("system-view\n");\r
+ e.getChannel().write(getInstanceOfClearCliTemplate());\r
+ e.getChannel().write(getInstanceOfNewCliTemplate());\r
+ setConfigOver(Boolean.TRUE);\r
+ System.out.println("Configuration is completed for device "+ getCurrentDeviceName());\r
+\r
+ }\r
+ super.messageReceived(ctx, e);\r
+ }\r
+\r
+ @Override\r
+ public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {\r
+ e.getCause().printStackTrace();\r
+ e.getChannel().close();\r
+ }\r
+ }\r
+\r
+\r
+}
\ No newline at end of file