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
8 package org.opendaylight.openflowplugin.impl.statistics.services;
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;
50 public class OpendaylightFlowStatisticsServiceImpl extends CommonService implements OpendaylightFlowStatisticsService {
52 private static final Logger LOG = LoggerFactory.getLogger(OpendaylightFlowStatisticsServiceImpl.class);
54 public OpendaylightFlowStatisticsServiceImpl(final RequestContextStack requestContextStack, DeviceContext deviceContext) {
55 super(requestContextStack, deviceContext);
59 public Future<RpcResult<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput>> getAggregateFlowStatisticsFromFlowTableForAllFlows(
60 final GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput input) {
63 return this.<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput, Void>handleServiceCall(
65 new Function<DataCrate<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput>, Future<RpcResult<Void>>>() {
68 public Future<RpcResult<Void>> apply(final DataCrate<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput> data) {
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);
79 FlowCreatorUtil.setWildcardedFlowMatch(version, mprAggregateRequestBuilder);
81 // Set request body to main multipart request
82 multipartRequestAggregateCaseBuilder.setMultipartRequestAggregate(mprAggregateRequestBuilder
84 final Xid xid = deviceContext.getNextXid();
85 data.getRequestContext().setXid(xid);
86 final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader(
87 MultipartType.OFPMPAGGREGATE, xid.getValue(), version);
89 mprInput.setMultipartRequestBody(multipartRequestAggregateCaseBuilder.build());
91 final Future<RpcResult<Void>> resultFromOFLib = deviceContext.getPrimaryConnectionContext()
92 .getConnectionAdapter().multipartRequest(mprInput.build());
94 return JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
101 public Future<RpcResult<GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput>> getAggregateFlowStatisticsFromFlowTableForGivenMatch(
102 final GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput input) {
105 return this.<GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput, Void>handleServiceCall(
107 new Function<DataCrate<GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput>, Future<RpcResult<Void>>>() {
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());
121 mprAggregateRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
122 mprAggregateRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
123 mprAggregateRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
126 MatchReactor.getInstance().convert(input.getMatch(), version, mprAggregateRequestBuilder,
127 deviceContext.getPrimaryConnectionContext().getFeatures().getDatapathId());
129 FlowCreatorUtil.setWildcardedFlowMatch(version, mprAggregateRequestBuilder);
131 // Set request body to main multipart request
132 multipartRequestAggregateCaseBuilder.setMultipartRequestAggregate(mprAggregateRequestBuilder
135 final Xid xid = deviceContext.getNextXid();
136 data.getRequestContext().setXid(xid);
137 final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader(
138 MultipartType.OFPMPAGGREGATE, xid.getValue(), version);
140 mprInput.setMultipartRequestBody(multipartRequestAggregateCaseBuilder.build());
141 final Future<RpcResult<Void>> resultFromOFLib = deviceContext.getPrimaryConnectionContext()
142 .getConnectionAdapter().multipartRequest(mprInput.build());
143 return JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
150 public Future<RpcResult<GetAllFlowStatisticsFromFlowTableOutput>> getAllFlowStatisticsFromFlowTable(
151 final GetAllFlowStatisticsFromFlowTableInput input) {
153 return this.<GetAllFlowStatisticsFromFlowTableOutput, Void>handleServiceCall(PRIMARY_CONNECTION,
154 new Function<DataCrate<GetAllFlowStatisticsFromFlowTableOutput>, Future<RpcResult<Void>>>() {
157 public Future<RpcResult<Void>> apply(final DataCrate<GetAllFlowStatisticsFromFlowTableOutput> data) {
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);
167 final MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder = new MultipartRequestFlowCaseBuilder();
168 multipartRequestFlowCaseBuilder.setMultipartRequestFlow(mprFlowRequestBuilder.build());
170 final Xid xid = deviceContext.getNextXid();
171 data.getRequestContext().setXid(xid);
172 final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader(
173 MultipartType.OFPMPFLOW, xid.getValue(), version);
175 mprInput.setMultipartRequestBody(multipartRequestFlowCaseBuilder.build());
176 final Future<RpcResult<Void>> resultFromOFLib = deviceContext.getPrimaryConnectionContext()
177 .getConnectionAdapter().multipartRequest(mprInput.build());
178 return JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
184 public Future<RpcResult<GetAllFlowsStatisticsFromAllFlowTablesOutput>> getAllFlowsStatisticsFromAllFlowTables(
185 final GetAllFlowsStatisticsFromAllFlowTablesInput input) {
188 return this.<GetAllFlowsStatisticsFromAllFlowTablesOutput, Void>handleServiceCall(PRIMARY_CONNECTION,
189 new Function<DataCrate<GetAllFlowsStatisticsFromAllFlowTablesOutput>, Future<RpcResult<Void>>>() {
192 public Future<RpcResult<Void>> apply(final DataCrate<GetAllFlowsStatisticsFromAllFlowTablesOutput> data) {
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);
203 final Xid xid = deviceContext.getNextXid();
204 data.getRequestContext().setXid(xid);
205 final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader(
206 MultipartType.OFPMPFLOW, xid.getValue(), version);
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);
218 public Future<RpcResult<GetFlowStatisticsFromFlowTableOutput>> getFlowStatisticsFromFlowTable(
219 final GetFlowStatisticsFromFlowTableInput input) {
222 return this.<GetFlowStatisticsFromFlowTableOutput, Void>handleServiceCall(PRIMARY_CONNECTION,
223 new Function<DataCrate<GetFlowStatisticsFromFlowTableOutput>, Future<RpcResult<Void>>>() {
226 public Future<RpcResult<Void>> apply(final DataCrate<GetFlowStatisticsFromFlowTableOutput> data) {
228 final MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder = new MultipartRequestFlowCaseBuilder();
229 final MultipartRequestFlowBuilder mprFlowRequestBuilder = new MultipartRequestFlowBuilder();
230 mprFlowRequestBuilder.setTableId(input.getTableId());
232 if (input.getOutPort() != null) {
233 mprFlowRequestBuilder.setOutPort(input.getOutPort().longValue());
235 mprFlowRequestBuilder.setOutPort(OFConstants.OFPP_ANY);
238 if (input.getOutGroup() != null) {
239 mprFlowRequestBuilder.setOutGroup(input.getOutGroup());
241 mprFlowRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
244 if (input.getCookie() != null) {
245 mprFlowRequestBuilder.setCookie(input.getCookie().getValue());
247 mprFlowRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
250 if (input.getCookieMask() != null) {
251 mprFlowRequestBuilder.setCookieMask(input.getCookieMask().getValue());
253 mprFlowRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
256 // convert and inject match
257 MatchReactor.getInstance().convert(input.getMatch(), version, mprFlowRequestBuilder,
258 deviceContext.getPrimaryConnectionContext().getFeatures().getDatapathId());
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);
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);