Add resolution for new nemo actions.
[nemo.git] / nemo-impl / src / main / java / org / opendaylight / nemo / intent / IntentResolver.java
1 /*\r
2  * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.\r
3  *\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
7  */\r
8 \r
9 package org.opendaylight.nemo.intent;\r
10 \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
57 \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
63 \r
64 /**\r
65  * Provide the user intent resolution APIs and distribute the user intents\r
66  * to corresponding handling classes.\r
67  *\r
68  * @author Zhigang Ji\r
69  */\r
70 public class IntentResolver implements AutoCloseable {\r
71     private static final Logger LOG = LoggerFactory.getLogger(IntentResolver.class);\r
72 \r
73     private final DataBroker dataBroker;\r
74 \r
75     /**\r
76      * The node mapper to resolve the user's node intent.\r
77      */\r
78     private NodeMapper nodeMapper;\r
79 \r
80     /**\r
81      * The connection mapper to resolve the user's connection intent.\r
82      */\r
83     private ConnectionMapper connectionMapper;\r
84 \r
85     /**\r
86      * The flow manager to resolve the user's flow intent.\r
87      */\r
88     private FlowManager flowManager;\r
89 \r
90     /**\r
91      * The operation resolver to resolve the user's operation intent.\r
92      */\r
93     private OperationResolver operationResolver;\r
94 \r
95     /**\r
96      * The condition manager to resolve and manage the condition in the user's operation.\r
97      */\r
98     private ConditionManager conditionManager;\r
99 \r
100     /**\r
101      * The physical network computation unit.\r
102      */\r
103     private PNComputationUnit pnComputationUnit;\r
104 \r
105     /**\r
106      * The virtual network computation unit for all users.\r
107      */\r
108     private Map<UserId, VNComputationUnit> vnComputationUnits;\r
109 \r
110     /**\r
111      * The virtual network mapping unit.\r
112      */\r
113     private VNMappingUnit vnMappingUnit;\r
114 \r
115     public IntentResolver(DataBroker dataBroker) {\r
116         super();\r
117 \r
118         this.dataBroker = dataBroker;\r
119 \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
124 \r
125         pnComputationUnit = new PNComputationUnit(dataBroker);\r
126         vnComputationUnits = new HashMap<UserId, VNComputationUnit>();\r
127         vnMappingUnit = new VNMappingUnit(dataBroker, pnComputationUnit);\r
128 \r
129         operationResolver = new OperationResolver(dataBroker, conditionManager, vnComputationUnits);\r
130 \r
131         LOG.debug("Initialized the renderer common intent resolver.");\r
132 \r
133         return;\r
134     }\r
135 \r
136     /**\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
141      *\r
142      * @param userId The user id for the intents to be resolved.\r
143      */\r
144     public void resolveIntent(UserId userId) throws Exception {\r
145         VNComputationUnit vnComputationUnit = vnComputationUnits.get(userId);\r
146 \r
147         VirtualNetworkId virtualNetworkId = new VirtualNetworkId(userId.getValue());\r
148         VirtualNetworkKey virtualNetworkKey = new VirtualNetworkKey(virtualNetworkId);\r
149 \r
150         InstanceIdentifier<VirtualNetwork> virtualNetworkIid = InstanceIdentifier\r
151                 .builder(VirtualNetworks.class)\r
152                 .child(VirtualNetwork.class, virtualNetworkKey)\r
153                 .build();\r
154         InstanceIdentifier<UserIntentVnMapping> userIntentVnMappingIid = InstanceIdentifier\r
155                 .builder(IntentVnMappingResults.class)\r
156                 .child(UserIntentVnMapping.class, new UserIntentVnMappingKey(userId))\r
157                 .build();\r
158         InstanceIdentifier<UserVnPnMapping> userVnPnMappingIid = InstanceIdentifier\r
159                 .builder(VnPnMappingResults.class)\r
160                 .child(UserVnPnMapping.class, new UserVnPnMappingKey(virtualNetworkId))\r
161                 .build();\r
162 \r
163         if ( null != vnComputationUnit ) {\r
164             conditionManager.clear(userId);\r
165 \r
166             vnComputationUnit.close();\r
167             vnComputationUnits.remove(userId);\r
168 \r
169             ReadWriteTransaction readWriteTransaction = dataBroker.newReadWriteTransaction();\r
170 \r
171             Optional<UserVnPnMapping> result;\r
172 \r
173             try {\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
178             }\r
179 \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
185 \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
192                                 .build();\r
193 \r
194                         readWriteTransaction.delete(LogicalDatastoreType.OPERATIONAL, physicalPathIid);\r
195                     }\r
196                 }\r
197             }\r
198 \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
203 \r
204             readWriteTransaction.submit();\r
205         }\r
206 \r
207         ReadWriteTransaction readWriteTransaction = dataBroker.newReadWriteTransaction();\r
208 \r
209         InstanceIdentifier<User> userIid = InstanceIdentifier.builder(Users.class)\r
210                 .child(User.class, new UserKey(userId))\r
211                 .build();\r
212         Optional<User> result;\r
213 \r
214         try {\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
219         }\r
220 \r
221         if ( !result.isPresent() ) {\r
222             throw new IntentResolutionException("The data of the user " +\r
223                     userId.getValue() + " does not exist.");\r
224         }\r
225 \r
226         User user = result.get();\r
227 \r
228         if ( null != user.getObjects() ) {\r
229             VirtualNodes virtualNodes = new VirtualNodesBuilder()\r
230                     .setVirtualNode(new LinkedList<VirtualNode>())\r
231                     .build();\r
232             VirtualLinks virtualLinks = new VirtualLinksBuilder()\r
233                     .setVirtualLink(new LinkedList<VirtualLink>())\r
234                     .build();\r
235             VirtualPaths virtualPaths = new VirtualPathsBuilder()\r
236                     .setVirtualPath(new LinkedList<VirtualPath>())\r
237                     .build();\r
238             VirtualRoutes virtualRoutes = new VirtualRoutesBuilder()\r
239                     .setVirtualRoute(new LinkedList<VirtualRoute>())\r
240                     .build();\r
241             VirtualArps virtualArps = new VirtualArpsBuilder()\r
242                     .setVirtualArp(new LinkedList<VirtualArp>())\r
243                     .build();\r
244             VirtualNetwork virtualNetwork = new VirtualNetworkBuilder()\r
245                     .setNetworkId(virtualNetworkId)\r
246                     .setUserId(userId)\r
247                     .setVirtualNodes(virtualNodes)\r
248                     .setVirtualLinks(virtualLinks)\r
249                     .setVirtualPaths(virtualPaths)\r
250                     .setVirtualRoutes(virtualRoutes)\r
251                     .setVirtualArps(virtualArps)\r
252                     .build();\r
253 \r
254             UserIntentVnMapping userIntentVnMapping = new UserIntentVnMappingBuilder()\r
255                     .setUserId(userId)\r
256                     .setVirtualNetworkId(virtualNetworkId)\r
257                     .setIntentVnMappingResult(new LinkedList<IntentVnMappingResult>())\r
258                     .build();\r
259 \r
260             UserVnPnMapping userVnPnMapping = new UserVnPnMappingBuilder()\r
261                     .setVirtualNetworkId(virtualNetworkId)\r
262                     .setUserId(userId)\r
263                     .setVnPnMappingResult(new LinkedList<VnPnMappingResult>())\r
264                     .build();\r
265 \r
266             List<PhysicalPath> physicalPaths = new LinkedList<PhysicalPath>();\r
267 \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
275 \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
284             NodeType nodeType;\r
285 \r
286             if ( null != nodes ) {\r
287                 for ( Node node : nodes ) {\r
288                     nodeType = node.getNodeType();\r
289 \r
290                     if ( nodeType.equals(hostNodeType) ) {\r
291                         hosts.add(node);\r
292                     }\r
293 \r
294                     if ( nodeType.equals(layer2GroupNodeType) ) {\r
295                         layer2Groups.add(node);\r
296                     }\r
297 \r
298                     if ( nodeType.equals(layer3GroupNodeType) ) {\r
299                         layer3Groups.add(node);\r
300                     }\r
301 \r
302                     if ( nodeType.equals(externalGroupNodeType) ) {\r
303                         if ( IntentResolverUtils.checkExternalLayer3Group(node) ) {\r
304                             externalLayer3Groups.add(node);\r
305                         }\r
306                     }\r
307 \r
308                     if ( nodeType.equals(serviceChainGroupNodeType) ) {\r
309                         serviceChainGroups.add(node);\r
310                     }\r
311 \r
312                     if ( nodeType.equals(firewallNodeType)\r
313                             || nodeType.equals(loadbalancerNodeType)\r
314                             || nodeType.equals(cacheNodeType) ) {\r
315                         serviceFunctions.add(node);\r
316                     }\r
317                 }\r
318 \r
319                 for ( Node node : hosts ) {\r
320                     nodeMapper.resolveHost(user, node, virtualNetwork, userIntentVnMapping);\r
321                 }\r
322 \r
323                 for ( Node node : layer2Groups ) {\r
324                     nodeMapper.resolveLayer2Group(user, node, virtualNetwork, userIntentVnMapping);\r
325                 }\r
326 \r
327                 for ( Node node : externalLayer3Groups ) {\r
328                     nodeMapper.resolveExternalLayer3Group(user, node, virtualNetwork, userIntentVnMapping);\r
329                 }\r
330 \r
331                 for ( Node node : layer3Groups ) {\r
332                     nodeMapper.resolveLayer3Group(user, node, virtualNetwork, userIntentVnMapping);\r
333                 }\r
334 \r
335                 for ( Node node : serviceFunctions ) {\r
336                     nodeMapper.resolveServiceFunction(user, node, virtualNetwork, userIntentVnMapping);\r
337                 }\r
338 \r
339                 for ( Node node : serviceChainGroups ) {\r
340                     nodeMapper.resolveServiceChainGroup(user, node, virtualNetwork, userIntentVnMapping);\r
341                 }\r
342             }\r
343 \r
344             List<Connection> connections = user.getObjects().getConnection();\r
345 \r
346             if ( null != connections ) {\r
347                 for ( Connection connection : connections ) {\r
348                     connectionMapper.resolveConnection(user, connection, virtualNetwork, userIntentVnMapping);\r
349                 }\r
350             }\r
351 \r
352             List<Flow> flows = user.getObjects().getFlow();\r
353 \r
354             if ( null != flows ) {\r
355                 for ( Flow flow : flows ) {\r
356                     flowManager.resolveFlow(userId, flow);\r
357                 }\r
358             }\r
359 \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
363 \r
364             if ( null != user.getOperations() ) {\r
365                 List<Operation> operations = user.getOperations().getOperation();\r
366 \r
367                 if ( null != operations ) {\r
368                     operationResolver.classifyOperations(user, operations, operationsApplyingToNode,\r
369                             operationsApplyingToConnection, operationsApplyingToFlow);\r
370                 }\r
371             }\r
372 \r
373             if ( !operationsApplyingToNode.isEmpty() ) {\r
374                 for ( Operation operation : operationsApplyingToNode ) {\r
375                     operationResolver.resolveOperation(user, operation, virtualNetwork, userIntentVnMapping);\r
376                 }\r
377             }\r
378 \r
379             if ( !operationsApplyingToConnection.isEmpty() ) {\r
380                 for ( Operation operation : operationsApplyingToConnection ) {\r
381                     operationResolver.resolveOperation(user, operation, virtualNetwork, userIntentVnMapping);\r
382                 }\r
383             }\r
384 \r
385             vnMappingUnit.virtualNetworkMapping(virtualNetwork, userVnPnMapping, physicalPaths);\r
386             vnComputationUnit = new VNComputationUnit(dataBroker, virtualNetwork);\r
387             vnComputationUnits.put(userId, vnComputationUnit);\r
388 \r
389             int currentVirtualLinkNum = virtualLinks.getVirtualLink().size();\r
390 \r
391             if ( !operationsApplyingToFlow.isEmpty() ) {\r
392                 for ( Operation operation : operationsApplyingToFlow ) {\r
393                     operationResolver.resolveOperation(user, operation, virtualNetwork, userIntentVnMapping);\r
394                 }\r
395             }\r
396 \r
397             List<VirtualLink> virtualLinkList = virtualLinks.getVirtualLink();\r
398             List<VirtualLink> unmappedVirtualLinkList =\r
399                     virtualLinkList.subList(currentVirtualLinkNum, virtualLinkList.size());\r
400 \r
401             vnMappingUnit.virtualNetworkMapping(virtualNetwork,\r
402                     unmappedVirtualLinkList, userVnPnMapping, physicalPaths);\r
403 \r
404             LOG.debug("{}", virtualNetwork);\r
405             LOG.debug("{}", userIntentVnMapping);\r
406             LOG.debug("{}", userVnPnMapping);\r
407             LOG.debug("{}", physicalPaths);\r
408 \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
412 \r
413             InstanceIdentifier<PhysicalPath> physicalPathIid;\r
414 \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
419                         .build();\r
420 \r
421                 readWriteTransaction.put(LogicalDatastoreType.OPERATIONAL, physicalPathIid, physicalPath, true);\r
422             }\r
423 \r
424             readWriteTransaction.submit();\r
425         }\r
426 \r
427         return;\r
428     }\r
429 \r
430     @Override\r
431     public void close() throws Exception {\r
432         if ( null != pnComputationUnit ) {\r
433             pnComputationUnit.close();\r
434         }\r
435 \r
436         for ( VNComputationUnit vnComputationUnit : vnComputationUnits.values() ) {\r
437             if ( null != vnComputationUnit ) {\r
438                 vnComputationUnit.close();\r
439             }\r
440         }\r
441 \r
442         if ( null != vnMappingUnit ) {\r
443             vnMappingUnit.close();\r
444         }\r
445 \r
446         return;\r
447     }\r
448 }\r