X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflowplugin-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fimpl%2Fstatistics%2Fservices%2FOpendaylightFlowStatisticsServiceImpl.java;h=4d9a2b3ce16a452923cb6c7e0eca7d29b77265bc;hb=74500b868f8cdce042c53d7bdd994a9c7ff7314c;hp=832ef48d889dcb762a97a7375e799853475e7db1;hpb=40f9c02c9a215561ffca41fd66b4fc56b74b9903;p=openflowplugin.git diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OpendaylightFlowStatisticsServiceImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OpendaylightFlowStatisticsServiceImpl.java index 832ef48d88..4d9a2b3ce1 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OpendaylightFlowStatisticsServiceImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OpendaylightFlowStatisticsServiceImpl.java @@ -8,26 +8,18 @@ package org.opendaylight.openflowplugin.impl.statistics.services; import com.google.common.base.Function; -import com.google.common.base.MoreObjects; import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.ListenableFuture; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Future; -import javax.annotation.Nullable; -import org.opendaylight.openflowplugin.api.OFConstants; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; +import org.opendaylight.openflowplugin.api.openflow.device.DeviceInfo; import org.opendaylight.openflowplugin.api.openflow.device.MessageTranslator; -import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack; import org.opendaylight.openflowplugin.api.openflow.device.TranslatorLibrary; -import org.opendaylight.openflowplugin.api.openflow.device.Xid; import org.opendaylight.openflowplugin.api.openflow.md.core.TranslatorKey; -import org.opendaylight.openflowplugin.impl.services.CommonService; -import org.opendaylight.openflowplugin.impl.services.RequestInputUtils; -import org.opendaylight.openflowplugin.impl.util.StatisticsServiceUtil; -import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchReactor; -import org.opendaylight.openflowplugin.openflow.md.util.FlowCreatorUtil; +import org.opendaylight.openflowplugin.api.openflow.statistics.compatibility.Delegator; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput; @@ -41,284 +33,130 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.G import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsFromFlowTableOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.OpendaylightFlowStatisticsService; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.get.aggregate.flow.statistics.from.flow.table._for.given.match.output.AggregatedFlowStatistics; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReply; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyAggregateCase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregateCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.aggregate._case.MultipartRequestAggregateBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlowBuilder; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * @author joe */ -public class OpendaylightFlowStatisticsServiceImpl extends CommonService implements OpendaylightFlowStatisticsService { - - private static final Logger LOG = LoggerFactory.getLogger(OpendaylightFlowStatisticsServiceImpl.class); - - public OpendaylightFlowStatisticsServiceImpl(final RequestContextStack requestContextStack, DeviceContext deviceContext) { - super(requestContextStack, deviceContext); - } - - @Override - public Future> getAggregateFlowStatisticsFromFlowTableForAllFlows( - final GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput input) { +public class OpendaylightFlowStatisticsServiceImpl implements OpendaylightFlowStatisticsService, Delegator { + + private final Function>, RpcResult> matchingConvertor = + new Function>, RpcResult>() { + @Override + public RpcResult apply(final RpcResult> input) { + final DeviceInfo deviceInfo = matchingFlowsInTable.getDeviceInfo(); + final RpcResult rpcResult; + if (input.isSuccessful()) { + MultipartReply reply = input.getResult().get(0); + final TranslatorKey translatorKey = new TranslatorKey(reply.getVersion(), MultipartReplyAggregateCase.class.getName()); + final MessageTranslator messageTranslator = translatorLibrary.lookupTranslator(translatorKey); + List aggregStats = new ArrayList(); + + for (MultipartReply multipartReply : input.getResult()) { + aggregStats.add(messageTranslator.translate(multipartReply, deviceInfo, null)); + } + GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder getAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder = + new GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder(); + getAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder.setAggregatedFlowStatistics(aggregStats); - return handleServiceCall( - new Function, - ListenableFuture>>() { + rpcResult = RpcResultBuilder + .success() + .withResult(getAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder.build()) + .build(); - @Override - public ListenableFuture> apply(final RequestContext requestContext) { + } else { + rpcResult = RpcResultBuilder + .failed() + .withRpcErrors(input.getErrors()) + .build(); + } + return rpcResult; + } + }; - // Create multipart request body for fetch all the group stats - final MultipartRequestAggregateCaseBuilder multipartRequestAggregateCaseBuilder = new MultipartRequestAggregateCaseBuilder(); - final MultipartRequestAggregateBuilder mprAggregateRequestBuilder = new MultipartRequestAggregateBuilder(); - mprAggregateRequestBuilder.setTableId(input.getTableId().getValue()); - mprAggregateRequestBuilder.setOutPort(OFConstants.OFPP_ANY); - mprAggregateRequestBuilder.setOutGroup(OFConstants.OFPG_ANY); - mprAggregateRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE); - mprAggregateRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK); - final short version = getVersion(); - FlowCreatorUtil.setWildcardedFlowMatch(version, mprAggregateRequestBuilder); + private final MatchingFlowsInTableService matchingFlowsInTable; + private final TranslatorLibrary translatorLibrary; + private OpendaylightFlowStatisticsService delegate; - // Set request body to main multipart request - multipartRequestAggregateCaseBuilder.setMultipartRequestAggregate(mprAggregateRequestBuilder - .build()); - final Xid xid = requestContext.getXid(); - final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader( - MultipartType.OFPMPAGGREGATE, xid.getValue(), version); + public static OpendaylightFlowStatisticsServiceImpl createWithOook(final RequestContextStack requestContextStack, + final DeviceContext deviceContext, final ConvertorExecutor convertorExecutor) { + return new OpendaylightFlowStatisticsServiceImpl(requestContextStack, deviceContext, deviceContext.oook(), convertorExecutor); + } - mprInput.setMultipartRequestBody(multipartRequestAggregateCaseBuilder.build()); + public OpendaylightFlowStatisticsServiceImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext, + final TranslatorLibrary translatorLibrary, final ConvertorExecutor convertorExecutor) { + matchingFlowsInTable = new MatchingFlowsInTableService(requestContextStack, deviceContext, convertorExecutor); + this.translatorLibrary = translatorLibrary; + } - return StatisticsServiceUtil.getRpcResultListenableFuture(xid, mprInput.build(), getDeviceContext()); - } - }); + @Override + public void setDelegate(OpendaylightFlowStatisticsService delegate) { + this.delegate = delegate; + } + /** + * @deprecated provided for Be-release as backward compatibility relic + */ + @Override + @Deprecated + public Future> getAggregateFlowStatisticsFromFlowTableForAllFlows( + final GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput input) { + if (delegate != null) { + return delegate.getAggregateFlowStatisticsFromFlowTableForAllFlows(input); + } else { + throw new IllegalAccessError("no delegate available - service is currently out of order"); + } } @Override public Future> getAggregateFlowStatisticsFromFlowTableForGivenMatch( final GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput input) { - - - ListenableFuture>> rpcResultListenableFuture = handleServiceCall( - new Function>, ListenableFuture>>>() { - - @Override - public ListenableFuture>> apply(final RequestContext> requestContext) { - final Xid xid = requestContext.getXid(); - final DeviceContext deviceContext = getDeviceContext(); - deviceContext.getMultiMsgCollector().registerMultipartRequestContext(requestContext); - final MultipartRequestAggregateCaseBuilder multipartRequestAggregateCaseBuilder = new MultipartRequestAggregateCaseBuilder(); - final MultipartRequestAggregateBuilder mprAggregateRequestBuilder = new MultipartRequestAggregateBuilder(); - final short tableId = MoreObjects.firstNonNull(input.getTableId(), OFConstants.OFPTT_ALL).shortValue(); - mprAggregateRequestBuilder.setTableId(tableId); - long outputPortValue = MoreObjects.firstNonNull(input.getOutPort(), OFConstants.OFPP_ANY).longValue(); - mprAggregateRequestBuilder.setOutPort(outputPortValue); - // TODO: repeating code - - final short version = getVersion(); - if (version == OFConstants.OFP_VERSION_1_3) { - - if (input.getCookie() == null) { - mprAggregateRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE); - } else { - mprAggregateRequestBuilder.setCookie(MoreObjects.firstNonNull(input.getCookie().getValue(), OFConstants.DEFAULT_COOKIE)); - } - - if (input.getCookieMask() == null) { - mprAggregateRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK); - } else { - mprAggregateRequestBuilder.setCookieMask(MoreObjects.firstNonNull(input.getCookieMask().getValue(), OFConstants.DEFAULT_COOKIE_MASK)); - } - long outGroup = MoreObjects.firstNonNull(input.getOutGroup(), OFConstants.OFPG_ANY).longValue(); - mprAggregateRequestBuilder.setOutGroup(outGroup); - } else { - mprAggregateRequestBuilder.setOutGroup(OFConstants.OFPG_ANY); - mprAggregateRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE); - mprAggregateRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK); - } - - MatchReactor.getInstance().convert(input.getMatch(), version, mprAggregateRequestBuilder, - deviceContext.getPrimaryConnectionContext().getFeatures().getDatapathId()); - - FlowCreatorUtil.setWildcardedFlowMatch(version, mprAggregateRequestBuilder); - - // Set request body to main multipart request - multipartRequestAggregateCaseBuilder.setMultipartRequestAggregate(mprAggregateRequestBuilder - .build()); - - final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader( - MultipartType.OFPMPAGGREGATE, xid.getValue(), version); - - mprInput.setMultipartRequestBody(multipartRequestAggregateCaseBuilder.build()); - return StatisticsServiceUtil.getRpcResultListenableFuture(xid, mprInput.build(), getDeviceContext()); - } - }); - - return Futures.transform(rpcResultListenableFuture, new Function>, RpcResult>() { - @Nullable - @Override - public RpcResult apply(RpcResult> input) { - final DeviceContext deviceContext = getDeviceContext(); - TranslatorLibrary translatorLibrary = deviceContext.oook(); - RpcResult rpcResult; - if (input.isSuccessful()) { - MultipartReply reply = input.getResult().get(0); - final TranslatorKey translatorKey = new TranslatorKey(reply.getVersion(), MultipartReplyAggregateCase.class.getName()); - final MessageTranslator messageTranslator = translatorLibrary.lookupTranslator(translatorKey); - List aggregStats = new ArrayList(); - - for (MultipartReply multipartReply : input.getResult()) { - aggregStats.add(messageTranslator.translate(multipartReply, deviceContext, null)); - } - - GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder getAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder = - new GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder(); - getAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder.setAggregatedFlowStatistics(aggregStats); - - rpcResult = RpcResultBuilder - .success() - .withResult(getAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder.build()) - .build(); - - } else { - rpcResult = RpcResultBuilder - .failed() - .withRpcErrors(input.getErrors()) - .build(); - } - return rpcResult; - } - }); - + return Futures.transform(matchingFlowsInTable.handleServiceCall(input), matchingConvertor); } + /** + * @deprecated provided for Be-release as backward compatibility relic + */ @Override + @Deprecated public Future> getAllFlowStatisticsFromFlowTable( final GetAllFlowStatisticsFromFlowTableInput input) { - - return handleServiceCall(new Function, - ListenableFuture>>() { - - @Override - public ListenableFuture> apply(final RequestContext requestContext) { - - final MultipartRequestFlowBuilder mprFlowRequestBuilder = new MultipartRequestFlowBuilder(); - mprFlowRequestBuilder.setTableId(input.getTableId().getValue()); - mprFlowRequestBuilder.setOutPort(OFConstants.OFPP_ANY); - mprFlowRequestBuilder.setOutGroup(OFConstants.OFPG_ANY); - mprFlowRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE); - mprFlowRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK); - - final short version = getVersion(); - FlowCreatorUtil.setWildcardedFlowMatch(version, mprFlowRequestBuilder); - - final MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder = new MultipartRequestFlowCaseBuilder(); - multipartRequestFlowCaseBuilder.setMultipartRequestFlow(mprFlowRequestBuilder.build()); - - final Xid xid = requestContext.getXid(); - final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader( - MultipartType.OFPMPFLOW, xid.getValue(), version); - - mprInput.setMultipartRequestBody(multipartRequestFlowCaseBuilder.build()); - return StatisticsServiceUtil.getRpcResultListenableFuture(xid, mprInput.build(), getDeviceContext()); - } - }); + if (delegate != null) { + return delegate.getAllFlowStatisticsFromFlowTable(input); + } else { + throw new IllegalAccessError("no delegate available - service is currently out of order"); + } } + /** + * @deprecated provided for Be-release as backward compatibility relic + */ @Override + @Deprecated public Future> getAllFlowsStatisticsFromAllFlowTables( final GetAllFlowsStatisticsFromAllFlowTablesInput input) { - - - return handleServiceCall(new Function, - ListenableFuture>>() { - - @Override - public ListenableFuture> apply(final RequestContext requestContext) { - - final MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder = new MultipartRequestFlowCaseBuilder(); - final MultipartRequestFlowBuilder mprFlowRequestBuilder = new MultipartRequestFlowBuilder(); - mprFlowRequestBuilder.setTableId(OFConstants.OFPTT_ALL); - mprFlowRequestBuilder.setOutPort(OFConstants.OFPP_ANY); - mprFlowRequestBuilder.setOutGroup(OFConstants.OFPG_ANY); - mprFlowRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE); - mprFlowRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK); - final short version = getVersion(); - FlowCreatorUtil.setWildcardedFlowMatch(version, mprFlowRequestBuilder); - - final Xid xid = requestContext.getXid(); - final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader( - MultipartType.OFPMPFLOW, xid.getValue(), version); - - multipartRequestFlowCaseBuilder.setMultipartRequestFlow(mprFlowRequestBuilder.build()); - mprInput.setMultipartRequestBody(multipartRequestFlowCaseBuilder.build()); - return StatisticsServiceUtil.getRpcResultListenableFuture(xid, mprInput.build(), getDeviceContext()); - } - }); + if (delegate != null) { + return delegate.getAllFlowsStatisticsFromAllFlowTables(input); + } else { + throw new IllegalAccessError("no delegate available - service is currently out of order"); + } } + /** + * @deprecated provided for Be-release as backward compatibility relic + */ @Override + @Deprecated public Future> getFlowStatisticsFromFlowTable( final GetFlowStatisticsFromFlowTableInput input) { - - - return handleServiceCall(new Function, ListenableFuture>>() { - - @Override - public ListenableFuture> apply(final RequestContext requestContext) { - - final MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder = new MultipartRequestFlowCaseBuilder(); - final MultipartRequestFlowBuilder mprFlowRequestBuilder = new MultipartRequestFlowBuilder(); - mprFlowRequestBuilder.setTableId(input.getTableId()); - - if (input.getOutPort() != null) { - mprFlowRequestBuilder.setOutPort(input.getOutPort().longValue()); - } else { - mprFlowRequestBuilder.setOutPort(OFConstants.OFPP_ANY); - } - - if (input.getOutGroup() != null) { - mprFlowRequestBuilder.setOutGroup(input.getOutGroup()); - } else { - mprFlowRequestBuilder.setOutGroup(OFConstants.OFPG_ANY); - } - - if (input.getCookie() != null) { - mprFlowRequestBuilder.setCookie(input.getCookie().getValue()); - } else { - mprFlowRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE); - } - - if (input.getCookieMask() != null) { - mprFlowRequestBuilder.setCookieMask(input.getCookieMask().getValue()); - } else { - mprFlowRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK); - } - - // convert and inject match - final short version = getVersion(); - final DeviceContext deviceContext = getDeviceContext(); - MatchReactor.getInstance().convert(input.getMatch(), version, mprFlowRequestBuilder, - deviceContext.getPrimaryConnectionContext().getFeatures().getDatapathId()); - - // Set request body to main multipart request - final Xid xid = requestContext.getXid(); - multipartRequestFlowCaseBuilder.setMultipartRequestFlow(mprFlowRequestBuilder.build()); - final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader( - MultipartType.OFPMPFLOW, xid.getValue(), version); - mprInput.setMultipartRequestBody(multipartRequestFlowCaseBuilder.build()); - return StatisticsServiceUtil.getRpcResultListenableFuture(xid, mprInput.build(), getDeviceContext()); - } - }); + if (delegate != null) { + return delegate.getFlowStatisticsFromFlowTable(input); + } else { + throw new IllegalAccessError("no delegate available - service is currently out of order"); + } } - }