Adding nemo engine.
[nemo.git] / nemo-impl / src / main / java / org / opendaylight / nemo / intent / NodeMapper.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.ReadOnlyTransaction;\r
14 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
15 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;\r
16 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;\r
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;\r
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;\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.attribute.instance.AttributeValue;\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.attribute.instance.AttributeValueBuilder;\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.PhysicalHosts;\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.hosts.PhysicalHost;\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.virtual.network.virtual.arps.VirtualArp;\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.arps.VirtualArpBuilder;\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.links.VirtualLink;\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.links.VirtualLinkBuilder;\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.nodes.VirtualNode;\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.nodes.VirtualNodeBuilder;\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.paths.VirtualPathBuilder;\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.*;\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.port.instance.*;\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.port.instance.PhysicalResourceRequirement;\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.port.instance.PhysicalResourceRequirementBuilder;\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.UserIntentVnMapping;\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.intent.vn.mapping.results.user.intent.vn.mapping.IntentVnMappingResultBuilder;\r
40 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
41 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
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.IntentId;\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.PropertyName;\r
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.*;\r
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Node;\r
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.User;\r
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.node.instance.Property;\r
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.node.instance.SubNode;\r
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.property.instance.property.values.StringValue;\r
51 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
52 import org.slf4j.Logger;\r
53 import org.slf4j.LoggerFactory;\r
54 \r
55 import java.util.*;\r
56 import java.util.concurrent.ExecutionException;\r
57 \r
58 /**\r
59  * Resolve the user's node intent. Create the virtual node according to\r
60  * the intent if it's needed, and then map the created virtual node into\r
61  * the physical network. Finally, store these intent mapping results\r
62  * into the data store.\r
63  *\r
64  * @author Zhigang Ji\r
65  */\r
66 public class NodeMapper {\r
67     private static final Logger LOG = LoggerFactory.getLogger(NodeMapper.class);\r
68 \r
69     private final DataBroker dataBroker;\r
70 \r
71     public NodeMapper(DataBroker dataBroker) {\r
72         super();\r
73 \r
74         this.dataBroker = dataBroker;\r
75 \r
76         LOG.debug("Initialized the renderer common node mapper.");\r
77 \r
78         return;\r
79     }\r
80 \r
81     /**\r
82      * Resolve the user's node intent, perform the necessary intent\r
83      * mapping, and store the intent mapping results into the data store.\r
84      *\r
85      * @param user The user for the node.\r
86      * @param node The node to be resolved.\r
87      * @param virtualNetwork The virtual network for the user.\r
88      * @param userIntentVnMapping The intent-vn mapping for the user.\r
89      */\r
90     protected void resolveNode(User user, Node node, VirtualNetwork virtualNetwork,\r
91                                UserIntentVnMapping userIntentVnMapping)\r
92             throws IntentResolutionException {\r
93         NodeType nodeType = node.getNodeType();\r
94 \r
95         if ( nodeType.equals(new NodeType("host")) ) {\r
96             resolveHost(user, node, virtualNetwork, userIntentVnMapping);\r
97 \r
98             return;\r
99         }\r
100 \r
101         if ( nodeType.equals(new NodeType(("l2-group"))) ) {\r
102             resolveLayer2Group(user, node, virtualNetwork, userIntentVnMapping);\r
103 \r
104             return;\r
105         }\r
106 \r
107         if ( nodeType.equals(new NodeType("l3-group")) ) {\r
108             resolveLayer3Group(user, node, virtualNetwork, userIntentVnMapping);\r
109 \r
110             return;\r
111         }\r
112 \r
113         if ( nodeType.equals(new NodeType("ext-group")) ) {\r
114             if ( IntentResolverUtils.checkExternalLayer3Group(node) ) {\r
115                 resolveExternalLayer3Group(user, node, virtualNetwork, userIntentVnMapping);\r
116             }\r
117 \r
118             return;\r
119         }\r
120 \r
121         if ( nodeType.equals(new NodeType("chain-group")) ) {\r
122             resolveServiceChainGroup(user, node, virtualNetwork, userIntentVnMapping);\r
123 \r
124             return;\r
125         }\r
126 \r
127         if ( nodeType.equals(new NodeType("fw"))\r
128                 || nodeType.equals(new NodeType("lb"))\r
129                 || nodeType.equals(new NodeType("cache")) ) {\r
130             resolveServiceFunction(user, node, virtualNetwork, userIntentVnMapping);\r
131 \r
132             return;\r
133         }\r
134 \r
135         throw new IntentResolutionException("Unknown node type.");\r
136 \r
137 //        return;\r
138     }\r
139 \r
140     /**\r
141      * TODO\r
142      *\r
143      * @param user TODO\r
144      * @param node TODO\r
145      * @param virtualNetwork TODO\r
146      * @param userIntentVnMapping TODO\r
147      */\r
148     protected void resolveHost(User user, Node node, VirtualNetwork virtualNetwork,\r
149                                UserIntentVnMapping userIntentVnMapping)\r
150             throws IntentResolutionException {\r
151         ReadOnlyTransaction readOnlyTransaction = dataBroker.newReadOnlyTransaction();\r
152 \r
153         InstanceIdentifier<PhysicalHosts> physicalHostsIid = InstanceIdentifier\r
154                 .builder(PhysicalNetwork.class)\r
155                 .child(PhysicalHosts.class)\r
156                 .build();\r
157         Optional<PhysicalHosts> result;\r
158 \r
159         try {\r
160             result = readOnlyTransaction.read(LogicalDatastoreType.OPERATIONAL, physicalHostsIid).get();\r
161         } catch ( InterruptedException | ExecutionException exception ) {\r
162             throw new IntentResolutionException("Can not read the physical hosts.");\r
163         }\r
164 \r
165         if ( !result.isPresent() ) {\r
166             throw new IntentResolutionException("The physical hosts do not exist.");\r
167         }\r
168 \r
169         PhysicalHosts physicalHosts = result.get();\r
170         List<PhysicalHost> physicalHostList = physicalHosts.getPhysicalHost();\r
171         PhysicalHost physicalHost = IntentResolverUtils.getPhysicalHost(physicalHostList, node);\r
172 \r
173         if ( null == physicalHost ) {\r
174             throw new IntentResolutionException("The physical host corresponding to the node " +\r
175                     node.getNodeId().getValue() + " does not exist.");\r
176         }\r
177 \r
178         List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement> physicalResourceRequirements =\r
179                 new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement>(1);\r
180         AttributeValue attributeValue = new AttributeValueBuilder()\r
181                 .setStringValue(physicalHost.getNodeId().getValue())\r
182                 .build();\r
183         org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement physicalResourceRequirement =\r
184                 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirementBuilder()\r
185                         .setAttributeName(new AttributeName("location"))\r
186                         .setAttributeValue(attributeValue)\r
187                         .setAttributeMatchPattern(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement.AttributeMatchPattern.Equal)\r
188                         .build();\r
189         physicalResourceRequirements.add(physicalResourceRequirement);\r
190 \r
191         VirtualNode virtualNode = new VirtualNodeBuilder()\r
192                 .setNodeId(new VirtualNodeId(UUID.randomUUID().toString()))\r
193                 .setNodeType(VirtualNode.NodeType.Vswitch)\r
194                 .setVirtualPort(new LinkedList<VirtualPort>())\r
195                 .setPhysicalResourceRequirement(physicalResourceRequirements)\r
196                 .build();\r
197 \r
198         virtualNetwork.getVirtualNodes().getVirtualNode().add(virtualNode);\r
199 \r
200         List<MacAddress> macAddresses = new ArrayList<MacAddress>(1);\r
201         macAddresses.add(physicalHost.getMacAddress());\r
202         ExternalMacAddresses externalMacAddresses = new ExternalMacAddressesBuilder()\r
203                 .setExternalMacAddress(macAddresses)\r
204                 .build();\r
205 \r
206         List<PhysicalResourceRequirement> physicalResourceRequirements1 =\r
207                 new ArrayList<PhysicalResourceRequirement>(1);\r
208         AttributeValue attributeValue1 = new AttributeValueBuilder()\r
209                 .setStringValue(physicalHost.getPortId().getValue())\r
210                 .build();\r
211         PhysicalResourceRequirement physicalResourceRequirement1 = new PhysicalResourceRequirementBuilder()\r
212                 .setAttributeName(new AttributeName("location"))\r
213                 .setAttributeValue(attributeValue1)\r
214                 .setAttributeMatchPattern(PhysicalResourceRequirement.AttributeMatchPattern.Equal)\r
215                 .build();\r
216         physicalResourceRequirements1.add(physicalResourceRequirement1);\r
217 \r
218         VirtualPort virtualPort = new VirtualPortBuilder()\r
219                 .setPortId(new VirtualPortId(UUID.randomUUID().toString()))\r
220                 .setPortType(VirtualPort.PortType.External)\r
221                 .setExternalMacAddresses(externalMacAddresses)\r
222                 .setPhysicalResourceRequirement(physicalResourceRequirements1)\r
223                 .build();\r
224 \r
225         virtualNode.getVirtualPort().add(virtualPort);\r
226 \r
227         List<VirtualArp> virtualArps = virtualNetwork.getVirtualArps().getVirtualArp();\r
228         VirtualArp virtualArp;\r
229 \r
230         for ( IpAddress ipAddress : physicalHost.getIpAddresses().getIpAddress() ) {\r
231             virtualArp = new VirtualArpBuilder()\r
232                     .setIpAddress(ipAddress)\r
233                     .setMacAddress(physicalHost.getMacAddress())\r
234                     .setNodeId(virtualNode.getNodeId())\r
235                     .setPortId(virtualPort.getPortId())\r
236                     .build();\r
237             virtualArps.add(virtualArp);\r
238         }\r
239 \r
240         List<VirtualResource> virtualResources = new ArrayList<VirtualResource>(1);\r
241         VirtualResource virtualResource = new VirtualResourceBuilder()\r
242                 .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
243                 .setVirtualResourceType(VirtualResource.VirtualResourceType.Vport)\r
244                 .setVirtualResourceEntityId(new VirtualResourceEntityId(virtualPort.getPortId().getValue()))\r
245                 .setParentVirtualResourceEntityId(new VirtualResourceEntityId(virtualNode.getNodeId().getValue()))\r
246                 .setOrder(0L)\r
247                 .build();\r
248         virtualResources.add(virtualResource);\r
249 \r
250         IntentVnMappingResult intentVnMappingResult = new IntentVnMappingResultBuilder()\r
251                 .setIntentId(new IntentId(node.getNodeId().getValue()))\r
252                 .setIntentType(IntentVnMappingResult.IntentType.Node)\r
253                 .setVirtualResource(virtualResources)\r
254                 .build();\r
255 \r
256         userIntentVnMapping.getIntentVnMappingResult().add(intentVnMappingResult);\r
257 \r
258         return;\r
259     }\r
260 \r
261     /**\r
262      * TODO\r
263      *\r
264      * @param user TODO\r
265      * @param node TODO\r
266      * @param virtualNetwork TODO\r
267      * @param userIntentVnMapping TODO\r
268      */\r
269     protected void resolveLayer2Group(User user, Node node, VirtualNetwork virtualNetwork,\r
270                                       UserIntentVnMapping userIntentVnMapping)\r
271             throws IntentResolutionException {\r
272         List<Node> nodes = user.getObjects().getNode();\r
273         List<SubNode> subNodes = node.getSubNode();\r
274         Node node1;\r
275         NodeType nodeType = new NodeType("ext-group");\r
276         List<VirtualNode> virtualSwitches = new ArrayList<VirtualNode>(subNodes.size());\r
277         List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
278         List<VirtualNode> virtualNodes = virtualNetwork.getVirtualNodes().getVirtualNode();\r
279         IntentVnMappingResult intentVnMappingResult;\r
280         VirtualNode virtualNode;\r
281 \r
282         for ( SubNode subNode : subNodes ) {\r
283             node1 = IntentResolverUtils.getNode(nodes, subNode.getNodeId());\r
284 \r
285             if ( null == node1 ) {\r
286                 throw new IntentResolutionException("The sub-node " + subNode.getNodeId().getValue() +\r
287                         " of the node " + node.getNodeId().getValue() + " does not exist.");\r
288             }\r
289 \r
290             if ( node1.getNodeType().equals(nodeType) ) {\r
291                 if ( IntentResolverUtils.checkExternalLayer3Group(node1) ) {\r
292                     throw new IntentResolutionException("The sub-node " + subNode.getNodeId().getValue() +\r
293                             " of the node " + node.getNodeId().getValue() + " can't be layer3 group.");\r
294                 }\r
295 \r
296                 resolveExternalLayer2Group(user, node1, virtualNetwork, userIntentVnMapping, false);\r
297             }\r
298 \r
299             intentVnMappingResult = IntentResolverUtils.getIntentVnMappingResult(intentVnMappingResults,\r
300                     new IntentId(node1.getNodeId().getValue()));\r
301 \r
302             if ( null == intentVnMappingResult ) {\r
303                 throw new IntentResolutionException("Can not get the intent-vn mapping result for " +\r
304                         "the node " + node1.getNodeId().getValue() + ".");\r
305             }\r
306 \r
307             virtualNode = IntentResolverUtils.getVirtualNode(virtualNodes,\r
308                     new VirtualNodeId(intentVnMappingResult.getVirtualResource().get(0)\r
309                             .getParentVirtualResourceEntityId().getValue()));\r
310 \r
311             if ( null == virtualNode ) {\r
312                 throw new IntentResolutionException("Can not get the virtual node created for " +\r
313                         "the node " + node1.getNodeId().getValue() + ".");\r
314             }\r
315 \r
316             virtualSwitches.add(virtualNode);\r
317         }\r
318 \r
319         Property locationProperty = IntentResolverUtils\r
320                 .getNodeProperty(node.getProperty(), new PropertyName("location"));\r
321         List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement> physicalResourceRequirements;\r
322 \r
323         if ( null == locationProperty ) {\r
324             physicalResourceRequirements =\r
325                     new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement>(0);\r
326         } else {\r
327             physicalResourceRequirements =\r
328                     new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement>(1);\r
329             AttributeValue attributeValue = new AttributeValueBuilder()\r
330                     .setStringValue(locationProperty.getPropertyValues().getStringValue().get(0).getValue())\r
331                     .build();\r
332             org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement physicalResourceRequirement =\r
333                     new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirementBuilder()\r
334                             .setAttributeName(new AttributeName("location"))\r
335                             .setAttributeValue(attributeValue)\r
336                             .setAttributeMatchPattern(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement.AttributeMatchPattern.Equal)\r
337                             .build();\r
338             physicalResourceRequirements.add(physicalResourceRequirement);\r
339         }\r
340 \r
341         VirtualNode virtualRouter = new VirtualNodeBuilder()\r
342                 .setNodeId(new VirtualNodeId(UUID.randomUUID().toString()))\r
343                 .setNodeType(VirtualNode.NodeType.Vrouter)\r
344                 .setVirtualPort(new LinkedList<VirtualPort>())\r
345                 .setPhysicalResourceRequirement(physicalResourceRequirements)\r
346                 .build();\r
347 \r
348         virtualNodes.add(virtualRouter);\r
349 \r
350         ExternalIpPrefixes externalIpPrefixes;\r
351         Property ipPrefixProperty = IntentResolverUtils\r
352                 .getNodeProperty(node.getProperty(), new PropertyName("ip-prefix"));\r
353 \r
354         if ( null == ipPrefixProperty ) {\r
355             externalIpPrefixes = new ExternalIpPrefixesBuilder()\r
356                     .setExternalIpPrefix(new ArrayList<IpPrefix>(0))\r
357                     .build();\r
358         } else {\r
359             List<IpPrefix> ipPrefixes = new ArrayList<IpPrefix>(1);\r
360             IpPrefix ipPrefix = new IpPrefix(\r
361                     new Ipv4Prefix(ipPrefixProperty.getPropertyValues().getStringValue().get(0).getValue()));\r
362             ipPrefixes.add(ipPrefix);\r
363 \r
364             externalIpPrefixes = new ExternalIpPrefixesBuilder()\r
365                     .setExternalIpPrefix(ipPrefixes)\r
366                     .build();\r
367         }\r
368 \r
369         List<VirtualLink> virtualLinks = virtualNetwork.getVirtualLinks().getVirtualLink();\r
370         Set<VirtualNodeId> handledVirtualSwitches = new HashSet<VirtualNodeId>();\r
371         VirtualPort virtualPort;\r
372         VirtualPort virtualPort1;\r
373         VirtualLink virtualLink;\r
374 \r
375         for ( VirtualNode virtualSwitch : virtualSwitches ) {\r
376             virtualPort = new VirtualPortBuilder()\r
377                     .setPortId(new VirtualPortId(UUID.randomUUID().toString()))\r
378                     .setPortType(VirtualPort.PortType.Internal)\r
379                     .setExternalIpPrefixes(externalIpPrefixes)\r
380                     .build();\r
381             virtualRouter.getVirtualPort().add(virtualPort);\r
382 \r
383             virtualPort1 = new VirtualPortBuilder()\r
384                     .setPortId(new VirtualPortId(UUID.randomUUID().toString()))\r
385                     .setPortType(VirtualPort.PortType.Internal)\r
386                     .build();\r
387             virtualSwitch.getVirtualPort().add(virtualPort1);\r
388 \r
389             virtualLink = new VirtualLinkBuilder()\r
390                     .setLinkId(new VirtualLinkId(UUID.randomUUID().toString()))\r
391                     .setSrcNodeId(virtualRouter.getNodeId())\r
392                     .setSrcPortId(virtualPort.getPortId())\r
393                     .setDestNodeId(virtualSwitch.getNodeId())\r
394                     .setDestPortId(virtualPort1.getPortId())\r
395                     .setBandwidth(0L)\r
396                     .build();\r
397             virtualLinks.add(virtualLink);\r
398 \r
399             virtualLink = new VirtualLinkBuilder()\r
400                     .setLinkId(new VirtualLinkId(UUID.randomUUID().toString()))\r
401                     .setSrcNodeId(virtualSwitch.getNodeId())\r
402                     .setSrcPortId(virtualPort1.getPortId())\r
403                     .setDestNodeId(virtualRouter.getNodeId())\r
404                     .setDestPortId(virtualPort.getPortId())\r
405                     .setBandwidth(0L)\r
406                     .build();\r
407             virtualLinks.add(virtualLink);\r
408 \r
409             for ( VirtualNode virtualSwitch1 : virtualSwitches ) {\r
410                 if ( virtualSwitch1.getNodeId().equals(virtualSwitch.getNodeId()) ) {\r
411                     continue;\r
412                 }\r
413 \r
414                 if ( handledVirtualSwitches.contains(virtualSwitch1.getNodeId()) ) {\r
415                     continue;\r
416                 }\r
417 \r
418                 virtualPort = new VirtualPortBuilder()\r
419                         .setPortId(new VirtualPortId(UUID.randomUUID().toString()))\r
420                         .setPortType(VirtualPort.PortType.Internal)\r
421                         .build();\r
422                 virtualSwitch.getVirtualPort().add(virtualPort);\r
423 \r
424                 virtualPort1 = new VirtualPortBuilder()\r
425                         .setPortId(new VirtualPortId(UUID.randomUUID().toString()))\r
426                         .setPortType(VirtualPort.PortType.Internal)\r
427                         .build();\r
428                 virtualSwitch1.getVirtualPort().add(virtualPort1);\r
429 \r
430                 virtualLink = new VirtualLinkBuilder()\r
431                         .setLinkId(new VirtualLinkId(UUID.randomUUID().toString()))\r
432                         .setSrcNodeId(virtualSwitch.getNodeId())\r
433                         .setSrcPortId(virtualPort.getPortId())\r
434                         .setDestNodeId(virtualSwitch1.getNodeId())\r
435                         .setDestPortId(virtualPort1.getPortId())\r
436                         .setBandwidth(0L)\r
437                         .build();\r
438                 virtualLinks.add(virtualLink);\r
439 \r
440                 virtualLink = new VirtualLinkBuilder()\r
441                         .setLinkId(new VirtualLinkId(UUID.randomUUID().toString()))\r
442                         .setSrcNodeId(virtualSwitch1.getNodeId())\r
443                         .setSrcPortId(virtualPort1.getPortId())\r
444                         .setDestNodeId(virtualSwitch.getNodeId())\r
445                         .setDestPortId(virtualPort.getPortId())\r
446                         .setBandwidth(0L)\r
447                         .build();\r
448                 virtualLinks.add(virtualLink);\r
449             }\r
450 \r
451             handledVirtualSwitches.add(virtualSwitch.getNodeId());\r
452         }\r
453 \r
454         List<VirtualResource> virtualResources = new ArrayList<VirtualResource>(1);\r
455         VirtualResource virtualResource = new VirtualResourceBuilder()\r
456                 .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
457                 .setVirtualResourceType(VirtualResource.VirtualResourceType.Vnode)\r
458                 .setVirtualResourceEntityId(new VirtualResourceEntityId(virtualRouter.getNodeId().getValue()))\r
459                 .setOrder(0L)\r
460                 .build();\r
461         virtualResources.add(virtualResource);\r
462 \r
463         intentVnMappingResult = new IntentVnMappingResultBuilder()\r
464                 .setIntentId(new IntentId(node.getNodeId().getValue()))\r
465                 .setIntentType(IntentVnMappingResult.IntentType.Node)\r
466                 .setVirtualResource(virtualResources)\r
467                 .build();\r
468 \r
469         intentVnMappingResults.add(intentVnMappingResult);\r
470 \r
471         return;\r
472     }\r
473 \r
474     /**\r
475      * TODO\r
476      *\r
477      * @param user TODO\r
478      * @param node TODO\r
479      * @param virtualNetwork TODO\r
480      * @param userIntentVnMapping TODO\r
481      */\r
482     protected void resolveLayer3Group(User user, Node node, VirtualNetwork virtualNetwork,\r
483                                       UserIntentVnMapping userIntentVnMapping)\r
484             throws IntentResolutionException {\r
485         // TODO: 1、l3-group的sub-node可能是:l2-group、ext-group(l2)、ext-group(l3)。\r
486         // TODO:    将各个sub-node对应的gateway/access vrouter用vlinks连接(vrouter的vport)。\r
487         // TODO:    特别注意:需为ext-group(l2)创建gateway vrouter。\r
488         // TODO: 2、在data store中,创建vrouter、vports、vlinks。\r
489         // TODO: 3、将intent - vn mapping result写入data store。\r
490         // TODO: 4、将新vrouter、vlinks更新入user对应的算法实例。\r
491         // TODO:    通过算法实例,重新计算全网路由。\r
492         // TODO: 5、在data store中,新增 or 更新vroute。\r
493 \r
494         return;\r
495     }\r
496 \r
497     /**\r
498      * TODO\r
499      *\r
500      * @param user TODO\r
501      * @param node TODO\r
502      * @param virtualNetwork TODO\r
503      * @param userIntentVnMapping TODO\r
504      * @param generatingVirtualRouter TODO\r
505      */\r
506     protected void resolveExternalLayer2Group(User user, Node node, VirtualNetwork virtualNetwork,\r
507                                               UserIntentVnMapping userIntentVnMapping,\r
508                                               boolean generatingVirtualRouter)\r
509             throws IntentResolutionException {\r
510         Property property = IntentResolverUtils\r
511                 .getNodeProperty(node.getProperty(), new PropertyName("location"));\r
512 \r
513         if ( null == property ) {\r
514             throw new IntentResolutionException("Can not get the location property of the node " +\r
515                     node.getNodeId().getValue() + ".");\r
516         }\r
517 \r
518         PhysicalNodeId physicalNodeId = IntentResolverUtils\r
519                 .generatePhysicalNodeIdFromNodeLocationProperty(property);\r
520 \r
521         List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement> physicalResourceRequirements =\r
522                 new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement>(1);\r
523         AttributeValue attributeValue = new AttributeValueBuilder()\r
524                 .setStringValue(physicalNodeId.getValue())\r
525                 .build();\r
526         org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement physicalResourceRequirement =\r
527                 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirementBuilder()\r
528                         .setAttributeName(new AttributeName("location"))\r
529                         .setAttributeValue(attributeValue)\r
530                         .setAttributeMatchPattern(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement.AttributeMatchPattern.Equal)\r
531                         .build();\r
532         physicalResourceRequirements.add(physicalResourceRequirement);\r
533 \r
534         VirtualNode virtualNode = new VirtualNodeBuilder()\r
535                 .setNodeId(new VirtualNodeId(UUID.randomUUID().toString()))\r
536                 .setNodeType(generatingVirtualRouter ? VirtualNode.NodeType.Vrouter : VirtualNode.NodeType.Vswitch)\r
537                 .setVirtualPort(new LinkedList<VirtualPort>())\r
538                 .setPhysicalResourceRequirement(physicalResourceRequirements)\r
539                 .build();\r
540 \r
541         virtualNetwork.getVirtualNodes().getVirtualNode().add(virtualNode);\r
542 \r
543         ExternalMacAddresses externalMacAddresses = new ExternalMacAddressesBuilder()\r
544                 .setExternalMacAddress(new ArrayList<MacAddress>(0))\r
545                 .build();\r
546 \r
547         ExternalIpPrefixes externalIpPrefixes = null;\r
548 \r
549         if ( generatingVirtualRouter ) {\r
550             Property property1 = IntentResolverUtils\r
551                     .getNodeProperty(node.getProperty(), new PropertyName("ip-prefix"));\r
552 \r
553             if ( null != property1 ) {\r
554                 List<IpPrefix> ipPrefixes = new ArrayList<IpPrefix>(1);\r
555                 IpPrefix ipPrefix = new IpPrefix(\r
556                         new Ipv4Prefix(property1.getPropertyValues().getStringValue().get(0).getValue()));\r
557                 ipPrefixes.add(ipPrefix);\r
558 \r
559                 externalIpPrefixes = new ExternalIpPrefixesBuilder()\r
560                         .setExternalIpPrefix(ipPrefixes)\r
561                         .build();\r
562             } else {\r
563                 externalIpPrefixes = new ExternalIpPrefixesBuilder()\r
564                         .setExternalIpPrefix(new ArrayList<IpPrefix>(0))\r
565                         .build();\r
566             }\r
567         }\r
568 \r
569         List<PhysicalResourceRequirement> physicalResourceRequirements1 =\r
570                 new ArrayList<PhysicalResourceRequirement>(1);\r
571         AttributeValue attributeValue1 = new AttributeValueBuilder()\r
572                 .setStringValue(property.getPropertyValues().getStringValue().get(0).getValue())\r
573                 .build();\r
574         PhysicalResourceRequirement physicalResourceRequirement1 = new PhysicalResourceRequirementBuilder()\r
575                 .setAttributeName(new AttributeName("location"))\r
576                 .setAttributeValue(attributeValue1)\r
577                 .setAttributeMatchPattern(PhysicalResourceRequirement.AttributeMatchPattern.Equal)\r
578                 .build();\r
579         physicalResourceRequirements1.add(physicalResourceRequirement1);\r
580 \r
581         VirtualPort virtualPort = new VirtualPortBuilder()\r
582                 .setPortId(new VirtualPortId(UUID.randomUUID().toString()))\r
583                 .setPortType(VirtualPort.PortType.External)\r
584                 .setExternalMacAddresses(externalMacAddresses)\r
585                 .setExternalIpPrefixes(externalIpPrefixes)\r
586                 .setPhysicalResourceRequirement(physicalResourceRequirements1)\r
587                 .build();\r
588 \r
589         virtualNode.getVirtualPort().add(virtualPort);\r
590 \r
591         List<VirtualResource> virtualResources = new ArrayList<VirtualResource>(1);\r
592         VirtualResource virtualResource = new VirtualResourceBuilder()\r
593                 .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
594                 .setVirtualResourceType(VirtualResource.VirtualResourceType.Vport)\r
595                 .setVirtualResourceEntityId(new VirtualResourceEntityId(virtualPort.getPortId().getValue()))\r
596                 .setParentVirtualResourceEntityId(new VirtualResourceEntityId(virtualNode.getNodeId().getValue()))\r
597                 .setOrder(0L)\r
598                 .build();\r
599         virtualResources.add(virtualResource);\r
600 \r
601         IntentVnMappingResult intentVnMappingResult = new IntentVnMappingResultBuilder()\r
602                 .setIntentId(new IntentId(node.getNodeId().getValue()))\r
603                 .setIntentType(IntentVnMappingResult.IntentType.Node)\r
604                 .setVirtualResource(virtualResources)\r
605                 .build();\r
606 \r
607         userIntentVnMapping.getIntentVnMappingResult().add(intentVnMappingResult);\r
608 \r
609         return;\r
610     }\r
611 \r
612     /**\r
613      * TODO\r
614      *\r
615      * @param user TODO\r
616      * @param node TODO\r
617      * @param virtualNetwork TODO\r
618      * @param userIntentVnMapping TODO\r
619      */\r
620     protected void resolveExternalLayer3Group(User user, Node node, VirtualNetwork virtualNetwork,\r
621                                               UserIntentVnMapping userIntentVnMapping)\r
622             throws IntentResolutionException {\r
623         Property property = IntentResolverUtils\r
624                 .getNodeProperty(node.getProperty(), new PropertyName("location"));\r
625 \r
626         if ( null == property ) {\r
627             throw new IntentResolutionException("Can not get the location property of the node " +\r
628                     node.getNodeId().getValue() + ".");\r
629         }\r
630 \r
631         PhysicalNodeId physicalNodeId = IntentResolverUtils\r
632                 .generatePhysicalNodeIdFromNodeLocationProperty(property);\r
633 \r
634         List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement> physicalResourceRequirements =\r
635                 new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement>(1);\r
636         AttributeValue attributeValue = new AttributeValueBuilder()\r
637                 .setStringValue(physicalNodeId.getValue())\r
638                 .build();\r
639         org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement physicalResourceRequirement =\r
640                 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirementBuilder()\r
641                         .setAttributeName(new AttributeName("location"))\r
642                         .setAttributeValue(attributeValue)\r
643                         .setAttributeMatchPattern(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement.AttributeMatchPattern.Equal)\r
644                         .build();\r
645         physicalResourceRequirements.add(physicalResourceRequirement);\r
646 \r
647         VirtualNode virtualNode = new VirtualNodeBuilder()\r
648                 .setNodeId(new VirtualNodeId(UUID.randomUUID().toString()))\r
649                 .setNodeType(VirtualNode.NodeType.Vrouter)\r
650                 .setVirtualPort(new LinkedList<VirtualPort>())\r
651                 .setPhysicalResourceRequirement(physicalResourceRequirements)\r
652                 .build();\r
653 \r
654         virtualNetwork.getVirtualNodes().getVirtualNode().add(virtualNode);\r
655 \r
656         ExternalIpPrefixes externalIpPrefixes;\r
657         Property property1 = IntentResolverUtils\r
658                 .getNodeProperty(node.getProperty(), new PropertyName("ip-prefix"));\r
659 \r
660         if ( null != property1 ) {\r
661             List<IpPrefix> ipPrefixes =\r
662                     new ArrayList<IpPrefix>(property1.getPropertyValues().getStringValue().size());\r
663             IpPrefix ipPrefix;\r
664 \r
665             for ( StringValue stringValue : property1.getPropertyValues().getStringValue() ) {\r
666                 ipPrefix = new IpPrefix(new Ipv4Prefix(stringValue.getValue()));\r
667                 ipPrefixes.add(ipPrefix);\r
668             }\r
669 \r
670             externalIpPrefixes = new ExternalIpPrefixesBuilder()\r
671                     .setExternalIpPrefix(ipPrefixes)\r
672                     .build();\r
673         } else {\r
674             externalIpPrefixes = new ExternalIpPrefixesBuilder()\r
675                     .setExternalIpPrefix(new ArrayList<IpPrefix>(0))\r
676                     .build();\r
677         }\r
678 \r
679         List<PhysicalResourceRequirement> physicalResourceRequirements1 =\r
680                 new ArrayList<PhysicalResourceRequirement>(1);\r
681         AttributeValue attributeValue1 = new AttributeValueBuilder()\r
682                 .setStringValue(property.getPropertyValues().getStringValue().get(0).getValue())\r
683                 .build();\r
684         PhysicalResourceRequirement physicalResourceRequirement1 = new PhysicalResourceRequirementBuilder()\r
685                 .setAttributeName(new AttributeName("location"))\r
686                 .setAttributeValue(attributeValue1)\r
687                 .setAttributeMatchPattern(PhysicalResourceRequirement.AttributeMatchPattern.Equal)\r
688                 .build();\r
689         physicalResourceRequirements1.add(physicalResourceRequirement1);\r
690 \r
691         VirtualPort virtualPort = new VirtualPortBuilder()\r
692                 .setPortId(new VirtualPortId(UUID.randomUUID().toString()))\r
693                 .setPortType(VirtualPort.PortType.External)\r
694                 .setExternalIpPrefixes(externalIpPrefixes)\r
695                 .setPhysicalResourceRequirement(physicalResourceRequirements1)\r
696                 .build();\r
697 \r
698         virtualNode.getVirtualPort().add(virtualPort);\r
699 \r
700         List<VirtualResource> virtualResources = new ArrayList<VirtualResource>(1);\r
701         VirtualResource virtualResource = new VirtualResourceBuilder()\r
702                 .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
703                 .setVirtualResourceType(VirtualResource.VirtualResourceType.Vport)\r
704                 .setVirtualResourceEntityId(new VirtualResourceEntityId(virtualPort.getPortId().getValue()))\r
705                 .setParentVirtualResourceEntityId(new VirtualResourceEntityId(virtualNode.getNodeId().getValue()))\r
706                 .setOrder(0L)\r
707                 .build();\r
708         virtualResources.add(virtualResource);\r
709 \r
710         IntentVnMappingResult intentVnMappingResult = new IntentVnMappingResultBuilder()\r
711                 .setIntentId(new IntentId(node.getNodeId().getValue()))\r
712                 .setIntentType(IntentVnMappingResult.IntentType.Node)\r
713                 .setVirtualResource(virtualResources)\r
714                 .build();\r
715 \r
716         userIntentVnMapping.getIntentVnMappingResult().add(intentVnMappingResult);\r
717 \r
718         return;\r
719     }\r
720 \r
721     /**\r
722      * TODO\r
723      *\r
724      * @param user TODO\r
725      * @param node TODO\r
726      * @param virtualNetwork TODO\r
727      * @param userIntentVnMapping TODO\r
728      */\r
729     protected void resolveServiceChainGroup(User user, Node node, VirtualNetwork virtualNetwork,\r
730                                             UserIntentVnMapping userIntentVnMapping)\r
731             throws IntentResolutionException {\r
732         List<SubNode> subNodes = node.getSubNode();\r
733 \r
734         if ( !subNodes.isEmpty() ) {\r
735             List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
736             List<VirtualResource> virtualResources = new LinkedList<VirtualResource>();\r
737 \r
738             if ( 1 == subNodes.size() ) {\r
739                 SubNode subNode = subNodes.get(0);\r
740                 IntentVnMappingResult intentVnMappingResult = IntentResolverUtils\r
741                         .getIntentVnMappingResult(intentVnMappingResults, new IntentId(subNode.getNodeId().getValue()));\r
742 \r
743                 if ( null == intentVnMappingResult ) {\r
744                     throw new IntentResolutionException("Can not get the intent-vn mapping result for " +\r
745                             "the node " + subNode.getNodeId().getValue() + ".");\r
746                 }\r
747 \r
748                 VirtualResource virtualResource = intentVnMappingResult.getVirtualResource().get(0);\r
749                 virtualResource = new VirtualResourceBuilder(virtualResource)\r
750                         .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
751                         .setOrder(0L)\r
752                         .build();\r
753                 virtualResources.add(virtualResource);\r
754             } else {\r
755                 subNodes = IntentResolverUtils.sortSubNodes(subNodes);\r
756                 List<Node> nodes = user.getObjects().getNode();\r
757                 Iterator<SubNode> iterator = subNodes.iterator();\r
758                 SubNode subNode1 = iterator.next();\r
759                 SubNode subNode2;\r
760                 IntentVnMappingResult intentVnMappingResult;\r
761                 VirtualResource virtualResource;\r
762 \r
763                 if ( IntentResolverUtils.checkAllLayer2OperatingMode(subNodes, nodes) ) {\r
764                     // TODO\r
765                 } else if ( IntentResolverUtils.checkAllLayer3OperatingMode(subNodes, nodes) ) {\r
766                     List<VirtualNode> virtualNodes = virtualNetwork.getVirtualNodes().getVirtualNode();\r
767                     List<VirtualLink> virtualLinks = virtualNetwork.getVirtualLinks().getVirtualLink();\r
768                     List<VirtualPath> virtualPaths = virtualNetwork.getVirtualPaths().getVirtualPath();\r
769                     VirtualNodeId virtualNodeId1;\r
770                     VirtualNodeId virtualNodeId2;\r
771                     VirtualNode virtualNode1 = null;\r
772                     VirtualNode virtualNode2 = null;\r
773                     VirtualPort virtualPort1;\r
774                     VirtualPort virtualPort2;\r
775                     VirtualLink virtualLink;\r
776                     List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLink> virtualLinks1;\r
777                     org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLink virtualLink1;\r
778                     VirtualPath virtualPath;\r
779 \r
780                     intentVnMappingResult = IntentResolverUtils.getIntentVnMappingResult(intentVnMappingResults,\r
781                             new IntentId(subNode1.getNodeId().getValue()));\r
782 \r
783                     if ( null == intentVnMappingResult ) {\r
784                         throw new IntentResolutionException("Can not get the intent-vn mapping result for " +\r
785                                 "the node " + subNode1.getNodeId().getValue() + ".");\r
786                     }\r
787 \r
788                     virtualResource = intentVnMappingResult.getVirtualResource().get(0);\r
789                     virtualResource = new VirtualResourceBuilder(virtualResource)\r
790                             .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
791                             .setOrder(0L)\r
792                             .build();\r
793                     virtualResources.add(virtualResource);\r
794 \r
795                     virtualNodeId1 = new VirtualNodeId(intentVnMappingResult.getVirtualResource().get(0)\r
796                             .getParentVirtualResourceEntityId().getValue());\r
797 \r
798                     while ( iterator.hasNext() ) {\r
799                         subNode2 = iterator.next();\r
800                         intentVnMappingResult = IntentResolverUtils.getIntentVnMappingResult(intentVnMappingResults,\r
801                                 new IntentId(subNode2.getNodeId().getValue()));\r
802 \r
803                         if ( null == intentVnMappingResult ) {\r
804                             throw new IntentResolutionException("Can not get the intent-vn mapping result " +\r
805                                     "for the node " + subNode2.getNodeId().getValue() + ".");\r
806                         }\r
807 \r
808                         virtualNodeId2 = new VirtualNodeId(intentVnMappingResult.getVirtualResource().get(0)\r
809                                 .getParentVirtualResourceEntityId().getValue());\r
810                         virtualLink = IntentResolverUtils.getVirtualLink(virtualLinks, virtualNodeId1, virtualNodeId2);\r
811 \r
812                         if ( null == virtualLink ) {\r
813                             if ( null == virtualNode1 ) {\r
814                                 virtualNode1 = IntentResolverUtils.getVirtualNode(virtualNodes, virtualNodeId1);\r
815 \r
816                                 if ( null == virtualNode1 ) {\r
817                                     throw new IntentResolutionException("Can not get the virtual node " +\r
818                                             "created for the node " + subNode1.getNodeId().getValue() + ".");\r
819                                 }\r
820                             }\r
821 \r
822                             virtualNode2 = IntentResolverUtils.getVirtualNode(virtualNodes, virtualNodeId2);\r
823 \r
824                             if ( null == virtualNode2 ) {\r
825                                 throw new IntentResolutionException("Can not get the virtual node created " +\r
826                                         "for the node " + subNode2.getNodeId().getValue() + ".");\r
827                             }\r
828 \r
829                             virtualPort1 = new VirtualPortBuilder()\r
830                                     .setPortId(new VirtualPortId(UUID.randomUUID().toString()))\r
831                                     .setPortType(VirtualPort.PortType.Internal)\r
832                                     .build();\r
833                             virtualNode1.getVirtualPort().add(virtualPort1);\r
834 \r
835                             virtualPort2 = new VirtualPortBuilder()\r
836                                     .setPortId(new VirtualPortId(UUID.randomUUID().toString()))\r
837                                     .setPortType(VirtualPort.PortType.Internal)\r
838                                     .build();\r
839                             virtualNode2.getVirtualPort().add(virtualPort2);\r
840 \r
841                             virtualLink = new VirtualLinkBuilder()\r
842                                     .setLinkId(new VirtualLinkId(UUID.randomUUID().toString()))\r
843                                     .setSrcNodeId(virtualNodeId2)\r
844                                     .setSrcPortId(virtualPort2.getPortId())\r
845                                     .setDestNodeId(virtualNodeId1)\r
846                                     .setDestPortId(virtualPort1.getPortId())\r
847                                     .setBandwidth(0L)\r
848                                     .build();\r
849                             virtualLinks.add(virtualLink);\r
850 \r
851                             virtualLink = new VirtualLinkBuilder()\r
852                                     .setLinkId(new VirtualLinkId(UUID.randomUUID().toString()))\r
853                                     .setSrcNodeId(virtualNodeId1)\r
854                                     .setSrcPortId(virtualPort1.getPortId())\r
855                                     .setDestNodeId(virtualNodeId2)\r
856                                     .setDestPortId(virtualPort2.getPortId())\r
857                                     .setBandwidth(0L)\r
858                                     .build();\r
859                             virtualLinks.add(virtualLink);\r
860                         }\r
861 \r
862                         virtualLinks1 = new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLink>(1);\r
863                         virtualLink1 = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLinkBuilder()\r
864                                 .setLinkId(virtualLink.getLinkId())\r
865                                 .setOrder(0L)\r
866                                 .build();\r
867                         virtualLinks1.add(virtualLink1);\r
868 \r
869                         virtualPath = new VirtualPathBuilder()\r
870                                 .setPathId(new VirtualPathId(UUID.randomUUID().toString()))\r
871                                 .setVirtualLink(virtualLinks1)\r
872                                 .setBandwidth(0L)\r
873                                 .build();\r
874                         virtualPaths.add(virtualPath);\r
875 \r
876                         virtualResource = new VirtualResourceBuilder()\r
877                                 .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
878                                 .setVirtualResourceType(VirtualResource.VirtualResourceType.Vpath)\r
879                                 .setVirtualResourceEntityId(new VirtualResourceEntityId(virtualPath.getPathId().getValue()))\r
880                                 .setOrder((long) virtualResources.size())\r
881                                 .build();\r
882                         virtualResources.add(virtualResource);\r
883 \r
884                         virtualResource = intentVnMappingResult.getVirtualResource().get(0);\r
885                         virtualResource = new VirtualResourceBuilder(virtualResource)\r
886                                 .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
887                                 .setOrder((long) virtualResources.size())\r
888                                 .build();\r
889                         virtualResources.add(virtualResource);\r
890 \r
891                         subNode1 = subNode2;\r
892                         virtualNodeId1 = virtualNodeId2;\r
893                         virtualNode1 = virtualNode2;\r
894                         virtualNode2 = null;\r
895                     }\r
896                 } else {\r
897                     // TODO\r
898                 }\r
899             }\r
900 \r
901             IntentVnMappingResult intentVnMappingResult = new IntentVnMappingResultBuilder()\r
902                     .setIntentId(new IntentId(node.getNodeId().getValue()))\r
903                     .setIntentType(IntentVnMappingResult.IntentType.Node)\r
904                     .setVirtualResource(virtualResources)\r
905                     .build();\r
906 \r
907             intentVnMappingResults.add(intentVnMappingResult);\r
908         }\r
909 \r
910         return;\r
911     }\r
912 \r
913     /**\r
914      * TODO\r
915      *\r
916      * @param user TODO\r
917      * @param node TODO\r
918      * @param virtualNetwork TODO\r
919      * @param userIntentVnMapping TODO\r
920      */\r
921     protected void resolveServiceFunction(User user, Node node, VirtualNetwork virtualNetwork,\r
922                                           UserIntentVnMapping userIntentVnMapping)\r
923             throws IntentResolutionException {\r
924         Property locationProperty = IntentResolverUtils\r
925                 .getNodeProperty(node.getProperty(), new PropertyName("location"));\r
926 \r
927         if ( null == locationProperty ) {\r
928             throw new IntentResolutionException("Can not get the location property of the node " +\r
929                     node.getNodeId().getValue() + ".");\r
930         }\r
931 \r
932         Property operatingModeProperty = IntentResolverUtils\r
933                 .getNodeProperty(node.getProperty(), new PropertyName("operating-mode"));\r
934 \r
935         if ( null == operatingModeProperty ) {\r
936             throw new IntentResolutionException("Can not get the operating mode property of the node " +\r
937                     node.getNodeId().getValue() + ".");\r
938         }\r
939 \r
940         PhysicalNodeId physicalNodeId = IntentResolverUtils\r
941                 .generatePhysicalNodeIdFromNodeLocationProperty(locationProperty);\r
942 \r
943         List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement> physicalResourceRequirements =\r
944                 new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement>(1);\r
945         AttributeValue attributeValue = new AttributeValueBuilder()\r
946                 .setStringValue(physicalNodeId.getValue())\r
947                 .build();\r
948         org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement physicalResourceRequirement =\r
949                 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirementBuilder()\r
950                         .setAttributeName(new AttributeName("location"))\r
951                         .setAttributeValue(attributeValue)\r
952                         .setAttributeMatchPattern(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement.AttributeMatchPattern.Equal)\r
953                         .build();\r
954         physicalResourceRequirements.add(physicalResourceRequirement);\r
955 \r
956         String operatingModePropertyValue =\r
957                 operatingModeProperty.getPropertyValues().getStringValue().get(0).getValue();\r
958 \r
959         VirtualNode virtualNode = new VirtualNodeBuilder()\r
960                 .setNodeId(new VirtualNodeId(UUID.randomUUID().toString()))\r
961                 .setNodeType(operatingModePropertyValue.equals("layer3") ?\r
962                         VirtualNode.NodeType.Vrouter : VirtualNode.NodeType.Vswitch)\r
963                 .setVirtualPort(new LinkedList<VirtualPort>())\r
964                 .setPhysicalResourceRequirement(physicalResourceRequirements)\r
965                 .build();\r
966 \r
967         virtualNetwork.getVirtualNodes().getVirtualNode().add(virtualNode);\r
968 \r
969         ExternalMacAddresses externalMacAddresses = null;\r
970         ExternalIpPrefixes externalIpPrefixes = null;\r
971 \r
972         if ( operatingModePropertyValue.equals("layer2") ) {\r
973             externalMacAddresses = new ExternalMacAddressesBuilder()\r
974                     .setExternalMacAddress(new ArrayList<MacAddress>(0))\r
975                     .build();\r
976         } else {\r
977             externalIpPrefixes = new ExternalIpPrefixesBuilder()\r
978                     .setExternalIpPrefix(new ArrayList<IpPrefix>(0))\r
979                     .build();\r
980         }\r
981 \r
982         List<PhysicalResourceRequirement> physicalResourceRequirements1 =\r
983                 new ArrayList<PhysicalResourceRequirement>(1);\r
984         AttributeValue attributeValue1 = new AttributeValueBuilder()\r
985                 .setStringValue(locationProperty.getPropertyValues().getStringValue().get(0).getValue())\r
986                 .build();\r
987         PhysicalResourceRequirement physicalResourceRequirement1 = new PhysicalResourceRequirementBuilder()\r
988                 .setAttributeName(new AttributeName("location"))\r
989                 .setAttributeValue(attributeValue1)\r
990                 .setAttributeMatchPattern(PhysicalResourceRequirement.AttributeMatchPattern.Equal)\r
991                 .build();\r
992         physicalResourceRequirements1.add(physicalResourceRequirement1);\r
993 \r
994         VirtualPort virtualPort = new VirtualPortBuilder()\r
995                 .setPortId(new VirtualPortId(UUID.randomUUID().toString()))\r
996                 .setPortType(VirtualPort.PortType.External)\r
997                 .setExternalMacAddresses(externalMacAddresses)\r
998                 .setExternalIpPrefixes(externalIpPrefixes)\r
999                 .setPhysicalResourceRequirement(physicalResourceRequirements1)\r
1000                 .build();\r
1001 \r
1002         virtualNode.getVirtualPort().add(virtualPort);\r
1003 \r
1004         if ( operatingModePropertyValue.equals("layer2") ) {\r
1005             // TODO: Connect to all virtual switches in the same layer2 group.\r
1006         }\r
1007 \r
1008         List<VirtualResource> virtualResources = new ArrayList<VirtualResource>(1);\r
1009         VirtualResource virtualResource = new VirtualResourceBuilder()\r
1010                 .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
1011                 .setVirtualResourceType(VirtualResource.VirtualResourceType.Vport)\r
1012                 .setVirtualResourceEntityId(new VirtualResourceEntityId(virtualPort.getPortId().getValue()))\r
1013                 .setParentVirtualResourceEntityId(new VirtualResourceEntityId(virtualNode.getNodeId().getValue()))\r
1014                 .setOrder(0L)\r
1015                 .build();\r
1016         virtualResources.add(virtualResource);\r
1017 \r
1018         IntentVnMappingResult intentVnMappingResult = new IntentVnMappingResultBuilder()\r
1019                 .setIntentId(new IntentId(node.getNodeId().getValue()))\r
1020                 .setIntentType(IntentVnMappingResult.IntentType.Node)\r
1021                 .setVirtualResource(virtualResources)\r
1022                 .build();\r
1023 \r
1024         userIntentVnMapping.getIntentVnMappingResult().add(intentVnMappingResult);\r
1025 \r
1026         return;\r
1027     }\r
1028 }\r