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.services;
10 import org.opendaylight.yangtools.yang.binding.DataObject;
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;
45 public class OpendaylightFlowStatisticsServiceImpl extends CommonService implements OpendaylightFlowStatisticsService {
47 private static final Logger LOG = LoggerFactory.getLogger(OpendaylightFlowStatisticsServiceImpl.class);
50 public Future<RpcResult<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput>> getAggregateFlowStatisticsFromFlowTableForAllFlows(
51 final GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput input) {
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();
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);
68 FlowCreatorUtil.setWildcardedFlowMatch(version, mprAggregateRequestBuilder);
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);
75 mprInput.setMultipartRequestBody(multipartRequestAggregateCaseBuilder.build());
77 final Future<RpcResult<Void>> resultFromOFLib = deviceContext.getPrimaryConnectionContext()
78 .getConnectionAdapter().multipartRequest(mprInput.build());
80 final ListenableFuture<RpcResult<Void>> futureResultFromOfLib = JdkFutureAdapters
81 .listenInPoolThread(resultFromOFLib);
83 convertRpcResultToRequestFuture(requestContext, futureResultFromOfLib);
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());
108 mprAggregateRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
109 mprAggregateRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
110 mprAggregateRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
113 MatchReactor.getInstance().convert(input.getMatch(), version, mprAggregateRequestBuilder,
114 deviceContext.getPrimaryConnectionContext().getFeatures().getDatapathId());
116 FlowCreatorUtil.setWildcardedFlowMatch(version, mprAggregateRequestBuilder);
118 // Set request body to main multipart request
119 multipartRequestAggregateCaseBuilder.setMultipartRequestAggregate(mprAggregateRequestBuilder.build());
121 final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader(
122 MultipartType.OFPMPAGGREGATE, xid.getValue(), version);
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);
130 convertRpcResultToRequestFuture(requestContext, futureResultFromOfLib);
137 public Future<RpcResult<GetAllFlowStatisticsFromFlowTableOutput>> getAllFlowStatisticsFromFlowTable(
138 final GetAllFlowStatisticsFromFlowTableInput input) {
140 final RequestContext<GetAllFlowStatisticsFromFlowTableOutput> requestContext = rpcContext.createRequestContext();
141 final SettableFuture<RpcResult<GetAllFlowStatisticsFromFlowTableOutput>> result = rpcContext
142 .storeOrFail(requestContext);
143 if (!result.isDone()) {
145 final Xid xid = deviceContext.getNextXid();
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);
155 final MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder = new MultipartRequestFlowCaseBuilder();
156 multipartRequestFlowCaseBuilder.setMultipartRequestFlow(mprFlowRequestBuilder.build());
158 final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader(
159 MultipartType.OFPMPFLOW, xid.getValue(), version);
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);
167 convertRpcResultToRequestFuture(requestContext, futureResultFromOfLib);
174 public Future<RpcResult<GetAllFlowsStatisticsFromAllFlowTablesOutput>> getAllFlowsStatisticsFromAllFlowTables(
175 final GetAllFlowsStatisticsFromAllFlowTablesInput input) {
177 final RequestContext<GetAllFlowsStatisticsFromAllFlowTablesOutput> requestContext = rpcContext.createRequestContext();
178 final SettableFuture<RpcResult<GetAllFlowsStatisticsFromAllFlowTablesOutput>> result = rpcContext
179 .storeOrFail(requestContext);
180 if (!result.isDone()) {
182 final Xid xid = deviceContext.getNextXid();
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);
193 final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader(
194 MultipartType.OFPMPFLOW, xid.getValue(), version);
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);
203 convertRpcResultToRequestFuture(requestContext, futureResultFromOfLib);
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();
217 final MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder = new MultipartRequestFlowCaseBuilder();
218 final MultipartRequestFlowBuilder mprFlowRequestBuilder = new MultipartRequestFlowBuilder();
219 mprFlowRequestBuilder.setTableId(input.getTableId());
221 if (input.getOutPort() != null) {
222 mprFlowRequestBuilder.setOutPort(input.getOutPort().longValue());
224 mprFlowRequestBuilder.setOutPort(OFConstants.OFPP_ANY);
227 if (input.getOutGroup() != null) {
228 mprFlowRequestBuilder.setOutGroup(input.getOutGroup());
230 mprFlowRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
233 if (input.getCookie() != null) {
234 mprFlowRequestBuilder.setCookie(input.getCookie().getValue());
236 mprFlowRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
239 if (input.getCookieMask() != null) {
240 mprFlowRequestBuilder.setCookieMask(input.getCookieMask().getValue());
242 mprFlowRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
245 // convert and inject match
246 MatchReactor.getInstance().convert(input.getMatch(), version, mprFlowRequestBuilder,
247 deviceContext.getPrimaryConnectionContext().getFeatures().getDatapathId());
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);
259 convertRpcResultToRequestFuture(requestContext, futureResultFromOfLib);
262 RequestContextUtil.closeRequstContext(requestContext);
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);