Modify the openflow renderer to support physical topology monitoring and ARP handling. 10/29810/1
authorZhigang Ji <jizhigang@huawei.com>
Tue, 17 Nov 2015 09:55:58 +0000 (17:55 +0800)
committerZhigang Ji <jizhigang@huawei.com>
Tue, 17 Nov 2015 09:59:54 +0000 (17:59 +0800)
Change-Id: Ic25ad709e953d687db4941addfe318bc9662a4c6
Signed-off-by: Zhigang Ji <jizhigang@huawei.com>
46 files changed:
nemo-features/pom.xml
nemo-features/src/main/features/features.xml
nemo-renderers/openflow-renderer/pom.xml
nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/FlowTableManager.java
nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/FlowUtils.java
nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/OpenflowRenderer.java
nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/ResourceManager.java [deleted file]
nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/entity/HostBean.java [deleted file]
nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/entity/LinkBean.java [deleted file]
nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/entity/NodeBean.java [deleted file]
nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/entity/PortBean.java [deleted file]
nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/entity/ResourceBean.java [deleted file]
nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/physicalnetwork/DataBrokerAdapter.java [new file with mode: 0644]
nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/physicalnetwork/OFLinkListener.java [new file with mode: 0644]
nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/physicalnetwork/OFNodeListener.java [new file with mode: 0644]
nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/physicalnetwork/OFPacketInListener.java [new file with mode: 0644]
nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/physicalnetwork/PhyConfigLoader.java [new file with mode: 0644]
nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/physicalnetwork/PhysicalFlowUtils.java [new file with mode: 0644]
nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/physicalnetwork/PhysicalNetworkAdapter.java [new file with mode: 0644]
nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/physicalnetwork/Utils.java [new file with mode: 0644]
nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/utils/ARP.java [new file with mode: 0644]
nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/nemo/openflow/renderer/impl/rev151010/OpenflowRendererModule.java
nemo-renderers/openflow-renderer/src/main/resources/etc/nemo/resource-bod.json [deleted file]
nemo-renderers/openflow-renderer/src/main/resources/etc/nemo/resource-servicechain.json [deleted file]
nemo-renderers/openflow-renderer/src/main/resources/etc/nemo/resource.json [deleted file]
nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/external-resource-bod.json [new file with mode: 0644]
nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/external-resource-servicechain.json [new file with mode: 0644]
nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/external-resource.json [new file with mode: 0644]
nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/host-resource-bod.json [new file with mode: 0644]
nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/host-resource-servicechain.json [new file with mode: 0644]
nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/host-resource.json [new file with mode: 0644]
nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/link-resource-bod.json [new file with mode: 0644]
nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/link-resource-servicechain.json [new file with mode: 0644]
nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/link-resource.json [new file with mode: 0644]
nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/node-resource-bod.json [new file with mode: 0644]
nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/node-resource-servicechain.json [new file with mode: 0644]
nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/node-resource.json [new file with mode: 0644]
nemo-renderers/openflow-renderer/src/test/java/org/opendaylight/nemo/renderer/openflow/FlowTableManagerTest.java [deleted file]
nemo-renderers/openflow-renderer/src/test/java/org/opendaylight/nemo/renderer/openflow/FlowUtilsTest.java [deleted file]
nemo-renderers/openflow-renderer/src/test/java/org/opendaylight/nemo/renderer/openflow/OpenflowRendererTest.java [deleted file]
nemo-renderers/openflow-renderer/src/test/java/org/opendaylight/nemo/renderer/openflow/ResourceManagerTest.java [deleted file]
nemo-renderers/openflow-renderer/src/test/java/org/opendaylight/nemo/renderer/openflow/entity/HostBeanTest.java [deleted file]
nemo-renderers/openflow-renderer/src/test/java/org/opendaylight/nemo/renderer/openflow/entity/LinkBeanTest.java [deleted file]
nemo-renderers/openflow-renderer/src/test/java/org/opendaylight/nemo/renderer/openflow/entity/NodeBeanTest.java [deleted file]
nemo-renderers/openflow-renderer/src/test/java/org/opendaylight/nemo/renderer/openflow/entity/PortBeanTest.java [deleted file]
nemo-renderers/openflow-renderer/src/test/java/org/opendaylight/nemo/renderer/openflow/entity/ResourceBeanTest.java [deleted file]

index e4db9edfa58223eecd77cc1b622f1ca356752a76..8f320324440af79d7eceb29e02dba971f145871a 100644 (file)
@@ -30,7 +30,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
     <mdsal.version>1.3.0-SNAPSHOT</mdsal.version>
     <restconf.version>1.3.0-SNAPSHOT</restconf.version>
     <dlux.version>0.3.0-SNAPSHOT</dlux.version>
-       <openflowplugin.version>0.2.0-SNAPSHOT</openflowplugin.version>
+    <openflowplugin.version>0.2.0-SNAPSHOT</openflowplugin.version>
   </properties>
 
   <dependencyManagement>
@@ -98,11 +98,10 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <type>xml</type>
       <scope>runtime</scope>
     </dependency>
-       
-       <dependency>
+    <dependency>
       <groupId>org.opendaylight.openflowplugin</groupId>
       <artifactId>features-openflowplugin</artifactId>
-         <version>${openflowplugin.version}</version>
+      <version>${openflowplugin.version}</version>
       <classifier>features</classifier>
       <type>xml</type>
     </dependency>
@@ -113,7 +112,6 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <classifier>features</classifier>
       <type>xml</type>
     </dependency>
-       
     <dependency>
       <groupId>${project.groupId}</groupId>
       <artifactId>nemo-api</artifactId>
@@ -147,7 +145,28 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <groupId>${project.groupId}</groupId>
       <artifactId>openflow-renderer</artifactId>
       <version>${project.version}</version>
-      <classifier>resource</classifier>
+      <classifier>node-resource</classifier>
+      <type>json</type>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>openflow-renderer</artifactId>
+      <version>${project.version}</version>
+      <classifier>host-resource</classifier>
+      <type>json</type>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>openflow-renderer</artifactId>
+      <version>${project.version}</version>
+      <classifier>link-resource</classifier>
+      <type>json</type>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>openflow-renderer</artifactId>
+      <version>${project.version}</version>
+      <classifier>external-resource</classifier>
       <type>json</type>
     </dependency>
     <dependency>
index f14ab7c65663c05eb7fd72516108677e87aa5ec2..2cfb0c4f105b06bc369a03ebf148b6a355d63900 100644 (file)
@@ -36,7 +36,10 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
     <feature version='${project.version}'>odl-nemo-engine-rest</feature>\r
     <bundle>mvn:org.opendaylight.nemo/openflow-renderer/${project.version}</bundle>\r
     <configfile finalname='etc/opendaylight/karaf/01-nemo-openflow-renderer.xml'>mvn:org.opendaylight.nemo/openflow-renderer/${project.version}/xml/config</configfile>\r
-    <configfile finalname='etc/nemo/nemo-openflow-renderer-resource.json'>mvn:org.opendaylight.nemo/openflow-renderer/${project.version}/json/resource</configfile>\r
+    <configfile finalname='etc/opendaylight/karaf/nemo-openflow-renderer-node-resource.json'>mvn:org.opendaylight.nemo/openflow-renderer/${project.version}/json/node-resource</configfile>\r
+    <configfile finalname='etc/opendaylight/karaf/nemo-openflow-renderer-link-resource.json'>mvn:org.opendaylight.nemo/openflow-renderer/${project.version}/json/link-resource</configfile>\r
+    <configfile finalname='etc/opendaylight/karaf/nemo-openflow-renderer-host-resource.json'>mvn:org.opendaylight.nemo/openflow-renderer/${project.version}/json/host-resource</configfile>\r
+    <configfile finalname='etc/opendaylight/karaf/nemo-openflow-renderer-external-resource.json'>mvn:org.opendaylight.nemo/openflow-renderer/${project.version}/json/external-resource</configfile>\r
   </feature>\r
   <feature name='odl-nemo-cli-renderer' version='${project.version}' description='OpenDaylight :: NEMO :: CLI Renderer'>\r
     <feature version='${project.version}'>odl-nemo-engine-rest</feature>\r
@@ -46,4 +49,4 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
     <feature version='${project.version}'>odl-nemo-engine-rest</feature>\r
     <bundle>mvn:org.opendaylight.nemo/nemo-ui/${project.version}</bundle>\r
   </feature>\r
-</features>\r
+</features>
\ No newline at end of file
index ab0b3f56f8a1c954d4d2bc9711aacc64625cce06..0c9915d59816f8ff60ab210c9e5358ef8ff05e26 100644 (file)
@@ -31,17 +31,19 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   </properties>
 
   <dependencies>
-    <!-- model dependencies -->
     <dependency>
       <groupId>org.opendaylight.mdsal.model</groupId>
       <artifactId>yang-ext</artifactId>
     </dependency>
-    <!-- project specific dependencies -->
     <dependency>
       <groupId>org.opendaylight.openflowplugin</groupId>
       <artifactId>openflowplugin-extension-nicira</artifactId>
       <version>${openflowplugin.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.controller.model</groupId>
+      <artifactId>model-topology</artifactId>
+    </dependency>
     <dependency>
       <groupId>org.opendaylight.controller</groupId>
       <artifactId>liblldp</artifactId>
@@ -162,16 +164,31 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
             <phase>package</phase>
             <configuration>
               <artifacts>
-               <artifact>
-                  <file>${project.build.directory}/classes/etc/nemo/resource.json</file>
-                  <type>json</type>
-                  <classifier>resource</classifier>
-                </artifact>
                 <artifact>
                   <file>${project.build.directory}/classes/etc/opendaylight/karaf/config.xml</file>
                   <type>xml</type>
                   <classifier>config</classifier>
                 </artifact>
+                <artifact>
+                  <file>${project.build.directory}/classes/etc/opendaylight/karaf/node-resource.json</file>
+                  <type>json</type>
+                  <classifier>node-resource</classifier>
+                </artifact>
+                <artifact>
+                  <file>${project.build.directory}/classes/etc/opendaylight/karaf/host-resource.json</file>
+                  <type>json</type>
+                  <classifier>host-resource</classifier>
+                </artifact>
+                <artifact>
+                  <file>${project.build.directory}/classes/etc/opendaylight/karaf/link-resource.json</file>
+                  <type>json</type>
+                  <classifier>link-resource</classifier>
+                </artifact>
+                <artifact>
+                  <file>${project.build.directory}/classes/etc/opendaylight/karaf/external-resource.json</file>
+                  <type>json</type>
+                  <classifier>external-resource</classifier>
+                </artifact>
               </artifacts>
             </configuration>
           </execution>
index 6ba4a0f8e0a5d78d18cd3e6469abaabde260ffff..21e913bf58a43b679c14e911d8b43bc2ae22f1fd 100644 (file)
@@ -9,23 +9,14 @@
 package org.opendaylight.nemo.renderer.openflow;\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.binding.api.ReadOnlyTransaction;\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.nemo.renderer.openflow.physicalnetwork.PhyConfigLoader;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService;\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
@@ -37,19 +28,18 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.m
 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.engine.common.rev151010.VirtualNetworkId;\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
 import org.opendaylight.yangtools.concepts.ListenerRegistration;\r
 import org.opendaylight.yangtools.yang.binding.DataObject;\r
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
-\r
-\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 \r
+import java.util.List;\r
 import java.util.Map;\r
 import java.util.Set;\r
 \r
@@ -57,20 +47,32 @@ public class FlowTableManager implements AutoCloseable {
     private static final Logger LOG = LoggerFactory.getLogger(FlowTableManager.class);\r
 \r
     private final DataBroker dataProvider;\r
+    private final PacketProcessingService packetProcessingService;\r
 \r
     private ListenerRegistration<DataChangeListener> userVnPnMappingChangeListenerReg;\r
 \r
     private FlowUtils flowUtils = null;\r
 \r
-    public FlowTableManager(DataBroker dataProvider, ResourceManager resourceManager){\r
+    public FlowTableManager(DataBroker dataProvider,\r
+                            PacketProcessingService packetProcessingService,\r
+                            PhyConfigLoader phyConfigLoader) {\r
+        super();\r
 \r
         this.dataProvider = dataProvider;\r
-        LOG.info("Initialized FlowTableManager.");\r
-        flowUtils = new FlowUtils(dataProvider, resourceManager);\r
-        //register  listener\r
+        this.packetProcessingService = packetProcessingService;\r
+\r
+        LOG.debug("Initialized FlowTableManager.");\r
+\r
+        flowUtils = new FlowUtils(dataProvider, packetProcessingService, phyConfigLoader);\r
+\r
+        // Register listener;\r
         registerUserVnPnMappingListener();\r
     }\r
 \r
+    protected FlowUtils getFlowUtils() {\r
+        return flowUtils;\r
+    }\r
+\r
     private void registerUserVnPnMappingListener() {\r
 \r
         //build userVnPnMappingIid\r
@@ -99,11 +101,11 @@ public class FlowTableManager implements AutoCloseable {
             e.printStackTrace();\r
         }\r
         if (result.isPresent()){\r
-            LOG.info("getUser  OK");\r
+            LOG.debug("getUser  OK");\r
             return (result.get());\r
 \r
         }else{\r
-            LOG.info("getUser  ERROR");\r
+            LOG.debug("getUser  ERROR");\r
             return  null;\r
         }\r
     }\r
@@ -128,11 +130,11 @@ public class FlowTableManager implements AutoCloseable {
             e.printStackTrace();\r
         }\r
         if (result.isPresent()) {\r
-            LOG.info("getVirtualNetwork  OK");\r
+            LOG.debug("getVirtualNetwork  OK");\r
             return (result.get());\r
 \r
         }else{\r
-            LOG.info("getVirtualNetwork  ERROR");\r
+            LOG.debug("getVirtualNetwork  ERROR");\r
             return  null;\r
         }\r
     }\r
@@ -151,11 +153,11 @@ public class FlowTableManager implements AutoCloseable {
             e.printStackTrace();\r
         }\r
         if (result.isPresent()) {\r
-            LOG.info("getUserIntentVnMapping  OK");\r
+            LOG.debug("getUserIntentVnMapping  OK");\r
             return (result.get());\r
 \r
         }else{\r
-            LOG.info("getUserIntentVnMapping  ERROR");\r
+            LOG.debug("getUserIntentVnMapping  ERROR");\r
             return  null;\r
         }\r
     }\r
@@ -173,11 +175,11 @@ public class FlowTableManager implements AutoCloseable {
             e.printStackTrace();\r
         }\r
         if (result.isPresent()) {\r
-            LOG.info("getPhysicalNetwork  OK");\r
+            LOG.debug("getPhysicalNetwork  OK");\r
             return (result.get());\r
 \r
         }else{\r
-            LOG.info("getPhysicalNetwork  ERROR");\r
+            LOG.debug("getPhysicalNetwork  ERROR");\r
             return  null;\r
         }\r
     }\r
