Implement CLI configuration generation. 09/30709/1
authorShixing Liu <liushixing@huawei.com>
Fri, 4 Dec 2015 11:35:18 +0000 (19:35 +0800)
committerShixing Liu <liushixing@huawei.com>
Fri, 4 Dec 2015 11:47:24 +0000 (19:47 +0800)
Change-Id: I0581ff083be6837ddb66197fcddfe8c35b05c767
Signed-off-by: Shixing Liu <liushixing@huawei.com>
nemo-renderers/cli-renderer/src/main/java/org/opendaylight/nemo/renderer/cli/CliBuilder.java [new file with mode: 0644]
nemo-renderers/cli-renderer/src/main/java/org/opendaylight/nemo/renderer/cli/CliRenderer.java
nemo-renderers/cli-renderer/src/main/java/org/opendaylight/nemo/renderer/cli/CliTrigger.java [new file with mode: 0644]
nemo-renderers/cli-renderer/src/main/java/org/opendaylight/nemo/renderer/cli/TelnetUtils.java [new file with mode: 0644]

diff --git a/nemo-renderers/cli-renderer/src/main/java/org/opendaylight/nemo/renderer/cli/CliBuilder.java b/nemo-renderers/cli-renderer/src/main/java/org/opendaylight/nemo/renderer/cli/CliBuilder.java
new file mode 100644 (file)
index 0000000..97f29cf
--- /dev/null
@@ -0,0 +1,955 @@
+/*\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
index 5734b83e47e9767d342f9fcc4417427ea0e5b98e..1bd6fa28079768b702b5d939728dba41de67724f 100644 (file)
@@ -9,6 +9,7 @@
 package org.opendaylight.nemo.renderer.cli;\r
 \r
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
+import org.opendaylight.nemo.renderer.cli.physicalnetwork.PhysicalResourceLoader;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 \r
@@ -23,18 +24,41 @@ public class CliRenderer implements AutoCloseable {
 \r
     private final DataBroker dataBroker;\r
 \r
-    public CliRenderer(DataBroker dataBroker) {\r
-        super();\r
+    private final PhysicalResourceLoader physicalResourceLoader;\r
+    private final CliTrigger cliTrigger;\r
 \r
+    /**\r
+     *\r
+     * @param dataBroker\r
+     */\r
+       public CliRenderer(DataBroker dataBroker) {\r
+               super();\r
         this.dataBroker = dataBroker;\r
 \r
-        LOG.info("Initialized the NEMO CLI renderer.");\r
+        LOG.debug("new PhysicalResourceLoader.");\r
+        physicalResourceLoader = new PhysicalResourceLoader(dataBroker);\r
 \r
-        return;\r
+        LOG.debug("new CliTrigger.");\r
+        cliTrigger = new CliTrigger(dataBroker);\r
+\r
+               LOG.info("Initialized cli renderer.");\r
+\r
+               return;\r
     }\r
 \r
-    @Override\r
+    /**\r
+     *\r
+     * @throws Exception\r
+     */\r
+       @Override\r
     public void close() throws Exception {\r
-        // TODO\r
+        if (physicalResourceLoader != null){\r
+            physicalResourceLoader.close();\r
+        }\r
+        if (cliTrigger != null){\r
+            cliTrigger.close();\r
+        }\r
+\r
+               return;\r
     }\r
 }\r
diff --git a/nemo-renderers/cli-renderer/src/main/java/org/opendaylight/nemo/renderer/cli/CliTrigger.java b/nemo-renderers/cli-renderer/src/main/java/org/opendaylight/nemo/renderer/cli/CliTrigger.java
new file mode 100644 (file)
index 0000000..8be39e0
--- /dev/null
@@ -0,0 +1,320 @@
+/*\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
diff --git a/nemo-renderers/cli-renderer/src/main/java/org/opendaylight/nemo/renderer/cli/TelnetUtils.java b/nemo-renderers/cli-renderer/src/main/java/org/opendaylight/nemo/renderer/cli/TelnetUtils.java
new file mode 100644 (file)
index 0000000..e467178
--- /dev/null
@@ -0,0 +1,353 @@
+/*\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