+/*\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;\r
+\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.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.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.action.types.rev131112.action.action.dec.mpls.ttl._case.DecMplsTtl;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.mpls.ttl._case.DecMplsTtlBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.nw.ttl._case.DecNwTtl;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.nw.ttl._case.DecNwTtlBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputAction;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.mpls.action._case.PopMplsAction;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.mpls.action._case.PopMplsActionBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.mpls.action._case.PushMplsAction;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.mpls.action._case.PushMplsActionBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field._case.SetField;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field._case.SetFieldBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.Meter;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.MeterBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.MeterKey;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableKey;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.*;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActions;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.go.to.table._case.GoToTable;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.go.to.table._case.GoToTableBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.metadata._case.WriteMetadata;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.metadata._case.WriteMetadataBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.*;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.BandId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandType;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterFlags;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.Drop;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DropBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.MeterBandHeadersBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeader;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeaderBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeaderKey;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.meter.band.header.MeterBandTypesBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;\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.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalNetwork;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.PhysicalLinks;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.PhysicalPaths;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLink;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNode;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.paths.PhysicalPath;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.paths.PhysicalPathBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.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.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.generic.virtual.network.rev151010.virtual.node.instance.VirtualPort;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.UserIntentVnMapping;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.user.intent.vn.mapping.IntentVnMappingResult;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.user.intent.vn.mapping.intent.vn.mapping.result.VirtualResource;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.vn.pn.mapping.results.UserVnPnMapping;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.vn.pn.mapping.results.user.vn.pn.mapping.VnPnMappingResult;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.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.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.yangtools.yang.binding.InstanceIdentifier;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+import java.math.BigInteger;\r
+import java.util.*;\r
+\r
+public class FlowUtils implements AutoCloseable {\r
+ private static final Logger LOG = LoggerFactory.getLogger(FlowUtils.class);\r
+\r
+ private static final short IN_PORT_TABLE_ID = 0;\r
+ private static final short MPLS_LABEL_TABLE_ID = 1;\r
+ private static final short MAC_TABLE_ID = 2;\r
+ private static final short IP_TABLE_ID = 3;\r
+ private static final short ARP_TABLE_ID = 4;\r
+\r
+ private static final int DEFAULT_FLOW_PRIORITY = 0;\r
+ private static final String DEFAULT_METADATA_MASK = "ffffffffffffffff";\r
+\r
+ private static final int ETH_TYPE_IP = 0x0800;\r
+ private static final int ETH_TYPE_MPLS = 0x8847;\r
+ private static final int ETH_TYPE_ARP = 0x0806;\r
+\r
+ private final DataBroker dataBroker;\r
+\r
+ private Map<PhysicalNodeId, MplsLabelGenerator> mplsGenerators;\r
+ private Map<PhysicalNodeId, MeterIdGenerator> meterIdGenerators;\r
+ private Map<PhysicalPathId, List<Integer>> mplsLabelsOfPhysicalPaths;\r
+ private Map<PhysicalPathId, Long> meterIdsOfPhysicalPaths;\r
+ private Map<UserId, Long> metadatas;\r
+ private long currentMetadata = 0;\r
+\r
+ private PhysicalNetworkHelper physicalNetworkHelper;\r
+ private VirtualNetworkHelper virtualNetworkHelper;\r
+\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
+\r
+ public FlowUtils(DataBroker dataBroker, ResourceManager resourceManager) {\r
+ super();\r
+\r
+ this.dataBroker = dataBroker;\r
+ this.resourceManager = resourceManager;\r
+\r
+ mplsGenerators = new HashMap<PhysicalNodeId, MplsLabelGenerator>();\r
+ meterIdGenerators = new HashMap<PhysicalNodeId, MeterIdGenerator>();\r
+ mplsLabelsOfPhysicalPaths = new HashMap<PhysicalPathId, List<Integer>>();\r
+ meterIdsOfPhysicalPaths = new HashMap<PhysicalPathId, Long>();\r
+ metadatas = new HashMap<UserId, Long>();\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
+\r
+ public void init(List<PhysicalNode> physicalNodes) {\r
+ for ( PhysicalNode physicalNode : physicalNodes ) {\r
+ mplsGenerators.put(physicalNode.getNodeId(), new MplsLabelGenerator());\r
+ meterIdGenerators.put(physicalNode.getNodeId(), new MeterIdGenerator());\r
+ }\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Shixing Liu\r
+ * @param userId TODO\r
+ * @param nodeId TODO\r
+ * @param tableId TODO\r
+ * @param flowId TODO\r
+ */\r
+ private InstanceIdentifier<Flow> generateFlowInsId(UserId userId,\r
+ NodeId nodeId,\r
+ Short tableId,\r
+ FlowId flowId){\r
+\r
+\r
+ InstanceIdentifier<Flow> flowInsId = createFlowPath(nodeId, tableId, flowId);\r
+\r
+ if(flowIdsOfUsers.containsKey(userId) == false){\r
+ List<InstanceIdentifier<Flow>> flowInsIds = new ArrayList<InstanceIdentifier<Flow>>();\r
+ flowInsIds.add(flowInsId);\r
+ flowIdsOfUsers.put(userId, flowInsIds);\r
+ }else{\r
+ List<InstanceIdentifier<Flow>> flowInsIds = flowIdsOfUsers.get(userId);\r
+ flowInsIds.add(flowInsId);\r
+ }\r
+ LOG.info("nemo:generateFlowInsId");\r
+ return flowInsId;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Shixing Liu\r
+ * @param userId TODO\r
+ * @param nodeKey TODO\r
+ * @param meterKey TODO\r
+ */\r
+ private InstanceIdentifier<Meter> generateMeterInsId(UserId userId,\r
+ NodeKey nodeKey,\r
+ MeterKey meterKey){\r
+ InstanceIdentifier<Meter> meterInsId = InstanceIdentifier.create(Nodes.class)\r
+ .child(Node.class,nodeKey)\r
+ .augmentation(FlowCapableNode.class).child(Meter.class, meterKey);\r
+\r
+ if(meterIdIdsOfUsers.containsKey(userId) == false){\r
+ List<InstanceIdentifier<Meter>> meterInsIds = new ArrayList<InstanceIdentifier<Meter>>();\r
+ meterInsIds.add(meterInsId);\r
+ meterIdIdsOfUsers.put(userId, meterInsIds);\r
+ }\r
+ else{\r
+ List<InstanceIdentifier<Meter>> meterInsIds = meterIdIdsOfUsers.get(userId);\r
+ meterInsIds.add(meterInsId);\r
+ }\r
+ LOG.info("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
+ if ( !metadatas.containsKey(user.getUserId()) ) {\r
+ metadatas.put(user.getUserId(), ++currentMetadata);\r
+ }\r
+\r
+ physicalNetworkHelper = new PhysicalNetworkHelper(physicalNetwork);\r
+ virtualNetworkHelper = new VirtualNetworkHelper(virtualNetwork);\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
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ * @param userId TODO\r
+ */\r
+ public 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
+\r
+ return;\r
+ }\r
+\r
+ @Override\r
+ public void close() throws Exception {\r
+ // TODO\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Shixing Liu\r
+ * @param physicalDestNodeId TODO\r
+ * @param physicalDestPortId TODO\r
+ */\r
+ private void configInternalInPortFlowTable(UserId userId,\r
+ PhysicalNodeId physicalDestNodeId,\r
+ PhysicalPortId physicalDestPortId) {\r
+ String nodeID = physicalDestNodeId.getValue();\r
+ String portID = physicalDestPortId.getValue();\r
+\r
+ WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();\r
+ List<Instruction> instructionList = new LinkedList<Instruction>();\r
+ Match match = new MatchBuilder().setInPort(new NodeConnectorId(portID)).build();\r
+\r
+ GoToTable gotoTable = new GoToTableBuilder().setTableId(MPLS_LABEL_TABLE_ID).build();\r
+ GoToTableCase gotoTableCase = new GoToTableCaseBuilder().setGoToTable(gotoTable).build();\r
+ Instruction instructionGoto = new InstructionBuilder().setOrder(0).setInstruction(gotoTableCase).build();\r
+ instructionList.add(instructionGoto);\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(IN_PORT_TABLE_ID).setPriority(DEFAULT_FLOW_PRIORITY);\r
+ Flow flow = flowBuilder.setMatch(match).setInstructions(instructions).build();\r
+ NodeId nodeId = new NodeId(nodeID);\r
+\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
+ LOG.info("nemo:configInternalInPortFlowTable");\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Shixing Liu\r
+ * @param physicalDestNodeId TODO\r
+ * @param physicalDestPortId TODO\r
+ * @param destNodeType TODO\r
+ */\r
+ private void configExternalInPortFlowTable(UserId userId,\r
+ PhysicalNodeId physicalDestNodeId,\r
+ PhysicalPortId physicalDestPortId,\r
+ VirtualNode.NodeType destNodeType) {\r
+ String nodeID = physicalDestNodeId.getValue();\r
+ String portID = physicalDestPortId.getValue();\r
+\r
+ WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();\r
+ List<Instruction> instructionList = new LinkedList<Instruction>();\r
+ Match match = new MatchBuilder().setInPort(new NodeConnectorId(portID)).build();\r
+\r
+ WriteMetadata writeMetadata = new WriteMetadataBuilder().setMetadata(BigInteger.valueOf(metadatas.get(userId))).setMetadataMask(new BigInteger(DEFAULT_METADATA_MASK, 16)).build();\r
+ WriteMetadataCase writeMetadataCase = new WriteMetadataCaseBuilder().setWriteMetadata(writeMetadata).build();\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
+ GoToTableCase gotoTableCase = new GoToTableCaseBuilder().setGoToTable(gotoTable).build();\r
+ Instruction instructionGoto = new InstructionBuilder().setOrder(instructionList.size()).setInstruction(gotoTableCase).build();\r
+ instructionList.add(instructionGoto);\r
+\r
+ Instructions instructions = new InstructionsBuilder().setInstruction(instructionList).build();\r
+\r
+ FlowId flowId = new FlowId(UUID.randomUUID().toString());\r
+\r
+ FlowBuilder flowBuilder = baseFlowBuilder().setId(flowId).setTableId(IN_PORT_TABLE_ID).setPriority(DEFAULT_FLOW_PRIORITY);\r
+ Flow flow = flowBuilder.setMatch(match).setInstructions(instructions).build();\r
+\r
+ NodeId nodeId = new NodeId(nodeID);\r
+\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
+ LOG.info("nemo:configExternalInPortFlowTable");\r
+\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Shixing Liu\r
+ * @param user TODO\r
+ * @param virtualNetwork TODO\r
+ * @param userIntentVnMapping TODO\r
+ * @param userVnPnMapping TODO\r
+ * @param physicalNetwork TODO\r
+ */\r
+ private void updateInPortTable(User user,\r
+ VirtualNetwork virtualNetwork,\r
+ UserIntentVnMapping userIntentVnMapping,\r
+ UserVnPnMapping userVnPnMapping,\r
+ PhysicalNetwork physicalNetwork) {\r
+ List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();\r
+\r
+ for(VnPnMappingResult vnPnMappingResult:vnPnMappingResults){\r
+ LOG.info("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
+\r
+ VirtualPort.PortType virtualPortType = VirtualPort.PortType.Internal;\r
+ VirtualNode.NodeType virtualNodeType = VirtualNode.NodeType.Vswitch;\r
+\r
+ List<VirtualNode> virtualNodes = virtualNetwork.getVirtualNodes().getVirtualNode();\r
+ for (VirtualNode virtualNode : virtualNodes) {\r
+ if (virtualNode.getNodeId().equals(virtualNodeId)){\r
+ virtualNodeType = virtualNode.getNodeType();\r
+ for (VirtualPort virtualPort : virtualNode.getVirtualPort()) {\r
+ if (virtualPort.getPortId().equals(virtualPortid)){\r
+ virtualPortType = virtualPort.getPortType();\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+ }\r
+ }\r
+\r
+ PhysicalNodeId physicalDestNodeId =\r
+ new PhysicalNodeId(vnPnMappingResult.getParentPhysicalResourceEntityId().getValue());\r
+\r
+ PhysicalPortId physicalDestPortId =\r
+ new PhysicalPortId(vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+\r
+ if (virtualPortType == VirtualPort.PortType.External) {\r
+ configExternalInPortFlowTable(userVnPnMapping.getUserId(), physicalDestNodeId, physicalDestPortId, virtualNodeType);\r
+ } else {\r
+ configInternalInPortFlowTable(userVnPnMapping.getUserId(), physicalDestNodeId, physicalDestPortId);\r
+ }\r
+ }\r
+ }\r
+\r
+ for(PhysicalNode physicalNode: physicalNetwork.getPhysicalNodes().getPhysicalNode()){\r
+ PhysicalNodeId physicalDestNodeId = physicalNode.getNodeId();\r
+\r
+ for (PhysicalPort physicalPort: physicalNode.getPhysicalPort()){\r
+ PhysicalPortId physicalDestPortId = physicalPort.getPortId();\r
+ PhysicalPort.PortType physicalPortType = physicalPort.getPortType();\r
+\r
+ if(physicalPortType == PhysicalPort.PortType.Internal){\r
+ configInternalInPortFlowTable(userVnPnMapping.getUserId(), physicalDestNodeId, physicalDestPortId);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Shixing Liu\r
+ * @param user TODO\r
+ * @param virtualNetwork TODO\r
+ * @param userIntentVnMapping TODO\r
+ * @param userVnPnMapping TODO\r
+ * @param physicalNetwork TODO\r
+ */\r
+ private void updateMeterTable(User user,\r
+ VirtualNetwork virtualNetwork,\r
+ UserIntentVnMapping userIntentVnMapping,\r
+ UserVnPnMapping userVnPnMapping,\r
+ PhysicalNetwork physicalNetwork) {\r
+\r
+ LOG.info("nemo:meter updateMeterTable()");\r
+ PhysicalPaths physicalPaths = physicalNetwork.getPhysicalPaths();\r
+ if(null == physicalPaths.getPhysicalPath()){\r
+ LOG.info("PhysicalPath are null");\r
+ return;\r
+ }\r
+\r
+ List<PhysicalPath> physicalPathList = physicalPaths.getPhysicalPath();\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
+ physicalLinksList = physicalLinks.getPhysicalLink();\r
+\r
+ for(PhysicalPath physicalPath:physicalPathList) {\r
+ if(physicalPath.getBandwidth() > 0 ) {\r
+ LOG.info("nemo: meter physicalPath.getBandwidth() = {}", physicalPath.getBandwidth());\r
+ if(meterIdsOfPhysicalPaths.containsKey(physicalPath.getPathId())== false){\r
+ LOG.info("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
+ 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
+ if (physicalLinkInPath.getLinkId().getValue().equals(physicalLink.getLinkId().getValue())) {\r
+\r
+ LOG.info("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
+\r
+ LOG.info("nemo:meter Assign meter id");\r
+ Long meterId = (long)0;\r
+ if(meterIdGenerators.containsKey(physicalSrcNodeId) == false){\r
+ LOG.info("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
+ 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
+ NodeKey nodeKey = new NodeKey(new NodeId(physicalSrcNodeId.getValue()));\r
+ MeterKey meterKey = new MeterKey(new MeterId(meterId));\r
+\r
+ InstanceIdentifier<Meter> meterInsId = generateMeterInsId(userVnPnMapping.getUserId(), nodeKey, meterKey);\r
+\r
+ /*\r
+ MeterBandHeaderBuilder meterBandHeaderBuilder = new MeterBandHeaderBuilder();\r
+ MeterBandTypesBuilder meterBandTypesB = new MeterBandTypesBuilder();\r
+ MeterBandType bandFlag = new MeterBandType(true, false, false);\r
+ meterBandTypesB.setFlags(bandFlag);// _ofpmbtDrop\r
+ DropBuilder drop = new DropBuilder();\r
+ drop.setDropBurstSize(physicalPath.getBandwidth() / 2);\r
+ drop.setDropRate(physicalPath.getBandwidth());\r
+ Drop drp = drop.build();\r
+ meterBandHeaderBuilder.setBandType(drp);\r
+ meterBandHeaderBuilder.setMeterBandTypes(meterBandTypesB.build());\r
+ MeterBandHeader meterBH = meterBandHeaderBuilder.build();\r
+ MeterBuilder meterBuilder = new MeterBuilder();\r
+ meterBuilder.setMeterBandHeaders(meterBandHeadersBuilder.setMeterBandHeader(meterBandHeaders).build());\r
+ */\r
+\r
+ MeterBuilder meterBuilder = new MeterBuilder();\r
+ MeterBandHeaderBuilder meterBandHeaderBuilder = new MeterBandHeaderBuilder();\r
+ MeterBandHeadersBuilder meterBandHeadersBuilder = new MeterBandHeadersBuilder();\r
+ MeterBandTypesBuilder meterBandTypesB = new MeterBandTypesBuilder();\r
+\r
+ meterBandHeaderBuilder.setKey(new MeterBandHeaderKey(new BandId(physicalPath.getBandwidth())));\r
+ meterBandHeaderBuilder.setBandBurstSize((long)0);\r
+ meterBandHeaderBuilder.setBandRate(physicalPath.getBandwidth());\r
+\r
+ MeterBandType bandFlag = new MeterBandType(true, false, false);\r
+ meterBandTypesB.setFlags(bandFlag);// _ofpmbtDrop\r
+ DropBuilder drop = new DropBuilder();\r
+ drop.setDropBurstSize((long)0);\r
+ drop.setDropRate(physicalPath.getBandwidth());\r
+ Drop drp = drop.build();\r
+ meterBandHeaderBuilder.setBandType(drp);\r
+ meterBandHeaderBuilder.setMeterBandTypes(meterBandTypesB.build());\r
+\r
+ MeterBandHeader meterBH = meterBandHeaderBuilder.build();\r
+ List<MeterBandHeader> meterBandHeaders = new ArrayList<MeterBandHeader>();\r
+ meterBandHeaders.add(0, meterBH);\r
+\r
+ meterBuilder.setKey(new MeterKey(new MeterId(meterId)));\r
+ meterBuilder.setBarrier(false);\r
+\r
+ meterBuilder.setFlags(new MeterFlags(false, true, false, true));\r
+\r
+ meterBuilder.setContainerName("container." + physicalPath.getPathId());\r
+ meterBuilder.setMeterName("meter." + physicalPath.getPathId());\r
+ meterBandHeadersBuilder.setMeterBandHeader(meterBandHeaders);\r
+ meterBuilder.setMeterBandHeaders(meterBandHeadersBuilder.build());\r
+\r
+ Meter meter = meterBuilder.build();\r
+\r
+ WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();\r
+ writeTransaction.put(LogicalDatastoreType.CONFIGURATION, meterInsId, meter);\r
+ writeTransaction.submit();\r
+ LOG.info("nemo:meter writeTransaction.submit();");\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Shixing Liu\r
+ * @param physicalPath TODO\r
+ * @param physicalLinksList TODO\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
+ 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
+ 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
+ if (physicalLinkinPath.getLinkId().getValue().equals(physicalLink.getLinkId().getValue())) {\r
+ LOG.info("nemo: physicalLinkinPath.getLinkId() == physicalLink.getLinkId()");\r
+ PhysicalNodeId physicalDestNodeId = physicalLink.getDestNodeId();\r
+ if(mplsGenerators.containsKey(physicalDestNodeId) == true){\r
+\r
+ mplsLabels.add(mplsGenerators.get(physicalDestNodeId).generateMplsLabel());\r
+\r
+ }\r
+ else{\r
+\r
+ MplsLabelGenerator mplsLabelGenerator = new MplsLabelGenerator();\r
+ mplsGenerators.put(physicalDestNodeId, mplsLabelGenerator);\r
+ mplsLabels.add(mplsGenerators.get(physicalDestNodeId).generateMplsLabel());\r
+ }\r
+ }\r
+ }\r
+ }\r
+ mplsLabelsOfPhysicalPaths.put(physicalPath.getPathId(), mplsLabels);\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Shixing Liu\r
+ * @param user TODO\r
+ * @param virtualNetwork TODO\r
+ * @param userIntentVnMapping TODO\r
+ * @param userVnPnMapping TODO\r
+ * @param physicalNetwork TODO\r
+ */\r
+ private void updateMplsTable(User user,\r
+ VirtualNetwork virtualNetwork,\r
+ UserIntentVnMapping userIntentVnMapping,\r
+ UserVnPnMapping userVnPnMapping,\r
+ PhysicalNetwork physicalNetwork) {\r
+\r
+ LOG.info("nemo:mpls: updateMplsTable()");\r
+ PhysicalPaths physicalPaths = physicalNetwork.getPhysicalPaths();\r
+\r
+ if(null == physicalPaths.getPhysicalPath()){\r
+ LOG.info("PhysicalPaths are null");\r
+ return;\r
+ }\r
+\r
+ List<PhysicalPath> physicalPathList = physicalPaths.getPhysicalPath();\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
+ physicalLinksList = physicalLinks.getPhysicalLink();\r
+\r
+ Iterator<Integer> mplsLabelIter = null;\r
+\r
+ List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();\r
+\r
+ for(VnPnMappingResult vnPnMappingResult:vnPnMappingResults) {\r
+ if (VirtualResource.VirtualResourceType.Vlink == vnPnMappingResult.getVirtualResourceType()) {\r
+ PhysicalPathId physicalPathId = new PhysicalPathId(vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+ PhysicalPath physicalPath = physicalNetworkHelper.getPhysicalPath(physicalPathId);\r
+\r
+ VirtualLinkId virtualLinkId = new VirtualLinkId(vnPnMappingResult.getVirtualResourceEntityId().getValue());\r
+ VirtualLink virtualLink = virtualNetworkHelper.getVirtualLink(virtualLinkId);\r
+ VirtualNodeId virtualNodeId = virtualLink.getDestNodeId();\r
+ VirtualNode.NodeType nodetype = VirtualNode.NodeType.Vswitch;\r
+ List<VirtualNode> virtualNodes = virtualNetwork.getVirtualNodes().getVirtualNode();\r
+ for (VirtualNode virtualNode : virtualNodes) {\r
+ if (virtualNode.getNodeId().equals(virtualNodeId)) {\r
+ nodetype = virtualNode.getNodeType();\r
+ break;\r
+ }\r
+ }\r
+ \r
+ //Assign MPLS Label and record MPLS Label\r
+ assignMPLSLabelForPPath(physicalPath,physicalLinksList);\r
+\r
+ //Create Flow Entries for MPLS Flow Table\r
+ int counter = 0;\r
+ int inMPLSLabel = Integer.MAX_VALUE;\r
+ int outMPLSLabel = Integer.MAX_VALUE;\r
+\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
+ for (org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.path.instance.PhysicalLink physicalLinkinPath : physicalLinksInPath) {\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
+ if (physicalLinkinPath.getLinkId().getValue().equals(physicalLink.getLinkId().getValue())) {\r
+ PhysicalNodeId physicalDestNodeId = physicalLink.getDestNodeId();\r
+ PhysicalNodeId physicalSrcNodeId = physicalLink.getSrcNodeId();\r
+ PhysicalPortId physicalSrcPortId = physicalLink.getSrcPortId();\r
+\r
+ if (0 == counter++) {\r
+ LOG.info("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
+ WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();\r
+ List<Instruction> instructionList = new LinkedList<Instruction>();\r
+ List<Action> actionList = new LinkedList<Action>();\r
+ outMPLSLabel = mplsLabelIter.next();\r
+\r
+ EthernetMatchBuilder ethernetMatchBuilder = new EthernetMatchBuilder().setEthernetType(new EthernetTypeBuilder().setType(new EtherType((long) ETH_TYPE_MPLS)).build());\r
+ EthernetMatch ethernetMatch = ethernetMatchBuilder.build();\r
+\r
+ ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = new ProtocolMatchFieldsBuilder().setMplsLabel((long) inMPLSLabel);\r
+ ProtocolMatchFields protocolMatchFields = protocolMatchFieldsBuilder.build();\r
+\r
+ Match match = new MatchBuilder().setEthernetMatch(ethernetMatch).setProtocolMatchFields(protocolMatchFields).build();\r
+\r
+ SetField setField = new SetFieldBuilder().setProtocolMatchFields(new ProtocolMatchFieldsBuilder().setMplsLabel((long) outMPLSLabel).build()).build();\r
+ SetFieldCase setFieldCase = new SetFieldCaseBuilder().setSetField(setField).build();\r
+ Action actionSetField = new ActionBuilder().setOrder(0).setAction(setFieldCase).build();\r
+ actionList.add(actionSetField);\r
+\r
+ DecMplsTtl decMplsTtl = new DecMplsTtlBuilder().build();\r
+ DecMplsTtlCase decMplsTtlCase = new DecMplsTtlCaseBuilder().setDecMplsTtl(decMplsTtl).build();\r
+ Action actionDecMPLS = new ActionBuilder().setOrder(1).setAction(decMplsTtlCase).build();\r
+ actionList.add(actionDecMPLS);\r
+\r
+ OutputAction outputAction = new OutputActionBuilder().setOutputNodeConnector(new NodeConnectorId(physicalSrcPortId.getValue())).build();\r
+ OutputActionCase outputActionCase = new OutputActionCaseBuilder().setOutputAction(outputAction).build();\r
+ Action actionOutput = new ActionBuilder().setOrder(2).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(0).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(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
+\r
+ NodeId nodeId = new NodeId(physicalSrcNodeId.getValue());\r
+\r
+ InstanceIdentifier<Flow> flowInsId = generateFlowInsId(user.getUserId(), nodeId, flow.getTableId(), flow.getId());\r
+\r
+ writeTransaction.put(LogicalDatastoreType.CONFIGURATION, flowInsId, flow, true);\r
+ writeTransaction.submit();\r
+\r
+ inMPLSLabel = outMPLSLabel;\r
+ }\r
+ //The last hop\r
+ if (physicalPath.getPhysicalLink().size() == counter) {\r
+ LOG.info("nemo:mpls: last hop");\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_MPLS)).build());\r
+ EthernetMatch ethernetMatch = ethernetMatchBuilder.build();\r
+\r
+ ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = new ProtocolMatchFieldsBuilder().setMplsLabel((long) inMPLSLabel);\r
+ ProtocolMatchFields protocolMatchFields = protocolMatchFieldsBuilder.build();\r
+\r
+ Match match = new MatchBuilder().setEthernetMatch(ethernetMatch).setProtocolMatchFields(protocolMatchFields).build();\r
+\r
+ PopMplsAction popMplsAction = new PopMplsActionBuilder().setEthernetType(ETH_TYPE_IP).build();\r
+ PopMplsActionCase popMplsActionCase = new PopMplsActionCaseBuilder().setPopMplsAction(popMplsAction).build();\r
+ Action actionPopMPLS = new ActionBuilder().setOrder(0).setAction(popMplsActionCase).build();\r
+ actionList.add(actionPopMPLS);\r
+\r
+ ApplyActions applyActions = new ApplyActionsBuilder().setAction(actionList).build();\r
+ ApplyActionsCase applyActionsCase = new ApplyActionsCaseBuilder().setApplyActions(applyActions).build();\r
+ Instruction instructionApply = new InstructionBuilder().setOrder(0).setInstruction(applyActionsCase).build();\r
+ instructionList.add(instructionApply);\r
+\r
+ WriteMetadata writeMetadata = new WriteMetadataBuilder().setMetadata(BigInteger.valueOf(metadatas.get(user.getUserId()))).setMetadataMask(new BigInteger(DEFAULT_METADATA_MASK, 16)).build();\r
+ WriteMetadataCase writeMetadataCase = new WriteMetadataCaseBuilder().setWriteMetadata(writeMetadata).build();\r
+ Instruction instructionMeta = new InstructionBuilder().setOrder(1).setInstruction(writeMetadataCase).build();\r
+ instructionList.add(instructionMeta);\r
+\r
+ GoToTable gotoTable = new GoToTableBuilder().setTableId((nodetype == VirtualNode.NodeType.Vswitch)? MAC_TABLE_ID:IP_TABLE_ID).build();\r
+ GoToTableCase gotoTableCase = new GoToTableCaseBuilder().setGoToTable(gotoTable).build();\r
+ Instruction instructionGoto = new InstructionBuilder().setOrder(2).setInstruction(gotoTableCase).build();\r
+ instructionList.add(instructionGoto);\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(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
+ NodeId nodeId = new NodeId(physicalDestNodeId.getValue());\r
+ InstanceIdentifier<Flow> flowInsId = generateFlowInsId(user.getUserId(), nodeId, flow.getTableId(), flow.getId());\r
+\r
+ writeTransaction.put(LogicalDatastoreType.CONFIGURATION, flowInsId, flow, true);\r
+ writeTransaction.submit();\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\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
+ private void updateIpTable(User user,\r
+ VirtualNetwork virtualNetwork,\r
+ UserIntentVnMapping userIntentVnMapping,\r
+ UserVnPnMapping userVnPnMapping,\r
+ PhysicalNetwork physicalNetwork) {\r
+ List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();\r
+ Map<VirtualNodeId, VirtualNode> virtualRouters = virtualNetworkHelper.getVirtualRouters();\r
+ Map<VirtualNodeId, Map.Entry<VirtualPort, VirtualLink>> connectedVirtualSwitches;\r
+ Map<VirtualNodeId, Map.Entry<VirtualPort, VirtualLink>> connectedVirtualSwitches1;\r
+ Map<VirtualNodeId, Map.Entry<VirtualPort, VirtualLink>> connectedVirtualRouters;\r
+ Map<VirtualNodeId, Map.Entry<VirtualPort, VirtualLink>> connectedVirtualRouters1;\r
+ VirtualPort layer2ExternalVirtualPort;\r
+ VirtualPort layer2ExternalVirtualPort1;\r
+ VirtualPort layer2ExternalVirtualPort2;\r
+ VirtualPort layer3ExternalVirtualPort;\r
+ VirtualPort layer3ExternalVirtualPort1;\r
+ VnPnMappingResult vnPnMappingResult;\r
+ PhysicalNodeId physicalNodeId;\r
+ PhysicalNodeId physicalNodeId1;\r
+ VirtualLink virtualLink;\r
+ VirtualLink virtualLink1;\r
+ PhysicalPathId physicalPathId;\r
+ PhysicalPathId physicalPathId1;\r
+ PhysicalPath physicalPath;\r
+ PhysicalPath physicalPath1;\r
+ PhysicalPortId physicalPortId;\r
+ PhysicalPort physicalPort;\r
+ List<IpPrefix> remoteIpPrefixes;\r
+ List<IpPrefix> ipPrefixes;\r
+ List<MacAddress> macAddresses;\r
+ VirtualPort virtualPort;\r
+ VirtualArp virtualArp;\r
+ IpPrefix ipPrefix;\r
+ MacAddress gatewayMacAddress;\r
+\r
+ for ( VirtualNodeId virtualNodeId : virtualRouters.keySet() ) {\r
+ vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+ new VirtualResourceEntityId(virtualNodeId.getValue()));\r
+ physicalNodeId = new PhysicalNodeId(vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+\r
+ connectedVirtualRouters = virtualNetworkHelper.getConnectedVirtualRouters(virtualNodeId);\r
+\r
+ if ( null != connectedVirtualRouters ) {\r
+ for ( Map.Entry<VirtualNodeId, Map.Entry<VirtualPort, VirtualLink>> entry\r
+ : connectedVirtualRouters.entrySet() ) {\r
+ virtualLink = entry.getValue().getValue();\r
+ vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+ new VirtualResourceEntityId(virtualLink.getLinkId().getValue()));\r
+ physicalPathId = new PhysicalPathId(\r
+ vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+ physicalPath = physicalNetworkHelper.getPhysicalPath(physicalPathId);\r
+ remoteIpPrefixes = new LinkedList<IpPrefix>();\r
+\r
+ connectedVirtualSwitches1 = virtualNetworkHelper\r
+ .getConnectedVirtualSwitches(entry.getKey());\r
+\r
+ if ( null != connectedVirtualSwitches1 ) {\r
+ virtualPort = connectedVirtualSwitches1.entrySet().iterator().next().getValue().getKey();\r
+ ipPrefix = virtualPort.getExternalIpPrefixes().getExternalIpPrefix().get(0);\r
+ remoteIpPrefixes.add(ipPrefix);\r
+ }\r
+\r
+ layer3ExternalVirtualPort1 = virtualNetworkHelper\r
+ .getLayer3ExternalVirtualPort(entry.getKey());\r
+\r
+ if ( null != layer3ExternalVirtualPort1 ) {\r
+ remoteIpPrefixes.addAll(\r
+ layer3ExternalVirtualPort1.getExternalIpPrefixes().getExternalIpPrefix());\r
+ }\r
+\r
+ layer2ExternalVirtualPort1 = virtualNetworkHelper\r
+ .getLayer2ExternalVirtualPort(entry.getKey());\r
+\r
+ if ( null != layer2ExternalVirtualPort1 ) {\r
+ remoteIpPrefixes.addAll(\r
+ layer2ExternalVirtualPort1.getExternalIpPrefixes().getExternalIpPrefix());\r
+ }\r
+\r
+ if ( !physicalPath.getPhysicalLink().isEmpty() ) {\r
+ for ( IpPrefix ipPrefix1 : remoteIpPrefixes ) {\r
+ configIpTableEntry(user.getUserId(), ipPrefix1, physicalPath, false);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ connectedVirtualSwitches = virtualNetworkHelper.getConnectedVirtualSwitches(virtualNodeId);\r
+\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
+\r
+ for ( Map.Entry<VirtualNodeId, Map.Entry<VirtualPort, VirtualLink>> entry\r
+ : connectedVirtualSwitches.entrySet() ) {\r
+ virtualLink = entry.getValue().getValue();\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
+ connectedVirtualRouters1 = virtualNetworkHelper\r
+ .getConnectedVirtualRouters(entry.getKey());\r
+\r
+ if ( null != connectedVirtualRouters1 ) {\r
+ virtualLink1 = connectedVirtualRouters1.values().iterator().next().getValue();\r
+ vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+ new VirtualResourceEntityId(virtualLink1.getLinkId().getValue()));\r
+ physicalPathId1 = new PhysicalPathId(\r
+ vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+ physicalPath1 = physicalNetworkHelper.getPhysicalPath(physicalPathId1);\r
+\r
+ configMacTableEntry(user.getUserId(), gatewayMacAddress, physicalPath1);\r
+ }\r
+\r
+ connectedVirtualSwitches1 = virtualNetworkHelper\r
+ .getConnectedVirtualSwitches(entry.getKey());\r
+\r
+ if ( null != connectedVirtualSwitches1 ) {\r
+ for ( Map.Entry<VirtualNodeId, Map.Entry<VirtualPort, VirtualLink>> entry1\r
+ : connectedVirtualSwitches1.entrySet() ) {\r
+ virtualLink1 = entry1.getValue().getValue();\r
+ vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+ new VirtualResourceEntityId(virtualLink1.getLinkId().getValue()));\r
+ physicalPathId1 = new PhysicalPathId(\r
+ vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+ physicalPath1 = physicalNetworkHelper.getPhysicalPath(physicalPathId1);\r
+\r
+ if ( !physicalPath1.getPhysicalLink().isEmpty() ) {\r
+ layer2ExternalVirtualPort2 = virtualNetworkHelper\r
+ .getLayer2ExternalVirtualPort(entry1.getKey());\r
+\r
+ if ( null != layer2ExternalVirtualPort2 ) {\r
+ macAddresses = layer2ExternalVirtualPort2\r
+ .getExternalMacAddresses().getExternalMacAddress();\r
+\r
+ for ( MacAddress macAddress : macAddresses ) {\r
+ configMacTableEntry(user.getUserId(), macAddress, physicalPath1);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ layer2ExternalVirtualPort1 = virtualNetworkHelper\r
+ .getLayer2ExternalVirtualPort(entry.getKey());\r
+\r
+ if ( null != layer2ExternalVirtualPort1 ) {\r
+ vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+ new VirtualResourceEntityId(layer2ExternalVirtualPort1.getPortId().getValue()));\r
+ physicalNodeId1 = new PhysicalNodeId(\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
+\r
+ for ( MacAddress macAddress : macAddresses ) {\r
+ virtualArp = virtualNetworkHelper.getVirtualArp(macAddress);\r
+\r
+ configArpTableEntry(user.getUserId(), virtualArp, physicalPath);\r
+ configMacTableEntry(user.getUserId(), macAddress, physicalNodeId1, physicalPort);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ layer3ExternalVirtualPort = virtualNetworkHelper.getLayer3ExternalVirtualPort(virtualNodeId);\r
+\r
+ if ( null != layer3ExternalVirtualPort ) {\r
+ vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+ new VirtualResourceEntityId(layer3ExternalVirtualPort.getPortId().getValue()));\r
+ physicalPortId = new PhysicalPortId(vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+ physicalPort = physicalNetworkHelper.getPhysicalPort(physicalNodeId, physicalPortId);\r
+\r
+ ipPrefixes = layer3ExternalVirtualPort.getExternalIpPrefixes().getExternalIpPrefix();\r
+\r
+ for ( IpPrefix ipPrefix1 : ipPrefixes ) {\r
+ configIpTableEntry(user.getUserId(), ipPrefix1, physicalNodeId, physicalPort, false);\r
+ }\r
+ }\r
+\r
+ layer2ExternalVirtualPort = virtualNetworkHelper.getLayer2ExternalVirtualPort(virtualNodeId);\r
+\r
+ if ( null != layer2ExternalVirtualPort ) {\r
+ // TODO: config ip and arp tables.\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
+ Set<VirtualLinkId> printedVirtualLinks = new HashSet<VirtualLinkId>();\r
+ VirtualNode srcVirtualNode;\r
+ VirtualNode dstVirtualNode;\r
+ PhysicalPath physicalPath2;\r
+\r
+ for ( VirtualLink virtualLink2 : virtualNetwork.getVirtualLinks().getVirtualLink() ) {\r
+ if ( !printedVirtualLinks.contains(virtualLink2.getLinkId()) ) {\r
+ srcVirtualNode = virtualNetworkHelper.virtualNodeMap.get(virtualLink2.getSrcNodeId());\r
+ dstVirtualNode = virtualNetworkHelper.virtualNodeMap.get(virtualLink2.getDestNodeId());\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
+\r
+ for ( VirtualLink virtualLink3 : virtualNetwork.getVirtualLinks().getVirtualLink() ) {\r
+ if ( virtualLink3.getSrcNodeId().equals(dstVirtualNode.getNodeId())\r
+ && virtualLink3.getDestNodeId().equals(srcVirtualNode.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
+\r
+ printedVirtualLinks.add(virtualLink3.getLinkId());\r
+ }\r
+ }\r
+\r
+ printedVirtualLinks.add(virtualLink2.getLinkId());\r
+ }\r
+ }\r
+ // for testing - jizhigang\r
+\r
+ return;\r
+ }\r
+\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
+ private void updateArpTable(User user,\r
+ VirtualNetwork virtualNetwork,\r
+ UserIntentVnMapping userIntentVnMapping,\r
+ UserVnPnMapping userVnPnMapping,\r
+ PhysicalNetwork physicalNetwork) {\r
+ // TODO\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ * @param userId TODO\r
+ */\r
+ private void deleteFlowTableEntries(UserId userId) {\r
+ WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();\r
+\r
+ for ( InstanceIdentifier<Flow> flowIid : flowIdsOfUsers.get(userId) ) {\r
+ writeTransaction.delete(LogicalDatastoreType.CONFIGURATION, flowIid);\r
+ }\r
+\r
+ writeTransaction.submit();\r
+\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ * @param userId TODO\r
+ */\r
+ private void deleteMeterTableEntries(UserId userId) {\r
+ WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();\r
+\r
+ for ( InstanceIdentifier<Meter> meterIid : meterIdIdsOfUsers.get(userId) ) {\r
+ writeTransaction.delete(LogicalDatastoreType.CONFIGURATION, meterIid);\r
+ }\r
+\r
+ writeTransaction.submit();\r
+\r
+ return;\r
+ }\r
+\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
+ private void updateIpTableForOperations(User user,\r
+ VirtualNetwork virtualNetwork,\r
+ UserIntentVnMapping userIntentVnMapping,\r
+ UserVnPnMapping userVnPnMapping,\r
+ PhysicalNetwork physicalNetwork) {\r
+ if ( null == user.getOperations() ) {\r
+ return;\r
+ }\r
+\r
+ List<Operation> operations = user.getOperations().getOperation();\r
+\r
+ if ( null == operations || operations.isEmpty() ) {\r
+ return;\r
+ }\r
+\r
+ Operation operation = operations.get(0);\r
+\r
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow> nemoFlows =\r
+ user.getObjects().getFlow();\r
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.FlowId nemoFlowId =\r
+ new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.FlowId(operation.getTargetObject().getValue());\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
+\r
+ List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
+ List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();\r
+ IntentId intentId = new IntentId(operation.getOperationId().getValue());\r
+ IntentVnMappingResult intentVnMappingResult = getIntentVnMappingResult(intentVnMappingResults, intentId);\r
+ List<VirtualResource> virtualResources = sortVirtualResources(intentVnMappingResult.getVirtualResource());\r
+ Iterator<VirtualResource> iterator = virtualResources.iterator();\r
+ VirtualResource virtualResource;\r
+ VirtualResource virtualResource1 = null;\r
+ VirtualPathId virtualPathId;\r
+ VirtualPath virtualPath;\r
+ VirtualLinkId virtualLinkId;\r
+ VirtualLink virtualLink;\r
+ VirtualNodeId virtualNodeId;\r
+ VnPnMappingResult vnPnMappingResult;\r
+\r
+ Map<VirtualNodeId, Map.Entry<VirtualPort, VirtualLink>> connectedVirtualSwitches;\r
+ VirtualPort layer2ExternalVirtualPort;\r
+ VirtualPort layer3ExternalVirtualPort;\r
+\r
+ PhysicalPathId physicalPathId;\r
+ PhysicalPathId physicalPathId1;\r
+ PhysicalPath physicalPath;\r
+ PhysicalPath physicalPath1;\r
+ PhysicalNodeId physicalNodeId;\r
+ PhysicalNodeId physicalNodeId1;\r
+ PhysicalPortId physicalPortId;\r
+ PhysicalPortId physicalPortId1;\r
+ PhysicalLink physicalLink;\r
+ PhysicalPort physicalPort;\r
+ PhysicalPort physicalPort1;\r
+\r
+ while ( iterator.hasNext() ) {\r
+ virtualResource = iterator.next();\r
+\r
+ if ( null == virtualResource1 ) {\r
+ if ( VirtualResource.VirtualResourceType.Vpath\r
+ == virtualResource.getVirtualResourceType() ) {\r
+ virtualPathId = new VirtualPathId(virtualResource.getVirtualResourceEntityId().getValue());\r
+ virtualPath = virtualNetworkHelper.getVirtualPath(virtualPathId);\r
+ virtualLinkId = virtualPath.getVirtualLink().get(0).getLinkId();\r
+ vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+ new VirtualResourceEntityId(virtualLinkId.getValue()));\r
+ physicalPathId = new PhysicalPathId(vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+ physicalPath = physicalNetworkHelper.getPhysicalPath(physicalPathId);\r
+\r
+ if ( physicalPath.getPhysicalLink().isEmpty() ) {\r
+ continue;\r
+ } else {\r
+ virtualLink = virtualNetworkHelper.getVirtualLink(virtualLinkId);\r
+ connectedVirtualSwitches = virtualNetworkHelper\r
+ .getConnectedVirtualSwitches(virtualLink.getSrcNodeId());\r
+\r
+ if ( null != connectedVirtualSwitches ) {\r
+ for ( Map.Entry<VirtualPort, VirtualLink> entry : connectedVirtualSwitches.values() ) {\r
+ vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+ new VirtualResourceEntityId(entry.getValue().getLinkId().getValue()));\r
+ physicalPathId1 = new PhysicalPathId(\r
+ vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+ physicalPath1 = physicalNetworkHelper.getPhysicalPath(physicalPathId1);\r
+ physicalLink = physicalNetworkHelper\r
+ .getFirstPhysicalLinkOfPhysicalPath(physicalPath1);\r
+ physicalPort = physicalNetworkHelper\r
+ .getPhysicalPort(physicalLink.getSrcNodeId(), physicalLink.getSrcPortId());\r
+\r
+ configIpTableEntryForOperation(user.getUserId(), nemoFlow,\r
+ physicalPort, physicalPath, (short)priority, true);\r
+ }\r
+ }\r
+\r
+ layer3ExternalVirtualPort = virtualNetworkHelper\r
+ .getLayer3ExternalVirtualPort(virtualLink.getSrcNodeId());\r
+\r
+ if ( null != layer3ExternalVirtualPort ) {\r
+ vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+ new VirtualResourceEntityId(layer3ExternalVirtualPort.getPortId().getValue()));\r
+ physicalNodeId = new PhysicalNodeId(\r
+ vnPnMappingResult.getParentPhysicalResourceEntityId().getValue());\r
+ physicalPortId = new PhysicalPortId(\r
+ vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+ physicalPort = physicalNetworkHelper.getPhysicalPort(physicalNodeId, physicalPortId);\r
+\r
+ configIpTableEntryForOperation(user.getUserId(), nemoFlow,\r
+ physicalPort, physicalPath, (short)priority, true);\r
+ }\r
+\r
+ layer2ExternalVirtualPort = virtualNetworkHelper\r
+ .getLayer2ExternalVirtualPort(virtualLink.getSrcNodeId());\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
+ physicalPort = physicalNetworkHelper.getPhysicalPort(physicalNodeId, physicalPortId);\r
+\r
+ configIpTableEntryForOperation(user.getUserId(), nemoFlow,\r
+ physicalPort, physicalPath, (short)priority, true);\r
+ }\r
+ }\r
+ } else if ( VirtualResource.VirtualResourceType.Vport\r
+ == virtualResource.getVirtualResourceType() ) {\r
+ virtualNodeId = new VirtualNodeId(virtualResource.getParentVirtualResourceEntityId().getValue());\r
+ vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+ new VirtualResourceEntityId(virtualResource.getVirtualResourceEntityId().getValue()));\r
+ physicalNodeId = new PhysicalNodeId(\r
+ vnPnMappingResult.getParentPhysicalResourceEntityId().getValue());\r
+ physicalPortId = new PhysicalPortId(vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+ physicalPort = physicalNetworkHelper.getPhysicalPort(physicalNodeId, physicalPortId);\r
+\r
+ connectedVirtualSwitches = virtualNetworkHelper.getConnectedVirtualSwitches(virtualNodeId);\r
+\r
+ if ( null != connectedVirtualSwitches ) {\r
+ for ( Map.Entry<VirtualPort, VirtualLink> entry : connectedVirtualSwitches.values() ) {\r
+ vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+ new VirtualResourceEntityId(entry.getValue().getLinkId().getValue()));\r
+ physicalPathId = new PhysicalPathId(\r
+ vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+ physicalPath = physicalNetworkHelper.getPhysicalPath(physicalPathId);\r
+ physicalLink = physicalNetworkHelper\r
+ .getFirstPhysicalLinkOfPhysicalPath(physicalPath);\r
+ physicalPort1 = physicalNetworkHelper\r
+ .getPhysicalPort(physicalLink.getSrcNodeId(), physicalLink.getSrcPortId());\r
+\r
+ configIpTableEntryForOperation(user.getUserId(), nemoFlow,\r
+ physicalNodeId, physicalPort1, physicalPort, (short)priority, true);\r
+ }\r
+ }\r
+\r
+ layer3ExternalVirtualPort = virtualNetworkHelper.getLayer3ExternalVirtualPort(virtualNodeId);\r
+\r
+ if ( null != layer3ExternalVirtualPort ) {\r
+ vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+ new VirtualResourceEntityId(layer3ExternalVirtualPort.getPortId().getValue()));\r
+ physicalNodeId1 = new PhysicalNodeId(\r
+ vnPnMappingResult.getParentPhysicalResourceEntityId().getValue());\r
+ physicalPortId1 = new PhysicalPortId(\r
+ vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+ physicalPort1 = physicalNetworkHelper.getPhysicalPort(physicalNodeId1, physicalPortId1);\r
+\r
+ configIpTableEntryForOperation(user.getUserId(), nemoFlow,\r
+ physicalNodeId1, physicalPort1, physicalPort, (short)priority, true);\r
+ }\r
+\r
+ layer2ExternalVirtualPort = virtualNetworkHelper.getLayer2ExternalVirtualPort(virtualNodeId);\r
+\r
+ if ( null != layer2ExternalVirtualPort ) {\r
+ vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+ new VirtualResourceEntityId(layer2ExternalVirtualPort.getPortId().getValue()));\r
+ physicalNodeId1 = new PhysicalNodeId(\r
+ vnPnMappingResult.getParentPhysicalResourceEntityId().getValue());\r
+ physicalPortId1 = new PhysicalPortId(\r
+ vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+ physicalPort1 = physicalNetworkHelper.getPhysicalPort(physicalNodeId1, physicalPortId1);\r
+\r
+ configIpTableEntryForOperation(user.getUserId(), nemoFlow,\r
+ physicalNodeId1, physicalPort1, physicalPort, (short)priority, true);\r
+ }\r
+ }\r
+ } else {\r
+ if ( VirtualResource.VirtualResourceType.Vport == virtualResource1.getVirtualResourceType()\r
+ && VirtualResource.VirtualResourceType.Vpath == virtualResource.getVirtualResourceType() ) {\r
+ virtualPathId = new VirtualPathId(virtualResource.getVirtualResourceEntityId().getValue());\r
+ virtualPath = virtualNetworkHelper.getVirtualPath(virtualPathId);\r
+ virtualLinkId = virtualPath.getVirtualLink().get(0).getLinkId();\r
+ vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+ new VirtualResourceEntityId(virtualLinkId.getValue()));\r
+ physicalPathId = new PhysicalPathId(vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+ physicalPath = physicalNetworkHelper.getPhysicalPath(physicalPathId);\r
+\r
+ if ( physicalPath.getPhysicalLink().isEmpty() ) {\r
+ continue;\r
+ } else {\r
+ vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+ new VirtualResourceEntityId(virtualResource1.getVirtualResourceEntityId().getValue()));\r
+ physicalNodeId = new PhysicalNodeId(\r
+ vnPnMappingResult.getParentPhysicalResourceEntityId().getValue());\r
+ physicalPortId = new PhysicalPortId(\r
+ vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+ physicalPort = physicalNetworkHelper.getPhysicalPort(physicalNodeId, physicalPortId);\r
+\r
+ configIpTableEntryForOperation(user.getUserId(), nemoFlow,\r
+ physicalPort, physicalPath, (short)priority, true);\r
+ }\r
+ } else if ( VirtualResource.VirtualResourceType.Vpath == virtualResource1.getVirtualResourceType()\r
+ && VirtualResource.VirtualResourceType.Vport == virtualResource.getVirtualResourceType() ) {\r
+ virtualPathId = new VirtualPathId(virtualResource1.getVirtualResourceEntityId().getValue());\r
+ virtualPath = virtualNetworkHelper.getVirtualPath(virtualPathId);\r
+ virtualLinkId = virtualPath.getVirtualLink().get(0).getLinkId();\r
+ vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+ new VirtualResourceEntityId(virtualLinkId.getValue()));\r
+ physicalPathId = new PhysicalPathId(vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+ physicalPath = physicalNetworkHelper.getPhysicalPath(physicalPathId);\r
+ physicalLink = physicalNetworkHelper.getLastPhysicalLinkOfPhysicalPath(physicalPath);\r
+ physicalPort1 = physicalNetworkHelper\r
+ .getPhysicalPort(physicalLink.getDestNodeId(), physicalLink.getDestPortId());\r
+\r
+ vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+ new VirtualResourceEntityId(virtualResource.getVirtualResourceEntityId().getValue()));\r
+ physicalNodeId = new PhysicalNodeId(\r
+ vnPnMappingResult.getParentPhysicalResourceEntityId().getValue());\r
+ physicalPortId = new PhysicalPortId(\r
+ vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+ physicalPort = physicalNetworkHelper.getPhysicalPort(physicalNodeId, physicalPortId);\r
+\r
+ configIpTableEntryForOperation(user.getUserId(), nemoFlow,\r
+ physicalNodeId, physicalPort1, physicalPort, (short)priority, true);\r
+ } else if ( VirtualResource.VirtualResourceType.Vport == virtualResource1.getVirtualResourceType()\r
+ && VirtualResource.VirtualResourceType.Vport == virtualResource.getVirtualResourceType() ) {\r
+ vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+ new VirtualResourceEntityId(virtualResource1.getVirtualResourceEntityId().getValue()));\r
+ physicalNodeId1 = new PhysicalNodeId(\r
+ vnPnMappingResult.getParentPhysicalResourceEntityId().getValue());\r
+ physicalPortId1 = new PhysicalPortId(\r
+ vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+ physicalPort1 = physicalNetworkHelper.getPhysicalPort(physicalNodeId1, physicalPortId1);\r
+\r
+ vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+ new VirtualResourceEntityId(virtualResource.getVirtualResourceEntityId().getValue()));\r
+ physicalNodeId = new PhysicalNodeId(\r
+ vnPnMappingResult.getParentPhysicalResourceEntityId().getValue());\r
+ physicalPortId = new PhysicalPortId(\r
+ vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+ physicalPort = physicalNetworkHelper.getPhysicalPort(physicalNodeId, physicalPortId);\r
+\r
+ configIpTableEntryForOperation(user.getUserId(), nemoFlow,\r
+ physicalNodeId1, physicalPort1, physicalPort, (short)priority, true);\r
+ }\r
+ }\r
+\r
+ virtualResource1 = virtualResource;\r
+ }\r
+\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji, Shixing Liu\r
+ * @param physicalNodeId TODO\r
+ * @param physicalPortId TODO\r
+ * @return TODO\r
+ */\r
+ private MacAddress getMacAddressOfConnectedExternalDevice(PhysicalNodeId physicalNodeId,\r
+ PhysicalPortId physicalPortId) {\r
+ com.google.common.collect.Table<PhysicalNodeId, PhysicalPortId, MacAddress> externalNetworkMacTable =\r
+ this.resourceManager.getExternalNetworkMacTable();\r
+\r
+ MacAddress macAddress = externalNetworkMacTable.get(physicalNodeId, physicalPortId);\r
+ if(macAddress == null){\r
+ LOG.info("nemo: cannot find external network device mac address");\r
+ }\r
+ LOG.info("nemo: external network device mac address");\r
+\r
+ return macAddress;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ * @param userIntentVnMapping TODO\r
+ * @param virtualNodeId TODO\r
+ * @return TODO\r
+ */\r
+ private MacAddress getGateWayMacAddress(UserIntentVnMapping userIntentVnMapping,\r
+ VirtualNodeId virtualNodeId) {\r
+ List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
+ VirtualResource virtualResource;\r
+\r
+ for ( IntentVnMappingResult intentVnMappingResult : intentVnMappingResults ) {\r
+ virtualResource = intentVnMappingResult.getVirtualResource().get(0);\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
+\r
+ return gatewayMacAddress.get(nodeId);\r
+ }\r
+ }\r
+\r
+ return null;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ * @param flows TODO\r
+ * @param flowId TODO\r
+ * @return TODO\r
+ */\r
+ private org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow getFlow(\r
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow> flows,\r
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.FlowId flowId) {\r
+ for ( org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow\r
+ flow : flows ) {\r
+ if ( flow.getFlowId().equals(flowId) ) {\r
+ return flow;\r
+ }\r
+ }\r
+\r
+ return null;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ * @param matchItems TODO\r
+ * @param matchItemName TODO\r
+ * @return TODO\r
+ */\r
+ private MatchItem getMatchItem(List<MatchItem> matchItems, MatchItemName matchItemName) {\r
+ for ( MatchItem matchItem : matchItems ) {\r
+ if ( matchItem.getMatchItemName().equals(matchItemName) ) {\r
+ return matchItem;\r
+ }\r
+ }\r
+\r
+ return null;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ * @param intentVnMappingResults TODO\r
+ * @param intentId TODO\r
+ * @return TODO\r
+ */\r
+ private IntentVnMappingResult getIntentVnMappingResult(\r
+ List<IntentVnMappingResult> intentVnMappingResults, IntentId intentId) {\r
+ for ( IntentVnMappingResult intentVnMappingResult : intentVnMappingResults ) {\r
+ if ( intentVnMappingResult.getIntentId().equals(intentId) ) {\r
+ return intentVnMappingResult;\r
+ }\r
+ }\r
+\r
+ return null;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ * @param vnPnMappingResults TODO\r
+ * @param virtualResourceEntityId TODO\r
+ * @return TODO\r
+ */\r
+ private VnPnMappingResult getVnPnMappingResult(List<VnPnMappingResult> vnPnMappingResults,\r
+ VirtualResourceEntityId virtualResourceEntityId) {\r
+ for ( VnPnMappingResult vnPnMappingResult : vnPnMappingResults ) {\r
+ if ( vnPnMappingResult.getVirtualResourceEntityId().equals(virtualResourceEntityId) ) {\r
+ return vnPnMappingResult;\r
+ }\r
+ }\r
+\r
+ return null;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ * @param virtualResources TODO\r
+ * @return TODO\r
+ */\r
+ private List<VirtualResource> sortVirtualResources(List<VirtualResource> virtualResources) {\r
+ if ( null == virtualResources || 2 > virtualResources.size() ) {\r
+ return virtualResources;\r
+ }\r
+\r
+ List<VirtualResource> sortedVirtualResources =\r
+ new ArrayList<VirtualResource>(virtualResources.size());\r
+ sortedVirtualResources.addAll(virtualResources);\r
+\r
+ for ( VirtualResource virtualResource : virtualResources ) {\r
+ sortedVirtualResources.set(virtualResource.getOrder().intValue(), virtualResource);\r
+ }\r
+\r
+ return sortedVirtualResources;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ * @param userId TODO\r
+ * @param macAddress TODO\r
+ * @param physicalNodeId TODO\r
+ * @param physicalPort TODO\r
+ */\r
+ private void configMacTableEntry(UserId userId, MacAddress macAddress,\r
+ PhysicalNodeId physicalNodeId, PhysicalPort physicalPort) {\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().setEthernetDestination(new EthernetDestinationBuilder().setAddress(macAddress).build());\r
+ EthernetMatch ethernetMatch = ethernetMatchBuilder.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).setMetadata(metadata).build();\r
+\r
+ OutputAction outputAction = new OutputActionBuilder().setOutputNodeConnector(createNodeConnectorId(physicalPort.getPortId())).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(MAC_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
+ * @author Zhigang Ji\r
+ * @param userId TODO\r
+ * @param macAddress TODO\r
+ * @param physicalPath TODO\r
+ */\r
+ private void configMacTableEntry(UserId userId, MacAddress macAddress,\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
+\r
+ EthernetMatchBuilder ethernetMatchBuilder = new EthernetMatchBuilder().setEthernetDestination(new EthernetDestinationBuilder().setAddress(macAddress).build());\r
+ EthernetMatch ethernetMatch = ethernetMatchBuilder.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).setMetadata(metadata).build();\r
+\r
+ PushMplsAction pushMplsAction = new PushMplsActionBuilder().setEthernetType(ETH_TYPE_MPLS).build();\r
+ PushMplsActionCase pushMplsActionCase = new PushMplsActionCaseBuilder().setPushMplsAction(pushMplsAction).build();\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(physicalPath.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
+\r
+ OutputAction outputAction = new OutputActionBuilder().setOutputNodeConnector(createNodeConnectorId(physicalLink.getSrcPortId())).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(MAC_TABLE_ID).setPriority(DEFAULT_FLOW_PRIORITY);\r
+ Flow flow = flowBuilder.setMatch(match).setInstructions(instructions).build();\r
+\r
+ NodeId nodeId = createNodeId(physicalLink.getSrcNodeId());\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
+ * @author Zhigang Ji\r
+ * @param userId TODO\r
+ * @param ipPrefix TODO\r
+ * @param physicalNodeId TODO\r
+ * @param physicalPort TODO\r
+ * @param goToArpTable TODO\r
+ */\r
+ private void configIpTableEntry(UserId userId, IpPrefix ipPrefix, PhysicalNodeId physicalNodeId,\r
+ PhysicalPort physicalPort, boolean goToArpTable) {\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
+ MetadataBuilder metadataBuilder = new MetadataBuilder().setMetadata(BigInteger.valueOf(metadatas.get(userId)));\r
+ Metadata metadata = metadataBuilder.build();\r
+\r
+ Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder().setIpv4Destination(ipPrefix.getIpv4Prefix());\r
+ Ipv4Match ipv4Match = ipv4MatchBuilder.build();\r
+\r
+ Match match = new MatchBuilder().setEthernetMatch(ethernetMatch).setMetadata(metadata).setLayer3Match(ipv4Match).build();\r
+\r
+ DecNwTtl decNwTtl = new DecNwTtlBuilder().build();\r
+ DecNwTtlCase decNwTtlCase = new DecNwTtlCaseBuilder().setDecNwTtl(decNwTtl).build();\r
+ Action actionDecNW = new ActionBuilder().setOrder(actionList.size()).setAction(decNwTtlCase).build();\r
+ actionList.add(actionDecNW);\r
+\r
+ ethernetMatchBuilder = new EthernetMatchBuilder().setEthernetSource(new EthernetSourceBuilder().setAddress(physicalPort.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
+ if ( goToArpTable )\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
+ WriteMetadata writeMetadata = new WriteMetadataBuilder().setMetadata(BigInteger.valueOf(metadatas.get(userId))).setMetadataMask(new BigInteger(DEFAULT_METADATA_MASK, 16)).build();\r
+ WriteMetadataCase writeMetadataCase = new WriteMetadataCaseBuilder().setWriteMetadata(writeMetadata).build();\r
+ Instruction instructionMeta = new InstructionBuilder().setOrder(instructionList.size()).setInstruction(writeMetadataCase).build();\r
+ instructionList.add(instructionMeta);\r
+\r
+ GoToTable gotoTable = new GoToTableBuilder().setTableId(ARP_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
+ }\r
+ else\r
+ {\r
+ ethernetMatchBuilder = new EthernetMatchBuilder().setEthernetDestination(new EthernetDestinationBuilder().setAddress(getMacAddressOfConnectedExternalDevice(physicalNodeId, physicalPort.getPortId())).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
+ OutputAction outputAction = new OutputActionBuilder().setOutputNodeConnector(createNodeConnectorId(physicalPort.getPortId())).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
+\r
+ Instructions instructions = new InstructionsBuilder().setInstruction(instructionList).build();\r
+\r
+ FlowId flowId = new FlowId(UUID.randomUUID().toString());\r
+ FlowBuilder flowBuilder = baseFlowBuilder().setId(flowId).setTableId(IP_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
+ * @author Zhigang Ji\r
+ * @param userId TODO\r
+ * @param ipPrefix TODO\r
+ * @param physicalPath TODO\r
+ * @param goToArpTable TODO\r
+ */\r
+ private void configIpTableEntry(UserId userId, IpPrefix ipPrefix,\r
+ PhysicalPath physicalPath, boolean goToArpTable) {\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
+\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
+ Metadata metadata = metadataBuilder.build();\r
+\r
+ Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder().setIpv4Destination(ipPrefix.getIpv4Prefix());\r
+ Ipv4Match ipv4Match = ipv4MatchBuilder.build();\r
+\r
+ Match match = new MatchBuilder().setEthernetMatch(ethernetMatch).setMetadata(metadata).setLayer3Match(ipv4Match).build();\r
+\r
+ if ( 0 < physicalPath.getBandwidth() ) {\r
+ org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.meter._case.Meter\r
+ meter = new org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.meter._case.MeterBuilder()\r
+ .setMeterId(new MeterId(meterIdsOfPhysicalPaths.get(physicalPath.getPathId()))).build();\r
+ MeterCase meterCase = new MeterCaseBuilder().setMeter(meter).build();\r
+ Instruction instructionMeter = new InstructionBuilder().setOrder(instructionList.size()).setInstruction(meterCase).build();\r
+ instructionList.add(instructionMeter);\r
+ }\r
+\r
+ DecNwTtl decNwTtl = new DecNwTtlBuilder().build();\r
+ DecNwTtlCase decNwTtlCase = new DecNwTtlCaseBuilder().setDecNwTtl(decNwTtl).build();\r
+ Action actionDecNW = new ActionBuilder().setOrder(actionList.size()).setAction(decNwTtlCase).build();\r
+ actionList.add(actionDecNW);\r
+\r
+ if ( goToArpTable )\r
+ {\r
+ PhysicalPort physicalPort = physicalNetworkHelper.getPhysicalPort(physicalLink.getSrcNodeId(), physicalLink.getSrcPortId());\r
+\r
+ ethernetMatchBuilder = new EthernetMatchBuilder().setEthernetSource(new EthernetSourceBuilder().setAddress(physicalPort.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
+ 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
+ WriteMetadata writeMetadata = new WriteMetadataBuilder().setMetadata(BigInteger.valueOf(metadatas.get(userId))).setMetadataMask(new BigInteger(DEFAULT_METADATA_MASK, 16)).build();\r
+ WriteMetadataCase writeMetadataCase = new WriteMetadataCaseBuilder().setWriteMetadata(writeMetadata).build();\r
+ Instruction instructionMeta = new InstructionBuilder().setOrder(instructionList.size()).setInstruction(writeMetadataCase).build();\r
+ instructionList.add(instructionMeta);\r
+\r
+ GoToTable gotoTable = new GoToTableBuilder().setTableId(ARP_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
+ }\r
+ else\r
+ {\r
+ PushMplsAction pushMplsAction = new PushMplsActionBuilder().setEthernetType(ETH_TYPE_MPLS).build();\r
+ PushMplsActionCase pushMplsActionCase = new PushMplsActionCaseBuilder().setPushMplsAction(pushMplsAction).build();\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(physicalPath.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
+\r
+ OutputAction outputAction = new OutputActionBuilder().setOutputNodeConnector(createNodeConnectorId(physicalLink.getSrcPortId())).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
+\r
+ Instructions instructions = new InstructionsBuilder().setInstruction(instructionList).build();\r
+\r
+ FlowId flowId = new FlowId(UUID.randomUUID().toString());\r
+ FlowBuilder flowBuilder = baseFlowBuilder().setId(flowId).setTableId(IP_TABLE_ID).setPriority(DEFAULT_FLOW_PRIORITY);\r
+ Flow flow = flowBuilder.setMatch(match).setInstructions(instructions).build();\r
+\r
+ NodeId nodeId = createNodeId(physicalLink.getSrcNodeId());\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
+ * @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
+ 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
+ MetadataBuilder metadataBuilder = new MetadataBuilder().setMetadata(BigInteger.valueOf(metadatas.get(userId)));\r
+ Metadata metadata = metadataBuilder.build();\r
+\r
+ Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder().setIpv4Destination(ipPrefix.getIpv4Prefix());\r
+ Ipv4Match ipv4Match = ipv4MatchBuilder.build();\r
+\r
+ Match match = new MatchBuilder().setEthernetMatch(ethernetMatch).setMetadata(metadata).setLayer3Match(ipv4Match).build();\r
+\r
+ DecNwTtl decNwTtl = new DecNwTtlBuilder().build();\r
+ DecNwTtlCase decNwTtlCase = new DecNwTtlCaseBuilder().setDecNwTtl(decNwTtl).build();\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
+ instructionList.add(instructionApply);\r
+\r
+ WriteMetadata writeMetadata = new WriteMetadataBuilder().setMetadata(BigInteger.valueOf(metadatas.get(userId))).setMetadataMask(new BigInteger(DEFAULT_METADATA_MASK, 16)).build();\r
+ WriteMetadataCase writeMetadataCase = new WriteMetadataCaseBuilder().setWriteMetadata(writeMetadata).build();\r
+ Instruction instructionMeta = new InstructionBuilder().setOrder(instructionList.size()).setInstruction(writeMetadataCase).build();\r
+ instructionList.add(instructionMeta);\r
+\r
+ GoToTable gotoTable = new GoToTableBuilder().setTableId(ARP_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
+\r
+ Instructions instructions = new InstructionsBuilder().setInstruction(instructionList).build();\r
+\r
+ FlowId flowId = new FlowId(UUID.randomUUID().toString());\r
+ FlowBuilder flowBuilder = baseFlowBuilder().setId(flowId).setTableId(IP_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
+ * @author Zhigang Ji\r
+ * @param userId TODO\r
+ * @param virtualArp TODO\r
+ * @param physicalPath TODO\r
+ */\r
+ private void configArpTableEntry(UserId userId, VirtualArp virtualArp, 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
+\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
+ PushMplsAction pushMplsAction = new PushMplsActionBuilder().setEthernetType(ETH_TYPE_MPLS).build();\r
+ PushMplsActionCase pushMplsActionCase = new PushMplsActionCaseBuilder().setPushMplsAction(pushMplsAction).build();\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(physicalPath.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
+\r
+ ethernetMatchBuilder = new EthernetMatchBuilder().setEthernetDestination(new EthernetDestinationBuilder().setAddress(virtualArp.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
+ OutputAction outputAction = new OutputActionBuilder().setOutputNodeConnector(createNodeConnectorId(physicalLink.getSrcPortId())).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(physicalLink.getSrcNodeId());\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
+ * @author Zhigang Ji\r
+ * @param userId TODO\r
+ * @param nemoFlow TODO\r
+ * @param physicalNodeId TODO\r
+ * @param inPhysicalPort TODO\r
+ * @param outPhysicalPort TODO\r
+ * @param policyPriority TODO\r
+ * @param layer3Forwarding TODO\r
+ */\r
+ private void configIpTableEntryForOperation(UserId userId,\r
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow nemoFlow,\r
+ PhysicalNodeId physicalNodeId,\r
+ PhysicalPort inPhysicalPort,\r
+ PhysicalPort outPhysicalPort,\r
+ short policyPriority,\r
+ boolean layer3Forwarding) {\r
+ WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();\r
+ List<Instruction> instructionList = new LinkedList<Instruction>();\r
+ List<Action> actionList = new LinkedList<Action>();\r
+\r
+ Match match = createMatch(userId, nemoFlow, inPhysicalPort);\r
+\r
+ if ( layer3Forwarding )\r
+ {\r
+ DecNwTtl decNwTtl = new DecNwTtlBuilder().build();\r
+ DecNwTtlCase decNwTtlCase = new DecNwTtlCaseBuilder().setDecNwTtl(decNwTtl).build();\r
+ Action actionDecNW = new ActionBuilder().setOrder(actionList.size()).setAction(decNwTtlCase).build();\r
+ actionList.add(actionDecNW);\r
+\r
+ EthernetMatchBuilder ethernetMatchBuilder = new EthernetMatchBuilder().setEthernetSource(new EthernetSourceBuilder().setAddress(outPhysicalPort.getMacAddress()).build());\r
+ EthernetMatch 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
+\r
+ EthernetMatchBuilder ethernetMatchBuilder = new EthernetMatchBuilder().setEthernetDestination(new EthernetDestinationBuilder().setAddress(getMacAddressOfConnectedExternalDevice(physicalNodeId, outPhysicalPort.getPortId())).build());\r
+ EthernetMatch 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(outPhysicalPort.getPortId())).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(layer3Forwarding ? IP_TABLE_ID : MAC_TABLE_ID);\r
+ Flow flow = flowBuilder.setPriority(DEFAULT_FLOW_PRIORITY + policyPriority).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
+ * @author Zhigang Ji\r
+ * @param userId TODO\r
+ * @param nemoFlow TODO\r
+ * @param inPhysicalPort TODO\r
+ * @param outPhysicalPath TODO\r
+ * @param policyPriority TODO\r
+ * @param layer3Forwarding TODO\r
+ */\r
+ private void configIpTableEntryForOperation(UserId userId,\r
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow nemoFlow,\r
+ PhysicalPort inPhysicalPort,\r
+ PhysicalPath outPhysicalPath,\r
+ short policyPriority,\r
+ boolean layer3Forwarding) {\r
+ WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();\r
+ PhysicalLink physicalLink = physicalNetworkHelper.getFirstPhysicalLinkOfPhysicalPath(outPhysicalPath);\r
+ List<Instruction> instructionList = new LinkedList<Instruction>();\r
+ List<Action> actionList = new LinkedList<Action>();\r
+\r
+ Match match = createMatch(userId, nemoFlow, inPhysicalPort);\r
+\r
+ if ( layer3Forwarding )\r
+ {\r
+ DecNwTtl decNwTtl = new DecNwTtlBuilder().build();\r
+ DecNwTtlCase decNwTtlCase = new DecNwTtlCaseBuilder().setDecNwTtl(decNwTtl).build();\r
+ Action actionDecNW = new ActionBuilder().setOrder(actionList.size()).setAction(decNwTtlCase).build();\r
+ actionList.add(actionDecNW);\r
+ }\r
+\r
+ PushMplsAction pushMplsAction = new PushMplsActionBuilder().setEthernetType(ETH_TYPE_MPLS).build();\r
+ PushMplsActionCase pushMplsActionCase = new PushMplsActionCaseBuilder().setPushMplsAction(pushMplsAction).build();\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
+ 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(physicalLink.getSrcPortId())).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(layer3Forwarding ? IP_TABLE_ID : MAC_TABLE_ID);\r
+ Flow flow = flowBuilder.setPriority(DEFAULT_FLOW_PRIORITY + policyPriority).setMatch(match).setInstructions(instructions).build();\r
+\r
+ NodeId nodeId = createNodeId(physicalLink.getSrcNodeId());\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
+ * @author Zhigang Ji\r
+ * @param userId TODO\r
+ * @param nemoFlow TODO\r
+ * @param physicalPort TODO\r
+ * @return TODO\r
+ */\r
+ private Match createMatch(UserId userId,\r
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow nemoFlow,\r
+ PhysicalPort physicalPort) {\r
+ List<MatchItem> matchItems = nemoFlow.getMatchItem();\r
+ MatchItem srcIpMatchItem = getMatchItem(matchItems, new MatchItemName("src-ip"));\r
+ MatchItem dstIpMatchItem = getMatchItem(matchItems, new MatchItemName("dst-ip"));\r
+\r
+ EthernetMatchBuilder ethernetMatchBuilder = new EthernetMatchBuilder();\r
+ Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder();\r
+ MetadataBuilder metadataBuilder = null;\r
+ boolean containEthernetMatch = false;\r
+ boolean containIpv4Match = false;\r
+\r
+ if ( null != userId ) {\r
+ metadataBuilder = new MetadataBuilder().setMetadata(BigInteger.valueOf(metadatas.get(userId)));\r
+ }\r
+\r
+ if ( null != srcIpMatchItem || null != dstIpMatchItem ) {\r
+ ethernetMatchBuilder = ethernetMatchBuilder.setEthernetType(new EthernetTypeBuilder().setType(new EtherType((long)ETH_TYPE_IP)).build());\r
+ containEthernetMatch = true;\r
+ }\r
+\r
+ if ( null != srcIpMatchItem ) {\r
+ String matchItemValue = srcIpMatchItem.getMatchItemValue().getStringValue();\r
+ ipv4MatchBuilder = ipv4MatchBuilder.setIpv4Source(new Ipv4Prefix(matchItemValue));\r
+ containIpv4Match = true;\r
+ }\r
+\r
+ if ( null != dstIpMatchItem ) {\r
+ String matchItemValue = dstIpMatchItem.getMatchItemValue().getStringValue();\r
+ ipv4MatchBuilder = ipv4MatchBuilder.setIpv4Destination(new Ipv4Prefix(matchItemValue));\r
+ containIpv4Match = true;\r
+ }\r
+\r
+ MatchBuilder matchBuilder = new MatchBuilder();\r
+\r
+ if ( null != physicalPort ) {\r
+ matchBuilder = matchBuilder.setInPort(createNodeConnectorId(physicalPort.getPortId()));\r
+ }\r
+\r
+ if ( containEthernetMatch ) {\r
+ matchBuilder = matchBuilder.setEthernetMatch(ethernetMatchBuilder.build());\r
+ }\r
+\r
+ if ( null != userId ) {\r
+ matchBuilder = matchBuilder.setMetadata(metadataBuilder.build());\r
+ }\r
+\r
+ if ( containIpv4Match ) {\r
+ matchBuilder = matchBuilder.setLayer3Match(ipv4MatchBuilder.build());\r
+ }\r
+\r
+ return matchBuilder.build();\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ * @return TODO\r
+ */\r
+ private FlowBuilder baseFlowBuilder() {\r
+ return new FlowBuilder().setBarrier(false).setHardTimeout(0).setIdleTimeout(0);\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ * @param physicalPortId TODO\r
+ * @return TODO\r
+ */\r
+ private NodeConnectorId createNodeConnectorId(PhysicalPortId physicalPortId) {\r
+ return new NodeConnectorId(physicalPortId.getValue());\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ * @param nodeId TODO\r
+ * @param nodeConnectorId TODO\r
+ * @return TODO\r
+ */\r
+ private InstanceIdentifier<NodeConnector> createNodeConnectorPath(NodeId nodeId, NodeConnectorId nodeConnectorId) {\r
+ return createNodePath(nodeId).child(NodeConnector.class, new NodeConnectorKey(nodeConnectorId));\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ * @param physicalNodeId TODO\r
+ * @param physicalPortId TODO\r
+ * @return TODO\r
+ */\r
+ private NodeConnectorRef createNodeConnectorRef(PhysicalNodeId physicalNodeId, PhysicalPortId physicalPortId) {\r
+ return new NodeConnectorRef(createNodeConnectorPath(createNodeId(physicalNodeId), createNodeConnectorId(physicalPortId)));\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ * @param physicalNodeId TODO\r
+ * @return TODO\r
+ */\r
+ private NodeId createNodeId(PhysicalNodeId physicalNodeId) {\r
+ return new NodeId(physicalNodeId.getValue());\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ * @param nodeId TODO\r
+ * @return TODO\r
+ */\r
+ private InstanceIdentifier<Node> createNodePath(NodeId nodeId) {\r
+ return InstanceIdentifier.builder(Nodes.class).child(Node.class, new NodeKey(nodeId)).build();\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ * @param physicalNodeId TODO\r
+ * @return TODO\r
+ */\r
+ private NodeRef createNodeRef(PhysicalNodeId physicalNodeId) {\r
+ return new NodeRef(createNodePath(createNodeId(physicalNodeId)));\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ * @param nodeId TODO\r
+ * @param tableId TODO\r
+ * @return TODO\r
+ */\r
+ private InstanceIdentifier<Table> createTablePath(NodeId nodeId, Short tableId) {\r
+ return createNodePath(nodeId).builder().augmentation(FlowCapableNode.class).child(Table.class, new TableKey(tableId)).build();\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ * @param nodeId TODO\r
+ * @param tableId TODO\r
+ * @param flowId TODO\r
+ * @return TODO\r
+ */\r
+ private InstanceIdentifier<Flow> createFlowPath(NodeId nodeId, Short tableId, FlowId flowId) {\r
+ return createTablePath(nodeId, tableId).child(Flow.class, new FlowKey(flowId));\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ * @param ipAddress TODO\r
+ * @return TODO\r
+ */\r
+ private IpPrefix convertIpAddressToIpPrefix(IpAddress ipAddress) {\r
+ return new IpPrefix(new Ipv4Prefix(ipAddress.getIpv4Address().getValue() + "/32"));\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ */\r
+ private class MplsLabelGenerator {\r
+ private int i = 0;\r
+\r
+ protected int generateMplsLabel() {\r
+ return ++i;\r
+ }\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ */\r
+ private class MeterIdGenerator {\r
+ private long i = 0;\r
+\r
+ protected long generateMeterId() {\r
+ return ++i;\r
+ }\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ */\r
+ private class PhysicalNetworkHelper {\r
+ private Map<PhysicalNodeId, PhysicalNode> physicalNodeMap;\r
+ private Map<PhysicalLinkId, PhysicalLink> physicalLinkMap;\r
+ private Map<PhysicalPathId, PhysicalPath> physicalPathMap;\r
+ private Map<PhysicalNodeId, Map<PhysicalPortId, PhysicalPort>> physicalPortMap;\r
+\r
+ public PhysicalNetworkHelper(PhysicalNetwork physicalNetwork) {\r
+ physicalNodeMap = new HashMap<PhysicalNodeId, PhysicalNode>();\r
+ physicalLinkMap = new HashMap<PhysicalLinkId, PhysicalLink>();\r
+ physicalPathMap = new HashMap<PhysicalPathId, PhysicalPath>();\r
+ physicalPortMap = new HashMap<PhysicalNodeId, Map<PhysicalPortId, PhysicalPort>>();\r
+\r
+ List<PhysicalNode> physicalNodes = physicalNetwork.getPhysicalNodes().getPhysicalNode();\r
+ Map<PhysicalPortId, PhysicalPort> physicalPorts;\r
+\r
+ for ( PhysicalNode physicalNode : physicalNodes ) {\r
+ physicalNodeMap.put(physicalNode.getNodeId(), physicalNode);\r
+\r
+ physicalPorts = new HashMap<PhysicalPortId, PhysicalPort>();\r
+ physicalPortMap.put(physicalNode.getNodeId(), physicalPorts);\r
+\r
+ for ( PhysicalPort physicalPort : physicalNode.getPhysicalPort() ) {\r
+ physicalPorts.put(physicalPort.getPortId(), physicalPort);\r
+ }\r
+ }\r
+\r
+ List<PhysicalLink> physicalLinks = physicalNetwork.getPhysicalLinks().getPhysicalLink();\r
+\r
+ for ( PhysicalLink physicalLink : physicalLinks ) {\r
+ physicalLinkMap.put(physicalLink.getLinkId(), physicalLink);\r
+ }\r
+\r
+ if ( null != physicalNetwork.getPhysicalPaths() ) {\r
+ List<PhysicalPath> physicalPaths = physicalNetwork.getPhysicalPaths().getPhysicalPath();\r
+\r
+ if ( null != physicalPaths ) {\r
+ for ( PhysicalPath physicalPath : physicalPaths ) {\r
+// physicalPathMap.put(physicalPath.getPathId(), physicalPath);\r
+ physicalPathMap.put(physicalPath.getPathId(),\r
+ sortPhysicalLinksOfPhysicalPath(physicalPath));\r
+ }\r
+ }\r
+ }\r
+\r
+ return;\r
+ }\r
+\r
+ protected PhysicalLink getPhysicalLink(PhysicalLinkId physicalLinkId) {\r
+ return physicalLinkMap.get(physicalLinkId);\r
+ }\r
+\r
+ protected PhysicalPath getPhysicalPath(PhysicalPathId physicalPathId) {\r
+ return physicalPathMap.get(physicalPathId);\r
+ }\r
+\r
+ protected PhysicalPort getPhysicalPort(PhysicalNodeId physicalNodeId, PhysicalPortId physicalPortId) {\r
+ return physicalPortMap.get(physicalNodeId).get(physicalPortId);\r
+ }\r
+\r
+ protected PhysicalLink getFirstPhysicalLinkOfPhysicalPath(PhysicalPath physicalPath) {\r
+// for ( org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.path.instance.PhysicalLink\r
+// physicalLink : physicalPath.getPhysicalLink() ) {\r
+// if ( 0 == physicalLink.getOrder() ) {\r
+// return physicalLinkMap.get(physicalLink.getLinkId());\r
+// }\r
+// }\r
+//\r
+// return null;\r
+\r
+ if ( physicalPath.getPhysicalLink().isEmpty() ) {\r
+ return null;\r
+ }\r
+\r
+ PhysicalLinkId physicalLinkId = physicalPath.getPhysicalLink().get(0).getLinkId();\r
+\r
+ return physicalLinkMap.get(physicalLinkId);\r
+ }\r
+\r
+ protected PhysicalLink getLastPhysicalLinkOfPhysicalPath(PhysicalPath physicalPath) {\r
+// long order = physicalPath.getPhysicalLink().size() - 1;\r
+//\r
+// for ( org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.path.instance.PhysicalLink\r
+// physicalLink : physicalPath.getPhysicalLink() ) {\r
+// if ( physicalLink.getOrder() == order ) {\r
+// return physicalLinkMap.get(physicalLink.getLinkId());\r
+// }\r
+// }\r
+//\r
+// return null;\r
+\r
+ if ( physicalPath.getPhysicalLink().isEmpty() ) {\r
+ return null;\r
+ }\r
+\r
+ PhysicalLinkId physicalLinkId = physicalPath.getPhysicalLink()\r
+ .get(physicalPath.getPhysicalLink().size() - 1).getLinkId();\r
+\r
+ return physicalLinkMap.get(physicalLinkId);\r
+ }\r
+\r
+ private PhysicalPath sortPhysicalLinksOfPhysicalPath(PhysicalPath physicalPath) {\r
+ if ( physicalPath.getPhysicalLink().isEmpty()\r
+ || 1 == physicalPath.getPhysicalLink().size() ) {\r
+ return physicalPath;\r
+ }\r
+\r
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.path.instance.PhysicalLink> sortedPhysicalLinks =\r
+ new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.path.instance.PhysicalLink>(physicalPath.getPhysicalLink().size());\r
+ sortedPhysicalLinks.addAll(physicalPath.getPhysicalLink());\r
+\r
+ for ( org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.path.instance.PhysicalLink\r
+ physicalLink : physicalPath.getPhysicalLink() ) {\r
+ sortedPhysicalLinks.set(physicalLink.getOrder().intValue(), physicalLink);\r
+ }\r
+\r
+ PhysicalPath physicalPath1 = new PhysicalPathBuilder(physicalPath)\r
+ .setPhysicalLink(sortedPhysicalLinks)\r
+ .build();\r
+\r
+ return physicalPath1;\r
+ }\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ */\r
+ private class VirtualNetworkHelper {\r
+ private Map<VirtualNodeId, VirtualNode> virtualNodeMap;\r
+ private Map<VirtualLinkId, VirtualLink> virtualLinkMap;\r
+ private Map<VirtualPathId, VirtualPath> virtualPathMap;\r
+ private Map<VirtualNodeId, VirtualNode> virtualRouterMap;\r
+ private Map<VirtualNodeId, Map<VirtualPortId, VirtualPort>> virtualPortMap;\r
+ private Map<VirtualNodeId, VirtualPort> layer2ExternalVirtualPortMap;\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<MacAddress, VirtualArp> macAddressKeyVirtualArpMap;\r
+\r
+ public VirtualNetworkHelper(VirtualNetwork virtualNetwork) {\r
+ virtualNodeMap = new HashMap<VirtualNodeId, VirtualNode>();\r
+ virtualLinkMap = new HashMap<VirtualLinkId, VirtualLink>();\r
+ virtualPathMap = new HashMap<VirtualPathId, VirtualPath>();\r
+ virtualRouterMap = new HashMap<VirtualNodeId, VirtualNode>();\r
+ virtualPortMap = new HashMap<VirtualNodeId, Map<VirtualPortId, VirtualPort>>();\r
+ layer2ExternalVirtualPortMap = new HashMap<VirtualNodeId, VirtualPort>();\r
+ layer3ExternalVirtualPortMap = new HashMap<VirtualNodeId, VirtualPort>();\r
+ virtualSwitchConnectedInternalVirtualPortMap =\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
+ macAddressKeyVirtualArpMap = new HashMap<MacAddress, VirtualArp>();\r
+\r
+ List<VirtualNode> virtualNodes = virtualNetwork.getVirtualNodes().getVirtualNode();\r
+ Map<VirtualPortId, VirtualPort> virtualPorts;\r
+\r
+ for ( VirtualNode virtualNode : virtualNodes ) {\r
+ virtualNodeMap.put(virtualNode.getNodeId(), virtualNode);\r
+\r
+ if ( VirtualNode.NodeType.Vrouter == virtualNode.getNodeType() ) {\r
+ virtualRouterMap.put(virtualNode.getNodeId(), virtualNode);\r
+ }\r
+\r
+ virtualPorts = new HashMap<VirtualPortId, VirtualPort>();\r
+ virtualPortMap.put(virtualNode.getNodeId(), virtualPorts);\r
+\r
+ for ( VirtualPort virtualPort : virtualNode.getVirtualPort() ) {\r
+ virtualPorts.put(virtualPort.getPortId(), virtualPort);\r
+\r
+ if ( VirtualPort.PortType.External == virtualPort.getPortType() ) {\r
+ if ( null == virtualPort.getExternalMacAddresses() ) {\r
+ layer3ExternalVirtualPortMap.put(virtualNode.getNodeId(), virtualPort);\r
+ } else {\r
+ layer2ExternalVirtualPortMap.put(virtualNode.getNodeId(), virtualPort);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ List<VirtualLink> virtualLinks = virtualNetwork.getVirtualLinks().getVirtualLink();\r
+ Map<VirtualNodeId, Map.Entry<VirtualPort, VirtualLink>> virtualSwitchConnectedInternalVirtualPorts;\r
+ Map<VirtualNodeId, Map.Entry<VirtualPort, VirtualLink>> virtualRouterConnectedInternalVirtualPorts;\r
+ VirtualNode virtualNode;\r
+ VirtualPort virtualPort;\r
+\r
+ for ( VirtualLink virtualLink : virtualLinks ) {\r
+ virtualLinkMap.put(virtualLink.getLinkId(), virtualLink);\r
+\r
+ virtualNode = virtualNodeMap.get(virtualLink.getDestNodeId());\r
+ virtualPort = virtualPortMap.get(virtualLink.getSrcNodeId()).get(virtualLink.getSrcPortId());\r
+\r
+ if ( VirtualNode.NodeType.Vswitch == virtualNode.getNodeType() ) {\r
+ virtualSwitchConnectedInternalVirtualPorts =\r
+ virtualSwitchConnectedInternalVirtualPortMap.get(virtualLink.getSrcNodeId());\r
+\r
+ if ( null == virtualSwitchConnectedInternalVirtualPorts ) {\r
+ virtualSwitchConnectedInternalVirtualPorts =\r
+ new HashMap<VirtualNodeId, Map.Entry<VirtualPort, VirtualLink>>();\r
+ virtualSwitchConnectedInternalVirtualPortMap.put(\r
+ virtualLink.getSrcNodeId(), virtualSwitchConnectedInternalVirtualPorts);\r
+ }\r
+\r
+ virtualSwitchConnectedInternalVirtualPorts.put(virtualLink.getDestNodeId(),\r
+ new AbstractMap.SimpleEntry<VirtualPort, VirtualLink>(virtualPort, virtualLink));\r
+ } else if ( VirtualNode.NodeType.Vrouter == virtualNode.getNodeType() ) {\r
+ virtualRouterConnectedInternalVirtualPorts =\r
+ virtualRouterConnectedInternalVirtualPortMap.get(virtualLink.getSrcNodeId());\r
+\r
+ if ( null == virtualRouterConnectedInternalVirtualPorts ) {\r
+ virtualRouterConnectedInternalVirtualPorts =\r
+ new HashMap<VirtualNodeId, Map.Entry<VirtualPort, VirtualLink>>();\r
+ virtualRouterConnectedInternalVirtualPortMap.put(\r
+ virtualLink.getSrcNodeId(), virtualRouterConnectedInternalVirtualPorts);\r
+ }\r
+\r
+ virtualRouterConnectedInternalVirtualPorts.put(virtualLink.getDestNodeId(),\r
+ new AbstractMap.SimpleEntry<VirtualPort, VirtualLink>(virtualPort, virtualLink));\r
+ }\r
+ }\r
+\r
+ List<VirtualPath> virtualPaths = virtualNetwork.getVirtualPaths().getVirtualPath();\r
+\r
+ for ( VirtualPath virtualPath : virtualPaths ) {\r
+ virtualPathMap.put(virtualPath.getPathId(), virtualPath);\r
+ }\r
+\r
+ List<VirtualArp> virtualArps = virtualNetwork.getVirtualArps().getVirtualArp();\r
+\r
+ for ( VirtualArp virtualArp : virtualArps ) {\r
+ virtualArpMap.put(virtualArp.getKey(), virtualArp);\r
+ macAddressKeyVirtualArpMap.put(virtualArp.getMacAddress(), virtualArp);\r
+ }\r
+\r
+ return;\r
+ }\r
+\r
+ protected VirtualLink getVirtualLink(VirtualLinkId virtualLinkId) {\r
+ return virtualLinkMap.get(virtualLinkId);\r
+ }\r
+\r
+ protected VirtualPath getVirtualPath(VirtualPathId virtualPathId) {\r
+ return virtualPathMap.get(virtualPathId);\r
+ }\r
+\r
+ protected Map<VirtualNodeId, VirtualNode> getVirtualRouters() {\r
+ return virtualRouterMap;\r
+ }\r
+\r
+ protected VirtualPort getLayer2ExternalVirtualPort(VirtualNodeId virtualNodeId) {\r
+ return layer2ExternalVirtualPortMap.get(virtualNodeId);\r
+ }\r
+\r
+ protected VirtualPort getLayer3ExternalVirtualPort(VirtualNodeId virtualNodeId) {\r
+ return layer3ExternalVirtualPortMap.get(virtualNodeId);\r
+ }\r
+\r
+ protected Map<VirtualNodeId, Map.Entry<VirtualPort, VirtualLink>> getConnectedVirtualSwitches(\r
+ VirtualNodeId virtualNodeId) {\r
+ return virtualSwitchConnectedInternalVirtualPortMap.get(virtualNodeId);\r
+ }\r
+\r
+ protected Map<VirtualNodeId, Map.Entry<VirtualPort, VirtualLink>> getConnectedVirtualRouters(\r
+ VirtualNodeId virtualNodeId) {\r
+ return virtualRouterConnectedInternalVirtualPortMap.get(virtualNodeId);\r
+ }\r
+\r
+ protected VirtualArp getVirtualArp(MacAddress macAddress) {\r
+ return macAddressKeyVirtualArpMap.get(macAddress);\r
+ }\r
+ }\r
+}\r