@@ -196,7 +198,7 @@ public class FlowTableManager implements AutoCloseable {
             if ( null != createdData && !createdData.isEmpty() ) {\r
                 for ( DataObject dataObject : createdData.values() ) {\r
                     if ( dataObject instanceof UserVnPnMapping ) {\r
-                        LOG.info("Ready to update flow table.");\r
+                        LOG.debug("Ready to update flow table.");\r
                         UserVnPnMapping userVnPnMapping = (UserVnPnMapping)dataObject;\r
                         UserId userId = userVnPnMapping.getUserId();\r
 \r
@@ -214,7 +216,7 @@ public class FlowTableManager implements AutoCloseable {
                         flowUtils.init(physicalNodeList);\r
 \r
                         flowUtils.updateFlowTable(user, virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
-                        LOG.info("Already call flowUtils.updateFlowTable().");\r
+                        LOG.debug("Already call flowUtils.updateFlowTable().");\r
                     }\r
                 }\r
             }\r
index e5d3254a4ae88b513cb91143c54fcc55b7eb21fb..275a0e142cff1f8a7feb13408aed76dd1b202390 100644 (file)
@@ -8,11 +8,19 @@
 \r
 package org.opendaylight.nemo.renderer.openflow;\r
 \r
+import org.apache.commons.lang3.tuple.ImmutableTriple;\r
+import org.opendaylight.controller.liblldp.Ethernet;\r
+import org.opendaylight.controller.liblldp.HexEncode;\r
+import org.opendaylight.controller.liblldp.NetUtils;\r
+import org.opendaylight.controller.liblldp.PacketException;\r
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;\r
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
+import org.opendaylight.nemo.renderer.openflow.physicalnetwork.PhyConfigLoader;\r
+import org.opendaylight.nemo.renderer.openflow.utils.ARP;\r
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;\r
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;\r
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;\r
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.*;\r
@@ -76,6 +84,10 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.*;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketReceived;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInputBuilder;\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
@@ -86,7 +98,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.PhysicalPort;\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.virtual.network.virtual.arps.VirtualArp;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.arps.VirtualArpKey;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.arps.VirtualArpBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.links.VirtualLink;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.nodes.VirtualNode;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.paths.VirtualPath;\r
@@ -98,11 +110,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.m
 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.IntentId;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.MatchItemName;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.PropertyName;\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.engine.common.rev151010.*;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.operations.Operation;\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.flow.instance.MatchItem;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.node.instance.Property;\r
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
@@ -127,6 +141,7 @@ public class FlowUtils implements AutoCloseable {
     private static final int ETH_TYPE_ARP = 0x0806;\r
 \r
     private final DataBroker dataBroker;\r
+    private final PacketProcessingService packetProcessingService;\r
 \r
     private Map<PhysicalNodeId, MplsLabelGenerator> mplsGenerators;\r
     private Map<PhysicalNodeId, MeterIdGenerator> meterIdGenerators;\r
@@ -135,22 +150,27 @@ public class FlowUtils implements AutoCloseable {
        private Map<UserId, Long> metadatas;\r
     private long currentMetadata = 0;\r
 \r
+    private Map<UserId, User> users;\r
+    private Map<UserId, UserIntentVnMapping> userIntentVnMappings;\r
+    private Map<UserId, UserVnPnMapping> userVnPnMappings;\r
+\r
     private PhysicalNetworkHelper physicalNetworkHelper;\r
-    private VirtualNetworkHelper virtualNetworkHelper;\r
+    private Map<VirtualNetworkId, VirtualNetworkHelper> virtualNetworkHelpers;\r
+    private ArpHandlerHelper arpHandlerHelper;\r
 \r
-    //liushixing\r
+    // liushixing\r
     private Map<UserId, List<InstanceIdentifier<Flow>>> flowIdsOfUsers;\r
     private Map<UserId, List<InstanceIdentifier<Meter>>> meterIdIdsOfUsers;\r
-//    private List<PhysicalPortId> assignedPortForInPort;\r
-    private ResourceManager resourceManager;\r
-       \r
-    private Map<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.NodeId, MacAddress> gatewayMacAddress;\r
+    private PhyConfigLoader phyConfigLoader;\r
 \r
-    public FlowUtils(DataBroker dataBroker, ResourceManager resourceManager) {\r
+    public FlowUtils(DataBroker dataBroker,\r
+                     PacketProcessingService packetProcessingService,\r
+                     PhyConfigLoader phyConfigLoader) {\r
         super();\r
 \r
         this.dataBroker = dataBroker;\r
-        this.resourceManager = resourceManager;\r
+        this.packetProcessingService = packetProcessingService;\r
+        this.phyConfigLoader = phyConfigLoader;\r
 \r
         mplsGenerators = new HashMap<PhysicalNodeId, MplsLabelGenerator>();\r
         meterIdGenerators = new HashMap<PhysicalNodeId, MeterIdGenerator>();\r
@@ -158,18 +178,18 @@ public class FlowUtils implements AutoCloseable {
         meterIdsOfPhysicalPaths = new HashMap<PhysicalPathId, Long>();\r
         metadatas = new HashMap<UserId, Long>();\r
 \r
-        //liushixing\r
+        users = new HashMap<UserId, User>();\r
+        userIntentVnMappings = new HashMap<UserId, UserIntentVnMapping>();\r
+        userVnPnMappings = new HashMap<UserId, UserVnPnMapping>();\r
+\r
+        virtualNetworkHelpers = new HashMap<VirtualNetworkId, VirtualNetworkHelper>();\r
+        arpHandlerHelper = new ArpHandlerHelper();\r
+\r
+        // liushixing\r
         flowIdsOfUsers = new HashMap<UserId, List<InstanceIdentifier<Flow>>>();\r
         meterIdIdsOfUsers = new HashMap<UserId, List<InstanceIdentifier<Meter>>>();\r
-//        assignedPortForInPort = new ArrayList<PhysicalPortId>();\r
-\r
-        gatewayMacAddress = new HashMap<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.NodeId, MacAddress>();\r
-        // Gateway of the DMZ group.\r
-        gatewayMacAddress.put(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.NodeId("b46cfa7f-93a3-43f4-ac20-09307c75feca"),\r
-                new MacAddress("00:00:0a:0b:0c:01"));\r
-        // Gateway of the interior group.\r
-        gatewayMacAddress.put(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.NodeId("175425f7-c9c9-474a-962c-70cb6c180d4d"),\r
-                new MacAddress("00:00:0a:0b:0c:02"));\r
+\r
+        return;\r
     }\r
 \r
        public void init(List<PhysicalNode> physicalNodes) {\r
@@ -191,9 +211,7 @@ public class FlowUtils implements AutoCloseable {
     private InstanceIdentifier<Flow> generateFlowInsId(UserId userId,\r
                                                        NodeId nodeId,\r
                                                        Short tableId,\r
-                                                       FlowId flowId){\r
-\r
-\r
+                                                       FlowId flowId) {\r
         InstanceIdentifier<Flow> flowInsId = createFlowPath(nodeId, tableId, flowId);\r
 \r
         if(flowIdsOfUsers.containsKey(userId) == false){\r
@@ -204,7 +222,7 @@ public class FlowUtils implements AutoCloseable {
             List<InstanceIdentifier<Flow>> flowInsIds = flowIdsOfUsers.get(userId);\r
             flowInsIds.add(flowInsId);\r
         }\r
-        LOG.info("nemo:generateFlowInsId");\r
+        LOG.debug("nemo:generateFlowInsId");\r
         return  flowInsId;\r
     }\r
 \r
@@ -232,28 +250,48 @@ public class FlowUtils implements AutoCloseable {
             List<InstanceIdentifier<Meter>> meterInsIds = meterIdIdsOfUsers.get(userId);\r
             meterInsIds.add(meterInsId);\r
         }\r
-        LOG.info("nemo:getMeterInsId");\r
+        LOG.debug("nemo:getMeterInsId");\r
         return  meterInsId;\r
     }\r
 \r
-    public void updateFlowTable(User user,\r
-                                VirtualNetwork virtualNetwork,\r
-                                UserIntentVnMapping userIntentVnMapping,\r
-                                UserVnPnMapping userVnPnMapping,\r
-                                PhysicalNetwork physicalNetwork) {\r
-               //If new user, generate metadata;\r
+    /**\r
+     * TODO\r
+     *\r
+     * @author Zhigang Ji\r
+     * @param user TODO\r
+     * @param virtualNetwork TODO\r
+     * @param userIntentVnMapping TODO\r
+     * @param userVnPnMapping TODO\r
+     * @param physicalNetwork TODO\r
+     */\r
+    protected void updateFlowTable(User user,\r
+                                   VirtualNetwork virtualNetwork,\r
+                                   UserIntentVnMapping userIntentVnMapping,\r
+                                   UserVnPnMapping userVnPnMapping,\r
+                                   PhysicalNetwork physicalNetwork) {\r
+               // If new user, generate metadata;\r
         if ( !metadatas.containsKey(user.getUserId()) ) {\r
             metadatas.put(user.getUserId(), ++currentMetadata);\r
         }\r
 \r
+        users.put(user.getUserId(), user);\r
+        userIntentVnMappings.put(user.getUserId(), userIntentVnMapping);\r
+        userVnPnMappings.put(user.getUserId(), userVnPnMapping);\r
+\r
         physicalNetworkHelper = new PhysicalNetworkHelper(physicalNetwork);\r
-        virtualNetworkHelper = new VirtualNetworkHelper(virtualNetwork);\r
+        virtualNetworkHelpers.put(virtualNetwork.getNetworkId(), new VirtualNetworkHelper(virtualNetwork));\r
+        arpHandlerHelper.update(userVnPnMapping);\r
+\r
+        flowIdsOfUsers.put(user.getUserId(), new LinkedList<InstanceIdentifier<Flow>>());\r
+        meterIdIdsOfUsers.put(user.getUserId(), new LinkedList<InstanceIdentifier<Meter>>());\r
 \r
                updateInPortTable(user, virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
         updateMeterTable(user, virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
                updateMplsTable(user, virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
                updateIpTable(user, virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
                updateArpTable(user, virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
+\r
+        return;\r
     }\r
 \r
     /**\r
@@ -262,12 +300,259 @@ public class FlowUtils implements AutoCloseable {
      * @author Zhigang Ji\r
      * @param userId TODO\r
      */\r
-    public void deleteFlowEntries(UserId userId) {\r
+    protected void deleteFlowEntries(UserId userId) {\r
         deleteFlowTableEntries(userId);\r
         deleteMeterTableEntries(userId);\r
 \r
-        flowIdsOfUsers.put(userId, new LinkedList<InstanceIdentifier<Flow>>());\r
-        meterIdIdsOfUsers.put(userId, new LinkedList<InstanceIdentifier<Meter>>());\r
+        users.remove(userId);\r
+        userIntentVnMappings.remove(userId);\r
+        userVnPnMappings.remove(userId);\r
+\r
+        virtualNetworkHelpers.remove(new VirtualNetworkId(userId.getValue()));\r
+\r
+        flowIdsOfUsers.remove(userId);\r
+        meterIdIdsOfUsers.remove(userId);\r
+\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @author Zhigang Ji\r
+     * @param packetReceived TODO\r
+     * @param ingress TODO\r
+     */\r
+    public void handleArp(PacketReceived packetReceived, NodeConnectorRef ingress) {\r
+        byte[] payload = packetReceived.getPayload();\r
+        Ethernet ethernet = new Ethernet();\r
+\r
+        try {\r
+            ethernet.deserialize(payload, 0, NetUtils.NumBitsInAByte * payload.length);\r
+        } catch ( PacketException exception ) {\r
+            LOG.error("Failed to decode the received packet to ethernet packet.");\r
+\r
+            return;\r
+        }\r
+\r
+        ARP arp = new ARP();\r
+\r
+        try {\r
+            arp.deserialize(ethernet.getRawPayload(),\r
+                    0, NetUtils.NumBitsInAByte * ethernet.getRawPayload().length);\r
+        } catch ( PacketException exception ) {\r
+            LOG.error("Failed to decode the raw payload of ethernet packet to arp packet.");\r
+\r
+            return;\r
+        }\r
+\r
+        ImmutableTriple<VirtualNetworkId, VirtualNodeId, VirtualPortId> mappingValueForExternalPhysicalPort =\r
+                arpHandlerHelper.getMappingValueForExternalPhysicalPort(ingress);\r
+        VirtualNetworkId virtualNetworkId = mappingValueForExternalPhysicalPort.getLeft();\r
+        VirtualNodeId ingressVirtualNodeId = mappingValueForExternalPhysicalPort.getMiddle();\r
+        VirtualPortId ingressVirtualPortId = mappingValueForExternalPhysicalPort.getRight();\r
+\r
+        IpAddress srcIpAddress = convertByteArray4ToIpAddress(arp.getSenderProtocolAddress());\r
+        IpAddress dstIpAddress = convertByteArray4ToIpAddress(arp.getTargetProtocolAddress());\r
+\r
+        VirtualNetworkHelper virtualNetworkHelper = virtualNetworkHelpers.get(virtualNetworkId);\r
+        VirtualNode ingressVirtualNode = virtualNetworkHelper.getVirtualNode(ingressVirtualNodeId);\r
+        VirtualArp virtualArp;\r
+\r
+        switch ( ingressVirtualNode.getNodeType() ) {\r
+            case Vswitch:\r
+                virtualArp = virtualNetworkHelper.getVirtualArp(srcIpAddress);\r
+\r
+                if ( null == virtualArp ) {\r
+                    virtualArp = new VirtualArpBuilder()\r
+                            .setIpAddress(srcIpAddress)\r
+                            .setMacAddress(convertByteArray6ToMacAddress(arp.getSenderHardwareAddress()))\r
+                            .setNodeId(ingressVirtualNodeId)\r
+                            .setPortId(ingressVirtualPortId)\r
+                            .build();\r
+                    virtualNetworkHelper.addVirtualArp(virtualArp);\r
+\r
+                    UserId userId = new UserId(virtualNetworkId.getValue());\r
+                    Map<VirtualNodeId, Map.Entry<VirtualPort, VirtualLink>> connectedVirtualRouters =\r
+                            virtualNetworkHelper.getConnectedVirtualRouters(ingressVirtualNodeId);\r
+\r
+                    if ( null != connectedVirtualRouters && !connectedVirtualRouters.isEmpty() ) {\r
+                        VirtualLink virtualLink = virtualNetworkHelper.getVirtualLink(\r
+                                connectedVirtualRouters.keySet().iterator().next(), ingressVirtualNodeId);\r
+                        VnPnMappingResult vnPnMappingResult = getVnPnMappingResult(\r
+                                userVnPnMappings.get(userId).getVnPnMappingResult(),\r
+                                new VirtualResourceEntityId(virtualLink.getLinkId().getValue()));\r
+                        PhysicalPathId physicalPathId = new PhysicalPathId(\r
+                                vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+                        PhysicalPath physicalPath = physicalNetworkHelper.getPhysicalPath(physicalPathId);\r
+\r
+                        configArpTableEntry(userId, virtualArp, physicalPath);\r
+                    }\r
+\r
+                    PhysicalNodeId ingressPhysicalNodeId = convertNodeConnectorRefToPhysicalNodeId(ingress);\r
+                    PhysicalPortId ingressPhysicalPortId = convertNodeConnectorRefToPhysicalPortId(ingress);\r
+\r
+                    configMacTableEntry(userId, virtualArp.getMacAddress(),\r
+                            ingressPhysicalNodeId, ingressPhysicalPortId);\r
+\r
+                    Map<VirtualNodeId, Map.Entry<VirtualPort, VirtualLink>> connectedVirtualSwitches =\r
+                            virtualNetworkHelper.getConnectedVirtualSwitches(ingressVirtualNodeId);\r
+\r
+                    if ( null != connectedVirtualSwitches && !connectedVirtualSwitches.isEmpty() ) {\r
+                        List<VnPnMappingResult> vnPnMappingResults =\r
+                                userVnPnMappings.get(userId).getVnPnMappingResult();\r
+                        VirtualLink virtualLink;\r
+                        VnPnMappingResult vnPnMappingResult;\r
+                        PhysicalPathId physicalPathId;\r
+                        PhysicalPath physicalPath;\r
+\r
+                        for ( VirtualNodeId virtualNodeId : connectedVirtualSwitches.keySet() ) {\r
+                            virtualLink = virtualNetworkHelper.getVirtualLink(virtualNodeId, ingressVirtualNodeId);\r
+                            vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+                                    new VirtualResourceEntityId(virtualLink.getLinkId().getValue()));\r
+                            physicalPathId = new PhysicalPathId(\r
+                                    vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+                            physicalPath = physicalNetworkHelper.getPhysicalPath(physicalPathId);\r
+\r
+                            configMacTableEntry(userId, virtualArp.getMacAddress(), physicalPath);\r
+                        }\r
+                    }\r
+                }\r
+\r
+                if ( ARP.REQUEST == arp.getOpCode() ) {\r
+                    IpAddress gatewayIpAddress = getGatewayIpAddress(virtualNetworkId, ingressVirtualNode);\r
+\r
+                    if ( dstIpAddress.equals(gatewayIpAddress) ) {\r
+                        MacAddress gatewayMacAddress = getGatewayMacAddress(virtualNetworkId, ingressVirtualNode);\r
+                        byte[] targetProtocolAddress = arp.getTargetProtocolAddress();\r
+\r
+                        arp.setTargetHardwareAddress(arp.getSenderHardwareAddress());\r
+                        arp.setTargetProtocolAddress(arp.getSenderProtocolAddress());\r
+                        arp.setSenderHardwareAddress(convertMacAddressToByteArray6(gatewayMacAddress));\r
+                        arp.setSenderProtocolAddress(targetProtocolAddress);\r
+                        arp.setOpCode(ARP.REPLY);\r
+\r
+                        ethernet.setSourceMACAddress(arp.getSenderHardwareAddress());\r
+                        ethernet.setDestinationMACAddress(arp.getTargetHardwareAddress());\r
+\r
+                        sendPacketOut(createArpPacket(ethernet, arp), ingress, ingress);\r
+                        break;\r
+                    }\r
+\r
+                    virtualArp = virtualNetworkHelper.getVirtualArp(dstIpAddress);\r
+\r
+                    if ( null != virtualArp ) {\r
+                        byte[] targetProtocolAddress = arp.getTargetProtocolAddress();\r
+\r
+                        arp.setTargetHardwareAddress(arp.getSenderHardwareAddress());\r
+                        arp.setTargetProtocolAddress(arp.getSenderProtocolAddress());\r
+                        arp.setSenderHardwareAddress(convertMacAddressToByteArray6(virtualArp.getMacAddress()));\r
+                        arp.setSenderProtocolAddress(targetProtocolAddress);\r
+                        arp.setOpCode(ARP.REPLY);\r
+\r
+                        ethernet.setSourceMACAddress(arp.getSenderHardwareAddress());\r
+                        ethernet.setDestinationMACAddress(arp.getTargetHardwareAddress());\r
+\r
+                        sendPacketOut(createArpPacket(ethernet, arp), ingress, ingress);\r
+                        break;\r
+                    }\r
+\r
+                    Map<VirtualNodeId, Map.Entry<VirtualPort, VirtualLink>> connectedVirtualSwitches =\r
+                            virtualNetworkHelper.getConnectedVirtualSwitches(ingressVirtualNodeId);\r
+\r
+                    if ( null != connectedVirtualSwitches && !connectedVirtualSwitches.isEmpty() ) {\r
+                        UserId userId = new UserId(virtualNetworkId.getValue());\r
+                        UserVnPnMapping userVnPnMapping = userVnPnMappings.get(userId);\r
+                        List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();\r
+                        VirtualPort layer2ExternalVirtualPort;\r
+                        VnPnMappingResult vnPnMappingResult;\r
+                        PhysicalNodeId physicalNodeId;\r
+                        PhysicalPortId physicalPortId;\r
+\r
+                        for ( VirtualNodeId virtualNodeId : connectedVirtualSwitches.keySet() ) {\r
+                            layer2ExternalVirtualPort =\r
+                                    virtualNetworkHelper.getLayer2ExternalVirtualPort(virtualNodeId);\r
+\r
+                            if ( null != layer2ExternalVirtualPort ) {\r
+                                vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+                                        new VirtualResourceEntityId(layer2ExternalVirtualPort.getPortId().getValue()));\r
+                                physicalNodeId = new PhysicalNodeId(\r
+                                        vnPnMappingResult.getParentPhysicalResourceEntityId().getValue());\r
+                                physicalPortId = new PhysicalPortId(\r
+                                        vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+\r
+                                sendPacketOut(payload, ingress, createNodeConnectorRef(physicalNodeId, physicalPortId));\r
+                            }\r
+                        }\r
+                    }\r
+                } else {\r
+                    virtualArp = virtualNetworkHelper.getVirtualArp(dstIpAddress);\r
+\r
+                    if ( null != virtualArp ) {\r
+                        UserId userId = new UserId(virtualNetworkId.getValue());\r
+                        UserVnPnMapping userVnPnMapping = userVnPnMappings.get(userId);\r
+                        List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();\r
+                        VnPnMappingResult vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+                                new VirtualResourceEntityId(virtualArp.getPortId().getValue()));\r
+\r
+                        PhysicalNodeId physicalNodeId = new PhysicalNodeId(\r
+                                vnPnMappingResult.getParentPhysicalResourceEntityId().getValue());\r
+                        PhysicalPortId physicalPortId = new PhysicalPortId(\r
+                                vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+\r
+                        sendPacketOut(payload, ingress, createNodeConnectorRef(physicalNodeId, physicalPortId));\r
+                    }\r
+                }\r
+                break;\r
+\r
+            case Vrouter:\r
+                VirtualPort ingressVirtualPort = virtualNetworkHelper\r
+                        .getVirtualPort(ingressVirtualNodeId, ingressVirtualPortId);\r
+\r
+                if ( virtualNetworkHelper.isLayer2ExternalVirtualPort(ingressVirtualPort) ) {\r
+                    virtualArp = virtualNetworkHelper.getVirtualArp(srcIpAddress);\r
+\r
+                    if ( null == virtualArp ) {\r
+                        virtualArp = new VirtualArpBuilder()\r
+                                .setIpAddress(srcIpAddress)\r
+                                .setMacAddress(convertByteArray6ToMacAddress(arp.getSenderHardwareAddress()))\r
+                                .setNodeId(ingressVirtualNodeId)\r
+                                .setPortId(ingressVirtualPortId)\r
+                                .build();\r
+                        virtualNetworkHelper.addVirtualArp(virtualArp);\r
+\r
+                        UserId userId = new UserId(virtualNetworkId.getValue());\r
+                        PhysicalNodeId ingressPhysicalNodeId = convertNodeConnectorRefToPhysicalNodeId(ingress);\r
+                        PhysicalPortId ingressPhysicalPortId = convertNodeConnectorRefToPhysicalPortId(ingress);\r
+\r
+                        configArpTableEntry(userId, virtualArp, ingressPhysicalNodeId, ingressPhysicalPortId);\r
+                    }\r
+\r
+                    if ( ARP.REQUEST == arp.getOpCode() ) {\r
+                        IpAddress gatewayIpAddress = getGatewayIpAddress(virtualNetworkId, ingressVirtualNode);\r
+\r
+                        if ( dstIpAddress.equals(gatewayIpAddress) ) {\r
+                            MacAddress gatewayMacAddress = getGatewayMacAddress(virtualNetworkId, ingressVirtualNode);\r
+                            byte[] targetProtocolAddress = arp.getTargetProtocolAddress();\r
+\r
+                            arp.setTargetHardwareAddress(arp.getSenderHardwareAddress());\r
+                            arp.setTargetProtocolAddress(arp.getSenderProtocolAddress());\r
+                            arp.setSenderHardwareAddress(convertMacAddressToByteArray6(gatewayMacAddress));\r
+                            arp.setSenderProtocolAddress(targetProtocolAddress);\r
+                            arp.setOpCode(ARP.REPLY);\r
+\r
+                            ethernet.setSourceMACAddress(arp.getSenderHardwareAddress());\r
+                            ethernet.setDestinationMACAddress(arp.getTargetHardwareAddress());\r
+\r
+                            sendPacketOut(createArpPacket(ethernet, arp), ingress, ingress);\r
+                        }\r
+                    }\r
+                }\r
+                break;\r
+\r
+            default:\r
+                break;\r
+        }\r
 \r
         return;\r
     }\r
@@ -311,7 +596,7 @@ public class FlowUtils implements AutoCloseable {
         writeTransaction.put(LogicalDatastoreType.CONFIGURATION, flowInsId, flow, true);\r
         writeTransaction.submit();\r
 \r
-        LOG.info("nemo:configInternalInPortFlowTable");\r
+        LOG.debug("nemo:configInternalInPortFlowTable");\r
         return;\r
     }\r
 \r
@@ -339,7 +624,7 @@ public class FlowUtils implements AutoCloseable {
         Instruction instructionMeta = new InstructionBuilder().setOrder(instructionList.size()).setInstruction(writeMetadataCase).build();\r
         instructionList.add(instructionMeta);\r
 \r
-        GoToTable gotoTable = new GoToTableBuilder().setTableId((destNodeType==VirtualNode.NodeType.Vswitch)? MAC_TABLE_ID : IP_TABLE_ID).build();\r
+        GoToTable gotoTable = new GoToTableBuilder().setTableId((destNodeType == VirtualNode.NodeType.Vswitch) ? MAC_TABLE_ID : IP_TABLE_ID).build();\r
         GoToTableCase gotoTableCase = new GoToTableCaseBuilder().setGoToTable(gotoTable).build();\r
         Instruction instructionGoto = new InstructionBuilder().setOrder(instructionList.size()).setInstruction(gotoTableCase).build();\r
         instructionList.add(instructionGoto);\r
@@ -358,7 +643,7 @@ public class FlowUtils implements AutoCloseable {
         writeTransaction.put(LogicalDatastoreType.CONFIGURATION, flowInsId, flow, true);\r
         writeTransaction.submit();\r
 \r
-        LOG.info("nemo:configExternalInPortFlowTable");\r
+        LOG.debug("nemo:configExternalInPortFlowTable");\r
 \r
         return;\r
     }\r
@@ -381,7 +666,7 @@ public class FlowUtils implements AutoCloseable {
         List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();\r
 \r
         for(VnPnMappingResult vnPnMappingResult:vnPnMappingResults){\r
-            LOG.info("nemo:inport  for(VnPnMappingResult vnPnMappingResult:vnPnMappingResults)");\r
+            LOG.debug("nemo:inport  for(VnPnMappingResult vnPnMappingResult:vnPnMappingResults)");\r
             if(VirtualResource.VirtualResourceType.Vport == vnPnMappingResult.getVirtualResourceType()) {\r
                 VirtualPortId virtualPortid = new VirtualPortId(vnPnMappingResult.getVirtualResourceEntityId().getValue());\r
                 VirtualNodeId virtualNodeId = new VirtualNodeId(vnPnMappingResult.getParentVirtualResourceEntityId().getValue());\r
@@ -447,10 +732,10 @@ public class FlowUtils implements AutoCloseable {
                                   UserVnPnMapping userVnPnMapping,\r
                                   PhysicalNetwork physicalNetwork) {\r
 \r
-        LOG.info("nemo:meter updateMeterTable()");\r
+        LOG.debug("nemo:meter updateMeterTable()");\r
         PhysicalPaths physicalPaths = physicalNetwork.getPhysicalPaths();\r
         if(null == physicalPaths.getPhysicalPath()){\r
-            LOG.info("PhysicalPath are null");\r
+            LOG.debug("PhysicalPath are null");\r
             return;\r
         }\r
 \r
@@ -462,41 +747,41 @@ public class FlowUtils implements AutoCloseable {
 \r
         for(PhysicalPath physicalPath:physicalPathList) {\r
             if(physicalPath.getBandwidth() > 0 ) {\r
-                LOG.info("nemo: meter physicalPath.getBandwidth() = {}", physicalPath.getBandwidth());\r
+                LOG.debug("nemo: meter physicalPath.getBandwidth() = {}", physicalPath.getBandwidth());\r
                 if(meterIdsOfPhysicalPaths.containsKey(physicalPath.getPathId())== false){\r
-                    LOG.info("nemo:meter meterIdsOfPhysicalPaths.containsKey(physicalPath.getPathId())== false");\r
+                    LOG.debug("nemo:meter meterIdsOfPhysicalPaths.containsKey(physicalPath.getPathId())== false");\r
                     org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.path.instance.PhysicalLink\r
                             physicalLinkInPath = physicalPath.getPhysicalLink().get(0);\r
 \r
-                    LOG.info("nemo:meter physicalLinkInPath"+physicalLinkInPath.getLinkId().getValue());\r
+                    LOG.debug("nemo:meter physicalLinkInPath" + physicalLinkInPath.getLinkId().getValue());\r
                     for (org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLink physicalLink : physicalLinksList) {\r
-                        LOG.info("nemo:meter physicalLink "+physicalLink.getLinkId().getValue());\r
+                        LOG.debug("nemo:meter physicalLink " + physicalLink.getLinkId().getValue());\r
                         if (physicalLinkInPath.getLinkId().getValue().equals(physicalLink.getLinkId().getValue())) {\r
 \r
-                            LOG.info("nemo:meter find plink for ppath.");\r
+                            LOG.debug("nemo:meter find plink for ppath.");\r
                             PhysicalNodeId physicalSrcNodeId = physicalLink.getSrcNodeId();\r
                             PhysicalPortId physicalSrcPortId = physicalLink.getSrcPortId();\r
 \r
-                            LOG.info("nemo:meter meterIdGenerators.size() = "+ meterIdGenerators.size());\r
-                            LOG.info("nemo:meter physicalSrcNodeId =" + physicalSrcNodeId.getValue());\r
+                            LOG.debug("nemo:meter meterIdGenerators.size() = " + meterIdGenerators.size());\r
+                            LOG.debug("nemo:meter physicalSrcNodeId =" + physicalSrcNodeId.getValue());\r
 \r
-                            LOG.info("nemo:meter Assign meter id");\r
+                            LOG.debug("nemo:meter Assign meter id");\r
                             Long meterId = (long)0;\r
                             if(meterIdGenerators.containsKey(physicalSrcNodeId) == false){\r
-                                LOG.info("meterIdGenerators.containsKey(physicalSrcNodeId) == false");\r
+                                LOG.debug("meterIdGenerators.containsKey(physicalSrcNodeId) == false");\r
                                 MeterIdGenerator meterIdGenerator = new MeterIdGenerator();\r
                                 meterIdGenerators.put(physicalSrcNodeId, meterIdGenerator);\r
                                 meterId = meterIdGenerators.get(physicalSrcNodeId).generateMeterId();\r
                                 meterIdsOfPhysicalPaths.put(physicalPath.getPathId(),meterId);\r
                             }\r
                             else{\r
-                                LOG.info("meterIdGenerators.containsKey(physicalSrcNodeId) == true");\r
+                                LOG.debug("meterIdGenerators.containsKey(physicalSrcNodeId) == true");\r
                                 meterId = meterIdGenerators.get(physicalSrcNodeId).generateMeterId();\r
                                 meterIdsOfPhysicalPaths.put(physicalPath.getPathId(),meterId);\r
                             }\r
 \r
                             //Generate meter flow entries\r
-                            LOG.info("nemo:meter Generate meter flow entries");\r
+                            LOG.debug("nemo:meter Generate meter flow entries");\r
                             NodeKey nodeKey = new NodeKey(new NodeId(physicalSrcNodeId.getValue()));\r
                             MeterKey meterKey = new MeterKey(new MeterId(meterId));\r
 \r
@@ -555,7 +840,7 @@ public class FlowUtils implements AutoCloseable {
                             WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();\r
                             writeTransaction.put(LogicalDatastoreType.CONFIGURATION, meterInsId, meter);\r
                             writeTransaction.submit();\r
-                            LOG.info("nemo:meter writeTransaction.submit();");\r
+                            LOG.debug("nemo:meter writeTransaction.submit();");\r
                             break;\r
                         }\r
                     }\r
@@ -574,17 +859,17 @@ public class FlowUtils implements AutoCloseable {
     public void assignMPLSLabelForPPath(PhysicalPath physicalPath,\r
                   List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLink> physicalLinksList){\r
 \r
-        LOG.info("nemo: for(1)");\r
+        LOG.debug("nemo: for(1)");\r
         List<Integer> mplsLabels = new ArrayList<Integer>();\r
         List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.path.instance.PhysicalLink>\r
                 physicalLinksInPath = physicalPath.getPhysicalLink();\r
 \r
         for (org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.path.instance.PhysicalLink physicalLinkinPath : physicalLinksInPath) {\r
-            LOG.info("nemo: for(2)");\r
+            LOG.debug("nemo: for(2)");\r
             for (org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLink physicalLink : physicalLinksList) {\r
-                LOG.info("nemo: for(3)");\r
+                LOG.debug("nemo: for(3)");\r
                 if (physicalLinkinPath.getLinkId().getValue().equals(physicalLink.getLinkId().getValue())) {\r
-                    LOG.info("nemo: physicalLinkinPath.getLinkId() == physicalLink.getLinkId()");\r
+                    LOG.debug("nemo: physicalLinkinPath.getLinkId() == physicalLink.getLinkId()");\r
                     PhysicalNodeId physicalDestNodeId = physicalLink.getDestNodeId();\r
                     if(mplsGenerators.containsKey(physicalDestNodeId) == true){\r
 \r
@@ -618,16 +903,15 @@ public class FlowUtils implements AutoCloseable {
                                  UserIntentVnMapping userIntentVnMapping,\r
                                  UserVnPnMapping userVnPnMapping,\r
                                  PhysicalNetwork physicalNetwork) {\r
-\r
-        LOG.info("nemo:mpls: updateMplsTable()");\r
+        LOG.debug("nemo:mpls: updateMplsTable()");\r
         PhysicalPaths physicalPaths = physicalNetwork.getPhysicalPaths();\r
 \r
         if(null == physicalPaths.getPhysicalPath()){\r
-            LOG.info("PhysicalPaths are null");\r
+            LOG.debug("PhysicalPaths are null");\r
             return;\r
         }\r
 \r
-        List<PhysicalPath> physicalPathList = physicalPaths.getPhysicalPath();\r
+        VirtualNetworkHelper virtualNetworkHelper = virtualNetworkHelpers.get(virtualNetwork.getNetworkId());\r
 \r
         PhysicalLinks physicalLinks = physicalNetwork.getPhysicalLinks();\r
         List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLink>\r
@@ -672,11 +956,11 @@ public class FlowUtils implements AutoCloseable {
                             PhysicalPortId physicalSrcPortId = physicalLink.getSrcPortId();\r
 \r
                             if (0 == counter++) {\r
-                                LOG.info("nemo:mpls:0 == counter");\r
+                                LOG.debug("nemo:mpls:0 == counter");\r
                                 mplsLabelIter = mplsLabelsOfPhysicalPaths.get(physicalPath.getPathId()).iterator();\r
                                 inMPLSLabel = mplsLabelIter.next();\r
                             } else {\r
-                                LOG.info("nemo:mpls:counter="+counter);\r
+                                LOG.debug("nemo:mpls:counter=" + counter);\r
                                 WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();\r
                                 List<Instruction> instructionList = new LinkedList<Instruction>();\r
                                 List<Action> actionList = new LinkedList<Action>();\r
@@ -716,7 +1000,7 @@ public class FlowUtils implements AutoCloseable {
                                 FlowBuilder flowBuilder = baseFlowBuilder().setId(flowId).setTableId(MPLS_LABEL_TABLE_ID).setPriority(DEFAULT_FLOW_PRIORITY);\r
                                 Flow flow = flowBuilder.setMatch(match).setInstructions(instructions).build();\r
 \r
-                                LOG.info("nemo:mpls"+physicalSrcNodeId.getValue());\r
+                                LOG.debug("nemo:mpls" + physicalSrcNodeId.getValue());\r
 \r
                                 NodeId nodeId = new NodeId(physicalSrcNodeId.getValue());\r
 \r
@@ -729,7 +1013,7 @@ public class FlowUtils implements AutoCloseable {
                             }\r
                             //The last hop\r
                             if (physicalPath.getPhysicalLink().size() == counter) {\r
-                                LOG.info("nemo:mpls: last hop");\r
+                                LOG.debug("nemo:mpls: last hop");\r
                                 WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();\r
                                 List<Instruction> instructionList = new LinkedList<Instruction>();\r
                                 List<Action> actionList = new LinkedList<Action>();\r
@@ -768,7 +1052,7 @@ public class FlowUtils implements AutoCloseable {
                                 FlowBuilder flowBuilder = baseFlowBuilder().setId(flowId).setTableId(MPLS_LABEL_TABLE_ID).setPriority(DEFAULT_FLOW_PRIORITY);\r
                                 Flow flow = flowBuilder.setMatch(match).setInstructions(instructions).build();\r
 \r
-                                LOG.info("nemo:mpls:"+physicalDestNodeId.getValue());\r
+                                LOG.debug("nemo:mpls:" + physicalDestNodeId.getValue());\r
                                 NodeId nodeId = new NodeId(physicalDestNodeId.getValue());\r
                                 InstanceIdentifier<Flow> flowInsId = generateFlowInsId(user.getUserId(), nodeId, flow.getTableId(), flow.getId());\r
 \r
@@ -797,6 +1081,7 @@ public class FlowUtils implements AutoCloseable {
                                UserIntentVnMapping userIntentVnMapping,\r
                                UserVnPnMapping userVnPnMapping,\r
                                PhysicalNetwork physicalNetwork) {\r
+        VirtualNetworkHelper virtualNetworkHelper = virtualNetworkHelpers.get(virtualNetwork.getNetworkId());\r
         List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();\r
         Map<VirtualNodeId, VirtualNode> virtualRouters = virtualNetworkHelper.getVirtualRouters();\r
         Map<VirtualNodeId, Map.Entry<VirtualPort, VirtualLink>> connectedVirtualSwitches;\r
@@ -883,9 +1168,8 @@ public class FlowUtils implements AutoCloseable {
             if ( null != connectedVirtualSwitches ) {\r
                 virtualPort = connectedVirtualSwitches.values().iterator().next().getKey();\r
                 ipPrefix = virtualPort.getExternalIpPrefixes().getExternalIpPrefix().get(0);\r
-                gatewayMacAddress = getGateWayMacAddress(userIntentVnMapping, virtualNodeId);\r
 \r
-                configIpTableEntry(user.getUserId(), ipPrefix, gatewayMacAddress, physicalNodeId);\r
+                configIpTableEntry(user.getUserId(), ipPrefix, physicalNodeId);\r
 \r
                 for ( Map.Entry<VirtualNodeId, Map.Entry<VirtualPort, VirtualLink>> entry\r
                         : connectedVirtualSwitches.entrySet() ) {\r
@@ -900,6 +1184,9 @@ public class FlowUtils implements AutoCloseable {
                             .getConnectedVirtualRouters(entry.getKey());\r
 \r
                     if ( null != connectedVirtualRouters1 ) {\r
+                        gatewayMacAddress = getGatewayMacAddress(virtualNetwork.getNetworkId(),\r
+                                virtualNetworkHelper.getVirtualNode(entry.getKey()));\r
+\r
                         virtualLink1 = connectedVirtualRouters1.values().iterator().next().getValue();\r
                         vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
                                 new VirtualResourceEntityId(virtualLink1.getLinkId().getValue()));\r
@@ -949,7 +1236,6 @@ public class FlowUtils implements AutoCloseable {
                                 vnPnMappingResult.getParentPhysicalResourceEntityId().getValue());\r
                         physicalPortId = new PhysicalPortId(\r
                                 vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
-                        physicalPort = physicalNetworkHelper.getPhysicalPort(physicalNodeId1, physicalPortId);\r
 \r
                         macAddresses = layer2ExternalVirtualPort1\r
                                 .getExternalMacAddresses().getExternalMacAddress();\r
@@ -958,7 +1244,7 @@ public class FlowUtils implements AutoCloseable {
                             virtualArp = virtualNetworkHelper.getVirtualArp(macAddress);\r
 \r
                             configArpTableEntry(user.getUserId(), virtualArp, physicalPath);\r
-                            configMacTableEntry(user.getUserId(), macAddress, physicalNodeId1, physicalPort);\r
+                            configMacTableEntry(user.getUserId(), macAddress, physicalNodeId1, physicalPortId);\r
                         }\r
                     }\r
                 }\r
@@ -988,8 +1274,8 @@ public class FlowUtils implements AutoCloseable {
 \r
         updateIpTableForOperations(user, virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
 \r
-        // for testing - jizhigang\r
         // log format: vnode(nodetype) --> vnode(nodetype): vlink; ppath; plinks; mplslabels; meterid;\r
+        StringBuilder stringBuilder = new StringBuilder();\r
         Set<VirtualLinkId> printedVirtualLinks = new HashSet<VirtualLinkId>();\r
         VirtualNode srcVirtualNode;\r
         VirtualNode dstVirtualNode;\r
@@ -1002,11 +1288,24 @@ public class FlowUtils implements AutoCloseable {
                 vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults, new VirtualResourceEntityId(virtualLink2.getLinkId().getValue()));\r
                 physicalPath2 = physicalNetworkHelper.getPhysicalPath(new PhysicalPathId(vnPnMappingResult.getPhysicalResourceEntityId().getValue()));\r
 \r
-                System.out.println(srcVirtualNode.getNodeId().getValue() + "(" + srcVirtualNode.getNodeType() + ") --> " +\r
-                        dstVirtualNode.getNodeId().getValue() + "(" + dstVirtualNode.getNodeType() + "): " + virtualLink2.getLinkId().getValue() + "; " +\r
-                        physicalPath2.getPathId().getValue() + "; " + physicalPath2.getPhysicalLink() + "; " +\r
-                        mplsLabelsOfPhysicalPaths.get(physicalPath2.getPathId()) + "; " +\r
-                        meterIdsOfPhysicalPaths.get(physicalPath2.getPathId()) + ";");\r
+                stringBuilder.append(srcVirtualNode.getNodeId().getValue());\r
+                stringBuilder.append("(");\r
+                stringBuilder.append(srcVirtualNode.getNodeType());\r
+                stringBuilder.append(") --> ");\r
+                stringBuilder.append(dstVirtualNode.getNodeId().getValue());\r
+                stringBuilder.append("(");\r
+                stringBuilder.append(dstVirtualNode.getNodeType());\r
+                stringBuilder.append("): ");\r
+                stringBuilder.append(virtualLink2.getLinkId().getValue());\r
+                stringBuilder.append("; ");\r
+                stringBuilder.append(physicalPath2.getPathId().getValue());\r
+                stringBuilder.append("; ");\r
+                stringBuilder.append(physicalPath2.getPhysicalLink());\r
+                stringBuilder.append("; ");\r
+                stringBuilder.append(mplsLabelsOfPhysicalPaths.get(physicalPath2.getPathId()));\r
+                stringBuilder.append("; ");\r
+                stringBuilder.append(meterIdsOfPhysicalPaths.get(physicalPath2.getPathId()));\r
+                stringBuilder.append(";\n");\r
 \r
                 for ( VirtualLink virtualLink3 : virtualNetwork.getVirtualLinks().getVirtualLink() ) {\r
                     if ( virtualLink3.getSrcNodeId().equals(dstVirtualNode.getNodeId())\r
@@ -1014,11 +1313,24 @@ public class FlowUtils implements AutoCloseable {
                         vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults, new VirtualResourceEntityId(virtualLink3.getLinkId().getValue()));\r
                         physicalPath2 = physicalNetworkHelper.getPhysicalPath(new PhysicalPathId(vnPnMappingResult.getPhysicalResourceEntityId().getValue()));\r
 \r
-                        System.out.println(dstVirtualNode.getNodeId().getValue() + "(" + dstVirtualNode.getNodeType() + ") --> " +\r
-                                srcVirtualNode.getNodeId().getValue() + "(" + srcVirtualNode.getNodeType() + "): " + virtualLink3.getLinkId().getValue() + "; " +\r
-                                physicalPath2.getPathId().getValue() + "; " + physicalPath2.getPhysicalLink() + "; " +\r
-                                mplsLabelsOfPhysicalPaths.get(physicalPath2.getPathId()) + "; " +\r
-                                meterIdsOfPhysicalPaths.get(physicalPath2.getPathId()) + ";");\r
+                        stringBuilder.append(dstVirtualNode.getNodeId().getValue());\r
+                        stringBuilder.append("(");\r
+                        stringBuilder.append(dstVirtualNode.getNodeType());\r
+                        stringBuilder.append(") --> ");\r
+                        stringBuilder.append(srcVirtualNode.getNodeId().getValue());\r
+                        stringBuilder.append("(");\r
+                        stringBuilder.append(srcVirtualNode.getNodeType());\r
+                        stringBuilder.append("): ");\r
+                        stringBuilder.append(virtualLink3.getLinkId().getValue());\r
+                        stringBuilder.append("; ");\r
+                        stringBuilder.append(physicalPath2.getPathId().getValue());\r
+                        stringBuilder.append("; ");\r
+                        stringBuilder.append(physicalPath2.getPhysicalLink());\r
+                        stringBuilder.append("; ");\r
+                        stringBuilder.append(mplsLabelsOfPhysicalPaths.get(physicalPath2.getPathId()));\r
+                        stringBuilder.append("; ");\r
+                        stringBuilder.append(meterIdsOfPhysicalPaths.get(physicalPath2.getPathId()));\r
+                        stringBuilder.append(";\n");\r
 \r
                         printedVirtualLinks.add(virtualLink3.getLinkId());\r
                     }\r
@@ -1027,7 +1339,8 @@ public class FlowUtils implements AutoCloseable {
                 printedVirtualLinks.add(virtualLink2.getLinkId());\r
             }\r
         }\r
-        // for testing - jizhigang\r
+\r
+        LOG.debug(stringBuilder.toString());\r
 \r
         return;\r
     }\r
@@ -1120,8 +1433,15 @@ public class FlowUtils implements AutoCloseable {
         org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow nemoFlow =\r
                 getFlow(nemoFlows, nemoFlowId);\r
 \r
-        long priority = 1 + operation.getPriority();\r
+        long priority;\r
 \r
+        if ( null == operation.getPriority() ) {\r
+            priority = 1;\r
+        } else {\r
+            priority = 1 + operation.getPriority();\r
+        }\r
+\r
+        VirtualNetworkHelper virtualNetworkHelper = virtualNetworkHelpers.get(virtualNetwork.getNetworkId());\r
         List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
         List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();\r
         IntentId intentId = new IntentId(operation.getOperationId().getValue());\r
@@ -1362,7 +1682,7 @@ public class FlowUtils implements AutoCloseable {
     /**\r
      * TODO\r
      *\r
-     * @author Zhigang Ji, Shixing Liu\r
+     * @author Zhigang Ji, Shixing Liu, Jie Hou\r
      * @param physicalNodeId TODO\r
      * @param physicalPortId TODO\r
      * @return TODO\r
@@ -1370,13 +1690,13 @@ public class FlowUtils implements AutoCloseable {
     private MacAddress getMacAddressOfConnectedExternalDevice(PhysicalNodeId physicalNodeId,\r
                                                               PhysicalPortId physicalPortId) {\r
         com.google.common.collect.Table<PhysicalNodeId, PhysicalPortId, MacAddress> externalNetworkMacTable =\r
-                this.resourceManager.getExternalNetworkMacTable();\r
+                this.phyConfigLoader.getExternalNetworkMac();\r
 \r
         MacAddress macAddress = externalNetworkMacTable.get(physicalNodeId, physicalPortId);\r
         if(macAddress == null){\r
-            LOG.info("nemo: cannot find external network device mac address");\r
+            LOG.debug("nemo: cannot find external network device mac address");\r
         }\r
-        LOG.info("nemo: external network device mac address");\r
+        LOG.debug("nemo: external network device mac address");\r
 \r
         return macAddress;\r
     }\r
@@ -1385,23 +1705,202 @@ public class FlowUtils implements AutoCloseable {
      * TODO\r
      *\r
      * @author Zhigang Ji\r
-     * @param userIntentVnMapping TODO\r
-     * @param virtualNodeId TODO\r
+     * @param virtualNetworkId TODO\r
+     * @param virtualNode TODO\r
      * @return TODO\r
      */\r
-    private MacAddress getGateWayMacAddress(UserIntentVnMapping userIntentVnMapping,\r
-                                            VirtualNodeId virtualNodeId) {\r
+    private IpAddress getGatewayIpAddress(VirtualNetworkId virtualNetworkId,\r
+                                          VirtualNode virtualNode) {\r
+        VirtualNetworkHelper virtualNetworkHelper = virtualNetworkHelpers.get(virtualNetworkId);\r
+        VirtualNodeId virtualNodeId = virtualNode.getNodeId();\r
+        VirtualNodeId virtualRouterId = null;\r
+\r
+        switch ( virtualNode.getNodeType() ) {\r
+            case Vswitch:\r
+                Map<VirtualNodeId, Map.Entry<VirtualPort, VirtualLink>> connectedVirtualRouters =\r
+                        virtualNetworkHelper.getConnectedVirtualRouters(virtualNodeId);\r
+\r
+                if ( null != connectedVirtualRouters && !connectedVirtualRouters.isEmpty() ) {\r
+                    virtualRouterId = connectedVirtualRouters.keySet().iterator().next();\r
+                }\r
+                break;\r
+\r
+            case Vrouter:\r
+                virtualRouterId = virtualNodeId;\r
+                break;\r
+\r
+            default:\r
+                break;\r
+        }\r
+\r
+        if ( null == virtualRouterId ) {\r
+            return null;\r
+        }\r
+\r
+        UserId userId = new UserId(virtualNetworkId.getValue());\r
+        UserIntentVnMapping userIntentVnMapping = userIntentVnMappings.get(userId);\r
         List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.NodeId  nodeId = null;\r
         VirtualResource virtualResource;\r
 \r
-        for ( IntentVnMappingResult intentVnMappingResult : intentVnMappingResults ) {\r
-            virtualResource = intentVnMappingResult.getVirtualResource().get(0);\r
+        VirtualPort layer2ExternalVirtualPort =\r
+                virtualNetworkHelper.getLayer2ExternalVirtualPort(virtualRouterId);\r
+\r
+        if ( null != layer2ExternalVirtualPort ) {\r
+            for ( IntentVnMappingResult intentVnMappingResult : intentVnMappingResults ) {\r
+                if ( IntentVnMappingResult.IntentType.Node == intentVnMappingResult.getIntentType() ) {\r
+                    if ( 1 == intentVnMappingResult.getVirtualResource().size() ) {\r
+                        virtualResource = intentVnMappingResult.getVirtualResource().get(0);\r
+\r
+                        if ( VirtualResource.VirtualResourceType.Vport\r
+                                == virtualResource.getVirtualResourceType() ) {\r
+                            if ( virtualResource.getParentVirtualResourceEntityId().getValue()\r
+                                    .equals(virtualRouterId.getValue()) ) {\r
+                                nodeId = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.NodeId(\r
+                                        intentVnMappingResult.getIntentId().getValue());\r
+\r
+                                break;\r
+                            }\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+        } else {\r
+            Map<VirtualNodeId, Map.Entry<VirtualPort, VirtualLink>> connectedVirtualSwitches =\r
+                    virtualNetworkHelper.getConnectedVirtualSwitches(virtualRouterId);\r
+\r
+            if ( null != connectedVirtualSwitches && !connectedVirtualSwitches.isEmpty() ) {\r
+                for ( IntentVnMappingResult intentVnMappingResult : intentVnMappingResults ) {\r
+                    if ( IntentVnMappingResult.IntentType.Node == intentVnMappingResult.getIntentType() ) {\r
+                        if ( 1 == intentVnMappingResult.getVirtualResource().size() ) {\r
+                            virtualResource = intentVnMappingResult.getVirtualResource().get(0);\r
+\r
+                            if ( VirtualResource.VirtualResourceType.Vnode\r
+                                    == virtualResource.getVirtualResourceType() ) {\r
+                                if ( virtualResource.getVirtualResourceEntityId().getValue()\r
+                                        .equals(virtualRouterId.getValue()) ) {\r
+                                    nodeId = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.NodeId(\r
+                                            intentVnMappingResult.getIntentId().getValue());\r
+\r
+                                    break;\r
+                                }\r
+                            }\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+        }\r
+\r
+        if ( null == nodeId ) {\r
+            return null;\r
+        }\r
+\r
+        User user = users.get(userId);\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Node node =\r
+                getNode(user.getObjects().getNode(), nodeId);\r
+        Property gatewayIpProperty = getNodeProperty(node.getProperty(), new PropertyName("gateway-ip"));\r
+\r
+        if ( null != gatewayIpProperty ) {\r
+            String propertyValue = gatewayIpProperty.getPropertyValues().getStringValue().get(0).getValue();\r
+\r
+            return new IpAddress(new Ipv4Address(propertyValue));\r
+        } else {\r
+            Property ipPrefixProperty = getNodeProperty(node.getProperty(), new PropertyName("ip-prefix"));\r
 \r
-            if ( virtualResource.getVirtualResourceEntityId().getValue().equals(virtualNodeId.getValue()) ) {\r
-                org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.NodeId nodeId =\r
-                        new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.NodeId(intentVnMappingResult.getIntentId().getValue());\r
+            if ( null != ipPrefixProperty ) {\r
+                String propertyValue = ipPrefixProperty.getPropertyValues().getStringValue().get(0).getValue();\r
+\r
+                return generateDefaultGatewayIpAddress(propertyValue);\r
+            }\r
+        }\r
 \r
-                return gatewayMacAddress.get(nodeId);\r
+        return null;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @author Zhigang Ji\r
+     * @param virtualNetworkId TODO\r
+     * @param virtualNode TODO\r
+     * @return TODO\r
+     */\r
+    private MacAddress getGatewayMacAddress(VirtualNetworkId virtualNetworkId,\r
+                                            VirtualNode virtualNode) {\r
+        VirtualNetworkHelper virtualNetworkHelper = virtualNetworkHelpers.get(virtualNetworkId);\r
+        VirtualNodeId virtualNodeId = virtualNode.getNodeId();\r
+\r
+        switch ( virtualNode.getNodeType() ) {\r
+            case Vswitch:\r
+                Map<VirtualNodeId, Map.Entry<VirtualPort, VirtualLink>> connectedVirtualRouters =\r
+                        virtualNetworkHelper.getConnectedVirtualRouters(virtualNodeId);\r
+\r
+                if ( null != connectedVirtualRouters && !connectedVirtualRouters.isEmpty() ) {\r
+                    VirtualNodeId virtualRouterId = connectedVirtualRouters.keySet().iterator().next();\r
+                    VirtualLink virtualLink = virtualNetworkHelper.getVirtualLink(virtualRouterId, virtualNodeId);\r
+\r
+                    UserId userId = new UserId(virtualNetworkId.getValue());\r
+                    UserVnPnMapping userVnPnMapping = userVnPnMappings.get(userId);\r
+                    List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();\r
+                    VnPnMappingResult vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+                            new VirtualResourceEntityId(virtualLink.getLinkId()));\r
+\r
+                    PhysicalPathId physicalPathId =\r
+                            new PhysicalPathId(vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+                    PhysicalPath physicalPath = physicalNetworkHelper.getPhysicalPath(physicalPathId);\r
+                    PhysicalLink physicalLink =\r
+                            physicalNetworkHelper.getFirstPhysicalLinkOfPhysicalPath(physicalPath);\r
+                    PhysicalPort physicalPort = physicalNetworkHelper\r
+                            .getPhysicalPort(physicalLink.getSrcNodeId(), physicalLink.getSrcPortId());\r
+\r
+                    return physicalPort.getMacAddress();\r
+                }\r
+                break;\r
+\r
+            case Vrouter:\r
+                VirtualPort layer2ExternalVirtualPort =\r
+                        virtualNetworkHelper.getLayer2ExternalVirtualPort(virtualNodeId);\r
+\r
+                if ( null != layer2ExternalVirtualPort ) {\r
+                    UserId userId = new UserId(virtualNetworkId.getValue());\r
+                    UserVnPnMapping userVnPnMapping = userVnPnMappings.get(userId);\r
+                    List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();\r
+                    VnPnMappingResult vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+                            new VirtualResourceEntityId(layer2ExternalVirtualPort.getPortId().getValue()));\r
+\r
+                    PhysicalNodeId physicalNodeId =\r
+                            new PhysicalNodeId(vnPnMappingResult.getParentPhysicalResourceEntityId().getValue());\r
+                    PhysicalPortId physicalPortId =\r
+                            new PhysicalPortId(vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+                    PhysicalPort physicalPort =\r
+                            physicalNetworkHelper.getPhysicalPort(physicalNodeId, physicalPortId);\r
+\r
+                    return physicalPort.getMacAddress();\r
+                }\r
+                break;\r
+\r
+            default:\r
+                break;\r
+        }\r
+\r
+        return null;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @author Zhigang Ji\r
+     * @param nodes TODO\r
+     * @param nodeId TODO\r
+     * @return TODO\r
+     */\r
+    private org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Node getNode(\r
+            List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Node> nodes,\r
+            org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.NodeId nodeId) {\r
+        for ( org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Node\r
+                node : nodes ) {\r
+            if ( node.getNodeId().equals(nodeId) ) {\r
+                return node;\r
             }\r
         }\r
 \r
@@ -1429,6 +1928,26 @@ public class FlowUtils implements AutoCloseable {
         return null;\r
     }\r
 \r
+    /**\r
+     * TODO\r
+     *\r
+     * @author Zhigang Ji\r
+     * @param properties TODO\r
+     * @param propertyName TODO\r
+     * @return TODO\r
+     */\r
+    private Property getNodeProperty(List<Property> properties, PropertyName propertyName) {\r
+        if ( null != properties ) {\r
+            for ( Property property : properties ) {\r
+                if ( property.getPropertyName().equals(propertyName) ) {\r
+                    return property;\r
+                }\r
+            }\r
+        }\r
+\r
+        return null;\r
+    }\r
+\r
     /**\r
      * TODO\r
      *\r
@@ -1515,10 +2034,10 @@ public class FlowUtils implements AutoCloseable {
      * @param userId TODO\r
      * @param macAddress TODO\r
      * @param physicalNodeId TODO\r
-     * @param physicalPort TODO\r
+     * @param physicalPortId TODO\r
      */\r
     private void configMacTableEntry(UserId userId, MacAddress macAddress,\r
-                                     PhysicalNodeId physicalNodeId, PhysicalPort physicalPort) {\r
+                                     PhysicalNodeId physicalNodeId, PhysicalPortId physicalPortId) {\r
         WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();\r
         List<Instruction> instructionList = new LinkedList<Instruction>();\r
         List<Action> actionList = new LinkedList<Action>();\r
@@ -1531,7 +2050,7 @@ public class FlowUtils implements AutoCloseable {
 \r
         Match match = new MatchBuilder().setEthernetMatch(ethernetMatch).setMetadata(metadata).build();\r
 \r
-        OutputAction outputAction = new OutputActionBuilder().setOutputNodeConnector(createNodeConnectorId(physicalPort.getPortId())).build();\r
+        OutputAction outputAction = new OutputActionBuilder().setOutputNodeConnector(createNodeConnectorId(physicalPortId)).build();\r
         OutputActionCase outputActionCase = new OutputActionCaseBuilder().setOutputAction(outputAction).build();\r
         Action actionOutput = new ActionBuilder().setOrder(actionList.size()).setAction(outputActionCase).build();\r
         actionList.add(actionOutput);\r
@@ -1631,7 +2150,7 @@ public class FlowUtils implements AutoCloseable {
         List<Instruction> instructionList = new LinkedList<Instruction>();\r
         List<Action> actionList = new LinkedList<Action>();\r
 \r
-        EthernetMatchBuilder ethernetMatchBuilder = new EthernetMatchBuilder().setEthernetType(new EthernetTypeBuilder().setType(new EtherType((long)ETH_TYPE_IP)).build());\r
+        EthernetMatchBuilder ethernetMatchBuilder = new EthernetMatchBuilder().setEthernetType(new EthernetTypeBuilder().setType(new EtherType((long) ETH_TYPE_IP)).build());\r
         EthernetMatch ethernetMatch = ethernetMatchBuilder.build();\r
 \r
         MetadataBuilder metadataBuilder = new MetadataBuilder().setMetadata(BigInteger.valueOf(metadatas.get(userId)));\r
@@ -1725,7 +2244,7 @@ public class FlowUtils implements AutoCloseable {
 \r
         PhysicalLink physicalLink = physicalNetworkHelper.getFirstPhysicalLinkOfPhysicalPath(physicalPath);\r
 \r
-        EthernetMatchBuilder ethernetMatchBuilder = new EthernetMatchBuilder().setEthernetType(new EthernetTypeBuilder().setType(new EtherType((long)ETH_TYPE_IP)).build());\r
+        EthernetMatchBuilder ethernetMatchBuilder = new EthernetMatchBuilder().setEthernetType(new EthernetTypeBuilder().setType(new EtherType((long) ETH_TYPE_IP)).build());\r
         EthernetMatch ethernetMatch = ethernetMatchBuilder.build();\r
 \r
         MetadataBuilder metadataBuilder = new MetadataBuilder().setMetadata(BigInteger.valueOf(metadatas.get(userId)));\r
@@ -1821,11 +2340,9 @@ public class FlowUtils implements AutoCloseable {
      * @author Zhigang Ji\r
      * @param userId TODO\r
      * @param ipPrefix TODO\r
-     * @param macAddress TODO\r
      * @param physicalNodeId TODO\r
      */\r
-    private void configIpTableEntry(UserId userId, IpPrefix ipPrefix,\r
-                                    MacAddress macAddress, PhysicalNodeId physicalNodeId) {\r
+    private void configIpTableEntry(UserId userId, IpPrefix ipPrefix, PhysicalNodeId physicalNodeId) {\r
         WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();\r
         List<Instruction> instructionList = new LinkedList<Instruction>();\r
         List<Action> actionList = new LinkedList<Action>();\r
@@ -1846,14 +2363,6 @@ public class FlowUtils implements AutoCloseable {
         Action actionDecNW = new ActionBuilder().setOrder(actionList.size()).setAction(decNwTtlCase).build();\r
         actionList.add(actionDecNW);\r
 \r
-        ethernetMatchBuilder = new EthernetMatchBuilder().setEthernetSource(new EthernetSourceBuilder().setAddress(macAddress).build());\r
-        ethernetMatch = ethernetMatchBuilder.build();\r
-\r
-        SetField setField = new SetFieldBuilder().setEthernetMatch(ethernetMatch).build();\r
-        SetFieldCase setFieldCase = new SetFieldCaseBuilder().setSetField(setField).build();\r
-        Action actionSetField = new ActionBuilder().setOrder(actionList.size()).setAction(setFieldCase).build();\r
-        actionList.add(actionSetField);\r
-\r
         ApplyActions applyActions = new ApplyActionsBuilder().setAction(actionList).build();\r
         ApplyActionsCase applyActionsCase = new ApplyActionsCaseBuilder().setApplyActions(applyActions).build();\r
         Instruction instructionApply = new InstructionBuilder().setOrder(instructionList.size()).setInstruction(applyActionsCase).build();\r
@@ -1884,6 +2393,65 @@ public class FlowUtils implements AutoCloseable {
         return;\r
     }\r
 \r
+    /**\r
+     * TODO\r
+     *\r
+     * @author Zhigang Ji\r
+     * @param userId TODO\r
+     * @param virtualArp TODO\r
+     * @param physicalNodeId TODO\r
+     * @param physicalPortId TODO\r
+     */\r
+    private void configArpTableEntry(UserId userId, VirtualArp virtualArp,\r
+                                     PhysicalNodeId physicalNodeId, PhysicalPortId physicalPortId) {\r
+        WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();\r
+        List<Instruction> instructionList = new LinkedList<Instruction>();\r
+        List<Action> actionList = new LinkedList<Action>();\r
+\r
+        EthernetMatchBuilder ethernetMatchBuilder = new EthernetMatchBuilder().setEthernetType(new EthernetTypeBuilder().setType(new EtherType((long)ETH_TYPE_IP)).build());\r
+        EthernetMatch ethernetMatch = ethernetMatchBuilder.build();\r
+\r
+        Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder().setIpv4Destination(convertIpAddressToIpPrefix(virtualArp.getIpAddress()).getIpv4Prefix());\r
+        Ipv4Match ipv4Match = ipv4MatchBuilder.build();\r
+\r
+        MetadataBuilder metadataBuilder = new MetadataBuilder().setMetadata(BigInteger.valueOf(metadatas.get(userId)));\r
+        Metadata metadata = metadataBuilder.build();\r
+\r
+        Match match = new MatchBuilder().setEthernetMatch(ethernetMatch).setLayer3Match(ipv4Match).setMetadata(metadata).build();\r
+\r
+        ethernetMatchBuilder = new EthernetMatchBuilder().setEthernetDestination(new EthernetDestinationBuilder().setAddress(virtualArp.getMacAddress()).build());\r
+        ethernetMatch = ethernetMatchBuilder.build();\r
+\r
+        SetField setField = new SetFieldBuilder().setEthernetMatch(ethernetMatch).build();\r
+        SetFieldCase setFieldCase = new SetFieldCaseBuilder().setSetField(setField).build();\r
+        Action actionSetField = new ActionBuilder().setOrder(actionList.size()).setAction(setFieldCase).build();\r
+        actionList.add(actionSetField);\r
+\r
+        OutputAction outputAction = new OutputActionBuilder().setOutputNodeConnector(createNodeConnectorId(physicalPortId)).build();\r
+        OutputActionCase outputActionCase = new OutputActionCaseBuilder().setOutputAction(outputAction).build();\r
+        Action actionOutput = new ActionBuilder().setOrder(actionList.size()).setAction(outputActionCase).build();\r
+        actionList.add(actionOutput);\r
+\r
+        ApplyActions applyActions = new ApplyActionsBuilder().setAction(actionList).build();\r
+        ApplyActionsCase applyActionsCase = new ApplyActionsCaseBuilder().setApplyActions(applyActions).build();\r
+        Instruction instructionApply = new InstructionBuilder().setOrder(instructionList.size()).setInstruction(applyActionsCase).build();\r
+        instructionList.add(instructionApply);\r
+\r
+        Instructions instructions = new InstructionsBuilder().setInstruction(instructionList).build();\r
+\r
+        FlowId flowId = new FlowId(UUID.randomUUID().toString());\r
+        FlowBuilder flowBuilder = baseFlowBuilder().setId(flowId).setTableId(ARP_TABLE_ID).setPriority(DEFAULT_FLOW_PRIORITY);\r
+        Flow flow = flowBuilder.setMatch(match).setInstructions(instructions).build();\r
+\r
+        NodeId nodeId = createNodeId(physicalNodeId);\r
+        InstanceIdentifier<Flow> flowInsId = generateFlowInsId(userId, nodeId, flow.getTableId(), flow.getId());\r
+\r
+        writeTransaction.put(LogicalDatastoreType.CONFIGURATION, flowInsId, flow, true);\r
+        writeTransaction.submit();\r
+\r
+        return;\r
+    }\r
+\r
     /**\r
      * TODO\r
      *\r
@@ -1892,14 +2460,16 @@ public class FlowUtils implements AutoCloseable {
      * @param virtualArp TODO\r
      * @param physicalPath TODO\r
      */\r
-    private void configArpTableEntry(UserId userId, VirtualArp virtualArp, PhysicalPath physicalPath) {\r
+    private void configArpTableEntry(UserId userId, VirtualArp virtualArp,\r
+                                     PhysicalPath physicalPath) {\r
         WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();\r
         List<Instruction> instructionList = new LinkedList<Instruction>();\r
         List<Action> actionList = new LinkedList<Action>();\r
 \r
         PhysicalLink physicalLink = physicalNetworkHelper.getFirstPhysicalLinkOfPhysicalPath(physicalPath);\r
+        PhysicalPort physicalPort = physicalNetworkHelper.getPhysicalPort(physicalLink.getSrcNodeId(), physicalLink.getSrcPortId());\r
 \r
-        EthernetMatchBuilder ethernetMatchBuilder = new EthernetMatchBuilder().setEthernetType(new EthernetTypeBuilder().setType(new EtherType((long)ETH_TYPE_IP)).build());\r
+        EthernetMatchBuilder ethernetMatchBuilder = new EthernetMatchBuilder().setEthernetType(new EthernetTypeBuilder().setType(new EtherType((long) ETH_TYPE_IP)).build());\r
         EthernetMatch ethernetMatch = ethernetMatchBuilder.build();\r
 \r
         Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder().setIpv4Destination(convertIpAddressToIpPrefix(virtualArp.getIpAddress()).getIpv4Prefix());\r
@@ -1920,6 +2490,14 @@ public class FlowUtils implements AutoCloseable {
         Action actionSetField = new ActionBuilder().setOrder(actionList.size()).setAction(setFieldCase).build();\r
         actionList.add(actionSetField);\r
 \r
+        ethernetMatchBuilder = new EthernetMatchBuilder().setEthernetSource(new EthernetSourceBuilder().setAddress(physicalPort.getMacAddress()).build());\r
+        ethernetMatch = ethernetMatchBuilder.build();\r
+\r
+        setField = new SetFieldBuilder().setEthernetMatch(ethernetMatch).build();\r
+        setFieldCase = new SetFieldCaseBuilder().setSetField(setField).build();\r
+        actionSetField = new ActionBuilder().setOrder(actionList.size()).setAction(setFieldCase).build();\r
+        actionList.add(actionSetField);\r
+\r
         ethernetMatchBuilder = new EthernetMatchBuilder().setEthernetDestination(new EthernetDestinationBuilder().setAddress(virtualArp.getMacAddress()).build());\r
         ethernetMatch = ethernetMatchBuilder.build();\r
 \r
@@ -2064,7 +2642,7 @@ public class FlowUtils implements AutoCloseable {
         Action actionPushMPLS = new ActionBuilder().setOrder(actionList.size()).setAction(pushMplsActionCase).build();\r
         actionList.add(actionPushMPLS);\r
 \r
-        SetField setField = new SetFieldBuilder().setProtocolMatchFields(new ProtocolMatchFieldsBuilder().setMplsLabel((long)mplsLabelsOfPhysicalPaths.get(outPhysicalPath.getPathId()).get(0)).build()).build();\r
+        SetField setField = new SetFieldBuilder().setProtocolMatchFields(new ProtocolMatchFieldsBuilder().setMplsLabel((long) mplsLabelsOfPhysicalPaths.get(outPhysicalPath.getPathId()).get(0)).build()).build();\r
         SetFieldCase setFieldCase = new SetFieldCaseBuilder().setSetField(setField).build();\r
         Action actionSetField = new ActionBuilder().setOrder(actionList.size()).setAction(setFieldCase).build();\r
         actionList.add(actionSetField);\r
@@ -2158,6 +2736,59 @@ public class FlowUtils implements AutoCloseable {
         return matchBuilder.build();\r
     }\r
 \r
+    /**\r
+     * TODO\r
+     *\r
+     * @author Zhigang Ji\r
+     * @param payload TODO\r
+     * @param ingress TODO\r
+     * @param egress TODO\r
+     */\r
+    private void sendPacketOut(byte[] payload, NodeConnectorRef ingress, NodeConnectorRef egress) {\r
+        TransmitPacketInputBuilder transmitPacketInputBuilder = new TransmitPacketInputBuilder().setPayload(payload).setNode(createNodeRef(egress));\r
+        TransmitPacketInput transmitPacketInput = transmitPacketInputBuilder.setEgress(egress).setIngress(ingress).build();\r
+\r
+        packetProcessingService.transmitPacket(transmitPacketInput);\r
+\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @author Zhigang Ji\r
+     * @param ethernet TODO\r
+     * @param arp TODO\r
+     * @return TODO\r
+     */\r
+    private byte[] createArpPacket(Ethernet ethernet, ARP arp) {\r
+        try {\r
+            ethernet.setRawPayload(arp.serialize());\r
+        } catch ( PacketException exception ) {\r
+            LOG.error("Failed to encode the arp packet, smac: {}, sip: {}, dmac: {}, dip: {}.",\r
+                    convertByteArray6ToMacAddress(arp.getSenderHardwareAddress()).getValue(),\r
+                    convertByteArray4ToIpAddress(arp.getSenderProtocolAddress()).getIpv4Address().getValue(),\r
+                    convertByteArray6ToMacAddress(arp.getTargetHardwareAddress()).getValue(),\r
+                    convertByteArray4ToIpAddress(arp.getTargetProtocolAddress()).getIpv4Address().getValue());\r
+\r
+            return null;\r
+        }\r
+\r
+        byte[] arpPacket;\r
+\r
+        try {\r
+            arpPacket = ethernet.serialize();\r
+        } catch ( PacketException exception ) {\r
+            LOG.error("Failed to encode the ethernet packet, smac: {}, dmac: {}.",\r
+                    convertByteArray6ToMacAddress(ethernet.getSourceMACAddress()).getValue(),\r
+                    convertByteArray6ToMacAddress(ethernet.getDestinationMACAddress()).getValue());\r
+\r
+            return null;\r
+        }\r
+\r
+        return arpPacket;\r
+    }\r
+\r
     /**\r
      * TODO\r
      *\r
@@ -2229,11 +2860,11 @@ public class FlowUtils implements AutoCloseable {
      * TODO\r
      *\r
      * @author Zhigang Ji\r
-     * @param physicalNodeId TODO\r
+     * @param nodeConnectorRef TODO\r
      * @return TODO\r
      */\r
-    private NodeRef createNodeRef(PhysicalNodeId physicalNodeId) {\r
-        return new NodeRef(createNodePath(createNodeId(physicalNodeId)));\r
+    private NodeRef createNodeRef(NodeConnectorRef nodeConnectorRef) {\r
+        return new NodeRef(nodeConnectorRef.getValue().firstIdentifierOf(Node.class));\r
     }\r
 \r
     /**\r
@@ -2261,6 +2892,36 @@ public class FlowUtils implements AutoCloseable {
         return createTablePath(nodeId, tableId).child(Flow.class, new FlowKey(flowId));\r
     }\r
 \r
+    /**\r
+     * TODO\r
+     *\r
+     * @author Zhigang Ji\r
+     * @param nodeConnectorRef TODO\r
+     * @return TODO\r
+     */\r
+    private PhysicalPortId convertNodeConnectorRefToPhysicalPortId(NodeConnectorRef nodeConnectorRef) {\r
+        PhysicalPortId physicalPortId = new PhysicalPortId(\r
+                nodeConnectorRef.getValue().firstIdentifierOf(NodeConnector.class)\r
+                        .firstKeyOf(NodeConnector.class).getId().getValue());\r
+\r
+        return physicalPortId;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @author Zhigang Ji\r
+     * @param nodeConnectorRef TODO\r
+     * @return TODO\r
+     */\r
+    private PhysicalNodeId convertNodeConnectorRefToPhysicalNodeId(NodeConnectorRef nodeConnectorRef) {\r
+        PhysicalNodeId physicalNodeId = new PhysicalNodeId(\r
+                nodeConnectorRef.getValue().firstIdentifierOf(Node.class)\r
+                        .firstKeyOf(Node.class).getId().getValue());\r
+\r
+        return physicalNodeId;\r
+    }\r
+\r
     /**\r
      * TODO\r
      *\r
@@ -2272,6 +2933,76 @@ public class FlowUtils implements AutoCloseable {
         return new IpPrefix(new Ipv4Prefix(ipAddress.getIpv4Address().getValue() + "/32"));\r
     }\r
 \r
+    /**\r
+     * TODO\r
+     *\r
+     * @author Zhigang Ji\r
+     * @param byteArray TODO\r
+     * @return TODO\r
+     */\r
+    private IpAddress convertByteArray4ToIpAddress(byte[] byteArray) {\r
+        char[] charArray = NetUtils\r
+                .getInetAddress(NetUtils.byteArray4ToInt(byteArray)).getHostAddress().toCharArray();\r
+\r
+        return new IpAddress(charArray);\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @author Zhigang Ji\r
+     * @param byteArray TODO\r
+     * @return TODO\r
+     */\r
+    private MacAddress convertByteArray6ToMacAddress(byte[] byteArray) {\r
+        return new MacAddress(HexEncode.bytesToHexStringFormat(byteArray));\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @author Zhigang Ji\r
+     * @param macAddress TODO\r
+     * @return TODO\r
+     */\r
+    private byte[] convertMacAddressToByteArray6(MacAddress macAddress) {\r
+        byte[] byteArray = new byte[6];\r
+        String[] segments = macAddress.getValue().split(":");\r
+\r
+        for ( int i = 0; i < 6; i++ ) {\r
+            byteArray[i] = (byte)Integer.parseInt(segments[i], 16);\r
+        }\r
+\r
+        return byteArray;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @author Zhigang Ji\r
+     * @param ipPrefix TODO\r
+     * @return TODO\r
+     */\r
+    private IpAddress generateDefaultGatewayIpAddress(String ipPrefix) {\r
+        int indexOfSlash = ipPrefix.indexOf('/');\r
+\r
+        String strIpAddress = ipPrefix.substring(0, indexOfSlash);\r
+        int mask = Integer.parseInt(ipPrefix.substring(indexOfSlash + 1));\r
+\r
+        String[] segments = strIpAddress.split("\\.");\r
+\r
+        int intIpAddress = (Integer.parseInt(segments[0]) << 24) | (Integer.parseInt(segments[1]) << 16);\r
+        intIpAddress |= (Integer.parseInt(segments[2]) << 8) | (Integer.parseInt(segments[3]));\r
+\r
+        int intGatewayIpAddress = ((intIpAddress >> (32 - mask)) << (32 - mask)) + 1;\r
+        String strGatewayIpAddress = ((intGatewayIpAddress >> 24) & 0xff) + "." +\r
+                ((intGatewayIpAddress >> 16) & 0xff) + "." +\r
+                ((intGatewayIpAddress >> 8) & 0xff) + "." +\r
+                (intGatewayIpAddress & 0xff);\r
+\r
+        return new IpAddress(new Ipv4Address(strGatewayIpAddress));\r
+    }\r
+\r
     /**\r
      * TODO\r
      *\r
@@ -2441,7 +3172,7 @@ public class FlowUtils implements AutoCloseable {
         private Map<VirtualNodeId, VirtualPort> layer3ExternalVirtualPortMap;\r
         private Map<VirtualNodeId, Map<VirtualNodeId, Map.Entry<VirtualPort, VirtualLink>>> virtualSwitchConnectedInternalVirtualPortMap;\r
         private Map<VirtualNodeId, Map<VirtualNodeId, Map.Entry<VirtualPort, VirtualLink>>> virtualRouterConnectedInternalVirtualPortMap;\r
-        private Map<VirtualArpKey, VirtualArp> virtualArpMap;\r
+        private Map<IpAddress, VirtualArp> ipAddressKeyVirtualArpMap;\r
         private Map<MacAddress, VirtualArp> macAddressKeyVirtualArpMap;\r
 \r
         public VirtualNetworkHelper(VirtualNetwork virtualNetwork) {\r
@@ -2456,7 +3187,7 @@ public class FlowUtils implements AutoCloseable {
                     new HashMap<VirtualNodeId, Map<VirtualNodeId, Map.Entry<VirtualPort, VirtualLink>>>();\r
             virtualRouterConnectedInternalVirtualPortMap =\r
                     new HashMap<VirtualNodeId, Map<VirtualNodeId, Map.Entry<VirtualPort, VirtualLink>>>();\r
-            virtualArpMap = new HashMap<VirtualArpKey, VirtualArp>();\r
+            ipAddressKeyVirtualArpMap = new HashMap<IpAddress, VirtualArp>();\r
             macAddressKeyVirtualArpMap = new HashMap<MacAddress, VirtualArp>();\r
 \r
             List<VirtualNode> virtualNodes = virtualNetwork.getVirtualNodes().getVirtualNode();\r
@@ -2535,21 +3266,40 @@ public class FlowUtils implements AutoCloseable {
             List<VirtualArp> virtualArps = virtualNetwork.getVirtualArps().getVirtualArp();\r
 \r
             for ( VirtualArp virtualArp : virtualArps ) {\r
-                virtualArpMap.put(virtualArp.getKey(), virtualArp);\r
+                ipAddressKeyVirtualArpMap.put(virtualArp.getIpAddress(), virtualArp);\r
                 macAddressKeyVirtualArpMap.put(virtualArp.getMacAddress(), virtualArp);\r
             }\r
 \r
             return;\r
         }\r
 \r
+        protected VirtualNode getVirtualNode(VirtualNodeId virtualNodeId) {\r
+            return virtualNodeMap.get(virtualNodeId);\r
+        }\r
+\r
         protected VirtualLink getVirtualLink(VirtualLinkId virtualLinkId) {\r
             return virtualLinkMap.get(virtualLinkId);\r
         }\r
 \r
+        protected VirtualLink getVirtualLink(VirtualNodeId source, VirtualNodeId destination) {\r
+            for ( VirtualLink virtualLink : virtualLinkMap.values() ) {\r
+                if ( virtualLink.getSrcNodeId().equals(source)\r
+                        && virtualLink.getDestNodeId().equals(destination) ) {\r
+                    return virtualLink;\r
+                }\r
+            }\r
+\r
+            return null;\r
+        }\r
+\r
         protected VirtualPath getVirtualPath(VirtualPathId virtualPathId) {\r
             return virtualPathMap.get(virtualPathId);\r
         }\r
 \r
+        protected VirtualPort getVirtualPort(VirtualNodeId virtualNodeId, VirtualPortId virtualPortId) {\r
+            return virtualPortMap.get(virtualNodeId).get(virtualPortId);\r
+        }\r
+\r
         protected Map<VirtualNodeId, VirtualNode> getVirtualRouters() {\r
             return virtualRouterMap;\r
         }\r
@@ -2572,8 +3322,85 @@ public class FlowUtils implements AutoCloseable {
             return virtualRouterConnectedInternalVirtualPortMap.get(virtualNodeId);\r
         }\r
 \r
+        protected VirtualArp getVirtualArp(IpAddress ipAddress) {\r
+            return ipAddressKeyVirtualArpMap.get(ipAddress);\r
+        }\r
+\r
         protected VirtualArp getVirtualArp(MacAddress macAddress) {\r
             return macAddressKeyVirtualArpMap.get(macAddress);\r
         }\r
+\r
+        protected void addVirtualArp(VirtualArp virtualArp) {\r
+            ipAddressKeyVirtualArpMap.put(virtualArp.getIpAddress(), virtualArp);\r
+            macAddressKeyVirtualArpMap.put(virtualArp.getMacAddress(), virtualArp);\r
+\r
+            // TODO: Store this new virtual arp into the data store.\r
+\r
+            return;\r
+        }\r
+\r
+        protected boolean isLayer2ExternalVirtualPort(VirtualPort virtualPort) {\r
+            if ( VirtualPort.PortType.External == virtualPort.getPortType()\r
+                    && null != virtualPort.getExternalMacAddresses() ) {\r
+                return true;\r
+            }\r
+\r
+            return false;\r
+        }\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @author Zhigang Ji\r
+     */\r
+    private class ArpHandlerHelper {\r
+        Map<NodeConnectorRef, ImmutableTriple<VirtualNetworkId, VirtualNodeId, VirtualPortId>> externalPhysicalPortMapping;\r
+\r
+        public ArpHandlerHelper() {\r
+            super();\r
+\r
+            externalPhysicalPortMapping =\r
+                    new HashMap<NodeConnectorRef, ImmutableTriple<VirtualNetworkId, VirtualNodeId, VirtualPortId>>();\r
+\r
+            return;\r
+        }\r
+\r
+        protected void update(UserVnPnMapping userVnPnMapping) {\r
+            VirtualNetworkId virtualNetworkId = userVnPnMapping.getVirtualNetworkId();\r
+            List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();\r
+            NodeConnectorRef nodeConnectorRef;\r
+            PhysicalNodeId physicalNodeId;\r
+            PhysicalPortId physicalPortId;\r
+            VirtualNodeId virtualNodeId;\r
+            VirtualPortId virtualPortId;\r
+\r
+            for ( VnPnMappingResult vnPnMappingResult : vnPnMappingResults ) {\r
+                if ( VirtualResource.VirtualResourceType.Vport\r
+                        == vnPnMappingResult.getVirtualResourceType() ) {\r
+                    physicalNodeId =\r
+                            new PhysicalNodeId(vnPnMappingResult.getParentPhysicalResourceEntityId().getValue());\r
+                    physicalPortId =\r
+                            new PhysicalPortId(vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+                    nodeConnectorRef = createNodeConnectorRef(physicalNodeId, physicalPortId);\r
+\r
+                    virtualNodeId =\r
+                            new VirtualNodeId(vnPnMappingResult.getParentVirtualResourceEntityId().getValue());\r
+                    virtualPortId =\r
+                            new VirtualPortId(vnPnMappingResult.getVirtualResourceEntityId().getValue());\r
+\r
+                    externalPhysicalPortMapping.put(nodeConnectorRef,\r
+                            new ImmutableTriple<VirtualNetworkId, VirtualNodeId, VirtualPortId>(\r
+                                    virtualNetworkId, virtualNodeId, virtualPortId));\r
+                }\r
+            }\r
+\r
+            return;\r
+        }\r
+\r
+        protected ImmutableTriple<VirtualNetworkId, VirtualNodeId, VirtualPortId> getMappingValueForExternalPhysicalPort(\r
+                NodeConnectorRef nodeConnectorRef) {\r
+            return externalPhysicalPortMapping.get(nodeConnectorRef);\r
+        }\r
     }\r
 }\r
index 31817768b147b3f8430bc52a74307f29f8aeef14..32bff19d5320cf8bcc9a019dc457cc6df5268967 100644 (file)
@@ -9,46 +9,53 @@
 package org.opendaylight.nemo.renderer.openflow;
 
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
+import org.opendaylight.nemo.renderer.openflow.physicalnetwork.PhyConfigLoader;
+import org.opendaylight.nemo.renderer.openflow.physicalnetwork.PhysicalNetworkAdapter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
-
 public class OpenflowRenderer implements AutoCloseable {
-       
-       private static final Logger LOG = LoggerFactory.getLogger(OpenflowRenderer.class);
-       
-       private DataBroker dataBroker;
-       private final ResourceManager resourceManager;
-       private final FlowTableManager flowTableMng;
-       
-       public OpenflowRenderer(DataBroker dataBroker) {
-               super();
-        this.dataBroker = dataBroker;
-               System.out.println();
-               System.out.println("Waiting for loading config file about 30s...");
+    private static final Logger LOG = LoggerFactory.getLogger(OpenflowRenderer.class);
 
-               LOG.info("New ResourceManager.");
-               resourceManager = new ResourceManager(dataBroker);
+    private final DataBroker dataBroker;
+    private final NotificationProviderService notificationProviderService;
+    private final PacketProcessingService packetProcessingService;
 
-               LOG.info("New FlowTableManager.");
-               flowTableMng = new FlowTableManager(dataBroker, resourceManager);
+    private final PhyConfigLoader phyConfigLoader;
+    private final FlowTableManager flowTableMng;
+    private PhysicalNetworkAdapter physicalNetworkAdapter;
 
-               LOG.info("Initialized openflow renderer.");
+    public OpenflowRenderer(DataBroker dataBroker,
+                            NotificationProviderService notificationProviderService,
+                            PacketProcessingService packetProcessingService) {
+        super();
+
+        this.dataBroker = dataBroker;
+        this.notificationProviderService = notificationProviderService;
+        this.packetProcessingService = packetProcessingService;
+
+        phyConfigLoader = new PhyConfigLoader(dataBroker);
+        LOG.debug("New FlowTableManager.");
+        flowTableMng = new FlowTableManager(dataBroker
+                , packetProcessingService
+                , phyConfigLoader);
+        physicalNetworkAdapter = new PhysicalNetworkAdapter(dataBroker
+                , notificationProviderService
+                , phyConfigLoader
+                , flowTableMng.getFlowUtils());
+
+        LOG.info("Initialized the NEMO OpenFlow renderer.");
     }
-       
-       // *************
+
+    // *************
     // AutoCloseable
     // *************
 
     @Override
     public void close() throws Exception {
-               if (flowTableMng != null) flowTableMng.close();
-               if (resourceManager != null) resourceManager.close();
+        if (flowTableMng != null) flowTableMng.close();
+        if (physicalNetworkAdapter != null) physicalNetworkAdapter.close();
     }
 }
-
diff --git a/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/ResourceManager.java b/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/ResourceManager.java
deleted file mode 100644 (file)
index 5101748..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/*\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\rpackage org.opendaylight.nemo.renderer.openflow;\r\rimport org.opendaylight.controller.md.sal.binding.api.DataBroker;\rimport org.opendaylight.controller.md.sal.binding.api.WriteTransaction;\rimport org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\rimport org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\rimport org.slf4j.Logger;\rimport org.slf4j.LoggerFactory;\r\rimport com.google.common.util.concurrent.FutureCallback;\rimport com.google.common.util.concurrent.Futures;\r\rimport com.google.common.collect.HashBasedTable;\rimport com.google.common.collect.Table;\r\rimport java.util.*;\rimport java.util.concurrent.Executors;\rimport java.util.concurrent.ScheduledExecutorService;\rimport com.google.common.util.concurrent.CheckedFuture;\r\rimport org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\rimport org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;\r\r\rimport com.fasterxml.jackson.core.JsonProcessingException;\rimport com.fasterxml.jackson.databind.JsonNode;\rimport com.fasterxml.jackson.databind.ObjectMapper;\r\r\rimport java.io.BufferedReader;\rimport java.io.FileInputStream;\rimport java.io.IOException;\rimport java.io.InputStreamReader;\rimport  java.lang.*;\r\rimport org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;\rimport org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;\rimport org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;\r\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalNetworkBuilder;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalNetwork;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalNodeInstance;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalPortInstance;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.attribute.instance.AttributeValue;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.attribute.instance.AttributeValueBuilder;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNode;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNodeBuilder;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNodeKey;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLink;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLinkBuilder;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLinkKey;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.PhysicalPort;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.PhysicalPortBuilder;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.PhysicalPortKey;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.port.instance.Attribute;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.port.instance.AttributeBuilder;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.port.instance.AttributeKey;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.AttributeName;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalNodeId;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalPortId;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalLinkId;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalHostId;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalHostName;\r\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.hosts.PhysicalHostBuilder;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.hosts.PhysicalHostKey;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.hosts.PhysicalHost;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.host.instance.IpAddresses;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.host.instance.IpAddressesBuilder;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.PhysicalNodes;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.PhysicalLinks;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.PhysicalHosts;\r\r\rimport org.opendaylight.nemo.renderer.openflow.entity.ResourceBean;\r\rpublic class ResourceManager implements AutoCloseable {\r    \r    private static final Logger LOG = LoggerFactory.getLogger(ResourceManager.class);\r\r    public final static String PROPERTY_FILE_PATH = "etc/nemo/nemo-openflow-renderer-resource.json";\r\r    final private DataBroker dataProvider;\r\r    private ObjectMapper objectMapper = null;\r\r    private Table<PhysicalNodeId, PhysicalPortId, MacAddress> externalNetworkMacTable;\r\r    public ResourceManager(DataBroker dataProvider){\r    \r        this.dataProvider = dataProvider;\r\r        this.objectMapper = new ObjectMapper();\r\r        this.externalNetworkMacTable = HashBasedTable.create();\r\r        String resourceInfo = ReadFile(PROPERTY_FILE_PATH);\r\r        buildPhysicalNetworkFromConfig(resourceInfo);\r\r        LOG.info("nemo:Initialized resource manager for Openflow renderer.");\r    }\r\r    public Table<PhysicalNodeId, PhysicalPortId, MacAddress> getExternalNetworkMacTable(){\r\r        return  this.externalNetworkMacTable;\r    }\r\r    private void buildPhysicalNetworkFromConfig(String resource) {\r        try {\r\r            PhysicalNetworkBuilder phyNetwrokBuilder= new PhysicalNetworkBuilder();\r            PhysicalNodeBuilder phyNodeBuilder = new PhysicalNodeBuilder();\r\r            JsonNode rootNode = objectMapper.readTree(resource);\r\r            JsonNode pn = rootNode.path("physicalnetwork");\r\r            JsonNode nodes = pn.path("node");\r            JsonNode links = pn.path("link");\r            JsonNode hosts = pn.path("host");\r\r\r            LOG.debug("Import physical nodes into DataStore.");\r            for(int i = 0; i< nodes.size(); i++){\r                LOG.debug("build physical node execution body");\r\r                //JsonNode node = nodeIt.next();\r                JsonNode node = nodes.get(i);\r                JsonNode ports = node.path("port");\r\r                PhysicalNodeBuilder nodeBuilder = new PhysicalNodeBuilder();\r                nodeBuilder.setNodeId(new PhysicalNodeId(node.get("node-id").asText()));\r                PhysicalNodeKey key = new PhysicalNodeKey(nodeBuilder.getNodeId());\r                nodeBuilder.setKey(key);\r\r                String nodetype = node.get("node-type").asText();\r\r                if((!(nodetype.equals("switch"))) && (!(nodetype.equals("router")))){\r\r                    continue;\r                }\r                if(nodetype.equals("switch"))\r                {\r                    nodeBuilder.setNodeType(PhysicalNodeInstance.NodeType.Switch);\r\r                }else if(nodetype.equals("router")){\r\r                    nodeBuilder.setNodeType(PhysicalNodeInstance.NodeType.Router);\r                }\r\r                List<PhysicalPort> phyPortList = new ArrayList<PhysicalPort>();\r\r                //for (Iterator<JsonNode> portIt = ports.elements(); portIt.hasNext(); ) {\r                for(int j =0; j < ports.size(); j++){\r\r                    LOG.debug("build physical port execution body");\r\r                    //JsonNode port = portIt.next();\r                    JsonNode port = ports.get(j);\r\r                    PhysicalPortBuilder phyPortbuilder =  new PhysicalPortBuilder();\r\r                    phyPortbuilder.setPortId(new PhysicalPortId(port.get("port-id").asText()));\r\r                    if((port.get("port-type").asText()).equals("external")) {\r\r                        phyPortbuilder.setPortType(PhysicalPortInstance.PortType.External);\r                    }\r                    else {\r\r                        phyPortbuilder.setPortType(PhysicalPortInstance.PortType.Internal);\r                    }\r\r                    //add mac-address for each port\r                    LOG.info("nemo:j=" + j);\r                    MacAddress mac = new MacAddress(port.get("port-mac-address").asText());\r                    phyPortbuilder.setMacAddress(mac);\r\r\r                    phyPortbuilder.setBandwidth((long) (port.get("bandwidth").asInt()));\r\r                    JsonNode attrs = port.path("attribute");\r\r                    List<Attribute> AttrList = new ArrayList<Attribute>();\r\r                    for(int r = 0; r < attrs.size(); r++){\r                        LOG.debug("build physical port attribute execution body.");\r                        JsonNode portattr = attrs.get(r);\r                        AttributeBuilder  attrbuilder = new AttributeBuilder();\r                        attrbuilder.setAttributeName(new AttributeName(portattr.path("name").asText()));\r                        AttributeValueBuilder avbd = new AttributeValueBuilder();\r                        avbd.setStringValue(portattr.path("value").asText());\r                        attrbuilder.setKey(new AttributeKey(attrbuilder.getAttributeName()));\r                        attrbuilder.setAttributeValue(avbd.build());\r                        Attribute attr_instance = attrbuilder.build();\r                        AttrList.add(attr_instance);\r                    }\r\r                    /*\r                    Iterator<String> keys = attrs.fieldNames();\r                    while(keys.hasNext()) {\r\r                        LOG.info("build physical port attribute execution body.");\r                        String fieldName = keys.next();\r\r\r                        attrbuilder.setAttributeName(new AttributeName(fieldName));\r                        AttributeValueBuilder avbd = new AttributeValueBuilder();\r                        avbd.setStringValue(attrs.path(fieldName).asText());\r                        attrbuilder.setKey(new AttributeKey(attrbuilder.getAttributeName()));\r                        attrbuilder.setAttributeValue(avbd.build());\r                        Attribute attr_instance = attrbuilder.build();\r                        AttrList.add(attr_instance);\r                    }\r                    */\r\r                    phyPortbuilder.setAttribute(AttrList);\r                    phyPortList.add(phyPortbuilder.build());\r                }\r                nodeBuilder.setPhysicalPort(phyPortList);\r\r                /*node attribute list*/\r                JsonNode node_attrs = node.path("attribute");\r                List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.Attribute>\r                        node_AttrList = new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.Attribute>();\r                for(int t = 0; t < node_attrs.size(); t++){\r                    LOG.debug("build physical node attribute execution body.");\r                    JsonNode node_attr = node_attrs.get(t);\r                    org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.AttributeBuilder\r                            attrbuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.AttributeBuilder();\r                    attrbuilder.setAttributeName(new AttributeName(node_attr.path("name").asText()));\r                    AttributeValueBuilder avbd = new AttributeValueBuilder();\r                    avbd.setStringValue(node_attr.path("value").asText());\r                    attrbuilder.setKey(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.AttributeKey(attrbuilder.getAttributeName()));\r                    attrbuilder.setAttributeValue(avbd.build());\r                    org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.Attribute node_attr_instance = attrbuilder.build();\r                    node_AttrList.add(node_attr_instance);\r                }\r                nodeBuilder.setAttribute((List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.Attribute>) node_AttrList);\r\r                PhysicalNode phyNode = nodeBuilder.build();\r                //phyNodeList.add(phyNode);\r\r                LOG.debug("Ready to write node to data store.");\r                try {\r                    WriteTransaction t = dataProvider.newWriteOnlyTransaction();\r                    InstanceIdentifier<PhysicalNode> phynode_iid = InstanceIdentifier\r                            .builder(PhysicalNetwork.class)\r                            .child(PhysicalNodes.class)\r                            .child(PhysicalNode.class, key)\r                            .build();\r                    t.put(LogicalDatastoreType.OPERATIONAL, phynode_iid, phyNode, true);\r\r                    CheckedFuture<Void, TransactionCommitFailedException> f = t.submit();\r                    Futures.addCallback(f, new FutureCallback<Void>() {\r                        @Override\r                        public void onFailure(Throwable t) {\r                            System.out.println("write transaction onFailure.");\r                            LOG.error("Could not write PhysicalNode", t);\r                        }\r\r                        @Override\r                        public void onSuccess(Void result) {\r                            //System.out.println("write transaction onSuccess.");\r                            LOG.debug("write transaction onSuccess.");\r                        }\r                    });\r\r                } catch (Exception e) {\r                    e.printStackTrace();\r                }\r            }\r\r            LOG.debug("Import physical links into DataStore.");\r            for(int m = 0; m< links.size(); m++){\r\r                LOG.debug("build physical link execution body");\r                JsonNode link = links.get(m);\r\r                String strLeftNodeId = link.get("left-node-id").asText();\r                String strRightNodeId = link.get("right-node-id").asText();\r\r                if(strLeftNodeId.contains("external")||strRightNodeId.contains("external")){\r                    String strExternalNodeId = "";\r                    PhysicalNodeId accessNodeId = null;\r                    PhysicalPortId accessPortId = null;\r                    if(strLeftNodeId.contains("external")){\r                        strExternalNodeId = strLeftNodeId;\r                        accessNodeId = new PhysicalNodeId(link.get("right-node-id").asText());\r                        accessPortId = new PhysicalPortId(link.get("right-port-id").asText());\r                    }else{\r                        strExternalNodeId = strRightNodeId;\r                        accessNodeId = new PhysicalNodeId(link.get("left-node-id").asText());\r                        accessPortId = new PhysicalPortId(link.get("left-port-id").asText());\r                    }\r\r                    for(int b = 0; b < nodes.size(); b++){\r\r                        JsonNode pnode = nodes.get(b);\r                        if(strExternalNodeId.equals(pnode.get("node-id").asText())){\r\r                            MacAddress macAddress = new MacAddress(pnode.get("mac-address").asText());\r                            this.externalNetworkMacTable.put(accessNodeId, accessPortId, macAddress);\r                            break;\r                        }\r                    }\r\r                    continue;\r                }\r\r                PhysicalLinkBuilder linkBuilder = new PhysicalLinkBuilder();\r\r                PhysicalLinkId phylinkid = new PhysicalLinkId(link.get("link-id").asText());\r                linkBuilder.setLinkId(phylinkid);\r                linkBuilder.setSrcNodeId(new PhysicalNodeId(link.get("left-node-id").asText()));\r                linkBuilder.setSrcPortId(new PhysicalPortId(link.get("left-port-id").asText()));\r                linkBuilder.setDestNodeId(new PhysicalNodeId(link.get("right-node-id").asText()));\r                linkBuilder.setDestPortId(new PhysicalPortId(link.get("right-port-id").asText()));\r\r                linkBuilder.setBandwidth((long) (link.get("link-bandwidth").asLong()));\r                linkBuilder.setDelay((long) (link.get("delay").asLong()));\r                linkBuilder.setMetric((long) (link.get("metric").asLong()));\r                linkBuilder.setLossRate((short) (link.get("delay").asInt()));\r\r                PhysicalLink  phyLink = linkBuilder.build();\r\r                LOG.debug("Ready to write link to data store.");\r                try {\r                    WriteTransaction t = dataProvider.newWriteOnlyTransaction();\r                    InstanceIdentifier<PhysicalLink> phylink_iid = InstanceIdentifier\r                            .builder(PhysicalNetwork.class)\r                            .child(PhysicalLinks.class)\r                            .child(PhysicalLink.class, new PhysicalLinkKey(linkBuilder.getLinkId()))\r                            .build();\r                    t.put(LogicalDatastoreType.OPERATIONAL, phylink_iid, phyLink, true);\r\r                    CheckedFuture<Void, TransactionCommitFailedException> f = t.submit();\r                    Futures.addCallback(f, new FutureCallback<Void>() {\r                        @Override\r                        public void onFailure(Throwable t) {\r                            System.out.println("write transaction onFailure.");\r                            LOG.error("Could not write PhysicalLink", t);\r                        }\r\r                        @Override\r                        public void onSuccess(Void result) {\r                            //System.out.println("write transaction onSuccess.");\r                            LOG.debug("write transaction onSuccess.");\r                        }\r                    });\r\r                } catch (Exception e) {\r                    e.printStackTrace();\r                }\r            }\r\r            LOG.debug("Import hosts into DataStore.");\r            for(int n = 0; n< hosts.size(); n++){\r\r                LOG.debug("build host execution body");\r                JsonNode host = hosts.get(n);\r\r                PhysicalHostBuilder  hostBuilder = new PhysicalHostBuilder();\r                hostBuilder.setHostId(new PhysicalHostId(host.get("id").asText()));\r                hostBuilder.setKey(new PhysicalHostKey(hostBuilder.getHostId()));\r                hostBuilder.setHostName(new PhysicalHostName(host.get("name").asText()));\r\r                IpAddressesBuilder IpAddrBuilder = new IpAddressesBuilder();\r                List<IpAddress> ipList = new ArrayList<IpAddress>();\r\r                JsonNode ipaddrs = host.path("ip-addresses");\r                for(int p = 0 ; p < ipaddrs.size(); p++){\r                    JsonNode ipaddr = ipaddrs.get(p);\r                    IpAddress ip = new IpAddress(new Ipv4Address(ipaddr.get("ip-address").asText()));\r                    ipList.add(ip);\r                }\r\r                IpAddrBuilder.setIpAddress(ipList);\r                hostBuilder.setIpAddresses(IpAddrBuilder.build());\r                MacAddress mac = new MacAddress(host.get("mac-address").asText());\r                hostBuilder.setMacAddress(mac);\r                hostBuilder.setNodeId(new PhysicalNodeId(host.get("node-id").asText()));\r                hostBuilder.setPortId(new PhysicalPortId(host.get("connector-id").asText()));\r\r                PhysicalHost phyHost = hostBuilder.build();\r                LOG.debug("Ready to write host to data store.");\r                try {\r                    WriteTransaction t = dataProvider.newWriteOnlyTransaction();\r                    InstanceIdentifier<PhysicalHost> phyhost_iid = InstanceIdentifier\r                            .builder(PhysicalNetwork.class)\r                            .child(PhysicalHosts.class)\r                            .child(PhysicalHost.class, new PhysicalHostKey(hostBuilder.getHostId()))\r                            .build();\r                    t.put(LogicalDatastoreType.OPERATIONAL, phyhost_iid, phyHost, true);\r\r                    CheckedFuture<Void, TransactionCommitFailedException> f = t.submit();\r                    Futures.addCallback(f, new FutureCallback<Void>() {\r                        @Override\r                        public void onFailure(Throwable t) {\r                            System.out.println("write transaction onFailure.");\r                            LOG.error("Could not write PhysicalHost", t);\r                        }\r\r                        @Override\r                        public void onSuccess(Void result) {\r                            //System.out.println("write transaction onSuccess.");\r                            LOG.debug("write transaction onSuccess.");\r                        }\r                    });\r\r                } catch (Exception e) {\r                    e.printStackTrace();\r                }\r\r            }\r\r\r        } catch (JsonProcessingException e) {\r            e.printStackTrace();\r        } catch(IOException e){\r            e.printStackTrace();\r        }\r\r        LOG.debug("buildPhysicalNetworkFromConfig end.");\r        System.out.print("Loading physical network configuration has been completed.");\r    }\r\r    private String ReadFile(String Path){\r        BufferedReader reader = null;\r        String laststr = "";\r        try{\r            FileInputStream fileInputStream = new FileInputStream(Path);\r            InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");\r            reader = new BufferedReader(inputStreamReader);\r            String tempString = null;\r            while((tempString = reader.readLine()) != null){\r                laststr += tempString;\r            }\r            reader.close();\r        }catch(IOException e){\r            e.printStackTrace();\r        }finally{\r            if(reader != null){\r                try {\r                    reader.close();\r                } catch (IOException e) {\r                    e.printStackTrace();\r                }\r            }\r        }\r        return laststr;\r    }\r\r    @Override\r    public void close() throws Exception {\r\r    }\r\r\r\r}\r
\ No newline at end of file
diff --git a/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/entity/HostBean.java b/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/entity/HostBean.java
deleted file mode 100644 (file)
index 66056fb..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/*\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.openflow.entity;\r
-\r
-import java.util.List;\r
-\r
-public class HostBean {\r
-\r
-    public String getHostName() {\r
-        return hostName;\r
-    }\r
-\r
-    public void setHostName(String hostName) {\r
-        this.hostName = hostName;\r
-    }\r
-\r
-    private String hostName;\r
-\r
-    public List<String> getIPAddressList() {\r
-        return this.IPAddressList;\r
-    }\r
-\r
-    public void setStringList(List<String> IPAddressList) {\r
-        this.IPAddressList = IPAddressList;\r
-    }\r
-\r
-    private List<String>  IPAddressList;\r
-\r
-    public String getMacAddress() {\r
-        return macAddress;\r
-    }\r
-\r
-    public void setMacAddress(String macAddress) {\r
-        this.macAddress = macAddress;\r
-    }\r
-\r
-    private String macAddress;\r
-\r
-    public String getNodeID() {\r
-        return nodeID;\r
-    }\r
-\r
-    public void setNodeID(String nodeID) {\r
-        this.nodeID = nodeID;\r
-    }\r
-\r
-    private String nodeID;\r
-\r
-    public String getConnectorID() {\r
-        return connectorID;\r
-    }\r
-\r
-    public void setConnectorID(String connectorID) {\r
-        this.connectorID = connectorID;\r
-    }\r
-\r
-    private String connectorID;\r
-\r
-}\r
diff --git a/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/entity/LinkBean.java b/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/entity/LinkBean.java
deleted file mode 100644 (file)
index 20196a9..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-/*\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.openflow.entity;\r
-\r
-public class LinkBean {\r
-\r
-    private String linkID;\r
-    private String leftNodeID;\r
-    private String leftPortID;\r
-    private String rightPortID;\r
-    private String linkBandwidth;\r
-\r
-    public String getLinkID() {\r
-        return linkID;\r
-    }\r
-\r
-    public void setLinkID(String linkID) {\r
-        this.linkID = linkID;\r
-    }\r
-\r
-    public String getLeftNodeID() {\r
-        return leftNodeID;\r
-    }\r
-\r
-    public void setLeftNodeID(String leftNodeID) {\r
-        this.leftNodeID = leftNodeID;\r
-    }\r
-\r
-    public String getLeftPortID() {\r
-        return leftPortID;\r
-    }\r
-\r
-    public void setLeftPortID(String leftPortID) {\r
-        this.leftPortID = leftPortID;\r
-    }\r
-\r
-    public String getRightNodeID() {\r
-        return rightNodeID;\r
-    }\r
-\r
-    public void setRightNodeID(String rightNodeID) {\r
-        this.rightNodeID = rightNodeID;\r
-    }\r
-\r
-    private String rightNodeID;\r
-\r
-    public String getRightPortID() {\r
-        return rightPortID;\r
-    }\r
-\r
-    public void setRightPortID(String rightPortID) {\r
-        this.rightPortID = rightPortID;\r
-    }\r
-\r
-    public String getLinkBandwidth() {\r
-        return linkBandwidth;\r
-    }\r
-\r
-    public void setLinkBandwidth(String linkBandwidth) {\r
-        this.linkBandwidth = linkBandwidth;\r
-    }\r
-\r
-}
\ No newline at end of file
diff --git a/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/entity/NodeBean.java b/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/entity/NodeBean.java
deleted file mode 100644 (file)
index c503726..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*\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
-package org.opendaylight.nemo.renderer.openflow.entity;\r
-\r
-import org.opendaylight.nemo.renderer.openflow.entity.PortBean;\r
-import java.util.List;\r
-\r
-public class NodeBean {\r
-\r
-    private String nodeID;\r
-    private String nodeType;\r
-    private String nodeCapacity;\r
-    private List<PortBean> portList;\r
-\r
-    public String getNodeID() {\r
-        return nodeID;\r
-    }\r
-\r
-    public void setNodeID(String nodeID) {\r
-        this.nodeID = nodeID;\r
-    }\r
-\r
-    public String getNodeType() {\r
-        return nodeType;\r
-    }\r
-\r
-    public void setNodeType(String nodeType) {\r
-        this.nodeType = nodeType;\r
-    }\r
-\r
-    public String getNodeCapacity() {\r
-        return nodeCapacity;\r
-    }\r
-\r
-    public void setNodeCapacity(String nodeCapacity) {\r
-        this.nodeCapacity = nodeCapacity;\r
-    }\r
-\r
-    public List<PortBean> getPortList() {\r
-        return portList;\r
-    }\r
-\r
-    public void setPortList(List<PortBean> portList) {\r
-        this.portList = portList;\r
-    }\r
-\r
-}\r
-\r
diff --git a/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/entity/PortBean.java b/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/entity/PortBean.java
deleted file mode 100644 (file)
index f369677..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/*\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
-package org.opendaylight.nemo.renderer.openflow.entity;\r
-\r
-public class PortBean {\r
-\r
-    private String portID;\r
-    private String portIPAddress;\r
-    private String mask;\r
-    private String location;\r
-    private String bandwidth;\r
-\r
-    public String getPortID() {\r
-        return portID;\r
-    }\r
-\r
-    public void setPortID(String portID) {\r
-        this.portID = portID;\r
-    }\r
-\r
-    public String getPortIPAddress() {\r
-        return portIPAddress;\r
-    }\r
-\r
-    public void setPortIPAddress(String portIPAddress) {\r
-        this.portIPAddress = portIPAddress;\r
-    }\r
-\r
-    public String getMask() {\r
-        return mask;\r
-    }\r
-\r
-    public void setMask(String mask) {\r
-        this.mask = mask;\r
-    }\r
-\r
-    public String getLocation() {\r
-        return location;\r
-    }\r
-\r
-    public void setLocation(String location) {\r
-        this.location = location;\r
-    }\r
-\r
-    public String getBandwidth() {\r
-        return bandwidth;\r
-    }\r
-\r
-    public void setBandwidth(String bandwidth) {\r
-        this.bandwidth = bandwidth;\r
-    }\r
-}\r
diff --git a/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/entity/ResourceBean.java b/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/entity/ResourceBean.java
deleted file mode 100644 (file)
index d3085d9..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.nemo.renderer.openflow.entity;
-import org.opendaylight.nemo.renderer.openflow.entity.NodeBean;
-import org.opendaylight.nemo.renderer.openflow.entity.LinkBean;
-import org.opendaylight.nemo.renderer.openflow.entity.HostBean;
-
-import java.util.List;
-
-public class ResourceBean {
-       public List<NodeBean> getNodelist() {
-               return nodelist;
-       }
-
-       public void setNodelist(List<NodeBean> nodelist) {
-               this.nodelist = nodelist;
-       }
-
-       private List<NodeBean> nodelist;
-
-       public List<LinkBean> getLinklist() {
-               return linklist;
-       }
-
-       public void setLinklist(List<LinkBean> linklist) {
-               this.linklist = linklist;
-       }
-
-       private List<LinkBean> linklist;
-
-       public List<HostBean> getHostlist() {
-               return hostlist;
-       }
-
-       public void setHostlist(List<HostBean> hostlist) {
-               this.hostlist = hostlist;
-       }
-
-       private List<HostBean> hostlist;
-       
-       //getter ,setter 
-}
-
diff --git a/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/physicalnetwork/DataBrokerAdapter.java b/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/physicalnetwork/DataBrokerAdapter.java
new file mode 100644 (file)
index 0000000..4885762
--- /dev/null
@@ -0,0 +1,197 @@
+/*
+ * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.nemo.renderer.openflow.physicalnetwork;
+
+import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalNetwork;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.PhysicalHosts;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.PhysicalLinks;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.PhysicalNodes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.hosts.PhysicalHost;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.hosts.PhysicalHostKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLink;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLinkKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNodeKey;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+* Created by hj on 11/6/15.
+*/
+public class DataBrokerAdapter {
+    private static final Logger log = LoggerFactory.getLogger(DataBrokerAdapter.class);
+    final private DataBroker dataBroker;
+    private static final String DEFAULT_TOPOLOGY_ID = "flow:1";
+
+
+    public DataBrokerAdapter(DataBroker dataBroker) {
+        this.dataBroker = dataBroker;
+    }
+
+
+
+    private InstanceIdentifier<PhysicalHost> getPhysicalHostIdentifier(PhysicalHostKey physicalHostKey) {
+        return InstanceIdentifier
+                .builder(PhysicalNetwork.class)
+                .child(PhysicalHosts.class)
+                .child(PhysicalHost.class, physicalHostKey)
+                .build();
+    }
+    private InstanceIdentifier<PhysicalNode> getPhysicalNodeIdentifier(PhysicalNodeKey physicalNodeKey) {
+        return InstanceIdentifier
+                .builder(PhysicalNetwork.class)
+                .child(PhysicalNodes.class)
+                .child(PhysicalNode.class, physicalNodeKey)
+                .build();
+    }
+    private InstanceIdentifier<PhysicalLink> getPhysicalLinkIdentifier(PhysicalLinkKey physicalLinkKey) {
+        return InstanceIdentifier
+                .builder(PhysicalNetwork.class)
+                .child(PhysicalLinks.class)
+                .child(PhysicalLink.class, physicalLinkKey)
+                .build();
+    }
+
+    protected void addPhysicalHost(final PhysicalHost physicalHost) {
+        try {
+            WriteTransaction transaction = dataBroker.newWriteOnlyTransaction();
+            final InstanceIdentifier<PhysicalHost> instanceIdentifier = getPhysicalHostIdentifier(physicalHost.getKey());
+
+            transaction.put(LogicalDatastoreType.OPERATIONAL, instanceIdentifier, physicalHost, true);
+
+            CheckedFuture<Void, TransactionCommitFailedException> future = transaction.submit();
+            Futures.addCallback(future, new FutureCallback<Void>() {
+                @Override
+                public void onFailure(Throwable t) {
+                    log.warn("Could not write PhysicalHost: {}  {}", physicalHost, t);
+                }
+
+                @Override
+                public void onSuccess(Void result) {
+                    //System.out.println("write transaction onSuccess.");
+                    log.debug("Write PhysicalHost transaction onSuccess: {}.", physicalHost);
+                }
+            });
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+    protected boolean addPhysicalNode(final PhysicalNode physicalNode){
+        final boolean[] addResult = {false};
+        try {
+            WriteTransaction t = dataBroker.newWriteOnlyTransaction();
+            InstanceIdentifier<PhysicalNode> identifier = getPhysicalNodeIdentifier(physicalNode.getKey());
+            t.put(LogicalDatastoreType.OPERATIONAL, identifier, physicalNode, true);
+
+            CheckedFuture<Void, TransactionCommitFailedException> future = t.submit();
+            Futures.addCallback(future, new FutureCallback<Void>() {
+                @Override
+                public void onFailure(Throwable t) {
+                    log.warn("Could not write PhysicalNode {} : {}",physicalNode, t);
+                }
+
+                @Override
+                public void onSuccess(Void result) {
+                    addResult[0] = true;
+                    log.debug("write transaction onSuccess.");
+                }
+            });
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return addResult[0];
+    }
+    protected boolean removePhysicalNode(final PhysicalNodeKey nodeKey){
+        final boolean[] removeResult = {false};
+        try {
+            WriteTransaction t = dataBroker.newWriteOnlyTransaction();
+            InstanceIdentifier<PhysicalNode> identifier = getPhysicalNodeIdentifier(nodeKey);
+            t.delete(LogicalDatastoreType.OPERATIONAL, identifier);
+
+            CheckedFuture<Void, TransactionCommitFailedException> future = t.submit();
+            Futures.addCallback(future, new FutureCallback<Void>() {
+                @Override
+                public void onFailure(Throwable t) {
+                    log.error("Could not delete PhysicalNode {} : {}",nodeKey, t);
+                }
+
+                @Override
+                public void onSuccess(Void result) {
+                    removeResult[0]=true;
+                    log.debug("Delete {} transaction onSuccess.",nodeKey);
+                }
+            });
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return removeResult[0];
+    }
+
+    protected void addPhysicalLink(final PhysicalLink physicalLink){
+        try {
+            WriteTransaction transaction = dataBroker.newWriteOnlyTransaction();
+            final InstanceIdentifier<PhysicalLink> linkIdentifier = getPhysicalLinkIdentifier(physicalLink.getKey());
+            transaction.put(LogicalDatastoreType.OPERATIONAL, linkIdentifier, physicalLink, true);
+
+            CheckedFuture<Void, TransactionCommitFailedException> f = transaction.submit();
+            Futures.addCallback(f, new FutureCallback<Void>() {
+                @Override
+                public void onFailure(Throwable t) {
+                    log.warn("Could not put PhysicalLink {} : {}",physicalLink.getKey(), t);
+                }
+
+                @Override
+                public void onSuccess(Void result) {
+                    //System.out.println("write transaction onSuccess.");
+                    log.debug("Put transaction onSuccess:{}.",physicalLink.getKey());
+                }
+            });
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    protected void removePhysicalLink(final PhysicalLinkKey physicalLinkKey){
+        try {
+            WriteTransaction transaction = dataBroker.newWriteOnlyTransaction();
+            final InstanceIdentifier<PhysicalLink> linkIdentifier = getPhysicalLinkIdentifier(physicalLinkKey);
+            transaction.delete(LogicalDatastoreType.OPERATIONAL, linkIdentifier);
+
+            CheckedFuture<Void, TransactionCommitFailedException> f = transaction.submit();
+            Futures.addCallback(f, new FutureCallback<Void>() {
+                @Override
+                public void onFailure(Throwable t) {
+                    log.warn("Could not remove PhysicalLink {} : {}",physicalLinkKey, t);
+                }
+
+                @Override
+                public void onSuccess(Void result) {
+                    //System.out.println("write transaction onSuccess.");
+                    log.debug("Remove transaction onSuccess:{}.", physicalLinkKey);
+                }
+            });
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+}
diff --git a/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/physicalnetwork/OFLinkListener.java b/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/physicalnetwork/OFLinkListener.java
new file mode 100644 (file)
index 0000000..cf28492
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.nemo.renderer.openflow.physicalnetwork;
+
+import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Link;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Created by hj on 11/5/15.
+ */
+public class OFLinkListener implements DataChangeListener {
+    private static final Logger log = LoggerFactory.getLogger(OFLinkListener.class);
+    final private PhysicalNetworkAdapter pnConverter;
+
+    protected OFLinkListener(PhysicalNetworkAdapter pnConverter) {
+        this.pnConverter = pnConverter;
+    }
+
+    @Override
+    public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
+        if (null == change) {
+            return;
+        }
+        Link tmpOfLink = null;
+
+        Map<InstanceIdentifier<?>, DataObject> createdData = change.getCreatedData();
+        if (null != createdData && !createdData.isEmpty()) {
+            for (DataObject data : createdData.values()) {
+                if (!(data instanceof Link)) {
+                    log.warn("PFNodeListener accept an [{}] created event.", data);
+                    break;
+                }
+                tmpOfLink = (Link)data;
+                log.debug("OF link created:{}",tmpOfLink.getKey());
+                pnConverter.ofLinkAdded(tmpOfLink);
+            }
+        }
+
+        Map<InstanceIdentifier<?>, DataObject> updateData = change.getUpdatedData();
+        if (null != updateData && !updateData.isEmpty()) {
+            for (DataObject data : updateData.values()) {
+                if (!(data instanceof Link)) {
+                    log.warn("PFNodeListener accept an [{}] created event.", data);
+                    break;
+                }
+                tmpOfLink = (Link)data;
+                log.debug("OF link updated:{}",tmpOfLink.getKey());
+                pnConverter.ofLinkAdded(tmpOfLink);
+            }
+        }
+
+        Map<InstanceIdentifier<?>, DataObject> originalData = change.getOriginalData();
+        Set<InstanceIdentifier<?>> removedPaths = change.getRemovedPaths();
+
+        if ( null != removedPaths && !removedPaths.isEmpty() ) {
+            DataObject dataObject ;
+            for ( InstanceIdentifier<?> instanceId : removedPaths ) {
+                dataObject = originalData.get(instanceId);
+
+                if ( null != dataObject && dataObject instanceof Link) {
+                    log.debug("OF link removed:{}",((Link)dataObject).getKey());
+                    pnConverter.ofLinkRemoved((Link) dataObject);
+                }
+            }
+        }
+
+    }
+}
diff --git a/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/physicalnetwork/OFNodeListener.java b/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/physicalnetwork/OFNodeListener.java
new file mode 100644 (file)
index 0000000..d6fde36
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.nemo.renderer.openflow.physicalnetwork;
+
+import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Created by hj on 11/5/15.
+ */
+public class OFNodeListener implements DataChangeListener {
+    private static final Logger log = LoggerFactory.getLogger(OFNodeListener.class);
+    final private PhysicalNetworkAdapter pnConverter;
+
+    protected OFNodeListener(PhysicalNetworkAdapter pnConverter) {
+        this.pnConverter = pnConverter;
+    }
+
+    @Override
+    public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
+        if (null == change) {
+            return;
+        }
+        Node tmpOfNode = null;
+
+        Map<InstanceIdentifier<?>, DataObject> createdData = change.getCreatedData();
+        if (null != createdData && !createdData.isEmpty()) {
+            for (DataObject data : createdData.values()) {
+                if (!(data instanceof Node)) {
+                    log.warn("PFNodeListener accept an [{}] created event.", data);
+                    break;
+                }
+                tmpOfNode = (Node)data;
+                log.debug("OF node added:{}",tmpOfNode.getKey());
+                pnConverter.ofNodeAdded(tmpOfNode);
+            }
+        }
+
+        Map<InstanceIdentifier<?>, DataObject> updateData = change.getUpdatedData();
+        if (null != updateData && !updateData.isEmpty()) {
+            for (DataObject data : updateData.values()) {
+                if (!(data instanceof Node)) {
+                    log.warn("PFNodeListener accept an [{}] update event.", data);
+                    break;
+                }
+                tmpOfNode = (Node)data;
+                log.debug("OF node updated:{}",tmpOfNode.getKey());
+                pnConverter.ofNodeAdded(tmpOfNode);
+            }
+        }
+
+        Map<InstanceIdentifier<?>, DataObject> originalData = change.getOriginalData();
+        Set<InstanceIdentifier<?>> removedPaths = change.getRemovedPaths();
+
+        if ( null != removedPaths && !removedPaths.isEmpty() ) {
+            DataObject dataObject ;
+            for ( InstanceIdentifier<?> instanceId : removedPaths ) {
+                dataObject = originalData.get(instanceId);
+
+                if ( null != dataObject && dataObject instanceof Node) {
+                    log.debug("OF node removed:{}",((Node)dataObject).getKey());
+                    pnConverter.ofNodeRemoved((Node)dataObject);
+                }
+            }
+        }
+
+    }
+}
diff --git a/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/physicalnetwork/OFPacketInListener.java b/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/physicalnetwork/OFPacketInListener.java
new file mode 100644 (file)
index 0000000..ac66e28
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.nemo.renderer.openflow.physicalnetwork;
+
+import org.opendaylight.controller.liblldp.EtherTypes;
+import org.opendaylight.controller.liblldp.Ethernet;
+import org.opendaylight.controller.liblldp.NetUtils;
+import org.opendaylight.controller.liblldp.PacketException;
+import org.opendaylight.nemo.renderer.openflow.FlowUtils;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingListener;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketReceived;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Created by hj on 11/10/15.
+ */
+public class OFPacketInListener implements PacketProcessingListener {
+    private static final Logger log = LoggerFactory.getLogger(OFPacketInListener.class);
+    private FlowUtils ofFlowUtils;
+    public OFPacketInListener(FlowUtils ofFlowUtils) {
+        this.ofFlowUtils = ofFlowUtils;
+    }
+
+    @Override
+    public void onPacketReceived(PacketReceived packetReceived) {
+        if (null == packetReceived) {
+            return;
+        }
+        byte[] payload = packetReceived.getPayload();
+        Ethernet ethernet = new Ethernet();
+        try {
+            ethernet.deserialize(payload, 0, NetUtils.NumBitsInAByte * payload.length);
+        } catch (PacketException e) {
+            log.warn("Failed to decode packet in message: {}", packetReceived);
+        }
+        if (EtherTypes.ARP.shortValue() == ethernet.getEtherType()) {
+            NodeConnectorRef ingressNodeConnectorRef = packetReceived.getIngress();
+//            String strNodeId = ingressNodeConnectorRef
+//                    .getValue()
+//                    .firstIdentifierOf(Node.class)
+//                    .firstKeyOf(Node.class)
+//                    .getId()
+//                    .getValue();
+//            String strPortId = ingressNodeConnectorRef
+//                    .getValue()
+//                    .firstIdentifierOf(NodeConnector.class)
+//                    .firstKeyOf(NodeConnector.class)
+//                    .getId()
+//                    .getValue();
+            log.debug("Receive one arp packet in message:\r\n {}.", packetReceived);
+            ofFlowUtils.handleArp(packetReceived,ingressNodeConnectorRef);
+        }
+    }
+}
diff --git a/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/physicalnetwork/PhyConfigLoader.java b/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/physicalnetwork/PhyConfigLoader.java
new file mode 100644 (file)
index 0000000..1f365fd
--- /dev/null
@@ -0,0 +1 @@
+/*\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\rpackage org.opendaylight.nemo.renderer.openflow.physicalnetwork;\r\rimport com.fasterxml.jackson.databind.JsonNode;\rimport com.fasterxml.jackson.databind.ObjectMapper;\rimport com.google.common.collect.HashBasedTable;\rimport com.google.common.collect.Table;\rimport org.opendaylight.controller.md.sal.binding.api.DataBroker;\rimport org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;\rimport org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;\rimport org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalNodeInstance;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalPortInstance;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.attribute.instance.AttributeValueBuilder;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.host.instance.IpAddressesBuilder;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.hosts.PhysicalHost;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.hosts.PhysicalHostBuilder;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.hosts.PhysicalHostKey;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLink;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLinkBuilder;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNode;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNodeBuilder;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNodeKey;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.PhysicalPort;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.PhysicalPortBuilder;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.port.instance.Attribute;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.port.instance.AttributeBuilder;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.port.instance.AttributeKey;\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.*;\rimport org.slf4j.Logger;\rimport org.slf4j.LoggerFactory;\r\rimport java.io.IOException;\rimport java.util.ArrayList;\rimport java.util.HashMap;\rimport java.util.List;\r\rpublic class PhyConfigLoader {\r\r    private static final Logger log = LoggerFactory.getLogger(PhyConfigLoader.class);\r\r    public final static String NODE_PROPERTY = "etc/opendaylight/karaf/nemo-openflow-renderer-node-resource.json";\r    public final static String LINK_PROPERTY = "etc/opendaylight/karaf/nemo-openflow-renderer-link-resource.json";\r    public final static String EXTERNAL_NETWORK_MAC_PROPERTY = "etc/opendaylight/karaf/nemo-openflow-renderer-external-resource.json";\r    public final static String HOST_PROPERTY = "etc/opendaylight/karaf/nemo-openflow-renderer-host-resource.json";\r\r    private final static String NODES = "node";\r    private final static String NODE_ID = "node-id";\r    private final static String NODE_TYPE = "node-type";\r\r    private final static String PORTS = "port";\r    private final static String PORT_ID = "port-id";\r    private final static String PORT_TYPE = "port-type";\r    private final static String PORT_IP = "port-ip-address";\r    private final static String PORT_MAC = "port-mac-address";\r\r    private final static String LINKS = "link";\r    private final static String LINK_ID = "link-id";\r    private final static String SRC_NODE_ID = "left-node-id";\r    private final static String SRC_PORT_ID = "left-port-id";\r    private final static String DST_NODE_ID = "right-node-id";\r    private final static String DST_PORT_ID = "right-port-id";\r    private final static String BANDWIDTH = "link-bandwidth";\r    private final static String METRIC = "metric";\r\r\r    private final static String HOSTS = "host";\r    private final static String HOST_NAME = "name";\r    private final static String HOST_ID = "id";\r    private final static String HOST_IPS = "ip-addresses";\r    private final static String CONNECTOR_ID = "connector-id";\r\r    private final static String EXTERNAL_NETWORK_MAC = "external-network-mac";\r\r    private final static String IP_ADDRESS = "ip-address";\r    private final static String MAC_ADDRESS = "mac-address";\r\r    private final static String ATTRIBUTES = "attribute";\r    private final static String ATTRIBUTE_NAME = "name";\r    private final static String ATTRIBUTE_VALUE = "value";\r\r    protected final static long DEFAULT_LINK_BANDWIDTH = 10240;\r    protected final static long DEFAULT_LINK_DELAY = 1;\r    protected final static short DEFAULT_LINK_LOSS_RATE = 1;\r    private HashMap<PhysicalNodeId, PhysicalNode> physicalNodeHashMap;\r    private HashMap<PhysicalPortId, PhysicalPort> physicalPortHashMap;\r    private HashMap<PhysicalLinkId, PhysicalLink> physicalLinkHashMap;\r    private Table<PhysicalNodeId, PhysicalPortId, MacAddress> externalNetworkMac;\r//    final private DataBroker dataProvider;\r\r    private ObjectMapper objectMapper = null;\r    private DataBrokerAdapter dataBrokerAdapter = null;\r\r\r\r    public PhyConfigLoader(DataBroker dataBroker) {\r        physicalNodeHashMap = new HashMap<PhysicalNodeId, PhysicalNode>();\r        physicalPortHashMap = new HashMap<PhysicalPortId, PhysicalPort>();\r        physicalLinkHashMap = new HashMap<PhysicalLinkId, PhysicalLink>();\r        externalNetworkMac = HashBasedTable.create();\r\r        this.objectMapper = new ObjectMapper();\r        this.dataBrokerAdapter = new DataBrokerAdapter(dataBroker);\r\r        loadNodesPorts();\r        loadLinks();\r        loadHosts();\r        loadExternals();\r    }\r\r    public Table<PhysicalNodeId, PhysicalPortId, MacAddress> getExternalNetworkMac() {\r        return externalNetworkMac;\r    }\r    protected PhysicalNode getPhysicalNode(PhysicalNodeId physicalNodeId){\r        return physicalNodeHashMap.get(physicalNodeId);\r    }\r    protected PhysicalPort getPhysicalPort(PhysicalPortId physicalPortId){\r        return physicalPortHashMap.get(physicalPortId);\r    }\r    protected PhysicalLink getPhysicalLink(PhysicalLinkId physicalLinkId){\r        return physicalLinkHashMap.get(physicalLinkId);\r    }\r    private void loadNodesPorts() {\r        String nodesStr = Utils.readFile(NODE_PROPERTY);\r        try {\r            JsonNode nodeRoot = objectMapper.readTree(nodesStr);\r            List<PhysicalNode> physicalNodes = buildNodes(nodeRoot);\r            for (PhysicalNode physicalNode : physicalNodes) {\r                physicalNodeHashMap.put(physicalNode.getNodeId(), physicalNode);\r                for (PhysicalPort physicalPort : physicalNode.getPhysicalPort()) {\r                    physicalPortHashMap.put(physicalPort.getPortId(), physicalPort);\r                }\r            }\r        } catch (IOException e) {\r            e.printStackTrace();\r        }\r    }\r\r    private void loadLinks() {\r        String linkStr = Utils.readFile(LINK_PROPERTY);\r        try {\r            JsonNode linkRoot = objectMapper.readTree(linkStr);\r            List<PhysicalLink> physicalLinks = buildLinks(linkRoot);\r            for (PhysicalLink physicalLink : physicalLinks) {\r                physicalLinkHashMap.put(physicalLink.getLinkId(), physicalLink);\r            }\r        } catch (IOException e) {\r            e.printStackTrace();\r        }\r    }\r\r    private void loadExternals() {\r        String externalStr = Utils.readFile(EXTERNAL_NETWORK_MAC_PROPERTY);\r        try {\r            JsonNode externalRoot = objectMapper.readTree(externalStr);\r            buildExternals(externalRoot);\r        } catch (IOException e) {\r            e.printStackTrace();\r        }\r    }\r\r    private void loadHosts() {\r        String hostStr = Utils.readFile(HOST_PROPERTY);\r        try {\r            JsonNode hostRoot = objectMapper.readTree(hostStr);\r            List<PhysicalHost> physicalHosts = buildHosts(hostRoot);\r            for (PhysicalHost physicalHost : physicalHosts) {\r                dataBrokerAdapter.addPhysicalHost(physicalHost);\r            }\r        } catch (IOException e) {\r            e.printStackTrace();\r        }\r    }\r\r    private void buildExternals(JsonNode externalRoot) {\r        JsonNode exNetworkNodes = externalRoot.path(EXTERNAL_NETWORK_MAC);\r        log.debug("Build external network mac : {} .", exNetworkNodes);\r        for (int i = 0; i < exNetworkNodes.size(); i++) {\r            log.debug("Build external network execution body");\r            JsonNode exNetworkNode = exNetworkNodes.get(i);\r            buildExNetwork(exNetworkNode);\r        }\r    }\r    private void buildExNetwork(JsonNode exNetwork){\r        String nodeId = exNetwork.get(NODE_ID).asText();\r        String portId = exNetwork.get(PORT_ID).asText();\r        String peerMac = exNetwork.get(MAC_ADDRESS).asText();\r        PhysicalNodeId accessNodeId = new PhysicalNodeId(nodeId);\r        PhysicalPortId accessPortId = new PhysicalPortId(portId);\r        MacAddress macAddress = new MacAddress(peerMac);\r        externalNetworkMac.put(accessNodeId,accessPortId,macAddress);\r    }\r\r    private List<PhysicalNode> buildNodes(JsonNode nodesRoot) {\r        List<PhysicalNode> physicalNodes = new ArrayList<PhysicalNode>();\r        JsonNode nodes = nodesRoot.path(NODES);\r        log.debug("Build nodes: {} .", nodes);\r        for (int i = 0; i < nodes.size(); i++) {\r            log.debug("build physical node execution body");\r            JsonNode node = nodes.get(i);\r            PhysicalNode phyNode = buildNode(node);\r            if (phyNode != null) {\r                physicalNodes.add(phyNode);\r            }\r        }\r        return physicalNodes;\r    }\r\r    private PhysicalNode buildNode(JsonNode node) {\r        PhysicalNodeBuilder nodeBuilder = new PhysicalNodeBuilder();\r\r        String node_id = node.get(NODE_ID).asText();\r        if (node_id.equals(""))\r            return null;\r        nodeBuilder.setNodeId(new PhysicalNodeId(node_id));\r        PhysicalNodeKey key = new PhysicalNodeKey(nodeBuilder.getNodeId());\r        nodeBuilder.setKey(key);\r\r        String strType = node.get(NODE_TYPE).asText();\r        PhysicalNodeInstance.NodeType nodeType = Utils.getNodeType(strType);\r        nodeBuilder.setNodeType(nodeType);\r\r        JsonNode ports = node.path(PORTS);\r        List<PhysicalPort> phyPortList = buildPorts(ports);\r        nodeBuilder.setPhysicalPort(phyPortList);\r\r        JsonNode attributes = node.path(ATTRIBUTES);\r        nodeBuilder.setAttribute(buildNodeAttributes(attributes));\r\r        return nodeBuilder.build();\r    }\r\r    private List<PhysicalPort> buildPorts(JsonNode ports) {\r        List<PhysicalPort> phyPortList = new ArrayList<PhysicalPort>();\r        for (int j = 0; j < ports.size(); j++) {\r            //JsonNode port = portIt.next();\r            JsonNode port = ports.get(j);\r            PhysicalPort physicalPort = buildPort(port);\r            if (physicalPort != null) {\r                phyPortList.add(physicalPort);\r            }\r        }\r        return phyPortList;\r    }\r\r    private PhysicalPort buildPort(JsonNode port) {\r        PhysicalPortBuilder physicalPortBuilder = new PhysicalPortBuilder();\r\r        String strPortId = port.get(PORT_ID).asText();\r        physicalPortBuilder.setPortId(new PhysicalPortId(strPortId));\r\r        String strType = port.get(PORT_TYPE).asText();\r        PhysicalPortInstance.PortType portType = Utils.getPortType(strType);\r        physicalPortBuilder.setPortType(portType);\r\r//        String strMac = port.get(PORT_MAC).asText();\r//        MacAddress macAddress = new MacAddress(strMac);\r//        physicalPortBuilder.setMacAddress(macAddress);\r//\r//        long bandWidth = port.get(BANDWIDTH).asLong();\r//        physicalPortBuilder.setBandwidth(bandWidth);\r\r        JsonNode portAttributes = port.path(ATTRIBUTES);\r        List<Attribute> attributes = buildPortAttributes(portAttributes);\r        physicalPortBuilder.setAttribute(attributes);\r\r        return physicalPortBuilder.build();\r    }\r\r    private List<Attribute> buildPortAttributes(JsonNode attributes) {\r        List<Attribute> attributeList = new ArrayList<Attribute>();\r        for (int i = 0; i < attributes.size(); i++) {\r            log.debug("build physical port attribute execution body.");\r            JsonNode portAttribute = attributes.get(i);\r            Attribute attribute = buildPortAttribute(portAttribute);\r            if (attribute != null) {\r                attributeList.add(attribute);\r            }\r        }\r        return attributeList;\r    }\r\r    private Attribute buildPortAttribute(JsonNode attribute) {\r        AttributeBuilder attributeBuilder = new AttributeBuilder();\r        String strName = attribute.path(ATTRIBUTE_NAME).asText();\r        if (strName.equals("")) {\r            return null;\r        }\r        attributeBuilder.setAttributeName(new AttributeName(strName));\r        AttributeValueBuilder attributeValueBuilder = new AttributeValueBuilder();\r        String strValue = attribute.path(ATTRIBUTE_VALUE).asText();\r        attributeValueBuilder.setStringValue(strValue);\r        attributeBuilder.setKey(new AttributeKey(attributeBuilder.getAttributeName()));\r        attributeBuilder.setAttributeValue(attributeValueBuilder.build());\r        return attributeBuilder.build();\r    }\r\r    private List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.Attribute> buildNodeAttributes(JsonNode attributes) {\r        List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.Attribute> attributeList =\r                new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.Attribute>();\r        for (int i = 0; i < attributes.size(); i++) {\r            log.debug("build physical port attribute execution body.");\r            JsonNode portAttribute = attributes.get(i);\r            org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.Attribute attribute = buildNodeAttribute(portAttribute);\r            if (attribute != null) {\r                attributeList.add(attribute);\r            }\r        }\r        return attributeList;\r    }\r\r    private org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.Attribute buildNodeAttribute(JsonNode attribute) {\r        org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.AttributeBuilder attributeBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.AttributeBuilder();\r        String strName = attribute.path(ATTRIBUTE_NAME).asText();\r        if (strName.equals("")) {\r            return null;\r        }\r        attributeBuilder.setAttributeName(new AttributeName(strName));\r        AttributeValueBuilder attributeValueBuilder = new AttributeValueBuilder();\r        String strValue = attribute.path(ATTRIBUTE_VALUE).asText();\r        attributeValueBuilder.setStringValue(strValue);\r        attributeBuilder.setKey(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.AttributeKey(attributeBuilder.getAttributeName()));\r        attributeBuilder.setAttributeValue(attributeValueBuilder.build());\r        return attributeBuilder.build();\r    }\r\r\r    private List<PhysicalLink> buildLinks(JsonNode linksRoot) {\r        List<PhysicalLink> physicalLinks = new ArrayList<PhysicalLink>();\r        JsonNode links = linksRoot.path(LINKS);\r        log.debug("Build links: {} .", links);\r        for (int i = 0; i < links.size(); i++) {\r            log.debug("build physical node execution body");\r            JsonNode link = links.get(i);\r            PhysicalLink phyLink = buildLink(link);\r            if (phyLink != null) {\r                physicalLinks.add(phyLink);\r            }\r        }\r        return physicalLinks;\r    }\r\r    private PhysicalLink buildLink(JsonNode linkNode) {\r        PhysicalLinkBuilder linkBuilder = new PhysicalLinkBuilder();\r\r        String strLinkId = linkNode.get(LINK_ID).asText();\r        long metric = linkNode.get(METRIC).asLong();\r\r        linkBuilder.setLinkId(new PhysicalLinkId(strLinkId));\r        linkBuilder.setMetric(metric);\r\r        linkBuilder.setBandwidth(DEFAULT_LINK_BANDWIDTH);\r        linkBuilder.setDelay(DEFAULT_LINK_DELAY);\r        linkBuilder.setLossRate(DEFAULT_LINK_LOSS_RATE);\r\r        return linkBuilder.build();\r    }\r\r    private List<PhysicalHost> buildHosts(JsonNode hostsNode) {\r        List<PhysicalHost> physicalHosts = new ArrayList<PhysicalHost>();\r        JsonNode hosts = hostsNode.path(HOSTS);\r        log.debug("Build hosts: {} .", hosts);\r        for (int i = 0; i < hosts.size(); i++) {\r            JsonNode host = hosts.get(i);\r            PhysicalHost physicalHost = buildHost(host);\r            if (physicalHost != null) {\r                physicalHosts.add(physicalHost);\r            }\r        }\r        return physicalHosts;\r    }\r\r    private PhysicalHost buildHost(JsonNode hostNode) {\r        PhysicalHostBuilder hostBuilder = new PhysicalHostBuilder();\r        hostBuilder.setHostId(new PhysicalHostId(hostNode.get(HOST_ID).asText()));\r        hostBuilder.setKey(new PhysicalHostKey(hostBuilder.getHostId()));\r        hostBuilder.setHostName(new PhysicalHostName(hostNode.get(HOST_NAME).asText()));\r\r        IpAddressesBuilder IpAddrBuilder = new IpAddressesBuilder();\r        List<IpAddress> ipList = new ArrayList<IpAddress>();\r\r        JsonNode ipaddrs = hostNode.path(HOST_IPS);\r        for (int p = 0; p < ipaddrs.size(); p++) {\r            JsonNode ipaddr = ipaddrs.get(p);\r            IpAddress ip = new IpAddress(new Ipv4Address(ipaddr.get(IP_ADDRESS).asText()));\r            ipList.add(ip);\r        }\r\r        IpAddrBuilder.setIpAddress(ipList);\r        hostBuilder.setIpAddresses(IpAddrBuilder.build());\r        MacAddress mac = new MacAddress(hostNode.get(MAC_ADDRESS).asText());\r        hostBuilder.setMacAddress(mac);\r        hostBuilder.setNodeId(new PhysicalNodeId(hostNode.get(NODE_ID).asText()));\r        hostBuilder.setPortId(new PhysicalPortId(hostNode.get(CONNECTOR_ID).asText()));\r\r        return hostBuilder.build();\r    }\r\r\r    public void close()  {\r        physicalLinkHashMap.clear();\r        physicalPortHashMap.clear();\r        physicalNodeHashMap.clear();\r        externalNetworkMac.clear();\r    }\r\r\r}\r
\ No newline at end of file
diff --git a/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/physicalnetwork/PhysicalFlowUtils.java b/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/physicalnetwork/PhysicalFlowUtils.java
new file mode 100644 (file)
index 0000000..501de01
--- /dev/null
@@ -0,0 +1,195 @@
+/*
+ * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.nemo.renderer.openflow.physicalnetwork;
+
+
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActions;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.UUID;
+
+public class PhysicalFlowUtils {
+    private static final Logger LOG = LoggerFactory.getLogger(PhysicalFlowUtils.class);
+    private static final short CONFIG_TABLE_ID = 0;
+    private static final int CONFIG_FLOW_PRIORITY = 0;
+    private static final int ETH_TYPE_ARP = 0x0806;
+    private static final int ETH_TYPE_LLDP = 0x88cc;
+    private final DataBroker dataBroker;
+
+    public PhysicalFlowUtils(DataBroker dataBroker) {
+        this.dataBroker = dataBroker;
+    }
+    /**
+     * Config the lldp flow entry while find one of switch.
+     * @param strNodeId string id of the target node.
+     */
+    public void configLLDPEntry(String strNodeId) {
+
+        WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
+
+        EthernetType ethernetTypeLLDP = new EthernetTypeBuilder().setType(new EtherType((long) ETH_TYPE_LLDP)).build();
+        EthernetMatchBuilder ethernetMatchBuilder = new EthernetMatchBuilder().setEthernetType(ethernetTypeLLDP);
+        EthernetMatch ethernetMatch = ethernetMatchBuilder.build();
+
+        Match match = new MatchBuilder().setEthernetMatch(ethernetMatch).build();
+
+        List<Instruction> instructionList = new LinkedList<Instruction>();
+        List<Action> actionList = new LinkedList<Action>();
+        Uri uri = controllerConnectorId();
+        OutputAction outputAction = new OutputActionBuilder().setOutputNodeConnector(uri).build();
+        OutputActionCase outputActionCase = new OutputActionCaseBuilder().setOutputAction(outputAction).build();
+        Action actionOutput = new ActionBuilder().setOrder(actionList.size()).setAction(outputActionCase).build();
+        actionList.add(actionOutput);
+
+        ApplyActions applyActions = new ApplyActionsBuilder().setAction(actionList).build();
+        ApplyActionsCase applyActionsCase = new ApplyActionsCaseBuilder().setApplyActions(applyActions).build();
+        Instruction instructionApply = new InstructionBuilder().setOrder(instructionList.size()).setInstruction(applyActionsCase).build();
+        instructionList.add(instructionApply);
+
+        Instructions instructions = new InstructionsBuilder().setInstruction(instructionList).build();
+
+        FlowId flowId = new FlowId(UUID.randomUUID().toString());
+        FlowBuilder flowBuilder = baseFlowBuilder().setId(flowId).setTableId(CONFIG_TABLE_ID).setPriority(CONFIG_FLOW_PRIORITY);
+        Flow flow = flowBuilder.setMatch(match).setInstructions(instructions).build();
+
+        NodeId nodeId = new NodeId(strNodeId);
+        InstanceIdentifier<Flow> flowInsId = createFlowPath(nodeId, flow.getTableId(), flow.getId());
+
+        writeTransaction.put(LogicalDatastoreType.CONFIGURATION, flowInsId, flow, true);
+        writeTransaction.submit();
+
+        return;
+    }
+    /**
+     * Config the arp flow entry while find one of switch.
+     * @param strNodeId string id of the target node.
+     */
+    public void configArpPEntry(String strNodeId) {
+
+        WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
+
+        EthernetType ethernetTypeLLDP = new EthernetTypeBuilder().setType(new EtherType((long) ETH_TYPE_ARP)).build();
+        EthernetMatchBuilder ethernetMatchBuilder = new EthernetMatchBuilder().setEthernetType(ethernetTypeLLDP);
+        EthernetMatch ethernetMatch = ethernetMatchBuilder.build();
+
+        Match match = new MatchBuilder().setEthernetMatch(ethernetMatch).build();
+
+        List<Instruction> instructionList = new LinkedList<Instruction>();
+        List<Action> actionList = new LinkedList<Action>();
+        Uri uri = controllerConnectorId();
+        OutputAction outputAction = new OutputActionBuilder().setOutputNodeConnector(uri).build();
+        OutputActionCase outputActionCase = new OutputActionCaseBuilder().setOutputAction(outputAction).build();
+        Action actionOutput = new ActionBuilder().setOrder(actionList.size()).setAction(outputActionCase).build();
+        actionList.add(actionOutput);
+
+        ApplyActions applyActions = new ApplyActionsBuilder().setAction(actionList).build();
+        ApplyActionsCase applyActionsCase = new ApplyActionsCaseBuilder().setApplyActions(applyActions).build();
+        Instruction instructionApply = new InstructionBuilder().setOrder(instructionList.size()).setInstruction(applyActionsCase).build();
+        instructionList.add(instructionApply);
+
+        Instructions instructions = new InstructionsBuilder().setInstruction(instructionList).build();
+
+        FlowId flowId = new FlowId(UUID.randomUUID().toString());
+        FlowBuilder flowBuilder = baseFlowBuilder().setId(flowId).setTableId(CONFIG_TABLE_ID).setPriority(CONFIG_FLOW_PRIORITY);
+        Flow flow = flowBuilder.setMatch(match).setInstructions(instructions).build();
+
+        NodeId nodeId = new NodeId(strNodeId);
+        InstanceIdentifier<Flow> flowInsId = createFlowPath(nodeId, flow.getTableId(), flow.getId());
+
+        writeTransaction.put(LogicalDatastoreType.CONFIGURATION, flowInsId, flow, true);
+        writeTransaction.submit();
+
+        return;
+    }
+    private Uri controllerConnectorId(){
+        return new Uri(OutputPortValues.CONTROLLER.toString());
+    }
+    /**
+     * TODO
+     *
+     * @author Zhigang Ji
+     * @return TODO
+     */
+    private FlowBuilder baseFlowBuilder() {
+        return new FlowBuilder().setBarrier(false).setHardTimeout(0).setIdleTimeout(0);
+    }
+    /**
+     * TODO
+     *
+     * @author Zhigang Ji
+     * @param nodeId TODO
+     * @param tableId TODO
+     * @param flowId TODO
+     * @return TODO
+     */
+    private InstanceIdentifier<Flow> createFlowPath(NodeId nodeId, Short tableId, FlowId flowId) {
+        return createTablePath(nodeId, tableId).child(Flow.class, new FlowKey(flowId));
+    }
+    /**
+     * TODO
+     *
+     * @author Zhigang Ji
+     * @param nodeId TODO
+     * @param tableId TODO
+     * @return TODO
+     */
+    private InstanceIdentifier<Table> createTablePath(NodeId nodeId, Short tableId) {
+        return createNodePath(nodeId).builder().augmentation(FlowCapableNode.class).child(Table.class, new TableKey(tableId)).build();
+    }
+    /**
+     * TODO
+     *
+     * @author Zhigang Ji
+     * @param nodeId TODO
+     * @return TODO
+     */
+    private InstanceIdentifier<Node> createNodePath(NodeId nodeId) {
+        return InstanceIdentifier.builder(Nodes.class).child(Node.class, new NodeKey(nodeId)).build();
+    }
+}
diff --git a/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/physicalnetwork/PhysicalNetworkAdapter.java b/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/physicalnetwork/PhysicalNetworkAdapter.java
new file mode 100644 (file)
index 0000000..61c3c93
--- /dev/null
@@ -0,0 +1,390 @@
+/*
+ * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.nemo.renderer.openflow.physicalnetwork;
+
+import com.google.common.base.Optional;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
+import org.opendaylight.nemo.renderer.openflow.FlowUtils;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLink;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLinkBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLinkKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNodeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNodeKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.PhysicalPort;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.PhysicalPortBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.PhysicalPortKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalLinkId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalNodeId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalPortId;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Link;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.NotificationListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.concurrent.CountDownLatch;
+
+public class PhysicalNetworkAdapter {
+    private static final Logger log = LoggerFactory.getLogger(PhysicalNetworkAdapter.class);
+    private static final String DEFAULT_TOPOLOGY_ID = "flow:1";
+
+    final private DataBroker dataBroker;
+    private PhyConfigLoader phyConfigLoader;
+    private DataBrokerAdapter dataBrokerAdapter;
+    private PhysicalFlowUtils physicalFlowUtils;
+    private FlowUtils ofFlowUtils;
+    private NotificationProviderService notificationProviderService;
+
+    private CopyOnWriteArraySet<String> nodeIdSet;
+    private CopyOnWriteArraySet<PhysicalLink> physicalLinkSet;
+    private Timer phyTimer;
+    private boolean running = false;
+    private Integer mutex = 0;
+    private ListenerRegistration<NotificationListener> ofPacketInListenerReg;
+    private ListenerRegistration<DataChangeListener> ofNodesListenerReg;
+    private ListenerRegistration<DataChangeListener> ofLinksListenerReg;
+
+    public PhysicalNetworkAdapter(DataBroker dataBroker
+            , NotificationProviderService notificationProviderService
+            , PhyConfigLoader phyConfigLoader
+            , FlowUtils ofFlowUtils) {
+        this.dataBroker = dataBroker;
+        this.notificationProviderService = notificationProviderService;
+        this.ofFlowUtils = ofFlowUtils;
+        this.phyConfigLoader = phyConfigLoader;
+        this.dataBrokerAdapter = new DataBrokerAdapter(dataBroker);
+        physicalFlowUtils = new PhysicalFlowUtils(dataBroker);
+        nodeIdSet = new CopyOnWriteArraySet<String>();
+        physicalLinkSet = new CopyOnWriteArraySet<PhysicalLink>();
+
+        phyTimer = new Timer();
+
+
+        registerListeners();
+        initOFNodes();
+        initOFLinks();
+    }
+
+    public void close() {
+        if (ofPacketInListenerReg != null)
+            ofPacketInListenerReg.close();
+        if (ofLinksListenerReg != null)
+            ofLinksListenerReg.close();
+        if (ofNodesListenerReg != null)
+            ofNodesListenerReg.close();
+        if (phyConfigLoader != null)
+            phyConfigLoader.close();
+        log.debug("Clear....\r\n{}", nodeIdSet);
+        nodeIdSet.clear();
+        physicalLinkSet.clear();
+    }
+
+    public PhyConfigLoader getPhyConfigLoader() {
+        return phyConfigLoader;
+    }
+
+    /**
+     * OFNode instance identifier
+     *
+     * @return
+     */
+    private InstanceIdentifier<Node> getOFNodeInstanceIdentifier() {
+        return InstanceIdentifier.builder(Nodes.class).child(Node.class).build();
+    }
+
+    private InstanceIdentifier<Link> getOFLinkInstanceIdentifier() {
+        return InstanceIdentifier.builder(NetworkTopology.class).child(Topology.class, new TopologyKey(new TopologyId(DEFAULT_TOPOLOGY_ID))).child(Link.class).build();
+    }
+
+    private InstanceIdentifier<Topology> getOFTopologyInstanceIdentifier() {
+        return InstanceIdentifier.builder(NetworkTopology.class).child(Topology.class, new TopologyKey(new TopologyId(DEFAULT_TOPOLOGY_ID))).build();
+    }
+
+    private InstanceIdentifier<Nodes> getOFNodesInstanceIdentifier() {
+        return InstanceIdentifier.builder(Nodes.class).build();
+    }
+
+    private InstanceIdentifier<NodeConnector> getOFPortInstanceIdentifier(NodeKey nodeKey, NodeConnectorKey connectorKey) {
+        return InstanceIdentifier.builder(Nodes.class).child(Node.class, nodeKey).child(NodeConnector.class, connectorKey).build();
+    }
+
+    private void registerListeners() {
+        InstanceIdentifier<Node> nodeInsId = getOFNodeInstanceIdentifier();
+        InstanceIdentifier<Link> linkInsId = getOFLinkInstanceIdentifier();
+        ofNodesListenerReg = dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL, nodeInsId, new OFNodeListener(this), DataChangeScope.BASE);
+        ofLinksListenerReg = dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL, linkInsId, new OFLinkListener(this), DataChangeScope.BASE);
+        ofPacketInListenerReg = notificationProviderService.registerNotificationListener(new OFPacketInListener(ofFlowUtils));
+    }
+
+    private void initOFLinks() {
+        InstanceIdentifier<Topology> topologyInsId = getOFTopologyInstanceIdentifier();
+        ListenableFuture<Optional<Topology>> topologyFuture = dataBroker.newReadOnlyTransaction().read(LogicalDatastoreType.OPERATIONAL, topologyInsId);
+        Futures.addCallback(topologyFuture, new FutureCallback<Optional<Topology>>() {
+            @Override
+            public void onSuccess(Optional<Topology> result) {
+                if (result.isPresent() && result.get() instanceof Topology) {
+                    Topology topology = result.get();
+                    if (topology != null && topology.getLink() != null)
+                        for (Link link : topology.getLink()) {
+                            ofLinkAdded(link);
+                        }
+                }
+
+                return;
+            }
+
+            @Override
+            public void onFailure(Throwable t) {
+                log.error("Can not read the link info of topology {}: {}", DEFAULT_TOPOLOGY_ID, t);
+                return;
+            }
+        });
+    }
+
+    private void initOFNodes() {
+        InstanceIdentifier<Nodes> nodesInsId = getOFNodesInstanceIdentifier();
+        ListenableFuture<Optional<Nodes>> nodesFuture = dataBroker.newReadOnlyTransaction().read(LogicalDatastoreType.OPERATIONAL, nodesInsId);
+        Futures.addCallback(nodesFuture, new FutureCallback<Optional<Nodes>>() {
+            @Override
+            public void onSuccess(Optional<Nodes> result) {
+                if (result.isPresent() && result.get() instanceof Nodes) {
+                    Nodes nodes = result.get();
+                    if (nodes != null && nodes.getNode() != null)
+                        for (Node node : nodes.getNode()) {
+                            ofNodeAdded(node);
+                        }
+                }
+                return;
+            }
+
+            @Override
+            public void onFailure(Throwable t) {
+                log.error("Can not read node information: {}", t);
+                return;
+            }
+        });
+
+    }
+
+    protected void ofNodeAdded(Node node) {
+        log.debug("OF node added: {}.", node.getKey());
+        String strNodeId = node.getId().getValue();
+        //add default flow entry.
+        physicalFlowUtils.configArpPEntry(strNodeId);
+        physicalFlowUtils.configLLDPEntry(strNodeId);
+
+        PhysicalNodeId nodeId = new PhysicalNodeId(strNodeId);
+        PhysicalNodeBuilder nodeBuilder = new PhysicalNodeBuilder();
+        nodeBuilder.setNodeId(nodeId);
+        nodeBuilder.setKey(new PhysicalNodeKey(nodeId));
+        List<PhysicalPort> physicalPortList = new ArrayList<PhysicalPort>();
+        List<NodeConnector> nodeConnectors = node.getNodeConnector();
+        if (nodeConnectors != null) {
+            for (NodeConnector nodeConnector : nodeConnectors) {
+                PhysicalPort physicalPort = getPhysicalPort(node.getKey(), nodeConnector);
+                if (physicalPort != null) {
+                    physicalPortList.add(physicalPort);
+                }
+            }
+        }
+        nodeBuilder.setPhysicalPort(physicalPortList);
+
+        PhysicalNode confPhyNode = phyConfigLoader.getPhysicalNode(nodeId);
+        if (confPhyNode != null) {
+            nodeBuilder.setNodeType(confPhyNode.getNodeType());
+            nodeBuilder.setAttribute(confPhyNode.getAttribute());
+        } else {
+            log.warn("Find one OF Node {},does not have info in config file.", node.getKey());
+        }
+        boolean result = dataBrokerAdapter.addPhysicalNode(nodeBuilder.build());
+//        if (result) {
+        nodeIdSet.add(strNodeId);
+        log.debug("Add....{}\r\n{}", strNodeId, nodeIdSet);
+//        }
+    }
+
+    protected void ofNodeRemoved(Node node) {
+        log.debug("OF node removed: {}.", node.getKey());
+        String strNodeId = node.getId().getValue();
+        PhysicalNodeId nodeId = new PhysicalNodeId(strNodeId);
+        PhysicalNode confPhyNode = phyConfigLoader.getPhysicalNode(nodeId);
+        if (confPhyNode == null) {
+            log.warn("Find one OF Node removed {},does not have info in config file.", node.getKey());
+        }
+        boolean result = dataBrokerAdapter.removePhysicalNode(new PhysicalNodeKey(nodeId));
+//        if (result) {
+        nodeIdSet.remove(strNodeId);
+        log.debug("Remove....{}\r\n{}", strNodeId, nodeIdSet);
+//        }
+    }
+
+    private PhysicalPort getPhysicalPort(NodeKey nodeKey, NodeConnector nodeConnector) {
+        String strConnectorId = nodeConnector.getId().getValue();
+        if (strConnectorId.contains("LOCAL"))
+            return null;
+        PhysicalPortId physicalPortId = new PhysicalPortId(strConnectorId);
+        log.debug("Get port {} : {}.", nodeKey, nodeConnector.getId().getValue());
+        FlowCapableNodeConnector flowCapableNodeConnector = getOFPort(nodeKey, nodeConnector.getKey());
+        if (flowCapableNodeConnector != null) {
+            PhysicalPortBuilder physicalPortBuilder = new PhysicalPortBuilder();
+            physicalPortBuilder.setPortId(physicalPortId);
+            physicalPortBuilder.setKey(new PhysicalPortKey(physicalPortId));
+            physicalPortBuilder.setBandwidth(PhyConfigLoader.DEFAULT_LINK_BANDWIDTH);
+            MacAddress macAddress = flowCapableNodeConnector.getHardwareAddress();
+            physicalPortBuilder.setMacAddress(macAddress);
+
+            PhysicalPort confPhyPort = phyConfigLoader.getPhysicalPort(physicalPortId);
+            if (confPhyPort != null) {
+                log.debug("Set port {} : {}.\r\n {} \r\n{}", nodeKey, nodeConnector.getId().getValue(), confPhyPort.getPortType().toString(), confPhyPort.getAttribute());
+//                long bandwidth = flowCapableNodeConnector.getMaximumSpeed() > 0 ? flowCapableNodeConnector.getMaximumSpeed() : confPhyPort.getBandwidth();
+                physicalPortBuilder.setPortType(confPhyPort.getPortType());
+                physicalPortBuilder.setAttribute(confPhyPort.getAttribute());
+            } else {
+                log.warn("Can not get config info of {}-{} form data broker.", nodeKey.getId(), strConnectorId);
+            }
+            return physicalPortBuilder.build();
+        } else {
+            log.warn("Can not read OF port info of {}-{} form .", nodeKey.getId(), strConnectorId);
+        }
+        return null;
+    }
+
+    private FlowCapableNodeConnector getOFPort(final NodeKey nodeKey, final NodeConnectorKey nodeConnectorKey) {
+        final FlowCapableNodeConnector[] flowCapableNodeConnector = {null};
+
+        InstanceIdentifier<NodeConnector> nodeConnectorInsId = getOFPortInstanceIdentifier(nodeKey, nodeConnectorKey);
+        final CountDownLatch downLatch = new CountDownLatch(1);
+        ListenableFuture<Optional<NodeConnector>> nodeConnectorFuture = dataBroker.newReadOnlyTransaction().read(LogicalDatastoreType.OPERATIONAL, nodeConnectorInsId);
+        Futures.addCallback(nodeConnectorFuture, new FutureCallback<Optional<NodeConnector>>() {
+            @Override
+            public void onSuccess(Optional<NodeConnector> result) {
+                if (result.isPresent() && result.get() instanceof NodeConnector) {
+                    flowCapableNodeConnector[0] = result.get().getAugmentation(FlowCapableNodeConnector.class);
+                    downLatch.countDown();
+                }
+
+                return;
+            }
+
+            @Override
+            public void onFailure(Throwable t) {
+                log.error("Can not read the information of node connector {}-{} : {}", nodeKey, nodeConnectorKey, t);
+                downLatch.countDown();
+                return;
+            }
+        });
+
+        try {
+            downLatch.await();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+
+        return flowCapableNodeConnector[0];
+    }
+
+    protected void ofLinkAdded(Link link) {
+        log.debug("OF link added:{}.", link.getKey());
+
+        String srcNode = link.getSource().getSourceNode().getValue();
+        String srcTp = link.getSource().getSourceTp().getValue();
+        String dstNode = link.getDestination().getDestNode().getValue();
+        String dstTp = link.getDestination().getDestTp().getValue();
+
+        String strLinkId = link.getLinkId().getValue();
+        PhysicalLinkBuilder linkBuilder = new PhysicalLinkBuilder();
+        linkBuilder.setLinkId(new PhysicalLinkId(strLinkId));
+        linkBuilder.setSrcNodeId(new PhysicalNodeId(srcNode));
+        linkBuilder.setSrcPortId(new PhysicalPortId(srcTp));
+        linkBuilder.setDestNodeId(new PhysicalNodeId(dstNode));
+        linkBuilder.setDestPortId(new PhysicalPortId(dstTp));
+
+        linkBuilder.setBandwidth(PhyConfigLoader.DEFAULT_LINK_BANDWIDTH);
+        linkBuilder.setDelay(PhyConfigLoader.DEFAULT_LINK_DELAY);
+        linkBuilder.setLossRate(PhyConfigLoader.DEFAULT_LINK_LOSS_RATE);
+
+        PhysicalLinkId physicalLinkId = new PhysicalLinkId(strLinkId);
+        PhysicalLink physicalLink = phyConfigLoader.getPhysicalLink(physicalLinkId);
+        if (physicalLink != null) {
+            linkBuilder.setMetric(physicalLink.getMetric());
+        } else {
+            log.warn("Can not find conf info of {}.", link.getKey());
+        }
+        synchronized (mutex) {
+            physicalLinkSet.add(linkBuilder.build());
+            if (!running) {
+                phyTimer.schedule(new PhyTransmit(), 10, 100);
+                running = true;
+            }
+        }
+    }
+
+    protected void ofLinkRemoved(Link link) {
+        log.debug("OF link removed:{}.", link.getKey());
+        String strLinkId = link.getLinkId().getValue();
+        PhysicalLinkId linkId = new PhysicalLinkId(strLinkId);
+        PhysicalLink confPhyLink = phyConfigLoader.getPhysicalLink(linkId);
+        if (confPhyLink == null) {
+            log.warn("Can not find conf info of {} while remove.", link);
+        }
+
+        dataBrokerAdapter.removePhysicalLink(new PhysicalLinkKey(linkId));
+    }
+
+    class PhyTransmit extends TimerTask {
+
+        @Override
+        public void run() {
+            synchronized (mutex) {
+                for (PhysicalLink physicalLink : physicalLinkSet) {
+                    handleLink(physicalLink);
+                }
+                if (physicalLinkSet.size() == 0) {
+                    phyTimer.cancel();
+                    running = false;
+                }
+            }
+        }
+
+        private void handleLink(PhysicalLink physicalLink) {
+            String srcNodeId = physicalLink.getSrcNodeId().getValue();
+            String dsrNodeId = physicalLink.getDestNodeId().getValue();
+            if (nodeIdSet.contains(srcNodeId) && nodeIdSet.contains(dsrNodeId)) {
+                physicalLinkSet.remove(physicalLink);
+                log.debug("Put [{}]-[{}] to data broker.", srcNodeId, dsrNodeId);
+                dataBrokerAdapter.addPhysicalLink(physicalLink);
+            }
+        }
+    }
+}
diff --git a/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/physicalnetwork/Utils.java b/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/physicalnetwork/Utils.java
new file mode 100644 (file)
index 0000000..ea7760d
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.nemo.renderer.openflow.physicalnetwork;
+
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalNodeInstance;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalPortInstance;
+
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+/**
+ * Created by hj on 11/5/15.
+ */
+public class Utils {
+
+    protected static PhysicalNodeInstance.NodeType getNodeType(String strType){
+        switch (strType){
+            case "switch":
+                return PhysicalNodeInstance.NodeType.Switch;
+            case "router":
+                return PhysicalNodeInstance.NodeType.Router;
+            case "firewall":
+                return PhysicalNodeInstance.NodeType.Firewall;
+            case "loadbalancer":
+                return PhysicalNodeInstance.NodeType.Loadbalancer;
+        }
+        return null;
+    }
+    protected static PhysicalPortInstance.PortType getPortType(String strType){
+        switch (strType){
+            case "external":
+                return PhysicalPortInstance.PortType.External;
+        }
+        return PhysicalPortInstance.PortType.Internal;
+    }
+    protected static String readFile(String Path){
+        BufferedReader reader = null;
+        String laststr = "";
+        try{
+            FileInputStream fileInputStream = new FileInputStream(Path);
+            InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
+            reader = new BufferedReader(inputStreamReader);
+            String tempString = null;
+            while((tempString = reader.readLine()) != null){
+                laststr += tempString;
+            }
+            reader.close();
+        }catch(IOException e){
+            e.printStackTrace();
+        }finally{
+            if(reader != null){
+                try {
+                    reader.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return laststr;
+    }
+
+}
diff --git a/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/utils/ARP.java b/nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/utils/ARP.java
new file mode 100644 (file)
index 0000000..3150d0c
--- /dev/null
@@ -0,0 +1,278 @@
+/*
+ * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.nemo.renderer.openflow.utils;
+
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.commons.lang3.tuple.Pair;
+import org.opendaylight.controller.liblldp.BitBufferHelper;
+import org.opendaylight.controller.liblldp.Packet;
+
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * Class that represents the ARP packet objects
+ */
+public class ARP extends Packet {
+    private static final String HWTYPE = "HardwareType";
+    private static final String PTYPE = "ProtocolType";
+    private static final String HWADDRLENGTH = "HardwareAddressLength";
+    private static final String PADDRLENGTH = "ProtocolAddressLength";
+    private static final String OPCODE = "OpCode";
+    private static final String SENDERHWADDR = "SenderHardwareAddress";
+    private static final String SENDERPADDR = "SenderProtocolAddress";
+    private static final String TARGETHWADDR = "TargetHardwareAddress";
+    private static final String TARGETPADDR = "TargetProtocolAddress";
+
+    public static short HW_TYPE_ETHERNET = (short) 0x1;
+    public static short REQUEST = (short) 0x1;
+    public static short REPLY = (short) 0x2;
+
+    public static short PROTO_TYPE_IP = 0x800;
+
+    private static Map<String, Pair<Integer, Integer>> fieldCoordinates = new LinkedHashMap<String, Pair<Integer, Integer>>() {
+        private static final long serialVersionUID = 1L;
+        {
+            put(HWTYPE, new ImmutablePair<Integer, Integer>(0, 16));
+            put(PTYPE, new ImmutablePair<Integer, Integer>(16, 16));
+            put(HWADDRLENGTH, new ImmutablePair<Integer, Integer>(32, 8));
+            put(PADDRLENGTH, new ImmutablePair<Integer, Integer>(40, 8));
+            put(OPCODE, new ImmutablePair<Integer, Integer>(48, 16));
+            put(SENDERHWADDR, new ImmutablePair<Integer, Integer>(64, 48));
+            put(SENDERPADDR, new ImmutablePair<Integer, Integer>(112, 32));
+            put(TARGETHWADDR, new ImmutablePair<Integer, Integer>(144, 48));
+            put(TARGETPADDR, new ImmutablePair<Integer, Integer>(192, 32));
+
+        }
+    };
+    private Map<String, byte[]> fieldValues;
+
+    /**
+     * Default constructor that creates and sets the HashMap
+     */
+    public ARP() {
+        super();
+        fieldValues = new HashMap<String, byte[]>();
+        hdrFieldCoordMap = fieldCoordinates;
+        hdrFieldsMap = fieldValues;
+    }
+
+    /**
+     * Constructor that sets the access level for the packet and
+     * creates and sets the HashMap
+     */
+    public ARP(boolean writeAccess) {
+        super(writeAccess);
+        fieldValues = new HashMap<String, byte[]>();
+        hdrFieldCoordMap = fieldCoordinates;
+        hdrFieldsMap = fieldValues;
+    }
+
+    /**
+     * Gets the hardware type from the stored ARP header
+     * @return short - the hardwareType
+     */
+    public short getHardwareType() {
+        return (BitBufferHelper.getShort(fieldValues.get(HWTYPE)));
+
+    }
+
+    /**
+     * Gets the protocol type from the stored ARP header
+     * @return short - the protocolType
+     */
+    public short getProtocolType() {
+        return (BitBufferHelper.getShort(fieldValues.get(PTYPE)));
+    }
+
+    /**
+     * Gets the hardware address length from the stored ARP header
+     * @return byte - the protocolAddressLength
+     */
+    public byte getHardwareAddressLength() {
+        return (BitBufferHelper.getByte(fieldValues.get(HWADDRLENGTH)));
+    }
+
+    /**
+     * Get the protocol address length from Protocol header
+     * @return byte - the protocolAddressLength
+     */
+    public byte getProtocolAddressLength() {
+        return (BitBufferHelper.getByte(fieldValues.get(PADDRLENGTH)));
+    }
+
+    /**
+     * Gets the opCode from stored ARP header
+     * @return short - the opCode
+     */
+    public short getOpCode() {
+        return (BitBufferHelper.getShort(fieldValues.get(OPCODE)));
+    }
+
+    /**
+     * Gets the sender hardware address from the stored ARP header
+     * @return byte[] - the senderHardwareAddress
+     */
+    public byte[] getSenderHardwareAddress() {
+        return (fieldValues.get(SENDERHWADDR));
+    }
+
+    /**
+     * Gets the IP address from the stored ARP header
+     * @return byte[] - the senderProtocolAddress
+     */
+    public byte[] getSenderProtocolAddress() {
+        return (fieldValues.get(SENDERPADDR));
+    }
+
+    /**
+     * Gets the hardware address from the stored ARP header
+     * @return byte[] - the targetHardwareAddress
+     */
+    public byte[] getTargetHardwareAddress() {
+        return (fieldValues.get(TARGETHWADDR));
+    }
+
+    /**
+     * Sets the hardware Type for the current ARP object instance
+     * @param hardwareType - the hardwareType to set
+     * @return ARP
+     */
+    public ARP setHardwareType(short hardwareType) {
+        byte[] hwType = BitBufferHelper.toByteArray(hardwareType);
+        fieldValues.put(HWTYPE, hwType);
+        return this;
+    }
+
+    /**
+     * Sets the protocol Type for the current ARP object instance
+     * @param protocolType - the protocolType to set
+     * @return ARP
+     */
+    public ARP setProtocolType(short protocolType) {
+        byte[] protType = BitBufferHelper.toByteArray(protocolType);
+        fieldValues.put(PTYPE, protType);
+        return this;
+    }
+
+    /**
+     * Sets the hardware address length for the current ARP object instance
+     * @param hardwareAddressLength - the hardwareAddressLength to set
+     * @return ARP
+     */
+    public ARP setHardwareAddressLength(byte hardwareAddressLength) {
+        byte[] hwAddressLength = BitBufferHelper
+                .toByteArray(hardwareAddressLength);
+        fieldValues.put(HWADDRLENGTH, hwAddressLength);
+        return this;
+    }
+
+    /**
+     * Sets the Protocol address for the current ARP object instance
+     * @param protocolAddressLength - the protocolAddressLength to set
+     * @return ARP
+     */
+    public ARP setProtocolAddressLength(byte protocolAddressLength) {
+        byte[] protocolAddrLength = BitBufferHelper
+                .toByteArray(protocolAddressLength);
+        fieldValues.put(PADDRLENGTH, protocolAddrLength);
+        return this;
+    }
+
+    /**
+     * Sets the opCode for the current ARP object instance
+     * @param opCode - the opCode to set
+     * @return ARP
+     */
+    public ARP setOpCode(short opCode) {
+        byte[] operationCode = BitBufferHelper.toByteArray(opCode);
+        fieldValues.put(OPCODE, operationCode);
+        return this;
+    }
+
+    /**
+     * Sets the sender hardware address for the current ARP object instance
+     * @param senderHardwareAddress - the senderHardwareAddress to set
+     * @return ARP
+     */
+    public ARP setSenderHardwareAddress(byte[] senderHardwareAddress) {
+        fieldValues.put(SENDERHWADDR, senderHardwareAddress);
+        return this;
+    }
+
+    /**
+     * Sets the target hardware address for the current ARP object instance
+     * @param targetHardwareAddress - the targetHardwareAddress to set
+     * @return ARP
+     */
+    public ARP setTargetHardwareAddress(byte[] targetHardwareAddress) {
+        fieldValues.put(TARGETHWADDR, targetHardwareAddress);
+        return this;
+    }
+
+    /**
+     * Sets the target protocol address for the current ARP object instance
+     * @param targetProtocolAddress - the targetProtocolAddress to set
+     * @return ARP
+     */
+    public ARP setTargetProtocolAddress(byte[] targetProtocolAddress) {
+        fieldValues.put(TARGETPADDR, targetProtocolAddress);
+        return this;
+    }
+
+    /**
+     * Sets the sender protocol address for the current ARP object instance
+     * @param senderIP - senderIP
+     * @return ARP
+     */
+    public ARP setSenderProtocolAddress(byte[] senderIP) {
+        fieldValues.put(SENDERPADDR, senderIP);
+        return this;
+    }
+
+    /**
+     * Gets the target protocol address
+     * @return - byte[] targetProtocolAddress
+     */
+    public byte[] getTargetProtocolAddress() {
+        return fieldValues.get(TARGETPADDR);
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result
+                + ((fieldValues == null) ? 0 : fieldValues.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!super.equals(obj)) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        ARP other = (ARP) obj;
+        if (fieldValues == null) {
+            if (other.fieldValues != null) {
+                return false;
+            }
+        } else if (!fieldValues.equals(other.fieldValues)) {
+            return false;
+        }
+        return true;
+    }
+}
index 13a67ac704da62bc3630d20a24f97a76e18d956b..1fad7d88adb0aac0d4d3adf4903ac2ce33d86c36 100644 (file)
@@ -9,10 +9,10 @@
 package org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.openflow.renderer.impl.rev151010;
 
 import org.opendaylight.nemo.renderer.openflow.OpenflowRenderer;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-
 public class OpenflowRendererModule extends org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.openflow.renderer.impl.rev151010.AbstractOpenflowRendererModule {
 
     private static final Logger LOG = LoggerFactory.getLogger(OpenflowRenderer.class);
@@ -32,8 +32,10 @@ public class OpenflowRendererModule extends org.opendaylight.yang.gen.v1.urn.ope
 
     @Override
     public java.lang.AutoCloseable createInstance() {
-        LOG.info("Openflow Renderer createInstance()");
-        final OpenflowRenderer renderer = new OpenflowRenderer(getDataBrokerDependency());
+        LOG.debug("Openflow Renderer createInstance()");
+        final OpenflowRenderer renderer = new OpenflowRenderer(
+                getDataBrokerDependency(), getNotificationServiceDependency(),
+                getRpcRegistryDependency().getRpcService(PacketProcessingService.class));
 
         final class CloseResources implements AutoCloseable {
             @Override
@@ -41,9 +43,10 @@ public class OpenflowRendererModule extends org.opendaylight.yang.gen.v1.urn.ope
                 if (renderer != null) {
                     renderer.close();
                 }
-                LOG.info("Openflow Renderer (instance {}) tear down.", this);
+                LOG.debug("Openflow Renderer (instance {}) tear down.", this);
             }
         }
+
         return new CloseResources();
     }
 
diff --git a/nemo-renderers/openflow-renderer/src/main/resources/etc/nemo/resource-bod.json b/nemo-renderers/openflow-renderer/src/main/resources/etc/nemo/resource-bod.json
deleted file mode 100644 (file)
index 8af843a..0000000
+++ /dev/null
@@ -1,435 +0,0 @@
-{\r
-    "physicalnetwork":{\r
-      "node": [\r
-        {\r
-          "node-id": "openflow:1",\r
-          "node-type": "switch",\r
-          "attribute":[\r
-            {\r
-                "name":"location",\r
-                "value":"openflow:1"\r
-            },\r
-            {\r
-                "name":"capacity",\r
-                "value":""\r
-            }\r
-          ],\r
-          "port": [\r
-            {\r
-              "port-id": "openflow:1:1",\r
-              "port-type":"external",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:01:01",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:1:1"\r
-                }\r
-              ]\r
-            },\r
-            {\r
-              "port-id": "openflow:1:2",\r
-              "port-type":"external",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:01:02",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:1:2"\r
-                }\r
-              ]\r
-            },\r
-            {\r
-              "port-id": "openflow:1:3",\r
-              "port-type":"internal",\r
-              "port-ip-address":"",\r
-              "port-mac-address":"00:00:00:00:01:03",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:1:3"\r
-                }\r
-              ]\r
-            }\r
-          ]\r
-        },\r
-        {\r
-          "node-id": "openflow:2",\r
-          "node-type": "switch",\r
-          "attribute":[\r
-            {\r
-                "name":"location",\r
-                "value":"openflow:2"\r
-            },\r
-            {\r
-                "name":"capacity",\r
-                "value":""\r
-            }\r
-          ],\r
-          "port": [\r
-            {\r
-              "port-id": "openflow:2:1",\r
-              "port-type":"external",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:02:01",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:2:1"\r
-                }\r
-              ]\r
-            },\r
-            {\r
-              "port-id": "openflow:2:2",\r
-              "port-type":"external",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"08:00:27:bb:8b:cf",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:2:2"\r
-                }\r
-              ]\r
-            },\r
-            {\r
-              "port-id": "openflow:2:3",\r
-              "port-type":"internal",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:02:03",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:2:3"\r
-                }\r
-              ]\r
-            }\r
-          ]\r
-        },\r
-        {\r
-          "node-id": "openflow:3",\r
-          "node-type": "router",\r
-          "attribute":[\r
-            {\r
-                "name":"location",\r
-                "value":"openflow:3"\r
-            },\r
-            {\r
-                "name":"capacity",\r
-                "value":""\r
-            }\r
-          ],\r
-          "port": [\r
-            {\r
-              "port-id": "openflow:3:1",\r
-              "port-type":"internal",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:03:01",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:3:1"\r
-                }\r
-              ]\r
-            },\r
-            {\r
-              "port-id": "openflow:3:2",\r
-              "port-type":"internal",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:03:02",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:3:2"\r
-                }\r
-              ]\r
-            },\r
-            {\r
-              "port-id": "openflow:3:3",\r
-              "port-type":"internal",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:03:03",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:3:3"\r
-                }\r
-              ]\r
-            },\r
-            {\r
-              "port-id": "openflow:3:4",\r
-              "port-type":"external",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"08:00:27:fb:d1:76",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:3:4"\r
-                }\r
-              ]\r
-            }\r
-          ]\r
-        },\r
-        {\r
-          "node-id": "openflow:4",\r
-          "node-type": "router",\r
-          "attribute":[\r
-            {\r
-                "name":"location",\r
-                "value":"openflow:4"\r
-            },\r
-            {\r
-                "name":"capacity",\r
-                "value":""\r
-            }\r
-          ],\r
-          "port": [\r
-            {\r
-              "port-id": "openflow:4:1",\r
-              "port-type":"internal",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:04:01",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:4:1"\r
-                }\r
-              ]\r
-            },\r
-            {\r
-              "port-id": "openflow:4:2",\r
-              "port-type":"external",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"08:00:27:0a:09:0b",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:4:2"\r
-                }\r
-              ]\r
-            }\r
-          ]\r
-        },\r
-        {\r
-          "node-id": "external:internet-1",\r
-          "node-type": "ext-router",\r
-          "attribute":[\r
-            {\r
-                "name":"location",\r
-                "value":"external:internet-1"\r
-            },\r
-            {\r
-                "name":"capacity",\r
-                "value":""\r
-            }\r
-          ],\r
-          "port": [],\r
-          "mac-address":"08:00:27:40:9c:10",\r
-          "protocol":"static"\r
-        },\r
-        {\r
-          "node-id": "external:enterprise-1",\r
-          "node-type": "ext-router",\r
-          "attribute":[\r
-            {\r
-                "name":"location",\r
-                "value":"external:enterprise-1"\r
-            },\r
-            {\r
-                "name":"capacity",\r
-                "value":""\r
-            }\r
-          ],\r
-          "port": [],\r
-          "mac-address":"08:00:27:0d:ef:79",\r
-          "protocol":"static"\r
-        }\r
-    ],\r
-\r
-\r
-    "link": [\r
-        {\r
-          "link-id":"link_1",\r
-          "left-node-id":"openflow:1",\r
-          "left-port-id":"openflow:1:3",\r
-          "right-node-id":"openflow:3",\r
-          "right-port-id":"openflow:3:1",\r
-          "link-bandwidth":"10240",\r
-          "metric":"1",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-        {\r
-          "link-id":"link_2",\r
-          "left-node-id":"openflow:3",\r
-          "left-port-id":"openflow:3:1",\r
-          "right-node-id":"openflow:1",\r
-          "right-port-id":"openflow:1:3",\r
-          "link-bandwidth":"10240",\r
-          "metric":"1",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-\r
-        {\r
-          "link-id":"link_3",\r
-          "left-node-id":"openflow:2",\r
-          "left-port-id":"openflow:2:3",\r
-          "right-node-id":"openflow:3",\r
-          "right-port-id":"openflow:3:2",\r
-          "link-bandwidth":"10240",\r
-          "metric":"1",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-\r
-        {\r
-          "link-id":"link_4",\r
-          "left-node-id":"openflow:3",\r
-          "left-port-id":"openflow:3:2",\r
-          "right-node-id":"openflow:2",\r
-          "right-port-id":"openflow:2:3",\r
-          "link-bandwidth":"10240",\r
-          "metric":"1",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-\r
-        {\r
-          "link-id":"link_5",\r
-          "left-node-id":"openflow:3",\r
-          "left-port-id":"openflow:3:3",\r
-          "right-node-id":"openflow:4",\r
-          "right-port-id":"openflow:4:1",\r
-          "link-bandwidth":"10240",\r
-          "metric":"1",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-        {\r
-          "link-id":"link_6",\r
-          "left-node-id":"openflow:4",\r
-          "left-port-id":"openflow:4:1",\r
-          "right-node-id":"openflow:3",\r
-          "right-port-id":"openflow:3:3",\r
-          "link-bandwidth":"10240",\r
-          "metric":"1",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-\r
-        {\r
-          "link-id":"link_7",\r
-          "left-node-id":"openflow:3",\r
-          "left-port-id":"openflow:3:4",\r
-          "right-node-id":"external:internet-1",\r
-          "right-port-id":"",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-        {\r
-          "link-id":"link_8",\r
-          "left-node-id":"external:internet-1",\r
-          "left-port-id":"",\r
-          "right-node-id":"openflow:3",\r
-          "right-port-id":"openflow:3:4",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-\r
-        {\r
-          "link-id":"link_9",\r
-          "left-node-id":"openflow:4",\r
-          "left-port-id":"openflow:4:2",\r
-          "right-node-id":"external:enterprise-1",\r
-          "right-port-id":"",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-        {\r
-          "link-id":"link_10",\r
-          "left-node-id":"external:enterprise-1",\r
-          "left-port-id":"",\r
-          "right-node-id":"openflow:4",\r
-          "right-port-id":"openflow:4:2",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        }\r
-    ],\r
-\r
-    "host":[\r
-        {\r
-          "name":"video-server1",\r
-          "id":"7b796915-adf4-4356-b5ca-de005ac410c1",\r
-          "ip-addresses":[\r
-            {"ip-address":"192.168.11.2"}\r
-          ],\r
-          "mac-address":"00:00:00:00:00:03",\r
-          "node-id":"openflow:1",\r
-          "connector-id":"openflow:1:1"\r
-        },\r
-        {\r
-          "name":"vm1",\r
-          "id":"1eaf9a67-a171-42a8-9282-71cf702f61dd",\r
-          "ip-addresses":[\r
-            {"ip-address":"192.168.12.2"}\r
-          ],\r
-          "mac-address":"00:00:00:00:00:01",\r
-          "node-id":"openflow:1",\r
-          "connector-id":"openflow:1:2"\r
-        },\r
-        {\r
-          "name":"vm2",\r
-          "id":"6c787caa-156a-49ed-8546-547bdccf283c",\r
-          "ip-addresses":[\r
-            {"ip-address":"192.168.12.3"}\r
-          ],\r
-          "mac-address":"00:00:00:00:00:02",\r
-          "node-id":"openflow:2",\r
-          "connector-id":"openflow:2:1"\r
-        },\r
-        {\r
-          "name":"video-server2",\r
-          "id":"22282cca-9a13-4d0c-a67e-a933ebb0b0ae",\r
-          "ip-addresses":[\r
-            {"ip-address":"192.168.12.4"}\r
-          ],\r
-          "mac-address":"08:00:27:a0:a9:b3",\r
-          "node-id":"openflow:2",\r
-          "connector-id":"openflow:2:2"\r
-        }\r
-      ]\r
-    }\r
-\r
-}
\ No newline at end of file
diff --git a/nemo-renderers/openflow-renderer/src/main/resources/etc/nemo/resource-servicechain.json b/nemo-renderers/openflow-renderer/src/main/resources/etc/nemo/resource-servicechain.json
deleted file mode 100644 (file)
index d7ca7a8..0000000
+++ /dev/null
@@ -1,612 +0,0 @@
-{\r
-    "physicalnetwork":{\r
-      "node": [\r
-        {\r
-          "node-id": "openflow:1",\r
-          "node-type": "router",\r
-          "attribute":[\r
-            {\r
-                "name":"location",\r
-                "value":"openflow:1"\r
-            },\r
-            {\r
-                "name":"capacity",\r
-                "value":""\r
-            }\r
-          ],\r
-          "port": [\r
-            {\r
-              "port-id": "openflow:1:1",\r
-              "port-type":"external",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:01:01",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:1:1"\r
-                }\r
-              ]\r
-            },\r
-            {\r
-              "port-id": "openflow:1:2",\r
-              "port-type":"external",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:01:02",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:1:2"\r
-                }\r
-              ]\r
-            },\r
-            {\r
-              "port-id": "openflow:1:3",\r
-              "port-type":"internal",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:01:03",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:1:3"\r
-                }\r
-              ]\r
-            }\r
-          ]\r
-        },\r
-        {\r
-          "node-id": "openflow:2",\r
-          "node-type": "router",\r
-          "attribute":[\r
-            {\r
-                "name":"location",\r
-                "value":"openflow:2"\r
-            },\r
-            {\r
-                "name":"capacity",\r
-                "value":""\r
-            }\r
-          ],\r
-          "port": [\r
-            {\r
-              "port-id": "openflow:2:1",\r
-              "port-type":"external",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:02:01",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:2:1"\r
-                }\r
-              ]\r
-            },\r
-            {\r
-              "port-id": "openflow:2:2",\r
-              "port-type":"external",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:02:02",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:2:2"\r
-                }\r
-              ]\r
-            },\r
-            {\r
-              "port-id": "openflow:2:3",\r
-              "port-type":"internal",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:02:03",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:2:3"\r
-                }\r
-              ]\r
-            }\r
-          ]\r
-        },\r
-        {\r
-          "node-id": "openflow:3",\r
-          "node-type": "router",\r
-          "attribute":[\r
-            {\r
-                "name":"location",\r
-                "value":"openflow:3"\r
-            },\r
-            {\r
-                "name":"capacity",\r
-                "value":""\r
-            }\r
-          ],\r
-          "port": [\r
-            {\r
-              "port-id": "openflow:3:1",\r
-              "port-type":"internal",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:03:01",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:3:1"\r
-                }\r
-              ]\r
-            },\r
-            {\r
-              "port-id": "openflow:3:2",\r
-              "port-type":"internal",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:03:02",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:3:2"\r
-                }\r
-              ]\r
-            },\r
-            {\r
-              "port-id": "openflow:3:3",\r
-              "port-type":"internal",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:03:03",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:3:3"\r
-                }\r
-              ]\r
-            },\r
-            {\r
-              "port-id": "openflow:3:4",\r
-              "port-type":"external",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:03:04",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:3:4"\r
-                }\r
-              ]\r
-            }\r
-          ]\r
-        },\r
-        {\r
-          "node-id": "openflow:4",\r
-          "node-type": "router",\r
-          "attribute":[\r
-            {\r
-                "name":"location",\r
-                "value":"openflow:4"\r
-            },\r
-            {\r
-                "name":"capacity",\r
-                "value":""\r
-            }\r
-          ],\r
-          "port": [\r
-            {\r
-              "port-id": "openflow:4:1",\r
-              "port-type":"internal",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:04:01",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:4:1"\r
-                }\r
-              ]\r
-            },\r
-            {\r
-              "port-id": "openflow:4:2",\r
-              "port-type":"external",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:04:02",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:4:2"\r
-                }\r
-              ]\r
-            }\r
-          ]\r
-        },\r
-        {\r
-          "node-id": "external:branch-1",\r
-          "node-type": "ext-router",\r
-          "attribute":[\r
-            {\r
-                "name":"location",\r
-                "value":"external:branch-1"\r
-            },\r
-            {\r
-                "name":"capacity",\r
-                "value":""\r
-            }\r
-          ],\r
-          "port": [],\r
-          "mac-address":"08:00:27:6e:f2:07",\r
-          "protocol":"static"\r
-        },\r
-        {\r
-          "node-id": "external:headquarters-1",\r
-          "node-type": "ext-router",\r
-          "attribute":[\r
-            {\r
-                "name":"location",\r
-                "value":"external:headquarters-1"\r
-            },\r
-            {\r
-                "name":"capacity",\r
-                "value":""\r
-            }\r
-          ],\r
-          "port": [],\r
-          "mac-address":"08:00:27:cb:43:ca",\r
-          "protocol":"static"\r
-        },\r
-        {\r
-          "node-id": "external:fw1",\r
-          "node-type": "ext-router",\r
-          "attribute":[\r
-            {\r
-                "name":"location",\r
-                "value":"external:fw1"\r
-            },\r
-            {\r
-                "name":"capacity",\r
-                "value":"1"\r
-            }\r
-          ],\r
-          "port": [\r
-           {\r
-              "port-id": "fw1:1",\r
-              "port-type":"external",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"08:00:27:65:4c:f6",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"fw1:1"\r
-                }\r
-              ]\r
-            }\r
-          ],\r
-          "mac-address":"08:00:27:65:4c:f6",\r
-          "protocol":"static"\r
-        },\r
-        {\r
-          "node-id": "external:fw2",\r
-          "node-type": "ext-router",\r
-          "attribute":[\r
-            {\r
-                "name":"location",\r
-                "value":"external:fw2"\r
-            },\r
-            {\r
-                "name":"capacity",\r
-                "value":"1"\r
-            }\r
-          ],\r
-          "port": [\r
-           {\r
-              "port-id": "fw2:1",\r
-              "port-type":"external",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:00:01",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"fw2:1"\r
-                }\r
-              ]\r
-            }\r
-          ],\r
-          "mac-address":"00:00:00:00:00:01",\r
-          "protocol":"static"\r
-        },\r
-        {\r
-          "node-id": "external:cache1",\r
-          "node-type": "ext-router",\r
-          "attribute":[\r
-            {\r
-                "name":"location",\r
-                "value":"external:cache1"\r
-            },\r
-            {\r
-                "name":"capacity",\r
-                "value":""\r
-            }\r
-          ],\r
-          "port": [\r
-           {\r
-              "port-id": "cache1:1",\r
-              "port-type":"external",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:00:02",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"cache1:1"\r
-                }\r
-              ]\r
-            }\r
-          ],\r
-          "mac-address":"00:00:00:00:00:02",\r
-          "protocol":"static"\r
-        },\r
-        {\r
-          "node-id": "external:cache2",\r
-          "node-type": "ext-router",\r
-          "attribute":[\r
-            {\r
-                "name":"location",\r
-                "value":"external:cache2"\r
-            },\r
-            {\r
-                "name":"capacity",\r
-                "value":""\r
-            }\r
-          ],\r
-          "port": [\r
-           {\r
-              "port-id": "cache2:1",\r
-              "port-type":"external",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"08:00:27:90:0f:a5",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"cache2:1"\r
-                }\r
-              ]\r
-            }\r
-          ],\r
-          "mac-address":"08:00:27:90:0f:a5",\r
-          "protocol":"static"\r
-        }\r
-    ],\r
-\r
-    "link": [\r
-        {\r
-          "link-id":"link_1",\r
-          "left-node-id":"openflow:1",\r
-          "left-port-id":"openflow:1:3",\r
-          "right-node-id":"openflow:3",\r
-          "right-port-id":"openflow:3:1",\r
-          "link-bandwidth":"10240",\r
-          "metric":"1",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-        {\r
-          "link-id":"link_2",\r
-          "left-node-id":"openflow:3",\r
-          "left-port-id":"openflow:3:1",\r
-          "right-node-id":"openflow:1",\r
-          "right-port-id":"openflow:1:3",\r
-          "link-bandwidth":"10240",\r
-          "metric":"1",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-\r
-        {\r
-          "link-id":"link_3",\r
-          "left-node-id":"openflow:3",\r
-          "left-port-id":"openflow:3:2",\r
-          "right-node-id":"openflow:2",\r
-          "right-port-id":"openflow:2:3",\r
-          "link-bandwidth":"10240",\r
-          "metric":"1",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-        {\r
-          "link-id":"link_4",\r
-          "left-node-id":"openflow:2",\r
-          "left-port-id":"openflow:2:3",\r
-          "right-node-id":"openflow:3",\r
-          "right-port-id":"openflow:3:2",\r
-          "link-bandwidth":"10240",\r
-          "metric":"1",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-\r
-        {\r
-          "link-id":"link_5",\r
-          "left-node-id":"openflow:3",\r
-          "left-port-id":"openflow:3:3",\r
-          "right-node-id":"openflow:4",\r
-          "right-port-id":"openflow:4:1",\r
-          "link-bandwidth":"10240",\r
-          "metric":"1",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-        {\r
-          "link-id":"link_6",\r
-          "left-node-id":"openflow:4",\r
-          "left-port-id":"openflow:4:1",\r
-          "right-node-id":"openflow:3",\r
-          "right-port-id":"openflow:3:3",\r
-          "link-bandwidth":"10240",\r
-          "metric":"1",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-\r
-        {\r
-          "link-id":"link_7",\r
-          "left-node-id":"openflow:3",\r
-          "left-port-id":"openflow:3:4",\r
-          "right-node-id":"external:branch-1",\r
-          "right-port-id":"",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-        {\r
-          "link-id":"link_8",\r
-          "left-node-id":"external:branch-1",\r
-          "left-port-id":"",\r
-          "right-node-id":"openflow:3",\r
-          "right-port-id":"openflow:3:4",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-\r
-        {\r
-          "link-id":"link_9",\r
-          "left-node-id":"openflow:4",\r
-          "left-port-id":"openflow:4:2",\r
-          "right-node-id":"external:headquarters-1",\r
-          "right-port-id":"",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-        {\r
-          "link-id":"link_10",\r
-          "left-node-id":"external:headquarters-1",\r
-          "left-port-id":"",\r
-          "right-node-id":"openflow:4",\r
-          "right-port-id":"openflow:4:2",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-\r
-        {\r
-          "link-id":"link_11",\r
-          "left-node-id":"openflow:1",\r
-          "left-port-id":"openflow:1:1",\r
-          "right-node-id":"external:fw1",\r
-          "right-port-id":"fw1:1",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-        {\r
-          "link-id":"link_12",\r
-          "left-node-id":"external:fw1",\r
-          "left-port-id":"fw1:1",\r
-          "right-node-id":"openflow:1",\r
-          "right-port-id":"openflow:1:1",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-\r
-        {\r
-          "link-id":"link_13",\r
-          "left-node-id":"openflow:1",\r
-          "left-port-id":"openflow:1:2",\r
-          "right-node-id":"external:fw2",\r
-          "right-port-id":"fw2:1",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-        {\r
-          "link-id":"link_14",\r
-          "left-node-id":"external:fw2",\r
-          "left-port-id":"fw2:1",\r
-          "right-node-id":"openflow:1",\r
-          "right-port-id":"openflow:1:2",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-\r
-        {\r
-          "link-id":"link_15",\r
-          "left-node-id":"openflow:2",\r
-          "left-port-id":"openflow:2:1",\r
-          "right-node-id":"external:cache1",\r
-          "right-port-id":"cache1:1",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-        {\r
-          "link-id":"link_16",\r
-          "left-node-id":"external:cache1",\r
-          "left-port-id":"cache1:1",\r
-          "right-node-id":"openflow:2",\r
-          "right-port-id":"openflow:2:1",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-\r
-        {\r
-          "link-id":"link_17",\r
-          "left-node-id":"openflow:2",\r
-          "left-port-id":"openflow:2:2",\r
-          "right-node-id":"external:cache2",\r
-          "right-port-id":"cache2:1",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-        {\r
-          "link-id":"link_18",\r
-          "left-node-id":"external:cache2",\r
-          "left-port-id":"cache2:1",\r
-          "right-node-id":"openflow:2",\r
-          "right-port-id":"openflow:2:2",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        }\r
-    ],\r
-\r
-    "host":[]\r
-  }\r
-\r
-}
\ No newline at end of file
diff --git a/nemo-renderers/openflow-renderer/src/main/resources/etc/nemo/resource.json b/nemo-renderers/openflow-renderer/src/main/resources/etc/nemo/resource.json
deleted file mode 100644 (file)
index d7ca7a8..0000000
+++ /dev/null
@@ -1,612 +0,0 @@
-{\r
-    "physicalnetwork":{\r
-      "node": [\r
-        {\r
-          "node-id": "openflow:1",\r
-          "node-type": "router",\r
-          "attribute":[\r
-            {\r
-                "name":"location",\r
-                "value":"openflow:1"\r
-            },\r
-            {\r
-                "name":"capacity",\r
-                "value":""\r
-            }\r
-          ],\r
-          "port": [\r
-            {\r
-              "port-id": "openflow:1:1",\r
-              "port-type":"external",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:01:01",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:1:1"\r
-                }\r
-              ]\r
-            },\r
-            {\r
-              "port-id": "openflow:1:2",\r
-              "port-type":"external",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:01:02",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:1:2"\r
-                }\r
-              ]\r
-            },\r
-            {\r
-              "port-id": "openflow:1:3",\r
-              "port-type":"internal",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:01:03",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:1:3"\r
-                }\r
-              ]\r
-            }\r
-          ]\r
-        },\r
-        {\r
-          "node-id": "openflow:2",\r
-          "node-type": "router",\r
-          "attribute":[\r
-            {\r
-                "name":"location",\r
-                "value":"openflow:2"\r
-            },\r
-            {\r
-                "name":"capacity",\r
-                "value":""\r
-            }\r
-          ],\r
-          "port": [\r
-            {\r
-              "port-id": "openflow:2:1",\r
-              "port-type":"external",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:02:01",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:2:1"\r
-                }\r
-              ]\r
-            },\r
-            {\r
-              "port-id": "openflow:2:2",\r
-              "port-type":"external",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:02:02",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:2:2"\r
-                }\r
-              ]\r
-            },\r
-            {\r
-              "port-id": "openflow:2:3",\r
-              "port-type":"internal",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:02:03",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:2:3"\r
-                }\r
-              ]\r
-            }\r
-          ]\r
-        },\r
-        {\r
-          "node-id": "openflow:3",\r
-          "node-type": "router",\r
-          "attribute":[\r
-            {\r
-                "name":"location",\r
-                "value":"openflow:3"\r
-            },\r
-            {\r
-                "name":"capacity",\r
-                "value":""\r
-            }\r
-          ],\r
-          "port": [\r
-            {\r
-              "port-id": "openflow:3:1",\r
-              "port-type":"internal",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:03:01",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:3:1"\r
-                }\r
-              ]\r
-            },\r
-            {\r
-              "port-id": "openflow:3:2",\r
-              "port-type":"internal",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:03:02",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:3:2"\r
-                }\r
-              ]\r
-            },\r
-            {\r
-              "port-id": "openflow:3:3",\r
-              "port-type":"internal",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:03:03",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:3:3"\r
-                }\r
-              ]\r
-            },\r
-            {\r
-              "port-id": "openflow:3:4",\r
-              "port-type":"external",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:03:04",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:3:4"\r
-                }\r
-              ]\r
-            }\r
-          ]\r
-        },\r
-        {\r
-          "node-id": "openflow:4",\r
-          "node-type": "router",\r
-          "attribute":[\r
-            {\r
-                "name":"location",\r
-                "value":"openflow:4"\r
-            },\r
-            {\r
-                "name":"capacity",\r
-                "value":""\r
-            }\r
-          ],\r
-          "port": [\r
-            {\r
-              "port-id": "openflow:4:1",\r
-              "port-type":"internal",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:04:01",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:4:1"\r
-                }\r
-              ]\r
-            },\r
-            {\r
-              "port-id": "openflow:4:2",\r
-              "port-type":"external",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:04:02",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"openflow:4:2"\r
-                }\r
-              ]\r
-            }\r
-          ]\r
-        },\r
-        {\r
-          "node-id": "external:branch-1",\r
-          "node-type": "ext-router",\r
-          "attribute":[\r
-            {\r
-                "name":"location",\r
-                "value":"external:branch-1"\r
-            },\r
-            {\r
-                "name":"capacity",\r
-                "value":""\r
-            }\r
-          ],\r
-          "port": [],\r
-          "mac-address":"08:00:27:6e:f2:07",\r
-          "protocol":"static"\r
-        },\r
-        {\r
-          "node-id": "external:headquarters-1",\r
-          "node-type": "ext-router",\r
-          "attribute":[\r
-            {\r
-                "name":"location",\r
-                "value":"external:headquarters-1"\r
-            },\r
-            {\r
-                "name":"capacity",\r
-                "value":""\r
-            }\r
-          ],\r
-          "port": [],\r
-          "mac-address":"08:00:27:cb:43:ca",\r
-          "protocol":"static"\r
-        },\r
-        {\r
-          "node-id": "external:fw1",\r
-          "node-type": "ext-router",\r
-          "attribute":[\r
-            {\r
-                "name":"location",\r
-                "value":"external:fw1"\r
-            },\r
-            {\r
-                "name":"capacity",\r
-                "value":"1"\r
-            }\r
-          ],\r
-          "port": [\r
-           {\r
-              "port-id": "fw1:1",\r
-              "port-type":"external",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"08:00:27:65:4c:f6",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"fw1:1"\r
-                }\r
-              ]\r
-            }\r
-          ],\r
-          "mac-address":"08:00:27:65:4c:f6",\r
-          "protocol":"static"\r
-        },\r
-        {\r
-          "node-id": "external:fw2",\r
-          "node-type": "ext-router",\r
-          "attribute":[\r
-            {\r
-                "name":"location",\r
-                "value":"external:fw2"\r
-            },\r
-            {\r
-                "name":"capacity",\r
-                "value":"1"\r
-            }\r
-          ],\r
-          "port": [\r
-           {\r
-              "port-id": "fw2:1",\r
-              "port-type":"external",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:00:01",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"fw2:1"\r
-                }\r
-              ]\r
-            }\r
-          ],\r
-          "mac-address":"00:00:00:00:00:01",\r
-          "protocol":"static"\r
-        },\r
-        {\r
-          "node-id": "external:cache1",\r
-          "node-type": "ext-router",\r
-          "attribute":[\r
-            {\r
-                "name":"location",\r
-                "value":"external:cache1"\r
-            },\r
-            {\r
-                "name":"capacity",\r
-                "value":""\r
-            }\r
-          ],\r
-          "port": [\r
-           {\r
-              "port-id": "cache1:1",\r
-              "port-type":"external",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"00:00:00:00:00:02",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"cache1:1"\r
-                }\r
-              ]\r
-            }\r
-          ],\r
-          "mac-address":"00:00:00:00:00:02",\r
-          "protocol":"static"\r
-        },\r
-        {\r
-          "node-id": "external:cache2",\r
-          "node-type": "ext-router",\r
-          "attribute":[\r
-            {\r
-                "name":"location",\r
-                "value":"external:cache2"\r
-            },\r
-            {\r
-                "name":"capacity",\r
-                "value":""\r
-            }\r
-          ],\r
-          "port": [\r
-           {\r
-              "port-id": "cache2:1",\r
-              "port-type":"external",\r
-              "port-ip-address": "",\r
-              "port-mac-address":"08:00:27:90:0f:a5",\r
-              "mask": "",\r
-              "bandwidth":"",\r
-              "attribute":[\r
-                {\r
-                    "name":"location",\r
-                    "value":"cache2:1"\r
-                }\r
-              ]\r
-            }\r
-          ],\r
-          "mac-address":"08:00:27:90:0f:a5",\r
-          "protocol":"static"\r
-        }\r
-    ],\r
-\r
-    "link": [\r
-        {\r
-          "link-id":"link_1",\r
-          "left-node-id":"openflow:1",\r
-          "left-port-id":"openflow:1:3",\r
-          "right-node-id":"openflow:3",\r
-          "right-port-id":"openflow:3:1",\r
-          "link-bandwidth":"10240",\r
-          "metric":"1",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-        {\r
-          "link-id":"link_2",\r
-          "left-node-id":"openflow:3",\r
-          "left-port-id":"openflow:3:1",\r
-          "right-node-id":"openflow:1",\r
-          "right-port-id":"openflow:1:3",\r
-          "link-bandwidth":"10240",\r
-          "metric":"1",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-\r
-        {\r
-          "link-id":"link_3",\r
-          "left-node-id":"openflow:3",\r
-          "left-port-id":"openflow:3:2",\r
-          "right-node-id":"openflow:2",\r
-          "right-port-id":"openflow:2:3",\r
-          "link-bandwidth":"10240",\r
-          "metric":"1",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-        {\r
-          "link-id":"link_4",\r
-          "left-node-id":"openflow:2",\r
-          "left-port-id":"openflow:2:3",\r
-          "right-node-id":"openflow:3",\r
-          "right-port-id":"openflow:3:2",\r
-          "link-bandwidth":"10240",\r
-          "metric":"1",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-\r
-        {\r
-          "link-id":"link_5",\r
-          "left-node-id":"openflow:3",\r
-          "left-port-id":"openflow:3:3",\r
-          "right-node-id":"openflow:4",\r
-          "right-port-id":"openflow:4:1",\r
-          "link-bandwidth":"10240",\r
-          "metric":"1",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-        {\r
-          "link-id":"link_6",\r
-          "left-node-id":"openflow:4",\r
-          "left-port-id":"openflow:4:1",\r
-          "right-node-id":"openflow:3",\r
-          "right-port-id":"openflow:3:3",\r
-          "link-bandwidth":"10240",\r
-          "metric":"1",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-\r
-        {\r
-          "link-id":"link_7",\r
-          "left-node-id":"openflow:3",\r
-          "left-port-id":"openflow:3:4",\r
-          "right-node-id":"external:branch-1",\r
-          "right-port-id":"",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-        {\r
-          "link-id":"link_8",\r
-          "left-node-id":"external:branch-1",\r
-          "left-port-id":"",\r
-          "right-node-id":"openflow:3",\r
-          "right-port-id":"openflow:3:4",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-\r
-        {\r
-          "link-id":"link_9",\r
-          "left-node-id":"openflow:4",\r
-          "left-port-id":"openflow:4:2",\r
-          "right-node-id":"external:headquarters-1",\r
-          "right-port-id":"",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-        {\r
-          "link-id":"link_10",\r
-          "left-node-id":"external:headquarters-1",\r
-          "left-port-id":"",\r
-          "right-node-id":"openflow:4",\r
-          "right-port-id":"openflow:4:2",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-\r
-        {\r
-          "link-id":"link_11",\r
-          "left-node-id":"openflow:1",\r
-          "left-port-id":"openflow:1:1",\r
-          "right-node-id":"external:fw1",\r
-          "right-port-id":"fw1:1",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-        {\r
-          "link-id":"link_12",\r
-          "left-node-id":"external:fw1",\r
-          "left-port-id":"fw1:1",\r
-          "right-node-id":"openflow:1",\r
-          "right-port-id":"openflow:1:1",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-\r
-        {\r
-          "link-id":"link_13",\r
-          "left-node-id":"openflow:1",\r
-          "left-port-id":"openflow:1:2",\r
-          "right-node-id":"external:fw2",\r
-          "right-port-id":"fw2:1",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-        {\r
-          "link-id":"link_14",\r
-          "left-node-id":"external:fw2",\r
-          "left-port-id":"fw2:1",\r
-          "right-node-id":"openflow:1",\r
-          "right-port-id":"openflow:1:2",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-\r
-        {\r
-          "link-id":"link_15",\r
-          "left-node-id":"openflow:2",\r
-          "left-port-id":"openflow:2:1",\r
-          "right-node-id":"external:cache1",\r
-          "right-port-id":"cache1:1",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-        {\r
-          "link-id":"link_16",\r
-          "left-node-id":"external:cache1",\r
-          "left-port-id":"cache1:1",\r
-          "right-node-id":"openflow:2",\r
-          "right-port-id":"openflow:2:1",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-\r
-        {\r
-          "link-id":"link_17",\r
-          "left-node-id":"openflow:2",\r
-          "left-port-id":"openflow:2:2",\r
-          "right-node-id":"external:cache2",\r
-          "right-port-id":"cache2:1",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        },\r
-        {\r
-          "link-id":"link_18",\r
-          "left-node-id":"external:cache2",\r
-          "left-port-id":"cache2:1",\r
-          "right-node-id":"openflow:2",\r
-          "right-port-id":"openflow:2:2",\r
-          "link-bandwidth":"10240",\r
-          "metric":"",\r
-          "delay":"",\r
-          "loss-rate":""\r
-        }\r
-    ],\r
-\r
-    "host":[]\r
-  }\r
-\r
-}
\ No newline at end of file
diff --git a/nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/external-resource-bod.json b/nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/external-resource-bod.json
new file mode 100644 (file)
index 0000000..1ded4ed
--- /dev/null
@@ -0,0 +1,14 @@
+{\r
+    "external-network-mac": [\r
+        {\r
+          "node-id":"openflow:3",\r
+          "port-id":"openflow:3:4",\r
+          "mac-address":"08:00:27:40:9c:10"\r
+        },\r
+        {\r
+          "node-id":"openflow:4",\r
+          "port-id":"openflow:4:2",\r
+          "mac-address":"08:00:27:0d:ef:79"\r
+        }\r
+    ]\r
+}
\ No newline at end of file
diff --git a/nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/external-resource-servicechain.json b/nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/external-resource-servicechain.json
new file mode 100644 (file)
index 0000000..15f6845
--- /dev/null
@@ -0,0 +1,34 @@
+{\r
+    "external-network-mac": [\r
+        {\r
+          "node-id":"openflow:3",\r
+          "port-id":"openflow:3:4",\r
+          "mac-address":"08:00:27:6e:f2:07"\r
+        },\r
+        {\r
+          "node-id":"openflow:4",\r
+          "port-id":"openflow:4:2",\r
+          "mac-address":"00:00:00:00:00:03"\r
+        },\r
+        {\r
+          "node-id":"openflow:1",\r
+          "port-id":"openflow:1:1",\r
+          "mac-address":"08:00:27:65:4c:f6"\r
+        },\r
+        {\r
+          "node-id":"openflow:1",\r
+          "port-id":"openflow:1:2",\r
+          "mac-address":"00:00:00:00:00:01"\r
+        },\r
+        {\r
+          "node-id":"openflow:2",\r
+          "port-id":"openflow:2:1",\r
+          "mac-address":"00:00:00:00:00:02"\r
+        },\r
+        {\r
+          "node-id":"openflow:2",\r
+          "port-id":"openflow:2:2",\r
+          "mac-address":"08:00:27:90:0f:a5"\r
+        }\r
+    ]\r
+}
\ No newline at end of file
diff --git a/nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/external-resource.json b/nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/external-resource.json
new file mode 100644 (file)
index 0000000..1ded4ed
--- /dev/null
@@ -0,0 +1,14 @@
+{\r
+    "external-network-mac": [\r
+        {\r
+          "node-id":"openflow:3",\r
+          "port-id":"openflow:3:4",\r
+          "mac-address":"08:00:27:40:9c:10"\r
+        },\r
+        {\r
+          "node-id":"openflow:4",\r
+          "port-id":"openflow:4:2",\r
+          "mac-address":"08:00:27:0d:ef:79"\r
+        }\r
+    ]\r
+}
\ No newline at end of file
diff --git a/nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/host-resource-bod.json b/nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/host-resource-bod.json
new file mode 100644 (file)
index 0000000..9a4c407
--- /dev/null
@@ -0,0 +1,44 @@
+{\r
+    "host":[\r
+        {\r
+          "name":"video-server1",\r
+          "id":"7b796915-adf4-4356-b5ca-de005ac410c1",\r
+          "ip-addresses":[\r
+            {"ip-address":"192.168.11.2"}\r
+          ],\r
+          "mac-address":"00:00:00:00:00:03",\r
+          "node-id":"openflow:1",\r
+          "connector-id":"openflow:1:1"\r
+        },\r
+        {\r
+          "name":"vm1",\r
+          "id":"1eaf9a67-a171-42a8-9282-71cf702f61dd",\r
+          "ip-addresses":[\r
+            {"ip-address":"192.168.12.2"}\r
+          ],\r
+          "mac-address":"00:00:00:00:00:01",\r
+          "node-id":"openflow:1",\r
+          "connector-id":"openflow:1:2"\r
+        },\r
+        {\r
+          "name":"vm2",\r
+          "id":"6c787caa-156a-49ed-8546-547bdccf283c",\r
+          "ip-addresses":[\r
+            {"ip-address":"192.168.12.3"}\r
+          ],\r
+          "mac-address":"00:00:00:00:00:02",\r
+          "node-id":"openflow:2",\r
+          "connector-id":"openflow:2:1"\r
+        },\r
+        {\r
+          "name":"video-server2",\r
+          "id":"22282cca-9a13-4d0c-a67e-a933ebb0b0ae",\r
+          "ip-addresses":[\r
+            {"ip-address":"192.168.12.4"}\r
+          ],\r
+          "mac-address":"08:00:27:a0:a9:b3",\r
+          "node-id":"openflow:2",\r
+          "connector-id":"openflow:2:2"\r
+        }\r
+      ]\r
+}
\ No newline at end of file
diff --git a/nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/host-resource-servicechain.json b/nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/host-resource-servicechain.json
new file mode 100644 (file)
index 0000000..5e3a9a9
--- /dev/null
@@ -0,0 +1,5 @@
+{\r
+    "host":[\r
+\r
+      ]\r
+}
\ No newline at end of file
diff --git a/nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/host-resource.json b/nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/host-resource.json
new file mode 100644 (file)
index 0000000..9a4c407
--- /dev/null
@@ -0,0 +1,44 @@
+{\r
+    "host":[\r
+        {\r
+          "name":"video-server1",\r
+          "id":"7b796915-adf4-4356-b5ca-de005ac410c1",\r
+          "ip-addresses":[\r
+            {"ip-address":"192.168.11.2"}\r
+          ],\r
+          "mac-address":"00:00:00:00:00:03",\r
+          "node-id":"openflow:1",\r
+          "connector-id":"openflow:1:1"\r
+        },\r
+        {\r
+          "name":"vm1",\r
+          "id":"1eaf9a67-a171-42a8-9282-71cf702f61dd",\r
+          "ip-addresses":[\r
+            {"ip-address":"192.168.12.2"}\r
+          ],\r
+          "mac-address":"00:00:00:00:00:01",\r
+          "node-id":"openflow:1",\r
+          "connector-id":"openflow:1:2"\r
+        },\r
+        {\r
+          "name":"vm2",\r
+          "id":"6c787caa-156a-49ed-8546-547bdccf283c",\r
+          "ip-addresses":[\r
+            {"ip-address":"192.168.12.3"}\r
+          ],\r
+          "mac-address":"00:00:00:00:00:02",\r
+          "node-id":"openflow:2",\r
+          "connector-id":"openflow:2:1"\r
+        },\r
+        {\r
+          "name":"video-server2",\r
+          "id":"22282cca-9a13-4d0c-a67e-a933ebb0b0ae",\r
+          "ip-addresses":[\r
+            {"ip-address":"192.168.12.4"}\r
+          ],\r
+          "mac-address":"08:00:27:a0:a9:b3",\r
+          "node-id":"openflow:2",\r
+          "connector-id":"openflow:2:2"\r
+        }\r
+      ]\r
+}
\ No newline at end of file
diff --git a/nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/link-resource-bod.json b/nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/link-resource-bod.json
new file mode 100644 (file)
index 0000000..ac508b4
--- /dev/null
@@ -0,0 +1,42 @@
+{\r
+    "link": [\r
+        {\r
+          "link-id":"openflow:1:3",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        },\r
+        {\r
+          "link-id":"openflow:3:1",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        },\r
+\r
+        {\r
+          "link-id":"openflow:3:2",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        },\r
+        {\r
+          "link-id":"openflow:2:3",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        },\r
+\r
+        {\r
+          "link-id":"openflow:3:3",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        },\r
+        {\r
+          "link-id":"openflow:4:1",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        }\r
+    ]\r
+}
\ No newline at end of file
diff --git a/nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/link-resource-servicechain.json b/nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/link-resource-servicechain.json
new file mode 100644 (file)
index 0000000..ac508b4
--- /dev/null
@@ -0,0 +1,42 @@
+{\r
+    "link": [\r
+        {\r
+          "link-id":"openflow:1:3",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        },\r
+        {\r
+          "link-id":"openflow:3:1",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        },\r
+\r
+        {\r
+          "link-id":"openflow:3:2",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        },\r
+        {\r
+          "link-id":"openflow:2:3",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        },\r
+\r
+        {\r
+          "link-id":"openflow:3:3",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        },\r
+        {\r
+          "link-id":"openflow:4:1",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        }\r
+    ]\r
+}
\ No newline at end of file
diff --git a/nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/link-resource.json b/nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/link-resource.json
new file mode 100644 (file)
index 0000000..ac508b4
--- /dev/null
@@ -0,0 +1,42 @@
+{\r
+    "link": [\r
+        {\r
+          "link-id":"openflow:1:3",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        },\r
+        {\r
+          "link-id":"openflow:3:1",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        },\r
+\r
+        {\r
+          "link-id":"openflow:3:2",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        },\r
+        {\r
+          "link-id":"openflow:2:3",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        },\r
+\r
+        {\r
+          "link-id":"openflow:3:3",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        },\r
+        {\r
+          "link-id":"openflow:4:1",\r
+          "metric":"1",\r
+          "delay":"",\r
+          "loss-rate":""\r
+        }\r
+    ]\r
+}
\ No newline at end of file
diff --git a/nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/node-resource-bod.json b/nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/node-resource-bod.json
new file mode 100644 (file)
index 0000000..420940e
--- /dev/null
@@ -0,0 +1,172 @@
+{\r
+  "node": [\r
+    {\r
+      "node-id": "openflow:1",\r
+      "node-type": "switch",\r
+      "attribute": [\r
+        {\r
+          "name": "location",\r
+          "value": "openflow:1"\r
+        }\r
+      ],\r
+      "port": [\r
+        {\r
+          "port-id": "openflow:1:1",\r
+          "port-type": "external",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:1:1"\r
+            }\r
+          ]\r
+        },\r
+        {\r
+          "port-id": "openflow:1:2",\r
+          "port-type": "external",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:1:2"\r
+            }\r
+          ]\r
+        },\r
+        {\r
+          "port-id": "openflow:1:3",\r
+          "port-type": "internal",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:1:3"\r
+            }\r
+          ]\r
+        }\r
+      ]\r
+    },\r
+    {\r
+      "node-id": "openflow:2",\r
+      "node-type": "switch",\r
+      "attribute": [\r
+        {\r
+          "name": "location",\r
+          "value": "openflow:2"\r
+        }\r
+      ],\r
+      "port": [\r
+        {\r
+          "port-id": "openflow:2:1",\r
+          "port-type": "external",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:2:1"\r
+            }\r
+          ]\r
+        },\r
+        {\r
+          "port-id": "openflow:2:2",\r
+          "port-type": "external",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:2:2"\r
+            }\r
+          ]\r
+        },\r
+        {\r
+          "port-id": "openflow:2:3",\r
+          "port-type": "internal",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:2:3"\r
+            }\r
+          ]\r
+        }\r
+      ]\r
+    },\r
+    {\r
+      "node-id": "openflow:3",\r
+      "node-type": "router",\r
+      "attribute": [\r
+        {\r
+          "name": "location",\r
+          "value": "openflow:3"\r
+        }\r
+      ],\r
+      "port": [\r
+        {\r
+          "port-id": "openflow:3:1",\r
+          "port-type": "internal",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:3:1"\r
+            }\r
+          ]\r
+        },\r
+        {\r
+          "port-id": "openflow:3:2",\r
+          "port-type": "internal",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:3:2"\r
+            }\r
+          ]\r
+        },\r
+        {\r
+          "port-id": "openflow:3:3",\r
+          "port-type": "internal",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:3:3"\r
+            }\r
+          ]\r
+        },\r
+        {\r
+          "port-id": "openflow:3:4",\r
+          "port-type": "external",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:3:4"\r
+            }\r
+          ]\r
+        }\r
+      ]\r
+    },\r
+    {\r
+      "node-id": "openflow:4",\r
+      "node-type": "router",\r
+      "attribute": [\r
+        {\r
+          "name": "location",\r
+          "value": "openflow:4"\r
+        }\r
+      ],\r
+      "port": [\r
+        {\r
+          "port-id": "openflow:4:1",\r
+          "port-type": "internal",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:4:1"\r
+            }\r
+          ]\r
+        },\r
+        {\r
+          "port-id": "openflow:4:2",\r
+          "port-type": "external",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:4:2"\r
+            }\r
+          ]\r
+        }\r
+      ]\r
+    }\r
+  ]\r
+}
\ No newline at end of file
diff --git a/nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/node-resource-servicechain.json b/nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/node-resource-servicechain.json
new file mode 100644 (file)
index 0000000..b883baf
--- /dev/null
@@ -0,0 +1,172 @@
+{\r
+  "node": [\r
+    {\r
+      "node-id": "openflow:1",\r
+      "node-type": "router",\r
+      "attribute": [\r
+        {\r
+          "name": "location",\r
+          "value": "openflow:1"\r
+        }\r
+      ],\r
+      "port": [\r
+        {\r
+          "port-id": "openflow:1:1",\r
+          "port-type": "external",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:1:1"\r
+            }\r
+          ]\r
+        },\r
+        {\r
+          "port-id": "openflow:1:2",\r
+          "port-type": "external",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:1:2"\r
+            }\r
+          ]\r
+        },\r
+        {\r
+          "port-id": "openflow:1:3",\r
+          "port-type": "internal",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:1:3"\r
+            }\r
+          ]\r
+        }\r
+      ]\r
+    },\r
+    {\r
+      "node-id": "openflow:2",\r
+      "node-type": "router",\r
+      "attribute": [\r
+        {\r
+          "name": "location",\r
+          "value": "openflow:2"\r
+        }\r
+      ],\r
+      "port": [\r
+        {\r
+          "port-id": "openflow:2:1",\r
+          "port-type": "external",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:2:1"\r
+            }\r
+          ]\r
+        },\r
+        {\r
+          "port-id": "openflow:2:2",\r
+          "port-type": "external",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:2:2"\r
+            }\r
+          ]\r
+        },\r
+        {\r
+          "port-id": "openflow:2:3",\r
+          "port-type": "internal",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:2:3"\r
+            }\r
+          ]\r
+        }\r
+      ]\r
+    },\r
+    {\r
+      "node-id": "openflow:3",\r
+      "node-type": "router",\r
+      "attribute": [\r
+        {\r
+          "name": "location",\r
+          "value": "openflow:3"\r
+        }\r
+      ],\r
+      "port": [\r
+        {\r
+          "port-id": "openflow:3:1",\r
+          "port-type": "internal",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:3:1"\r
+            }\r
+          ]\r
+        },\r
+        {\r
+          "port-id": "openflow:3:2",\r
+          "port-type": "internal",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:3:2"\r
+            }\r
+          ]\r
+        },\r
+        {\r
+          "port-id": "openflow:3:3",\r
+          "port-type": "internal",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:3:3"\r
+            }\r
+          ]\r
+        },\r
+        {\r
+          "port-id": "openflow:3:4",\r
+          "port-type": "external",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:3:4"\r
+            }\r
+          ]\r
+        }\r
+      ]\r
+    },\r
+    {\r
+      "node-id": "openflow:4",\r
+      "node-type": "router",\r
+      "attribute": [\r
+        {\r
+          "name": "location",\r
+          "value": "openflow:4"\r
+        }\r
+      ],\r
+      "port": [\r
+        {\r
+          "port-id": "openflow:4:1",\r
+          "port-type": "internal",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:4:1"\r
+            }\r
+          ]\r
+        },\r
+        {\r
+          "port-id": "openflow:4:2",\r
+          "port-type": "external",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:4:2"\r
+            }\r
+          ]\r
+        }\r
+      ]\r
+    }\r
+  ]\r
+}
\ No newline at end of file
diff --git a/nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/node-resource.json b/nemo-renderers/openflow-renderer/src/main/resources/etc/opendaylight/karaf/node-resource.json
new file mode 100644 (file)
index 0000000..420940e
--- /dev/null
@@ -0,0 +1,172 @@
+{\r
+  "node": [\r
+    {\r
+      "node-id": "openflow:1",\r
+      "node-type": "switch",\r
+      "attribute": [\r
+        {\r
+          "name": "location",\r
+          "value": "openflow:1"\r
+        }\r
+      ],\r
+      "port": [\r
+        {\r
+          "port-id": "openflow:1:1",\r
+          "port-type": "external",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:1:1"\r
+            }\r
+          ]\r
+        },\r
+        {\r
+          "port-id": "openflow:1:2",\r
+          "port-type": "external",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:1:2"\r
+            }\r
+          ]\r
+        },\r
+        {\r
+          "port-id": "openflow:1:3",\r
+          "port-type": "internal",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:1:3"\r
+            }\r
+          ]\r
+        }\r
+      ]\r
+    },\r
+    {\r
+      "node-id": "openflow:2",\r
+      "node-type": "switch",\r
+      "attribute": [\r
+        {\r
+          "name": "location",\r
+          "value": "openflow:2"\r
+        }\r
+      ],\r
+      "port": [\r
+        {\r
+          "port-id": "openflow:2:1",\r
+          "port-type": "external",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:2:1"\r
+            }\r
+          ]\r
+        },\r
+        {\r
+          "port-id": "openflow:2:2",\r
+          "port-type": "external",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:2:2"\r
+            }\r
+          ]\r
+        },\r
+        {\r
+          "port-id": "openflow:2:3",\r
+          "port-type": "internal",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:2:3"\r
+            }\r
+          ]\r
+        }\r
+      ]\r
+    },\r
+    {\r
+      "node-id": "openflow:3",\r
+      "node-type": "router",\r
+      "attribute": [\r
+        {\r
+          "name": "location",\r
+          "value": "openflow:3"\r
+        }\r
+      ],\r
+      "port": [\r
+        {\r
+          "port-id": "openflow:3:1",\r
+          "port-type": "internal",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:3:1"\r
+            }\r
+          ]\r
+        },\r
+        {\r
+          "port-id": "openflow:3:2",\r
+          "port-type": "internal",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:3:2"\r
+            }\r
+          ]\r
+        },\r
+        {\r
+          "port-id": "openflow:3:3",\r
+          "port-type": "internal",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:3:3"\r
+            }\r
+          ]\r
+        },\r
+        {\r
+          "port-id": "openflow:3:4",\r
+          "port-type": "external",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:3:4"\r
+            }\r
+          ]\r
+        }\r
+      ]\r
+    },\r
+    {\r
+      "node-id": "openflow:4",\r
+      "node-type": "router",\r
+      "attribute": [\r
+        {\r
+          "name": "location",\r
+          "value": "openflow:4"\r
+        }\r
+      ],\r
+      "port": [\r
+        {\r
+          "port-id": "openflow:4:1",\r
+          "port-type": "internal",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:4:1"\r
+            }\r
+          ]\r
+        },\r
+        {\r
+          "port-id": "openflow:4:2",\r
+          "port-type": "external",\r
+          "attribute": [\r
+            {\r
+              "name": "location",\r
+              "value": "openflow:4:2"\r
+            }\r
+          ]\r
+        }\r
+      ]\r
+    }\r
+  ]\r
+}
\ No newline at end of file
diff --git a/nemo-renderers/openflow-renderer/src/test/java/org/opendaylight/nemo/renderer/openflow/FlowTableManagerTest.java b/nemo-renderers/openflow-renderer/src/test/java/org/opendaylight/nemo/renderer/openflow/FlowTableManagerTest.java
deleted file mode 100644 (file)
index 5f15e47..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.opendaylight.nemo.renderer.openflow;
-
-import junit.framework.TestCase;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.Assert;
-import org.opendaylight.nemo.renderer.openflow.FlowTableManager;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.nemo.renderer.openflow.ResourceManager;
-import org.opendaylight.nemo.renderer.openflow.entity.ResourceBean;
-
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.*;
-/**
- * Created by zhangmeng on 2015/11/11.
- */
-public class FlowTableManagerTest extends TestCase {
-    private FlowTableManager flowTableManager;
-    private ResourceManager resourceManager;
-    private DataBroker dataProvider;
-    @Before
-    public void setUp() throws Exception {
-        resourceManager = mock(ResourceManager.class);
-        dataProvider = mock(DataBroker.class);
-
-        flowTableManager = new FlowTableManager(dataProvider,resourceManager);
-    }
-
-    @Test
-    public void testClose() throws Exception {
-        flowTableManager.close();
-       Assert.assertNotNull(flowTableManager);
-    }
-}
\ No newline at end of file
diff --git a/nemo-renderers/openflow-renderer/src/test/java/org/opendaylight/nemo/renderer/openflow/FlowUtilsTest.java b/nemo-renderers/openflow-renderer/src/test/java/org/opendaylight/nemo/renderer/openflow/FlowUtilsTest.java
deleted file mode 100644 (file)
index 86e3168..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-package org.opendaylight.nemo.renderer.openflow;
-
-import junit.framework.TestCase;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.nemo.renderer.openflow.FlowUtils;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.*;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.mpls.ttl._case.DecMplsTtl;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.mpls.ttl._case.DecMplsTtlBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.nw.ttl._case.DecNwTtl;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.nw.ttl._case.DecNwTtlBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputAction;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.mpls.action._case.PopMplsAction;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.mpls.action._case.PopMplsActionBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.mpls.action._case.PushMplsAction;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.mpls.action._case.PushMplsActionBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field._case.SetField;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field._case.SetFieldBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.Meter;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.MeterBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.MeterKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.*;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActions;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.go.to.table._case.GoToTable;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.go.to.table._case.GoToTableBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.metadata._case.WriteMetadata;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.metadata._case.WriteMetadataBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.*;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.BandId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandType;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterFlags;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.Drop;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DropBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.MeterBandHeadersBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeader;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeaderBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeaderKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.meter.band.header.MeterBandTypesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.*;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalNetwork;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.PhysicalLinks;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.PhysicalPaths;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLink;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNode;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.paths.PhysicalPath;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.paths.PhysicalPathBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.PhysicalPort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.VirtualNetwork;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.arps.VirtualArp;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.arps.VirtualArpKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.links.VirtualLink;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.nodes.VirtualNode;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.paths.VirtualPath;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.VirtualPort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.UserIntentVnMapping;
-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;
-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;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.vn.pn.mapping.results.UserVnPnMapping;
-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;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.IntentId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.MatchItemName;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.*;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.operations.Operation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.User;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.flow.instance.MatchItem;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import java.util.ArrayList;
-import java.util.List;
-
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.*;
-/**
- * Created by zhangmeng on 2015/11/11.
- */
-public class FlowUtilsTest extends TestCase {
-    private FlowUtils flowUtils;
-    @Before
-    public void setUp() throws Exception {
-        flowUtils = mock(FlowUtils.class);
-
-    }
-
-    @Test
-    public void testInit() throws Exception {
-        List<PhysicalNode> physicalNodes = new ArrayList<PhysicalNode>();
-
-        flowUtils.init(physicalNodes);
-        verify(flowUtils).init(any(List.class));
-        Assert.assertNotNull(flowUtils);
-    }
-
-    @Test
-    public void testUpdateFlowTable() throws Exception {
-        User user = mock(User.class);
-        VirtualNetwork virtualNetwork = mock(VirtualNetwork.class);
-        UserIntentVnMapping userIntentVnMapping = mock(UserIntentVnMapping.class);
-        UserVnPnMapping userVnPnMapping = mock(UserVnPnMapping.class);
-        PhysicalNetwork physicalNetwor = mock(PhysicalNetwork.class);
-
-        flowUtils.updateFlowTable(user,virtualNetwork,userIntentVnMapping,userVnPnMapping,physicalNetwor);
-        verify(flowUtils).updateFlowTable(
-                any(User.class),
-                any(VirtualNetwork.class),
-                any(UserIntentVnMapping.class),
-                any(UserVnPnMapping.class),
-                any(PhysicalNetwork.class));
-        Assert.assertNotNull(flowUtils);
-    }
-
-    @Test
-    public void testDeleteFlowEntries() throws Exception {
-        UserId userId = mock(UserId.class);
-
-        flowUtils.deleteFlowEntries(userId);
-        verify(flowUtils).deleteFlowEntries(any(UserId.class));
-        Assert.assertNotNull(flowUtils);
-    }
-
-    @Test
-    public void testClose() throws Exception {
-        flowUtils.close();
-        verify(flowUtils).close();
-        Assert.assertNotNull(flowUtils);
-    }
-
-    @Test
-    public void testAssignMPLSLabelForPPath() throws Exception {
-        PhysicalPath physicalPath = mock(PhysicalPath.class);
-        List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLink> physicalLinksList
-                = new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLink>();
-
-        flowUtils.assignMPLSLabelForPPath(physicalPath, physicalLinksList);
-        verify(flowUtils).assignMPLSLabelForPPath(
-                any(PhysicalPath.class),
-                any(List.class));
-        Assert.assertNotNull(flowUtils);
-    }
-}
\ No newline at end of file
diff --git a/nemo-renderers/openflow-renderer/src/test/java/org/opendaylight/nemo/renderer/openflow/OpenflowRendererTest.java b/nemo-renderers/openflow-renderer/src/test/java/org/opendaylight/nemo/renderer/openflow/OpenflowRendererTest.java
deleted file mode 100644 (file)
index 4293818..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.opendaylight.nemo.renderer.openflow;
-
-import junit.framework.TestCase;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.Assert;
-import static org.junit.Assert.*;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.nemo.renderer.openflow.FlowTableManager;
-import org.opendaylight.nemo.renderer.openflow.OpenflowRenderer;
-import org.opendaylight.nemo.renderer.openflow.ResourceManager;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
-import static org.mockito.Mockito.*;
-/**
- * Created by zhangmeng on 2015/11/11.
- */
-public class OpenflowRendererTest extends TestCase {
-    private OpenflowRenderer openflowRenderer;
-    private DataBroker dataBroker;
-    private  ResourceManager resourceManager;
-    private  FlowTableManager flowTableMng;
-    @Before
-    public void setUp() throws Exception {
-        dataBroker = mock(DataBroker.class);
-        openflowRenderer = new OpenflowRenderer(dataBroker);
-    }
-
-    @Test
-    public void testClose() throws Exception {
-       openflowRenderer.close();
-        Assert.assertNotNull(openflowRenderer);
-    }
-}
\ No newline at end of file
diff --git a/nemo-renderers/openflow-renderer/src/test/java/org/opendaylight/nemo/renderer/openflow/ResourceManagerTest.java b/nemo-renderers/openflow-renderer/src/test/java/org/opendaylight/nemo/renderer/openflow/ResourceManagerTest.java
deleted file mode 100644 (file)
index d1b2d7c..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.opendaylight.nemo.renderer.openflow;\r
-import junit.framework.TestCase;\r
-import org.junit.Assert;\r
-import org.junit.Before;\r
-import org.junit.Test;\r
-import org.opendaylight.nemo.renderer.openflow.ResourceManager;\r
-import com.google.common.collect.HashBasedTable;\r
-import com.google.common.collect.Table;\r
-import static org.junit.Assert.*;\r
-import static org.mockito.Mockito.*;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;\r
-\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalNetworkBuilder;\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.PhysicalNodeInstance;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalPortInstance;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.attribute.instance.AttributeValue;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.attribute.instance.AttributeValueBuilder;\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.nodes.PhysicalNodeBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNodeKey;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLink;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLinkBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLinkKey;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.PhysicalPort;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.PhysicalPortBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.PhysicalPortKey;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.port.instance.Attribute;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.port.instance.AttributeBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.port.instance.AttributeKey;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.AttributeName;\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.engine.common.rev151010.PhysicalLinkId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalHostId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalHostName;\r
-\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.hosts.PhysicalHostBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.hosts.PhysicalHostKey;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.hosts.PhysicalHost;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.host.instance.IpAddresses;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.host.instance.IpAddressesBuilder;\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.PhysicalLinks;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.PhysicalHosts;\r
-/**\r
- * Created by zhangmeng on 2015/11/11.\r
- */\r
-public class ResourceManagerTest extends TestCase {\r
-    private ResourceManager resourceManager;\r
-    private Table<PhysicalNodeId, PhysicalPortId, MacAddress> externalNetworkMacTable;\r
-    @Before\r
-    public void setUp() throws Exception {\r
-        resourceManager = mock(ResourceManager.class);\r
-        externalNetworkMacTable = HashBasedTable.create();\r
-    }\r
-\r
-    @Test\r
-    public void testGetExternalNetworkMacTable() throws Exception {\r
-        resourceManager.getExternalNetworkMacTable();\r
-        when(resourceManager.getExternalNetworkMacTable()).thenReturn(externalNetworkMacTable);\r
-        Assert.assertEquals(HashBasedTable.create(),resourceManager.getExternalNetworkMacTable());\r
-    }\r
-\r
-    @Test\r
-    public void testClose() throws Exception {\r
-        resourceManager.close();\r
-        verify(resourceManager).close();\r
-    }\r
-}
\ No newline at end of file
diff --git a/nemo-renderers/openflow-renderer/src/test/java/org/opendaylight/nemo/renderer/openflow/entity/HostBeanTest.java b/nemo-renderers/openflow-renderer/src/test/java/org/opendaylight/nemo/renderer/openflow/entity/HostBeanTest.java
deleted file mode 100644 (file)
index 3a2422f..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-package org.opendaylight.nemo.renderer.openflow.entity;
-
-import junit.framework.TestCase;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.nemo.renderer.openflow.entity.HostBean;
-import java.util.LinkedList;
-import static org.mockito.Mockito.*;
-import java.util.List;
-
-import static org.junit.Assert.*;
-
-/**
- * Created by zhangmeng on 2015/11/8.
- */
-public class HostBeanTest extends TestCase {
-
-    private HostBean hostBean;
-    private String hostName;
-    private List<String>  IPAddressList;
-    private String macAddress;
-    private String nodeID;
-    private String connectorID;
-    @Before
-    public void setUp() throws Exception {
-        hostBean = new HostBean();
-        hostName = null;
-        IPAddressList = new LinkedList<String>();
-        macAddress = null;
-        nodeID = null;
-        connectorID = null;
-    }
-
-    @Test
-    public void testGetHostName() throws Exception {
-        Assert.assertNull(hostBean.getHostName());
-        hostName = "test";
-        hostBean.setHostName(hostName);
-        Assert.assertEquals("test",hostBean.getHostName());
-        hostName = null;
-    }
-
-    @Test
-    public void testSetHostName() throws Exception {
-        Assert.assertNull(hostBean.getHostName());
-        hostName = "test";
-        hostBean.setHostName(hostName);
-        Assert.assertEquals("test",hostBean.getHostName());
-    }
-
-    @Test
-    public void testGetIPAddressList() throws Exception {
-        Assert.assertNull(hostBean.getIPAddressList());
-        IPAddressList.add("test");
-        hostBean.setStringList(IPAddressList);
-        Assert.assertNotNull(hostBean.getIPAddressList());
-        IPAddressList.clear();
-    }
-
-    @Test
-    public void testSetStringList() throws Exception {
-        Assert.assertNull(hostBean.getIPAddressList());
-        IPAddressList.add("test");
-        hostBean.setStringList(IPAddressList);
-        Assert.assertNotNull(hostBean.getIPAddressList());
-    }
-
-    @Test
-    public void testGetMacAddress() throws Exception {
-        Assert.assertNull(hostBean.getMacAddress());
-        macAddress = "test";
-        hostBean.setMacAddress(macAddress);
-        Assert.assertEquals("test",hostBean.getMacAddress());
-        macAddress = null;
-    }
-
-    @Test
-    public void testSetMacAddress() throws Exception {
-        Assert.assertNull(hostBean.getMacAddress());
-        macAddress = "test";
-        hostBean.setMacAddress(macAddress);
-        Assert.assertEquals("test",hostBean.getMacAddress());
-    }
-
-    @Test
-    public void testGetNodeID() throws Exception {
-        Assert.assertNull(hostBean.getNodeID());
-        nodeID = "test";
-        hostBean.setNodeID(nodeID);
-        Assert.assertEquals("test",hostBean.getNodeID());
-        nodeID = null;
-    }
-
-    @Test
-    public void testSetNodeID() throws Exception {
-        Assert.assertNull(hostBean.getNodeID());
-        nodeID = "test";
-        hostBean.setNodeID(nodeID);
-        Assert.assertEquals("test",hostBean.getNodeID());
-    }
-
-    @Test
-    public void testGetConnectorID() throws Exception {
-        Assert.assertNull(hostBean.getConnectorID());
-        connectorID = "test";
-        hostBean.setConnectorID(connectorID);
-        Assert.assertEquals("test",hostBean.getConnectorID());
-        connectorID = null;
-    }
-
-    @Test
-    public void testSetConnectorID() throws Exception {
-        Assert.assertNull(hostBean.getConnectorID());
-        connectorID = "test";
-        hostBean.setConnectorID(connectorID);
-        Assert.assertEquals("test",hostBean.getConnectorID());
-    }
-}
\ No newline at end of file
diff --git a/nemo-renderers/openflow-renderer/src/test/java/org/opendaylight/nemo/renderer/openflow/entity/LinkBeanTest.java b/nemo-renderers/openflow-renderer/src/test/java/org/opendaylight/nemo/renderer/openflow/entity/LinkBeanTest.java
deleted file mode 100644 (file)
index 29cf918..0000000
+++ /dev/null
@@ -1,133 +0,0 @@
-package org.opendaylight.nemo.renderer.openflow.entity;
-
-import junit.framework.TestCase;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.*;
-import java.util.LinkedList;
-import org.opendaylight.nemo.renderer.openflow.entity.LinkBean;
-import static org.mockito.Mockito.*;
-
-import static org.junit.Assert.*;
-
-/**
- * Created by zhangmeng on 2015/11/8.
- */
-public class LinkBeanTest extends TestCase {
-    private LinkBean linkBean;
-
-    private String linkID;
-    private String leftNodeID;
-    private String leftPortID;
-    private String rightPortID;
-    private String rightNodeID;
-    private String linkBandwidth;
-
-    @Before
-    public void setUp() throws Exception {
-        linkBean = new LinkBean();
-        linkID = leftNodeID = leftPortID = rightPortID = rightNodeID = linkBandwidth = null;
-    }
-
-    @Test
-    public void testGetLinkID() throws Exception {
-        Assert.assertNull(linkBean.getLinkID());
-        linkID = "test";
-        linkBean.setLinkID(linkID);
-        Assert.assertEquals(linkID,linkBean.getLinkID());
-        linkID = null;
-    }
-
-    @Test
-    public void testSetLinkID() throws Exception {
-        Assert.assertNull(linkBean.getLinkID());
-        linkID = "test";
-        linkBean.setLinkID(linkID);
-        Assert.assertEquals(linkID,linkBean.getLinkID());
-    }
-
-    @Test
-    public void testGetLeftNodeID() throws Exception {
-        Assert.assertNull(linkBean.getLeftNodeID());
-        leftNodeID = "test";
-        linkBean.setLeftNodeID(leftNodeID);
-        Assert.assertEquals(leftNodeID,linkBean.getLeftNodeID());
-        leftNodeID = null;
-    }
-
-    @Test
-    public void testSetLeftNodeID() throws Exception {
-        Assert.assertNull(linkBean.getLeftNodeID());
-        leftNodeID = "test";
-        linkBean.setLeftNodeID(leftNodeID);
-        Assert.assertEquals(leftNodeID,linkBean.getLeftNodeID());
-    }
-
-    @Test
-    public void testGetLeftPortID() throws Exception {
-        Assert.assertNull(linkBean.getLeftPortID());
-        leftPortID = "test";
-        linkBean.setLeftPortID(leftPortID);
-        Assert.assertEquals(leftPortID,linkBean.getLeftPortID());
-        leftPortID = null;
-    }
-
-    @Test
-    public void testSetLeftPortID() throws Exception {
-        Assert.assertNull(linkBean.getLeftPortID());
-        leftPortID = "test";
-        linkBean.setLeftPortID(leftPortID);
-        Assert.assertEquals(leftPortID,linkBean.getLeftPortID());
-    }
-
-    @Test
-    public void testGetRightNodeID() throws Exception {
-        Assert.assertNull(linkBean.getRightNodeID());
-        rightNodeID = "test";
-        linkBean.setRightNodeID(rightNodeID);
-        Assert.assertEquals(rightNodeID,linkBean.getRightNodeID());
-        rightNodeID = null;
-    }
-
-    @Test
-    public void testSetRightNodeID() throws Exception {
-        Assert.assertNull(linkBean.getRightNodeID());
-        rightNodeID = "test";
-        linkBean.setRightNodeID(rightNodeID);
-        Assert.assertEquals(rightNodeID,linkBean.getRightNodeID());
-    }
-
-    @Test
-    public void testGetRightPortID() throws Exception {
-        Assert.assertNull(linkBean.getRightPortID());
-        rightPortID = "test";
-        linkBean.setRightPortID(rightPortID);
-        Assert.assertEquals(rightPortID,linkBean.getRightPortID());
-        rightPortID = null;
-    }
-
-    @Test
-    public void testSetRightPortID() throws Exception {
-        Assert.assertNull(linkBean.getRightPortID());
-        rightPortID = "test";
-        linkBean.setRightPortID(rightPortID);
-        Assert.assertEquals(rightPortID,linkBean.getRightPortID());
-    }
-
-    @Test
-    public void testGetLinkBandwidth() throws Exception {
-        Assert.assertNull(linkBean.getLinkBandwidth());
-        linkBandwidth = "test";
-        linkBean.setLinkBandwidth(linkBandwidth);
-        Assert.assertEquals(linkBandwidth,linkBean.getLinkBandwidth());
-        linkBandwidth = null;
-    }
-
-    @Test
-    public void testSetLinkBandwidth() throws Exception {
-        Assert.assertNull(linkBean.getLinkBandwidth());
-        linkBandwidth = "test";
-        linkBean.setLinkBandwidth(linkBandwidth);
-        Assert.assertEquals(linkBandwidth,linkBean.getLinkBandwidth());
-    }
-}
\ No newline at end of file
diff --git a/nemo-renderers/openflow-renderer/src/test/java/org/opendaylight/nemo/renderer/openflow/entity/NodeBeanTest.java b/nemo-renderers/openflow-renderer/src/test/java/org/opendaylight/nemo/renderer/openflow/entity/NodeBeanTest.java
deleted file mode 100644 (file)
index 38a39db..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-package org.opendaylight.nemo.renderer.openflow.entity;
-
-import junit.framework.TestCase;
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.nemo.renderer.openflow.entity.NodeBean;
-import org.opendaylight.nemo.renderer.openflow.entity.PortBean;
-import org.junit.*;
-import java.util.LinkedList;
-import java.util.List;
-
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.*;
-
-/**
- * Created by zhangmeng on 2015/11/8.
- */
-public class NodeBeanTest extends TestCase {
-
-    private NodeBean nodeBean;
-    private String nodeID;
-    private String nodeType;
-    private String nodeCapacity;
-    private List<PortBean> portList;
-    @Before
-    public void setUp() throws Exception {
-        nodeBean = new NodeBean();
-        nodeID = nodeType = nodeCapacity = null;
-        portList = new LinkedList<PortBean>();
-    }
-
-    @Test
-    public void testGetNodeID() throws Exception {
-        Assert.assertNull(nodeBean.getNodeID());
-        nodeID = "test";
-        nodeBean.setNodeID(nodeID);
-        Assert.assertEquals(nodeID,nodeBean.getNodeID());
-        nodeID = null;
-    }
-
-    @Test
-    public void testSetNodeID() throws Exception {
-        Assert.assertNull(nodeBean.getNodeID());
-        nodeID = "test";
-        nodeBean.setNodeID(nodeID);
-        Assert.assertEquals(nodeID,nodeBean.getNodeID());
-    }
-
-    @Test
-    public void testGetNodeType() throws Exception {
-        Assert.assertNull(nodeBean.getNodeType());
-        nodeType = "test";
-        nodeBean.setNodeType(nodeType);
-        Assert.assertEquals(nodeType,nodeBean.getNodeType());
-        nodeType = null;
-    }
-
-    @Test
-    public void testSetNodeType() throws Exception {
-        Assert.assertNull(nodeBean.getNodeType());
-        nodeType = "test";
-        nodeBean.setNodeType(nodeType);
-        Assert.assertEquals(nodeType,nodeBean.getNodeType());
-    }
-
-    @Test
-    public void testGetNodeCapacity() throws Exception {
-        Assert.assertNull(nodeBean.getNodeCapacity());
-        nodeCapacity = "test";
-        nodeBean.setNodeCapacity(nodeCapacity);
-        Assert.assertEquals(nodeCapacity,nodeBean.getNodeCapacity());
-        nodeCapacity = null;
-    }
-
-    @Test
-    public void testSetNodeCapacity() throws Exception {
-        Assert.assertNull(nodeBean.getNodeCapacity());
-        nodeCapacity = "test";
-        nodeBean.setNodeCapacity(nodeCapacity);
-        Assert.assertEquals(nodeCapacity,nodeBean.getNodeCapacity());
-    }
-
-    @Test
-    public void testGetPortList() throws Exception {
-        Assert.assertNull(nodeBean.getPortList());
-        portList.add(new PortBean());
-        nodeBean.setPortList(portList);
-        Assert.assertNotNull(nodeBean.getPortList());
-        portList.clear();
-    }
-
-    @Test
-    public void testSetPortList() throws Exception {
-        Assert.assertNull(nodeBean.getPortList());
-        portList.add(new PortBean());
-        nodeBean.setPortList(portList);
-        Assert.assertNotNull(nodeBean.getPortList());
-    }
-}
\ No newline at end of file
diff --git a/nemo-renderers/openflow-renderer/src/test/java/org/opendaylight/nemo/renderer/openflow/entity/PortBeanTest.java b/nemo-renderers/openflow-renderer/src/test/java/org/opendaylight/nemo/renderer/openflow/entity/PortBeanTest.java
deleted file mode 100644 (file)
index 63167fc..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-package org.opendaylight.nemo.renderer.openflow.entity;
-
-import junit.framework.TestCase;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.*;
-import org.opendaylight.nemo.renderer.openflow.entity.PortBean;
-import java.util.LinkedList;
-
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.*;
-
-/**
- * Created by zhangmeng on 2015/11/8.
- */
-public class PortBeanTest extends TestCase {
-    private PortBean portBean;
-    private String portID;
-    private String portIPAddress;
-    private String mask;
-    private String location;
-    private String bandwidth;
-    @Before
-    public void setUp() throws Exception {
-        portBean = new PortBean();
-        portID = portIPAddress = mask = location = bandwidth = null;
-    }
-
-    @Test
-    public void testGetPortID() throws Exception {
-        Assert.assertNull(portBean.getPortID());
-        portID = "test";
-        portBean.setPortID(portID);
-        Assert.assertEquals(portID,portBean.getPortID());
-        portID = null;
-    }
-
-    @Test
-    public void testSetPortID() throws Exception {
-        Assert.assertNull(portBean.getPortID());
-        portID = "test";
-        portBean.setPortID(portID);
-        Assert.assertEquals(portID,portBean.getPortID());
-    }
-
-    @Test
-    public void testGetPortIPAddress() throws Exception {
-        Assert.assertNull(portBean.getPortIPAddress());
-        portIPAddress = "test";
-        portBean.setPortIPAddress(portIPAddress);
-        Assert.assertEquals(portIPAddress,portBean.getPortIPAddress());
-        portIPAddress = null;
-    }
-
-    @Test
-    public void testSetPortIPAddress() throws Exception {
-        Assert.assertNull(portBean.getPortIPAddress());
-        portIPAddress = "test";
-        portBean.setPortIPAddress(portIPAddress);
-        Assert.assertEquals(portIPAddress,portBean.getPortIPAddress());
-    }
-
-    @Test
-    public void testGetMask() throws Exception {
-        Assert.assertNull(portBean.getMask());
-        mask = "test";
-        portBean.setMask(mask);
-        Assert.assertEquals(mask,portBean.getMask());
-        mask = null;
-    }
-
-    @Test
-    public void testSetMask() throws Exception {
-        Assert.assertNull(portBean.getMask());
-        mask = "test";
-        portBean.setMask(mask);
-        Assert.assertEquals(mask,portBean.getMask());
-    }
-
-    @Test
-    public void testGetLocation() throws Exception {
-        Assert.assertNull(portBean.getLocation());
-        location = "test";
-        portBean.setLocation(location);
-        Assert.assertEquals(location,portBean.getLocation());
-        location = null;
-    }
-
-    @Test
-    public void testSetLocation() throws Exception {
-        Assert.assertNull(portBean.getLocation());
-        location = "test";
-        portBean.setLocation(location);
-        Assert.assertEquals(location,portBean.getLocation());
-    }
-
-    @Test
-    public void testGetBandwidth() throws Exception {
-        Assert.assertNull(portBean.getBandwidth());
-        bandwidth = "test";
-        portBean.setBandwidth(bandwidth);
-        Assert.assertEquals(bandwidth,portBean.getBandwidth());
-        bandwidth = null;
-    }
-
-    @Test
-    public void testSetBandwidth() throws Exception {
-        Assert.assertNull(portBean.getBandwidth());
-        bandwidth = "test";
-        portBean.setBandwidth(bandwidth);
-        Assert.assertEquals(bandwidth,portBean.getBandwidth());
-    }
-}
\ No newline at end of file
diff --git a/nemo-renderers/openflow-renderer/src/test/java/org/opendaylight/nemo/renderer/openflow/entity/ResourceBeanTest.java b/nemo-renderers/openflow-renderer/src/test/java/org/opendaylight/nemo/renderer/openflow/entity/ResourceBeanTest.java
deleted file mode 100644 (file)
index d147976..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-package org.opendaylight.nemo.renderer.openflow.entity;
-
-import junit.framework.TestCase;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.nemo.renderer.openflow.entity.HostBean;
-import org.opendaylight.nemo.renderer.openflow.entity.LinkBean;
-import org.opendaylight.nemo.renderer.openflow.entity.NodeBean;
-import org.opendaylight.nemo.renderer.openflow.entity.ResourceBean;
-import java.util.LinkedList;
-
-import java.util.List;
-
-import static org.junit.Assert.*;
-
-import static org.mockito.Mockito.*;
-import static org.junit.Assert.*;
-/**
- * Created by zhangmeng on 2015/11/8.
- */
-public class ResourceBeanTest extends TestCase {
-
-    private ResourceBean resourceBean;
-    private List<NodeBean> nodelist;
-    private List<LinkBean> linklist;
-    private List<HostBean> hostlist;
-
-    @Before
-    public void setUp() throws Exception {
-        resourceBean = new ResourceBean();
-        nodelist = new LinkedList<NodeBean>();
-        linklist = new LinkedList<LinkBean>();
-        hostlist = new LinkedList<HostBean>();
-    }
-
-    @Test
-    public void testGetNodelist() throws Exception {
-        Assert.assertNull(resourceBean.getNodelist());
-        nodelist.add(new NodeBean());
-        resourceBean.setNodelist(nodelist);
-        Assert.assertNotNull(resourceBean.getNodelist());
-        nodelist.clear();
-    }
-
-    @Test
-    public void testSetNodelist() throws Exception {
-        Assert.assertNull(resourceBean.getNodelist());
-        nodelist.add(new NodeBean());
-        resourceBean.setNodelist(nodelist);
-        Assert.assertNotNull(resourceBean.getNodelist());
-    }
-
-    @Test
-    public void testGetLinklist() throws Exception {
-        Assert.assertNull(resourceBean.getLinklist());
-        linklist.add(new LinkBean());
-        resourceBean.setLinklist(linklist);
-        Assert.assertNotNull(resourceBean.getLinklist());
-        linklist.clear();
-    }
-
-    @Test
-    public void testSetLinklist() throws Exception {
-        Assert.assertNull(resourceBean.getLinklist());
-        linklist.add(new LinkBean());
-        resourceBean.setLinklist(linklist);
-        Assert.assertNotNull(resourceBean.getLinklist());
-    }
-
-    @Test
-    public void testGetHostlist() throws Exception {
-        Assert.assertNull(resourceBean.getHostlist());
-        hostlist.add(new HostBean());
-        resourceBean.setHostlist(hostlist);
-        Assert.assertNotNull(resourceBean.getHostlist());
-        hostlist.clear();
-    }
-
-    @Test
-    public void testSetHostlist() throws Exception {
-        Assert.assertNull(resourceBean.getHostlist());
-        hostlist.add(new HostBean());
-        resourceBean.setHostlist(hostlist);
-        Assert.assertNotNull(resourceBean.getHostlist());
-    }
-}
\ No newline at end of file