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;
\r
11 import java.util.ArrayList;
\r
12 import java.util.List;
\r
13 import java.util.concurrent.ExecutionException;
\r
15 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
\r
16 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
\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.physical.network.physical.hosts.PhysicalHost;
\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.links.VirtualLink;
\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.nodes.VirtualNode;
\r
22 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
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.ConnectionId;
\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.FlowId;
\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.IntentId;
\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.NodeId;
\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.ObjectId;
\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.PropertyName;
\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalHostId;
\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalNodeId;
\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.VirtualNodeId;
\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.Objects;
\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Connection;
\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow;
\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Node;
\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.operations.Operation;
\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.node.instance.Property;
\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.node.instance.SubNode;
\r
39 import org.opendaylight.yangtools.yang.binding.DataObject;
\r
40 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
\r
41 import org.slf4j.Logger;
\r
42 import org.slf4j.LoggerFactory;
\r
44 import com.google.common.base.Optional;
\r
47 * Implement the common utilities frequently used in
\r
48 * the intent resolution.
\r
50 * @author Zhigang Ji
\r
52 public class IntentResolverUtils {
\r
54 private static final Logger LOG = LoggerFactory.getLogger(IntentResolverUtils.class);
\r
57 * Check whether the node is an external layer2 group or layer3 group.
\r
59 * @param node The node to be checked.
\r
60 * @return True if the node is an external layer3 group.
\r
62 protected static boolean checkExternalLayer3Group(Node node) {
\r
63 PropertyName propertyName = new PropertyName("ac-info-network");
\r
64 Property property = getNodeProperty(node.getProperty(), propertyName);
\r
66 if ( null != property ) {
\r
67 String propertyValue = property.getPropertyValues().getStringValue().get(0).getValue();
\r
69 if ( propertyValue.equals("layer3") ) {
\r
80 * @param physicalHosts TODO
\r
84 protected static PhysicalHost getPhysicalHost(List<PhysicalHost> physicalHosts, Node node) {
\r
85 PhysicalHostId physicalHostId = new PhysicalHostId(node.getNodeId().getValue());
\r
87 return getPhysicalHost(physicalHosts, physicalHostId);
\r
93 * @param properties TODO
\r
94 * @param propertyName TODO
\r
97 public static Property getNodeProperty(List<Property> properties, PropertyName propertyName) {
\r
98 if ( null != properties ) {
\r
99 for ( Property property : properties ) {
\r
100 if ( property.getPropertyName().equals(propertyName) ) {
\r
112 * @param property TODO
\r
115 protected static PhysicalNodeId generatePhysicalNodeIdFromNodeLocationProperty(Property property) {
\r
116 String propertyValue = property.getPropertyValues().getStringValue().get(0).getValue();
\r
118 return new PhysicalNodeId(propertyValue.substring(0, propertyValue.lastIndexOf(':')));
\r
124 * @param intentVnMappingResults TODO
\r
125 * @param intentId TODO
\r
128 public static IntentVnMappingResult getIntentVnMappingResult(
\r
129 List<IntentVnMappingResult> intentVnMappingResults, IntentId intentId) {
\r
130 for ( IntentVnMappingResult intentVnMappingResult : intentVnMappingResults ) {
\r
131 if ( intentVnMappingResult.getIntentId().equals(intentId) ) {
\r
132 return intentVnMappingResult;
\r
142 * @param virtualNodes TODO
\r
143 * @param virtualNodeId TODO
\r
146 public static VirtualNode getVirtualNode(List<VirtualNode> virtualNodes,
\r
147 VirtualNodeId virtualNodeId) {
\r
148 for ( VirtualNode virtualNode : virtualNodes ) {
\r
149 if ( virtualNode.getNodeId().equals(virtualNodeId) ) {
\r
150 return virtualNode;
\r
160 * @param nodes TODO
\r
161 * @param nodeId TODO
\r
164 public static Node getNode(List<Node> nodes, NodeId nodeId) {
\r
165 for ( Node node : nodes ) {
\r
166 if ( node.getNodeId().equals(nodeId) ) {
\r
177 * @param properties TODO
\r
178 * @param propertyName TODO
\r
181 public static org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.connection.instance.Property getConnectionProperty(
\r
182 List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.connection.instance.Property> properties,
\r
183 PropertyName propertyName) {
\r
184 if ( null != properties ) {
\r
185 for ( org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.connection.instance.Property
\r
186 property : properties ) {
\r
187 if ( property.getPropertyName().equals(propertyName) ) {
\r
199 * @param subNodes TODO
\r
202 protected static List<SubNode> sortSubNodes(List<SubNode> subNodes) {
\r
203 if ( subNodes.isEmpty() || 1 == subNodes.size() ) {
\r
207 List<SubNode> sortedSubNodes = new ArrayList<SubNode>(subNodes.size());
\r
208 sortedSubNodes.addAll(subNodes);
\r
210 for ( SubNode subNode : subNodes ) {
\r
211 sortedSubNodes.set(subNode.getOrder().intValue(), subNode);
\r
214 return sortedSubNodes;
\r
220 * @param subNodes TODO
\r
221 * @param nodes TODO
\r
224 public static boolean checkAllLayer2OperatingMode(List<SubNode> subNodes, List<Node> nodes) {
\r
225 if ( subNodes.isEmpty() ) {
\r
230 PropertyName propertyName = new PropertyName("operating-mode");
\r
232 String propertyValue;
\r
234 for ( SubNode subNode : subNodes ) {
\r
235 node = getNode(nodes, subNode.getNodeId());
\r
237 if ( null == node ) {
\r
241 property = getNodeProperty(node.getProperty(), propertyName);
\r
243 if ( null == property ) {
\r
247 propertyValue = property.getPropertyValues().getStringValue().get(0).getValue();
\r
249 if ( !propertyValue.equals("layer2") ) {
\r
260 * @param subNodes TODO
\r
261 * @param nodes TODO
\r
264 public static boolean checkAllLayer3OperatingMode(List<SubNode> subNodes, List<Node> nodes) {
\r
265 if ( subNodes.isEmpty() ) {
\r
270 PropertyName propertyName = new PropertyName("operating-mode");
\r
272 String propertyValue;
\r
274 for ( SubNode subNode : subNodes ) {
\r
275 node = getNode(nodes, subNode.getNodeId());
\r
277 if ( null == node ) {
\r
281 property = getNodeProperty(node.getProperty(), propertyName);
\r
283 if ( null == property ) {
\r
287 propertyValue = property.getPropertyValues().getStringValue().get(0).getValue();
\r
289 if ( !propertyValue.equals("layer3") ) {
\r
300 * @param virtualLinks TODO
\r
301 * @param srcVirtualNodeId TODO
\r
302 * @param destVirtualNodeId TODO
\r
305 public static VirtualLink getVirtualLink(List<VirtualLink> virtualLinks,
\r
306 VirtualNodeId srcVirtualNodeId,
\r
307 VirtualNodeId destVirtualNodeId) {
\r
308 for ( VirtualLink virtualLink : virtualLinks ) {
\r
309 if ( virtualLink.getSrcNodeId().equals(srcVirtualNodeId)
\r
310 && virtualLink.getDestNodeId().equals(destVirtualNodeId) ) {
\r
311 return virtualLink;
\r
321 * @param objects TODO
\r
322 * @param objectId TODO
\r
325 protected static DataObject getObject(Objects objects, ObjectId objectId) {
\r
326 List<Node> nodes = objects.getNode();
\r
328 if ( null != nodes ) {
\r
329 NodeId nodeId = new NodeId(objectId.getValue());
\r
330 Node node = getNode(nodes, nodeId);
\r
332 if ( null != node ) {
\r
337 List<Connection> connections = objects.getConnection();
\r
339 if ( null != connections ) {
\r
340 ConnectionId connectionId = new ConnectionId(objectId.getValue());
\r
341 Connection connection = getConnection(connections, connectionId);
\r
343 if ( null != connection ) {
\r
348 List<Flow> flows = objects.getFlow();
\r
350 if ( null != flows ) {
\r
351 FlowId flowId = new FlowId(objectId.getValue());
\r
352 Flow flow = getFlow(flows, flowId);
\r
354 if ( null != flow ) {
\r
365 * @param operations TODO
\r
366 * @param operation TODO
\r
369 protected static List<Operation> getSameTargetObjectOperations(List<Operation> operations,
\r
370 Operation operation) {
\r
373 return new ArrayList<Operation>(0);
\r
379 * @param operations TODO
\r
380 * @param operation TODO
\r
381 * @param greaterPriorityOperations TODO
\r
382 * @param equalPriorityOperations TODO
\r
384 protected static void getGreaterAndEqualPriorityOperations(List<Operation> operations, Operation operation,
\r
385 List<Operation> greaterPriorityOperations,
\r
386 List<Operation> equalPriorityOperations) {
\r
395 * @param operations TODO
\r
396 * @param operation TODO
\r
399 protected static Operation getConflictingOperation(List<Operation> operations,
\r
400 Operation operation) {
\r
409 * @param operations TODO
\r
410 * @param operation TODO
\r
413 protected static List<Operation> getConflictingOperations(List<Operation> operations,
\r
414 Operation operation) {
\r
423 * @param physicalHosts TODO
\r
424 * @param physicalHostId TODO
\r
427 private static PhysicalHost getPhysicalHost(List<PhysicalHost> physicalHosts,
\r
428 PhysicalHostId physicalHostId) {
\r
429 for ( PhysicalHost physicalHost : physicalHosts ) {
\r
430 if ( physicalHost.getHostId().equals(physicalHostId) ) {
\r
431 return physicalHost;
\r
441 * @param connections TODO
\r
442 * @param connectionId TODO
\r
445 private static Connection getConnection(List<Connection> connections, ConnectionId connectionId) {
\r
446 for ( Connection connection : connections ) {
\r
447 if ( connection.getConnectionId().equals(connectionId) ) {
\r
458 * @param flows TODO
\r
459 * @param flowId TODO
\r
462 private static Flow getFlow(List<Flow> flows, FlowId flowId) {
\r
463 for ( Flow flow : flows ) {
\r
464 if ( flow.getFlowId().equals(flowId) ) {
\r
473 public static void copyPhysicalNetworkConfigToOperational(DataBroker dataBroker) {
\r
474 final InstanceIdentifier<PhysicalNetwork> physicalNetworkIid = InstanceIdentifier
\r
475 .builder(PhysicalNetwork.class).build();
\r
477 final ReadWriteTransaction txn = dataBroker.newReadWriteTransaction();
\r
480 final Optional<PhysicalNetwork> oper = txn.read(LogicalDatastoreType.OPERATIONAL, physicalNetworkIid).get();
\r
482 if (oper.isPresent()) {
\r
484 LOG.info("Physical network already exists in operational");
\r
486 final Optional<PhysicalNetwork> config = txn.read(LogicalDatastoreType.CONFIGURATION,
\r
487 physicalNetworkIid).get();
\r
489 if (config.isPresent()) {
\r
490 txn.put(LogicalDatastoreType.OPERATIONAL, physicalNetworkIid, config.get());
\r
491 txn.submit().get();
\r
492 LOG.info("Copied physical network from config to operational");
\r
495 LOG.info("No physical network found in config; none copied to operational");
\r
498 } catch (InterruptedException exception) {
\r
499 LOG.error("Cannot copy the physical hosts.", exception);
\r
500 } catch (ExecutionException exception) {
\r
501 LOG.error("Cannot copy the physical hosts.", exception);
\r