X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflowplugin-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fimpl%2Fstatistics%2Fservices%2FOpendaylightFlowTableStatisticsServiceImpl.java;h=fbd7825ed0dea5f210df69fb757ced9fa0694fbb;hb=refs%2Fchanges%2F54%2F99854%2F3;hp=d39d48e2730a0a367a5bbb62855adc4ff136a337;hpb=b153612ee6499974635d6064e6d7aa636ee1ccb8;p=openflowplugin.git diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OpendaylightFlowTableStatisticsServiceImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OpendaylightFlowTableStatisticsServiceImpl.java index d39d48e273..fbd7825ed0 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OpendaylightFlowTableStatisticsServiceImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OpendaylightFlowTableStatisticsServiceImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,49 +7,110 @@ */ package org.opendaylight.openflowplugin.impl.statistics.services; -import java.util.concurrent.Future; +import com.google.common.util.concurrent.ListenableFuture; +import java.util.List; +import java.util.concurrent.atomic.AtomicLong; +import org.opendaylight.mdsal.binding.api.NotificationPublishService; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack; import org.opendaylight.openflowplugin.api.openflow.device.Xid; -import org.opendaylight.openflowplugin.impl.services.AbstractSimpleService; -import org.opendaylight.openflowplugin.impl.services.RequestInputUtils; +import org.opendaylight.openflowplugin.impl.services.util.RequestInputUtils; +import org.opendaylight.openflowplugin.impl.statistics.services.compatibility.AbstractCompatibleStatService; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter64; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.FlowTableStatisticsUpdate; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.FlowTableStatisticsUpdateBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.GetFlowTablesStatisticsInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.GetFlowTablesStatisticsOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.GetFlowTablesStatisticsOutputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.OpendaylightFlowTableStatisticsService; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.and.statistics.map.FlowTableAndStatisticsMap; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.and.statistics.map.FlowTableAndStatisticsMapBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.and.statistics.map.FlowTableAndStatisticsMapKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.TransactionId; 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.OfHeader; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.MultipartReplyTable; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.multipart.reply.table.TableStats; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table._case.MultipartRequestTableBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableId; +import org.opendaylight.yangtools.yang.binding.util.BindingMap; +import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.common.RpcResult; -public final class OpendaylightFlowTableStatisticsServiceImpl extends AbstractSimpleService implements +public final class OpendaylightFlowTableStatisticsServiceImpl extends + AbstractCompatibleStatService implements OpendaylightFlowTableStatisticsService { - public OpendaylightFlowTableStatisticsServiceImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { - super(requestContextStack, deviceContext, GetFlowTablesStatisticsOutput.class); + private final NotificationPublishService notificationPublishService; + + public OpendaylightFlowTableStatisticsServiceImpl(final RequestContextStack requestContextStack, + final DeviceContext deviceContext, + final AtomicLong compatibilityXidSeed, + final NotificationPublishService notificationPublishService) { + super(requestContextStack, deviceContext, compatibilityXidSeed); + this.notificationPublishService = notificationPublishService; } @Override - public Future> getFlowTablesStatistics( + public ListenableFuture> getFlowTablesStatistics( final GetFlowTablesStatisticsInput input) { - return handleServiceCall(input); + return handleAndNotify(input, notificationPublishService); } @Override protected OfHeader buildRequest(final Xid xid, final GetFlowTablesStatisticsInput input) { // Create multipart request body for fetch all the group stats - final MultipartRequestTableCaseBuilder multipartRequestTableCaseBuilder = new MultipartRequestTableCaseBuilder(); + final MultipartRequestTableCaseBuilder multipartRequestTableCaseBuilder = + new MultipartRequestTableCaseBuilder(); final MultipartRequestTableBuilder multipartRequestTableBuilder = new MultipartRequestTableBuilder(); - multipartRequestTableBuilder.setEmpty(true); + multipartRequestTableBuilder.setEmpty(Empty.value()); multipartRequestTableCaseBuilder.setMultipartRequestTable(multipartRequestTableBuilder.build()); // Set request body to main multipart request final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader( - MultipartType.OFPMPFLOW, xid.getValue(), getVersion()); + MultipartType.OFPMPTABLE, xid.getValue(), getVersion()); mprInput.setMultipartRequestBody(multipartRequestTableCaseBuilder.build()); return mprInput.build(); } + + @Override + public GetFlowTablesStatisticsOutput buildTxCapableResult(final TransactionId emulatedTxId) { + return new GetFlowTablesStatisticsOutputBuilder().setTransactionId(emulatedTxId).build(); + } + + @Override + public FlowTableStatisticsUpdate transformToNotification(final List mpReplyList, + final TransactionId emulatedTxId) { + FlowTableStatisticsUpdateBuilder notification = new FlowTableStatisticsUpdateBuilder(); + notification.setId(getDeviceInfo().getNodeId()); + notification.setMoreReplies(Boolean.FALSE); + notification.setTransactionId(emulatedTxId); + + final var salFlowStats = BindingMap.orderedBuilder(); + for (MultipartReply mpReply : mpReplyList) { + MultipartReplyTableCase caseBody = (MultipartReplyTableCase) mpReply.getMultipartReplyBody(); + MultipartReplyTable replyBody = caseBody.getMultipartReplyTable(); + + //TODO: Duplicate code: look at MultiReplyTranslatorUtil method translateTable + for (TableStats swTableStats : replyBody.nonnullTableStats()) { + FlowTableAndStatisticsMapBuilder statisticsBuilder = new FlowTableAndStatisticsMapBuilder(); + statisticsBuilder.setActiveFlows(new Counter32(swTableStats.getActiveCount())); + statisticsBuilder.setPacketsLookedUp(new Counter64(swTableStats.getLookupCount())); + statisticsBuilder.setPacketsMatched(new Counter64(swTableStats.getMatchedCount())); + statisticsBuilder.setTableId(new TableId(swTableStats.getTableId())); + salFlowStats.add(statisticsBuilder.build()); + } + } + + return notification.setFlowTableAndStatisticsMap(salFlowStats.build()).build(); + } }