2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.netconf.topology.impl;
11 import com.google.common.util.concurrent.FutureCallback;
12 import com.google.common.util.concurrent.Futures;
13 import com.google.common.util.concurrent.ListenableFuture;
14 import com.google.common.util.concurrent.SettableFuture;
15 import java.util.ArrayList;
16 import java.util.List;
17 import org.opendaylight.netconf.topology.StateAggregator;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus.ConnectionStatus;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.AvailableCapabilities;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.ClusteredConnectionStatusBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.UnavailableCapabilities;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.clustered.connection.status.NodeStatus;
25 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
26 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
30 public class NetconfNodeOperationalDataAggregator implements StateAggregator{
32 private static final Logger LOG = LoggerFactory.getLogger(NetconfNodeOperationalDataAggregator.class);
35 public ListenableFuture<Node> combineCreateAttempts(final List<ListenableFuture<Node>> stateFutures) {
36 final SettableFuture<Node> future = SettableFuture.create();
37 final ListenableFuture<List<Node>> allAsList = Futures.allAsList(stateFutures);
38 Futures.addCallback(allAsList, new FutureCallback<List<Node>>() {
40 public void onSuccess(final List<Node> result) {
42 NetconfNode baseAugmentation = null;
43 AvailableCapabilities masterCaps = null;
44 UnavailableCapabilities unavailableMasterCaps = null;
45 final ArrayList<NodeStatus> statusList = new ArrayList<>();
46 for (final Node node : result) {
47 final NetconfNode netconfNode = node.getAugmentation(NetconfNode.class);
48 if (base == null && netconfNode.getConnectionStatus().equals(ConnectionStatus.Connected)) {
50 baseAugmentation = netconfNode;
52 // we need to pull out caps from master, since slave does not go through resolution
53 if (masterCaps == null) {
54 masterCaps = netconfNode.getAvailableCapabilities();
55 unavailableMasterCaps = netconfNode.getUnavailableCapabilities();
57 if (netconfNode.getAvailableCapabilities().getAvailableCapability().size() > masterCaps.getAvailableCapability().size()) {
58 masterCaps = netconfNode.getAvailableCapabilities();
59 unavailableMasterCaps = netconfNode.getUnavailableCapabilities();
61 LOG.debug(netconfNode.toString());
62 statusList.addAll(netconfNode.getClusteredConnectionStatus().getNodeStatus());
67 baseAugmentation = result.get(0).getAugmentation(NetconfNode.class);
68 LOG.debug("All results {}", result.toString());
71 final Node aggregatedNode =
73 .addAugmentation(NetconfNode.class,
74 new NetconfNodeBuilder(baseAugmentation)
75 .setClusteredConnectionStatus(
76 new ClusteredConnectionStatusBuilder()
77 .setNodeStatus(statusList)
79 .setAvailableCapabilities(masterCaps)
80 .setUnavailableCapabilities(unavailableMasterCaps)
84 future.set(aggregatedNode);
88 public void onFailure(final Throwable t) {
89 LOG.error("One of the combined create attempts failed {}", t);
90 future.setException(t);
97 public ListenableFuture<Node> combineUpdateAttempts(final List<ListenableFuture<Node>> stateFutures) {
98 final SettableFuture<Node> future = SettableFuture.create();
99 final ListenableFuture<List<Node>> allAsList = Futures.allAsList(stateFutures);
100 Futures.addCallback(allAsList, new FutureCallback<List<Node>>() {
102 public void onSuccess(final List<Node> result) {
104 NetconfNode baseAugmentation = null;
105 AvailableCapabilities masterCaps = null;
106 UnavailableCapabilities unavailableMasterCaps = null;
107 final ArrayList<NodeStatus> statusList = new ArrayList<>();
108 for (final Node node : result) {
109 final NetconfNode netconfNode = node.getAugmentation(NetconfNode.class);
110 if (base == null && netconfNode.getConnectionStatus().equals(ConnectionStatus.Connected)) {
112 baseAugmentation = netconfNode;
114 // we need to pull out caps from master, since slave does not go through resolution
115 if (masterCaps == null) {
116 masterCaps = netconfNode.getAvailableCapabilities();
117 unavailableMasterCaps = netconfNode.getUnavailableCapabilities();
119 if (netconfNode.getAvailableCapabilities().getAvailableCapability().size() > masterCaps.getAvailableCapability().size()) {
120 masterCaps = netconfNode.getAvailableCapabilities();
121 unavailableMasterCaps = netconfNode.getUnavailableCapabilities();
123 LOG.debug(netconfNode.toString());
124 statusList.addAll(netconfNode.getClusteredConnectionStatus().getNodeStatus());
128 base = result.get(0);
129 baseAugmentation = result.get(0).getAugmentation(NetconfNode.class);
130 LOG.debug("All results {}", result.toString());
133 final Node aggregatedNode =
134 new NodeBuilder(base)
135 .addAugmentation(NetconfNode.class,
136 new NetconfNodeBuilder(baseAugmentation)
137 .setClusteredConnectionStatus(
138 new ClusteredConnectionStatusBuilder()
139 .setNodeStatus(statusList)
141 .setAvailableCapabilities(masterCaps)
142 .setUnavailableCapabilities(unavailableMasterCaps)
145 future.set(aggregatedNode);
149 public void onFailure(final Throwable t) {
150 LOG.error("One of the combined update attempts failed {}", t);
151 future.setException(t);
158 public ListenableFuture<Void> combineDeleteAttempts(final List<ListenableFuture<Void>> stateFutures) {
159 final SettableFuture<Void> future = SettableFuture.create();
160 final ListenableFuture<List<Void>> allAsList = Futures.allAsList(stateFutures);
161 Futures.addCallback(allAsList, new FutureCallback<List<Void>>() {
163 public void onSuccess(final List<Void> result) {
168 public void onFailure(final Throwable t) {
169 LOG.error("One of the combined delete attempts failed {}", t);
170 future.setException(t);