<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>
<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>
<classifier>features</classifier>
<type>xml</type>
</dependency>
-
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>nemo-api</artifactId>
<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>
<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
<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
</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>
<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>
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
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
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
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
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
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
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
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
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
\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
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
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
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
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
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
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
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
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
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
* @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
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
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
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
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
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
\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
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
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
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
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
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
}\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
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
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
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
.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
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
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
\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
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
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
printedVirtualLinks.add(virtualLink2.getLinkId());\r
}\r
}\r
- // for testing - jizhigang\r
+\r
+ LOG.debug(stringBuilder.toString());\r
\r
return;\r
}\r
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
/**\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
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
* 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
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
* @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
\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
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
\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
* @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
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
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
* @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
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
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
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
* 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
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
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
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
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
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
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
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();
}
}
-
+++ /dev/null
-/*\r * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.\r *\r * This program and the accompanying materials are made available under the\r * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r * and is available at http://www.eclipse.org/legal/epl-v10.html\r */\r\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
+++ /dev/null
-/*\r
- * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-\r
-package org.opendaylight.nemo.renderer.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
+++ /dev/null
-/*\r
- * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
- \r
-package org.opendaylight.nemo.renderer.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
+++ /dev/null
-/*\r
- * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-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
+++ /dev/null
-/*\r
- * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-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
+++ /dev/null
-/*
- * 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
-}
-
--- /dev/null
+/*
+ * 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();
+ }
+ }
+
+}
--- /dev/null
+/*
+ * 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);
+ }
+ }
+ }
+
+ }
+}
--- /dev/null
+/*
+ * 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);
+ }
+ }
+ }
+
+ }
+}
--- /dev/null
+/*
+ * 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);
+ }
+ }
+}
--- /dev/null
+/*\r * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.\r *\r * This program and the accompanying materials are made available under the\r * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r * and is available at http://www.eclipse.org/legal/epl-v10.html\r */\r\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
--- /dev/null
+/*
+ * 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();
+ }
+}
--- /dev/null
+/*
+ * 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);
+ }
+ }
+ }
+}
--- /dev/null
+/*
+ * 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;
+ }
+
+}
--- /dev/null
+/*
+ * 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;
+ }
+}
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);
@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
if (renderer != null) {
renderer.close();
}
- LOG.info("Openflow Renderer (instance {}) tear down.", this);
+ LOG.debug("Openflow Renderer (instance {}) tear down.", this);
}
}
+
return new CloseResources();
}
+++ /dev/null
-{\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
+++ /dev/null
-{\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
+++ /dev/null
-{\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
--- /dev/null
+{\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
--- /dev/null
+{\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
--- /dev/null
+{\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
--- /dev/null
+{\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
--- /dev/null
+{\r
+ "host":[\r
+\r
+ ]\r
+}
\ No newline at end of file
--- /dev/null
+{\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
--- /dev/null
+{\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
--- /dev/null
+{\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
--- /dev/null
+{\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
--- /dev/null
+{\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
--- /dev/null
+{\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
--- /dev/null
+{\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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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