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