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