Cleanup RequestContextStack
[openflowplugin.git] / openflowplugin-impl / src / main / java / org / opendaylight / openflowplugin / impl / statistics / StatisticsContextImpl.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.openflowplugin.impl.statistics;
10
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.Arrays;
16 import java.util.Collection;
17 import java.util.HashSet;
18 import java.util.List;
19 import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext;
20 import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
21 import org.opendaylight.openflowplugin.api.openflow.device.DeviceState;
22 import org.opendaylight.openflowplugin.api.openflow.device.RequestContext;
23 import org.opendaylight.openflowplugin.api.openflow.statistics.StatisticsContext;
24 import org.opendaylight.openflowplugin.impl.rpc.AbstractRequestContext;
25 import org.opendaylight.openflowplugin.impl.services.RequestContextUtil;
26 import org.opendaylight.openflowplugin.impl.statistics.services.dedicated.StatisticsGatheringService;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30
31 /**
32  * Created by Martin Bobak <mbobak@cisco.com> on 1.4.2015.
33  */
34 public class StatisticsContextImpl implements StatisticsContext {
35
36     private static final Logger LOG = LoggerFactory.getLogger(StatisticsContextImpl.class);
37     private static final String CONNECTION_CLOSED = "Connection closed.";
38     private final Collection<RequestContext<?>> requestContexts = new HashSet<>();
39     private final DeviceContext deviceContext;
40
41     private final StatisticsGatheringService statisticsGatheringService;
42
43     public StatisticsContextImpl(final DeviceContext deviceContext) {
44         this.deviceContext = deviceContext;
45         statisticsGatheringService = new StatisticsGatheringService(this, deviceContext);
46     }
47
48     @Override
49     public ListenableFuture<Boolean> gatherDynamicData() {
50
51         final SettableFuture<Boolean> settableResultingFuture = SettableFuture.create();
52         ListenableFuture<Boolean> resultingFuture = settableResultingFuture;
53
54
55         if (ConnectionContext.CONNECTION_STATE.WORKING.equals(deviceContext.getPrimaryConnectionContext().getConnectionState())) {
56             final DeviceState devState = deviceContext.getDeviceState();
57             final ListenableFuture<Boolean> emptyFuture = Futures.immediateFuture(new Boolean(false));
58             final ListenableFuture<Boolean> flowStatistics = devState.isFlowStatisticsAvailable() ? StatisticsGatheringUtils.gatherStatistics(statisticsGatheringService, deviceContext, MultipartType.OFPMPFLOW) : emptyFuture;
59
60             final ListenableFuture<Boolean> tableStatistics = devState.isTableStatisticsAvailable() ? StatisticsGatheringUtils.gatherStatistics(statisticsGatheringService, deviceContext, MultipartType.OFPMPTABLE) : emptyFuture;
61
62             final ListenableFuture<Boolean> portStatistics = devState.isPortStatisticsAvailable() ? StatisticsGatheringUtils.gatherStatistics(statisticsGatheringService, deviceContext, MultipartType.OFPMPPORTSTATS) : emptyFuture;
63
64             final ListenableFuture<Boolean> queueStatistics = devState.isQueueStatisticsAvailable() ? StatisticsGatheringUtils.gatherStatistics(statisticsGatheringService, deviceContext, MultipartType.OFPMPQUEUE) : emptyFuture;
65
66             final ListenableFuture<Boolean> groupDescStatistics = devState.isGroupAvailable() ? StatisticsGatheringUtils.gatherStatistics(statisticsGatheringService, deviceContext, MultipartType.OFPMPGROUPDESC) : emptyFuture;
67             final ListenableFuture<Boolean> groupStatistics = devState.isGroupAvailable() ? StatisticsGatheringUtils.gatherStatistics(statisticsGatheringService, deviceContext, MultipartType.OFPMPGROUP) : emptyFuture;
68
69             final ListenableFuture<Boolean> meterConfigStatistics = devState.isMetersAvailable() ? StatisticsGatheringUtils.gatherStatistics(statisticsGatheringService, deviceContext, MultipartType.OFPMPMETERCONFIG) : emptyFuture;
70             final ListenableFuture<Boolean> meterStatistics = devState.isMetersAvailable() ? StatisticsGatheringUtils.gatherStatistics(statisticsGatheringService, deviceContext, MultipartType.OFPMPMETER) : emptyFuture;
71
72
73             final ListenableFuture<List<Boolean>> allFutures = Futures.allAsList(Arrays.asList(flowStatistics, tableStatistics, groupDescStatistics, groupStatistics, meterConfigStatistics, meterStatistics, portStatistics, queueStatistics));
74             Futures.addCallback(allFutures, new FutureCallback<List<Boolean>>() {
75                 @Override
76                 public void onSuccess(final List<Boolean> booleans) {
77                     boolean atLeastOneSuccess = false;
78                     for (final Boolean bool : booleans) {
79                         atLeastOneSuccess |= bool.booleanValue();
80                     }
81                     settableResultingFuture.set(new Boolean(atLeastOneSuccess));
82                 }
83
84                 @Override
85                 public void onFailure(final Throwable throwable) {
86                     settableResultingFuture.setException(throwable);
87                 }
88             });
89         } else {
90             switch (deviceContext.getPrimaryConnectionContext().getConnectionState()) {
91                 case RIP:
92                     resultingFuture = Futures.immediateFailedFuture(new Throwable(String.format("Device connection doesn't exist anymore. Primary connection status : %s", deviceContext.getPrimaryConnectionContext().getConnectionState())));
93                     break;
94                 default:
95                     resultingFuture = Futures.immediateCheckedFuture(Boolean.TRUE);
96                     break;
97             }
98
99
100         }
101         return resultingFuture;
102     }
103
104     @Override
105     public <T> RequestContext<T> createRequestContext() {
106         final AbstractRequestContext<T> ret = new AbstractRequestContext<T>() {
107             @Override
108             public void close() {
109                 requestContexts.remove(this);
110             }
111         };
112         requestContexts.add(ret);
113         return ret;
114     }
115
116     @Override
117     public void close() {
118         for (final RequestContext<?> requestContext : requestContexts) {
119             RequestContextUtil.closeRequestContextWithRpcError(requestContext, CONNECTION_CLOSED);
120         }
121     }
122 }