2 * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.
\r
4 * This program and the accompanying materials are made available under the
\r
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
\r
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
\r
9 package org.opendaylight.nemo.intent.computation;
\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.DataChangeListener;
\r
14 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
\r
15 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
\r
16 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
\r
17 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalNetwork;
\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalNodeAttributeDefinitions;
\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalPortAttributeDefinitions;
\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.attribute.definition.AttributeMatchPatterns;
\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.attribute.instance.attribute.value.RangeValue;
\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.PhysicalLinks;
\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.PhysicalNodes;
\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLink;
\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNode;
\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.paths.PhysicalPath;
\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.paths.PhysicalPathBuilder;
\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.attribute.definitions.PhysicalNodeAttributeDefinition;
\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.attribute.definitions.PhysicalNodeAttributeDefinitionKey;
\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.PhysicalPort;
\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.port.attribute.definitions.PhysicalPortAttributeDefinition;
\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.port.attribute.definitions.PhysicalPortAttributeDefinitionKey;
\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.port.instance.Attribute;
\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.VirtualNetwork;
\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.links.VirtualLink;
\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.links.VirtualLinkBuilder;
\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.nodes.VirtualNode;
\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.VirtualPort;
\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.port.instance.PhysicalResourceRequirement;
\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.PhysicalResourceInstance;
\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.VirtualResourceInstance;
\r
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.vn.pn.mapping.results.UserVnPnMapping;
\r
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.vn.pn.mapping.results.user.vn.pn.mapping.VnPnMappingResult;
\r
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.vn.pn.mapping.results.user.vn.pn.mapping.VnPnMappingResultBuilder;
\r
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.*;
\r
47 import org.opendaylight.yangtools.concepts.ListenerRegistration;
\r
48 import org.opendaylight.yangtools.yang.binding.DataObject;
\r
49 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
\r
50 import org.slf4j.Logger;
\r
51 import org.slf4j.LoggerFactory;
\r
54 import java.util.concurrent.ExecutionException;
\r
57 * The virtual network mapping unit implements the following functions:
\r
58 * (1) Automatically perform the virtual network mapping when the user's
\r
59 * virtual network changed, which is subscribed from the data store.
\r
60 * (2) Automatically perform the remapping for the virtual networks that
\r
61 * are influenced by the changes of the underlying physical network
\r
62 * which are also subscribed from the data store.
\r
64 * @author Zhigang Ji
\r
66 public class VNMappingUnit implements AutoCloseable {
\r
67 private static final Logger LOG = LoggerFactory.getLogger(VNMappingUnit.class);
\r
69 private final DataBroker dataBroker;
\r
72 * The physical network computation unit.
\r
74 private PNComputationUnit pnComputationUnit;
\r
77 * The registrations for the physical port change listeners.
\r
79 private Map<PhysicalNodeId, Map<PhysicalPortId, ListenerRegistration<DataChangeListener>>> physicalPortChangeListenerRegs;
\r
82 * The registration for the physical node change listener.
\r
84 private ListenerRegistration<DataChangeListener> physicalNodeChangeListenerReg;
\r
87 * The registration for the physical link change listener.
\r
89 private ListenerRegistration<DataChangeListener> physicalLinkChangeListenerReg;
\r
91 public VNMappingUnit(DataBroker dataBroker, PNComputationUnit pnComputationUnit) {
\r
94 this.dataBroker = dataBroker;
\r
95 this.pnComputationUnit = pnComputationUnit;
\r
97 physicalPortChangeListenerRegs =
\r
98 new HashMap<PhysicalNodeId, Map<PhysicalPortId, ListenerRegistration<DataChangeListener>>>();
\r
100 InstanceIdentifier<PhysicalNode> physicalNodeIid = InstanceIdentifier
\r
101 .builder(PhysicalNetwork.class)
\r
102 .child(PhysicalNodes.class)
\r
103 .child(PhysicalNode.class)
\r
105 InstanceIdentifier<PhysicalLink> physicalLinkIid = InstanceIdentifier
\r
106 .builder(PhysicalNetwork.class)
\r
107 .child(PhysicalLinks.class)
\r
108 .child(PhysicalLink.class)
\r
111 physicalNodeChangeListenerReg = dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,
\r
112 physicalNodeIid, new PhysicalNodeChangeListener(), DataChangeScope.BASE);
\r
113 physicalLinkChangeListenerReg = dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,
\r
114 physicalLinkIid, new PhysicalLinkChangeListener(), DataChangeScope.BASE);
\r
116 LOG.debug("Initialized the virtual network mapping unit.");
\r
124 * @param virtualNetwork TODO
\r
125 * @param userVnPnMapping TODO
\r
126 * @param physicalPaths TODO
\r
128 public void virtualNetworkMapping(VirtualNetwork virtualNetwork, UserVnPnMapping userVnPnMapping,
\r
129 List<PhysicalPath> physicalPaths)
\r
130 throws VNMappingException {
\r
131 ReadOnlyTransaction readOnlyTransaction = dataBroker.newReadOnlyTransaction();
\r
133 InstanceIdentifier<PhysicalNodes> physicalNodesIid = InstanceIdentifier
\r
134 .builder(PhysicalNetwork.class)
\r
135 .child(PhysicalNodes.class)
\r
137 Optional<PhysicalNodes> result;
\r
140 result = readOnlyTransaction.read(LogicalDatastoreType.OPERATIONAL, physicalNodesIid).get();
\r
141 } catch ( InterruptedException | ExecutionException exception ) {
\r
142 throw new VNMappingException("Can not read the physical nodes.");
\r
145 PhysicalNodes physicalNodes = result.get();
\r
146 List<PhysicalNode> physicalNodeList = physicalNodes.getPhysicalNode();
\r
148 List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();
\r
149 List<VirtualNode> virtualNodes = virtualNetwork.getVirtualNodes().getVirtualNode();
\r
150 List<VirtualPort> virtualPorts;
\r
151 PhysicalNode physicalNode;
\r
152 PhysicalPort physicalPort;
\r
153 VnPnMappingResult vnPnMappingResult;
\r
155 for ( VirtualNode virtualNode : virtualNodes ) {
\r
156 physicalNode = virtualNodeMapping(virtualNetwork.getNetworkId(), virtualNode, physicalNodeList);
\r
158 if ( null == physicalNode ) {
\r
159 throw new VNMappingException("Failed mapping for the virtual node " +
\r
160 virtualNode.getNodeId().getValue() + " in the virtual network " +
\r
161 virtualNetwork.getNetworkId().getValue());
\r
164 virtualPorts = virtualNode.getVirtualPort();
\r
166 for ( VirtualPort virtualPort : virtualPorts ) {
\r
167 if ( VirtualPort.PortType.External == virtualPort.getPortType() ) {
\r
168 physicalPort = virtualPortMapping(virtualNetwork.getNetworkId(),
\r
169 virtualNode.getNodeId(), virtualPort, physicalNode);
\r
171 if ( null == physicalPort ) {
\r
172 throw new VNMappingException("Failed mapping for the virtual port " +
\r
173 virtualPort.getPortId().getValue() + " of the virtual node " +
\r
174 virtualNode.getNodeId().getValue() + " in the virtual network " +
\r
175 virtualNetwork.getNetworkId().getValue());
\r
178 vnPnMappingResult = new VnPnMappingResultBuilder()
\r
179 .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))
\r
180 .setVirtualResourceType(VirtualResourceInstance.VirtualResourceType.Vport)
\r
181 .setVirtualResourceEntityId(new VirtualResourceEntityId(virtualPort.getPortId().getValue()))
\r
182 .setParentVirtualResourceEntityId(new VirtualResourceEntityId(virtualNode.getNodeId().getValue()))
\r
183 .setPhysicalResourceId(new PhysicalResourceId(UUID.randomUUID().toString()))
\r
184 .setPhysicalResourceType(PhysicalResourceInstance.PhysicalResourceType.Port)
\r
185 .setPhysicalResourceEntityId(new PhysicalResourceEntityId(physicalPort.getPortId().getValue()))
\r
186 .setParentPhysicalResourceEntityId(new PhysicalResourceEntityId(physicalNode.getNodeId().getValue()))
\r
189 vnPnMappingResults.add(vnPnMappingResult);
\r
193 vnPnMappingResult = new VnPnMappingResultBuilder()
\r
194 .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))
\r
195 .setVirtualResourceType(VirtualResourceInstance.VirtualResourceType.Vnode)
\r
196 .setVirtualResourceEntityId(new VirtualResourceEntityId(virtualNode.getNodeId().getValue()))
\r
197 .setPhysicalResourceId(new PhysicalResourceId(UUID.randomUUID().toString()))
\r
198 .setPhysicalResourceType(PhysicalResourceInstance.PhysicalResourceType.Node)
\r
199 .setPhysicalResourceEntityId(new PhysicalResourceEntityId(physicalNode.getNodeId().getValue()))
\r
202 vnPnMappingResults.add(vnPnMappingResult);
\r
205 List<VirtualLink> virtualLinks = virtualNetwork.getVirtualLinks().getVirtualLink();
\r
206 List<VirtualLink> newVirtualLinks = new ArrayList<VirtualLink>(virtualLinks.size());
\r
207 PhysicalPath physicalPath;
\r
208 VirtualLink newVirtualLink;
\r
210 for ( VirtualLink virtualLink : virtualLinks ) {
\r
211 physicalPath = virtualLinkMapping(virtualNetwork.getNetworkId(), virtualLink, userVnPnMapping);
\r
213 if ( null == physicalPath ) {
\r
214 throw new VNMappingException("Failed mapping for the virtual link " +
\r
215 virtualLink.getLinkId().getValue() + " in the virtual network " +
\r
216 virtualNetwork.getNetworkId().getValue());
\r
219 physicalPaths.add(physicalPath);
\r
221 newVirtualLink = new VirtualLinkBuilder(virtualLink)
\r
222 .setMetric(physicalPath.getMetric())
\r
223 .setDelay(physicalPath.getDelay())
\r
226 newVirtualLinks.add(newVirtualLink);
\r
228 vnPnMappingResult = new VnPnMappingResultBuilder()
\r
229 .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))
\r
230 .setVirtualResourceType(VirtualResourceInstance.VirtualResourceType.Vlink)
\r
231 .setVirtualResourceEntityId(new VirtualResourceEntityId(virtualLink.getLinkId().getValue()))
\r
232 .setPhysicalResourceId(new PhysicalResourceId(UUID.randomUUID().toString()))
\r
233 .setPhysicalResourceType(PhysicalResourceInstance.PhysicalResourceType.Path)
\r
234 .setPhysicalResourceEntityId(new PhysicalResourceEntityId(physicalPath.getPathId().getValue()))
\r
237 vnPnMappingResults.add(vnPnMappingResult);
\r
240 virtualLinks.clear();
\r
241 virtualLinks.addAll(newVirtualLinks);
\r
247 public void close() throws Exception {
\r
248 for ( Map<PhysicalPortId, ListenerRegistration<DataChangeListener>>
\r
249 physicalPortChangeListenerRegs1 : physicalPortChangeListenerRegs.values() ) {
\r
250 for ( ListenerRegistration<DataChangeListener>
\r
251 physicalPortChangeListenerReg : physicalPortChangeListenerRegs1.values() ) {
\r
252 if ( null != physicalPortChangeListenerReg ) {
\r
253 physicalPortChangeListenerReg.close();
\r
258 if ( null != physicalNodeChangeListenerReg ) {
\r
259 physicalNodeChangeListenerReg.close();
\r
262 if ( null != physicalLinkChangeListenerReg ) {
\r
263 physicalLinkChangeListenerReg.close();
\r
272 * @param virtualNetworkId TODO
\r
273 * @param virtualNodeId TODO
\r
274 * @param virtualPort TODO
\r
275 * @param physicalNode TODO
\r
278 private PhysicalPort virtualPortMapping(VirtualNetworkId virtualNetworkId, VirtualNodeId virtualNodeId,
\r
279 VirtualPort virtualPort, PhysicalNode physicalNode)
\r
280 throws VNMappingException {
\r
281 if ( VirtualPort.PortType.Internal == virtualPort.getPortType() ) {
\r
285 List<PhysicalPort> physicalPorts = physicalNode.getPhysicalPort();
\r
286 List<PhysicalResourceRequirement> physicalResourceRequirements = virtualPort.getPhysicalResourceRequirement();
\r
288 for ( PhysicalPort physicalPort : physicalPorts ) {
\r
289 if ( PhysicalPort.PortType.External == physicalPort.getPortType()
\r
290 && checkPhysicalPortSatisfied(physicalPort, physicalResourceRequirements) ) {
\r
291 return physicalPort;
\r
301 * @param virtualNetworkId TODO
\r
302 * @param virtualNode TODO
\r
303 * @param physicalNodes TODO
\r
306 private PhysicalNode virtualNodeMapping(VirtualNetworkId virtualNetworkId, VirtualNode virtualNode,
\r
307 List<PhysicalNode> physicalNodes)
\r
308 throws VNMappingException {
\r
309 List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement>
\r
310 physicalResourceRequirements = virtualNode.getPhysicalResourceRequirement();
\r
311 List<PhysicalNode> candidates = new LinkedList<PhysicalNode>();
\r
313 switch ( virtualNode.getNodeType() ) {
\r
315 for ( PhysicalNode physicalNode : physicalNodes ) {
\r
316 if ( PhysicalNode.NodeType.Switch == physicalNode.getNodeType() ) {
\r
317 if ( checkPhysicalNodeSatisfied(physicalNode, physicalResourceRequirements) ) {
\r
318 candidates.add(physicalNode);
\r
325 for ( PhysicalNode physicalNode : physicalNodes ) {
\r
326 if ( PhysicalNode.NodeType.Router == physicalNode.getNodeType() ) {
\r
327 if ( checkPhysicalNodeSatisfied(physicalNode, physicalResourceRequirements) ) {
\r
328 candidates.add(physicalNode);
\r
335 for ( PhysicalNode physicalNode : physicalNodes ) {
\r
336 if ( PhysicalNode.NodeType.Firewall == physicalNode.getNodeType() ) {
\r
337 if ( checkPhysicalNodeSatisfied(physicalNode, physicalResourceRequirements) ) {
\r
338 candidates.add(physicalNode);
\r
344 case Vloadbalancer:
\r
345 for ( PhysicalNode physicalNode : physicalNodes ) {
\r
346 if ( PhysicalNode.NodeType.Loadbalancer == physicalNode.getNodeType() ) {
\r
347 if ( checkPhysicalNodeSatisfied(physicalNode, physicalResourceRequirements) ) {
\r
348 candidates.add(physicalNode);
\r
355 throw new VNMappingException("Unsupported virtual node type " +
\r
356 virtualNode.getNodeType() + ".");
\r
360 if ( candidates.isEmpty() ) {
\r
364 return candidates.get(0);
\r
370 * @param virtualNetworkId TODO
\r
371 * @param virtualLink TODO
\r
372 * @param userVnPnMapping TODO
\r
375 private PhysicalPath virtualLinkMapping(VirtualNetworkId virtualNetworkId, VirtualLink virtualLink,
\r
376 UserVnPnMapping userVnPnMapping)
\r
377 throws VNMappingException {
\r
378 List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();
\r
379 VnPnMappingResult vnPnMappingResult = VNMappingUnitUtils.getVnPnMappingResult(vnPnMappingResults,
\r
380 new VirtualResourceEntityId(virtualLink.getSrcNodeId().getValue()));
\r
382 if ( null == vnPnMappingResult ) {
\r
383 throw new VNMappingException("Can not get the vn-pn mapping result for " +
\r
384 "the virtual node " + virtualLink.getSrcNodeId().getValue());
\r
387 PhysicalNodeId source = new PhysicalNodeId(vnPnMappingResult.getPhysicalResourceEntityId().getValue());
\r
389 vnPnMappingResult = VNMappingUnitUtils.getVnPnMappingResult(vnPnMappingResults,
\r
390 new VirtualResourceEntityId(virtualLink.getDestNodeId().getValue()));
\r
392 if ( null == vnPnMappingResult ) {
\r
393 throw new VNMappingException("Can not get the vn-pn mapping result for " +
\r
394 "the virtual node " + virtualLink.getDestNodeId().getValue());
\r
397 PhysicalNodeId target = new PhysicalNodeId(vnPnMappingResult.getPhysicalResourceEntityId().getValue());
\r
399 if ( source.equals(target) ) {
\r
400 PhysicalPath physicalPath = new PhysicalPathBuilder()
\r
401 .setPathId(new PhysicalPathId(UUID.randomUUID().toString()))
\r
402 .setPhysicalLink(new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.path.instance.PhysicalLink>(0))
\r
404 .setBandwidth(virtualLink.getBandwidth())
\r
408 return physicalPath;
\r
411 PhysicalPath physicalPath;
\r
413 if ( 0 == virtualLink.getBandwidth() ) {
\r
414 physicalPath = pnComputationUnit.computePath(source, target);
\r
416 physicalPath = pnComputationUnit.computePath(source, target, virtualLink.getBandwidth());
\r
419 return physicalPath;
\r
425 * @param physicalPort TODO
\r
426 * @param physicalResourceRequirements TODO
\r
429 private boolean checkPhysicalPortSatisfied(PhysicalPort physicalPort,
\r
430 List<PhysicalResourceRequirement> physicalResourceRequirements)
\r
431 throws VNMappingException {
\r
432 List<Attribute> attributes = physicalPort.getAttribute();
\r
433 Attribute attribute;
\r
435 for ( PhysicalResourceRequirement physicalResourceRequirement : physicalResourceRequirements ) {
\r
436 attribute = getPhysicalPortAttribute(attributes, physicalResourceRequirement.getAttributeName());
\r
438 if ( null == attribute ) {
\r
442 if ( !checkPhysicalPortAttributeSatisfied(attribute, physicalResourceRequirement) ) {
\r
453 * @param physicalNode TODO
\r
454 * @param physicalResourceRequirements TODO
\r
457 private boolean checkPhysicalNodeSatisfied(PhysicalNode physicalNode,
\r
458 List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement>
\r
459 physicalResourceRequirements)
\r
460 throws VNMappingException {
\r
461 List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.Attribute>
\r
462 attributes = physicalNode.getAttribute();
\r
463 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.Attribute attribute;
\r
465 for ( org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement
\r
466 physicalResourceRequirement : physicalResourceRequirements ) {
\r
467 attribute = getPhysicalNodeAttribute(attributes, physicalResourceRequirement.getAttributeName());
\r
469 if ( null == attribute ) {
\r
473 if ( !checkPhysicalNodeAttributeSatisfied(attribute, physicalResourceRequirement) ) {
\r
484 * @param attributes TODO
\r
485 * @param attributeName TODO
\r
488 private Attribute getPhysicalPortAttribute(List<Attribute> attributes, AttributeName attributeName) {
\r
489 for ( Attribute attribute : attributes ) {
\r
490 if ( attribute.getAttributeName().equals(attributeName) ) {
\r
501 * @param attributes TODO
\r
502 * @param attributeName TODO
\r
505 private org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.Attribute getPhysicalNodeAttribute(
\r
506 List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.Attribute> attributes,
\r
507 AttributeName attributeName) {
\r
508 for ( org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.Attribute
\r
509 attribute : attributes ) {
\r
510 if ( attribute.getAttributeName().equals(attributeName) ) {
\r
521 * @param attribute TODO
\r
522 * @param physicalResourceRequirement TODO
\r
525 private boolean checkPhysicalPortAttributeSatisfied(Attribute attribute,
\r
526 PhysicalResourceRequirement physicalResourceRequirement)
\r
527 throws VNMappingException {
\r
528 ReadOnlyTransaction readOnlyTransaction = dataBroker.newReadOnlyTransaction();
\r
530 InstanceIdentifier<PhysicalPortAttributeDefinition> physicalPortAttributeDefinitionIid = InstanceIdentifier
\r
531 .builder(PhysicalPortAttributeDefinitions.class)
\r
532 .child(PhysicalPortAttributeDefinition.class,
\r
533 new PhysicalPortAttributeDefinitionKey(attribute.getAttributeName()))
\r
535 Optional<PhysicalPortAttributeDefinition> result;
\r
538 result = readOnlyTransaction.read(LogicalDatastoreType.CONFIGURATION,
\r
539 physicalPortAttributeDefinitionIid).get();
\r
540 } catch ( InterruptedException | ExecutionException exception ) {
\r
541 throw new VNMappingException("Can not read the physical port attribute definition " +
\r
542 "with attribute name " + attribute.getAttributeName().getValue() + ".");
\r
545 if ( !result.isPresent() ) {
\r
546 throw new VNMappingException("The physical port attribute definition with attribute name " +
\r
547 attribute.getAttributeName().getValue() + " does not exist.");
\r
550 PhysicalPortAttributeDefinition physicalPortAttributeDefinition = result.get();
\r
551 List<AttributeMatchPatterns.AttributeMatchPattern> attributeMatchPatterns
\r
552 = physicalPortAttributeDefinition.getAttributeMatchPatterns().getAttributeMatchPattern();
\r
553 PhysicalResourceRequirement.AttributeMatchPattern attributeMatchPattern
\r
554 = physicalResourceRequirement.getAttributeMatchPattern();
\r
556 if ( !checkAttributeMatchPatternSpecified(attributeMatchPatterns, attributeMatchPattern) ) {
\r
557 throw new VNMappingException("The attribute match pattern " + attributeMatchPattern +
\r
558 " is not specified in the physical port attribute definition " +
\r
559 "with attribute name " + attribute.getAttributeName().getValue() + ".");
\r
562 switch ( physicalPortAttributeDefinition.getAttributeValueType() ) {
\r
564 return checkAttributeStringValueSatisfied(attribute.getAttributeValue().getStringValue(),
\r
565 physicalResourceRequirement.getAttributeValue().getStringValue(), attributeMatchPattern);
\r
568 return checkAttributeIntegerValueSatisfied(attribute.getAttributeValue().getIntValue(),
\r
569 physicalResourceRequirement.getAttributeValue().getIntValue(), attributeMatchPattern);
\r
572 return checkAttributeRangeValueSatisfied(attribute.getAttributeValue().getIntValue(),
\r
573 physicalResourceRequirement.getAttributeValue().getRangeValue(), attributeMatchPattern);
\r
576 throw new VNMappingException("Unsupported physical port attribute value type " +
\r
577 physicalPortAttributeDefinition.getAttributeValueType() + ".");
\r
587 * @param attribute TODO
\r
588 * @param physicalResourceRequirement TODO
\r
591 private boolean checkPhysicalNodeAttributeSatisfied(
\r
592 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.Attribute attribute,
\r
593 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement physicalResourceRequirement)
\r
594 throws VNMappingException {
\r
595 ReadOnlyTransaction readOnlyTransaction = dataBroker.newReadOnlyTransaction();
\r
597 InstanceIdentifier<PhysicalNodeAttributeDefinition> physicalNodeAttributeDefinitionIid = InstanceIdentifier
\r
598 .builder(PhysicalNodeAttributeDefinitions.class)
\r
599 .child(PhysicalNodeAttributeDefinition.class,
\r
600 new PhysicalNodeAttributeDefinitionKey(attribute.getAttributeName()))
\r
602 Optional<PhysicalNodeAttributeDefinition> result;
\r
605 result = readOnlyTransaction.read(LogicalDatastoreType.CONFIGURATION,
\r
606 physicalNodeAttributeDefinitionIid).get();
\r
607 } catch ( InterruptedException | ExecutionException exception ) {
\r
608 throw new VNMappingException("Can not read the physical node attribute definition " +
\r
609 "with attribute name " + attribute.getAttributeName().getValue() + ".");
\r
612 if ( !result.isPresent() ) {
\r
613 throw new VNMappingException("The physical node attribute definition with attribute name " +
\r
614 attribute.getAttributeName().getValue() + " does not exist.");
\r
617 PhysicalNodeAttributeDefinition physicalNodeAttributeDefinition = result.get();
\r
618 List<AttributeMatchPatterns.AttributeMatchPattern> attributeMatchPatterns
\r
619 = physicalNodeAttributeDefinition.getAttributeMatchPatterns().getAttributeMatchPattern();
\r
620 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement.AttributeMatchPattern
\r
621 attributeMatchPattern = physicalResourceRequirement.getAttributeMatchPattern();
\r
623 if ( !checkAttributeMatchPatternSpecified(attributeMatchPatterns, attributeMatchPattern) ) {
\r
624 throw new VNMappingException("The attribute match pattern " + attributeMatchPattern +
\r
625 " is not specified in the physical node attribute definition " +
\r
626 "with attribute name " + attribute.getAttributeName().getValue() + ".");
\r
629 switch ( physicalNodeAttributeDefinition.getAttributeValueType() ) {
\r
631 return checkAttributeStringValueSatisfied(attribute.getAttributeValue().getStringValue(),
\r
632 physicalResourceRequirement.getAttributeValue().getStringValue(), attributeMatchPattern);
\r
635 return checkAttributeIntegerValueSatisfied(attribute.getAttributeValue().getIntValue(),
\r
636 physicalResourceRequirement.getAttributeValue().getIntValue(), attributeMatchPattern);
\r
639 return checkAttributeRangeValueSatisfied(attribute.getAttributeValue().getIntValue(),
\r
640 physicalResourceRequirement.getAttributeValue().getRangeValue(), attributeMatchPattern);
\r
643 throw new VNMappingException("Unsupported physical node attribute value type " +
\r
644 physicalNodeAttributeDefinition.getAttributeValueType() + ".");
\r
654 * @param attributeMatchPatterns TODO
\r
655 * @param attributeMatchPattern TODO
\r
658 private boolean checkAttributeMatchPatternSpecified(List<AttributeMatchPatterns.AttributeMatchPattern> attributeMatchPatterns,
\r
659 PhysicalResourceRequirement.AttributeMatchPattern attributeMatchPattern) {
\r
660 for ( AttributeMatchPatterns.AttributeMatchPattern attributeMatchPattern1 : attributeMatchPatterns ) {
\r
661 if ( attributeMatchPattern1.name().equals(attributeMatchPattern.name()) ) {
\r
672 * @param attributeMatchPatterns TODO
\r
673 * @param attributeMatchPattern TODO
\r
676 private boolean checkAttributeMatchPatternSpecified(List<AttributeMatchPatterns.AttributeMatchPattern> attributeMatchPatterns,
\r
677 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement.AttributeMatchPattern
\r
678 attributeMatchPattern) {
\r
679 for ( AttributeMatchPatterns.AttributeMatchPattern attributeMatchPattern1 : attributeMatchPatterns ) {
\r
680 if ( attributeMatchPattern1.name().equals(attributeMatchPattern.name()) ) {
\r
691 * @param attributeValue TODO
\r
692 * @param requiredAttributeValue TODO
\r
693 * @param attributeMatchPattern TODO
\r
696 private boolean checkAttributeStringValueSatisfied(String attributeValue, String requiredAttributeValue,
\r
697 PhysicalResourceRequirement.AttributeMatchPattern attributeMatchPattern)
\r
698 throws VNMappingException {
\r
699 int result = attributeValue.compareTo(requiredAttributeValue);
\r
701 switch ( attributeMatchPattern ) {
\r
706 return 0 <= result;
\r
709 return 0 == result;
\r
712 return 0 != result;
\r
717 case NotGreaterThan:
\r
718 return 0 >= result;
\r
721 throw new VNMappingException("Unsupported attribute match pattern " +
\r
722 attributeMatchPattern + " for the attribute string value.");
\r
732 * @param attributeValue TODO
\r
733 * @param requiredAttributeValue TODO
\r
734 * @param attributeMatchPattern TODO
\r
737 private boolean checkAttributeStringValueSatisfied(String attributeValue, String requiredAttributeValue,
\r
738 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement.AttributeMatchPattern
\r
739 attributeMatchPattern)
\r
740 throws VNMappingException {
\r
741 int result = attributeValue.compareTo(requiredAttributeValue);
\r
743 switch ( attributeMatchPattern ) {
\r
748 return 0 <= result;
\r
751 return 0 == result;
\r
754 return 0 != result;
\r
759 case NotGreaterThan:
\r
760 return 0 >= result;
\r
763 throw new VNMappingException("Unsupported attribute match pattern " +
\r
764 attributeMatchPattern + " for the attribute string value.");
\r
774 * @param attributeValue TODO
\r
775 * @param requiredAttributeValue TODO
\r
776 * @param attributeMatchPattern TODO
\r
779 private boolean checkAttributeIntegerValueSatisfied(Long attributeValue, Long requiredAttributeValue,
\r
780 PhysicalResourceRequirement.AttributeMatchPattern attributeMatchPattern)
\r
781 throws VNMappingException {
\r
782 int result = attributeValue.compareTo(requiredAttributeValue);
\r
784 switch ( attributeMatchPattern ) {
\r
789 return 0 <= result;
\r
792 return 0 == result;
\r
795 return 0 != result;
\r
800 case NotGreaterThan:
\r
801 return 0 >= result;
\r
804 throw new VNMappingException("Unsupported attribute match pattern " +
\r
805 attributeMatchPattern + " for the attribute integer value.");
\r
815 * @param attributeValue TODO
\r
816 * @param requiredAttributeValue TODO
\r
817 * @param attributeMatchPattern TODO
\r
820 private boolean checkAttributeIntegerValueSatisfied(Long attributeValue, Long requiredAttributeValue,
\r
821 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement.AttributeMatchPattern
\r
822 attributeMatchPattern)
\r
823 throws VNMappingException {
\r
824 int result = attributeValue.compareTo(requiredAttributeValue);
\r
826 switch ( attributeMatchPattern ) {
\r
831 return 0 <= result;
\r
834 return 0 == result;
\r
837 return 0 != result;
\r
842 case NotGreaterThan:
\r
843 return 0 >= result;
\r
846 throw new VNMappingException("Unsupported attribute match pattern " +
\r
847 attributeMatchPattern + " for the attribute integer value.");
\r
857 * @param attributeValue TODO
\r
858 * @param requiredAttributeValue TODO
\r
859 * @param attributeMatchPattern TODO
\r
862 private boolean checkAttributeRangeValueSatisfied(Long attributeValue, RangeValue requiredAttributeValue,
\r
863 PhysicalResourceRequirement.AttributeMatchPattern attributeMatchPattern)
\r
864 throws VNMappingException {
\r
865 switch ( attributeMatchPattern ) {
\r
867 return attributeValue > requiredAttributeValue.getMin()
\r
868 && attributeValue < requiredAttributeValue.getMax();
\r
871 throw new VNMappingException("Unsupported attribute match pattern " +
\r
872 attributeMatchPattern + " for the attribute range value.");
\r
882 * @param attributeValue TODO
\r
883 * @param requiredAttributeValue TODO
\r
884 * @param attributeMatchPattern TODO
\r
887 private boolean checkAttributeRangeValueSatisfied(Long attributeValue, RangeValue requiredAttributeValue,
\r
888 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.PhysicalResourceRequirement.AttributeMatchPattern
\r
889 attributeMatchPattern)
\r
890 throws VNMappingException {
\r
891 switch ( attributeMatchPattern ) {
\r
893 return attributeValue > requiredAttributeValue.getMin()
\r
894 && attributeValue < requiredAttributeValue.getMax();
\r
897 throw new VNMappingException("Unsupported attribute match pattern " +
\r
898 attributeMatchPattern + " for the attribute range value.");
\r
906 // * A listener to change events related to virtual ports being
\r
907 // * added, removed or updated.
\r
909 // * @author Zhigang Ji
\r
911 // private class VirtualPortChangeListener implements DataChangeListener {
\r
913 // * The virtual network that the virtual port belongs to.
\r
915 // private VirtualNetworkId virtualNetworkId;
\r
918 // * The virtual node that the virtual port belongs to.
\r
920 // private VirtualNodeId virtualNodeId;
\r
922 // public VirtualPortChangeListener(VirtualNetworkId virtualNetworkId, VirtualNodeId virtualNodeId) {
\r
925 // this.virtualNetworkId = virtualNetworkId;
\r
926 // this.virtualNodeId = virtualNodeId;
\r
932 // public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
\r
933 // if ( null == change ) {
\r
937 // Map<InstanceIdentifier<?>, DataObject> createdData = change.getCreatedData();
\r
939 // if ( null != createdData && !createdData.isEmpty() ) {
\r
940 // for ( DataObject dataObject : createdData.values() ) {
\r
941 // if ( dataObject instanceof VirtualPort ) {
\r
942 // // TODO: 1、执行端口映射。
\r
950 // * A listener to change events related to virtual nodes being
\r
951 // * added, removed or updated.
\r
953 // * @author Zhigang Ji
\r
955 // private class VirtualNodeChangeListener implements DataChangeListener {
\r
957 // * The virtual network that the virtual node belongs to.
\r
959 // private VirtualNetworkId virtualNetworkId;
\r
961 // public VirtualNodeChangeListener(VirtualNetworkId virtualNetworkId) {
\r
964 // this.virtualNetworkId = virtualNetworkId;
\r
970 // public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
\r
971 // if ( null == change ) {
\r
975 // Map<InstanceIdentifier<?>, DataObject> createdData = change.getCreatedData();
\r
977 // if ( null != createdData && !createdData.isEmpty() ) {
\r
978 // for ( DataObject dataObject : createdData.values() ) {
\r
979 // if ( dataObject instanceof VirtualNode ) {
\r
980 // // TODO: 1、执行节点映射。
\r
981 // // TODO: 2、启动vports监听(external端口),还需监听vnode中vport的增加。
\r
982 // // TODO: 3、读取已有vports,并执行端口映射(external端口)。
\r
990 // * A listener to change events related to virtual links being
\r
991 // * added, removed or updated.
\r
993 // * @author Zhigang Ji
\r
995 // private class VirtualLinkChangeListener implements DataChangeListener {
\r
997 // * The virtual network that the virtual link belongs to.
\r
999 // private VirtualNetworkId virtualNetworkId;
\r
1001 // public VirtualLinkChangeListener(VirtualNetworkId virtualNetworkId) {
\r
1004 // this.virtualNetworkId = virtualNetworkId;
\r
1010 // public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
\r
1011 // if ( null == change ) {
\r
1015 // Map<InstanceIdentifier<?>, DataObject> createdData = change.getCreatedData();
\r
1017 // if ( null != createdData && !createdData.isEmpty() ) {
\r
1018 // for ( DataObject dataObject : createdData.values() ) {
\r
1019 // if ( dataObject instanceof VirtualLink ) {
\r
1020 // // TODO: 1、执行链路映射(两端vport映射结果可不写)。
\r
1028 * A listener to change events related to physical ports being
\r
1029 * added, removed or updated.
\r
1031 * @author Zhigang Ji
\r
1033 private class PhysicalPortChangeListener implements DataChangeListener {
\r
1035 * The physical node that the physical port belongs to.
\r
1037 private PhysicalNodeId physicalNodeId;
\r
1039 public PhysicalPortChangeListener(PhysicalNodeId physicalNodeId) {
\r
1042 this.physicalNodeId = physicalNodeId;
\r
1048 public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
\r
1049 if ( null == change ) {
\r
1053 Map<InstanceIdentifier<?>, DataObject> originalData = change.getOriginalData();
\r
1054 Map<InstanceIdentifier<?>, DataObject> updatedData = change.getUpdatedData();
\r
1056 if ( null != updatedData && !updatedData.isEmpty() ) {
\r
1057 for ( DataObject dataObject : updatedData.values() ) {
\r
1062 Set<InstanceIdentifier<?>> removedPaths = change.getRemovedPaths();
\r
1064 if ( null != removedPaths && !removedPaths.isEmpty() ) {
\r
1065 DataObject dataObject;
\r
1067 for ( InstanceIdentifier<?> instanceId : removedPaths ) {
\r
1068 dataObject = originalData.get(instanceId);
\r
1077 * A listener to change events related to physical nodes being
\r
1078 * added, removed or updated.
\r
1080 * @author Zhigang Ji
\r
1082 private class PhysicalNodeChangeListener implements DataChangeListener {
\r
1084 public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
\r
1085 if ( null == change ) {
\r
1089 Map<InstanceIdentifier<?>, DataObject> originalData = change.getOriginalData();
\r
1090 Map<InstanceIdentifier<?>, DataObject> updatedData = change.getUpdatedData();
\r
1092 if ( null != updatedData && !updatedData.isEmpty() ) {
\r
1093 for ( DataObject dataObject : updatedData.values() ) {
\r
1098 Set<InstanceIdentifier<?>> removedPaths = change.getRemovedPaths();
\r
1100 if ( null != removedPaths && !removedPaths.isEmpty() ) {
\r
1101 DataObject dataObject;
\r
1103 for ( InstanceIdentifier<?> instanceId : removedPaths ) {
\r
1104 dataObject = originalData.get(instanceId);
\r
1113 * A listener to change events related to physical links being
\r
1114 * added, removed or updated.
\r
1116 * @author Zhigang Ji
\r
1118 private class PhysicalLinkChangeListener implements DataChangeListener {
\r
1120 public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
\r
1121 if ( null == change ) {
\r
1125 Map<InstanceIdentifier<?>, DataObject> originalData = change.getOriginalData();
\r
1126 Map<InstanceIdentifier<?>, DataObject> updatedData = change.getUpdatedData();
\r
1128 if ( null != updatedData && !updatedData.isEmpty() ) {
\r
1129 for ( DataObject dataObject : updatedData.values() ) {
\r
1134 Set<InstanceIdentifier<?>> removedPaths = change.getRemovedPaths();
\r
1136 if ( null != removedPaths && !removedPaths.isEmpty() ) {
\r
1137 DataObject dataObject;
\r
1139 for ( InstanceIdentifier<?> instanceId : removedPaths ) {
\r
1140 dataObject = originalData.get(instanceId);
\r