2 * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.
\r
4 * This program and the accompanying materials are made available under the
\r
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
\r
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
\r
9 package org.opendaylight.nemo.intent;
\r
11 import com.google.common.base.Optional;
\r
12 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
\r
13 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
\r
14 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
\r
15 import org.opendaylight.nemo.intent.computation.PNComputationUnit;
\r
16 import org.opendaylight.nemo.intent.computation.VNComputationUnit;
\r
17 import org.opendaylight.nemo.intent.computation.VNMappingUnit;
\r
18 import org.opendaylight.nemo.intent.condition.ConditionManager;
\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalNetwork;
\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.PhysicalPaths;
\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.paths.PhysicalPath;
\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.paths.PhysicalPathKey;
\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.VirtualNetworks;
\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.VirtualNetwork;
\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.VirtualNetworkBuilder;
\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.VirtualNetworkKey;
\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.*;
\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.arps.VirtualArp;
\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.links.VirtualLink;
\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.nodes.VirtualNode;
\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.paths.VirtualPath;
\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.routes.VirtualRoute;
\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.IntentVnMappingResults;
\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.VnPnMappingResults;
\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.UserIntentVnMapping;
\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.UserIntentVnMappingBuilder;
\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.UserIntentVnMappingKey;
\r
38 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
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.vn.pn.mapping.results.UserVnPnMapping;
\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.vn.pn.mapping.results.UserVnPnMappingBuilder;
\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.vn.pn.mapping.results.UserVnPnMappingKey;
\r
42 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
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.NodeType;
\r
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserId;
\r
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalPathId;
\r
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.VirtualNetworkId;
\r
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.Users;
\r
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Connection;
\r
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow;
\r
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Node;
\r
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.operations.Operation;
\r
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.User;
\r
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.UserKey;
\r
54 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
\r
55 import org.slf4j.Logger;
\r
56 import org.slf4j.LoggerFactory;
\r
58 import java.util.HashMap;
\r
59 import java.util.LinkedList;
\r
60 import java.util.List;
\r
61 import java.util.Map;
\r
62 import java.util.concurrent.ExecutionException;
\r
65 * Provide the user intent resolution APIs and distribute the user intents
\r
66 * to corresponding handling classes.
\r
68 * @author Zhigang Ji
\r
70 public class IntentResolver implements AutoCloseable {
\r
71 private static final Logger LOG = LoggerFactory.getLogger(IntentResolver.class);
\r
73 private final DataBroker dataBroker;
\r
76 * The node mapper to resolve the user's node intent.
\r
78 private NodeMapper nodeMapper;
\r
81 * The connection mapper to resolve the user's connection intent.
\r
83 private ConnectionMapper connectionMapper;
\r
86 * The flow manager to resolve the user's flow intent.
\r
88 private FlowManager flowManager;
\r
91 * The operation resolver to resolve the user's operation intent.
\r
93 private OperationResolver operationResolver;
\r
96 * The condition manager to resolve and manage the condition in the user's operation.
\r
98 private ConditionManager conditionManager;
\r
101 * The physical network computation unit.
\r
103 private PNComputationUnit pnComputationUnit;
\r
106 * The virtual network computation unit for all users.
\r
108 private Map<UserId, VNComputationUnit> vnComputationUnits;
\r
111 * The virtual network mapping unit.
\r
113 private VNMappingUnit vnMappingUnit;
\r
115 public IntentResolver(DataBroker dataBroker) {
\r
118 this.dataBroker = dataBroker;
\r
120 nodeMapper = new NodeMapper(dataBroker);
\r
121 connectionMapper = new ConnectionMapper(dataBroker, nodeMapper);
\r
122 flowManager = new FlowManager(dataBroker);
\r
123 conditionManager = new ConditionManager(this);
\r
125 pnComputationUnit = new PNComputationUnit(dataBroker);
\r
126 vnComputationUnits = new HashMap<UserId, VNComputationUnit>();
\r
127 vnMappingUnit = new VNMappingUnit(dataBroker, pnComputationUnit);
\r
129 operationResolver = new OperationResolver(dataBroker, conditionManager, vnComputationUnits);
\r
131 LOG.debug("Initialized the renderer common intent resolver.");
\r
137 * Resolve the user's intents to generate the virtual network, then map
\r
138 * the virtual network into the underlying physical network, finally, store
\r
139 * the generated intent mapping results into the data store, and various
\r
140 * renderers configure the underlying networks according to these results.
\r
142 * @param userId The user id for the intents to be resolved.
\r
144 public void resolveIntent(UserId userId) throws Exception {
\r
145 VNComputationUnit vnComputationUnit = vnComputationUnits.get(userId);
\r
147 VirtualNetworkId virtualNetworkId = new VirtualNetworkId(userId.getValue());
\r
148 VirtualNetworkKey virtualNetworkKey = new VirtualNetworkKey(virtualNetworkId);
\r
150 InstanceIdentifier<VirtualNetwork> virtualNetworkIid = InstanceIdentifier
\r
151 .builder(VirtualNetworks.class)
\r
152 .child(VirtualNetwork.class, virtualNetworkKey)
\r
154 InstanceIdentifier<UserIntentVnMapping> userIntentVnMappingIid = InstanceIdentifier
\r
155 .builder(IntentVnMappingResults.class)
\r
156 .child(UserIntentVnMapping.class, new UserIntentVnMappingKey(userId))
\r
158 InstanceIdentifier<UserVnPnMapping> userVnPnMappingIid = InstanceIdentifier
\r
159 .builder(VnPnMappingResults.class)
\r
160 .child(UserVnPnMapping.class, new UserVnPnMappingKey(virtualNetworkId))
\r
163 if ( null != vnComputationUnit ) {
\r
164 conditionManager.clear(userId);
\r
166 vnComputationUnit.close();
\r
167 vnComputationUnits.remove(userId);
\r
169 ReadWriteTransaction readWriteTransaction = dataBroker.newReadWriteTransaction();
\r
171 Optional<UserVnPnMapping> result;
\r
174 result = readWriteTransaction.read(LogicalDatastoreType.CONFIGURATION, userVnPnMappingIid).get();
\r
175 } catch ( InterruptedException | ExecutionException exception ) {
\r
176 throw new IntentResolutionException("Can not read the vn-pn mapping results for the user " +
\r
177 userId.getValue() + ".");
\r
180 if ( result.isPresent() ) {
\r
181 UserVnPnMapping userVnPnMapping = result.get();
\r
182 List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();
\r
183 InstanceIdentifier<PhysicalPath> physicalPathIid;
\r
184 PhysicalPathId physicalPathId;
\r
186 for ( VnPnMappingResult vnPnMappingResult : vnPnMappingResults ) {
\r
187 if ( VnPnMappingResult.VirtualResourceType.Vlink == vnPnMappingResult.getVirtualResourceType() ) {
\r
188 physicalPathId = new PhysicalPathId(vnPnMappingResult.getPhysicalResourceEntityId().getValue());
\r
189 physicalPathIid = InstanceIdentifier.builder(PhysicalNetwork.class)
\r
190 .child(PhysicalPaths.class)
\r
191 .child(PhysicalPath.class, new PhysicalPathKey(physicalPathId))
\r
194 readWriteTransaction.delete(LogicalDatastoreType.OPERATIONAL, physicalPathIid);
\r
199 // readWriteTransaction.delete(LogicalDatastoreType.CONFIGURATION, virtualNetworkIid);
\r
200 // readWriteTransaction.delete(LogicalDatastoreType.CONFIGURATION, userIntentVnMappingIid);
\r
201 // readWriteTransaction.delete(LogicalDatastoreType.CONFIGURATION, userVnPnMappingIid);
\r
202 // TODO: åˆ é™¤intent processing status
\r
204 readWriteTransaction.submit();
\r
207 ReadWriteTransaction readWriteTransaction = dataBroker.newReadWriteTransaction();
\r
209 InstanceIdentifier<User> userIid = InstanceIdentifier.builder(Users.class)
\r
210 .child(User.class, new UserKey(userId))
\r
212 Optional<User> result;
\r
215 result = readWriteTransaction.read(LogicalDatastoreType.CONFIGURATION, userIid).get();
\r
216 } catch ( InterruptedException | ExecutionException exception ) {
\r
217 throw new IntentResolutionException("Can not read the data of the user " +
\r
218 userId.getValue() + ".");
\r
221 if ( !result.isPresent() ) {
\r
222 throw new IntentResolutionException("The data of the user " +
\r
223 userId.getValue() + " does not exist.");
\r
226 User user = result.get();
\r
228 if ( null != user.getObjects() ) {
\r
229 VirtualNodes virtualNodes = new VirtualNodesBuilder()
\r
230 .setVirtualNode(new LinkedList<VirtualNode>())
\r
232 VirtualLinks virtualLinks = new VirtualLinksBuilder()
\r
233 .setVirtualLink(new LinkedList<VirtualLink>())
\r
235 VirtualPaths virtualPaths = new VirtualPathsBuilder()
\r
236 .setVirtualPath(new LinkedList<VirtualPath>())
\r
238 VirtualRoutes virtualRoutes = new VirtualRoutesBuilder()
\r
239 .setVirtualRoute(new LinkedList<VirtualRoute>())
\r
241 VirtualArps virtualArps = new VirtualArpsBuilder()
\r
242 .setVirtualArp(new LinkedList<VirtualArp>())
\r
244 VirtualNetwork virtualNetwork = new VirtualNetworkBuilder()
\r
245 .setNetworkId(virtualNetworkId)
\r
247 .setVirtualNodes(virtualNodes)
\r
248 .setVirtualLinks(virtualLinks)
\r
249 .setVirtualPaths(virtualPaths)
\r
250 .setVirtualRoutes(virtualRoutes)
\r
251 .setVirtualArps(virtualArps)
\r
254 UserIntentVnMapping userIntentVnMapping = new UserIntentVnMappingBuilder()
\r
256 .setVirtualNetworkId(virtualNetworkId)
\r
257 .setIntentVnMappingResult(new LinkedList<IntentVnMappingResult>())
\r
260 UserVnPnMapping userVnPnMapping = new UserVnPnMappingBuilder()
\r
261 .setVirtualNetworkId(virtualNetworkId)
\r
263 .setVnPnMappingResult(new LinkedList<VnPnMappingResult>())
\r
266 List<PhysicalPath> physicalPaths = new LinkedList<PhysicalPath>();
\r
268 List<Node> nodes = user.getObjects().getNode();
\r
269 List<Node> hosts = new LinkedList<Node>();
\r
270 List<Node> layer2Groups = new LinkedList<Node>();
\r
271 List<Node> layer3Groups = new LinkedList<Node>();
\r
272 List<Node> externalLayer3Groups = new LinkedList<Node>();
\r
273 List<Node> serviceChainGroups = new LinkedList<Node>();
\r
274 List<Node> serviceFunctions = new LinkedList<Node>();
\r
276 NodeType hostNodeType = new NodeType("host");
\r
277 NodeType layer2GroupNodeType = new NodeType("l2-group");
\r
278 NodeType layer3GroupNodeType = new NodeType("l3-group");
\r
279 NodeType externalGroupNodeType = new NodeType("ext-group");
\r
280 NodeType serviceChainGroupNodeType = new NodeType("chain-group");
\r
281 NodeType firewallNodeType = new NodeType("fw");
\r
282 NodeType loadbalancerNodeType = new NodeType("lb");
\r
283 NodeType cacheNodeType = new NodeType("cache");
\r
286 if ( null != nodes ) {
\r
287 for ( Node node : nodes ) {
\r
288 nodeType = node.getNodeType();
\r
290 if ( nodeType.equals(hostNodeType) ) {
\r
294 if ( nodeType.equals(layer2GroupNodeType) ) {
\r
295 layer2Groups.add(node);
\r
298 if ( nodeType.equals(layer3GroupNodeType) ) {
\r
299 layer3Groups.add(node);
\r
302 if ( nodeType.equals(externalGroupNodeType) ) {
\r
303 if ( IntentResolverUtils.checkExternalLayer3Group(node) ) {
\r
304 externalLayer3Groups.add(node);
\r
308 if ( nodeType.equals(serviceChainGroupNodeType) ) {
\r
309 serviceChainGroups.add(node);
\r
312 if ( nodeType.equals(firewallNodeType)
\r
313 || nodeType.equals(loadbalancerNodeType)
\r
314 || nodeType.equals(cacheNodeType) ) {
\r
315 serviceFunctions.add(node);
\r
319 for ( Node node : hosts ) {
\r
320 nodeMapper.resolveHost(user, node, virtualNetwork, userIntentVnMapping);
\r
323 for ( Node node : layer2Groups ) {
\r
324 nodeMapper.resolveLayer2Group(user, node, virtualNetwork, userIntentVnMapping);
\r
327 for ( Node node : externalLayer3Groups ) {
\r
328 nodeMapper.resolveExternalLayer3Group(user, node, virtualNetwork, userIntentVnMapping);
\r
331 for ( Node node : layer3Groups ) {
\r
332 nodeMapper.resolveLayer3Group(user, node, virtualNetwork, userIntentVnMapping);
\r
335 for ( Node node : serviceFunctions ) {
\r
336 nodeMapper.resolveServiceFunction(user, node, virtualNetwork, userIntentVnMapping);
\r
339 for ( Node node : serviceChainGroups ) {
\r
340 nodeMapper.resolveServiceChainGroup(user, node, virtualNetwork, userIntentVnMapping);
\r
344 List<Connection> connections = user.getObjects().getConnection();
\r
346 if ( null != connections ) {
\r
347 for ( Connection connection : connections ) {
\r
348 connectionMapper.resolveConnection(user, connection, virtualNetwork, userIntentVnMapping);
\r
352 List<Flow> flows = user.getObjects().getFlow();
\r
354 if ( null != flows ) {
\r
355 for ( Flow flow : flows ) {
\r
356 flowManager.resolveFlow(userId, flow);
\r
360 List<Operation> operationsApplyingToNode = new LinkedList<Operation>();
\r
361 List<Operation> operationsApplyingToConnection = new LinkedList<Operation>();
\r
362 List<Operation> operationsApplyingToFlow = new LinkedList<Operation>();
\r
364 if ( null != user.getOperations() ) {
\r
365 List<Operation> operations = user.getOperations().getOperation();
\r
367 if ( null != operations ) {
\r
368 operationResolver.classifyOperations(user, operations, operationsApplyingToNode,
\r
369 operationsApplyingToConnection, operationsApplyingToFlow);
\r
373 if ( !operationsApplyingToNode.isEmpty() ) {
\r
374 for ( Operation operation : operationsApplyingToNode ) {
\r
375 operationResolver.resolveOperation(user, operation, virtualNetwork, userIntentVnMapping);
\r
379 if ( !operationsApplyingToConnection.isEmpty() ) {
\r
380 for ( Operation operation : operationsApplyingToConnection ) {
\r
381 operationResolver.resolveOperation(user, operation, virtualNetwork, userIntentVnMapping);
\r
385 vnMappingUnit.virtualNetworkMapping(virtualNetwork, userVnPnMapping, physicalPaths);
\r
386 vnComputationUnit = new VNComputationUnit(dataBroker, virtualNetwork);
\r
387 vnComputationUnits.put(userId, vnComputationUnit);
\r
389 int currentVirtualLinkNum = virtualLinks.getVirtualLink().size();
\r
391 if ( !operationsApplyingToFlow.isEmpty() ) {
\r
392 for ( Operation operation : operationsApplyingToFlow ) {
\r
393 operationResolver.resolveOperation(user, operation, virtualNetwork, userIntentVnMapping);
\r
397 List<VirtualLink> virtualLinkList = virtualLinks.getVirtualLink();
\r
398 List<VirtualLink> unmappedVirtualLinkList =
\r
399 virtualLinkList.subList(currentVirtualLinkNum, virtualLinkList.size());
\r
401 vnMappingUnit.virtualNetworkMapping(virtualNetwork,
\r
402 unmappedVirtualLinkList, userVnPnMapping, physicalPaths);
\r
404 LOG.debug("{}", virtualNetwork);
\r
405 LOG.debug("{}", userIntentVnMapping);
\r
406 LOG.debug("{}", userVnPnMapping);
\r
407 LOG.debug("{}", physicalPaths);
\r
409 readWriteTransaction.put(LogicalDatastoreType.CONFIGURATION, virtualNetworkIid, virtualNetwork, true);
\r
410 readWriteTransaction.put(LogicalDatastoreType.CONFIGURATION, userIntentVnMappingIid, userIntentVnMapping, true);
\r
411 readWriteTransaction.put(LogicalDatastoreType.CONFIGURATION, userVnPnMappingIid, userVnPnMapping, true);
\r
413 InstanceIdentifier<PhysicalPath> physicalPathIid;
\r
415 for ( PhysicalPath physicalPath : physicalPaths ) {
\r
416 physicalPathIid = InstanceIdentifier.builder(PhysicalNetwork.class)
\r
417 .child(PhysicalPaths.class)
\r
418 .child(PhysicalPath.class, new PhysicalPathKey(physicalPath.getPathId()))
\r
421 readWriteTransaction.put(LogicalDatastoreType.OPERATIONAL, physicalPathIid, physicalPath, true);
\r
424 readWriteTransaction.submit();
\r
431 public void close() throws Exception {
\r
432 if ( null != pnComputationUnit ) {
\r
433 pnComputationUnit.close();
\r
436 for ( VNComputationUnit vnComputationUnit : vnComputationUnits.values() ) {
\r
437 if ( null != vnComputationUnit ) {
\r
438 vnComputationUnit.close();
\r
442 if ( null != vnMappingUnit ) {
\r
443 vnMappingUnit.close();
\r