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 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.ReadWriteTransaction;
\r
14 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalNetwork;
\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.hosts.PhysicalHost;
\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.links.VirtualLink;
\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.nodes.VirtualNode;
\r
19 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
20 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
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.*;
\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalHostId;
\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalNodeId;
\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.VirtualNodeId;
\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.Objects;
\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Connection;
\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow;
\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Node;
\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.operations.Operation;
\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.flow.instance.MatchItem;
\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.node.instance.Property;
\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.node.instance.SubNode;
\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.property.instance.property.values.StringValue;
\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.operation.instance.Action;
\r
35 import org.opendaylight.yangtools.yang.binding.DataObject;
\r
36 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
\r
37 import org.slf4j.Logger;
\r
38 import org.slf4j.LoggerFactory;
\r
40 import java.util.ArrayList;
\r
41 import java.util.List;
\r
42 import java.util.concurrent.ExecutionException;
\r
45 * Implement the common utilities frequently used in
\r
46 * the intent resolution.
\r
48 * @author Zhigang Ji
\r
50 public class IntentResolverUtils {
\r
51 private static final Logger LOG = LoggerFactory.getLogger(IntentResolverUtils.class);
\r
54 * Check whether the node is an external layer2 group or layer3 group.
\r
56 * @param node The node to be checked.
\r
57 * @return True if the node is an external layer3 group.
\r
59 protected static boolean checkExternalLayer3Group(Node node) {
\r
60 PropertyName propertyName = new PropertyName("ac-info-network");
\r
61 Property property = getNodeProperty(node.getProperty(), propertyName);
\r
63 if ( null != property ) {
\r
64 String propertyValue = property.getPropertyValues().getStringValue().get(0).getValue();
\r
66 if ( propertyValue.equals("layer3") ) {
\r
77 * @param physicalHosts TODO
\r
81 protected static PhysicalHost getPhysicalHost(List<PhysicalHost> physicalHosts, Node node) {
\r
82 PhysicalHostId physicalHostId = new PhysicalHostId(node.getNodeId().getValue());
\r
84 return getPhysicalHost(physicalHosts, physicalHostId);
\r
90 * @param properties TODO
\r
91 * @param propertyName TODO
\r
94 public static Property getNodeProperty(List<Property> properties, PropertyName propertyName) {
\r
95 if ( null != properties ) {
\r
96 for ( Property property : properties ) {
\r
97 if ( property.getPropertyName().equals(propertyName) ) {
\r
109 * @param property TODO
\r
112 protected static PhysicalNodeId generatePhysicalNodeIdFromNodeLocationProperty(Property property) {
\r
113 String propertyValue = property.getPropertyValues().getStringValue().get(0).getValue();
\r
115 return new PhysicalNodeId(propertyValue.substring(0, propertyValue.lastIndexOf(':')));
\r
121 * @param intentVnMappingResults TODO
\r
122 * @param intentId TODO
\r
125 public static IntentVnMappingResult getIntentVnMappingResult(
\r
126 List<IntentVnMappingResult> intentVnMappingResults, IntentId intentId) {
\r
127 for ( IntentVnMappingResult intentVnMappingResult : intentVnMappingResults ) {
\r
128 if ( intentVnMappingResult.getIntentId().equals(intentId) ) {
\r
129 return intentVnMappingResult;
\r
139 * @param virtualNodes TODO
\r
140 * @param virtualNodeId TODO
\r
143 public static VirtualNode getVirtualNode(List<VirtualNode> virtualNodes,
\r
144 VirtualNodeId virtualNodeId) {
\r
145 for ( VirtualNode virtualNode : virtualNodes ) {
\r
146 if ( virtualNode.getNodeId().equals(virtualNodeId) ) {
\r
147 return virtualNode;
\r
157 * @param nodes TODO
\r
158 * @param nodeId TODO
\r
161 public static Node getNode(List<Node> nodes, NodeId nodeId) {
\r
162 for ( Node node : nodes ) {
\r
163 if ( node.getNodeId().equals(nodeId) ) {
\r
174 * @param properties TODO
\r
175 * @param propertyName TODO
\r
178 public static org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.connection.instance.Property getConnectionProperty(
\r
179 List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.connection.instance.Property> properties,
\r
180 PropertyName propertyName) {
\r
181 if ( null != properties ) {
\r
182 for ( org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.connection.instance.Property
\r
183 property : properties ) {
\r
184 if ( property.getPropertyName().equals(propertyName) ) {
\r
196 * @param subNodes TODO
\r
199 protected static List<SubNode> sortSubNodes(List<SubNode> subNodes) {
\r
200 if ( subNodes.isEmpty() || 1 == subNodes.size() ) {
\r
204 List<SubNode> sortedSubNodes = new ArrayList<SubNode>(subNodes.size());
\r
205 sortedSubNodes.addAll(subNodes);
\r
207 for ( SubNode subNode : subNodes ) {
\r
208 sortedSubNodes.set(subNode.getOrder().intValue(), subNode);
\r
211 return sortedSubNodes;
\r
217 * @param subNodes TODO
\r
218 * @param nodes TODO
\r
221 public static boolean checkAllLayer2OperatingMode(List<SubNode> subNodes, List<Node> nodes) {
\r
222 if ( subNodes.isEmpty() ) {
\r
227 PropertyName propertyName = new PropertyName("operating-mode");
\r
229 String propertyValue;
\r
231 for ( SubNode subNode : subNodes ) {
\r
232 node = getNode(nodes, subNode.getNodeId());
\r
234 if ( null == node ) {
\r
238 property = getNodeProperty(node.getProperty(), propertyName);
\r
240 if ( null == property ) {
\r
244 propertyValue = property.getPropertyValues().getStringValue().get(0).getValue();
\r
246 if ( !propertyValue.equals("layer2") ) {
\r
257 * @param subNodes TODO
\r
258 * @param nodes TODO
\r
261 public static boolean checkAllLayer3OperatingMode(List<SubNode> subNodes, List<Node> nodes) {
\r
262 if ( subNodes.isEmpty() ) {
\r
267 PropertyName propertyName = new PropertyName("operating-mode");
\r
269 String propertyValue;
\r
271 for ( SubNode subNode : subNodes ) {
\r
272 node = getNode(nodes, subNode.getNodeId());
\r
274 if ( null == node ) {
\r
278 property = getNodeProperty(node.getProperty(), propertyName);
\r
280 if ( null == property ) {
\r
284 propertyValue = property.getPropertyValues().getStringValue().get(0).getValue();
\r
286 if ( !propertyValue.equals("layer3") ) {
\r
297 * @param virtualLinks TODO
\r
298 * @param srcVirtualNodeId TODO
\r
299 * @param destVirtualNodeId TODO
\r
302 public static VirtualLink getVirtualLink(List<VirtualLink> virtualLinks,
\r
303 VirtualNodeId srcVirtualNodeId,
\r
304 VirtualNodeId destVirtualNodeId) {
\r
305 for ( VirtualLink virtualLink : virtualLinks ) {
\r
306 if ( virtualLink.getSrcNodeId().equals(srcVirtualNodeId)
\r
307 && virtualLink.getDestNodeId().equals(destVirtualNodeId) ) {
\r
308 return virtualLink;
\r
318 * @param objects TODO
\r
319 * @param objectId TODO
\r
322 protected static DataObject getObject(Objects objects, ObjectId objectId) {
\r
323 List<Node> nodes = objects.getNode();
\r
325 if ( null != nodes ) {
\r
326 NodeId nodeId = new NodeId(objectId.getValue());
\r
327 Node node = getNode(nodes, nodeId);
\r
329 if ( null != node ) {
\r
334 List<Connection> connections = objects.getConnection();
\r
336 if ( null != connections ) {
\r
337 ConnectionId connectionId = new ConnectionId(objectId.getValue());
\r
338 Connection connection = getConnection(connections, connectionId);
\r
340 if ( null != connection ) {
\r
345 List<Flow> flows = objects.getFlow();
\r
347 if ( null != flows ) {
\r
348 FlowId flowId = new FlowId(objectId.getValue());
\r
349 Flow flow = getFlow(flows, flowId);
\r
351 if ( null != flow ) {
\r
362 * @param operations TODO
\r
363 * @param operation TODO
\r
366 protected static List<Operation> getSameTargetObjectOperations(List<Operation> operations,
\r
367 Operation operation) {
\r
370 return new ArrayList<Operation>(0);
\r
376 * @param operations TODO
\r
377 * @param operation TODO
\r
378 * @param greaterPriorityOperations TODO
\r
379 * @param equalPriorityOperations TODO
\r
381 protected static void getGreaterAndEqualPriorityOperations(List<Operation> operations, Operation operation,
\r
382 List<Operation> greaterPriorityOperations,
\r
383 List<Operation> equalPriorityOperations) {
\r
392 * @param operations TODO
\r
393 * @param operation TODO
\r
396 protected static Operation getConflictingOperation(List<Operation> operations,
\r
397 Operation operation) {
\r
406 * @param operations TODO
\r
407 * @param operation TODO
\r
410 protected static List<Operation> getConflictingOperations(List<Operation> operations,
\r
411 Operation operation) {
\r
420 * @param physicalHosts TODO
\r
421 * @param physicalHostId TODO
\r
424 private static PhysicalHost getPhysicalHost(List<PhysicalHost> physicalHosts,
\r
425 PhysicalHostId physicalHostId) {
\r
426 for ( PhysicalHost physicalHost : physicalHosts ) {
\r
427 if ( physicalHost.getHostId().equals(physicalHostId) ) {
\r
428 return physicalHost;
\r
438 * @param connections TODO
\r
439 * @param connectionId TODO
\r
442 private static Connection getConnection(List<Connection> connections, ConnectionId connectionId) {
\r
443 for ( Connection connection : connections ) {
\r
444 if ( connection.getConnectionId().equals(connectionId) ) {
\r
455 * @param flows TODO
\r
456 * @param flowId TODO
\r
459 private static Flow getFlow(List<Flow> flows, FlowId flowId) {
\r
460 for ( Flow flow : flows ) {
\r
461 if ( flow.getFlowId().equals(flowId) ) {
\r
469 public static void copyPhysicalNetworkConfigToOperational(DataBroker dataBroker) {
\r
470 final InstanceIdentifier<PhysicalNetwork> physicalNetworkIid = InstanceIdentifier
\r
471 .builder(PhysicalNetwork.class)
\r
474 final ReadWriteTransaction txn = dataBroker.newReadWriteTransaction();
\r
477 final Optional<PhysicalNetwork> oper = txn.read(LogicalDatastoreType.OPERATIONAL, physicalNetworkIid).get();
\r
479 if ( oper.isPresent() ) {
\r
480 PhysicalNetwork physicalNetwork = oper.get();
\r
482 if ( null != physicalNetwork.getPhysicalNodes() ) {
\r
484 LOG.info("Physical network already exists in operational");
\r
490 final Optional<PhysicalNetwork> config = txn.read(LogicalDatastoreType.CONFIGURATION,
\r
491 physicalNetworkIid).get();
\r
493 if (config.isPresent()) {
\r
494 txn.put(LogicalDatastoreType.OPERATIONAL, physicalNetworkIid, config.get());
\r
495 txn.submit().get();
\r
496 LOG.info("Copied physical network from config to operational");
\r
499 LOG.info("No physical network found in config; none copied to operational");
\r
501 } catch (InterruptedException exception) {
\r
502 LOG.error("Cannot copy the physical network.", exception);
\r
503 } catch (ExecutionException exception) {
\r
504 LOG.error("Cannot copy the physical network.", exception);
\r