xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
- <groupId>org.opendaylight.nemo</groupId>
-
<parent>
<groupId>org.opendaylight.odlparent</groupId>
<artifactId>odlparent-lite</artifactId>
<version>1.6.0-SNAPSHOT</version>
- <relativePath/>
+ <relativePath />
</parent>
+ <groupId>org.opendaylight.nemo</groupId>
<artifactId>nemo-artifacts</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<url>https://wiki.opendaylight.org/view/NEMO:Main</url>
<tag>HEAD</tag>
</scm>
-</project>
+</project>
\ No newline at end of file
import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;\r
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
import org.opendaylight.nemo.intent.computation.PNComputationUnit;\r
+import org.opendaylight.nemo.intent.computation.PNResourcesTracker;\r
import org.opendaylight.nemo.intent.computation.VNComputationUnit;\r
import org.opendaylight.nemo.intent.computation.VNMappingUnit;\r
+import org.opendaylight.nemo.intent.condition.ConditionManager;\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.PhysicalPaths;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.paths.PhysicalPath;\r
*/\r
private OperationResolver operationResolver;\r
\r
+ /**\r
+ * The condition manager to resolve and manage the condition in the user's operation.\r
+ */\r
+ private ConditionManager conditionManager;\r
+\r
/**\r
* The physical network computation unit.\r
*/\r
*/\r
private Map<UserId, VNComputationUnit> vnComputationUnits;\r
\r
+ /**\r
+ * Track the physical resource, re-resolve intent if related physical resource removed.\r
+ */\r
+ private PNResourcesTracker pnResourcesTracker;\r
+\r
/**\r
* The virtual network mapping unit.\r
*/\r
nodeMapper = new NodeMapper(dataBroker);\r
connectionMapper = new ConnectionMapper(dataBroker, nodeMapper);\r
flowManager = new FlowManager(dataBroker);\r
- operationResolver = new OperationResolver(dataBroker);\r
+ conditionManager = new ConditionManager(this);\r
\r
pnComputationUnit = new PNComputationUnit(dataBroker);\r
vnComputationUnits = new HashMap<UserId, VNComputationUnit>();\r
- vnMappingUnit = new VNMappingUnit(dataBroker, pnComputationUnit);\r
+ pnResourcesTracker = new PNResourcesTracker(dataBroker, this);\r
+ vnMappingUnit = new VNMappingUnit(dataBroker, pnComputationUnit, pnResourcesTracker);\r
+\r
+ operationResolver = new OperationResolver(dataBroker, conditionManager, vnComputationUnits);\r
\r
LOG.debug("Initialized the renderer common intent resolver.");\r
\r
.build();\r
\r
if ( null != vnComputationUnit ) {\r
+ conditionManager.clear(userId);\r
+\r
vnComputationUnit.close();\r
vnComputationUnits.remove(userId);\r
\r
}\r
}\r
\r
+ List<Operation> operationsApplyingToNode = new LinkedList<Operation>();\r
+ List<Operation> operationsApplyingToConnection = new LinkedList<Operation>();\r
+ List<Operation> operationsApplyingToFlow = new LinkedList<Operation>();\r
+\r
if ( null != user.getOperations() ) {\r
List<Operation> operations = user.getOperations().getOperation();\r
\r
if ( null != operations ) {\r
- for ( Operation operation : operations ) {\r
- operationResolver.resolveOperation(user, operation, virtualNetwork, userIntentVnMapping);\r
- }\r
+ operationResolver.classifyOperations(user, operations, operationsApplyingToNode,\r
+ operationsApplyingToConnection, operationsApplyingToFlow);\r
+ }\r
+ }\r
+\r
+ if ( !operationsApplyingToNode.isEmpty() ) {\r
+ for ( Operation operation : operationsApplyingToNode ) {\r
+ operationResolver.resolveOperation(user, operation, virtualNetwork, userIntentVnMapping);\r
+ }\r
+ }\r
+\r
+ if ( !operationsApplyingToConnection.isEmpty() ) {\r
+ for ( Operation operation : operationsApplyingToConnection ) {\r
+ operationResolver.resolveOperation(user, operation, virtualNetwork, userIntentVnMapping);\r
}\r
}\r
\r
vnComputationUnit = new VNComputationUnit(dataBroker, virtualNetwork);\r
vnComputationUnits.put(userId, vnComputationUnit);\r
\r
+ int currentVirtualLinkNum = virtualLinks.getVirtualLink().size();\r
+\r
+ if ( !operationsApplyingToFlow.isEmpty() ) {\r
+ for ( Operation operation : operationsApplyingToFlow ) {\r
+ operationResolver.resolveOperation(user, operation, virtualNetwork, userIntentVnMapping);\r
+ }\r
+ }\r
+\r
+ List<VirtualLink> virtualLinkList = virtualLinks.getVirtualLink();\r
+ List<VirtualLink> unmappedVirtualLinkList =\r
+ virtualLinkList.subList(currentVirtualLinkNum, virtualLinkList.size());\r
+\r
+ vnMappingUnit.virtualNetworkMapping(virtualNetwork,\r
+ unmappedVirtualLinkList, userVnPnMapping, physicalPaths);\r
+\r
LOG.debug("{}", virtualNetwork);\r
LOG.debug("{}", userIntentVnMapping);\r
LOG.debug("{}", userVnPnMapping);\r
}\r
}\r
\r
+ if ( null != pnResourcesTracker ) {\r
+ pnResourcesTracker.close();\r
+ }\r
+\r
if ( null != vnMappingUnit ) {\r
vnMappingUnit.close();\r
}\r
* @param propertyName TODO\r
* @return TODO\r
*/\r
- protected static Property getNodeProperty(List<Property> properties, PropertyName propertyName) {\r
+ public static Property getNodeProperty(List<Property> properties, PropertyName propertyName) {\r
if ( null != properties ) {\r
for ( Property property : properties ) {\r
if ( property.getPropertyName().equals(propertyName) ) {\r
* @param intentId TODO\r
* @return TODO\r
*/\r
- protected static IntentVnMappingResult getIntentVnMappingResult(\r
+ public static IntentVnMappingResult getIntentVnMappingResult(\r
List<IntentVnMappingResult> intentVnMappingResults, IntentId intentId) {\r
for ( IntentVnMappingResult intentVnMappingResult : intentVnMappingResults ) {\r
if ( intentVnMappingResult.getIntentId().equals(intentId) ) {\r
* @param virtualNodeId TODO\r
* @return TODO\r
*/\r
- protected static VirtualNode getVirtualNode(List<VirtualNode> virtualNodes,\r
- VirtualNodeId virtualNodeId) {\r
+ public static VirtualNode getVirtualNode(List<VirtualNode> virtualNodes,\r
+ VirtualNodeId virtualNodeId) {\r
for ( VirtualNode virtualNode : virtualNodes ) {\r
if ( virtualNode.getNodeId().equals(virtualNodeId) ) {\r
return virtualNode;\r
* @param nodeId TODO\r
* @return TODO\r
*/\r
- protected static Node getNode(List<Node> nodes, NodeId nodeId) {\r
+ public static Node getNode(List<Node> nodes, NodeId nodeId) {\r
for ( Node node : nodes ) {\r
if ( node.getNodeId().equals(nodeId) ) {\r
return node;\r
* @param propertyName TODO\r
* @return TODO\r
*/\r
- protected static org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.connection.instance.Property getConnectionProperty(\r
+ public static org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.connection.instance.Property getConnectionProperty(\r
List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.connection.instance.Property> properties,\r
PropertyName propertyName) {\r
if ( null != properties ) {\r
* @param nodes TODO\r
* @return TODO\r
*/\r
- protected static boolean checkAllLayer2OperatingMode(List<SubNode> subNodes, List<Node> nodes) {\r
+ public static boolean checkAllLayer2OperatingMode(List<SubNode> subNodes, List<Node> nodes) {\r
if ( subNodes.isEmpty() ) {\r
return false;\r
}\r
* @param nodes TODO\r
* @return TODO\r
*/\r
- protected static boolean checkAllLayer3OperatingMode(List<SubNode> subNodes, List<Node> nodes) {\r
+ public static boolean checkAllLayer3OperatingMode(List<SubNode> subNodes, List<Node> nodes) {\r
if ( subNodes.isEmpty() ) {\r
return false;\r
}\r
* @param destVirtualNodeId TODO\r
* @return TODO\r
*/\r
- protected static VirtualLink getVirtualLink(List<VirtualLink> virtualLinks,\r
- VirtualNodeId srcVirtualNodeId,\r
- VirtualNodeId destVirtualNodeId) {\r
+ public static VirtualLink getVirtualLink(List<VirtualLink> virtualLinks,\r
+ VirtualNodeId srcVirtualNodeId,\r
+ VirtualNodeId destVirtualNodeId) {\r
for ( VirtualLink virtualLink : virtualLinks ) {\r
if ( virtualLink.getSrcNodeId().equals(srcVirtualNodeId)\r
&& virtualLink.getDestNodeId().equals(destVirtualNodeId) ) {\r
return null;\r
}\r
\r
- /**\r
- * TODO\r
- *\r
- * @param actions TODO\r
- * @param actionName TODO\r
- * @return TODO\r
- */\r
- protected static Action getAction(List<Action> actions, ActionName actionName) {\r
- for ( Action action : actions ) {\r
- if ( action.getActionName().equals(actionName) ) {\r
- return action;\r
- }\r
- }\r
-\r
- return null;\r
- }\r
-\r
- /**\r
- * TODO\r
- *\r
- * @param virtualNodes TODO\r
- * @param flow TODO\r
- * @param nodes TODO\r
- * @param intentVnMappingResults TODO\r
- * @return TODO\r
- */\r
- protected static VirtualNode getSourceVirtualRouterOfFlow(List<VirtualNode> virtualNodes,\r
- Flow flow, List<Node> nodes,\r
- List<IntentVnMappingResult> intentVnMappingResults) {\r
- MatchItemName matchItemName = new MatchItemName("src-ip");\r
- MatchItem matchItem = getMatchItem(flow.getMatchItem(), matchItemName);\r
-\r
- if ( null == matchItem ) {\r
- return null;\r
- }\r
-\r
- String matchItemValue = matchItem.getMatchItemValue().getStringValue();\r
- VirtualNode virtualNode = getVirtualRouterWithIpPrefix(virtualNodes,\r
- matchItemValue, nodes, intentVnMappingResults);\r
-\r
- return virtualNode;\r
- }\r
-\r
- /**\r
- * TODO\r
- *\r
- * @param virtualNodes TODO\r
- * @param flow TODO\r
- * @param nodes TODO\r
- * @param intentVnMappingResults TODO\r
- * @return TODO\r
- */\r
- protected static VirtualNode getDestinationVirtualRouterOfFlow(List<VirtualNode> virtualNodes,\r
- Flow flow, List<Node> nodes,\r
- List<IntentVnMappingResult> intentVnMappingResults) {\r
- MatchItemName matchItemName = new MatchItemName("dst-ip");\r
- MatchItem matchItem = getMatchItem(flow.getMatchItem(), matchItemName);\r
-\r
- if ( null == matchItem ) {\r
- return null;\r
- }\r
-\r
- String matchItemValue = matchItem.getMatchItemValue().getStringValue();\r
- VirtualNode virtualNode = getVirtualRouterWithIpPrefix(virtualNodes,\r
- matchItemValue, nodes, intentVnMappingResults);\r
-\r
- return virtualNode;\r
- }\r
-\r
- /**\r
- * TODO\r
- *\r
- * @param virtualResources TODO\r
- * @return TODO\r
- */\r
- protected static List<VirtualResource> sortVirtualResources(List<VirtualResource> virtualResources) {\r
- if ( virtualResources.isEmpty() || 1 == virtualResources.size() ) {\r
- return virtualResources;\r
- }\r
-\r
- List<VirtualResource> sortedVirtualResources = 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
\r
return null;\r
}\r
-\r
- /**\r
- * TODO\r
- *\r
- * @param matchItems TODO\r
- * @param matchItemName TODO\r
- * @return TODO\r
- */\r
- private static MatchItem getMatchItem(List<MatchItem> matchItems, MatchItemName matchItemName) {\r
- if ( null != matchItems ) {\r
- for ( MatchItem matchItem : matchItems ) {\r
- if ( matchItem.getMatchItemName().equals(matchItemName) ) {\r
- return matchItem;\r
- }\r
- }\r
- }\r
-\r
- return null;\r
- }\r
-\r
- /**\r
- * TODO\r
- *\r
- * @param virtualNodes TODO\r
- * @param ipPrefix TODO\r
- * @param nodes TODO\r
- * @param intentVnMappingResults TODO\r
- * @return TODO\r
- */\r
- private static VirtualNode getVirtualRouterWithIpPrefix(List<VirtualNode> virtualNodes,\r
- String ipPrefix, List<Node> nodes,\r
- List<IntentVnMappingResult> intentVnMappingResults) {\r
- NodeType layer2GroupNodeType = new NodeType("l2-group");\r
- NodeType externalGroupNodeType = new NodeType("ext-group");\r
- PropertyName propertyName = new PropertyName("ip-prefix");\r
- Property property;\r
- List<StringValue> propertyValues;\r
- IntentVnMappingResult intentVnMappingResult;\r
- VirtualResource virtualResource;\r
- VirtualNodeId virtualNodeId;\r
- VirtualNode virtualNode;\r
-\r
- for ( Node node : nodes ) {\r
- if ( node.getNodeType().equals(layer2GroupNodeType)\r
- || node.getNodeType().equals(externalGroupNodeType) ) {\r
- property = getNodeProperty(node.getProperty(), propertyName);\r
-\r
- if ( null != property ) {\r
- propertyValues = property.getPropertyValues().getStringValue();\r
-\r
- if ( containPropertyValue(propertyValues, ipPrefix) ) {\r
- intentVnMappingResult = getIntentVnMappingResult(intentVnMappingResults,\r
- new IntentId(node.getNodeId().getValue()));\r
-\r
- if ( null == intentVnMappingResult ) {\r
- return null;\r
- }\r
-\r
- virtualResource = intentVnMappingResult.getVirtualResource().get(0);\r
-\r
- if ( VirtualResource.VirtualResourceType.Vport\r
- == virtualResource.getVirtualResourceType() ) {\r
- virtualNodeId = new VirtualNodeId(\r
- virtualResource.getParentVirtualResourceEntityId().getValue());\r
- } else if ( VirtualResource.VirtualResourceType.Vnode\r
- == virtualResource.getVirtualResourceType() ) {\r
- virtualNodeId = new VirtualNodeId(\r
- virtualResource.getVirtualResourceEntityId().getValue());\r
- } else {\r
- return null;\r
- }\r
-\r
- virtualNode = getVirtualNode(virtualNodes, virtualNodeId);\r
-\r
- if ( null == virtualNode ) {\r
- return null;\r
- }\r
-\r
- if ( VirtualNode.NodeType.Vrouter == virtualNode.getNodeType() ) {\r
- return virtualNode;\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- return null;\r
- }\r
-\r
- /**\r
- * TODO\r
- *\r
- * @param propertyValues TODO\r
- * @param propertyValue TODO\r
- * @return TODO\r
- */\r
- private static boolean containPropertyValue(List<StringValue> propertyValues, String propertyValue) {\r
- for ( StringValue stringValue : propertyValues ) {\r
- if ( stringValue.getValue().equals(propertyValue) ) {\r
- return true;\r
- }\r
- }\r
-\r
- return false;\r
- }\r
}\r
package org.opendaylight.nemo.intent;\r
\r
import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
+import org.opendaylight.nemo.intent.action.ActionResolver;\r
+import org.opendaylight.nemo.intent.computation.VNComputationUnit;\r
+import org.opendaylight.nemo.intent.condition.ConditionDeterminer;\r
+import org.opendaylight.nemo.intent.condition.ConditionManager;\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.links.VirtualLink;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.links.VirtualLinkBuilder;\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.networks.virtual.network.virtual.paths.VirtualPathBuilder;\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.generic.virtual.network.rev151010.virtual.node.instance.VirtualPortBuilder;\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.IntentVnMappingResultBuilder;\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.intent.vn.mapping.results.user.intent.vn.mapping.intent.vn.mapping.result.VirtualResourceBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.ActionName;\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.NodeId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.NodeType;\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.common.rev151010.UserId;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Connection;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Node;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.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.operation.rev151010.action.instance.parameter.values.StringValue;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.condition.instance.ConditionSegment;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.operation.instance.Action;\r
import org.opendaylight.yangtools.yang.binding.DataObject;\r
import org.slf4j.Logger;\r
import org.slf4j.LoggerFactory;\r
\r
-import java.util.ArrayList;\r
import java.util.LinkedList;\r
import java.util.List;\r
-import java.util.UUID;\r
+import java.util.Map;\r
\r
/**\r
* Resolve the user's operation intent that might act on the node, connection\r
\r
private final DataBroker dataBroker;\r
\r
+ /**\r
+ * The condition manager to resolve and manage the condition in the operation.\r
+ */\r
+ private ConditionManager conditionManager;\r
+\r
/**\r
* The action resolver to resolve actions in the operation.\r
*/\r
private ActionResolver actionResolver;\r
\r
- public OperationResolver(DataBroker dataBroker) {\r
+ public OperationResolver(DataBroker dataBroker, ConditionManager conditionManager,\r
+ Map<UserId, VNComputationUnit> vnComputationUnits) {\r
super();\r
\r
this.dataBroker = dataBroker;\r
\r
- actionResolver = new ActionResolver();\r
+ this.conditionManager = conditionManager;\r
+ actionResolver = new ActionResolver(dataBroker, vnComputationUnits);\r
\r
LOG.debug("Initialized the renderer common operation resolver.");\r
\r
\r
List<ConditionSegment> conditionSegments = operation.getConditionSegment();\r
\r
- if ( null != conditionSegments && !conditionSegments.isEmpty() ) {\r
- // TODO\r
+ if ( !ConditionDeterminer.isConditionMet(conditionSegments) ) {\r
+ conditionManager.handleOperation(user.getUserId(), operation);\r
\r
return;\r
}\r
return;\r
}\r
\r
- /**\r
- * Perform the monitoring for the operation that contains a condition\r
- * which determines when to execute the operation.\r
- *\r
- * @author Zhigang Ji\r
- */\r
- private class ConditionMonitor {\r
- // TODO\r
- }\r
-\r
- /**\r
- * Resolve the actions included in the operation and decide how to\r
- * implement them on the physical network.\r
- *\r
- * @author Zhigang Ji\r
- */\r
- private class ActionResolver {\r
- /**\r
- * TODO\r
- *\r
- * @param user TODO\r
- * @param operation TODO\r
- * @param node TODO\r
- * @param virtualNetwork TODO\r
- * @param userIntentVnMapping TODO\r
- */\r
- protected void resolveActions(User user, Operation operation, Node node,\r
- VirtualNetwork virtualNetwork,\r
- UserIntentVnMapping userIntentVnMapping)\r
- throws IntentResolutionException {\r
- // TODO\r
-\r
- return;\r
- }\r
-\r
- /**\r
- * TODO\r
- *\r
- * @param user TODO\r
- * @param operation TODO\r
- * @param connection TODO\r
- * @param virtualNetwork TODO\r
- * @param userIntentVnMapping TODO\r
- */\r
- protected void resolveActions(User user, Operation operation, Connection connection,\r
- VirtualNetwork virtualNetwork,\r
- UserIntentVnMapping userIntentVnMapping)\r
- throws IntentResolutionException {\r
- // TODO\r
-\r
- return;\r
- }\r
-\r
- /**\r
- * TODO\r
- *\r
- * @param user TODO\r
- * @param operation TODO\r
- * @param flow TODO\r
- * @param virtualNetwork TODO\r
- * @param userIntentVnMapping TODO\r
- */\r
- protected void resolveActions(User user, Operation operation, Flow flow,\r
- VirtualNetwork virtualNetwork,\r
- UserIntentVnMapping userIntentVnMapping)\r
- throws IntentResolutionException {\r
- List<Action> actions = operation.getAction();\r
-\r
- ActionName actionName = new ActionName("go-through");\r
- Action goThroughAction = IntentResolverUtils.getAction(actions, actionName);\r
-\r
- if ( null != goThroughAction ) {\r
- resolveGoThroughAction(user, operation, flow, goThroughAction,\r
- virtualNetwork, userIntentVnMapping);\r
-\r
- return;\r
- }\r
-\r
- throw new IntentResolutionException("Unsupported action combination.");\r
-\r
-// return;\r
- }\r
- }\r
-\r
/**\r
* TODO\r
*\r
* @param user TODO\r
- * @param operation TODO\r
- * @param flow TODO\r
- * @param goThroughAction TODO\r
- * @param virtualNetwork TODO\r
- * @param userIntentVnMapping TODO\r
+ * @param operations TODO\r
+ * @param operationsApplyingToNode TODO\r
+ * @param operationsApplyingToConnection TODO\r
+ * @param operationsApplyingToFlow TODO\r
+ * @throws IntentResolutionException\r
*/\r
- private void resolveGoThroughAction(User user, Operation operation, Flow flow,\r
- Action goThroughAction,\r
- VirtualNetwork virtualNetwork,\r
- UserIntentVnMapping userIntentVnMapping)\r
+ protected void classifyOperations(User user, List<Operation> operations,\r
+ List<Operation> operationsApplyingToNode,\r
+ List<Operation> operationsApplyingToConnection,\r
+ List<Operation> operationsApplyingToFlow)\r
throws IntentResolutionException {\r
- List<StringValue> parameterValues = goThroughAction.getParameterValues().getStringValue();\r
-\r
- if ( !parameterValues.isEmpty() ) {\r
- List<Node> nodes = user.getObjects().getNode();\r
-\r
- if ( null == nodes || nodes.isEmpty() ) {\r
- throw new IntentResolutionException("The nodes specified by the action parameters " +\r
- "of the operation " + operation.getOperationId().getValue() + " does not exist.");\r
- }\r
+ DataObject dataObject;\r
\r
- NodeId nodeId = new NodeId(parameterValues.get(0).getValue());\r
- Node node = IntentResolverUtils.getNode(nodes, nodeId);\r
+ for ( Operation operation : operations ) {\r
+ dataObject = IntentResolverUtils\r
+ .getObject(user.getObjects(), operation.getTargetObject());\r
\r
- if ( null == node ) {\r
- throw new IntentResolutionException("The node " + nodeId.getValue() + " specified by the" +\r
- " action parameter of the operation " + operation.getOperationId().getValue() +\r
- " does not exist.");\r
+ if ( null == dataObject ) {\r
+ throw new IntentResolutionException("The target object of the operation " +\r
+ operation.getOperationId().getValue() + " does not exist.");\r
}\r
\r
- List<VirtualNode> virtualNodes = virtualNetwork.getVirtualNodes().getVirtualNode();\r
- List<VirtualLink> virtualLinks = virtualNetwork.getVirtualLinks().getVirtualLink();\r
- List<VirtualPath> virtualPaths = virtualNetwork.getVirtualPaths().getVirtualPath();\r
- List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
- List<VirtualResource> virtualResources = null;\r
-\r
- if ( node.getNodeType().equals(new NodeType("chain-group")) ) {\r
- if ( IntentResolverUtils.checkAllLayer2OperatingMode(node.getSubNode(), nodes) ) {\r
- // TODO\r
- } else if ( IntentResolverUtils.checkAllLayer3OperatingMode(node.getSubNode(), nodes) ) {\r
- IntentVnMappingResult intentVnMappingResult = IntentResolverUtils.getIntentVnMappingResult(\r
- intentVnMappingResults, new IntentId(node.getNodeId().getValue()));\r
-\r
- if ( null == intentVnMappingResult ) {\r
- throw new IntentResolutionException("Can not get the intent-vn mapping result " +\r
- "for the node " + node.getNodeId().getValue() + ".");\r
- }\r
-\r
- VirtualNode sourceVirtualNode = IntentResolverUtils.getSourceVirtualRouterOfFlow(\r
- virtualNodes, flow, nodes, intentVnMappingResults);\r
-\r
- if ( null == sourceVirtualNode ) {\r
- throw new IntentResolutionException("Can not get the source virtual node " +\r
- "of the flow " + flow.getFlowId().getValue() + ".");\r
- }\r
-\r
- VirtualNode destinationVirtualNode = IntentResolverUtils.getDestinationVirtualRouterOfFlow(\r
- virtualNodes, flow, nodes, intentVnMappingResults);\r
-\r
- if ( null == destinationVirtualNode ) {\r
- throw new IntentResolutionException("Can not get the destination virtual node " +\r
- "of the flow " + flow.getFlowId().getValue() + ".");\r
- }\r
-\r
- List<VirtualResource> virtualResources1 = IntentResolverUtils\r
- .sortVirtualResources(intentVnMappingResult.getVirtualResource());\r
-\r
- VirtualNodeId virtualNodeId = new VirtualNodeId(virtualResources1.get(0)\r
- .getParentVirtualResourceEntityId().getValue());\r
- VirtualNode virtualNode = IntentResolverUtils.getVirtualNode(virtualNodes, virtualNodeId);\r
-\r
- if ( null == virtualNode ) {\r
- throw new IntentResolutionException("Can not get the virtual node" +\r
- " created for the first sub-node of the node " +\r
- intentVnMappingResult.getIntentId().getValue() + ".");\r
- }\r
-\r
- virtualNodeId = new VirtualNodeId(virtualResources1.get(virtualResources1.size() - 1)\r
- .getParentVirtualResourceEntityId().getValue());\r
- VirtualNode virtualNode1 = IntentResolverUtils.getVirtualNode(virtualNodes, virtualNodeId);\r
-\r
- if ( null == virtualNode1 ) {\r
- throw new IntentResolutionException("Can not get the virtual node" +\r
- " created for the last sub-node of the node " +\r
- intentVnMappingResult.getIntentId().getValue() + ".");\r
- }\r
-\r
- virtualResources = new ArrayList<VirtualResource>(virtualResources1.size() + 2);\r
- VirtualLink virtualLink = IntentResolverUtils.getVirtualLink(virtualLinks,\r
- sourceVirtualNode.getNodeId(), virtualNode.getNodeId());\r
-\r
- if ( null == virtualLink ) {\r
- VirtualPort virtualPort = new VirtualPortBuilder()\r
- .setPortId(new VirtualPortId(UUID.randomUUID().toString()))\r
- .setPortType(VirtualPort.PortType.Internal)\r
- .build();\r
- sourceVirtualNode.getVirtualPort().add(virtualPort);\r
-\r
- VirtualPort virtualPort1 = new VirtualPortBuilder()\r
- .setPortId(new VirtualPortId(UUID.randomUUID().toString()))\r
- .setPortType(VirtualPort.PortType.Internal)\r
- .build();\r
- virtualNode.getVirtualPort().add(virtualPort1);\r
-\r
- virtualLink = new VirtualLinkBuilder()\r
- .setLinkId(new VirtualLinkId(UUID.randomUUID().toString()))\r
- .setSrcNodeId(virtualNode.getNodeId())\r
- .setSrcPortId(virtualPort1.getPortId())\r
- .setDestNodeId(sourceVirtualNode.getNodeId())\r
- .setDestPortId(virtualPort.getPortId())\r
- .setBandwidth(0L)\r
- .build();\r
- virtualLinks.add(virtualLink);\r
-\r
- virtualLink = new VirtualLinkBuilder()\r
- .setLinkId(new VirtualLinkId(UUID.randomUUID().toString()))\r
- .setSrcNodeId(sourceVirtualNode.getNodeId())\r
- .setSrcPortId(virtualPort.getPortId())\r
- .setDestNodeId(virtualNode.getNodeId())\r
- .setDestPortId(virtualPort1.getPortId())\r
- .setBandwidth(0L)\r
- .build();\r
- virtualLinks.add(virtualLink);\r
- }\r
-\r
- List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLink> virtualLinks1 =\r
- new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLink>(1);\r
- org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLink virtualLink1 =\r
- new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLinkBuilder()\r
- .setLinkId(virtualLink.getLinkId())\r
- .setOrder(0L)\r
- .build();\r
- virtualLinks1.add(virtualLink1);\r
-\r
- VirtualPath virtualPath = new VirtualPathBuilder()\r
- .setPathId(new VirtualPathId(UUID.randomUUID().toString()))\r
- .setVirtualLink(virtualLinks1)\r
- .setBandwidth(0L)\r
- .build();\r
- virtualPaths.add(virtualPath);\r
-\r
- VirtualResource virtualResource = new VirtualResourceBuilder()\r
- .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
- .setVirtualResourceType(VirtualResource.VirtualResourceType.Vpath)\r
- .setVirtualResourceEntityId(new VirtualResourceEntityId(virtualPath.getPathId().getValue()))\r
- .setOrder(0L)\r
- .build();\r
- virtualResources.add(virtualResource);\r
-\r
- for ( VirtualResource virtualResource1 : virtualResources1 ) {\r
- virtualResource = new VirtualResourceBuilder(virtualResource1)\r
- .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
- .setOrder((long)virtualResources.size())\r
- .build();\r
- virtualResources.add(virtualResource);\r
- }\r
-\r
- virtualLink = IntentResolverUtils.getVirtualLink(virtualLinks,\r
- virtualNode1.getNodeId(), destinationVirtualNode.getNodeId());\r
-\r
- if ( null == virtualLink ) {\r
- VirtualPort virtualPort = new VirtualPortBuilder()\r
- .setPortId(new VirtualPortId(UUID.randomUUID().toString()))\r
- .setPortType(VirtualPort.PortType.Internal)\r
- .build();\r
- virtualNode1.getVirtualPort().add(virtualPort);\r
-\r
- VirtualPort virtualPort1 = new VirtualPortBuilder()\r
- .setPortId(new VirtualPortId(UUID.randomUUID().toString()))\r
- .setPortType(VirtualPort.PortType.Internal)\r
- .build();\r
- destinationVirtualNode.getVirtualPort().add(virtualPort1);\r
-\r
- virtualLink = new VirtualLinkBuilder()\r
- .setLinkId(new VirtualLinkId(UUID.randomUUID().toString()))\r
- .setSrcNodeId(destinationVirtualNode.getNodeId())\r
- .setSrcPortId(virtualPort1.getPortId())\r
- .setDestNodeId(virtualNode1.getNodeId())\r
- .setDestPortId(virtualPort.getPortId())\r
- .setBandwidth(0L)\r
- .build();\r
- virtualLinks.add(virtualLink);\r
-\r
- virtualLink = new VirtualLinkBuilder()\r
- .setLinkId(new VirtualLinkId(UUID.randomUUID().toString()))\r
- .setSrcNodeId(virtualNode1.getNodeId())\r
- .setSrcPortId(virtualPort.getPortId())\r
- .setDestNodeId(destinationVirtualNode.getNodeId())\r
- .setDestPortId(virtualPort1.getPortId())\r
- .setBandwidth(0L)\r
- .build();\r
- virtualLinks.add(virtualLink);\r
- }\r
-\r
- virtualLinks1 = new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLink>(1);\r
- virtualLink1 = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLinkBuilder()\r
- .setLinkId(virtualLink.getLinkId())\r
- .setOrder(0L)\r
- .build();\r
- virtualLinks1.add(virtualLink1);\r
-\r
- virtualPath = new VirtualPathBuilder()\r
- .setPathId(new VirtualPathId(UUID.randomUUID().toString()))\r
- .setVirtualLink(virtualLinks1)\r
- .setBandwidth(0L)\r
- .build();\r
- virtualPaths.add(virtualPath);\r
-\r
- virtualResource = new VirtualResourceBuilder()\r
- .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
- .setVirtualResourceType(VirtualResource.VirtualResourceType.Vpath)\r
- .setVirtualResourceEntityId(new VirtualResourceEntityId(virtualPath.getPathId().getValue()))\r
- .setOrder((long) virtualResources.size())\r
- .build();\r
- virtualResources.add(virtualResource);\r
- } else {\r
- // TODO\r
- }\r
+ if ( dataObject instanceof Node ) {\r
+ operationsApplyingToNode.add(operation);\r
+ } else if ( dataObject instanceof Connection ) {\r
+ operationsApplyingToConnection.add(operation);\r
} else {\r
- // TODO\r
+ operationsApplyingToFlow.add(operation);\r
}\r
-\r
- IntentVnMappingResult intentVnMappingResult = new IntentVnMappingResultBuilder()\r
- .setIntentId(new IntentId(operation.getOperationId().getValue()))\r
- .setIntentType(IntentVnMappingResult.IntentType.Operation)\r
- .setVirtualResource(virtualResources)\r
- .build();\r
-\r
- intentVnMappingResults.add(intentVnMappingResult);\r
}\r
\r
return;\r
--- /dev/null
+/*\r
+ * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.nemo.intent.action;\r
+\r
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
+import org.opendaylight.nemo.intent.IntentResolutionException;\r
+import org.opendaylight.nemo.intent.IntentResolverUtils;\r
+import org.opendaylight.nemo.intent.computation.VNComputationUnit;\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.links.VirtualLink;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.links.VirtualLinkBuilder;\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.networks.virtual.network.virtual.paths.VirtualPathBuilder;\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.generic.virtual.network.rev151010.virtual.node.instance.VirtualPortBuilder;\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.IntentVnMappingResultBuilder;\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.intent.vn.mapping.results.user.intent.vn.mapping.intent.vn.mapping.result.VirtualResourceBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.*;\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.objects.Connection;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Node;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.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.connection.instance.Property;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.instance.parameter.values.IntValue;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.instance.parameter.values.StringValue;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.operation.instance.Action;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+import java.util.*;\r
+\r
+/**\r
+ * Resolve the actions included in the operation and decide how to\r
+ * implement them on the physical network.\r
+ *\r
+ * @author Zhigang Ji\r
+ */\r
+public class ActionResolver {\r
+ private static final Logger LOG = LoggerFactory.getLogger(ActionResolver.class);\r
+\r
+ private final DataBroker dataBroker;\r
+\r
+ /**\r
+ * The virtual network computation unit for all users.\r
+ */\r
+ private Map<UserId, VNComputationUnit> vnComputationUnits;\r
+\r
+ public ActionResolver(DataBroker dataBroker, Map<UserId, VNComputationUnit> vnComputationUnits) {\r
+ super();\r
+\r
+ this.dataBroker = dataBroker;\r
+ this.vnComputationUnits = vnComputationUnits;\r
+\r
+ LOG.debug("Initialized the renderer common action resolver.");\r
+\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @param user TODO\r
+ * @param operation TODO\r
+ * @param node TODO\r
+ * @param virtualNetwork TODO\r
+ * @param userIntentVnMapping TODO\r
+ * @throws IntentResolutionException\r
+ */\r
+ public void resolveActions(User user, Operation operation, Node node,\r
+ VirtualNetwork virtualNetwork,\r
+ UserIntentVnMapping userIntentVnMapping)\r
+ throws IntentResolutionException {\r
+ // TODO\r
+\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @param user TODO\r
+ * @param operation TODO\r
+ * @param connection TODO\r
+ * @param virtualNetwork TODO\r
+ * @param userIntentVnMapping TODO\r
+ * @throws IntentResolutionException\r
+ */\r
+ public void resolveActions(User user, Operation operation, Connection connection,\r
+ VirtualNetwork virtualNetwork,\r
+ UserIntentVnMapping userIntentVnMapping)\r
+ throws IntentResolutionException {\r
+ List<Action> actions = operation.getAction();\r
+\r
+ ActionName actionName = new ActionName("qos-bandwidth");\r
+ Action qosBandwidthAction = ActionResolverUtils.getAction(actions, actionName);\r
+\r
+ if ( null != qosBandwidthAction ) {\r
+ resolveQosBandwidthAction(user, operation, connection, qosBandwidthAction,\r
+ virtualNetwork, userIntentVnMapping);\r
+\r
+ return;\r
+ }\r
+\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @param user TODO\r
+ * @param operation TODO\r
+ * @param flow TODO\r
+ * @param virtualNetwork TODO\r
+ * @param userIntentVnMapping TODO\r
+ * @throws IntentResolutionException\r
+ */\r
+ public void resolveActions(User user, Operation operation, Flow flow,\r
+ VirtualNetwork virtualNetwork,\r
+ UserIntentVnMapping userIntentVnMapping)\r
+ throws IntentResolutionException {\r
+ List<Action> actions = operation.getAction();\r
+\r
+ ActionName actionName = new ActionName("deny");\r
+ Action denyAction = ActionResolverUtils.getAction(actions, actionName);\r
+\r
+ if ( null != denyAction ) {\r
+ resolveDenyAction(user, operation, flow, denyAction,\r
+ virtualNetwork, userIntentVnMapping);\r
+\r
+ return;\r
+ }\r
+\r
+ actionName = new ActionName("allow");\r
+ Action allowAction = ActionResolverUtils.getAction(actions, actionName);\r
+\r
+ if ( null != allowAction ) {\r
+ resolveAllowAction(user, operation, flow, allowAction,\r
+ virtualNetwork, userIntentVnMapping);\r
+\r
+ return;\r
+ }\r
+\r
+ actionName = new ActionName("go-through");\r
+ Action goThroughAction = ActionResolverUtils.getAction(actions, actionName);\r
+\r
+ if ( null != goThroughAction ) {\r
+ resolveGoThroughAction(user, operation, flow, goThroughAction,\r
+ virtualNetwork, userIntentVnMapping);\r
+\r
+ return;\r
+ }\r
+\r
+ throw new IntentResolutionException("Unsupported action combination.");\r
+\r
+// return;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @param user TODO\r
+ * @param operation TODO\r
+ * @param connection TODO\r
+ * @param qosBandwidthAction TODO\r
+ * @param virtualNetwork TODO\r
+ * @param userIntentVnMapping TODO\r
+ * @throws IntentResolutionException\r
+ */\r
+ private void resolveQosBandwidthAction(User user, Operation operation, Connection connection,\r
+ Action qosBandwidthAction,\r
+ VirtualNetwork virtualNetwork,\r
+ UserIntentVnMapping userIntentVnMapping)\r
+ throws IntentResolutionException {\r
+ List<IntValue> parameterValues = qosBandwidthAction.getParameterValues().getIntValue();\r
+\r
+ if ( parameterValues.isEmpty() ) {\r
+ return;\r
+ }\r
+\r
+ IntValue parameterValue = parameterValues.get(0);\r
+ long requiredBandwidth = parameterValue.getValue();\r
+\r
+ PropertyName propertyName = new PropertyName("bandwidth");\r
+ Property property = IntentResolverUtils\r
+ .getConnectionProperty(connection.getProperty(), propertyName);\r
+ long currentBandwidth;\r
+\r
+ if ( null == property ) {\r
+ currentBandwidth = 0;\r
+ } else {\r
+ currentBandwidth = property.getPropertyValues().getIntValue().get(0).getValue();\r
+ }\r
+\r
+ if ( currentBandwidth == requiredBandwidth ) {\r
+ return;\r
+ }\r
+\r
+ List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
+ IntentVnMappingResult intentVnMappingResult = IntentResolverUtils\r
+ .getIntentVnMappingResult(intentVnMappingResults, new IntentId(connection.getConnectionId()));\r
+\r
+ if ( null == intentVnMappingResult ) {\r
+ throw new IntentResolutionException("Can not get the intent-vn mapping result for " +\r
+ "the connection " + connection.getConnectionId().getValue() + ".");\r
+ }\r
+\r
+ List<VirtualResource> virtualResources = intentVnMappingResult.getVirtualResource();\r
+ List<VirtualLink> virtualLinks = virtualNetwork.getVirtualLinks().getVirtualLink();\r
+ VirtualLinkId virtualLinkId;\r
+\r
+ for ( VirtualResource virtualResource : virtualResources ) {\r
+ virtualLinkId = new VirtualLinkId(virtualResource.getVirtualResourceEntityId().getValue());\r
+\r
+ ActionResolverUtils.modifyVirtualLinkBandwidth(virtualLinks, virtualLinkId, requiredBandwidth);\r
+ }\r
+\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @param user TODO\r
+ * @param operation TODO\r
+ * @param flow TODO\r
+ * @param denyAction TODO\r
+ * @param virtualNetwork TODO\r
+ * @param userIntentVnMapping TODO\r
+ * @throws IntentResolutionException\r
+ */\r
+ private void resolveDenyAction(User user, Operation operation, Flow flow,\r
+ Action denyAction,\r
+ VirtualNetwork virtualNetwork,\r
+ UserIntentVnMapping userIntentVnMapping)\r
+ throws IntentResolutionException {\r
+ List<Node> nodes = user.getObjects().getNode();\r
+ List<VirtualNode> virtualNodes = virtualNetwork.getVirtualNodes().getVirtualNode();\r
+ List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
+\r
+ VirtualNode virtualNode = ActionResolverUtils\r
+ .getSourceVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);\r
+\r
+ if ( null == virtualNode ) {\r
+ throw new IntentResolutionException("Can not get the source virtual node " +\r
+ "of the flow " + flow.getFlowId().getValue() + ".");\r
+ }\r
+\r
+ List<VirtualResource> virtualResources = new ArrayList<VirtualResource>(1);\r
+\r
+ VirtualResource virtualResource = new VirtualResourceBuilder()\r
+ .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
+ .setVirtualResourceType(VirtualResource.VirtualResourceType.Vnode)\r
+ .setVirtualResourceEntityId(new VirtualResourceEntityId(virtualNode.getNodeId().getValue()))\r
+ .setOrder(0L)\r
+ .build();\r
+ virtualResources.add(virtualResource);\r
+\r
+ IntentVnMappingResult intentVnMappingResult = new IntentVnMappingResultBuilder()\r
+ .setIntentId(new IntentId(operation.getOperationId().getValue()))\r
+ .setIntentType(IntentVnMappingResult.IntentType.Operation)\r
+ .setVirtualResource(virtualResources)\r
+ .build();\r
+ intentVnMappingResults.add(intentVnMappingResult);\r
+\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @param user TODO\r
+ * @param operation TODO\r
+ * @param flow TODO\r
+ * @param allowAction TODO\r
+ * @param virtualNetwork TODO\r
+ * @param userIntentVnMapping TODO\r
+ * @throws IntentResolutionException\r
+ */\r
+ private void resolveAllowAction(User user, Operation operation, Flow flow,\r
+ Action allowAction,\r
+ VirtualNetwork virtualNetwork,\r
+ UserIntentVnMapping userIntentVnMapping)\r
+ throws IntentResolutionException {\r
+ List<Node> nodes = user.getObjects().getNode();\r
+ List<VirtualNode> virtualNodes = virtualNetwork.getVirtualNodes().getVirtualNode();\r
+ List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
+\r
+ VirtualNode sourceVirtualNode = ActionResolverUtils\r
+ .getSourceVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);\r
+\r
+ if ( null == sourceVirtualNode ) {\r
+ throw new IntentResolutionException("Can not get the source virtual node " +\r
+ "of the flow " + flow.getFlowId().getValue() + ".");\r
+ }\r
+\r
+ VirtualNode destinationVirtualNode = ActionResolverUtils\r
+ .getDestinationVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);\r
+\r
+ if ( null == destinationVirtualNode ) {\r
+ throw new IntentResolutionException("Can not get the destination virtual node " +\r
+ "of the flow " + flow.getFlowId().getValue() + ".");\r
+ }\r
+\r
+ VNComputationUnit vnComputationUnit = vnComputationUnits.get(user.getUserId());\r
+\r
+ if ( null == vnComputationUnit ) {\r
+ throw new IntentResolutionException("Can not get the virtual network computation " +\r
+ "unit for the user " + user.getUserId().getValue() + ".");\r
+ }\r
+\r
+ VirtualPath virtualPath = vnComputationUnit\r
+ .computePath(sourceVirtualNode.getNodeId(), destinationVirtualNode.getNodeId());\r
+\r
+ if ( null == virtualPath || virtualPath.getVirtualLink().isEmpty() ) {\r
+ throw new IntentResolutionException("Can not compute an available virtual path in " +\r
+ "the virtual network for the flow " + flow.getFlowId().getValue() + ".");\r
+ }\r
+\r
+ virtualNetwork.getVirtualPaths().getVirtualPath().add(virtualPath);\r
+\r
+ List<VirtualResource> virtualResources = new ArrayList<VirtualResource>(1);\r
+\r
+ VirtualResource virtualResource = new VirtualResourceBuilder()\r
+ .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
+ .setVirtualResourceType(VirtualResource.VirtualResourceType.Vpath)\r
+ .setVirtualResourceEntityId(new VirtualResourceEntityId(virtualPath.getPathId().getValue()))\r
+ .setOrder(0L)\r
+ .build();\r
+ virtualResources.add(virtualResource);\r
+\r
+ IntentVnMappingResult intentVnMappingResult = new IntentVnMappingResultBuilder()\r
+ .setIntentId(new IntentId(operation.getOperationId().getValue()))\r
+ .setIntentType(IntentVnMappingResult.IntentType.Operation)\r
+ .setVirtualResource(virtualResources)\r
+ .build();\r
+ intentVnMappingResults.add(intentVnMappingResult);\r
+\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @param user TODO\r
+ * @param operation TODO\r
+ * @param flow TODO\r
+ * @param goThroughAction TODO\r
+ * @param virtualNetwork TODO\r
+ * @param userIntentVnMapping TODO\r
+ * @throws IntentResolutionException\r
+ */\r
+ private void resolveGoThroughAction(User user, Operation operation, Flow flow,\r
+ Action goThroughAction,\r
+ VirtualNetwork virtualNetwork,\r
+ UserIntentVnMapping userIntentVnMapping)\r
+ throws IntentResolutionException {\r
+ List<StringValue> parameterValues = goThroughAction.getParameterValues().getStringValue();\r
+\r
+ if ( !parameterValues.isEmpty() ) {\r
+ List<Node> nodes = user.getObjects().getNode();\r
+\r
+ if ( null == nodes || nodes.isEmpty() ) {\r
+ throw new IntentResolutionException("The nodes specified by the action parameters " +\r
+ "of the operation " + operation.getOperationId().getValue() + " does not exist.");\r
+ }\r
+\r
+ NodeId nodeId = new NodeId(parameterValues.get(0).getValue());\r
+ Node node = IntentResolverUtils.getNode(nodes, nodeId);\r
+\r
+ if ( null == node ) {\r
+ throw new IntentResolutionException("The node " + nodeId.getValue() + " specified by the" +\r
+ " action parameter of the operation " + operation.getOperationId().getValue() +\r
+ " does not exist.");\r
+ }\r
+\r
+ if ( node.getNodeType().equals(new NodeType("chain-group")) ) {\r
+ resolveGoThroughChainGroupAction(user, operation, flow, goThroughAction, node,\r
+ virtualNetwork, userIntentVnMapping);\r
+ } else {\r
+ resolveGoThroughNormalGroupAction(user, operation, flow, goThroughAction,\r
+ virtualNetwork, userIntentVnMapping);\r
+ }\r
+ }\r
+\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @param user TODO\r
+ * @param operation TODO\r
+ * @param flow TODO\r
+ * @param goThroughAction TODO\r
+ * @param virtualNetwork TODO\r
+ * @param userIntentVnMapping TODO\r
+ * @throws IntentResolutionException\r
+ */\r
+ private void resolveGoThroughNormalGroupAction(User user, Operation operation, Flow flow,\r
+ Action goThroughAction,\r
+ VirtualNetwork virtualNetwork,\r
+ UserIntentVnMapping userIntentVnMapping)\r
+ throws IntentResolutionException {\r
+ List<Node> nodes = user.getObjects().getNode();\r
+ List<StringValue> parameterValues = goThroughAction.getParameterValues().getStringValue();\r
+ NodeId nodeId;\r
+ Node node;\r
+\r
+ for ( StringValue parameterValue : parameterValues ) {\r
+ nodeId = new NodeId(parameterValue.getValue());\r
+ node = IntentResolverUtils.getNode(nodes, nodeId);\r
+\r
+ if ( null == node ) {\r
+ throw new IntentResolutionException("The node " + nodeId.getValue() + " specified by the" +\r
+ " action parameter of the operation " + operation.getOperationId().getValue() +\r
+ " does not exist.");\r
+ }\r
+ }\r
+\r
+ List<VirtualNode> virtualNodes = virtualNetwork.getVirtualNodes().getVirtualNode();\r
+ List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
+ parameterValues = ActionResolverUtils.sortParameterValues(parameterValues);\r
+\r
+ List<VirtualNode> virtualNodes1 = new ArrayList<VirtualNode>(parameterValues.size());\r
+ IntentVnMappingResult intentVnMappingResult;\r
+ List<VirtualResource> virtualResources;\r
+ VirtualResource virtualResource;\r
+ VirtualNodeId virtualNodeId;\r
+ VirtualNode virtualNode;\r
+\r
+ for ( StringValue parameterValue : parameterValues ) {\r
+ intentVnMappingResult = IntentResolverUtils.getIntentVnMappingResult(\r
+ intentVnMappingResults, new IntentId(parameterValue.getValue()));\r
+\r
+ if ( null == intentVnMappingResult ) {\r
+ throw new IntentResolutionException("Can not get the intent-vn mapping result " +\r
+ "for the node " + parameterValue.getValue() + ".");\r
+ }\r
+\r
+ virtualResources = intentVnMappingResult.getVirtualResource();\r
+\r
+ if ( 1 != virtualResources.size() ) {\r
+ throw new IntentResolutionException("The type of the node " + parameterValue.getValue() +\r
+ " specified by the action parameter of the operation " +\r
+ operation.getOperationId().getValue() + " is not required," +\r
+ " according to the intent-vn mapping result.");\r
+ }\r
+\r
+ virtualResource = virtualResources.get(0);\r
+\r
+ if ( VirtualResource.VirtualResourceType.Vport\r
+ == virtualResource.getVirtualResourceType() ) {\r
+ virtualNodeId = new VirtualNodeId(virtualResource.getParentVirtualResourceEntityId().getValue());\r
+ } else if ( VirtualResource.VirtualResourceType.Vnode\r
+ == virtualResource.getVirtualResourceType() ) {\r
+ virtualNodeId = new VirtualNodeId(virtualResource.getVirtualResourceEntityId().getValue());\r
+ } else {\r
+ throw new IntentResolutionException("The type of the node " + parameterValue.getValue() +\r
+ " specified by the action parameter of the operation " +\r
+ operation.getOperationId().getValue() + " is not required," +\r
+ " according to the intent-vn mapping result.");\r
+ }\r
+\r
+ virtualNode = IntentResolverUtils.getVirtualNode(virtualNodes, virtualNodeId);\r
+\r
+ if ( null == virtualNode ) {\r
+ throw new IntentResolutionException("Can not get the virtual node created for" +\r
+ " the node " + parameterValue.getValue() + ".");\r
+ }\r
+\r
+ if ( VirtualNode.NodeType.Vrouter != virtualNode.getNodeType() ) {\r
+ throw new IntentResolutionException("The type of the node " + parameterValue.getValue() +\r
+ " specified by the action parameter of the operation " +\r
+ operation.getOperationId().getValue() + " is not required," +\r
+ " according to the virtual node created for it.");\r
+ }\r
+\r
+ virtualNodes1.add(virtualNode);\r
+ }\r
+\r
+ VirtualNode sourceVirtualNode = ActionResolverUtils\r
+ .getSourceVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);\r
+\r
+ if ( null == sourceVirtualNode ) {\r
+ throw new IntentResolutionException("Can not get the source virtual node " +\r
+ "of the flow " + flow.getFlowId().getValue() + ".");\r
+ }\r
+\r
+ VirtualNode destinationVirtualNode = ActionResolverUtils\r
+ .getDestinationVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);\r
+\r
+ if ( null == destinationVirtualNode ) {\r
+ throw new IntentResolutionException("Can not get the destination virtual node " +\r
+ "of the flow " + flow.getFlowId().getValue() + ".");\r
+ }\r
+\r
+ VNComputationUnit vnComputationUnit = vnComputationUnits.get(user.getUserId());\r
+\r
+ if ( null == vnComputationUnit ) {\r
+ throw new IntentResolutionException("Can not get the virtual network computation " +\r
+ "unit for the user " + user.getUserId().getValue() + ".");\r
+ }\r
+\r
+ List<VirtualPath> virtualPaths = new ArrayList<VirtualPath>(virtualNodes1.size() + 1);\r
+ Iterator<VirtualNode> iterator = virtualNodes1.iterator();\r
+ VirtualNode firstVirtualNode = iterator.next();\r
+ VirtualNode secondVirtualNode;\r
+ VirtualPath virtualPath;\r
+\r
+ if ( !sourceVirtualNode.getNodeId().equals(firstVirtualNode.getNodeId()) ) {\r
+ virtualPath = vnComputationUnit\r
+ .computePath(sourceVirtualNode.getNodeId(), firstVirtualNode.getNodeId());\r
+\r
+ if ( null == virtualPath || virtualPath.getVirtualLink().isEmpty() ) {\r
+ throw new IntentResolutionException("Can not compute an available virtual path" +\r
+ " from the virtual node " + sourceVirtualNode.getNodeId().getValue() +\r
+ " to " + firstVirtualNode.getNodeId().getValue() + " in the virtual" +\r
+ " network for the flow " + flow.getFlowId().getValue() + ".");\r
+ }\r
+\r
+ virtualPaths.add(virtualPath);\r
+ }\r
+\r
+ while ( iterator.hasNext() ) {\r
+ secondVirtualNode = iterator.next();\r
+\r
+ if ( !firstVirtualNode.getNodeId().equals(secondVirtualNode.getNodeId()) ) {\r
+ virtualPath = vnComputationUnit\r
+ .computePath(firstVirtualNode.getNodeId(), secondVirtualNode.getNodeId());\r
+\r
+ if ( null == virtualPath || virtualPath.getVirtualLink().isEmpty() ) {\r
+ throw new IntentResolutionException("Can not compute an available virtual path" +\r
+ " from the virtual node " + firstVirtualNode.getNodeId().getValue() +\r
+ " to " + secondVirtualNode.getNodeId().getValue() + " in the virtual" +\r
+ " network for the flow " + flow.getFlowId().getValue() + ".");\r
+ }\r
+\r
+ virtualPaths.add(virtualPath);\r
+ }\r
+\r
+ firstVirtualNode = secondVirtualNode;\r
+ }\r
+\r
+ if ( !destinationVirtualNode.getNodeId().equals(firstVirtualNode.getNodeId()) ) {\r
+ virtualPath = vnComputationUnit\r
+ .computePath(firstVirtualNode.getNodeId(), destinationVirtualNode.getNodeId());\r
+\r
+ if ( null == virtualPath || virtualPath.getVirtualLink().isEmpty() ) {\r
+ throw new IntentResolutionException("Can not compute an available virtual path" +\r
+ " from the virtual node " + firstVirtualNode.getNodeId().getValue() +\r
+ " to " + destinationVirtualNode.getNodeId().getValue() + " in the virtual" +\r
+ " network for the flow " + flow.getFlowId().getValue() + ".");\r
+ }\r
+\r
+ virtualPaths.add(virtualPath);\r
+ }\r
+\r
+ virtualPath = ActionResolverUtils.mergeVirtualPaths(virtualPaths);\r
+ virtualNetwork.getVirtualPaths().getVirtualPath().add(virtualPath);\r
+\r
+ virtualResources = new ArrayList<VirtualResource>(1);\r
+\r
+ virtualResource = new VirtualResourceBuilder()\r
+ .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
+ .setVirtualResourceType(VirtualResource.VirtualResourceType.Vpath)\r
+ .setVirtualResourceEntityId(new VirtualResourceEntityId(virtualPath.getPathId().getValue()))\r
+ .setOrder(0L)\r
+ .build();\r
+ virtualResources.add(virtualResource);\r
+\r
+ intentVnMappingResult = new IntentVnMappingResultBuilder()\r
+ .setIntentId(new IntentId(operation.getOperationId().getValue()))\r
+ .setIntentType(IntentVnMappingResult.IntentType.Operation)\r
+ .setVirtualResource(virtualResources)\r
+ .build();\r
+ intentVnMappingResults.add(intentVnMappingResult);\r
+\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @param user TODO\r
+ * @param operation TODO\r
+ * @param flow TODO\r
+ * @param goThroughAction TODO\r
+ * @param chainGroup TODO\r
+ * @param virtualNetwork TODO\r
+ * @param userIntentVnMapping TODO\r
+ * @throws IntentResolutionException\r
+ */\r
+ private void resolveGoThroughChainGroupAction(User user, Operation operation, Flow flow,\r
+ Action goThroughAction, Node chainGroup,\r
+ VirtualNetwork virtualNetwork,\r
+ UserIntentVnMapping userIntentVnMapping)\r
+ throws IntentResolutionException {\r
+ List<Node> nodes = user.getObjects().getNode();\r
+ List<VirtualNode> virtualNodes = virtualNetwork.getVirtualNodes().getVirtualNode();\r
+ List<VirtualLink> virtualLinks = virtualNetwork.getVirtualLinks().getVirtualLink();\r
+ List<VirtualPath> virtualPaths = virtualNetwork.getVirtualPaths().getVirtualPath();\r
+ List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
+ List<VirtualResource> virtualResources = null;\r
+\r
+ if ( IntentResolverUtils.checkAllLayer2OperatingMode(chainGroup.getSubNode(), nodes) ) {\r
+ // TODO\r
+ } else if ( IntentResolverUtils.checkAllLayer3OperatingMode(chainGroup.getSubNode(), nodes) ) {\r
+ IntentVnMappingResult intentVnMappingResult = IntentResolverUtils.getIntentVnMappingResult(\r
+ intentVnMappingResults, new IntentId(chainGroup.getNodeId().getValue()));\r
+\r
+ if ( null == intentVnMappingResult ) {\r
+ throw new IntentResolutionException("Can not get the intent-vn mapping result " +\r
+ "for the node " + chainGroup.getNodeId().getValue() + ".");\r
+ }\r
+\r
+ VirtualNode sourceVirtualNode = ActionResolverUtils.getSourceVirtualRouterOfFlow(\r
+ virtualNodes, flow, nodes, intentVnMappingResults);\r
+\r
+ if ( null == sourceVirtualNode ) {\r
+ throw new IntentResolutionException("Can not get the source virtual node " +\r
+ "of the flow " + flow.getFlowId().getValue() + ".");\r
+ }\r
+\r
+ VirtualNode destinationVirtualNode = ActionResolverUtils.getDestinationVirtualRouterOfFlow(\r
+ virtualNodes, flow, nodes, intentVnMappingResults);\r
+\r
+ if ( null == destinationVirtualNode ) {\r
+ throw new IntentResolutionException("Can not get the destination virtual node " +\r
+ "of the flow " + flow.getFlowId().getValue() + ".");\r
+ }\r
+\r
+ List<VirtualResource> virtualResources1 = ActionResolverUtils\r
+ .sortVirtualResources(intentVnMappingResult.getVirtualResource());\r
+\r
+ VirtualNodeId virtualNodeId = new VirtualNodeId(virtualResources1.get(0)\r
+ .getParentVirtualResourceEntityId().getValue());\r
+ VirtualNode virtualNode = IntentResolverUtils.getVirtualNode(virtualNodes, virtualNodeId);\r
+\r
+ if ( null == virtualNode ) {\r
+ throw new IntentResolutionException("Can not get the virtual node" +\r
+ " created for the first sub-node of the node " +\r
+ intentVnMappingResult.getIntentId().getValue() + ".");\r
+ }\r
+\r
+ virtualNodeId = new VirtualNodeId(virtualResources1.get(virtualResources1.size() - 1)\r
+ .getParentVirtualResourceEntityId().getValue());\r
+ VirtualNode virtualNode1 = IntentResolverUtils.getVirtualNode(virtualNodes, virtualNodeId);\r
+\r
+ if ( null == virtualNode1 ) {\r
+ throw new IntentResolutionException("Can not get the virtual node" +\r
+ " created for the last sub-node of the node " +\r
+ intentVnMappingResult.getIntentId().getValue() + ".");\r
+ }\r
+\r
+ virtualResources = new ArrayList<VirtualResource>(virtualResources1.size() + 2);\r
+ VirtualLink virtualLink = IntentResolverUtils.getVirtualLink(virtualLinks,\r
+ sourceVirtualNode.getNodeId(), virtualNode.getNodeId());\r
+\r
+ if ( null == virtualLink ) {\r
+ VirtualPort virtualPort = new VirtualPortBuilder()\r
+ .setPortId(new VirtualPortId(UUID.randomUUID().toString()))\r
+ .setPortType(VirtualPort.PortType.Internal)\r
+ .build();\r
+ sourceVirtualNode.getVirtualPort().add(virtualPort);\r
+\r
+ VirtualPort virtualPort1 = new VirtualPortBuilder()\r
+ .setPortId(new VirtualPortId(UUID.randomUUID().toString()))\r
+ .setPortType(VirtualPort.PortType.Internal)\r
+ .build();\r
+ virtualNode.getVirtualPort().add(virtualPort1);\r
+\r
+ virtualLink = new VirtualLinkBuilder()\r
+ .setLinkId(new VirtualLinkId(UUID.randomUUID().toString()))\r
+ .setSrcNodeId(virtualNode.getNodeId())\r
+ .setSrcPortId(virtualPort1.getPortId())\r
+ .setDestNodeId(sourceVirtualNode.getNodeId())\r
+ .setDestPortId(virtualPort.getPortId())\r
+ .setBandwidth(0L)\r
+ .build();\r
+ virtualLinks.add(virtualLink);\r
+\r
+ virtualLink = new VirtualLinkBuilder()\r
+ .setLinkId(new VirtualLinkId(UUID.randomUUID().toString()))\r
+ .setSrcNodeId(sourceVirtualNode.getNodeId())\r
+ .setSrcPortId(virtualPort.getPortId())\r
+ .setDestNodeId(virtualNode.getNodeId())\r
+ .setDestPortId(virtualPort1.getPortId())\r
+ .setBandwidth(0L)\r
+ .build();\r
+ virtualLinks.add(virtualLink);\r
+ }\r
+\r
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLink> virtualLinks1 =\r
+ new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLink>(1);\r
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLink virtualLink1 =\r
+ new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLinkBuilder()\r
+ .setLinkId(virtualLink.getLinkId())\r
+ .setOrder(0L)\r
+ .build();\r
+ virtualLinks1.add(virtualLink1);\r
+\r
+ VirtualPath virtualPath = new VirtualPathBuilder()\r
+ .setPathId(new VirtualPathId(UUID.randomUUID().toString()))\r
+ .setVirtualLink(virtualLinks1)\r
+ .setBandwidth(0L)\r
+ .build();\r
+ virtualPaths.add(virtualPath);\r
+\r
+ VirtualResource virtualResource = new VirtualResourceBuilder()\r
+ .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
+ .setVirtualResourceType(VirtualResource.VirtualResourceType.Vpath)\r
+ .setVirtualResourceEntityId(new VirtualResourceEntityId(virtualPath.getPathId().getValue()))\r
+ .setOrder(0L)\r
+ .build();\r
+ virtualResources.add(virtualResource);\r
+\r
+ for ( VirtualResource virtualResource1 : virtualResources1 ) {\r
+ virtualResource = new VirtualResourceBuilder(virtualResource1)\r
+ .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
+ .setOrder((long)virtualResources.size())\r
+ .build();\r
+ virtualResources.add(virtualResource);\r
+ }\r
+\r
+ virtualLink = IntentResolverUtils.getVirtualLink(virtualLinks,\r
+ virtualNode1.getNodeId(), destinationVirtualNode.getNodeId());\r
+\r
+ if ( null == virtualLink ) {\r
+ VirtualPort virtualPort = new VirtualPortBuilder()\r
+ .setPortId(new VirtualPortId(UUID.randomUUID().toString()))\r
+ .setPortType(VirtualPort.PortType.Internal)\r
+ .build();\r
+ virtualNode1.getVirtualPort().add(virtualPort);\r
+\r
+ VirtualPort virtualPort1 = new VirtualPortBuilder()\r
+ .setPortId(new VirtualPortId(UUID.randomUUID().toString()))\r
+ .setPortType(VirtualPort.PortType.Internal)\r
+ .build();\r
+ destinationVirtualNode.getVirtualPort().add(virtualPort1);\r
+\r
+ virtualLink = new VirtualLinkBuilder()\r
+ .setLinkId(new VirtualLinkId(UUID.randomUUID().toString()))\r
+ .setSrcNodeId(destinationVirtualNode.getNodeId())\r
+ .setSrcPortId(virtualPort1.getPortId())\r
+ .setDestNodeId(virtualNode1.getNodeId())\r
+ .setDestPortId(virtualPort.getPortId())\r
+ .setBandwidth(0L)\r
+ .build();\r
+ virtualLinks.add(virtualLink);\r
+\r
+ virtualLink = new VirtualLinkBuilder()\r
+ .setLinkId(new VirtualLinkId(UUID.randomUUID().toString()))\r
+ .setSrcNodeId(virtualNode1.getNodeId())\r
+ .setSrcPortId(virtualPort.getPortId())\r
+ .setDestNodeId(destinationVirtualNode.getNodeId())\r
+ .setDestPortId(virtualPort1.getPortId())\r
+ .setBandwidth(0L)\r
+ .build();\r
+ virtualLinks.add(virtualLink);\r
+ }\r
+\r
+ virtualLinks1 = new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLink>(1);\r
+ virtualLink1 = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLinkBuilder()\r
+ .setLinkId(virtualLink.getLinkId())\r
+ .setOrder(0L)\r
+ .build();\r
+ virtualLinks1.add(virtualLink1);\r
+\r
+ virtualPath = new VirtualPathBuilder()\r
+ .setPathId(new VirtualPathId(UUID.randomUUID().toString()))\r
+ .setVirtualLink(virtualLinks1)\r
+ .setBandwidth(0L)\r
+ .build();\r
+ virtualPaths.add(virtualPath);\r
+\r
+ virtualResource = new VirtualResourceBuilder()\r
+ .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
+ .setVirtualResourceType(VirtualResource.VirtualResourceType.Vpath)\r
+ .setVirtualResourceEntityId(new VirtualResourceEntityId(virtualPath.getPathId().getValue()))\r
+ .setOrder((long) virtualResources.size())\r
+ .build();\r
+ virtualResources.add(virtualResource);\r
+ } else {\r
+ // TODO\r
+ }\r
+\r
+ IntentVnMappingResult intentVnMappingResult = new IntentVnMappingResultBuilder()\r
+ .setIntentId(new IntentId(operation.getOperationId().getValue()))\r
+ .setIntentType(IntentVnMappingResult.IntentType.Operation)\r
+ .setVirtualResource(virtualResources)\r
+ .build();\r
+\r
+ intentVnMappingResults.add(intentVnMappingResult);\r
+\r
+ return;\r
+ }\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.nemo.intent.action;\r
+\r
+import org.opendaylight.nemo.intent.IntentResolverUtils;\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.networks.virtual.network.virtual.paths.VirtualPathBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLink;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLinkBuilder;\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.nemo.common.rev151010.*;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.VirtualLinkId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.VirtualNodeId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.VirtualPathId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Node;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.flow.instance.MatchItem;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.node.instance.Property;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.property.instance.property.values.StringValue;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.operation.instance.Action;\r
+\r
+import java.util.ArrayList;\r
+import java.util.LinkedList;\r
+import java.util.List;\r
+import java.util.UUID;\r
+\r
+/**\r
+ * Implement the common utilities frequently used in\r
+ * the action resolution.\r
+ *\r
+ * @author Zhigang Ji\r
+ */\r
+public class ActionResolverUtils {\r
+ /**\r
+ * TODO\r
+ *\r
+ * @param actions TODO\r
+ * @param actionName TODO\r
+ * @return TODO\r
+ */\r
+ protected static Action getAction(List<Action> actions, ActionName actionName) {\r
+ for ( Action action : actions ) {\r
+ if ( action.getActionName().equals(actionName) ) {\r
+ return action;\r
+ }\r
+ }\r
+\r
+ return null;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @param virtualLinks TODO\r
+ * @param virtualLinkId TODO\r
+ * @param bandwidth TODO\r
+ */\r
+ protected static void modifyVirtualLinkBandwidth(\r
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.links.VirtualLink> virtualLinks,\r
+ VirtualLinkId virtualLinkId, long bandwidth) {\r
+ int i = 0;\r
+\r
+ for ( org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.links.VirtualLink\r
+ virtualLink : virtualLinks ) {\r
+ if ( virtualLink.getLinkId().equals(virtualLinkId) ) {\r
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.links.VirtualLink virtualLink1 =\r
+ new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.links.VirtualLinkBuilder(virtualLink)\r
+ .setBandwidth(bandwidth)\r
+ .build();\r
+\r
+ virtualLinks.set(i, virtualLink1);\r
+\r
+ return;\r
+ }\r
+\r
+ i++;\r
+ }\r
+\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @param virtualResources TODO\r
+ * @return TODO\r
+ */\r
+ protected static List<VirtualResource> sortVirtualResources(List<VirtualResource> virtualResources) {\r
+ if ( virtualResources.isEmpty() || 1 == virtualResources.size() ) {\r
+ return virtualResources;\r
+ }\r
+\r
+ List<VirtualResource> sortedVirtualResources = 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
+ * @param parameterValues TODO\r
+ * @return TODO\r
+ */\r
+ protected static List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.instance.parameter.values.StringValue> sortParameterValues(\r
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.instance.parameter.values.StringValue> parameterValues) {\r
+ if ( parameterValues.isEmpty() || 1 == parameterValues.size() ) {\r
+ return parameterValues;\r
+ }\r
+\r
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.instance.parameter.values.StringValue> sortedParameterValues =\r
+ new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.instance.parameter.values.StringValue>(parameterValues.size());\r
+ sortedParameterValues.addAll(parameterValues);\r
+\r
+ for ( org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.instance.parameter.values.StringValue\r
+ parameterValue : parameterValues ) {\r
+ sortedParameterValues.set(parameterValue.getOrder().intValue(), parameterValue);\r
+ }\r
+\r
+ return sortedParameterValues;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @param virtualNodes TODO\r
+ * @param flow TODO\r
+ * @param nodes TODO\r
+ * @param intentVnMappingResults TODO\r
+ * @return TODO\r
+ */\r
+ protected static VirtualNode getSourceVirtualRouterOfFlow(List<VirtualNode> virtualNodes,\r
+ Flow flow, List<Node> nodes,\r
+ List<IntentVnMappingResult> intentVnMappingResults) {\r
+ MatchItemName matchItemName = new MatchItemName("src-ip");\r
+ MatchItem matchItem = getMatchItem(flow.getMatchItem(), matchItemName);\r
+\r
+ if ( null == matchItem ) {\r
+ return null;\r
+ }\r
+\r
+ String matchItemValue = matchItem.getMatchItemValue().getStringValue();\r
+ VirtualNode virtualNode = getVirtualRouterWithIpPrefix(virtualNodes,\r
+ matchItemValue, nodes, intentVnMappingResults);\r
+\r
+ return virtualNode;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @param virtualNodes TODO\r
+ * @param flow TODO\r
+ * @param nodes TODO\r
+ * @param intentVnMappingResults TODO\r
+ * @return TODO\r
+ */\r
+ protected static VirtualNode getDestinationVirtualRouterOfFlow(List<VirtualNode> virtualNodes,\r
+ Flow flow, List<Node> nodes,\r
+ List<IntentVnMappingResult> intentVnMappingResults) {\r
+ MatchItemName matchItemName = new MatchItemName("dst-ip");\r
+ MatchItem matchItem = getMatchItem(flow.getMatchItem(), matchItemName);\r
+\r
+ if ( null == matchItem ) {\r
+ return null;\r
+ }\r
+\r
+ String matchItemValue = matchItem.getMatchItemValue().getStringValue();\r
+ VirtualNode virtualNode = getVirtualRouterWithIpPrefix(virtualNodes,\r
+ matchItemValue, nodes, intentVnMappingResults);\r
+\r
+ return virtualNode;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @param virtualPaths TODO\r
+ * @return TODO\r
+ */\r
+ protected static VirtualPath mergeVirtualPaths(List<VirtualPath> virtualPaths) {\r
+ if ( virtualPaths.isEmpty() ) {\r
+ VirtualPath virtualPath = new VirtualPathBuilder()\r
+ .setPathId(new VirtualPathId(UUID.randomUUID().toString()))\r
+ .setVirtualLink(new ArrayList<VirtualLink>(0))\r
+ .setMetric(0L)\r
+ .setBandwidth(0L)\r
+ .setDelay(0L)\r
+ .build();\r
+\r
+ return virtualPath;\r
+ }\r
+\r
+ if ( 1 == virtualPaths.size() ) {\r
+ return virtualPaths.get(0);\r
+ }\r
+\r
+ List<VirtualLink> virtualLinks = new LinkedList<VirtualLink>();\r
+ VirtualLink virtualLink;\r
+ long metric = 0;\r
+ long bandwidth = Long.MAX_VALUE;\r
+ long delay = 0;\r
+\r
+ for ( VirtualPath virtualPath : virtualPaths ) {\r
+ for ( VirtualLink virtualLink1 : virtualPath.getVirtualLink() ) {\r
+ virtualLink = new VirtualLinkBuilder(virtualLink1)\r
+ .setOrder((long)virtualLinks.size())\r
+ .build();\r
+ virtualLinks.add(virtualLink);\r
+ }\r
+\r
+ metric += virtualPath.getMetric();\r
+ delay += virtualPath.getDelay();\r
+\r
+ if ( virtualPath.getBandwidth() < bandwidth ) {\r
+ bandwidth = virtualPath.getBandwidth();\r
+ }\r
+ }\r
+\r
+ VirtualPath virtualPath = new VirtualPathBuilder()\r
+ .setPathId(new VirtualPathId(UUID.randomUUID().toString()))\r
+ .setVirtualLink(virtualLinks)\r
+ .setMetric(metric)\r
+ .setBandwidth(bandwidth)\r
+ .setDelay(delay)\r
+ .build();\r
+\r
+ return virtualPath;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @param matchItems TODO\r
+ * @param matchItemName TODO\r
+ * @return TODO\r
+ */\r
+ private static MatchItem getMatchItem(List<MatchItem> matchItems, MatchItemName matchItemName) {\r
+ if ( null != matchItems ) {\r
+ for ( MatchItem matchItem : matchItems ) {\r
+ if ( matchItem.getMatchItemName().equals(matchItemName) ) {\r
+ return matchItem;\r
+ }\r
+ }\r
+ }\r
+\r
+ return null;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @param virtualNodes TODO\r
+ * @param ipPrefix TODO\r
+ * @param nodes TODO\r
+ * @param intentVnMappingResults TODO\r
+ * @return TODO\r
+ */\r
+ private static VirtualNode getVirtualRouterWithIpPrefix(List<VirtualNode> virtualNodes,\r
+ String ipPrefix, List<Node> nodes,\r
+ List<IntentVnMappingResult> intentVnMappingResults) {\r
+ NodeType layer2GroupNodeType = new NodeType("l2-group");\r
+ NodeType externalGroupNodeType = new NodeType("ext-group");\r
+ PropertyName propertyName = new PropertyName("ip-prefix");\r
+ Property property;\r
+ List<StringValue> propertyValues;\r
+ IntentVnMappingResult intentVnMappingResult;\r
+ VirtualResource virtualResource;\r
+ VirtualNodeId virtualNodeId;\r
+ VirtualNode virtualNode;\r
+\r
+ for ( Node node : nodes ) {\r
+ if ( node.getNodeType().equals(layer2GroupNodeType)\r
+ || node.getNodeType().equals(externalGroupNodeType) ) {\r
+ property = IntentResolverUtils.getNodeProperty(node.getProperty(), propertyName);\r
+\r
+ if ( null != property ) {\r
+ propertyValues = property.getPropertyValues().getStringValue();\r
+\r
+ if ( containPropertyValue(propertyValues, ipPrefix) ) {\r
+ intentVnMappingResult = IntentResolverUtils.getIntentVnMappingResult(\r
+ intentVnMappingResults, new IntentId(node.getNodeId().getValue()));\r
+\r
+ if ( null == intentVnMappingResult ) {\r
+ return null;\r
+ }\r
+\r
+ virtualResource = intentVnMappingResult.getVirtualResource().get(0);\r
+\r
+ if ( VirtualResource.VirtualResourceType.Vport\r
+ == virtualResource.getVirtualResourceType() ) {\r
+ virtualNodeId = new VirtualNodeId(\r
+ virtualResource.getParentVirtualResourceEntityId().getValue());\r
+ } else if ( VirtualResource.VirtualResourceType.Vnode\r
+ == virtualResource.getVirtualResourceType() ) {\r
+ virtualNodeId = new VirtualNodeId(\r
+ virtualResource.getVirtualResourceEntityId().getValue());\r
+ } else {\r
+ return null;\r
+ }\r
+\r
+ virtualNode = IntentResolverUtils.getVirtualNode(virtualNodes, virtualNodeId);\r
+\r
+ if ( null == virtualNode ) {\r
+ return null;\r
+ }\r
+\r
+ if ( VirtualNode.NodeType.Vrouter == virtualNode.getNodeType() ) {\r
+ return virtualNode;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ return null;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @param propertyValues TODO\r
+ * @param propertyValue TODO\r
+ * @return TODO\r
+ */\r
+ private static boolean containPropertyValue(List<StringValue> propertyValues, String propertyValue) {\r
+ for ( StringValue stringValue : propertyValues ) {\r
+ if ( stringValue.getValue().equals(propertyValue) ) {\r
+ return true;\r
+ }\r
+ }\r
+\r
+ return false;\r
+ }\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.nemo.intent.computation;\r
+\r
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
+import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;\r
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;\r
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;\r
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
+import org.opendaylight.nemo.intent.IntentResolver;\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.PhysicalNodes;\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.node.instance.PhysicalPort;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserId;\r
+import org.opendaylight.yangtools.concepts.ListenerRegistration;\r
+import org.opendaylight.yangtools.yang.binding.DataObject;\r
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+import java.util.*;\r
+import java.util.concurrent.ConcurrentHashMap;\r
+import java.util.concurrent.CopyOnWriteArraySet;\r
+\r
+/**\r
+ * The virtual network mapping unit implements the following functions:\r
+ * (1) Automatically perform the virtual network mapping when the user's\r
+ * virtual network changed, which is subscribed from the data store.\r
+ * (2) Automatically perform the remapping for the virtual networks that\r
+ * are influenced by the changes of the underlying physical network\r
+ * which are also subscribed from the data store.\r
+ *\r
+ * @author Zhigang Ji\r
+ */\r
+public class PNResourcesTracker {\r
+ private static final Logger log = LoggerFactory.getLogger(PNResourcesTracker.class);\r
+\r
+ private final ConcurrentHashMap<UserId, CopyOnWriteArraySet<String>/*physical resources*/> physicalResourceMap;\r
+\r
+ private final DataBroker dataBroker;\r
+ private final IntentResolver intentResolver;\r
+\r
+ /**\r
+ * The registration for the physical node change listener.\r
+ */\r
+ private ListenerRegistration<DataChangeListener> physicalNodeChangeListenerReg;\r
+\r
+ /**\r
+ * The registration for the physical link change listener.\r
+ */\r
+ private ListenerRegistration<DataChangeListener> physicalLinkChangeListenerReg;\r
+\r
+ public PNResourcesTracker(DataBroker dataBroker, IntentResolver intentResolver) {\r
+ super();\r
+\r
+ this.dataBroker = dataBroker;\r
+ this.intentResolver = intentResolver;\r
+ physicalResourceMap = new ConcurrentHashMap<UserId, CopyOnWriteArraySet<String>>();\r
+\r
+ InstanceIdentifier<PhysicalNode> nodeInstanceIdentifier = InstanceIdentifier\r
+ .builder(PhysicalNetwork.class)\r
+ .child(PhysicalNodes.class)\r
+ .child(PhysicalNode.class)\r
+ .build();\r
+ InstanceIdentifier<PhysicalLink> linkInstanceIdentifier = InstanceIdentifier\r
+ .builder(PhysicalNetwork.class)\r
+ .child(PhysicalLinks.class)\r
+ .child(PhysicalLink.class)\r
+ .build();\r
+\r
+ physicalNodeChangeListenerReg = dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,\r
+ nodeInstanceIdentifier, new PhysicalNodeChangeListener(), DataChangeScope.BASE);\r
+ physicalLinkChangeListenerReg = dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,\r
+ linkInstanceIdentifier, new PhysicalLinkChangeListener(), DataChangeScope.BASE);\r
+\r
+ return;\r
+ }\r
+ public void close(){\r
+ if(physicalLinkChangeListenerReg!=null){\r
+ physicalLinkChangeListenerReg.close();\r
+ }\r
+ if(physicalNodeChangeListenerReg!=null){\r
+ physicalNodeChangeListenerReg.close();\r
+ }\r
+ physicalResourceMap.clear();\r
+ }\r
+ protected synchronized void resetResource(UserId userId) {\r
+ physicalResourceMap.remove(userId);\r
+ }\r
+\r
+ protected void addPhysicalNode(UserId userId, PhysicalNode physicalNode) {\r
+ addPhysicalResource(userId, physicalNode.getKey().toString());\r
+ }\r
+\r
+ protected void addPhysicalPort(UserId userId, PhysicalPort physicalPort) {\r
+ addPhysicalResource(userId, physicalPort.getKey().toString());\r
+ }\r
+\r
+ protected void addPhysicalPath(UserId userId, PhysicalPath physicalPath) {\r
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.path.instance.PhysicalLink>\r
+ physicalLinkList = physicalPath.getPhysicalLink();\r
+ for (org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.path.instance.PhysicalLink physicalLink :\r
+ physicalLinkList) {\r
+ addPhysicalResource(userId, physicalLink.getKey().toString());\r
+ }\r
+ }\r
+\r
+ private synchronized void addPhysicalResource(UserId userId, String resourceId) {\r
+ if (!physicalResourceMap.containsKey(userId)) {\r
+ physicalResourceMap.put(userId, new CopyOnWriteArraySet<String>());\r
+ }\r
+ physicalResourceMap.get(userId).add(resourceId);\r
+ }\r
+\r
+ private synchronized void physicalResourceDown(String resourceId) {\r
+ Map<UserId, CopyOnWriteArraySet<String>> tmpMap = new HashMap<UserId, CopyOnWriteArraySet<String>>(physicalResourceMap);\r
+ for (UserId userId : tmpMap.keySet()) {\r
+ Set<String> physicalResources = tmpMap.get(userId);\r
+ if (physicalResources.contains(resourceId)) {\r
+ physicalResourceMap.remove(userId);\r
+ try {\r
+ intentResolver.resolveIntent(userId);\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * A listener to ch ange events related to physical nodes being\r
+ * added, removed or updated.\r
+ *\r
+ * @author Zhigang Ji\r
+ */\r
+ private class PhysicalNodeChangeListener implements DataChangeListener {\r
+ @Override\r
+ public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {\r
+ if (null == change) {\r
+ return;\r
+ }\r
+\r
+ Map<InstanceIdentifier<?>, DataObject> originalData = change.getOriginalData();\r
+ Map<InstanceIdentifier<?>, DataObject> updatedData = change.getUpdatedData();\r
+\r
+ if (null != updatedData && !updatedData.isEmpty()) {\r
+ for (InstanceIdentifier<?> identifier : updatedData.keySet()) {\r
+ DataObject originData = originalData.get(identifier);\r
+ DataObject currentData = updatedData.get(identifier);\r
+ if (originData != null && originData instanceof PhysicalNode) {\r
+ handleNodeUpdate((PhysicalNode) originData, (PhysicalNode) currentData);\r
+ }\r
+ }\r
+ }\r
+\r
+ Set<InstanceIdentifier<?>> removedPaths = change.getRemovedPaths();\r
+\r
+ if (null != removedPaths && !removedPaths.isEmpty()) {\r
+ DataObject dataObject;\r
+ for (InstanceIdentifier<?> instanceId : removedPaths) {\r
+ dataObject = originalData.get(instanceId);\r
+ if (dataObject != null && dataObject instanceof PhysicalNode) {\r
+ String resourceId = ((PhysicalNode) dataObject).getKey().toString();\r
+ log.debug("Physical node {} removed.", resourceId);\r
+ physicalResourceDown(resourceId);\r
+ }\r
+\r
+ }\r
+ }\r
+ }\r
+\r
+ private void handleNodeUpdate(PhysicalNode originNode, PhysicalNode currentNode) {\r
+ log.debug("Handle node {} update.", originNode.getNodeId().getValue());\r
+ List<PhysicalPort> originPorts = originNode.getPhysicalPort();\r
+ List<PhysicalPort> currentPorts = currentNode.getPhysicalPort() == null ? new ArrayList<PhysicalPort>() : currentNode.getPhysicalPort();\r
+ if (originPorts != null)\r
+ for (PhysicalPort physicalPort : originPorts) {\r
+ if (!currentPorts.contains(physicalPort)) {\r
+ log.debug("Physical port {} removed.", physicalPort.getPortId().getValue());\r
+ physicalResourceDown(physicalPort.getKey().toString());\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * A listener to change events related to physical links being\r
+ * added, removed or updated.\r
+ *\r
+ * @author Zhigang Ji\r
+ */\r
+ private class PhysicalLinkChangeListener implements DataChangeListener {\r
+ @Override\r
+ public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {\r
+ if (null == change) {\r
+ return;\r
+ }\r
+\r
+ Map<InstanceIdentifier<?>, DataObject> originalData = change.getOriginalData();\r
+ Map<InstanceIdentifier<?>, DataObject> updatedData = change.getUpdatedData();\r
+\r
+ if (null != updatedData && !updatedData.isEmpty()) {\r
+ for (InstanceIdentifier<?> identifier : updatedData.keySet()) {\r
+ DataObject originData = originalData.get(identifier);\r
+ DataObject currentDate = updatedData.get(identifier);\r
+ if (originData != null && originData instanceof PhysicalLink) {\r
+ handleLinkUpdate((PhysicalLink) originalData, (PhysicalLink) currentDate);\r
+ }\r
+ }\r
+ }\r
+\r
+ Set<InstanceIdentifier<?>> removedPaths = change.getRemovedPaths();\r
+\r
+ if (null != removedPaths && !removedPaths.isEmpty()) {\r
+ DataObject dataObject;\r
+\r
+ for (InstanceIdentifier<?> instanceId : removedPaths) {\r
+ dataObject = originalData.get(instanceId);\r
+ if (dataObject != null && dataObject instanceof PhysicalLink) {\r
+ String resourceId = ((PhysicalLink) dataObject).getKey().toString();\r
+ log.debug("Physical link {} removed.", resourceId);\r
+ physicalResourceDown(resourceId);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ private void handleLinkUpdate(PhysicalLink originLink, PhysicalLink currentLink) {\r
+ log.debug("Handle physical link {} update.", originLink.getLinkId().getValue());\r
+ //TODO\r
+ }\r
+ }\r
+\r
+\r
+}\r
\r
package org.opendaylight.nemo.intent.computation;\r
\r
-import java.util.ArrayList;\r
-import java.util.HashMap;\r
-import java.util.LinkedList;\r
-import java.util.List;\r
-import java.util.Map;\r
-import java.util.Set;\r
-import java.util.UUID;\r
-import java.util.concurrent.ExecutionException;\r
-\r
+import com.google.common.base.Optional;\r
import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;\r
import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;\r
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;\r
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;\r
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
import org.opendaylight.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.PhysicalNodeAttributeDefinitions;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalPortAttributeDefinitions;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.attribute.definition.AttributeMatchPatterns;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.attribute.instance.attribute.value.RangeValue;\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.PhysicalNodes;\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.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.intent.mapping.result.rev151010.vn.pn.mapping.results.user.vn.pn.mapping.VnPnMappingResultBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.AttributeName;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalNodeId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalPathId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalPortId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalResourceEntityId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalResourceId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.VirtualNetworkId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.VirtualNodeId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.VirtualResourceEntityId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.VirtualResourceId;\r
-import org.opendaylight.yangtools.concepts.ListenerRegistration;\r
-import org.opendaylight.yangtools.yang.binding.DataObject;\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.yangtools.yang.binding.InstanceIdentifier;\r
import org.slf4j.Logger;\r
import org.slf4j.LoggerFactory;\r
\r
-import com.google.common.base.Optional;\r
+import java.util.ArrayList;\r
+import java.util.LinkedList;\r
+import java.util.List;\r
+import java.util.UUID;\r
+import java.util.concurrent.ExecutionException;\r
\r
/**\r
* The virtual network mapping unit implements the following functions:\r
private PNComputationUnit pnComputationUnit;\r
\r
/**\r
- * The registrations for the physical port change listeners.\r
- */\r
- private Map<PhysicalNodeId, Map<PhysicalPortId, ListenerRegistration<DataChangeListener>>> physicalPortChangeListenerRegs;\r
-\r
- /**\r
- * The registration for the physical node change listener.\r
- */\r
- private ListenerRegistration<DataChangeListener> physicalNodeChangeListenerReg;\r
-\r
- /**\r
- * The registration for the physical link change listener.\r
+ * The physical network resource tracker.\r
*/\r
- private ListenerRegistration<DataChangeListener> physicalLinkChangeListenerReg;\r
+ private PNResourcesTracker pnResourcesTracker;\r
\r
- public VNMappingUnit(DataBroker dataBroker, PNComputationUnit pnComputationUnit) {\r
+ public VNMappingUnit(DataBroker dataBroker,\r
+ PNComputationUnit pnComputationUnit,\r
+ PNResourcesTracker pnResourcesTracker) {\r
super();\r
\r
this.dataBroker = dataBroker;\r
this.pnComputationUnit = pnComputationUnit;\r
-\r
- physicalPortChangeListenerRegs =\r
- new HashMap<PhysicalNodeId, Map<PhysicalPortId, ListenerRegistration<DataChangeListener>>>();\r
-\r
- InstanceIdentifier<PhysicalNode> physicalNodeIid = InstanceIdentifier\r
- .builder(PhysicalNetwork.class)\r
- .child(PhysicalNodes.class)\r
- .child(PhysicalNode.class)\r
- .build();\r
- InstanceIdentifier<PhysicalLink> physicalLinkIid = InstanceIdentifier\r
- .builder(PhysicalNetwork.class)\r
- .child(PhysicalLinks.class)\r
- .child(PhysicalLink.class)\r
- .build();\r
-\r
- physicalNodeChangeListenerReg = dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,\r
- physicalNodeIid, new PhysicalNodeChangeListener(), DataChangeScope.BASE);\r
- physicalLinkChangeListenerReg = dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,\r
- physicalLinkIid, new PhysicalLinkChangeListener(), DataChangeScope.BASE);\r
+ this.pnResourcesTracker = pnResourcesTracker;\r
\r
LOG.debug("Initialized the virtual network mapping unit.");\r
\r
PhysicalNodes physicalNodes = result.get();\r
List<PhysicalNode> physicalNodeList = physicalNodes.getPhysicalNode();\r
\r
+ UserId userId = virtualNetwork.getUserId();\r
List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();\r
List<VirtualNode> virtualNodes = virtualNetwork.getVirtualNodes().getVirtualNode();\r
List<VirtualPort> virtualPorts;\r
physicalNode = virtualNodeMapping(virtualNetwork.getNetworkId(), virtualNode, physicalNodeList);\r
\r
if ( null == physicalNode ) {\r
+ // If mapping failed, reset the user physical resources.\r
+ pnResourcesTracker.resetResource(userId);\r
+\r
throw new VNMappingException("Failed mapping for the virtual node " +\r
virtualNode.getNodeId().getValue() + " in the virtual network " +\r
virtualNetwork.getNetworkId().getValue());\r
}\r
\r
+ // Keep physical resource.\r
+ pnResourcesTracker.addPhysicalNode(userId, physicalNode);\r
+\r
virtualPorts = virtualNode.getVirtualPort();\r
\r
for ( VirtualPort virtualPort : virtualPorts ) {\r
virtualNode.getNodeId(), virtualPort, physicalNode);\r
\r
if ( null == physicalPort ) {\r
+ // If mapping failed, reset the user physical resources.\r
+ pnResourcesTracker.resetResource(userId);\r
+\r
throw new VNMappingException("Failed mapping for the virtual port " +\r
virtualPort.getPortId().getValue() + " of the virtual node " +\r
virtualNode.getNodeId().getValue() + " in the virtual network " +\r
virtualNetwork.getNetworkId().getValue());\r
}\r
\r
+ // Keep physical resource.\r
+ pnResourcesTracker.addPhysicalPort(userId, physicalPort);\r
+\r
vnPnMappingResult = new VnPnMappingResultBuilder()\r
.setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
.setVirtualResourceType(VirtualResourceInstance.VirtualResourceType.Vport)\r
physicalPath = virtualLinkMapping(virtualNetwork.getNetworkId(), virtualLink, userVnPnMapping);\r
\r
if ( null == physicalPath ) {\r
+ // If mapping failed, reset the user physical resources.\r
+ pnResourcesTracker.resetResource(userId);\r
+\r
throw new VNMappingException("Failed mapping for the virtual link " +\r
virtualLink.getLinkId().getValue() + " in the virtual network " +\r
virtualNetwork.getNetworkId().getValue());\r
}\r
\r
+ // Keep physical resource.\r
+ pnResourcesTracker.addPhysicalPath(userId, physicalPath);\r
+\r
physicalPaths.add(physicalPath);\r
\r
newVirtualLink = new VirtualLinkBuilder(virtualLink)\r
return;\r
}\r
\r
- @Override\r
- public void close() throws Exception {\r
- for ( Map<PhysicalPortId, ListenerRegistration<DataChangeListener>>\r
- physicalPortChangeListenerRegs1 : physicalPortChangeListenerRegs.values() ) {\r
- for ( ListenerRegistration<DataChangeListener>\r
- physicalPortChangeListenerReg : physicalPortChangeListenerRegs1.values() ) {\r
- if ( null != physicalPortChangeListenerReg ) {\r
- physicalPortChangeListenerReg.close();\r
- }\r
+ /**\r
+ * TODO\r
+ *\r
+ * @param virtualNetwork TODO\r
+ * @param unmappedVirtualLinks TODO\r
+ * @param userVnPnMapping TODO\r
+ * @param physicalPaths TODO\r
+ * @throws VNMappingException\r
+ */\r
+ public void virtualNetworkMapping(VirtualNetwork virtualNetwork, List<VirtualLink> unmappedVirtualLinks,\r
+ UserVnPnMapping userVnPnMapping, List<PhysicalPath> physicalPaths)\r
+ throws VNMappingException {\r
+ List<VirtualLink> virtualLinks = virtualNetwork.getVirtualLinks().getVirtualLink();\r
+ List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();\r
+ PhysicalPath physicalPath;\r
+ VirtualLink newVirtualLink;\r
+ VnPnMappingResult vnPnMappingResult;\r
+ int i = virtualLinks.size() - unmappedVirtualLinks.size();\r
+\r
+ for ( VirtualLink virtualLink : unmappedVirtualLinks ) {\r
+ physicalPath = virtualLinkMapping(virtualNetwork.getNetworkId(), virtualLink, userVnPnMapping);\r
+\r
+ if ( null == physicalPath ) {\r
+ throw new VNMappingException("Failed mapping for the virtual link " +\r
+ virtualLink.getLinkId().getValue() + " in the virtual network " +\r
+ virtualNetwork.getNetworkId().getValue());\r
}\r
- }\r
\r
- if ( null != physicalNodeChangeListenerReg ) {\r
- physicalNodeChangeListenerReg.close();\r
- }\r
+ physicalPaths.add(physicalPath);\r
+\r
+ newVirtualLink = new VirtualLinkBuilder(virtualLink)\r
+ .setMetric(physicalPath.getMetric())\r
+ .setDelay(physicalPath.getDelay())\r
+ .build();\r
+\r
+ virtualLinks.set(i++, newVirtualLink);\r
+\r
+ vnPnMappingResult = new VnPnMappingResultBuilder()\r
+ .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
+ .setVirtualResourceType(VirtualResourceInstance.VirtualResourceType.Vlink)\r
+ .setVirtualResourceEntityId(new VirtualResourceEntityId(virtualLink.getLinkId().getValue()))\r
+ .setPhysicalResourceId(new PhysicalResourceId(UUID.randomUUID().toString()))\r
+ .setPhysicalResourceType(PhysicalResourceInstance.PhysicalResourceType.Path)\r
+ .setPhysicalResourceEntityId(new PhysicalResourceEntityId(physicalPath.getPathId().getValue()))\r
+ .build();\r
\r
- if ( null != physicalLinkChangeListenerReg ) {\r
- physicalLinkChangeListenerReg.close();\r
+ vnPnMappingResults.add(vnPnMappingResult);\r
}\r
\r
return;\r
}\r
\r
+ @Override\r
+ public void close() throws Exception {\r
+ return;\r
+ }\r
+\r
/**\r
* TODO\r
*\r
* @return TODO\r
*/\r
private PhysicalPort virtualPortMapping(VirtualNetworkId virtualNetworkId, VirtualNodeId virtualNodeId,\r
- VirtualPort virtualPort, PhysicalNode physicalNode)\r
+ VirtualPort virtualPort, PhysicalNode physicalNode)\r
throws VNMappingException {\r
if ( VirtualPort.PortType.Internal == virtualPort.getPortType() ) {\r
return null;\r
// }\r
// }\r
// }\r
-\r
- /**\r
- * A listener to change events related to physical ports being\r
- * added, removed or updated.\r
- *\r
- * @author Zhigang Ji\r
- */\r
- private class PhysicalPortChangeListener implements DataChangeListener {\r
- /**\r
- * The physical node that the physical port belongs to.\r
- */\r
- private PhysicalNodeId physicalNodeId;\r
-\r
- public PhysicalPortChangeListener(PhysicalNodeId physicalNodeId) {\r
- super();\r
-\r
- this.physicalNodeId = physicalNodeId;\r
-\r
- return;\r
- }\r
-\r
- @Override\r
- public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {\r
- if ( null == change ) {\r
- return;\r
- }\r
-\r
- Map<InstanceIdentifier<?>, DataObject> originalData = change.getOriginalData();\r
- Map<InstanceIdentifier<?>, DataObject> updatedData = change.getUpdatedData();\r
-\r
- if ( null != updatedData && !updatedData.isEmpty() ) {\r
- for ( DataObject dataObject : updatedData.values() ) {\r
- // TODO\r
- }\r
- }\r
-\r
- Set<InstanceIdentifier<?>> removedPaths = change.getRemovedPaths();\r
-\r
- if ( null != removedPaths && !removedPaths.isEmpty() ) {\r
- DataObject dataObject;\r
-\r
- for ( InstanceIdentifier<?> instanceId : removedPaths ) {\r
- dataObject = originalData.get(instanceId);\r
-\r
- // TODO\r
- }\r
- }\r
- }\r
- }\r
-\r
- /**\r
- * A listener to change events related to physical nodes being\r
- * added, removed or updated.\r
- *\r
- * @author Zhigang Ji\r
- */\r
- private class PhysicalNodeChangeListener implements DataChangeListener {\r
- @Override\r
- public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {\r
- if ( null == change ) {\r
- return;\r
- }\r
-\r
- Map<InstanceIdentifier<?>, DataObject> originalData = change.getOriginalData();\r
- Map<InstanceIdentifier<?>, DataObject> updatedData = change.getUpdatedData();\r
-\r
- if ( null != updatedData && !updatedData.isEmpty() ) {\r
- for ( DataObject dataObject : updatedData.values() ) {\r
- // TODO\r
- }\r
- }\r
-\r
- Set<InstanceIdentifier<?>> removedPaths = change.getRemovedPaths();\r
-\r
- if ( null != removedPaths && !removedPaths.isEmpty() ) {\r
- DataObject dataObject;\r
-\r
- for ( InstanceIdentifier<?> instanceId : removedPaths ) {\r
- dataObject = originalData.get(instanceId);\r
-\r
- // TODO\r
- }\r
- }\r
- }\r
- }\r
-\r
- /**\r
- * A listener to change events related to physical links being\r
- * added, removed or updated.\r
- *\r
- * @author Zhigang Ji\r
- */\r
- private class PhysicalLinkChangeListener implements DataChangeListener {\r
- @Override\r
- public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {\r
- if ( null == change ) {\r
- return;\r
- }\r
-\r
- Map<InstanceIdentifier<?>, DataObject> originalData = change.getOriginalData();\r
- Map<InstanceIdentifier<?>, DataObject> updatedData = change.getUpdatedData();\r
-\r
- if ( null != updatedData && !updatedData.isEmpty() ) {\r
- for ( DataObject dataObject : updatedData.values() ) {\r
- // TODO\r
- }\r
- }\r
-\r
- Set<InstanceIdentifier<?>> removedPaths = change.getRemovedPaths();\r
-\r
- if ( null != removedPaths && !removedPaths.isEmpty() ) {\r
- DataObject dataObject;\r
-\r
- for ( InstanceIdentifier<?> instanceId : removedPaths ) {\r
- dataObject = originalData.get(instanceId);\r
-\r
- // TODO\r
- }\r
- }\r
- }\r
- }\r
}\r
public NemoEngine() {
rpcRegistration = rpcProviderRegistry.addRpcImplementation(NemoIntentService.class, userManager);
}
-
+
@Override
public void close() throws Exception {
if (null != rpcRegistration) {
rpcRegistration.close();
}
-
+
if ( null != intentResolver ) {
intentResolver.close();
}
+++ /dev/null
-package org.opendaylight.nemo.intent;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.nemo.intent.IntentResolverUtils;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.VirtualResourceEntityId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.VirtualResourceInstance.VirtualResourceType;
-import static org.junit.Assert.*;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.hosts.PhysicalHost;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.links.VirtualLink;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.nodes.VirtualNode;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.user.intent.vn.mapping.IntentVnMappingResult;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.user.intent.vn.mapping.intent.vn.mapping.result.VirtualResource;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.*;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalHostId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalNodeId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.VirtualNodeId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.Objects;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Connection;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Node;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.operations.Operation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.flow.instance.MatchItem;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.node.instance.Property;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.node.instance.SubNode;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.property.instance.property.values.StringValue;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.operation.instance.Action;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.match.item.instance.MatchItemValue;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.property.instance.PropertyValues;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.NodeId;
-//import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.connection.instance.Property;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import static org.mockito.Mockito.*;
-
-/**
- * Created by zhangmeng on 2015/11/26.
- */
-public class IntentResolverUtilsTest extends IntentResolverUtils {
-
- @Before
- public void setUp() throws Exception {
-
- }
-
- @Test
- public void testCheckExternalLayer3Group() throws Exception {
- Node node = mock(Node.class);
- List<Property> properties = new LinkedList<Property>();
- Property property = mock(Property.class);
- properties.add(property);
-
- when(node.getProperty()).thenReturn(null);//avoid testing method "getNodeProperty"
- IntentResolverUtils.checkExternalLayer3Group(node);
- verify(node).getProperty();
-
- //test method "getNodeProperty". and method "CheckExternalLayer3Group"`s another branch
-// when(node.getProperty()).thenReturn(properties);
-// when(property.getPropertyName()).thenReturn(new PropertyName("ac-info-network"));
-
- /* anther branch can`t be tested. The reason is that I cannot known the method property.getPropertyValues() returns what object.
- So I cant`t mock the needed object
- */
- }
-
- @Test
- public void testGetPhysicalHost() throws Exception {
- List<PhysicalHost> physicalHosts = new LinkedList<PhysicalHost>();
- Node node = mock(Node.class);
- NodeId nodeId = mock(NodeId.class);
-
- when(node.getNodeId()).thenReturn(nodeId);
- when(nodeId.getValue()).thenReturn(new String("00001111-0000-0000-0000-000011112222"));
-
- // test private method "getPhysicalHost"
- PhysicalHost physicalHost = mock(PhysicalHost.class);
- physicalHosts.add(physicalHost);
- when(physicalHost.getHostId())
- .thenReturn(new PhysicalHostId("00001111-0000-0000-0000-000011112222"))
- .thenReturn(new PhysicalHostId("00001111-0000-0000-0000-000011112221"));
-
- IntentResolverUtils.getPhysicalHost(physicalHosts, node);
- IntentResolverUtils.getPhysicalHost(physicalHosts,node);
- verify(node,times(2)).getNodeId();
- verify(nodeId,times(2)).getValue();
- verify(physicalHost,times(2)).getHostId();
- }
-
- @Test
- public void testGetNodeProperty() throws Exception {
- List<Property> properties = new LinkedList<Property>();
- PropertyName propertyName = new PropertyName("test");
- Property property = mock(Property.class);
- properties.add(property);
-
- when(property.getPropertyName()).thenReturn(propertyName);
- IntentResolverUtils.getNodeProperty(properties, propertyName);
- verify(property).getPropertyName();
-
- IntentResolverUtils.getNodeProperty(null, propertyName);
- }
-
- @Test
- public void testGeneratePhysicalNodeIdFromNodeLocationProperty() throws Exception {
- //method can`t be tested because of "String propertyValue = property.getPropertyValues().getStringValue().get(0).getValue();"
-
- }
-
- @Test
- public void testGetIntentVnMappingResult() throws Exception {
- List<IntentVnMappingResult> intentVnMappingResults = new LinkedList<IntentVnMappingResult>();
- IntentId intentId = mock(IntentId.class);
- IntentVnMappingResult intentVnMappingResult = mock(IntentVnMappingResult.class);
- intentVnMappingResults.add(intentVnMappingResult);
-
- when(intentVnMappingResult.getIntentId())
- .thenReturn(intentId)
- .thenReturn(new IntentId("00001111-0000-0000-0000-000011112222"));
-
- IntentResolverUtils.getIntentVnMappingResult(intentVnMappingResults, intentId);
- IntentResolverUtils.getIntentVnMappingResult(intentVnMappingResults, intentId);
- verify(intentVnMappingResult,times(2)).getIntentId();
- }
-
- @Test
- public void testGetVirtualNode() throws Exception {
- List<VirtualNode> virtualNodes = new LinkedList<VirtualNode>();
- VirtualNodeId virtualNodeId = mock(VirtualNodeId.class);
- VirtualNode virtualNode = mock(VirtualNode.class);
- virtualNodes.add(virtualNode);
-
- when(virtualNode.getNodeId())
- .thenReturn(virtualNodeId)
- .thenReturn(new VirtualNodeId("00001111-0000-0000-0000-000011112222"));
-
- IntentResolverUtils.getVirtualNode(virtualNodes, virtualNodeId);
- IntentResolverUtils.getVirtualNode(virtualNodes, virtualNodeId);
- verify(virtualNode,times(2)).getNodeId();
- }
-
- @Test
- public void testGetNode() throws Exception {
- List<Node> nodes = new LinkedList<Node>();
- NodeId nodeId = mock(NodeId.class);
- Node node = mock(Node.class);
- nodes.add(node);
-
- when(node.getNodeId())
- .thenReturn(nodeId)
- .thenReturn(new NodeId("00001111-0000-0000-0000-000011112222"));
-
- IntentResolverUtils.getNode(nodes, nodeId);
- IntentResolverUtils.getNode(nodes, nodeId);
- verify(node,times(2)).getNodeId();
- }
-
- @Test
- public void testGetConnectionProperty() throws Exception {
- List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.connection.instance.Property>
- properties = new LinkedList<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.connection.instance.Property>();
- PropertyName propertyName = mock(PropertyName.class);
- org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.connection.instance.Property
- property = mock(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.connection.instance.Property.class);
- properties.add(property);
-
- when(property.getPropertyName()).thenReturn(propertyName);
-
- IntentResolverUtils.getConnectionProperty(properties, propertyName);
- verify(property).getPropertyName();
-
- IntentResolverUtils.getConnectionProperty(null,propertyName);
- }
-
- @Test
- public void testSortSubNodes() throws Exception {
- List<SubNode> subNodes = new LinkedList<SubNode>();
- SubNode subNode = mock(SubNode.class);
- SubNode subNode1 = mock(SubNode.class);
- long first = 0;
- long second = 1;
-
- //test empty
- Assert.assertTrue(subNodes.size() == 0);
- IntentResolverUtils.sortSubNodes(subNodes);
- //test size = 1;
- subNodes.add(subNode);
- Assert.assertTrue(subNodes.size() == 1);
- IntentResolverUtils.sortSubNodes(subNodes);
- //test size > 1
- subNodes.add(subNode1);
- when(subNode.getOrder()).thenReturn(first);
- when(subNode1.getOrder()).thenReturn(second);
-
- }
-
- @Test
- public void testCheckAllLayer2OperatingMode() throws Exception {
- List<SubNode> subNodes = new LinkedList<SubNode>();
- List<Node> nodes = new LinkedList<Node>();
- List<Property> properties = new LinkedList<Property>();
- //List<StringValue> stringValues = new LinkedList<StringValue>();
- List<StringValue> stringValues = mock(List.class);
- Property property = mock(Property.class);
- NodeId nodeId = mock(NodeId.class);
- Node node = mock(Node.class);
- SubNode subNode = mock(SubNode.class);
- PropertyName propertyName = mock(PropertyName.class);
- PropertyValues propertyValues = mock(PropertyValues.class);
- StringValue stringValue = mock(StringValue.class);
-
- //test empty
- Assert.assertTrue(subNodes.size() == 0);
- Assert.assertFalse(IntentResolverUtils.checkAllLayer2OperatingMode(subNodes, nodes));
-
- //test not empty
- subNodes.add(subNode);
- nodes.add(node);
- properties.add(property);
- //stringValues.add(stringValue);
- when(subNode.getNodeId()).thenReturn(nodeId);
- when(node.getNodeId())
- .thenReturn(new NodeId("00001111-0000-0000-0000-000011112222"))
- .thenReturn(nodeId)
- .thenReturn(nodeId)
- .thenReturn(nodeId);
- Assert.assertFalse(IntentResolverUtils.checkAllLayer2OperatingMode(subNodes, nodes));
- when(node.getProperty()).thenReturn(properties);
- when(property.getPropertyName())
- .thenReturn(propertyName)
- .thenReturn(new PropertyName("operating-mode"))
- .thenReturn(new PropertyName("operating-mode"));
- Assert.assertFalse(IntentResolverUtils.checkAllLayer2OperatingMode(subNodes, nodes));
- when(property.getPropertyValues()).thenReturn(propertyValues);
- when(propertyValues.getStringValue()).thenReturn(stringValues);
- when(stringValues.get(anyInt())).thenReturn(stringValue);
- when(stringValue.getValue())
- .thenReturn(new String("layer2"))
- .thenReturn(new String("test"));
-
- Assert.assertTrue(IntentResolverUtils.checkAllLayer2OperatingMode(subNodes, nodes));
- Assert.assertFalse(IntentResolverUtils.checkAllLayer2OperatingMode(subNodes, nodes));
-
- verify(subNode,times(4)).getNodeId();
- verify(node,times(4)).getNodeId();
- verify(node,times(3)).getProperty();
- verify(property,times(3)).getPropertyName();
- verify(property, times(2)).getPropertyValues();
- verify(propertyValues,times(2)).getStringValue();
- verify(stringValues,times(2)).get(anyInt());
- verify(stringValue,times(2)).getValue();
-
- }
-
- @Test
- public void testCheckAllLayer3OperatingMode() throws Exception {
- List<SubNode> subNodes = new LinkedList<SubNode>();
- List<Node> nodes = new LinkedList<Node>();
- List<Property> properties = new LinkedList<Property>();
- //List<StringValue> stringValues = new LinkedList<StringValue>();
- List<StringValue> stringValues = mock(List.class);
- Property property = mock(Property.class);
- NodeId nodeId = mock(NodeId.class);
- Node node = mock(Node.class);
- SubNode subNode = mock(SubNode.class);
- PropertyName propertyName = mock(PropertyName.class);
- PropertyValues propertyValues = mock(PropertyValues.class);
- StringValue stringValue = mock(StringValue.class);
-
- //test empty
- Assert.assertTrue(subNodes.size() == 0);
- Assert.assertFalse(IntentResolverUtils.checkAllLayer3OperatingMode(subNodes, nodes));
-
- //test not empty
- subNodes.add(subNode);
- nodes.add(node);
- properties.add(property);
- //stringValues.add(stringValue);
- when(subNode.getNodeId()).thenReturn(nodeId);
- when(node.getNodeId())
- .thenReturn(new NodeId("00001111-0000-0000-0000-000011112222"))
- .thenReturn(nodeId)
- .thenReturn(nodeId)
- .thenReturn(nodeId);
- Assert.assertFalse(IntentResolverUtils.checkAllLayer3OperatingMode(subNodes, nodes));
- when(node.getProperty()).thenReturn(properties);
- when(property.getPropertyName())
- .thenReturn(propertyName)
- .thenReturn(new PropertyName("operating-mode"))
- .thenReturn(new PropertyName("operating-mode"));
- Assert.assertFalse(IntentResolverUtils.checkAllLayer3OperatingMode(subNodes, nodes));
- when(property.getPropertyValues()).thenReturn(propertyValues);
- when(propertyValues.getStringValue()).thenReturn(stringValues);
- when(stringValues.get(anyInt())).thenReturn(stringValue);
- when(stringValue.getValue())
- .thenReturn(new String("layer3"))
- .thenReturn(new String("test"));
-
- Assert.assertTrue(IntentResolverUtils.checkAllLayer3OperatingMode(subNodes, nodes));
- Assert.assertFalse(IntentResolverUtils.checkAllLayer3OperatingMode(subNodes, nodes));
-
- verify(subNode,times(4)).getNodeId();
- verify(node,times(4)).getNodeId();
- verify(node,times(3)).getProperty();
- verify(property,times(3)).getPropertyName();
- verify(property, times(2)).getPropertyValues();
- verify(propertyValues,times(2)).getStringValue();
- verify(stringValues,times(2)).get(anyInt());
- verify(stringValue,times(2)).getValue();
- }
-
- @Test
- public void testGetVirtualLink() throws Exception {
- List<VirtualLink> virtualLinks = new LinkedList<VirtualLink>();
- VirtualNodeId srcVirtualNodeId = mock(VirtualNodeId.class);
- VirtualNodeId destVirtualNodeId = mock(VirtualNodeId.class);
- VirtualLink virtualLink = mock(VirtualLink.class);
- VirtualLink virtualLink_test ;
- virtualLinks.add(virtualLink);
- //test not null and null
- when(virtualLink.getSrcNodeId())
- .thenReturn(srcVirtualNodeId)
- .thenReturn(new VirtualNodeId("00001111-0000-0000-0000-000011112222"));
- when(virtualLink.getDestNodeId())
- .thenReturn(destVirtualNodeId)
- .thenReturn(new VirtualNodeId("00001111-0000-0000-0000-000011112222"));
- virtualLink_test = IntentResolverUtils.getVirtualLink(virtualLinks, srcVirtualNodeId, destVirtualNodeId);
- Assert.assertTrue(virtualLink_test != null);
- virtualLink_test = IntentResolverUtils.getVirtualLink(virtualLinks,srcVirtualNodeId,destVirtualNodeId);
- Assert.assertTrue(virtualLink_test == null);
- verify(virtualLink,times(2)).getSrcNodeId();
- verify(virtualLink).getDestNodeId();
-
- }
-
- @Test
- public void testGetObject() throws Exception {
- DataObject dataObject ;
- Objects objects = mock(Objects.class);
- ObjectId objectId = mock(ObjectId.class);
- Node node = mock(Node.class);
- Connection connection = mock(Connection.class);
- Flow flow = mock(Flow.class);
- List<Node> nodes = new LinkedList<Node>();
- List<Connection> connections = new LinkedList<Connection>();
- List<Flow> flows = new LinkedList<Flow>();
-
- when(objects.getNode()).thenReturn(nodes);
- when(objects.getConnection()).thenReturn(connections);
- when(objects.getFlow()).thenReturn(flows);
- when(objectId.getValue()).thenReturn(new String("00001111-0000-0000-0000-000011112222"));
- // when nodes and connections and flows are all empty
- dataObject = IntentResolverUtils.getObject(objects, objectId);
- Assert.assertTrue(dataObject == null);
- //test flow
- flows.add(flow);
- when(flow.getFlowId())
- .thenReturn(new FlowId(new String("00001111-0000-0000-0000-000011112222")))
- .thenReturn(mock(FlowId.class));
- //return true
- dataObject = IntentResolverUtils.getObject(objects, objectId);
- Assert.assertTrue(dataObject != null);
- //return null
- dataObject = IntentResolverUtils.getObject(objects, objectId);
- Assert.assertTrue(dataObject == null);
-
- //test connection
- connections.add(connection);
- when(connection.getConnectionId())
- .thenReturn(new ConnectionId(new String("00001111-0000-0000-0000-000011112222")))
- .thenReturn(mock(ConnectionId.class));
- //return true
- dataObject = IntentResolverUtils.getObject(objects, objectId);
- Assert.assertTrue(dataObject != null);
- //return null
- dataObject = IntentResolverUtils.getObject(objects, objectId);
- Assert.assertTrue(dataObject == null);
-
- //test node
- nodes.add(node);
- when(node.getNodeId())
- .thenReturn(new NodeId(new String("00001111-0000-0000-0000-000011112222")))
- .thenReturn(mock(NodeId.class));
- //return true
- dataObject = IntentResolverUtils.getObject(objects, objectId);
- Assert.assertTrue(dataObject != null);
- //return null
- dataObject = IntentResolverUtils.getObject(objects, objectId);
- Assert.assertTrue(dataObject == null);
-
- }
-
- @Test
- public void testGetSameTargetObjectOperations() throws Exception {
- List<Operation> operations = new LinkedList<Operation>();
- Operation operation = mock(Operation.class);
-
- List<Operation> list ;
- list = IntentResolverUtils.getSameTargetObjectOperations(operations,operation);
- Assert.assertTrue(list.size() == 0);
- }
-
- @Test
- public void testGetGreaterAndEqualPriorityOperations() throws Exception {
- List<Operation> operations = new LinkedList<Operation>();
- Operation operation = mock(Operation.class);
- List<Operation> greaterPriorityOperations = new LinkedList<Operation>();
- List<Operation> equalPriorityOperations = new LinkedList<Operation>();
-
- IntentResolverUtils.getGreaterAndEqualPriorityOperations(operations,operation,greaterPriorityOperations,equalPriorityOperations);
- }
-
- @Test
- public void testGetConflictingOperation() throws Exception {
- List<Operation> operations = new LinkedList<Operation>();
- Operation operation = mock(Operation.class);
-
- Operation operation1 = IntentResolverUtils.getConflictingOperation(operations,operation);
- Assert.assertTrue(operation1 == null);
- }
-
- @Test
- public void testGetConflictingOperations() throws Exception {
- List<Operation> operations = new LinkedList<Operation>();
- Operation operation = mock(Operation.class);
-
- List<Operation> operations1 = IntentResolverUtils.getConflictingOperations(operations, operation);
- Assert.assertTrue(operations1 == null);
- }
-
- @Test
- public void testGetAction() throws Exception {
- List<Action> actions = new LinkedList<Action>();
- ActionName actionName = mock(ActionName.class);
- Action action = mock(Action.class);
- Action action_test ;
-
- actions.add(action);
- when(action.getActionName())
- .thenReturn(actionName)
- .thenReturn(new ActionName("a"));
- action_test = IntentResolverUtils.getAction(actions,actionName);
- Assert.assertTrue(action_test != null);
- action_test = IntentResolverUtils.getAction(actions,actionName);
- Assert.assertTrue(action_test == null);
- verify(action,times(2)).getActionName();
- }
-
- @Test
- public void testGetSourceVirtualRouterOfFlow() throws Exception {
- VirtualNode virtualNode_test;
- VirtualNode virtualNode = mock(VirtualNode.class);
- Flow flow = mock(Flow.class);
- MatchItemName matchItemName = mock(MatchItemName.class);
- MatchItem matchItem = mock(MatchItem.class);
- MatchItemValue matchItemValue = mock(MatchItemValue.class);
- Node node = mock(Node.class);
- IntentVnMappingResult intentVnMappingResult = mock(IntentVnMappingResult.class);
- List<VirtualNode> virtualNodes = new ArrayList<VirtualNode>();
- List<MatchItem> matchItems = new ArrayList<MatchItem>();
- List<Node> nodes = new ArrayList<Node>();
- List<IntentVnMappingResult> intentVnMappingResults = new ArrayList<IntentVnMappingResult>();
-
- virtualNodes.add(virtualNode);
- nodes.add(node);
- intentVnMappingResults.add(intentVnMappingResult);
- //test private method "getMatchItem"
- when(flow.getMatchItem())
- .thenReturn(null) //test null
- .thenReturn(matchItems) //not null since this time
- .thenReturn(matchItems);
-
- virtualNode_test = IntentResolverUtils.getSourceVirtualRouterOfFlow(virtualNodes,flow,nodes,intentVnMappingResults);
- Assert.assertTrue(virtualNode_test == null);
-
- matchItems.add(matchItem);
- when(matchItem.getMatchItemName())
- .thenReturn(matchItemName)//not same as matchItemName , the value to be return is null
- .thenReturn(new MatchItemName("src-ip"));//same as matchItemName, value to be return is not null
-
- when(matchItem.getMatchItemValue()).thenReturn(matchItemValue);
- when(matchItemValue.getStringValue()).thenReturn(new String("test"));
-
- virtualNode_test = IntentResolverUtils.getSourceVirtualRouterOfFlow(virtualNodes,flow,nodes,intentVnMappingResults);
- Assert.assertTrue(virtualNode_test == null);
-
- ///////////////////////////////////////////////////////
- //test private method "getVirtualRouterWithIpPrefix"
- //test null
- nodes.clear();
- virtualNode_test = IntentResolverUtils.getSourceVirtualRouterOfFlow(virtualNodes,flow,nodes,intentVnMappingResults);
- Assert.assertTrue(virtualNode_test == null);
-
- //test not null
- NodeType layer2GroupNodeType = new NodeType("l2-group");
- NodeType externalGroupNodeType = new NodeType("ext-group");
- org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.VirtualNodeInstance.NodeType VrouterNodeType =
- VirtualNode.NodeType.Vrouter;
- NodeId nodeId = mock(NodeId.class);
- IntentId intentId = new IntentId(new String("00001111-0000-0000-0000-000011112222"));
- List<Property> properties = new ArrayList<Property>();
- List<StringValue> propertyValues_list = new ArrayList<StringValue>();
- List<VirtualResource> virtualResources = new ArrayList<VirtualResource>();
- StringValue stringValue = mock(StringValue.class);
- Property property = mock(Property.class);
- PropertyName propertyName = new PropertyName("ip-prefix");
- PropertyValues propertyValues = mock(PropertyValues.class);
- VirtualResource virtualResource = mock(VirtualResource.class);
- VirtualResourceType virtualResourceType_Vport = VirtualResource.VirtualResourceType.Vport;
- VirtualResourceType virtualResourceType_Vnode = VirtualResource.VirtualResourceType.Vnode;
- VirtualResourceType virtualResourceType_Other = null;
- VirtualResourceEntityId virtualResourceEntityId = mock(VirtualResourceEntityId.class);
-
- virtualResources.add(virtualResource);
- nodes.add(node);
- properties.add(property);
- propertyValues_list.add(stringValue);
-
- when(node.getNodeType())
- .thenReturn(mock(NodeType.class))
- .thenReturn(layer2GroupNodeType)
- .thenReturn(externalGroupNodeType);
- virtualNode_test = IntentResolverUtils.getSourceVirtualRouterOfFlow(virtualNodes, flow, nodes,intentVnMappingResults);
- Assert.assertTrue(virtualNode_test == null);
-
-
- when(node.getProperty()).thenReturn(properties);
- when(property.getPropertyName())
- .thenReturn(mock(PropertyName.class))
- .thenReturn(propertyName);
- virtualNode_test = IntentResolverUtils.getSourceVirtualRouterOfFlow(virtualNodes,flow, nodes, intentVnMappingResults);
- Assert.assertTrue(virtualNode_test == null);
-
- when(property.getPropertyValues()).thenReturn(propertyValues);
- when(propertyValues.getStringValue()).thenReturn(propertyValues_list);
- when(stringValue.getValue())
- .thenReturn(new String("test1"))
- .thenReturn(new String("test"));
- virtualNode_test = IntentResolverUtils.getSourceVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);
- Assert.assertTrue(virtualNode_test == null);
- verify(stringValue).getValue();
-
- when(node.getNodeId()).thenReturn(nodeId);
- when(nodeId.getValue()).thenReturn(new String("00001111-0000-0000-0000-000011112222"));
- when(intentVnMappingResult.getIntentId())
- .thenReturn(mock(IntentId.class))
- .thenReturn(intentId);
-
- virtualNode_test = IntentResolverUtils.getSourceVirtualRouterOfFlow(virtualNodes,flow,nodes,intentVnMappingResults);
- Assert.assertTrue(virtualNode_test == null);
-
- when(intentVnMappingResult.getVirtualResource()).thenReturn(virtualResources);
- Assert.assertTrue(virtualResources.get(0) == virtualResource);
- when(virtualResource.getVirtualResourceType())
- .thenReturn(virtualResourceType_Other)
- .thenReturn(virtualResourceType_Vport)
- .thenReturn(virtualResourceType_Vnode);
- when(virtualResource.getParentVirtualResourceEntityId()).thenReturn(virtualResourceEntityId);
- when(virtualResource.getVirtualResourceEntityId()).thenReturn(virtualResourceEntityId);
- when(virtualResourceEntityId.getValue()).thenReturn(new String("00001111-0000-0000-0000-000011112222"));
-
- virtualNode_test = IntentResolverUtils.getSourceVirtualRouterOfFlow(virtualNodes,flow,nodes,intentVnMappingResults);
- Assert.assertTrue(virtualNode_test == null);
-
- when(virtualNode.getNodeId())
- .thenReturn(mock(VirtualNodeId.class))
- .thenReturn(new VirtualNodeId(new String("00001111-0000-0000-0000-000011112222")));
-
- virtualNode_test = IntentResolverUtils.getSourceVirtualRouterOfFlow(virtualNodes,flow,nodes,intentVnMappingResults);
- Assert.assertTrue(virtualNode_test == null);
- verify(virtualNode).getNodeId();
-
- when(virtualNode.getNodeType())
- .thenReturn(null)
- .thenReturn(VrouterNodeType);
-
- virtualNode_test = IntentResolverUtils.getSourceVirtualRouterOfFlow(virtualNodes,flow,nodes,intentVnMappingResults);
- Assert.assertTrue(virtualNode_test == null);
- verify(virtualNode).getNodeType();
-
- virtualNode_test = IntentResolverUtils.getSourceVirtualRouterOfFlow(virtualNodes,flow,nodes,intentVnMappingResults);
- Assert.assertTrue(virtualNode_test == virtualNode);
- verify(virtualNode,times(2)).getNodeType();
-
- }
-
- @Test
- public void testGetDestinationVirtualRouterOfFlow() throws Exception {
- VirtualNode virtualNode_test;
- VirtualNode virtualNode = mock(VirtualNode.class);
- Flow flow = mock(Flow.class);
- MatchItemName matchItemName = mock(MatchItemName.class);
- MatchItem matchItem = mock(MatchItem.class);
- MatchItemValue matchItemValue = mock(MatchItemValue.class);
- Node node = mock(Node.class);
- IntentVnMappingResult intentVnMappingResult = mock(IntentVnMappingResult.class);
- List<VirtualNode> virtualNodes = new ArrayList<VirtualNode>();
- List<MatchItem> matchItems = new ArrayList<MatchItem>();
- List<Node> nodes = new ArrayList<Node>();
- List<IntentVnMappingResult> intentVnMappingResults = new ArrayList<IntentVnMappingResult>();
-
- virtualNodes.add(virtualNode);
- nodes.add(node);
- intentVnMappingResults.add(intentVnMappingResult);
- //test private method "getMatchItem"
- when(flow.getMatchItem())
- .thenReturn(null) //test null
- .thenReturn(matchItems) //not null since this time
- .thenReturn(matchItems);
-
- virtualNode_test = IntentResolverUtils.getDestinationVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);
- Assert.assertTrue(virtualNode_test == null);
-
- matchItems.add(matchItem);
- when(matchItem.getMatchItemName())
- .thenReturn(matchItemName)//not same as matchItemName , the value to be return is null
- .thenReturn(new MatchItemName("dst-ip"));//same as matchItemName, value to be return is not null
-
- when(matchItem.getMatchItemValue()).thenReturn(matchItemValue);
- when(matchItemValue.getStringValue()).thenReturn(new String("test"));
-
- virtualNode_test = IntentResolverUtils.getDestinationVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);
- Assert.assertTrue(virtualNode_test == null);
-
- ///////////////////////////////////////////////////////
- //test private method "getVirtualRouterWithIpPrefix"
- //test null
- nodes.clear();
- virtualNode_test = IntentResolverUtils.getDestinationVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);
- Assert.assertTrue(virtualNode_test == null);
-
- //test not null
- NodeType layer2GroupNodeType = new NodeType("l2-group");
- NodeType externalGroupNodeType = new NodeType("ext-group");
- org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.VirtualNodeInstance.NodeType VrouterNodeType =
- VirtualNode.NodeType.Vrouter;
- NodeId nodeId = mock(NodeId.class);
- IntentId intentId = new IntentId(new String("00001111-0000-0000-0000-000011112222"));
- List<Property> properties = new ArrayList<Property>();
- List<StringValue> propertyValues_list = new ArrayList<StringValue>();
- List<VirtualResource> virtualResources = new ArrayList<VirtualResource>();
- StringValue stringValue = mock(StringValue.class);
- Property property = mock(Property.class);
- PropertyName propertyName = new PropertyName("ip-prefix");
- PropertyValues propertyValues = mock(PropertyValues.class);
- VirtualResource virtualResource = mock(VirtualResource.class);
- VirtualResourceType virtualResourceType_Vport = VirtualResource.VirtualResourceType.Vport;
- VirtualResourceType virtualResourceType_Vnode = VirtualResource.VirtualResourceType.Vnode;
- VirtualResourceType virtualResourceType_Other = null;
- VirtualResourceEntityId virtualResourceEntityId = mock(VirtualResourceEntityId.class);
-
- virtualResources.add(virtualResource);
- nodes.add(node);
- properties.add(property);
- propertyValues_list.add(stringValue);
-
- when(node.getNodeType())
- .thenReturn(mock(NodeType.class))
- .thenReturn(layer2GroupNodeType)
- .thenReturn(externalGroupNodeType);
- virtualNode_test = IntentResolverUtils.getDestinationVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);
- Assert.assertTrue(virtualNode_test == null);
-
-
- when(node.getProperty()).thenReturn(properties);
- when(property.getPropertyName())
- .thenReturn(mock(PropertyName.class))
- .thenReturn(propertyName);
- virtualNode_test = IntentResolverUtils.getDestinationVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);
- Assert.assertTrue(virtualNode_test == null);
-
- when(property.getPropertyValues()).thenReturn(propertyValues);
- when(propertyValues.getStringValue()).thenReturn(propertyValues_list);
- when(stringValue.getValue())
- .thenReturn(new String("test1"))
- .thenReturn(new String("test"));
- virtualNode_test = IntentResolverUtils.getDestinationVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);
- Assert.assertTrue(virtualNode_test == null);
- verify(stringValue).getValue();
-
- when(node.getNodeId()).thenReturn(nodeId);
- when(nodeId.getValue()).thenReturn(new String("00001111-0000-0000-0000-000011112222"));
- when(intentVnMappingResult.getIntentId())
- .thenReturn(mock(IntentId.class))
- .thenReturn(intentId);
-
- virtualNode_test = IntentResolverUtils.getDestinationVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);
- Assert.assertTrue(virtualNode_test == null);
-
- when(intentVnMappingResult.getVirtualResource()).thenReturn(virtualResources);
- Assert.assertTrue(virtualResources.get(0) == virtualResource);
- when(virtualResource.getVirtualResourceType())
- .thenReturn(virtualResourceType_Other)
- .thenReturn(virtualResourceType_Vport)
- .thenReturn(virtualResourceType_Vnode);
- when(virtualResource.getParentVirtualResourceEntityId()).thenReturn(virtualResourceEntityId);
- when(virtualResource.getVirtualResourceEntityId()).thenReturn(virtualResourceEntityId);
- when(virtualResourceEntityId.getValue()).thenReturn(new String("00001111-0000-0000-0000-000011112222"));
-
- virtualNode_test = IntentResolverUtils.getDestinationVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);
- Assert.assertTrue(virtualNode_test == null);
-
- when(virtualNode.getNodeId())
- .thenReturn(mock(VirtualNodeId.class))
- .thenReturn(new VirtualNodeId(new String("00001111-0000-0000-0000-000011112222")));
-
- virtualNode_test = IntentResolverUtils.getDestinationVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);
- Assert.assertTrue(virtualNode_test == null);
- verify(virtualNode).getNodeId();
-
- when(virtualNode.getNodeType())
- .thenReturn(null)
- .thenReturn(VrouterNodeType);
-
- virtualNode_test = IntentResolverUtils.getDestinationVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);
- Assert.assertTrue(virtualNode_test == null);
- verify(virtualNode).getNodeType();
-
- virtualNode_test = IntentResolverUtils.getDestinationVirtualRouterOfFlow(virtualNodes,flow,nodes,intentVnMappingResults);
- Assert.assertTrue(virtualNode_test == virtualNode);
- verify(virtualNode,times(2)).getNodeType();
- }
-
- @Test
- public void testSortVirtualResources() throws Exception {
- List<VirtualResource> virtualResources = new ArrayList<VirtualResource>();
- VirtualResource virtualResource = mock(VirtualResource.class);
- VirtualResource virtualResource1 = mock(VirtualResource.class);
- List<VirtualResource> result ;
- long first = 0;
- long second = 1;
-
- //test empty
- Assert.assertTrue(virtualResources.size() == 0);
- result = IntentResolverUtils.sortVirtualResources(virtualResources);
- Assert.assertTrue(result.size() == 0);
-
- //test 1
- virtualResources.add(virtualResource);
- Assert.assertTrue(virtualResources.size() == 1);
- result = IntentResolverUtils.sortVirtualResources(virtualResources);
- Assert.assertNotNull(result);
-
- //test >1
- virtualResources.add(virtualResource1);
- Assert.assertTrue(virtualResources.size() == 2);
- when(virtualResource.getOrder()).thenReturn(first);
- when(virtualResource1.getOrder()).thenReturn(second);
- result = IntentResolverUtils.sortVirtualResources(virtualResources);
- Assert.assertTrue(result.size() == 2);
- Assert.assertTrue(result.get(0) == virtualResource);
-
- }
-}
\ No newline at end of file
--- /dev/null
+#!/usr/bin/python\r
+#Filename:vpn.py\r
+import requests,json\r
+import argparse, sys\r
+from requests.auth import HTTPBasicAuth\r
+\r
+USERNAME='admin'\r
+PASSWORD='admin'\r
+\r
+TRANSACTION_BEGIN="http://%s:8181/restconf/operations/nemo-intent:begin-transaction"\r
+TRANSACTION_END="http://%s:8181/restconf/operations/nemo-intent:end-transaction"\r
+REGISTER_USER="http://%s:8181/restconf/operations/nemo-intent:register-user"\r
+STRUCTURE_UPDATE_USERS="http://%s:8181/restconf/operations/nemo-intent:structure-style-nemo-update"\r
+\r
+def register_user(contHost):\r
+ data={\r
+ "input":{\r
+ "user-id":"14ce424a-3e50-4a2a-ad5c-b29845158c8b",\r
+ "user-name":"user2",\r
+ "user-password":"abc",\r
+ "user-role":"tenant"\r
+ }\r
+ }\r
+ post(REGISTER_USER % contHost, data)\r
+\r
+\r
+def transaction_begin(contHost):\r
+ data={\r
+ "input":{\r
+ "user-id":"14ce424a-3e50-4a2a-ad5c-b29845158c8b",\r
+ "user-name":"user2",\r
+ "user-password":"abc",\r
+ "user-role":"tenant"\r
+ }\r
+ }\r
+ post(TRANSACTION_BEGIN % contHost, data)\r
+\r
+ \r
+def transaction_end(contHost):\r
+ data={\r
+ "input":{\r
+ "user-id":"14ce424a-3e50-4a2a-ad5c-b29845158c8b",\r
+ "user-name":"user2",\r
+ "user-password":"abc",\r
+ "user-role":"tenant"\r
+ }\r
+ }\r
+ post(TRANSACTION_END % contHost, data)\r
+\r
+ \r
+def add_branch1_node(contHost):\r
+ data={\r
+ "input":{\r
+ "user-name": "user2",\r
+ "user-role": "tenant",\r
+ "user-password": "abc",\r
+ "user-id": "14ce424a-3e50-4a2a-ad5c-b29845158c8b",\r
+ "objects":{\r
+ "node":[\r
+ {\r
+ "node-name": "bank-branch1",\r
+ "node-type": "ext-group",\r
+ "property": [\r
+ {\r
+ "property-name": "location",\r
+ "property-values": {\r
+ "string-value": [\r
+ {\r
+ "order": "0",\r
+ "value": "HW:NE40E:CE1:GE1/0/0"\r
+ }\r
+ ]\r
+ }\r
+ },\r
+ {\r
+ "property-name": "ac-info-network",\r
+ "property-values": {\r
+ "string-value": [\r
+ {\r
+ "order": "0",\r
+ "value": "layer3"\r
+ }\r
+ ]\r
+ }\r
+ },\r
+ {\r
+ "property-name": "ac-info-protocol",\r
+ "property-values": {\r
+ "string-value": [\r
+ {\r
+ "order": "0",\r
+ "value": "static"\r
+ }\r
+ ]\r
+ }\r
+ },\r
+ {\r
+ "property-name": "ip-prefix",\r
+ "property-values": {\r
+ "string-value": [\r
+ {\r
+ "order": "0",\r
+ "value": "160.1.1.0/24"\r
+ }\r
+ ]\r
+ }\r
+ }\r
+ ],\r
+ "node-id": "94a6fb90-b425-4ffd-9515-c0684aa4c37f"\r
+ }\r
+ ]\r
+ }\r
+ }\r
+ }\r
+ post(STRUCTURE_UPDATE_USERS % contHost, data)\r
+ \r
+\r
+def add_branch2_node(contHost):\r
+ data={\r
+ "input":{\r
+ "user-name": "user2",\r
+ "user-role": "tenant",\r
+ "user-password": "abc",\r
+ "user-id": "14ce424a-3e50-4a2a-ad5c-b29845158c8b",\r
+ "objects":{\r
+ "node":[\r
+ {\r
+ "node-name": "bank-branch2",\r
+ "node-type": "ext-group",\r
+ "property": [\r
+ {\r
+ "property-name": "location",\r
+ "property-values": {\r
+ "string-value": [\r
+ {\r
+ "order": "0",\r
+ "value": "HW:NE40E:CE2:GE3/0/2"\r
+ }\r
+ ]\r
+ }\r
+ },\r
+ {\r
+ "property-name": "ac-info-network",\r
+ "property-values": {\r
+ "string-value": [\r
+ {\r
+ "order": "0",\r
+ "value": "layer3"\r
+ }\r
+ ]\r
+ }\r
+ },\r
+ {\r
+ "property-name": "ac-info-protocol",\r
+ "property-values": {\r
+ "string-value": [\r
+ {\r
+ "order": "0",\r
+ "value": "static"\r
+ }\r
+ ]\r
+ }\r
+ },\r
+ {\r
+ "property-name": "ip-prefix",\r
+ "property-values": {\r
+ "string-value": [\r
+ {\r
+ "order": "0",\r
+ "value": "169.1.1.0/24"\r
+ }\r
+ ]\r
+ }\r
+ }\r
+ ],\r
+ "node-id": "d463232f-363f-491c-a6f5-097ed0a794d3"\r
+ }\r
+ ]\r
+ }\r
+ }\r
+ }\r
+ post(STRUCTURE_UPDATE_USERS % contHost, data)\r
+ \r
+def add_DC_node(contHost):\r
+ data={\r
+ "input":{\r
+ "user-name": "user2",\r
+ "user-role": "tenant",\r
+ "user-password": "abc",\r
+ "user-id": "14ce424a-3e50-4a2a-ad5c-b29845158c8b",\r
+ "objects":{\r
+ "node":[\r
+ {\r
+ "node-name": "bank-DC",\r
+ "node-type": "ext-group",\r
+ "property": [\r
+ {\r
+ "property-name": "location",\r
+ "property-values": {\r
+ "string-value": [\r
+ {\r
+ "order": "0",\r
+ "value": "HW:NE40E:CE3:GE1/0/0"\r
+ }\r
+ ]\r
+ }\r
+ },\r
+ {\r
+ "property-name": "ac-info-network",\r
+ "property-values": {\r
+ "string-value": [\r
+ {\r
+ "order": "0",\r
+ "value": "layer3"\r
+ }\r
+ ]\r
+ }\r
+ },\r
+ {\r
+ "property-name": "ac-info-protocol",\r
+ "property-values": {\r
+ "string-value": [\r
+ {\r
+ "order": "0",\r
+ "value": "static"\r
+ }\r
+ ]\r
+ }\r
+ },\r
+ {\r
+ "property-name": "ip-prefix",\r
+ "property-values": {\r
+ "string-value": [\r
+ {\r
+ "order": "0",\r
+ "value": "164.1.1.0/24"\r
+ }\r
+ ]\r
+ }\r
+ }\r
+ ],\r
+ "node-id": "b46cfa7f-93a3-43f4-ac20-09307c75feca"\r
+ }\r
+ ]\r
+ }\r
+ }\r
+ }\r
+ post(STRUCTURE_UPDATE_USERS % contHost, data)\r
+ \r
+ \r
+ \r
+def add_branch1_branch2_connection(contHost):\r
+ data={\r
+ "input": {\r
+ "user-name": "user2",\r
+ "user-role": "tenant",\r
+ "user-password": "abc",\r
+ "user-id": "14ce424a-3e50-4a2a-ad5c-b29845158c8b",\r
+ "objects":{\r
+ "connection": [\r
+ {\r
+ "connection-name": "c1",\r
+ "connection-id": "30da6667-608e-4d2f-bb50-79e5cabcc523",\r
+ "end-node": [\r
+ {\r
+ "order": "0",\r
+ "node-id": "94a6fb90-b425-4ffd-9515-c0684aa4c37f"\r
+ },\r
+ {\r
+ "order": "0",\r
+ "node-id": "d463232f-363f-491c-a6f5-097ed0a794d3"\r
+ }\r
+ ],\r
+ "connection-type": "p2p",\r
+ }\r
+ ]\r
+ }\r
+ }\r
+ }\r
+ post(STRUCTURE_UPDATE_USERS % contHost, data)\r
+\r
+def add_branch1_DC_connection(contHost):\r
+ data={\r
+ "input": {\r
+ "user-name": "user2",\r
+ "user-role": "tenant",\r
+ "user-password": "abc",\r
+ "user-id": "14ce424a-3e50-4a2a-ad5c-b29845158c8b",\r
+ "objects":{\r
+ "connection": [\r
+ {\r
+ "connection-name": "c2",\r
+ "connection-id": "b49e3960-c08d-4fff-b9fc-08b65ebcde2c",\r
+ "end-node": [\r
+ {\r
+ "order": "0",\r
+ "node-id": "94a6fb90-b425-4ffd-9515-c0684aa4c37f"\r
+ },\r
+ {\r
+ "order": "0",\r
+ "node-id": "b46cfa7f-93a3-43f4-ac20-09307c75feca"\r
+ }\r
+ ],\r
+ "connection-type": "p2p",\r
+ }\r
+ ]\r
+ }\r
+ }\r
+ }\r
+ post(STRUCTURE_UPDATE_USERS % contHost, data)\r
+ \r
+\r
+def add_branch2_DC_connection(contHost):\r
+ data={\r
+ "input": {\r
+ "user-name": "user2",\r
+ "user-role": "tenant",\r
+ "user-password": "abc",\r
+ "user-id": "14ce424a-3e50-4a2a-ad5c-b29845158c8b",\r
+ "objects":{\r
+ "connection": [\r
+ {\r
+ "connection-name": "c3",\r
+ "connection-id": "e0d56fee-7235-4748-a2a1-eb5e3733d866",\r
+ "end-node": [\r
+ {\r
+ "order": "0",\r
+ "node-id": "d463232f-363f-491c-a6f5-097ed0a794d3"\r
+ },\r
+ {\r
+ "order": "0",\r
+ "node-id": "b46cfa7f-93a3-43f4-ac20-09307c75feca"\r
+ }\r
+ ],\r
+ "connection-type": "p2p",\r
+ }\r
+ ]\r
+ }\r
+ }\r
+ }\r
+ post(STRUCTURE_UPDATE_USERS % contHost, data)\r
+ \r
+\r
+def post(url, data):\r
+ headers = {'Content-type': 'application/yang.data+json',\r
+ 'Accept': 'application/yang.data+json'}\r
+ print "POST %s" % url\r
+ print json.dumps(data, indent=4, sort_keys=True)\r
+ r = requests.post(url, data=json.dumps(data), headers=headers, auth=HTTPBasicAuth(USERNAME, PASSWORD))\r
+ print r.text\r
+ r.raise_for_status()\r
+ \r
+if __name__ == '__main__':\r
+\r
+ parser = argparse.ArgumentParser()\r
+ parser.add_argument('--controller', default='127.0.0.1', help='controller IP')\r
+ args=parser.parse_args()\r
+\r
+ # CREATE User;\r
+ register_user(args.controller)\r
+\r
+ transaction_begin(args.controller)\r
+ \r
+ add_branch1_node(args.controller)\r
+ add_branch2_node(args.controller)\r
+ add_DC_node(args.controller)\r
+ \r
+ add_branch1_branch2_connection(args.controller)\r
+ add_branch1_DC_connection(args.controller)\r
+ add_branch2_DC_connection(args.controller)\r
+ \r
+ transaction_end(args.controller)
\ No newline at end of file
<artifactId>maven-bundle-plugin</artifactId>
<configuration>
<instructions>
- <Export-Package>org.codehaus.jackson,
+ <Export-Package>
+ org.codehaus.jackson,
org.codehaus.jackson.*,
- org.joda.time.*,
+ org.joda.time.*
</Export-Package>
<Import-Package>*</Import-Package>
</instructions>
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.NodeId;\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.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.PropertyName;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.*;\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
updateMplsTable(user, virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
updateIpTable(user, virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
updateArpTable(user, virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
+ updateFlowTableForOperations(user, virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
\r
return;\r
}\r
for ( MacAddress macAddress : macAddresses ) {\r
virtualArp = virtualNetworkHelper.getVirtualArp(macAddress);\r
\r
- configArpTableEntry(user.getUserId(), virtualArp, physicalPath);\r
- configMacTableEntry(user.getUserId(), macAddress, physicalNodeId1, physicalPortId);\r
+ if ( null != virtualArp ) {\r
+ configArpTableEntry(user.getUserId(), virtualArp, physicalPath);\r
+ configMacTableEntry(user.getUserId(), macAddress, physicalNodeId1, physicalPortId);\r
+ }\r
}\r
}\r
}\r
layer2ExternalVirtualPort = virtualNetworkHelper.getLayer2ExternalVirtualPort(virtualNodeId);\r
\r
if ( null != layer2ExternalVirtualPort ) {\r
- // TODO: config ip and arp tables.\r
+ vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+ new VirtualResourceEntityId(layer2ExternalVirtualPort.getPortId().getValue()));\r
+ physicalPortId = new PhysicalPortId(vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+ physicalPort = physicalNetworkHelper.getPhysicalPort(physicalNodeId, physicalPortId);\r
+\r
+ ipPrefixes = layer2ExternalVirtualPort.getExternalIpPrefixes().getExternalIpPrefix();\r
+\r
+ if ( !ipPrefixes.isEmpty() ) {\r
+ ipPrefix = ipPrefixes.get(0);\r
+\r
+ configIpTableEntry(user.getUserId(), ipPrefix, physicalNodeId, physicalPort, true);\r
+ }\r
+\r
+ macAddresses = layer2ExternalVirtualPort.getExternalMacAddresses().getExternalMacAddress();\r
+\r
+ for ( MacAddress macAddress : macAddresses ) {\r
+ virtualArp = virtualNetworkHelper.getVirtualArp(macAddress);\r
+\r
+ if ( null != virtualArp ) {\r
+ configArpTableEntry(user.getUserId(), virtualArp, physicalNodeId, physicalPortId);\r
+ }\r
+ }\r
}\r
}\r
\r
- updateIpTableForOperations(user, virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
-\r
- // log format: vnode(nodetype) --> vnode(nodetype): vlink; ppath; plinks; mplslabels; meterid;\r
+ // Log format: vnode(nodetype) --> vnode(nodetype): vlink; ppath; plinks; mplslabels; meterid;\r
StringBuilder stringBuilder = new StringBuilder();\r
Set<VirtualLinkId> printedVirtualLinks = new HashSet<VirtualLinkId>();\r
VirtualNode srcVirtualNode;\r
* @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
+ private void updateFlowTableForOperations(User user,\r
+ VirtualNetwork virtualNetwork,\r
+ UserIntentVnMapping userIntentVnMapping,\r
+ UserVnPnMapping userVnPnMapping,\r
+ PhysicalNetwork physicalNetwork) {\r
if ( null == user.getOperations() ) {\r
return;\r
}\r
return;\r
}\r
\r
- Operation operation = operations.get(0);\r
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.operation.instance.Action> actions;\r
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.operation.instance.Action action;\r
+ ActionName denyActionName = new ActionName("deny");\r
+ ActionName allowActionName = new ActionName("allow");\r
+ ActionName goThroughActionName = new ActionName("go-through");\r
+\r
+ for ( Operation operation : operations ) {\r
+ actions = operation.getAction();\r
+\r
+ action = getAction(actions, denyActionName);\r
+\r
+ if ( null != action ) {\r
+ updateFlowTableForOperationWithDenyAction(user, operation,\r
+ virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
+\r
+ break;\r
+ }\r
+\r
+ action = getAction(actions, allowActionName);\r
+\r
+ if ( null != action ) {\r
+ updateFlowTableForOperationWithAllowAction(user, operation,\r
+ virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
+\r
+ break;\r
+ }\r
+\r
+ action = getAction(actions, goThroughActionName);\r
+\r
+ if ( null != action ) {\r
+ updateFlowTableForOperationWithGoThroughAction(user, operation,\r
+ virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
+\r
+// break;\r
+ }\r
+ }\r
+\r
+ return;\r
+ }\r
\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ * @param user TODO\r
+ * @param operation TODO\r
+ * @param virtualNetwork TODO\r
+ * @param userIntentVnMapping TODO\r
+ * @param userVnPnMapping TODO\r
+ * @param physicalNetwork TODO\r
+ */\r
+ private void updateFlowTableForOperationWithDenyAction(User user,\r
+ Operation operation,\r
+ VirtualNetwork virtualNetwork,\r
+ UserIntentVnMapping userIntentVnMapping,\r
+ UserVnPnMapping userVnPnMapping,\r
+ PhysicalNetwork physicalNetwork) {\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;\r
+\r
+ if ( null == operation.getPriority() ) {\r
+ priority = 1;\r
+ } else {\r
+ priority = 1 + operation.getPriority();\r
+ }\r
+\r
+ List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
+ IntentId intentId = new IntentId(operation.getOperationId().getValue());\r
+ IntentVnMappingResult intentVnMappingResult = getIntentVnMappingResult(intentVnMappingResults, intentId);\r
+ List<VirtualResource> virtualResources = intentVnMappingResult.getVirtualResource();\r
+ VirtualResource virtualResource = virtualResources.get(0);\r
+ VirtualNodeId virtualNodeId = new VirtualNodeId(virtualResource.getVirtualResourceEntityId().getValue());\r
+\r
+ List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();\r
+ VnPnMappingResult vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+ new VirtualResourceEntityId(virtualNodeId.getValue()));\r
+ PhysicalNodeId physicalNodeId =\r
+ new PhysicalNodeId(vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+\r
+ configFlowTableEntryForOperation(user.getUserId(), nemoFlow, physicalNodeId, (short)priority, true);\r
+\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ * @param user TODO\r
+ * @param operation TODO\r
+ * @param virtualNetwork TODO\r
+ * @param userIntentVnMapping TODO\r
+ * @param userVnPnMapping TODO\r
+ * @param physicalNetwork TODO\r
+ */\r
+ private void updateFlowTableForOperationWithAllowAction(User user,\r
+ Operation operation,\r
+ VirtualNetwork virtualNetwork,\r
+ UserIntentVnMapping userIntentVnMapping,\r
+ UserVnPnMapping userVnPnMapping,\r
+ PhysicalNetwork physicalNetwork) {\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;\r
+\r
+ if ( null == operation.getPriority() ) {\r
+ priority = 1;\r
+ } else {\r
+ priority = 1 + operation.getPriority();\r
+ }\r
+\r
+ VirtualNetworkHelper virtualNetworkHelper = virtualNetworkHelpers.get(virtualNetwork.getNetworkId());\r
+\r
+ List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
+ IntentId intentId = new IntentId(operation.getOperationId().getValue());\r
+ IntentVnMappingResult intentVnMappingResult = getIntentVnMappingResult(intentVnMappingResults, intentId);\r
+ List<VirtualResource> virtualResources = intentVnMappingResult.getVirtualResource();\r
+ VirtualResource virtualResource = virtualResources.get(0);\r
+ VirtualPathId virtualPathId = new VirtualPathId(virtualResource.getVirtualResourceEntityId().getValue());\r
+ VirtualPath virtualPath = virtualNetworkHelper.getVirtualPath(virtualPathId);\r
+\r
+ if ( null == virtualPath || virtualPath.getVirtualLink().isEmpty() ) {\r
+ return;\r
+ }\r
+\r
+ List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();\r
+ VnPnMappingResult vnPnMappingResult;\r
+ PhysicalPathId physicalPathId;\r
+ PhysicalPath physicalPath;\r
+\r
+ for ( org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLink\r
+ virtualLink : virtualPath.getVirtualLink() ) {\r
+ vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+ new VirtualResourceEntityId(virtualLink.getLinkId().getValue()));\r
+ physicalPathId = new PhysicalPathId(vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+ physicalPath = physicalNetworkHelper.getPhysicalPath(physicalPathId);\r
+\r
+ configFlowTableEntryForOperation(user.getUserId(), nemoFlow,\r
+ null, physicalPath, (short)priority, true);\r
+ }\r
+\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ * @param user TODO\r
+ * @param operation TODO\r
+ * @param virtualNetwork TODO\r
+ * @param userIntentVnMapping TODO\r
+ * @param userVnPnMapping TODO\r
+ * @param physicalNetwork TODO\r
+ */\r
+ private void updateFlowTableForOperationWithGoThroughAction(User user,\r
+ Operation operation,\r
+ VirtualNetwork virtualNetwork,\r
+ UserIntentVnMapping userIntentVnMapping,\r
+ UserVnPnMapping userVnPnMapping,\r
+ PhysicalNetwork physicalNetwork) {\r
+ List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
+ IntentId intentId = new IntentId(operation.getOperationId().getValue());\r
+ IntentVnMappingResult intentVnMappingResult = getIntentVnMappingResult(intentVnMappingResults, intentId);\r
+ List<VirtualResource> virtualResources = intentVnMappingResult.getVirtualResource();\r
+\r
+ if ( 1 == virtualResources.size() ) {\r
+ updateFlowTableForOperationWithGoThroughNormalGroupAction(user, operation,\r
+ virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
+ } else {\r
+ updateFlowTableForOperationWithGoThroughChainGroupAction(user, operation,\r
+ virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
+ }\r
+\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ * @param user TODO\r
+ * @param operation TODO\r
+ * @param virtualNetwork TODO\r
+ * @param userIntentVnMapping TODO\r
+ * @param userVnPnMapping TODO\r
+ * @param physicalNetwork TODO\r
+ */\r
+ private void updateFlowTableForOperationWithGoThroughNormalGroupAction(User user,\r
+ Operation operation,\r
+ VirtualNetwork virtualNetwork,\r
+ UserIntentVnMapping userIntentVnMapping,\r
+ UserVnPnMapping userVnPnMapping,\r
+ PhysicalNetwork physicalNetwork) {\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;\r
+\r
+ if ( null == operation.getPriority() ) {\r
+ priority = 1;\r
+ } else {\r
+ priority = 1 + operation.getPriority();\r
+ }\r
+\r
+ VirtualNetworkHelper virtualNetworkHelper = virtualNetworkHelpers.get(virtualNetwork.getNetworkId());\r
+\r
+ List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
+ IntentId intentId = new IntentId(operation.getOperationId().getValue());\r
+ IntentVnMappingResult intentVnMappingResult = getIntentVnMappingResult(intentVnMappingResults, intentId);\r
+ List<VirtualResource> virtualResources = intentVnMappingResult.getVirtualResource();\r
+ VirtualResource virtualResource = virtualResources.get(0);\r
+ VirtualPathId virtualPathId = new VirtualPathId(virtualResource.getVirtualResourceEntityId().getValue());\r
+ VirtualPath virtualPath = virtualNetworkHelper.getVirtualPath(virtualPathId);\r
+\r
+ if ( null == virtualPath || virtualPath.getVirtualLink().isEmpty() ) {\r
+ return;\r
+ }\r
+\r
+ List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();\r
+ VnPnMappingResult vnPnMappingResult;\r
+ PhysicalPathId physicalPathId;\r
+ PhysicalPath physicalPath;\r
+\r
+ for ( org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLink\r
+ virtualLink : virtualPath.getVirtualLink() ) {\r
+ vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+ new VirtualResourceEntityId(virtualLink.getLinkId().getValue()));\r
+ physicalPathId = new PhysicalPathId(vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+ physicalPath = physicalNetworkHelper.getPhysicalPath(physicalPathId);\r
+\r
+ configFlowTableEntryForOperation(user.getUserId(), nemoFlow,\r
+ null, physicalPath, (short)priority, true);\r
+ }\r
+\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ * @param user TODO\r
+ * @param operation TODO\r
+ * @param virtualNetwork TODO\r
+ * @param userIntentVnMapping TODO\r
+ * @param userVnPnMapping TODO\r
+ * @param physicalNetwork TODO\r
+ */\r
+ private void updateFlowTableForOperationWithGoThroughChainGroupAction(User user,\r
+ Operation operation,\r
+ VirtualNetwork virtualNetwork,\r
+ UserIntentVnMapping userIntentVnMapping,\r
+ UserVnPnMapping userVnPnMapping,\r
+ PhysicalNetwork physicalNetwork) {\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
physicalPort = physicalNetworkHelper\r
.getPhysicalPort(physicalLink.getSrcNodeId(), physicalLink.getSrcPortId());\r
\r
- configIpTableEntryForOperation(user.getUserId(), nemoFlow,\r
- physicalPort, physicalPath, (short)priority, true);\r
+ configFlowTableEntryForOperation(user.getUserId(), nemoFlow,\r
+ physicalPort, physicalPath, (short) priority, true);\r
}\r
}\r
\r
vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
physicalPort = physicalNetworkHelper.getPhysicalPort(physicalNodeId, physicalPortId);\r
\r
- configIpTableEntryForOperation(user.getUserId(), nemoFlow,\r
- physicalPort, physicalPath, (short)priority, true);\r
+ configFlowTableEntryForOperation(user.getUserId(), nemoFlow,\r
+ physicalPort, physicalPath, (short) priority, true);\r
}\r
\r
layer2ExternalVirtualPort = virtualNetworkHelper\r
vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
physicalPort = physicalNetworkHelper.getPhysicalPort(physicalNodeId, physicalPortId);\r
\r
- configIpTableEntryForOperation(user.getUserId(), nemoFlow,\r
- physicalPort, physicalPath, (short)priority, true);\r
+ configFlowTableEntryForOperation(user.getUserId(), nemoFlow,\r
+ physicalPort, physicalPath, (short) priority, true);\r
}\r
}\r
} else if ( VirtualResource.VirtualResourceType.Vport\r
physicalPort1 = physicalNetworkHelper\r
.getPhysicalPort(physicalLink.getSrcNodeId(), physicalLink.getSrcPortId());\r
\r
- configIpTableEntryForOperation(user.getUserId(), nemoFlow,\r
- physicalNodeId, physicalPort1, physicalPort, (short)priority, true);\r
+ configFlowTableEntryForOperation(user.getUserId(), nemoFlow,\r
+ physicalNodeId, physicalPort1, physicalPort, (short) priority, true);\r
}\r
}\r
\r
vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
physicalPort1 = physicalNetworkHelper.getPhysicalPort(physicalNodeId1, physicalPortId1);\r
\r
- configIpTableEntryForOperation(user.getUserId(), nemoFlow,\r
- physicalNodeId1, physicalPort1, physicalPort, (short)priority, true);\r
+ configFlowTableEntryForOperation(user.getUserId(), nemoFlow,\r
+ physicalNodeId1, physicalPort1, physicalPort, (short) priority, true);\r
}\r
\r
layer2ExternalVirtualPort = virtualNetworkHelper.getLayer2ExternalVirtualPort(virtualNodeId);\r
vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
physicalPort1 = physicalNetworkHelper.getPhysicalPort(physicalNodeId1, physicalPortId1);\r
\r
- configIpTableEntryForOperation(user.getUserId(), nemoFlow,\r
- physicalNodeId1, physicalPort1, physicalPort, (short)priority, true);\r
+ configFlowTableEntryForOperation(user.getUserId(), nemoFlow,\r
+ physicalNodeId1, physicalPort1, physicalPort, (short) priority, true);\r
}\r
}\r
} else {\r
vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
physicalPort = physicalNetworkHelper.getPhysicalPort(physicalNodeId, physicalPortId);\r
\r
- configIpTableEntryForOperation(user.getUserId(), nemoFlow,\r
- physicalPort, physicalPath, (short)priority, true);\r
+ configFlowTableEntryForOperation(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
vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
physicalPort = physicalNetworkHelper.getPhysicalPort(physicalNodeId, physicalPortId);\r
\r
- configIpTableEntryForOperation(user.getUserId(), nemoFlow,\r
- physicalNodeId, physicalPort1, physicalPort, (short)priority, true);\r
+ configFlowTableEntryForOperation(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
vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
physicalPort = physicalNetworkHelper.getPhysicalPort(physicalNodeId, physicalPortId);\r
\r
- configIpTableEntryForOperation(user.getUserId(), nemoFlow,\r
- physicalNodeId1, physicalPort1, physicalPort, (short)priority, true);\r
+ configFlowTableEntryForOperation(user.getUserId(), nemoFlow,\r
+ physicalNodeId1, physicalPort1, physicalPort, (short) priority, true);\r
}\r
}\r
\r
return null;\r
}\r
\r
+ /**\r
+ * TODO\r
+ *\r
+ * @author Zhigang Ji\r
+ * @param actions TODO\r
+ * @param actionName TODO\r
+ * @return TODO\r
+ */\r
+ private static org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.operation.instance.Action getAction(\r
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.operation.instance.Action> actions,\r
+ ActionName actionName) {\r
+ for ( org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.operation.instance.Action\r
+ action : actions ) {\r
+ if ( action.getActionName().equals(actionName) ) {\r
+ return action;\r
+ }\r
+ }\r
+\r
+ return null;\r
+ }\r
+\r
/**\r
* TODO\r
*\r
List<Instruction> instructionList = new LinkedList<Instruction>();\r
List<Action> actionList = new LinkedList<Action>();\r
\r
- EthernetMatchBuilder ethernetMatchBuilder = new EthernetMatchBuilder().setEthernetType(new EthernetTypeBuilder().setType(new EtherType((long)ETH_TYPE_IP)).build());\r
+ EthernetMatchBuilder ethernetMatchBuilder = new EthernetMatchBuilder().setEthernetType(new EthernetTypeBuilder().setType(new EtherType((long) ETH_TYPE_IP)).build());\r
EthernetMatch ethernetMatch = ethernetMatchBuilder.build();\r
\r
MetadataBuilder metadataBuilder = new MetadataBuilder().setMetadata(BigInteger.valueOf(metadatas.get(userId)));\r
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 operationPriority TODO\r
+ * @param layer3Forwarding TODO\r
+ */\r
+ private void configFlowTableEntryForOperation(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
+ short operationPriority,\r
+ boolean layer3Forwarding) {\r
+ WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();\r
+\r
+ Match match = createMatch(userId, nemoFlow, null);\r
+ Instructions instructions = new InstructionsBuilder().setInstruction(new ArrayList<Instruction>(0)).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 + operationPriority).setMatch(match).setInstructions(instructions).build();\r
+\r
+ NodeId nodeId = createNodeId(physicalNodeId);\r
+ InstanceIdentifier<Flow> flowInsId = generateFlowInsId(userId, nodeId, flow.getTableId(), flow.getId());\r
+\r
+ writeTransaction.put(LogicalDatastoreType.CONFIGURATION, flowInsId, flow, true);\r
+ writeTransaction.submit();\r
+\r
+ return;\r
+ }\r
+\r
/**\r
* TODO\r
*\r
* @param physicalNodeId TODO\r
* @param inPhysicalPort TODO\r
* @param outPhysicalPort TODO\r
- * @param policyPriority TODO\r
+ * @param operationPriority 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
+ private void configFlowTableEntryForOperation(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 operationPriority,\r
+ boolean layer3Forwarding) {\r
WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();\r
List<Instruction> instructionList = new LinkedList<Instruction>();\r
List<Action> actionList = new LinkedList<Action>();\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
+ Flow flow = flowBuilder.setPriority(DEFAULT_FLOW_PRIORITY + operationPriority).setMatch(match).setInstructions(instructions).build();\r
\r
NodeId nodeId = createNodeId(physicalNodeId);\r
InstanceIdentifier<Flow> flowInsId = generateFlowInsId(userId, nodeId, flow.getTableId(), flow.getId());\r
* @param nemoFlow TODO\r
* @param inPhysicalPort TODO\r
* @param outPhysicalPath TODO\r
- * @param policyPriority TODO\r
+ * @param operationPriority 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
+ private void configFlowTableEntryForOperation(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 operationPriority,\r
+ boolean layer3Forwarding) {\r
WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();\r
PhysicalLink physicalLink = physicalNetworkHelper.getFirstPhysicalLinkOfPhysicalPath(outPhysicalPath);\r
List<Instruction> instructionList = new LinkedList<Instruction>();\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
+ Flow flow = flowBuilder.setPriority(DEFAULT_FLOW_PRIORITY + operationPriority).setMatch(match).setInstructions(instructions).build();\r
\r
NodeId nodeId = createNodeId(physicalLink.getSrcNodeId());\r
InstanceIdentifier<Flow> flowInsId = generateFlowInsId(userId, nodeId, flow.getTableId(), flow.getId());\r