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