07b3334607139cfa7c0b448b8b23a6ec68b42465
[openflowplugin.git] / openflowplugin-impl / src / main / java / org / opendaylight / openflowplugin / impl / services / OpendaylightFlowStatisticsServiceImpl.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 package org.opendaylight.openflowplugin.impl.services;
9
10 import org.opendaylight.yangtools.yang.binding.DataObject;
11
12 import com.google.common.util.concurrent.JdkFutureAdapters;
13 import com.google.common.util.concurrent.ListenableFuture;
14 import com.google.common.util.concurrent.SettableFuture;
15 import java.util.concurrent.Future;
16 import org.opendaylight.openflowplugin.api.OFConstants;
17 import org.opendaylight.openflowplugin.api.openflow.device.RequestContext;
18 import org.opendaylight.openflowplugin.api.openflow.device.Xid;
19 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchReactor;
20 import org.opendaylight.openflowplugin.openflow.md.util.FlowCreatorUtil;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowStatisticsFromFlowTableInput;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowStatisticsFromFlowTableOutput;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowsStatisticsFromAllFlowTablesInput;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowsStatisticsFromAllFlowTablesOutput;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsFromFlowTableInput;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsFromFlowTableOutput;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.OpendaylightFlowStatisticsService;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregateCaseBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowCaseBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.aggregate._case.MultipartRequestAggregateBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlowBuilder;
38 import org.opendaylight.yangtools.yang.common.RpcResult;
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
41
42 /**
43  * @author joe
44  */
45 public class OpendaylightFlowStatisticsServiceImpl extends CommonService implements OpendaylightFlowStatisticsService {
46
47     private static final Logger LOG = LoggerFactory.getLogger(OpendaylightFlowStatisticsServiceImpl.class);
48
49     @Override
50     public Future<RpcResult<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput>> getAggregateFlowStatisticsFromFlowTableForAllFlows(
51             final GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput input) {
52
53         final RequestContext<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput> requestContext = rpcContext.createRequestContext();
54         final SettableFuture<RpcResult<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput>> result = rpcContext
55                 .storeOrFail(requestContext);
56         if (!result.isDone()) {
57             final Xid xid = deviceContext.getNextXid();
58
59             // Create multipart request body for fetch all the group stats
60             final MultipartRequestAggregateCaseBuilder multipartRequestAggregateCaseBuilder = new MultipartRequestAggregateCaseBuilder();
61             final MultipartRequestAggregateBuilder mprAggregateRequestBuilder = new MultipartRequestAggregateBuilder();
62             mprAggregateRequestBuilder.setTableId(input.getTableId().getValue());
63             mprAggregateRequestBuilder.setOutPort(OFConstants.OFPP_ANY);
64             mprAggregateRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
65             mprAggregateRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
66             mprAggregateRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
67
68             FlowCreatorUtil.setWildcardedFlowMatch(version, mprAggregateRequestBuilder);
69
70             // Set request body to main multipart request
71             multipartRequestAggregateCaseBuilder.setMultipartRequestAggregate(mprAggregateRequestBuilder.build());
72             final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader(
73                     MultipartType.OFPMPAGGREGATE, xid.getValue(), version);
74
75             mprInput.setMultipartRequestBody(multipartRequestAggregateCaseBuilder.build());
76
77             final Future<RpcResult<Void>> resultFromOFLib = deviceContext.getPrimaryConnectionContext()
78                     .getConnectionAdapter().multipartRequest(mprInput.build());
79
80             final ListenableFuture<RpcResult<Void>> futureResultFromOfLib = JdkFutureAdapters
81                     .listenInPoolThread(resultFromOFLib);
82
83             convertRpcResultToRequestFuture(requestContext, futureResultFromOfLib);
84
85         }
86
87         return result;
88     }
89
90     @Override
91     public Future<RpcResult<GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput>> getAggregateFlowStatisticsFromFlowTableForGivenMatch(
92             final GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput input) {
93         final RequestContext<GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput> requestContext = rpcContext.createRequestContext();
94         final SettableFuture<RpcResult<GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput>> result = rpcContext
95                 .storeOrFail(requestContext);
96         if (!result.isDone()) {
97             final Xid xid = deviceContext.getNextXid();
98             final MultipartRequestAggregateCaseBuilder multipartRequestAggregateCaseBuilder = new MultipartRequestAggregateCaseBuilder();
99             final MultipartRequestAggregateBuilder mprAggregateRequestBuilder = new MultipartRequestAggregateBuilder();
100             mprAggregateRequestBuilder.setTableId(input.getTableId());
101             mprAggregateRequestBuilder.setOutPort(input.getOutPort().longValue());
102             // TODO: repeating code
103             if (version == OFConstants.OFP_VERSION_1_3) {
104                 mprAggregateRequestBuilder.setCookie(input.getCookie().getValue());
105                 mprAggregateRequestBuilder.setCookieMask(input.getCookieMask().getValue());
106                 mprAggregateRequestBuilder.setOutGroup(input.getOutGroup());
107             } else {
108                 mprAggregateRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
109                 mprAggregateRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
110                 mprAggregateRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
111             }
112
113             MatchReactor.getInstance().convert(input.getMatch(), version, mprAggregateRequestBuilder,
114                     deviceContext.getPrimaryConnectionContext().getFeatures().getDatapathId());
115
116             FlowCreatorUtil.setWildcardedFlowMatch(version, mprAggregateRequestBuilder);
117
118             // Set request body to main multipart request
119             multipartRequestAggregateCaseBuilder.setMultipartRequestAggregate(mprAggregateRequestBuilder.build());
120
121             final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader(
122                     MultipartType.OFPMPAGGREGATE, xid.getValue(), version);
123
124             mprInput.setMultipartRequestBody(multipartRequestAggregateCaseBuilder.build());
125             final Future<RpcResult<Void>> resultFromOFLib = deviceContext.getPrimaryConnectionContext()
126                     .getConnectionAdapter().multipartRequest(mprInput.build());
127             final ListenableFuture<RpcResult<Void>> futureResultFromOfLib = JdkFutureAdapters
128                     .listenInPoolThread(resultFromOFLib);
129
130             convertRpcResultToRequestFuture(requestContext, futureResultFromOfLib);
131
132         }
133         return result;
134     }
135
136     @Override
137     public Future<RpcResult<GetAllFlowStatisticsFromFlowTableOutput>> getAllFlowStatisticsFromFlowTable(
138             final GetAllFlowStatisticsFromFlowTableInput input) {
139
140         final RequestContext<GetAllFlowStatisticsFromFlowTableOutput> requestContext = rpcContext.createRequestContext();
141         final SettableFuture<RpcResult<GetAllFlowStatisticsFromFlowTableOutput>> result = rpcContext
142                 .storeOrFail(requestContext);
143         if (!result.isDone()) {
144
145             final Xid xid = deviceContext.getNextXid();
146
147             final MultipartRequestFlowBuilder mprFlowRequestBuilder = new MultipartRequestFlowBuilder();
148             mprFlowRequestBuilder.setTableId(input.getTableId().getValue());
149             mprFlowRequestBuilder.setOutPort(OFConstants.OFPP_ANY);
150             mprFlowRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
151             mprFlowRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
152             mprFlowRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
153             FlowCreatorUtil.setWildcardedFlowMatch(version, mprFlowRequestBuilder);
154
155             final MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder = new MultipartRequestFlowCaseBuilder();
156             multipartRequestFlowCaseBuilder.setMultipartRequestFlow(mprFlowRequestBuilder.build());
157
158             final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader(
159                     MultipartType.OFPMPFLOW, xid.getValue(), version);
160
161             mprInput.setMultipartRequestBody(multipartRequestFlowCaseBuilder.build());
162             final Future<RpcResult<Void>> resultFromOFLib = deviceContext.getPrimaryConnectionContext()
163                     .getConnectionAdapter().multipartRequest(mprInput.build());
164             final ListenableFuture<RpcResult<Void>> futureResultFromOfLib = JdkFutureAdapters
165                     .listenInPoolThread(resultFromOFLib);
166
167             convertRpcResultToRequestFuture(requestContext, futureResultFromOfLib);
168
169         }
170         return result;
171     }
172
173     @Override
174     public Future<RpcResult<GetAllFlowsStatisticsFromAllFlowTablesOutput>> getAllFlowsStatisticsFromAllFlowTables(
175             final GetAllFlowsStatisticsFromAllFlowTablesInput input) {
176
177         final RequestContext<GetAllFlowsStatisticsFromAllFlowTablesOutput> requestContext = rpcContext.createRequestContext();
178         final SettableFuture<RpcResult<GetAllFlowsStatisticsFromAllFlowTablesOutput>> result = rpcContext
179                 .storeOrFail(requestContext);
180         if (!result.isDone()) {
181
182             final Xid xid = deviceContext.getNextXid();
183
184             final MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder = new MultipartRequestFlowCaseBuilder();
185             final MultipartRequestFlowBuilder mprFlowRequestBuilder = new MultipartRequestFlowBuilder();
186             mprFlowRequestBuilder.setTableId(OFConstants.OFPTT_ALL);
187             mprFlowRequestBuilder.setOutPort(OFConstants.OFPP_ANY);
188             mprFlowRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
189             mprFlowRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
190             mprFlowRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
191             FlowCreatorUtil.setWildcardedFlowMatch(version, mprFlowRequestBuilder);
192
193             final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader(
194                     MultipartType.OFPMPFLOW, xid.getValue(), version);
195
196             multipartRequestFlowCaseBuilder.setMultipartRequestFlow(mprFlowRequestBuilder.build());
197             mprInput.setMultipartRequestBody(multipartRequestFlowCaseBuilder.build());
198             final Future<RpcResult<Void>> resultFromOFLib = deviceContext.getPrimaryConnectionContext()
199                     .getConnectionAdapter().multipartRequest(mprInput.build());
200             final ListenableFuture<RpcResult<Void>> futureResultFromOfLib = JdkFutureAdapters
201                     .listenInPoolThread(resultFromOFLib);
202
203             convertRpcResultToRequestFuture(requestContext, futureResultFromOfLib);
204         }
205         return result;
206     }
207
208     @Override
209     public Future<RpcResult<GetFlowStatisticsFromFlowTableOutput>> getFlowStatisticsFromFlowTable(
210             final GetFlowStatisticsFromFlowTableInput input) {
211         final RequestContext<GetFlowStatisticsFromFlowTableOutput> requestContext = rpcContext.createRequestContext();
212         final SettableFuture<RpcResult<GetFlowStatisticsFromFlowTableOutput>> result = rpcContext
213                 .storeOrFail(requestContext);
214         if (!result.isDone()) {
215             final Xid xid = deviceContext.getNextXid();
216
217             final MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder = new MultipartRequestFlowCaseBuilder();
218             final MultipartRequestFlowBuilder mprFlowRequestBuilder = new MultipartRequestFlowBuilder();
219             mprFlowRequestBuilder.setTableId(input.getTableId());
220
221             if (input.getOutPort() != null) {
222                 mprFlowRequestBuilder.setOutPort(input.getOutPort().longValue());
223             } else {
224                 mprFlowRequestBuilder.setOutPort(OFConstants.OFPP_ANY);
225             }
226
227             if (input.getOutGroup() != null) {
228                 mprFlowRequestBuilder.setOutGroup(input.getOutGroup());
229             } else {
230                 mprFlowRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
231             }
232
233             if (input.getCookie() != null) {
234                 mprFlowRequestBuilder.setCookie(input.getCookie().getValue());
235             } else {
236                 mprFlowRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
237             }
238
239             if (input.getCookieMask() != null) {
240                 mprFlowRequestBuilder.setCookieMask(input.getCookieMask().getValue());
241             } else {
242                 mprFlowRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
243             }
244
245             // convert and inject match
246             MatchReactor.getInstance().convert(input.getMatch(), version, mprFlowRequestBuilder,
247                     deviceContext.getPrimaryConnectionContext().getFeatures().getDatapathId());
248
249             // Set request body to main multipart request
250             multipartRequestFlowCaseBuilder.setMultipartRequestFlow(mprFlowRequestBuilder.build());
251             final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader(
252                     MultipartType.OFPMPFLOW, xid.getValue(), version);
253             mprInput.setMultipartRequestBody(multipartRequestFlowCaseBuilder.build());
254             final Future<RpcResult<Void>> resultFromOFLib = deviceContext.getPrimaryConnectionContext()
255                     .getConnectionAdapter().multipartRequest(mprInput.build());
256             final ListenableFuture<RpcResult<Void>> futureResultFromOfLib = JdkFutureAdapters
257                     .listenInPoolThread(resultFromOFLib);
258
259             convertRpcResultToRequestFuture(requestContext, futureResultFromOfLib);
260
261         } else {
262             RequestContextUtil.closeRequstContext(requestContext);
263         }
264         return result;
265     }
266
267     private <T extends DataObject> void convertRpcResultToRequestFuture(final RequestContext<T> requestContext,
268             final ListenableFuture<RpcResult<Void>> futureResultFromOfLib) {
269         final RpcResultConvertor<T> rpcResultConvertor = new RpcResultConvertor<>(requestContext, deviceContext);
270         rpcResultConvertor.processResultFromOfJava(futureResultFromOfLib);
271     }
272
273 }