From b55780a64bdcd852e705d01255d837dab8996325 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Mon, 25 May 2015 20:07:46 +0200 Subject: [PATCH] Simplify CommonService interface Introduce utility RequestCallback classes, which encapsulate common FutureCallbackFunctionality. Instead of transforming functions, introduce sendRequest() abstract method. This method is invoked once the request has been allocated and it is responsible for building the request payload and calling commitRequest() with the payload and appropriate callback. Also introduce AbstractVoidService, which maps responses to Void and ensures the slot is always committed. It also enqueues a VoidFutureCallback to complete the request. AbstractSimpleService handles remapping of result to the appropriate class, if it is present. AbstractMultipartService handles gathering of multipart requests. Change-Id: I047ff873f09a5dd7e95d8dc101429f7c3ee248a1 Signed-off-by: Robert Varga --- .../services/AbstractMultipartService.java | 27 ++ .../services/AbstractRequestCallback.java | 61 ++++ ...ommonService.java => AbstractService.java} | 52 ++- .../impl/services/AbstractSimpleService.java | 30 ++ .../impl/services/AbstractVoidService.java | 26 ++ .../FlowCapableTransactionServiceImpl.java | 50 +-- .../impl/services/FlowRemoveService.java | 31 ++ .../impl/services/FlowService.java | 69 ++++ .../impl/services/GroupService.java | 31 ++ .../impl/services/MeterService.java | 31 ++ .../services/MultipartRequestCallback.java | 49 +++ .../impl/services/NodeConfigServiceImpl.java | 44 +-- .../services/PacketProcessingServiceImpl.java | 47 +-- .../impl/services/SalEchoServiceImpl.java | 58 +--- .../impl/services/SalFlowServiceImpl.java | 171 +++------- .../impl/services/SalGroupServiceImpl.java | 86 +---- .../impl/services/SalMeterServiceImpl.java | 88 +---- .../impl/services/SalPortServiceImpl.java | 58 +--- .../impl/services/SalTableServiceImpl.java | 176 ++++------ .../impl/services/SimpleRequestCallback.java | 50 +++ .../impl/services/VoidRequestCallback.java | 29 ++ .../AggregateFlowsInTableService.java | 53 +++ .../services/AllFlowsInAllTablesService.java | 53 +++ .../services/AllFlowsInTableService.java | 53 +++ .../services/AllGroupsStatsService.java | 55 ++++ .../services/AllMeterConfigStatsService.java | 51 +++ .../services/AllMeterStatsService.java | 52 +++ .../services/AllPortStatsService.java | 51 +++ .../services/AllQueuesAllPortsService.java | 52 +++ .../services/AllQueuesOnePortService.java | 52 +++ .../services/FlowsInTableService.java | 74 +++++ .../services/GroupDescriptionService.java | 37 +++ .../services/GroupFeaturesService.java | 38 +++ .../services/GroupStatsService.java | 42 +++ .../services/MatchingFlowsInTableService.java | 81 +++++ .../services/MeterFeaturesService.java | 37 +++ .../services/MeterStatsService.java | 44 +++ .../services/OneQueueOnePortService.java | 48 +++ ...OpendaylightFlowStatisticsServiceImpl.java | 304 +++--------------- ...aylightFlowTableStatisticsServiceImpl.java | 50 ++- ...pendaylightGroupStatisticsServiceImpl.java | 124 +------ ...pendaylightMeterStatisticsServiceImpl.java | 126 +------- ...OpendaylightPortStatisticsServiceImpl.java | 81 +---- ...pendaylightQueueStatisticsServiceImpl.java | 112 +------ .../statistics/services/PortStatsService.java | 51 +++ .../dedicated/StatisticsGatheringService.java | 69 +--- .../impl/util/StatisticsServiceUtil.java | 47 --- 47 files changed, 1694 insertions(+), 1407 deletions(-) create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/AbstractMultipartService.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/AbstractRequestCallback.java rename openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/{CommonService.java => AbstractService.java} (60%) create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/AbstractSimpleService.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/AbstractVoidService.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/FlowRemoveService.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/FlowService.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/GroupService.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/MeterService.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/MultipartRequestCallback.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SimpleRequestCallback.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/VoidRequestCallback.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AggregateFlowsInTableService.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllFlowsInAllTablesService.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllFlowsInTableService.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllGroupsStatsService.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllMeterConfigStatsService.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllMeterStatsService.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllPortStatsService.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllQueuesAllPortsService.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllQueuesOnePortService.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/FlowsInTableService.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/GroupDescriptionService.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/GroupFeaturesService.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/GroupStatsService.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/MatchingFlowsInTableService.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/MeterFeaturesService.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/MeterStatsService.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OneQueueOnePortService.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/PortStatsService.java delete mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/util/StatisticsServiceUtil.java diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/AbstractMultipartService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/AbstractMultipartService.java new file mode 100644 index 0000000000..2881d6dcc3 --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/AbstractMultipartService.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.services; + +import com.google.common.util.concurrent.FutureCallback; +import java.util.List; +import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; +import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; +import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReply; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; + +public abstract class AbstractMultipartService extends AbstractService> { + protected AbstractMultipartService(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + super(requestContextStack, deviceContext); + } + + @Override + protected final FutureCallback createCallback(final RequestContext> context, final Class requestType) { + return new MultipartRequestCallback(context, requestType, getDeviceContext()); + } +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/AbstractRequestCallback.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/AbstractRequestCallback.java new file mode 100644 index 0000000000..47692c7956 --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/AbstractRequestCallback.java @@ -0,0 +1,61 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.services; + +import com.google.common.base.Preconditions; +import com.google.common.util.concurrent.FutureCallback; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import org.opendaylight.openflowjava.protocol.api.connection.DeviceRequestFailedException; +import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; +import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy; +import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy.STATISTIC_GROUP; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.Error; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; +import org.opendaylight.yangtools.yang.common.RpcError; +import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; + +abstract class AbstractRequestCallback implements FutureCallback { + private final RequestContext context; + private final Class requestType; + private final MessageSpy spy; + + protected AbstractRequestCallback(final RequestContext context, final Class requestType, final MessageSpy spy) { + this.context = Preconditions.checkNotNull(context); + this.requestType = Preconditions.checkNotNull(requestType); + this.spy = Preconditions.checkNotNull(spy); + } + + protected final void setResult(@Nullable final RpcResult result) { + context.setResult(result); + context.close(); + } + + protected final void spyMessage(@Nonnull final STATISTIC_GROUP group) { + spy.spyMessage(requestType, Preconditions.checkNotNull(group)); + } + + @Override + public final void onFailure(final Throwable t) { + final RpcResultBuilder builder; + if (t instanceof DeviceRequestFailedException) { + final Error err = ((DeviceRequestFailedException) t).getError(); + final String errorString = String.format("Device reported error type %s code %s", err.getTypeString(), err.getCodeString()); + + builder = RpcResultBuilder.failed().withError(RpcError.ErrorType.APPLICATION, errorString, t); + spyMessage(MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_FAILURE); + } else { + builder = RpcResultBuilder.failed().withError(RpcError.ErrorType.APPLICATION, t.getMessage(), t); + spyMessage(MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_ERROR); + } + + context.setResult(builder.build()); + RequestContextUtil.closeRequstContext(context); + } +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/CommonService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/AbstractService.java similarity index 60% rename from openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/CommonService.java rename to openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/AbstractService.java index a56b6432f7..075271017e 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/CommonService.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/AbstractService.java @@ -7,24 +7,32 @@ */ package org.opendaylight.openflowplugin.impl.services; -import com.google.common.base.Function; +import com.google.common.base.Preconditions; +import com.google.common.base.Verify; +import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import java.math.BigInteger; +import javax.annotation.Nonnull; import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter; +import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueue; import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack; +import org.opendaylight.openflowplugin.api.openflow.device.Xid; import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FeaturesReply; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; +import org.opendaylight.yangtools.yang.binding.DataContainer; import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -public abstract class CommonService { - private static final Logger LOG = org.slf4j.LoggerFactory.getLogger(CommonService.class); +abstract class AbstractService { + private static final Logger LOG = LoggerFactory.getLogger(AbstractService.class); private static final long WAIT_TIME = 2000; private static final BigInteger PRIMARY_CONNECTION = BigInteger.ZERO; @@ -35,7 +43,7 @@ public abstract class CommonService { private final ConnectionAdapter primaryConnectionAdapter; private final MessageSpy messageSpy; - public CommonService(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + public AbstractService(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { this.requestContextStack = requestContextStack; this.deviceContext = deviceContext; final FeaturesReply features = this.deviceContext.getPrimaryConnectionContext().getFeatures(); @@ -65,14 +73,25 @@ public abstract class CommonService { return messageSpy; } + protected abstract OfHeader buildRequest(Xid xid, I input); + protected abstract FutureCallback createCallback(RequestContext context, Class requestType); - public final ListenableFuture> handleServiceCall(final Function, ListenableFuture>> function) { + public final ListenableFuture> handleServiceCall(@Nonnull final I input) { + Preconditions.checkNotNull(input); + + final Class requestType; + if (input instanceof DataContainer) { + requestType = ((DataContainer) input).getImplementedInterface(); + } else { + requestType = input.getClass(); + } + getMessageSpy().spyMessage(requestType, MessageSpy.STATISTIC_GROUP.TO_SWITCH_ENTERED); LOG.trace("Handling general service call"); - final RequestContext requestContext = createRequestContext(); + final RequestContext requestContext = requestContextStack.createRequestContext(); if (requestContext == null) { LOG.trace("Request context refused."); - deviceContext.getMessageSpy().spyMessage(CommonService.class, MessageSpy.STATISTIC_GROUP.TO_SWITCH_DISREGARDED); + deviceContext.getMessageSpy().spyMessage(AbstractService.class, MessageSpy.STATISTIC_GROUP.TO_SWITCH_DISREGARDED); return failedFuture(); } @@ -82,14 +101,21 @@ public abstract class CommonService { } messageSpy.spyMessage(requestContext.getClass(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_READY_FOR_SUBMIT); - function.apply(requestContext); - - return requestContext.getFuture(); - } + final Xid xid = requestContext.getXid(); + OfHeader request = null; + try { + request = buildRequest(xid, input); + Verify.verify(xid.getValue().equals(request.getXid()), "Expected XID %s got %s", xid.getValue(), request.getXid()); + } catch (Exception e) { + LOG.error("Failed to build request for {}, forfeiting request {}", input, xid.getValue(), e); + // FIXME: complete the requestContext + } finally { + final OutboundQueue outboundQueue = getDeviceContext().getPrimaryConnectionContext().getOutboundQueueProvider(); + outboundQueue.commitEntry(xid.getValue(), request, createCallback(requestContext, requestType)); + } - protected final RequestContext createRequestContext() { - return requestContextStack.createRequestContext(); + return requestContext.getFuture(); } protected static ListenableFuture> failedFuture() { diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/AbstractSimpleService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/AbstractSimpleService.java new file mode 100644 index 0000000000..38de909c2d --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/AbstractSimpleService.java @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.services; + +import com.google.common.base.Preconditions; +import com.google.common.util.concurrent.FutureCallback; +import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; +import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; +import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; +import org.opendaylight.yangtools.yang.binding.DataObject; + +public abstract class AbstractSimpleService extends AbstractService { + private final Class clazz; + + protected AbstractSimpleService(final RequestContextStack requestContextStack, final DeviceContext deviceContext, final Class clazz) { + super(requestContextStack, deviceContext); + this.clazz = Preconditions.checkNotNull(clazz); + } + + @Override + protected final FutureCallback createCallback(final RequestContext context, final Class requestType) { + return SimpleRequestCallback.create(context, requestType, getMessageSpy(), clazz); + } +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/AbstractVoidService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/AbstractVoidService.java new file mode 100644 index 0000000000..15ca0d1b9d --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/AbstractVoidService.java @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.services; + +import com.google.common.util.concurrent.FutureCallback; +import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; +import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; +import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; +import org.opendaylight.yangtools.yang.binding.DataObject; + +public abstract class AbstractVoidService extends AbstractService { + protected AbstractVoidService(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + super(requestContextStack, deviceContext); + } + + @Override + protected final FutureCallback createCallback(final RequestContext context, final Class requestType) { + return new VoidRequestCallback(context, requestType, getMessageSpy()); + } +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/FlowCapableTransactionServiceImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/FlowCapableTransactionServiceImpl.java index b601c5eb63..bbba541d3d 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/FlowCapableTransactionServiceImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/FlowCapableTransactionServiceImpl.java @@ -7,69 +7,31 @@ */ package org.opendaylight.openflowplugin.impl.services; -import com.google.common.util.concurrent.FutureCallback; import java.util.concurrent.Future; -import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueue; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; -import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack; import org.opendaylight.openflowplugin.api.openflow.device.Xid; -import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.FlowCapableTransactionService; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrierInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; -import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; -import org.opendaylight.yangtools.yang.common.RpcResultBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class FlowCapableTransactionServiceImpl extends CommonService implements FlowCapableTransactionService { - private static final RpcResult SUCCESS = RpcResultBuilder.success().build(); - private static final Logger LOG = LoggerFactory.getLogger(FlowCapableTransactionServiceImpl.class); +public class FlowCapableTransactionServiceImpl extends AbstractVoidService implements FlowCapableTransactionService { public FlowCapableTransactionServiceImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { super(requestContextStack, deviceContext); } @Override public Future> sendBarrier(final SendBarrierInput input) { - final RequestContext requestContext = getRequestContextStack().createRequestContext(); - if (requestContext == null) { - getMessageSpy().spyMessage(null, MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_FAILURE); - return failedFuture(); - } - + return handleServiceCall(input); + } + @Override + protected OfHeader buildRequest(final Xid xid, final SendBarrierInput input) { final BarrierInputBuilder barrierInputOFJavaBuilder = new BarrierInputBuilder(); - final Xid xid = requestContext.getXid(); barrierInputOFJavaBuilder.setVersion(getVersion()); barrierInputOFJavaBuilder.setXid(xid.getValue()); - final BarrierInput barrierInput = barrierInputOFJavaBuilder.build(); - - LOG.trace("Hooking xid {} to device context - precaution.", requestContext.getXid().getValue()); - - final OutboundQueue outboundQueue = getDeviceContext().getPrimaryConnectionContext().getOutboundQueueProvider(); - outboundQueue.commitEntry(xid.getValue(), barrierInput, new FutureCallback() { - @Override - public void onSuccess(final OfHeader ofHeader) { - requestContext.setResult(SUCCESS); - RequestContextUtil.closeRequstContext(requestContext); - - getMessageSpy().spyMessage(barrierInput.getImplementedInterface(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_SUCCESS); - } - - @Override - public void onFailure(final Throwable throwable) { - RpcResultBuilder rpcResultBuilder = RpcResultBuilder.failed().withError(RpcError.ErrorType.APPLICATION, throwable.getMessage(), throwable); - requestContext.setResult(rpcResultBuilder.build()); - RequestContextUtil.closeRequstContext(requestContext); - - getMessageSpy().spyMessage(barrierInput.getImplementedInterface(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_FAILURE); - } - }); - return requestContext.getFuture(); + return barrierInputOFJavaBuilder.build(); } } diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/FlowRemoveService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/FlowRemoveService.java new file mode 100644 index 0000000000..6a0bdf495d --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/FlowRemoveService.java @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.services; + +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.openflow.md.core.sal.convertor.FlowConvertor; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; + +final class FlowRemoveService extends AbstractSimpleService { + FlowRemoveService(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + super(requestContextStack, deviceContext, RemoveFlowOutput.class); + } + + @Override + protected OfHeader buildRequest(final Xid xid, final RemoveFlowInput input) { + final FlowModInputBuilder ofFlowModInput = FlowConvertor.toFlowModInput(input, getVersion(), + getDatapathId()); + ofFlowModInput.setXid(xid.getValue()); + return ofFlowModInput.build(); + } +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/FlowService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/FlowService.java new file mode 100644 index 0000000000..ee0d64e57c --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/FlowService.java @@ -0,0 +1,69 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.services; + +import com.google.common.util.concurrent.FutureCallback; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.SettableFuture; +import java.util.ArrayList; +import java.util.List; +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.openflow.md.core.sal.convertor.FlowConvertor; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; + +final class FlowService extends AbstractSimpleService { + + protected FlowService(final RequestContextStack requestContextStack, final DeviceContext deviceContext, final Class clazz) { + super(requestContextStack, deviceContext, clazz); + } + + @Override + protected OfHeader buildRequest(final Xid xid, final FlowModInputBuilder input) { + input.setXid(xid.getValue()); + return input.build(); + } + + List toFlowModInputs(final Flow input) { + return FlowConvertor.toFlowModInputs(input, getVersion(), getDatapathId()); + } + + ListenableFuture> processFlowModInputBuilders(final List ofFlowModInputs) { + final List>> partialFutures = new ArrayList<>(ofFlowModInputs.size()); + + for (final FlowModInputBuilder flowModInputBuilder : ofFlowModInputs) { + partialFutures.add(handleServiceCall(flowModInputBuilder)); + } + + final ListenableFuture>> allFutures = Futures.successfulAsList(partialFutures); + final SettableFuture> finalFuture = SettableFuture.create(); + Futures.addCallback(allFutures, new FutureCallback>>() { + @Override + public void onSuccess(final List> results) { + RpcResultBuilder rpcResultBuilder = RpcResultBuilder.success(); + finalFuture.set(rpcResultBuilder.build()); + } + + @Override + public void onFailure(final Throwable t) { + RpcResultBuilder rpcResultBuilder = RpcResultBuilder.failed(); + finalFuture.set(rpcResultBuilder.build()); + } + }); + + return finalFuture; + } + +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/GroupService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/GroupService.java new file mode 100644 index 0000000000..431fea1e23 --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/GroupService.java @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.services; + +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.openflow.md.core.sal.convertor.GroupConvertor; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; +import org.opendaylight.yangtools.yang.binding.DataObject; + +final class GroupService extends AbstractSimpleService { + GroupService(final RequestContextStack requestContextStack, final DeviceContext deviceContext, final Class clazz) { + super(requestContextStack, deviceContext, clazz); + } + + @Override + protected OfHeader buildRequest(final Xid xid, final I input) { + final GroupModInputBuilder ofGroupModInput = GroupConvertor.toGroupModInput(input, getVersion(), getDatapathId()); + ofGroupModInput.setXid(xid.getValue()); + + return ofGroupModInput.build(); + } +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/MeterService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/MeterService.java new file mode 100644 index 0000000000..73cf63f4ec --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/MeterService.java @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.services; + +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.openflow.md.core.sal.convertor.MeterConvertor; +import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.Meter; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; +import org.opendaylight.yangtools.yang.binding.DataObject; + +final class MeterService extends AbstractSimpleService { + + MeterService(final RequestContextStack requestContextStack, final DeviceContext deviceContext, final Class clazz) { + super(requestContextStack, deviceContext, clazz); + } + + @Override + protected OfHeader buildRequest(final Xid xid, final I input) { + final MeterModInputBuilder ofMeterModInput = MeterConvertor.toMeterModInput(input, getVersion()); + ofMeterModInput.setXid(xid.getValue()); + return ofMeterModInput.build(); + } +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/MultipartRequestCallback.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/MultipartRequestCallback.java new file mode 100644 index 0000000000..56a12a4248 --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/MultipartRequestCallback.java @@ -0,0 +1,49 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.services; + +import java.util.List; +import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; +import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; +import org.opendaylight.openflowplugin.api.openflow.device.handlers.MultiMsgCollector; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReply; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; +import org.opendaylight.yangtools.yang.common.RpcError; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +final class MultipartRequestCallback extends AbstractRequestCallback> { + private static final Logger LOG = LoggerFactory.getLogger(MultipartRequestCallback.class); + private final MultiMsgCollector collector; + + public MultipartRequestCallback(final RequestContext> context, final Class requestType, final DeviceContext deviceContext) { + super(context, requestType, deviceContext.getMessageSpy()); + collector = deviceContext.getMultiMsgCollector(context); + } + + @Override + public void onSuccess(final OfHeader result) { + if (result == null) { + LOG.info("Ofheader was null."); + collector.endCollecting(); + return; + } + + if (!(result instanceof MultipartReply)) { + LOG.info("Unexpected response type received {}.", result.getClass()); + final RpcResultBuilder> rpcResultBuilder = + RpcResultBuilder.>failed().withError(RpcError.ErrorType.APPLICATION, + String.format("Unexpected response type received %s.", result.getClass())); + setResult(rpcResultBuilder.build()); + } else { + collector.addMultipartMsg((MultipartReply) result); + } + } + +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/NodeConfigServiceImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/NodeConfigServiceImpl.java index c83cc4143a..420dc80827 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/NodeConfigServiceImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/NodeConfigServiceImpl.java @@ -7,67 +7,37 @@ */ package org.opendaylight.openflowplugin.impl.services; -import com.google.common.util.concurrent.FutureCallback; import java.util.concurrent.Future; -import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueue; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; -import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack; import org.opendaylight.openflowplugin.api.openflow.device.Xid; -import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy; import org.opendaylight.yang.gen.v1.urn.opendaylight.module.config.rev141015.NodeConfigService; import org.opendaylight.yang.gen.v1.urn.opendaylight.module.config.rev141015.SetConfigInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.module.config.rev141015.SetConfigOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.SwitchConfigFlag; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetConfigInputBuilder; -import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; -import org.opendaylight.yangtools.yang.common.RpcResultBuilder; -public class NodeConfigServiceImpl extends CommonService implements NodeConfigService { +public final class NodeConfigServiceImpl extends AbstractSimpleService implements NodeConfigService { public NodeConfigServiceImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { - super(requestContextStack, deviceContext); + super(requestContextStack, deviceContext, SetConfigOutput.class); } @Override public Future> setConfig(final SetConfigInput input) { - final RequestContext requestContext = createRequestContext(); - if (requestContext == null) { - return failedFuture(); - } + return handleServiceCall(input); + } + @Override + protected OfHeader buildRequest(final Xid xid, final SetConfigInput input) { SetConfigInputBuilder builder = new SetConfigInputBuilder(); SwitchConfigFlag flag = SwitchConfigFlag.valueOf(input.getFlag()); - final Xid xid = requestContext.getXid(); builder.setXid(xid.getValue()); builder.setFlags(flag); builder.setMissSendLen(input.getMissSearchLength()); builder.setVersion(getVersion()); - final org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetConfigInput setConfigInput = builder.build(); - - final OutboundQueue outboundQueue = getDeviceContext().getPrimaryConnectionContext().getOutboundQueueProvider(); - outboundQueue.commitEntry(xid.getValue(), setConfigInput, new FutureCallback() { - @Override - public void onSuccess(final OfHeader ofHeader) { - RpcResultBuilder rpcResultBuilder = RpcResultBuilder.success((SetConfigOutput)ofHeader); - requestContext.setResult(rpcResultBuilder.build()); - RequestContextUtil.closeRequstContext(requestContext); - - getMessageSpy().spyMessage(setConfigInput.getImplementedInterface(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_SUCCESS); - } - - @Override - public void onFailure(final Throwable throwable) { - RpcResultBuilder rpcResultBuilder = RpcResultBuilder.failed().withError(RpcError.ErrorType.APPLICATION, throwable.getMessage(), throwable); - requestContext.setResult(rpcResultBuilder.build()); - RequestContextUtil.closeRequstContext(requestContext); - - getMessageSpy().spyMessage(setConfigInput.getImplementedInterface(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_FAILURE); - } - }); - return requestContext.getFuture(); - + return builder.build(); } } diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/PacketProcessingServiceImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/PacketProcessingServiceImpl.java index c59b5fee8d..85e198ef24 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/PacketProcessingServiceImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/PacketProcessingServiceImpl.java @@ -7,26 +7,17 @@ */ package org.opendaylight.openflowplugin.impl.services; -import com.google.common.base.Function; -import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.ListenableFuture; import java.util.concurrent.Future; -import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueue; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; -import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack; import org.opendaylight.openflowplugin.api.openflow.device.Xid; -import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.PacketOutConvertor; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService; import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput; -import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; -import org.opendaylight.yangtools.yang.common.RpcResultBuilder; -public class PacketProcessingServiceImpl extends CommonService implements PacketProcessingService { +public final class PacketProcessingServiceImpl extends AbstractVoidService implements PacketProcessingService { public PacketProcessingServiceImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { super(requestContextStack, deviceContext); @@ -34,37 +25,11 @@ public class PacketProcessingServiceImpl extends CommonService implements Packet @Override public Future> transmitPacket(final TransmitPacketInput input) { - getMessageSpy().spyMessage(input.getImplementedInterface(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_ENTERED); - - return handleServiceCall(new Function, ListenableFuture>>() { - @Override - public ListenableFuture> apply(final RequestContext requestContext) { - final Xid xid = requestContext.getXid(); - final PacketOutInput message = PacketOutConvertor.toPacketOutInput(input, getVersion(), xid.getValue(), - getDatapathId()); - - final OutboundQueue outboundQueue = getDeviceContext().getPrimaryConnectionContext().getOutboundQueueProvider(); - - outboundQueue.commitEntry(xid.getValue(), message, new FutureCallback() { - @Override - public void onSuccess(final OfHeader ofHeader) { - getMessageSpy().spyMessage(message.getImplementedInterface(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_SUCCESS); - final RpcResultBuilder rpcResultBuilder = RpcResultBuilder.success(); - requestContext.setResult(rpcResultBuilder.build()); - RequestContextUtil.closeRequstContext(requestContext); - } - - @Override - public void onFailure(final Throwable throwable) { - getMessageSpy().spyMessage(message.getImplementedInterface(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_FAILURE); - final RpcResultBuilder rpcResultBuilder = RpcResultBuilder.failed().withError(RpcError.ErrorType.APPLICATION, throwable.getMessage(), throwable); - requestContext.setResult(rpcResultBuilder.build()); - RequestContextUtil.closeRequstContext(requestContext); - } - }); - return requestContext.getFuture(); - } - }); + return handleServiceCall(input); + } + @Override + protected OfHeader buildRequest(final Xid xid, final TransmitPacketInput input) { + return PacketOutConvertor.toPacketOutInput(input, getVersion(), xid.getValue(), getDatapathId()); } } diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalEchoServiceImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalEchoServiceImpl.java index 188e79c7c6..ce952bf1d1 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalEchoServiceImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalEchoServiceImpl.java @@ -7,73 +7,33 @@ */ package org.opendaylight.openflowplugin.impl.services; -import com.google.common.util.concurrent.FutureCallback; import java.util.concurrent.Future; -import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueue; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; -import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack; import org.opendaylight.openflowplugin.api.openflow.device.Xid; -import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy; import org.opendaylight.yang.gen.v1.urn.opendaylight.echo.service.rev150305.SalEchoService; import org.opendaylight.yang.gen.v1.urn.opendaylight.echo.service.rev150305.SendEchoInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.echo.service.rev150305.SendEchoOutput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; -import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; -import org.opendaylight.yangtools.yang.common.RpcResultBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class SalEchoServiceImpl extends CommonService implements SalEchoService { - - private static final Logger LOG = LoggerFactory.getLogger(SalEchoServiceImpl.class); +public final class SalEchoServiceImpl extends AbstractSimpleService implements SalEchoService { public SalEchoServiceImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { - super(requestContextStack, deviceContext); + super(requestContextStack, deviceContext, SendEchoOutput.class); } @Override public Future> sendEcho(final SendEchoInput sendEchoInput) { - final RequestContext requestContext = getRequestContextStack().createRequestContext(); - if (requestContext == null) { - getMessageSpy().spyMessage(null, MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_FAILURE); - return failedFuture(); - } + return handleServiceCall(sendEchoInput); + } - LOG.trace("Hooking xid {} to device context - precaution.", requestContext.getXid().getValue()); - final Xid xid = requestContext.getXid(); + @Override + protected OfHeader buildRequest(final Xid xid, final SendEchoInput input) { final EchoInputBuilder echoInputOFJavaBuilder = new EchoInputBuilder(); echoInputOFJavaBuilder.setVersion(getVersion()); - echoInputOFJavaBuilder.setXid(requestContext.getXid().getValue()); - echoInputOFJavaBuilder.setData(sendEchoInput.getData()); - final EchoInput echoInputOFJava = echoInputOFJavaBuilder.build(); - - LOG.debug("Echo with xid {} was sent from controller", xid); - - final OutboundQueue outboundQueue = getDeviceContext().getPrimaryConnectionContext().getOutboundQueueProvider(); - outboundQueue.commitEntry(xid.getValue(), echoInputOFJava, new FutureCallback() { - - @Override - public void onSuccess(final OfHeader ofHeader) { - RpcResultBuilder rpcResultBuilder = RpcResultBuilder.success((SendEchoOutput)ofHeader); - requestContext.setResult(rpcResultBuilder.build()); - RequestContextUtil.closeRequstContext(requestContext); - - getMessageSpy().spyMessage(echoInputOFJava.getImplementedInterface(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_SUCCESS); - } - - @Override - public void onFailure(final Throwable throwable) { - RpcResultBuilder rpcResultBuilder = RpcResultBuilder.failed().withError(RpcError.ErrorType.APPLICATION, throwable.getMessage(), throwable); - requestContext.setResult(rpcResultBuilder.build()); - RequestContextUtil.closeRequstContext(requestContext); - - getMessageSpy().spyMessage(echoInputOFJava.getImplementedInterface(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_FAILURE); - } - }); - return requestContext.getFuture(); + echoInputOFJavaBuilder.setXid(xid.getValue()); + echoInputOFJavaBuilder.setData(input.getData()); + return echoInputOFJavaBuilder.build(); } } diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalFlowServiceImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalFlowServiceImpl.java index 430da50c07..515acd9186 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalFlowServiceImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalFlowServiceImpl.java @@ -1,34 +1,27 @@ /** * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - *

+ * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.openflowplugin.impl.services; -import com.google.common.base.Function; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; -import com.google.common.util.concurrent.SettableFuture; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; -import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueue; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; -import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack; import org.opendaylight.openflowplugin.api.openflow.registry.flow.DeviceFlowRegistry; import org.opendaylight.openflowplugin.api.openflow.registry.flow.FlowDescriptor; import org.opendaylight.openflowplugin.api.openflow.registry.flow.FlowRegistryKey; -import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy; import org.opendaylight.openflowplugin.impl.registry.flow.FlowDescriptorFactory; import org.opendaylight.openflowplugin.impl.registry.flow.FlowRegistryKeyFactory; import org.opendaylight.openflowplugin.impl.util.FlowUtil; -import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.FlowConvertor; import org.opendaylight.openflowplugin.openflow.md.util.FlowCreatorUtil; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow; @@ -44,29 +37,27 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.Upda import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.OriginalFlow; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlow; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; import org.opendaylight.yangtools.yang.common.RpcError; -import org.opendaylight.yangtools.yang.common.RpcError.ErrorType; import org.opendaylight.yangtools.yang.common.RpcResult; -import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -public class SalFlowServiceImpl extends CommonService implements SalFlowService { - - private static final Logger LOG = org.slf4j.LoggerFactory.getLogger(SalFlowServiceImpl.class); +public class SalFlowServiceImpl implements SalFlowService { + private static final Logger LOG = LoggerFactory.getLogger(SalFlowServiceImpl.class); + private final FlowService flowUpdate; + private final FlowService flowAdd; + private final FlowRemoveService flowRemove; public SalFlowServiceImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { - super(requestContextStack, deviceContext); + flowRemove = new FlowRemoveService(requestContextStack, deviceContext); + flowAdd = new FlowService<>(requestContextStack, deviceContext, AddFlowOutput.class); + flowUpdate = new FlowService<>(requestContextStack, deviceContext, UpdateFlowOutput.class); } @Override public Future> addFlow(final AddFlowInput input) { - getMessageSpy().spyMessage(input.getImplementedInterface(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_ENTERED); - - final List ofFlowModInputs = FlowConvertor.toFlowModInputs(input, getVersion(), getDatapathId()); - final ListenableFuture> future = processFlowModInputBuilders(ofFlowModInputs); + final ListenableFuture> future = flowAdd.processFlowModInputBuilders(flowAdd.toFlowModInputs(input)); final FlowId flowId; if (null != input.getFlowRef()) { flowId = input.getFlowRef().getValue().firstKeyOf(Flow.class, FlowKey.class).getId(); @@ -74,13 +65,11 @@ public class SalFlowServiceImpl extends CommonService implements SalFlowService flowId = FlowUtil.createAlienFlowId(input.getTableId()); } - final DeviceContext deviceContext = getDeviceContext(); + final DeviceContext deviceContext = flowAdd.getDeviceContext(); final FlowRegistryKey flowRegistryKey = FlowRegistryKeyFactory.create(input); final FlowDescriptor flowDescriptor = FlowDescriptorFactory.create(input.getTableId(), flowId); deviceContext.getDeviceFlowRegistry().store(flowRegistryKey, flowDescriptor); Futures.addCallback(future, new FutureCallback>() { - - @Override public void onSuccess(final RpcResult rpcResult) { if (rpcResult.isSuccessful()) { @@ -103,44 +92,35 @@ public class SalFlowServiceImpl extends CommonService implements SalFlowService @Override public Future> removeFlow(final RemoveFlowInput input) { LOG.trace("Calling remove flow for flow with ID ={}.", input.getFlowRef()); - return handleServiceCall(new Function, ListenableFuture>>() { - @Override - public ListenableFuture> apply(final RequestContext requestContext) { - final FlowModInputBuilder ofFlowModInput = FlowConvertor.toFlowModInput(input, getVersion(), - getDatapathId()); - final ListenableFuture> future = createResultForFlowMod(requestContext, ofFlowModInput); - Futures.addCallback(future, new FutureCallback>() { - @Override - public void onSuccess(final RpcResult o) { - final DeviceContext deviceContext = getDeviceContext(); - getMessageSpy().spyMessage(input.getImplementedInterface(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_SUCCESS); - FlowRegistryKey flowRegistryKey = FlowRegistryKeyFactory.create(input); - deviceContext.getDeviceFlowRegistry().markToBeremoved(flowRegistryKey); - } - @Override - public void onFailure(final Throwable throwable) { - getMessageSpy().spyMessage(input.getImplementedInterface(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_FAILURE); - LOG.trace("Flow modification failed..", throwable); + final ListenableFuture> future = flowRemove.handleServiceCall(input); + Futures.addCallback(future, new FutureCallback>() { + @Override + public void onSuccess(final RpcResult result) { + if (result.isSuccessful()) { + FlowRegistryKey flowRegistryKey = FlowRegistryKeyFactory.create(input); + flowRemove.getDeviceContext().getDeviceFlowRegistry().markToBeremoved(flowRegistryKey); + } else { + if (LOG.isTraceEnabled()) { StringBuilder errors = new StringBuilder(); - try { - RpcResult result = future.get(); - Collection rpcErrors = result.getErrors(); - if (null != rpcErrors && rpcErrors.size() > 0) { - for (RpcError rpcError : rpcErrors) { - errors.append(rpcError.getMessage()); - } + Collection rpcErrors = result.getErrors(); + if (null != rpcErrors && rpcErrors.size() > 0) { + for (RpcError rpcError : rpcErrors) { + errors.append(rpcError.getMessage()); } - } catch (InterruptedException | ExecutionException e) { - LOG.trace("Flow modification failed. Can't read errors from RpcResult."); - } finally { - LOG.trace("Flow modification failed. Errors : {}", errors.toString()); } + LOG.trace("Flow modification failed. Errors : {}", errors.toString()); } - }); - return future; + } + } + + @Override + public void onFailure(final Throwable throwable) { + LOG.trace("Flow modification failed..", throwable); } }); + + return future; } @Override @@ -150,109 +130,42 @@ public class SalFlowServiceImpl extends CommonService implements SalFlowService final OriginalFlow original = in.getOriginalFlow(); final List allFlowMods = new ArrayList<>(); - List ofFlowModInputs; + final List ofFlowModInputs; - if (!FlowCreatorUtil.canModifyFlow(original, updated, getVersion())) { + if (!FlowCreatorUtil.canModifyFlow(original, updated, flowUpdate.getVersion())) { // We would need to remove original and add updated. // remove flow final RemoveFlowInputBuilder removeflow = new RemoveFlowInputBuilder(original); - final List ofFlowRemoveInput = FlowConvertor.toFlowModInputs(removeflow.build(), - getVersion(), getDatapathId()); + final List ofFlowRemoveInput = flowUpdate.toFlowModInputs(removeflow.build()); // remove flow should be the first allFlowMods.addAll(ofFlowRemoveInput); final AddFlowInputBuilder addFlowInputBuilder = new AddFlowInputBuilder(updated); - ofFlowModInputs = FlowConvertor.toFlowModInputs(addFlowInputBuilder.build(), getVersion(), getDatapathId()); + ofFlowModInputs = flowUpdate.toFlowModInputs(addFlowInputBuilder.build()); } else { - ofFlowModInputs = FlowConvertor.toFlowModInputs(updated, getVersion(), getDatapathId()); + ofFlowModInputs = flowUpdate.toFlowModInputs(updated); } allFlowMods.addAll(ofFlowModInputs); - ListenableFuture> future = processFlowModInputBuilders(allFlowMods); + ListenableFuture> future = flowUpdate.processFlowModInputBuilders(allFlowMods); Futures.addCallback(future, new FutureCallback>() { @Override public void onSuccess(final RpcResult o) { - final DeviceContext deviceContext = getDeviceContext(); - getMessageSpy().spyMessage(input.getImplementedInterface(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_SUCCESS); FlowRegistryKey flowRegistryKey = FlowRegistryKeyFactory.create(original); FlowRegistryKey updatedflowRegistryKey = FlowRegistryKeyFactory.create(updated); FlowId flowId = input.getFlowRef().getValue().firstKeyOf(Flow.class, FlowKey.class).getId(); FlowDescriptor flowDescriptor = FlowDescriptorFactory.create(updated.getTableId(), flowId); - final DeviceFlowRegistry deviceFlowRegistry = deviceContext.getDeviceFlowRegistry(); + final DeviceFlowRegistry deviceFlowRegistry = flowUpdate.getDeviceContext().getDeviceFlowRegistry(); deviceFlowRegistry.markToBeremoved(flowRegistryKey); deviceFlowRegistry.store(updatedflowRegistryKey, flowDescriptor); } @Override public void onFailure(final Throwable throwable) { - getMessageSpy().spyMessage(input.getImplementedInterface(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_FAILURE); + LOG.debug("Flow update failed", throwable); } }); return future; } - - private ListenableFuture> processFlowModInputBuilders(final List ofFlowModInputs) { - - final List>> partialFutures = new ArrayList<>(); - - for (final FlowModInputBuilder flowModInputBuilder : ofFlowModInputs) { - ListenableFuture> partialFuture = handleServiceCall( - new Function, ListenableFuture>>() { - @Override - public ListenableFuture> apply(final RequestContext requestContext) { - return createResultForFlowMod(requestContext, flowModInputBuilder); - } - }); - partialFutures.add(partialFuture); - } - - final ListenableFuture>> allFutures = Futures.successfulAsList(partialFutures); - final SettableFuture> finalFuture = SettableFuture.create(); - Futures.addCallback(allFutures, new FutureCallback>>() { - @Override - public void onSuccess(final List> results) { - RpcResultBuilder rpcResultBuilder = RpcResultBuilder.success(); - finalFuture.set(rpcResultBuilder.build()); - } - - @Override - public void onFailure(final Throwable t) { - RpcResultBuilder rpcResultBuilder = RpcResultBuilder.failed(); - finalFuture.set(rpcResultBuilder.build()); - } - }); - - return finalFuture; - } - - protected ListenableFuture> createResultForFlowMod(final RequestContext requestContext, final FlowModInputBuilder flowModInputBuilder) { - final OutboundQueue outboundQueue = getDeviceContext().getPrimaryConnectionContext().getOutboundQueueProvider(); - final long xid = requestContext.getXid().getValue(); - flowModInputBuilder.setXid(xid); - final FlowModInput flowModInput = flowModInputBuilder.build(); - - outboundQueue.commitEntry(xid, flowModInput, new FutureCallback() { - @Override - public void onSuccess(final OfHeader ofHeader) { - getMessageSpy().spyMessage(FlowModInput.class, MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_SUCCESS); - - RpcResultBuilder rpcResultBuilder = RpcResultBuilder.success(); - requestContext.setResult(rpcResultBuilder.build()); - - RequestContextUtil.closeRequstContext(requestContext); - } - - @Override - public void onFailure(final Throwable throwable) { - getMessageSpy().spyMessage(FlowModInput.class, MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_FAILURE); - RpcResultBuilder rpcResultBuilder = RpcResultBuilder.failed().withError(ErrorType.APPLICATION, throwable.getMessage(), throwable); - requestContext.setResult(rpcResultBuilder.build()); - - RequestContextUtil.closeRequstContext(requestContext); - } - }); - return requestContext.getFuture(); - } - } diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalGroupServiceImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalGroupServiceImpl.java index 4e3bdcfd15..2a6b134b70 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalGroupServiceImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalGroupServiceImpl.java @@ -7,17 +7,9 @@ */ package org.opendaylight.openflowplugin.impl.services; -import com.google.common.base.Function; -import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.ListenableFuture; import java.util.concurrent.Future; -import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueue; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; -import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack; -import org.opendaylight.openflowplugin.api.openflow.device.Xid; -import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy; -import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupConvertor; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupInput; @@ -26,87 +18,33 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.Sal import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; -import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; -import org.opendaylight.yangtools.yang.common.RpcResultBuilder; -import org.slf4j.Logger; - -public class SalGroupServiceImpl extends CommonService implements SalGroupService { +public class SalGroupServiceImpl implements SalGroupService { + private final GroupService addGroup; + private final GroupService updateGroup; + private final GroupService removeGroup; public SalGroupServiceImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { - super(requestContextStack, deviceContext); + addGroup = new GroupService<>(requestContextStack, deviceContext, AddGroupOutput.class); + updateGroup = new GroupService<>(requestContextStack, deviceContext, UpdateGroupOutput.class); + removeGroup = new GroupService<>(requestContextStack, deviceContext, RemoveGroupOutput.class); } - private static final Logger LOG = org.slf4j.LoggerFactory.getLogger(SalGroupServiceImpl.class); - @Override public Future> addGroup(final AddGroupInput input) { - getDeviceContext().getDeviceGroupRegistry().store(input.getGroupId()); - return handleServiceCall(new Function, - ListenableFuture>>() { - @Override - public ListenableFuture> apply(final RequestContext requestContext) { - return convertAndSend(input, requestContext); - } - }); + addGroup.getDeviceContext().getDeviceGroupRegistry().store(input.getGroupId()); + return addGroup.handleServiceCall(input); } @Override public Future> updateGroup(final UpdateGroupInput input) { - return handleServiceCall(new Function, - ListenableFuture>>() { - - @Override - public ListenableFuture> apply(final RequestContext requestContext) { - return convertAndSend(input.getUpdatedGroup(), requestContext); - } - }); + return updateGroup.handleServiceCall(input.getUpdatedGroup()); } @Override public Future> removeGroup(final RemoveGroupInput input) { - getDeviceContext().getDeviceGroupRegistry().markToBeremoved(input.getGroupId()); - return handleServiceCall(new Function, - ListenableFuture>>() { - - @Override - public ListenableFuture> apply(final RequestContext requestContext) { - return convertAndSend(input, requestContext); - } - }); - } - - ListenableFuture> convertAndSend(final Group iputGroup, final RequestContext requestContext) { - final OutboundQueue outboundQueue = getDeviceContext().getPrimaryConnectionContext().getOutboundQueueProvider(); - getMessageSpy().spyMessage(iputGroup.getImplementedInterface(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_SUCCESS); - final GroupModInputBuilder ofGroupModInput = GroupConvertor.toGroupModInput(iputGroup, getVersion(), getDatapathId()); - final Xid xid = requestContext.getXid(); - ofGroupModInput.setXid(xid.getValue()); - - final GroupModInput groupModInput = ofGroupModInput.build(); - outboundQueue.commitEntry(xid.getValue(), groupModInput, new FutureCallback() { - @Override - public void onSuccess(final OfHeader ofHeader) { - RpcResultBuilder rpcResultBuilder = RpcResultBuilder.success((T)ofHeader); - requestContext.setResult(rpcResultBuilder.build()); - RequestContextUtil.closeRequstContext(requestContext); - - getMessageSpy().spyMessage(groupModInput.getImplementedInterface(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_SUCCESS); - } - - @Override - public void onFailure(final Throwable throwable) { - RpcResultBuilder rpcResultBuilder = RpcResultBuilder.failed().withError(RpcError.ErrorType.APPLICATION, throwable.getMessage(), throwable); - requestContext.setResult(rpcResultBuilder.build()); - RequestContextUtil.closeRequstContext(requestContext); - - getMessageSpy().spyMessage(groupModInput.getImplementedInterface(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_FAILURE); - } - }); - return requestContext.getFuture(); + removeGroup.getDeviceContext().getDeviceGroupRegistry().markToBeremoved(input.getGroupId()); + return removeGroup.handleServiceCall(input); } } diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalMeterServiceImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalMeterServiceImpl.java index ec646feb3b..bb6aa658b4 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalMeterServiceImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalMeterServiceImpl.java @@ -7,18 +7,9 @@ */ package org.opendaylight.openflowplugin.impl.services; -import com.google.common.base.Function; -import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.ListenableFuture; -import com.google.common.util.concurrent.SettableFuture; import java.util.concurrent.Future; -import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueue; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; -import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack; -import org.opendaylight.openflowplugin.api.openflow.device.Xid; -import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy; -import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.MeterConvertor; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterInput; @@ -27,87 +18,34 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.Sal import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.Meter; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; -import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; -import org.opendaylight.yangtools.yang.common.RpcResultBuilder; -import org.slf4j.Logger; -public class SalMeterServiceImpl extends CommonService implements SalMeterService { - - private static final Logger LOG = org.slf4j.LoggerFactory.getLogger(SalMeterServiceImpl.class); +public class SalMeterServiceImpl implements SalMeterService { + private final MeterService addMeter; + private final MeterService updateMeter; + private final MeterService removeMeter; public SalMeterServiceImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { - super(requestContextStack, deviceContext); + addMeter = new MeterService<>(requestContextStack, deviceContext, AddMeterOutput.class); + updateMeter = new MeterService<>(requestContextStack, deviceContext, UpdateMeterOutput.class); + removeMeter = new MeterService<>(requestContextStack, deviceContext, RemoveMeterOutput.class); } @Override public Future> addMeter(final AddMeterInput input) { - getDeviceContext().getDeviceMeterRegistry().store(input.getMeterId()); - return handleServiceCall(new Function, - ListenableFuture>>() { - @Override - public ListenableFuture> apply(final RequestContext requestContext) { - return convertAndSend(input, requestContext); - } - }); + addMeter.getDeviceContext().getDeviceMeterRegistry().store(input.getMeterId()); + + return addMeter.handleServiceCall(input); } @Override public Future> updateMeter(final UpdateMeterInput input) { - return handleServiceCall(new Function, - ListenableFuture>>() { - @Override - public ListenableFuture> apply(final RequestContext requestContext) { - return convertAndSend(input.getUpdatedMeter(), requestContext); - } - }); + return updateMeter.handleServiceCall(input.getUpdatedMeter()); } @Override public Future> removeMeter(final RemoveMeterInput input) { - getDeviceContext().getDeviceMeterRegistry().markToBeremoved(input.getMeterId()); - return handleServiceCall(new Function, - ListenableFuture>>() { - @Override - public ListenableFuture> apply(final RequestContext requestContext) { - return convertAndSend(input, requestContext); - } - }); - } - - ListenableFuture> convertAndSend(final Meter iputMeter, final RequestContext requestContext) { - getMessageSpy().spyMessage(iputMeter.getImplementedInterface(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_SUCCESS); - final OutboundQueue outboundQueue = getDeviceContext().getPrimaryConnectionContext().getOutboundQueueProvider(); - - final MeterModInputBuilder ofMeterModInput = MeterConvertor.toMeterModInput(iputMeter, getVersion()); - final Xid xid = requestContext.getXid(); - ofMeterModInput.setXid(xid.getValue()); - - final MeterModInput meterModInput = ofMeterModInput.build(); - outboundQueue.commitEntry(xid.getValue(), meterModInput, new FutureCallback() { - - RpcResultBuilder rpcResultBuilder; - @Override - public void onSuccess(final OfHeader ofHeader) { - rpcResultBuilder = RpcResultBuilder.success(); - requestContext.setResult(rpcResultBuilder.build()); - RequestContextUtil.closeRequstContext(requestContext); - - getMessageSpy().spyMessage(meterModInput.getImplementedInterface(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_SUCCESS); - } - - @Override - public void onFailure(final Throwable throwable) { - rpcResultBuilder = RpcResultBuilder.failed().withError(RpcError.ErrorType.APPLICATION, throwable.getMessage(), throwable); - requestContext.setResult(rpcResultBuilder.build()); - RequestContextUtil.closeRequstContext(requestContext); - - getMessageSpy().spyMessage(meterModInput.getImplementedInterface(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_FAILURE); - } - }); - return requestContext.getFuture(); + removeMeter.getDeviceContext().getDeviceMeterRegistry().markToBeremoved(input.getMeterId()); + return removeMeter.handleServiceCall(input); } } diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalPortServiceImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalPortServiceImpl.java index 11e754baa2..3bd932bd0f 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalPortServiceImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalPortServiceImpl.java @@ -7,16 +7,10 @@ */ package org.opendaylight.openflowplugin.impl.services; -import com.google.common.base.Function; -import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.ListenableFuture; import java.util.concurrent.Future; -import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueue; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; -import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack; import org.opendaylight.openflowplugin.api.openflow.device.Xid; -import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.PortConvertor; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.port.mod.port.Port; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; @@ -25,55 +19,25 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.service.rev131107.SalPortService; import org.opendaylight.yang.gen.v1.urn.opendaylight.port.service.rev131107.UpdatePortInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.port.service.rev131107.UpdatePortOutput; -import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; -import org.opendaylight.yangtools.yang.common.RpcResultBuilder; -import org.slf4j.Logger; - -public class SalPortServiceImpl extends CommonService implements SalPortService { - private static final Logger LOG = org.slf4j.LoggerFactory.getLogger(SalPortServiceImpl.class); +public final class SalPortServiceImpl extends AbstractSimpleService implements SalPortService { public SalPortServiceImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { - super(requestContextStack, deviceContext); + super(requestContextStack, deviceContext, UpdatePortOutput.class); } @Override public Future> updatePort(final UpdatePortInput input) { - return handleServiceCall(new Function, ListenableFuture>>() { - @Override - public ListenableFuture> apply(final RequestContext requestContext) { - getMessageSpy().spyMessage(input.getImplementedInterface(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_SUCCESS); - - final Port inputPort = input.getUpdatedPort().getPort().getPort().get(0); - final PortModInput ofPortModInput = PortConvertor.toPortModInput(inputPort, getVersion()); - final PortModInputBuilder mdInput = new PortModInputBuilder(ofPortModInput); - final Xid xid = requestContext.getXid(); - final OutboundQueue outboundQueue = getDeviceContext().getPrimaryConnectionContext().getOutboundQueueProvider(); - - mdInput.setXid(xid.getValue()); - final PortModInput portModInput = mdInput.build(); - outboundQueue.commitEntry(xid.getValue(), portModInput, new FutureCallback() { - @Override - public void onSuccess(final OfHeader ofHeader) { - RpcResultBuilder rpcResultBuilder = RpcResultBuilder.success((UpdatePortOutput)ofHeader); - requestContext.setResult(rpcResultBuilder.build()); - RequestContextUtil.closeRequstContext(requestContext); - - getMessageSpy().spyMessage(portModInput.getImplementedInterface(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_SUCCESS); - } + return handleServiceCall(input); + } - @Override - public void onFailure(final Throwable throwable) { - RpcResultBuilder rpcResultBuilder = RpcResultBuilder.failed().withError(RpcError.ErrorType.APPLICATION, throwable.getMessage(), throwable); - requestContext.setResult(rpcResultBuilder.build()); - RequestContextUtil.closeRequstContext(requestContext); + @Override + protected OfHeader buildRequest(final Xid xid, final UpdatePortInput input) { + final Port inputPort = input.getUpdatedPort().getPort().getPort().get(0); + final PortModInput ofPortModInput = PortConvertor.toPortModInput(inputPort, getVersion()); + final PortModInputBuilder mdInput = new PortModInputBuilder(ofPortModInput); + mdInput.setXid(xid.getValue()); - getMessageSpy().spyMessage(portModInput.getImplementedInterface(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_FAILURE); - } - }); - return requestContext.getFuture(); - } - }); + return mdInput.build(); } - } diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalTableServiceImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalTableServiceImpl.java index bec7688537..aa8cc5056d 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalTableServiceImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalTableServiceImpl.java @@ -7,7 +7,6 @@ */ package org.opendaylight.openflowplugin.impl.services; -import com.google.common.base.Function; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; @@ -17,13 +16,9 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.Future; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueue; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; -import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack; import org.opendaylight.openflowplugin.api.openflow.device.Xid; -import org.opendaylight.openflowplugin.api.openflow.device.handlers.MultiMsgCollector; -import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.TableFeaturesConvertor; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.TableFeaturesReplyConvertor; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode; @@ -37,7 +32,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.N import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags; 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.MultipartRequestInput; 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.MultipartReplyBody; @@ -53,14 +47,12 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.Upd import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeaturesKey; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier; -import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcError.ErrorType; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.slf4j.Logger; -public class SalTableServiceImpl extends CommonService implements SalTableService { - +public final class SalTableServiceImpl extends AbstractMultipartService implements SalTableService { private static final Logger LOG = org.slf4j.LoggerFactory.getLogger(SalTableServiceImpl.class); public SalTableServiceImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { @@ -69,78 +61,22 @@ public class SalTableServiceImpl extends CommonService implements SalTableServic @Override public Future> updateTable(final UpdateTableInput input) { - class FunctionImpl implements - Function>, ListenableFuture>>> { - - @Override - public ListenableFuture>> apply(final RequestContext> requestContext) { - getMessageSpy().spyMessage(input.getImplementedInterface(), - MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_SUCCESS); - - final SettableFuture>> result = SettableFuture.create(); - - final MultipartRequestTableFeaturesCaseBuilder caseBuilder = new MultipartRequestTableFeaturesCaseBuilder(); - final MultipartRequestTableFeaturesBuilder requestBuilder = new MultipartRequestTableFeaturesBuilder(); - final List ofTableFeatureList = TableFeaturesConvertor.toTableFeaturesRequest(input - .getUpdatedTable()); - requestBuilder.setTableFeatures(ofTableFeatureList); - caseBuilder.setMultipartRequestTableFeatures(requestBuilder.build()); - - // Set request body to main multipart request - final Xid xid = requestContext.getXid(); - final MultipartRequestInputBuilder mprInput = createMultipartHeader(MultipartType.OFPMPTABLEFEATURES, - xid.getValue()); - mprInput.setMultipartRequestBody(caseBuilder.build()); - final OutboundQueue outboundQueue = getDeviceContext().getPrimaryConnectionContext().getOutboundQueueProvider(); - - final MultiMsgCollector multiMsgCollector = getDeviceContext().getMultiMsgCollector(requestContext); - final MultipartRequestInput multipartRequestInput = mprInput.build(); - outboundQueue.commitEntry(xid.getValue(), multipartRequestInput, new FutureCallback() { - @Override - public void onSuccess(final OfHeader ofHeader) { - if (ofHeader instanceof MultipartReply) { - final MultipartReply multipartReply = (MultipartReply) ofHeader; - multiMsgCollector.addMultipartMsg(multipartReply); - } else { - if (null != ofHeader) { - LOG.info("Unexpected response type received {}.", ofHeader.getClass()); - } else { - LOG.info("Response received is null."); - multiMsgCollector.endCollecting(); - } - } - getMessageSpy().spyMessage(multipartRequestInput.getImplementedInterface(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_SUCCESS); - } - - @Override - public void onFailure(final Throwable throwable) { - final RpcResultBuilder> rpcResultBuilder = RpcResultBuilder.>failed().withError(RpcError.ErrorType.APPLICATION, throwable.getMessage(), throwable); - RequestContextUtil.closeRequstContext(requestContext); - getMessageSpy().spyMessage(multipartRequestInput.getImplementedInterface(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_FAILURE); - } - }); - return requestContext.getFuture(); - } - } - - final ListenableFuture>> multipartFuture = handleServiceCall(new FunctionImpl()); + final ListenableFuture>> multipartFuture = handleServiceCall(input); final SettableFuture> finalFuture = SettableFuture.create(); class CallBackImpl implements FutureCallback>> { - private final Logger LOGGER = org.slf4j.LoggerFactory.getLogger(CallBackImpl.class); - @Override public void onSuccess(final RpcResult> result) { if (result.isSuccessful()) { final List multipartReplies = result.getResult(); if (multipartReplies.isEmpty()) { - LOGGER.debug("Multipart reply to table features request shouldn't be empty list."); + LOG.debug("Multipart reply to table features request shouldn't be empty list."); finalFuture.set(RpcResultBuilder.failed() .withError(ErrorType.RPC, "Multipart reply list is empty.").build()); } else { final Long xid = multipartReplies.get(0).getXid(); - LOGGER.debug( + LOG.debug( "OnSuccess, rpc result successful, multipart response for rpc update-table with xid {} obtained.", xid); final UpdateTableOutputBuilder updateTableOutputBuilder = new UpdateTableOutputBuilder(); @@ -149,7 +85,7 @@ public class SalTableServiceImpl extends CommonService implements SalTableServic writeResponseToOperationalDatastore(multipartReplies); } } else { - LOGGER.debug("OnSuccess, rpc result unsuccessful, multipart response for rpc update-table was unsuccessful."); + LOG.debug("OnSuccess, rpc result unsuccessful, multipart response for rpc update-table was unsuccessful."); finalFuture.set(RpcResultBuilder.failed().withRpcErrors(result.getErrors()) .build()); } @@ -157,59 +93,57 @@ public class SalTableServiceImpl extends CommonService implements SalTableServic @Override public void onFailure(final Throwable t) { - LOGGER.debug("Failure multipart response for table features request. Exception: {}", t); + LOG.debug("Failure multipart response for table features request. Exception: {}", t); finalFuture.set(RpcResultBuilder.failed() .withError(ErrorType.RPC, "Future error", t).build()); } + } - /** - * @param multipartReplies - */ - private void writeResponseToOperationalDatastore(final List multipartReplies) { - - final List salTableFeatures = convertToSalTableFeatures(multipartReplies); - - final DeviceContext deviceContext = getDeviceContext(); - final NodeId nodeId = deviceContext.getPrimaryConnectionContext().getNodeId(); - final InstanceIdentifier flowCapableNodeII = InstanceIdentifier.create(Nodes.class) - .child(Node.class, new NodeKey(nodeId)).augmentation(FlowCapableNode.class); - for (final org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeatures tableFeatureData : salTableFeatures) { - final Short tableId = tableFeatureData.getTableId(); - final KeyedInstanceIdentifier tableFeaturesII = flowCapableNodeII - .child(Table.class, new TableKey(tableId)) - .child(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeatures.class, - new TableFeaturesKey(tableId)); - deviceContext.writeToTransaction(LogicalDatastoreType.OPERATIONAL, tableFeaturesII, - tableFeatureData); - } + Futures.addCallback(multipartFuture, new CallBackImpl()); - } + return finalFuture; + } - private List convertToSalTableFeatures( - final List multipartReplies) { - final List salTableFeaturesAll = new ArrayList<>(); - for (final MultipartReply multipartReply : multipartReplies) { - if (multipartReply.getType().equals(MultipartType.OFPMPTABLEFEATURES)) { - final MultipartReplyBody multipartReplyBody = multipartReply.getMultipartReplyBody(); - if (multipartReplyBody instanceof MultipartReplyTableFeaturesCase) { - final MultipartReplyTableFeaturesCase tableFeaturesCase = ((MultipartReplyTableFeaturesCase) multipartReplyBody); - final MultipartReplyTableFeatures salTableFeatures = tableFeaturesCase - .getMultipartReplyTableFeatures(); - final List salTableFeaturesPartial = TableFeaturesReplyConvertor - .toTableFeaturesReply(salTableFeatures); - salTableFeaturesAll.addAll(salTableFeaturesPartial); - LOGGER.debug("TableFeature {} for xid {}.", salTableFeatures, multipartReply.getXid()); - } - } + /** + * @param multipartReplies + */ + private void writeResponseToOperationalDatastore(final List multipartReplies) { + + final List salTableFeatures = convertToSalTableFeatures(multipartReplies); + + final DeviceContext deviceContext = getDeviceContext(); + final NodeId nodeId = deviceContext.getPrimaryConnectionContext().getNodeId(); + final InstanceIdentifier flowCapableNodeII = InstanceIdentifier.create(Nodes.class) + .child(Node.class, new NodeKey(nodeId)).augmentation(FlowCapableNode.class); + for (final org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeatures tableFeatureData : salTableFeatures) { + final Short tableId = tableFeatureData.getTableId(); + final KeyedInstanceIdentifier tableFeaturesII = flowCapableNodeII + .child(Table.class, new TableKey(tableId)) + .child(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeatures.class, + new TableFeaturesKey(tableId)); + deviceContext.writeToTransaction(LogicalDatastoreType.OPERATIONAL, tableFeaturesII, + tableFeatureData); + } + } + + protected static List convertToSalTableFeatures( + final List multipartReplies) { + final List salTableFeaturesAll = new ArrayList<>(); + for (final MultipartReply multipartReply : multipartReplies) { + if (multipartReply.getType().equals(MultipartType.OFPMPTABLEFEATURES)) { + final MultipartReplyBody multipartReplyBody = multipartReply.getMultipartReplyBody(); + if (multipartReplyBody instanceof MultipartReplyTableFeaturesCase) { + final MultipartReplyTableFeaturesCase tableFeaturesCase = ((MultipartReplyTableFeaturesCase) multipartReplyBody); + final MultipartReplyTableFeatures salTableFeatures = tableFeaturesCase + .getMultipartReplyTableFeatures(); + final List salTableFeaturesPartial = TableFeaturesReplyConvertor + .toTableFeaturesReply(salTableFeatures); + salTableFeaturesAll.addAll(salTableFeaturesPartial); + LOG.debug("TableFeature {} for xid {}.", salTableFeatures, multipartReply.getXid()); } - return salTableFeaturesAll; } - } - - Futures.addCallback(multipartFuture, new CallBackImpl()); - - return finalFuture; + return salTableFeaturesAll; } private MultipartRequestInputBuilder createMultipartHeader(final MultipartType multipart, final Long xid) { @@ -221,4 +155,20 @@ public class SalTableServiceImpl extends CommonService implements SalTableServic return mprInput; } + @Override + protected OfHeader buildRequest(final Xid xid, final UpdateTableInput input) { + final MultipartRequestTableFeaturesCaseBuilder caseBuilder = new MultipartRequestTableFeaturesCaseBuilder(); + final MultipartRequestTableFeaturesBuilder requestBuilder = new MultipartRequestTableFeaturesBuilder(); + final List ofTableFeatureList = TableFeaturesConvertor.toTableFeaturesRequest(input + .getUpdatedTable()); + requestBuilder.setTableFeatures(ofTableFeatureList); + caseBuilder.setMultipartRequestTableFeatures(requestBuilder.build()); + + // Set request body to main multipart request + final MultipartRequestInputBuilder mprInput = createMultipartHeader(MultipartType.OFPMPTABLEFEATURES, + xid.getValue()); + mprInput.setMultipartRequestBody(caseBuilder.build()); + + return mprInput.build(); + } } diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SimpleRequestCallback.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SimpleRequestCallback.java new file mode 100644 index 0000000000..034d2fa3bf --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SimpleRequestCallback.java @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.services; + +import com.google.common.base.Preconditions; +import com.google.common.util.concurrent.FutureCallback; +import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; +import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +final class SimpleRequestCallback extends AbstractRequestCallback { + private static final Logger LOG = LoggerFactory.getLogger(SimpleRequestCallback.class); + private final Class clazz; + + private SimpleRequestCallback(final RequestContext context, final Class requestType, final MessageSpy spy, final Class clazz) { + super(context, requestType, spy); + this.clazz = Preconditions.checkNotNull(clazz); + } + + static FutureCallback create(final RequestContext context, final Class requestType, final MessageSpy spy, final Class clazz) { + return new SimpleRequestCallback<>(context, requestType, spy, clazz); + } + + @Override + public final void onSuccess(final OfHeader result) { + spyMessage(MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_SUCCESS); + + if (result == null) { + setResult(RpcResultBuilder.success().build()); + return; + } + if (!clazz.isInstance(result)) { + LOG.info("Expected response type {}, got {}, result is empty", clazz, result.getClass()); + setResult(RpcResultBuilder.success().build()); + return; + + } + + setResult(RpcResultBuilder.success(clazz.cast(result)).build()); + } +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/VoidRequestCallback.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/VoidRequestCallback.java new file mode 100644 index 0000000000..5860a183f8 --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/VoidRequestCallback.java @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.services; + +import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; +import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy; +import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy.STATISTIC_GROUP; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; +import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; + +final class VoidRequestCallback extends AbstractRequestCallback { + private static final RpcResult SUCCESS = RpcResultBuilder.success().build(); + + VoidRequestCallback(final RequestContext context, final Class requestType, final MessageSpy spy) { + super(context, requestType, spy); + } + + @Override + public void onSuccess(final OfHeader result) { + spyMessage(STATISTIC_GROUP.TO_SWITCH_SUBMIT_SUCCESS_NO_RESPONSE); + setResult(SUCCESS); + } +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AggregateFlowsInTableService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AggregateFlowsInTableService.java new file mode 100644 index 0000000000..baaedcbd7b --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AggregateFlowsInTableService.java @@ -0,0 +1,53 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.statistics.services; + +import org.opendaylight.openflowplugin.api.OFConstants; +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.openflow.md.util.FlowCreatorUtil; +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.openflow.common.types.rev130731.MultipartType; +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.request.multipart.request.body.MultipartRequestAggregateCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.aggregate._case.MultipartRequestAggregateBuilder; + +final class AggregateFlowsInTableService extends AbstractSimpleService { + public AggregateFlowsInTableService(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + super(requestContextStack, deviceContext, GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput.class); + } + + @Override + protected OfHeader buildRequest(final Xid xid, final GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput input) { + // 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); + + // 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 mprInput.build(); + } +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllFlowsInAllTablesService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllFlowsInAllTablesService.java new file mode 100644 index 0000000000..d8b1f15bdd --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllFlowsInAllTablesService.java @@ -0,0 +1,53 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.statistics.services; + +import org.opendaylight.openflowplugin.api.OFConstants; +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.openflow.md.util.FlowCreatorUtil; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowsStatisticsFromAllFlowTablesInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowsStatisticsFromAllFlowTablesOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType; +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.request.multipart.request.body.MultipartRequestFlowCase; +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.flow._case.MultipartRequestFlowBuilder; + +final class AllFlowsInAllTablesService extends AbstractSimpleService { + private final MultipartRequestFlowCase flowCase; + + AllFlowsInAllTablesService(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + super(requestContextStack, deviceContext, GetAllFlowsStatisticsFromAllFlowTablesOutput.class); + + 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); + FlowCreatorUtil.setWildcardedFlowMatch(getVersion(), mprFlowRequestBuilder); + multipartRequestFlowCaseBuilder.setMultipartRequestFlow(mprFlowRequestBuilder.build()); + + flowCase = multipartRequestFlowCaseBuilder.build(); + } + + @Override + protected OfHeader buildRequest(final Xid xid, final GetAllFlowsStatisticsFromAllFlowTablesInput input) { + final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader( + MultipartType.OFPMPFLOW, xid.getValue(), getVersion()); + mprInput.setMultipartRequestBody(flowCase); + + return mprInput.build(); + } +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllFlowsInTableService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllFlowsInTableService.java new file mode 100644 index 0000000000..9ce0f89fed --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllFlowsInTableService.java @@ -0,0 +1,53 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.statistics.services; + +import org.opendaylight.openflowplugin.api.OFConstants; +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.openflow.md.util.FlowCreatorUtil; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowStatisticsFromFlowTableInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowStatisticsFromFlowTableOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType; +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.request.multipart.request.body.MultipartRequestFlowCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlowBuilder; + +public class AllFlowsInTableService extends AbstractSimpleService { + + public AllFlowsInTableService(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + super(requestContextStack, deviceContext, GetAllFlowStatisticsFromFlowTableOutput.class); + } + + @Override + protected OfHeader buildRequest(final Xid xid, final GetAllFlowStatisticsFromFlowTableInput input) { + 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 MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader( + MultipartType.OFPMPFLOW, xid.getValue(), version); + + mprInput.setMultipartRequestBody(multipartRequestFlowCaseBuilder.build()); + + return mprInput.build(); + } +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllGroupsStatsService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllGroupsStatsService.java new file mode 100644 index 0000000000..756dc24d6f --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllGroupsStatsService.java @@ -0,0 +1,55 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.statistics.services; + +import org.opendaylight.openflowjava.protocol.api.util.BinContent; +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.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetAllGroupStatisticsInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetAllGroupStatisticsOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Group; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType; +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.request.multipart.request.body.MultipartRequestGroupCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.group._case.MultipartRequestGroupBuilder; + +final class AllGroupsStatsService extends AbstractSimpleService { + private static final MultipartRequestGroupCase GROUP_CASE; + + static { + final MultipartRequestGroupCaseBuilder caseBuilder = new MultipartRequestGroupCaseBuilder(); + final MultipartRequestGroupBuilder mprGroupBuild = new MultipartRequestGroupBuilder(); + mprGroupBuild.setGroupId(new GroupId(BinContent.intToUnsignedLong(Group.OFPGALL.getIntValue()))); + caseBuilder.setMultipartRequestGroup(mprGroupBuild.build()); + + GROUP_CASE = caseBuilder.build(); + } + + AllGroupsStatsService(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + super(requestContextStack, deviceContext, GetAllGroupStatisticsOutput.class); + } + + @Override + protected OfHeader buildRequest(final Xid xid, final GetAllGroupStatisticsInput input) { + // Create multipart request header + final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader( + MultipartType.OFPMPGROUP, xid.getValue(), getVersion()); + + // Set request body to main multipart request + mprInput.setMultipartRequestBody(GROUP_CASE); + + // Send the request, no cookies associated, use any connection + return mprInput.build(); + } +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllMeterConfigStatsService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllMeterConfigStatsService.java new file mode 100644 index 0000000000..4842c272bc --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllMeterConfigStatsService.java @@ -0,0 +1,51 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.statistics.services; + +import org.opendaylight.openflowjava.protocol.api.util.BinContent; +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.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterConfigStatisticsInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterConfigStatisticsOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Meter; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType; +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.request.multipart.request.body.MultipartRequestMeterConfigCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter.config._case.MultipartRequestMeterConfigBuilder; + +final class AllMeterConfigStatsService extends AbstractSimpleService { + private static final MultipartRequestMeterConfigCase METER_CONFIG_CASE; + + static { + MultipartRequestMeterConfigCaseBuilder caseBuilder = + new MultipartRequestMeterConfigCaseBuilder(); + MultipartRequestMeterConfigBuilder mprMeterConfigBuild = + new MultipartRequestMeterConfigBuilder(); + mprMeterConfigBuild.setMeterId(new MeterId(BinContent.intToUnsignedLong(Meter.OFPMALL.getIntValue()))); + caseBuilder.setMultipartRequestMeterConfig(mprMeterConfigBuild.build()); + + METER_CONFIG_CASE = caseBuilder.build(); + } + + AllMeterConfigStatsService(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + super(requestContextStack, deviceContext, GetAllMeterConfigStatisticsOutput.class); + } + + @Override + protected OfHeader buildRequest(final Xid xid, final GetAllMeterConfigStatisticsInput input) { + MultipartRequestInputBuilder mprInput = RequestInputUtils + .createMultipartHeader(MultipartType.OFPMPMETERCONFIG, xid.getValue(), getVersion()); + return mprInput.setMultipartRequestBody(METER_CONFIG_CASE).build(); + } +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllMeterStatsService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllMeterStatsService.java new file mode 100644 index 0000000000..bd7fcde539 --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllMeterStatsService.java @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.statistics.services; + +import org.opendaylight.openflowjava.protocol.api.util.BinContent; +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.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Meter; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType; +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.request.multipart.request.body.MultipartRequestMeterCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter._case.MultipartRequestMeterBuilder; + +final class AllMeterStatsService extends AbstractSimpleService { + private static final MultipartRequestMeterCase METER_CASE; + + static { + MultipartRequestMeterCaseBuilder caseBuilder = + new MultipartRequestMeterCaseBuilder(); + MultipartRequestMeterBuilder mprMeterBuild = + new MultipartRequestMeterBuilder(); + mprMeterBuild.setMeterId(new MeterId(BinContent.intToUnsignedLong(Meter.OFPMALL.getIntValue()))); + caseBuilder.setMultipartRequestMeter(mprMeterBuild.build()); + + METER_CASE = caseBuilder.build(); + } + + AllMeterStatsService(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + super(requestContextStack, deviceContext, GetAllMeterStatisticsOutput.class); + } + + @Override + protected OfHeader buildRequest(final Xid xid, final GetAllMeterStatisticsInput input) { + MultipartRequestInputBuilder mprInput = RequestInputUtils + .createMultipartHeader(MultipartType.OFPMPMETER, xid.getValue(), getVersion()); + return mprInput.setMultipartRequestBody(METER_CASE).build(); + } + +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllPortStatsService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllPortStatsService.java new file mode 100644 index 0000000000..a45dfdecb7 --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllPortStatsService.java @@ -0,0 +1,51 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.statistics.services; + +import org.opendaylight.openflowplugin.api.OFConstants; +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.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType; +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.request.multipart.request.body.MultipartRequestPortStatsCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.port.stats._case.MultipartRequestPortStatsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetAllNodeConnectorsStatisticsInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetAllNodeConnectorsStatisticsOutput; + +final class AllPortStatsService extends AbstractSimpleService { + private static final MultipartRequestPortStatsCase PORT_STATS_CASE; + + static { + MultipartRequestPortStatsCaseBuilder caseBuilder = + new MultipartRequestPortStatsCaseBuilder(); + MultipartRequestPortStatsBuilder mprPortStatsBuilder = + new MultipartRequestPortStatsBuilder(); + // Select all ports + mprPortStatsBuilder.setPortNo(OFConstants.OFPP_ANY); + caseBuilder.setMultipartRequestPortStats(mprPortStatsBuilder.build()); + + PORT_STATS_CASE = caseBuilder.build(); + } + + AllPortStatsService(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + super(requestContextStack, deviceContext, GetAllNodeConnectorsStatisticsOutput.class); + } + + @Override + protected OfHeader buildRequest(final Xid xid, final GetAllNodeConnectorsStatisticsInput input) { + MultipartRequestInputBuilder mprInput = RequestInputUtils + .createMultipartHeader(MultipartType.OFPMPPORTSTATS, xid.getValue(), getVersion()); + mprInput.setMultipartRequestBody(PORT_STATS_CASE); + return mprInput.build(); + } +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllQueuesAllPortsService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllQueuesAllPortsService.java new file mode 100644 index 0000000000..89e707d073 --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllQueuesAllPortsService.java @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.statistics.services; + +import org.opendaylight.openflowplugin.api.OFConstants; +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.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType; +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.request.multipart.request.body.MultipartRequestQueueCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.queue._case.MultipartRequestQueueBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromAllPortsInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromAllPortsOutput; + +final class AllQueuesAllPortsService extends AbstractSimpleService { + private static final MultipartRequestQueueCase QUEUE_CASE; + + static { + MultipartRequestQueueCaseBuilder caseBuilder = new MultipartRequestQueueCaseBuilder(); + MultipartRequestQueueBuilder mprQueueBuilder = new MultipartRequestQueueBuilder(); + // Select all ports + // Select all the ports + mprQueueBuilder.setQueueId(OFConstants.OFPQ_ALL); + mprQueueBuilder.setPortNo(OFConstants.OFPP_ANY); + caseBuilder.setMultipartRequestQueue(mprQueueBuilder.build()); + + QUEUE_CASE = caseBuilder.build(); + } + + AllQueuesAllPortsService(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + super(requestContextStack, deviceContext, GetAllQueuesStatisticsFromAllPortsOutput.class); + } + + @Override + protected OfHeader buildRequest(final Xid xid, final GetAllQueuesStatisticsFromAllPortsInput input) { + // Set request body to main multipart request + MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader( + MultipartType.OFPMPQUEUE, xid.getValue(), getVersion()); + mprInput.setMultipartRequestBody(QUEUE_CASE); + return mprInput.build(); + } +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllQueuesOnePortService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllQueuesOnePortService.java new file mode 100644 index 0000000000..86fa2dd53e --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllQueuesOnePortService.java @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.statistics.services; + +import org.opendaylight.openflowplugin.api.OFConstants; +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.api.openflow.md.util.OpenflowVersion; +import org.opendaylight.openflowplugin.impl.services.AbstractSimpleService; +import org.opendaylight.openflowplugin.impl.services.RequestInputUtils; +import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType; +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.request.multipart.request.body.MultipartRequestQueueCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.queue._case.MultipartRequestQueueBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromGivenPortInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromGivenPortOutput; + +final class AllQueuesOnePortService extends AbstractSimpleService { + AllQueuesOnePortService(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + super(requestContextStack, deviceContext, GetAllQueuesStatisticsFromGivenPortOutput.class); + } + + @Override + protected OfHeader buildRequest(final Xid xid, final GetAllQueuesStatisticsFromGivenPortInput input) { + MultipartRequestQueueCaseBuilder caseBuilder = new MultipartRequestQueueCaseBuilder(); + MultipartRequestQueueBuilder mprQueueBuilder = new MultipartRequestQueueBuilder(); + // Select all queues + // Select specific port + final short version = getVersion(); + mprQueueBuilder.setPortNo(InventoryDataServiceUtil.portNumberfromNodeConnectorId( + OpenflowVersion.get(version), input.getNodeConnectorId())); + + mprQueueBuilder.setQueueId(OFConstants.OFPQ_ALL); + caseBuilder.setMultipartRequestQueue(mprQueueBuilder.build()); + + // Set request body to main multipart request + MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader( + MultipartType.OFPMPQUEUE, xid.getValue(), version); + mprInput.setMultipartRequestBody(caseBuilder.build()); + + return mprInput.build(); + } + +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/FlowsInTableService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/FlowsInTableService.java new file mode 100644 index 0000000000..d0f0bb97e9 --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/FlowsInTableService.java @@ -0,0 +1,74 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.statistics.services; + +import org.opendaylight.openflowplugin.api.OFConstants; +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.openflow.md.core.sal.convertor.match.MatchReactor; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsFromFlowTableInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsFromFlowTableOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType; +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.request.multipart.request.body.MultipartRequestFlowCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlowBuilder; + +final class FlowsInTableService extends AbstractSimpleService { + FlowsInTableService(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + super(requestContextStack, deviceContext, GetFlowStatisticsFromFlowTableOutput.class); + } + + @Override + protected OfHeader buildRequest(final Xid xid, final GetFlowStatisticsFromFlowTableInput input) { + 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 + multipartRequestFlowCaseBuilder.setMultipartRequestFlow(mprFlowRequestBuilder.build()); + final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader( + MultipartType.OFPMPFLOW, xid.getValue(), version); + mprInput.setMultipartRequestBody(multipartRequestFlowCaseBuilder.build()); + + return mprInput.build(); + } +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/GroupDescriptionService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/GroupDescriptionService.java new file mode 100644 index 0000000000..0f7cd3dcd9 --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/GroupDescriptionService.java @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.statistics.services; + +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.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType; +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.request.multipart.request.body.MultipartRequestGroupDescCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupDescCaseBuilder; + +final class GroupDescriptionService extends AbstractSimpleService { + private static final MultipartRequestGroupDescCase GROUP_DESC_CASE = new MultipartRequestGroupDescCaseBuilder().build(); + + GroupDescriptionService(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + super(requestContextStack, deviceContext, GetGroupDescriptionOutput.class); + } + + @Override + protected OfHeader buildRequest(final Xid xid, final GetGroupDescriptionInput input) { + final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader( + MultipartType.OFPMPGROUPDESC, xid.getValue(), getVersion()); + mprInput.setMultipartRequestBody(GROUP_DESC_CASE); + return mprInput.build(); + } +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/GroupFeaturesService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/GroupFeaturesService.java new file mode 100644 index 0000000000..fce8e93019 --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/GroupFeaturesService.java @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.statistics.services; + +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.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupFeaturesInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupFeaturesOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType; +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.request.multipart.request.body.MultipartRequestGroupFeaturesCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupFeaturesCaseBuilder; + +final class GroupFeaturesService extends AbstractSimpleService { + private static final MultipartRequestGroupFeaturesCase GROUP_FEAT_CASE = + new MultipartRequestGroupFeaturesCaseBuilder().build(); + + GroupFeaturesService(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + super(requestContextStack, deviceContext, GetGroupFeaturesOutput.class); + } + + @Override + protected OfHeader buildRequest(final Xid xid, final GetGroupFeaturesInput input) { + final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader( + MultipartType.OFPMPGROUPFEATURES, xid.getValue(), getVersion()); + mprInput.setMultipartRequestBody(GROUP_FEAT_CASE); + return mprInput.build(); + } +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/GroupStatsService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/GroupStatsService.java new file mode 100644 index 0000000000..e8defee795 --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/GroupStatsService.java @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.statistics.services; + +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.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupStatisticsInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupStatisticsOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType; +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.request.multipart.request.body.MultipartRequestGroupCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.group._case.MultipartRequestGroupBuilder; + +final class GroupStatsService extends AbstractSimpleService { + GroupStatsService(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + super(requestContextStack, deviceContext, GetGroupStatisticsOutput.class); + } + + @Override + protected OfHeader buildRequest(final Xid xid, final GetGroupStatisticsInput input) { + final MultipartRequestGroupCaseBuilder caseBuilder = new MultipartRequestGroupCaseBuilder(); + final MultipartRequestGroupBuilder mprGroupBuild = new MultipartRequestGroupBuilder(); + mprGroupBuild.setGroupId(new GroupId(input.getGroupId().getValue())); + caseBuilder.setMultipartRequestGroup(mprGroupBuild.build()); + + final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader( + MultipartType.OFPMPGROUP, xid.getValue(), getVersion()); + + mprInput.setMultipartRequestBody(caseBuilder.build()); + return mprInput.build(); + } +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/MatchingFlowsInTableService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/MatchingFlowsInTableService.java new file mode 100644 index 0000000000..9905d20d1b --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/MatchingFlowsInTableService.java @@ -0,0 +1,81 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.statistics.services; + +import com.google.common.base.MoreObjects; +import org.opendaylight.openflowplugin.api.OFConstants; +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.AbstractMultipartService; +import org.opendaylight.openflowplugin.impl.services.RequestInputUtils; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchReactor; +import org.opendaylight.openflowplugin.openflow.md.util.FlowCreatorUtil; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType; +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.request.multipart.request.body.MultipartRequestAggregateCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.aggregate._case.MultipartRequestAggregateBuilder; + +final class MatchingFlowsInTableService extends AbstractMultipartService { + + public MatchingFlowsInTableService(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + super(requestContextStack, deviceContext); + } + + @Override + protected OfHeader buildRequest(final Xid xid, final GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput input) { + final DeviceContext deviceContext = getDeviceContext(); + 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 mprInput.build(); + } +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/MeterFeaturesService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/MeterFeaturesService.java new file mode 100644 index 0000000000..44b988c53f --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/MeterFeaturesService.java @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.statistics.services; + +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.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterFeaturesInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterFeaturesOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType; +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.request.multipart.request.body.MultipartRequestMeterFeaturesCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterFeaturesCaseBuilder; + +final class MeterFeaturesService extends AbstractSimpleService { + private static final MultipartRequestMeterFeaturesCase METER_FEATURES_CASE = new MultipartRequestMeterFeaturesCaseBuilder().build(); + + protected MeterFeaturesService(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + super(requestContextStack, deviceContext, GetMeterFeaturesOutput.class); + } + + @Override + protected OfHeader buildRequest(final Xid xid, final GetMeterFeaturesInput input) { + MultipartRequestInputBuilder mprInput = + RequestInputUtils.createMultipartHeader(MultipartType.OFPMPMETERFEATURES, xid.getValue(), getVersion()); + mprInput.setMultipartRequestBody(METER_FEATURES_CASE); + return mprInput.build(); + } +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/MeterStatsService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/MeterStatsService.java new file mode 100644 index 0000000000..976b06fc14 --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/MeterStatsService.java @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.statistics.services; + +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.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterStatisticsInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterStatisticsOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType; +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.request.multipart.request.body.MultipartRequestMeterCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter._case.MultipartRequestMeterBuilder; + +final class MeterStatsService extends AbstractSimpleService { + + MeterStatsService(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + super(requestContextStack, deviceContext, GetMeterStatisticsOutput.class); + } + + @Override + protected OfHeader buildRequest(final Xid xid, final GetMeterStatisticsInput input) { + MultipartRequestMeterCaseBuilder caseBuilder = + new MultipartRequestMeterCaseBuilder(); + MultipartRequestMeterBuilder mprMeterBuild = + new MultipartRequestMeterBuilder(); + mprMeterBuild.setMeterId(new MeterId(input.getMeterId().getValue())); + caseBuilder.setMultipartRequestMeter(mprMeterBuild.build()); + + MultipartRequestInputBuilder mprInput = + RequestInputUtils.createMultipartHeader(MultipartType.OFPMPMETER, xid.getValue(), getVersion()); + mprInput.setMultipartRequestBody(caseBuilder.build()); + return mprInput.build(); + } +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OneQueueOnePortService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OneQueueOnePortService.java new file mode 100644 index 0000000000..a8c80eaace --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OneQueueOnePortService.java @@ -0,0 +1,48 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.statistics.services; + +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.api.openflow.md.util.OpenflowVersion; +import org.opendaylight.openflowplugin.impl.services.AbstractSimpleService; +import org.opendaylight.openflowplugin.impl.services.RequestInputUtils; +import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType; +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.request.multipart.request.body.MultipartRequestQueueCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.queue._case.MultipartRequestQueueBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetQueueStatisticsFromGivenPortInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetQueueStatisticsFromGivenPortOutput; + +final class OneQueueOnePortService extends AbstractSimpleService { + OneQueueOnePortService(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + super(requestContextStack, deviceContext, GetQueueStatisticsFromGivenPortOutput.class); + } + + @Override + protected OfHeader buildRequest(final Xid xid, final GetQueueStatisticsFromGivenPortInput input) { + MultipartRequestQueueCaseBuilder caseBuilder = new MultipartRequestQueueCaseBuilder(); + MultipartRequestQueueBuilder mprQueueBuilder = new MultipartRequestQueueBuilder(); + // Select specific queue + mprQueueBuilder.setQueueId(input.getQueueId().getValue()); + // Select specific port + final short version = getVersion(); + mprQueueBuilder.setPortNo(InventoryDataServiceUtil.portNumberfromNodeConnectorId( + OpenflowVersion.get(version), input.getNodeConnectorId())); + caseBuilder.setMultipartRequestQueue(mprQueueBuilder.build()); + + // Set request body to main multipart request + MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader( + MultipartType.OFPMPQUEUE, xid.getValue(), version); + mprInput.setMultipartRequestBody(caseBuilder.build()); + return mprInput.build(); + } +} 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 e95d6c3c92..7879447c15 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,15 @@ 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.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.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,14 +30,8 @@ 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; @@ -57,267 +40,86 @@ import org.slf4j.LoggerFactory; /** * @author joe */ -public class OpendaylightFlowStatisticsServiceImpl extends CommonService implements OpendaylightFlowStatisticsService { - +public class OpendaylightFlowStatisticsServiceImpl implements OpendaylightFlowStatisticsService { private static final Logger LOG = LoggerFactory.getLogger(OpendaylightFlowStatisticsServiceImpl.class); - public OpendaylightFlowStatisticsServiceImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { - super(requestContextStack, deviceContext); - } - - @Override - public Future> getAggregateFlowStatisticsFromFlowTableForAllFlows( - final GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput input) { - - - return handleServiceCall( - new Function, - ListenableFuture>>() { + private final Function>, RpcResult> matchingConvertor = + new Function>, RpcResult>() { + @Override + public RpcResult apply(final RpcResult> input) { + final DeviceContext deviceContext = matchingFlowsInTable.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)); + } - @Override - public ListenableFuture> apply(final RequestContext requestContext) { + GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder getAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder = + new GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder(); + getAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder.setAggregatedFlowStatistics(aggregStats); - // 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); + rpcResult = RpcResultBuilder + .success() + .withResult(getAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder.build()) + .build(); - // 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); + } else { + rpcResult = RpcResultBuilder + .failed() + .withRpcErrors(input.getErrors()) + .build(); + } + return rpcResult; + } + }; - mprInput.setMultipartRequestBody(multipartRequestAggregateCaseBuilder.build()); + private final AggregateFlowsInTableService aggregateFlowsInTable; + private final MatchingFlowsInTableService matchingFlowsInTable; + private final AllFlowsInAllTablesService allFlowsInAllTables; + private final AllFlowsInTableService allFlowsInTable; + private final FlowsInTableService flowsInTable; - return StatisticsServiceUtil.getRpcResultListenableFuture(xid, mprInput.build(), getDeviceContext()); - } - }); + public OpendaylightFlowStatisticsServiceImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + aggregateFlowsInTable = new AggregateFlowsInTableService(requestContextStack, deviceContext); + allFlowsInAllTables = new AllFlowsInAllTablesService(requestContextStack, deviceContext); + allFlowsInTable = new AllFlowsInTableService(requestContextStack, deviceContext); + flowsInTable = new FlowsInTableService(requestContextStack, deviceContext); + matchingFlowsInTable = new MatchingFlowsInTableService(requestContextStack, deviceContext); + } + @Override + public Future> getAggregateFlowStatisticsFromFlowTableForAllFlows( + final GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput input) { + return aggregateFlowsInTable.handleServiceCall(input); } @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(); - 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(final 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); } @Override 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()); - } - }); + return allFlowsInTable.handleServiceCall(input); } @Override 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()); - } - }); + return allFlowsInAllTables.handleServiceCall(input); } @Override 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()); - } - }); + return flowsInTable.handleServiceCall(input); } - } 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 ad16b6ac90..d39d48e273 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 @@ -7,61 +7,49 @@ */ package org.opendaylight.openflowplugin.impl.statistics.services; -import com.google.common.base.Function; -import com.google.common.util.concurrent.ListenableFuture; import java.util.concurrent.Future; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; -import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack; import org.opendaylight.openflowplugin.api.openflow.device.Xid; -import org.opendaylight.openflowplugin.impl.services.CommonService; +import org.opendaylight.openflowplugin.impl.services.AbstractSimpleService; import org.opendaylight.openflowplugin.impl.services.RequestInputUtils; -import org.opendaylight.openflowplugin.impl.util.StatisticsServiceUtil; 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.OpendaylightFlowTableStatisticsService; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType; 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.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.yangtools.yang.common.RpcResult; -/** - * @author joe - */ -public class OpendaylightFlowTableStatisticsServiceImpl extends CommonService implements +public final class OpendaylightFlowTableStatisticsServiceImpl extends AbstractSimpleService implements OpendaylightFlowTableStatisticsService { - public OpendaylightFlowTableStatisticsServiceImpl(final RequestContextStack requestContextStack, DeviceContext deviceContext) { - super(requestContextStack, deviceContext); + public OpendaylightFlowTableStatisticsServiceImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + super(requestContextStack, deviceContext, GetFlowTablesStatisticsOutput.class); } @Override public Future> getFlowTablesStatistics( final GetFlowTablesStatisticsInput input) { + return handleServiceCall(input); + } + @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 MultipartRequestTableBuilder multipartRequestTableBuilder = new MultipartRequestTableBuilder(); + multipartRequestTableBuilder.setEmpty(true); + multipartRequestTableCaseBuilder.setMultipartRequestTable(multipartRequestTableBuilder.build()); - return handleServiceCall(new Function, - ListenableFuture>>() { - - @Override - public ListenableFuture> apply(final RequestContext requestContext) { - - // Create multipart request body for fetch all the group stats - final MultipartRequestTableCaseBuilder multipartRequestTableCaseBuilder = new MultipartRequestTableCaseBuilder(); - final MultipartRequestTableBuilder multipartRequestTableBuilder = new MultipartRequestTableBuilder(); - multipartRequestTableBuilder.setEmpty(true); - multipartRequestTableCaseBuilder.setMultipartRequestTable(multipartRequestTableBuilder.build()); + // Set request body to main multipart request + final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader( + MultipartType.OFPMPFLOW, xid.getValue(), getVersion()); - // Set request body to main multipart request - final Xid xid = requestContext.getXid(); - final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader( - MultipartType.OFPMPFLOW, xid.getValue(), getVersion()); + mprInput.setMultipartRequestBody(multipartRequestTableCaseBuilder.build()); - mprInput.setMultipartRequestBody(multipartRequestTableCaseBuilder.build()); - return StatisticsServiceUtil.getRpcResultListenableFuture(xid, mprInput.build(), getDeviceContext()); - } - }); + return mprInput.build(); } - } diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OpendaylightGroupStatisticsServiceImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OpendaylightGroupStatisticsServiceImpl.java index 7f627e47bd..674063b5e0 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OpendaylightGroupStatisticsServiceImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OpendaylightGroupStatisticsServiceImpl.java @@ -7,17 +7,9 @@ */ package org.opendaylight.openflowplugin.impl.statistics.services; -import com.google.common.base.Function; -import com.google.common.util.concurrent.ListenableFuture; import java.util.concurrent.Future; -import org.opendaylight.openflowjava.protocol.api.util.BinContent; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; -import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack; -import org.opendaylight.openflowplugin.api.openflow.device.Xid; -import org.opendaylight.openflowplugin.impl.services.CommonService; -import org.opendaylight.openflowplugin.impl.services.RequestInputUtils; -import org.opendaylight.openflowplugin.impl.util.StatisticsServiceUtil; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetAllGroupStatisticsInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetAllGroupStatisticsOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionInput; @@ -27,127 +19,41 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111. import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupStatisticsInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupStatisticsOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.OpendaylightGroupStatisticsService; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupDescCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupFeaturesCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.group._case.MultipartRequestGroupBuilder; import org.opendaylight.yangtools.yang.common.RpcResult; /** * @author joe */ -public class OpendaylightGroupStatisticsServiceImpl extends CommonService implements OpendaylightGroupStatisticsService { - - - public OpendaylightGroupStatisticsServiceImpl(final RequestContextStack requestContextStack, DeviceContext deviceContext) { - super(requestContextStack, deviceContext); +public class OpendaylightGroupStatisticsServiceImpl implements OpendaylightGroupStatisticsService { + private final AllGroupsStatsService allGroups; + private final GroupDescriptionService groupDesc; + private final GroupFeaturesService groupFeat; + private final GroupStatsService groupStats; + + public OpendaylightGroupStatisticsServiceImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + allGroups = new AllGroupsStatsService(requestContextStack, deviceContext); + groupDesc = new GroupDescriptionService(requestContextStack, deviceContext); + groupFeat = new GroupFeaturesService(requestContextStack, deviceContext); + groupStats = new GroupStatsService(requestContextStack, deviceContext); } @Override public Future> getAllGroupStatistics(final GetAllGroupStatisticsInput input) { - - - return handleServiceCall(new Function, - ListenableFuture>>() { - - @Override - public ListenableFuture> apply(final RequestContext requestContext) { - - final MultipartRequestGroupCaseBuilder caseBuilder = new MultipartRequestGroupCaseBuilder(); - final MultipartRequestGroupBuilder mprGroupBuild = new MultipartRequestGroupBuilder(); - mprGroupBuild.setGroupId(new GroupId( - BinContent - .intToUnsignedLong(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Group.OFPGALL - .getIntValue()))); - caseBuilder.setMultipartRequestGroup(mprGroupBuild.build()); - - // Create multipart request header - final Xid xid = requestContext.getXid(); - final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader( - MultipartType.OFPMPGROUP, xid.getValue(), getVersion()); - - // Set request body to main multipart request - mprInput.setMultipartRequestBody(caseBuilder.build()); - - // Send the request, no cookies associated, use any connection - - MultipartRequestInput multipartRequestInput = mprInput.build(); - - return StatisticsServiceUtil.getRpcResultListenableFuture(xid, multipartRequestInput, getDeviceContext()); - } - }); - + return allGroups.handleServiceCall(input); } - @Override public Future> getGroupDescription(final GetGroupDescriptionInput input) { - return handleServiceCall( - new Function, - ListenableFuture>>() { - - @Override - public ListenableFuture> apply(final RequestContext requestContext) { - final MultipartRequestGroupDescCaseBuilder mprGroupDescCaseBuild = new MultipartRequestGroupDescCaseBuilder(); - - final Xid xid = requestContext.getXid(); - final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader( - MultipartType.OFPMPGROUPDESC, xid.getValue(), getVersion()); - mprInput.setMultipartRequestBody(mprGroupDescCaseBuild.build()); - MultipartRequestInput multipartRequestInput = mprInput.build(); - return StatisticsServiceUtil.getRpcResultListenableFuture(xid, multipartRequestInput, getDeviceContext()); - } - }); - + return groupDesc.handleServiceCall(input); } @Override public Future> getGroupFeatures(final GetGroupFeaturesInput input) { - return handleServiceCall( - new Function, - ListenableFuture>>() { - - @Override - public ListenableFuture> apply(final RequestContext requestContext) { - final MultipartRequestGroupFeaturesCaseBuilder mprGroupFeaturesBuild = new MultipartRequestGroupFeaturesCaseBuilder(); - - final Xid xid = requestContext.getXid(); - final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader( - MultipartType.OFPMPGROUPFEATURES, xid.getValue(), getVersion()); - mprInput.setMultipartRequestBody(mprGroupFeaturesBuild.build()); - MultipartRequestInput multipartRequestInput = mprInput.build(); - return StatisticsServiceUtil.getRpcResultListenableFuture(xid, multipartRequestInput, getDeviceContext()); - } - }); - + return groupFeat.handleServiceCall(input); } @Override public Future> getGroupStatistics(final GetGroupStatisticsInput input) { - return handleServiceCall( - new Function, ListenableFuture>>() { - - @Override - public ListenableFuture> apply(final RequestContext requestContext) { - - final MultipartRequestGroupCaseBuilder caseBuilder = new MultipartRequestGroupCaseBuilder(); - final MultipartRequestGroupBuilder mprGroupBuild = new MultipartRequestGroupBuilder(); - mprGroupBuild.setGroupId(new GroupId(input.getGroupId().getValue())); - caseBuilder.setMultipartRequestGroup(mprGroupBuild.build()); - - final Xid xid = requestContext.getXid(); - final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader( - MultipartType.OFPMPGROUP, xid.getValue(), getVersion()); - - mprInput.setMultipartRequestBody(caseBuilder.build()); - MultipartRequestInput multipartRequestInput = mprInput.build(); - return StatisticsServiceUtil.getRpcResultListenableFuture(xid, multipartRequestInput, getDeviceContext()); - } - }); + return groupStats.handleServiceCall(input); } - } diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OpendaylightMeterStatisticsServiceImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OpendaylightMeterStatisticsServiceImpl.java index 4c1c4d0ced..ecee95ef78 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OpendaylightMeterStatisticsServiceImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OpendaylightMeterStatisticsServiceImpl.java @@ -7,17 +7,9 @@ */ package org.opendaylight.openflowplugin.impl.statistics.services; -import com.google.common.base.Function; -import com.google.common.util.concurrent.ListenableFuture; import java.util.concurrent.Future; -import org.opendaylight.openflowjava.protocol.api.util.BinContent; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; -import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack; -import org.opendaylight.openflowplugin.api.openflow.device.Xid; -import org.opendaylight.openflowplugin.impl.services.CommonService; -import org.opendaylight.openflowplugin.impl.services.RequestInputUtils; -import org.opendaylight.openflowplugin.impl.util.StatisticsServiceUtil; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterConfigStatisticsInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterConfigStatisticsOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsInput; @@ -27,127 +19,39 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111. import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterStatisticsInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterStatisticsOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.OpendaylightMeterStatisticsService; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterFeaturesCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter._case.MultipartRequestMeterBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter.config._case.MultipartRequestMeterConfigBuilder; import org.opendaylight.yangtools.yang.common.RpcResult; -/** - * @author joe - */ -public class OpendaylightMeterStatisticsServiceImpl extends CommonService implements OpendaylightMeterStatisticsService { - - - public OpendaylightMeterStatisticsServiceImpl(final RequestContextStack requestContextStack, DeviceContext deviceContext) { - super(requestContextStack, deviceContext); +public class OpendaylightMeterStatisticsServiceImpl implements OpendaylightMeterStatisticsService { + private final AllMeterConfigStatsService allMeterConfig; + private final AllMeterStatsService allMeterStats; + private final MeterFeaturesService meterFeatures; + private final MeterStatsService meterStats; + + public OpendaylightMeterStatisticsServiceImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + allMeterConfig = new AllMeterConfigStatsService(requestContextStack, deviceContext); + allMeterStats = new AllMeterStatsService(requestContextStack, deviceContext); + meterFeatures = new MeterFeaturesService(requestContextStack, deviceContext); + meterStats = new MeterStatsService(requestContextStack, deviceContext); } @Override public Future> getAllMeterConfigStatistics( final GetAllMeterConfigStatisticsInput input) { - return handleServiceCall(new Function, - ListenableFuture>>() { - - @Override - public ListenableFuture> apply(final RequestContext requestContext) { - - MultipartRequestMeterConfigCaseBuilder caseBuilder = - new MultipartRequestMeterConfigCaseBuilder(); - MultipartRequestMeterConfigBuilder mprMeterConfigBuild = - new MultipartRequestMeterConfigBuilder(); - mprMeterConfigBuild.setMeterId(new MeterId(BinContent.intToUnsignedLong( - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common - .types.rev130731.Meter.OFPMALL.getIntValue()))); - caseBuilder.setMultipartRequestMeterConfig(mprMeterConfigBuild.build()); - - final Xid xid = requestContext.getXid(); - MultipartRequestInputBuilder mprInput = RequestInputUtils - .createMultipartHeader(MultipartType.OFPMPMETERCONFIG, xid.getValue(), getVersion()); - mprInput.setMultipartRequestBody(caseBuilder.build()); - MultipartRequestInput multipartRequestInput = mprInput.build(); - return StatisticsServiceUtil.getRpcResultListenableFuture(xid, multipartRequestInput, getDeviceContext()); - } - }); - + return allMeterConfig.handleServiceCall(input); } @Override public Future> getAllMeterStatistics(final GetAllMeterStatisticsInput input) { - - return handleServiceCall( - new Function, ListenableFuture>>() { - @Override - public ListenableFuture> apply(final RequestContext requestContext) { - - MultipartRequestMeterCaseBuilder caseBuilder = - new MultipartRequestMeterCaseBuilder(); - MultipartRequestMeterBuilder mprMeterBuild = - new MultipartRequestMeterBuilder(); - mprMeterBuild.setMeterId(new MeterId(BinContent.intToUnsignedLong( - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common - .types.rev130731.Meter.OFPMALL.getIntValue()))); - caseBuilder.setMultipartRequestMeter(mprMeterBuild.build()); - - final Xid xid = requestContext.getXid(); - MultipartRequestInputBuilder mprInput = RequestInputUtils - .createMultipartHeader(MultipartType.OFPMPMETER, xid.getValue(), getVersion()); - mprInput.setMultipartRequestBody(caseBuilder.build()); - MultipartRequestInput multipartRequestInput = mprInput.build(); - return StatisticsServiceUtil.getRpcResultListenableFuture(xid, multipartRequestInput, getDeviceContext()); - } - } - ); - + return allMeterStats.handleServiceCall(input); } @Override public Future> getMeterFeatures(final GetMeterFeaturesInput input) { - return handleServiceCall( - new Function, ListenableFuture>>() { - @Override - public ListenableFuture> apply(final RequestContext requestContext) { - - MultipartRequestMeterFeaturesCaseBuilder mprMeterFeaturesBuild = - new MultipartRequestMeterFeaturesCaseBuilder(); - - final Xid xid = requestContext.getXid(); - MultipartRequestInputBuilder mprInput = - RequestInputUtils.createMultipartHeader(MultipartType.OFPMPMETERFEATURES, xid.getValue(), getVersion()); - mprInput.setMultipartRequestBody(mprMeterFeaturesBuild.build()); - MultipartRequestInput multipartRequestInput = mprInput.build(); - return StatisticsServiceUtil.getRpcResultListenableFuture(xid, multipartRequestInput, getDeviceContext()); - } - }); + return meterFeatures.handleServiceCall(input); } @Override public Future> getMeterStatistics(final GetMeterStatisticsInput input) { - return handleServiceCall( - new Function, ListenableFuture>>() { - @Override - public ListenableFuture> apply(final RequestContext requestContext) { - MultipartRequestMeterCaseBuilder caseBuilder = - new MultipartRequestMeterCaseBuilder(); - MultipartRequestMeterBuilder mprMeterBuild = - new MultipartRequestMeterBuilder(); - mprMeterBuild.setMeterId(new MeterId(input.getMeterId().getValue())); - caseBuilder.setMultipartRequestMeter(mprMeterBuild.build()); - - final Xid xid = requestContext.getXid(); - MultipartRequestInputBuilder mprInput = - RequestInputUtils.createMultipartHeader(MultipartType.OFPMPMETER, xid.getValue(), getVersion()); - mprInput.setMultipartRequestBody(caseBuilder.build()); - MultipartRequestInput multipartRequestInput = mprInput.build(); - return StatisticsServiceUtil.getRpcResultListenableFuture(xid, multipartRequestInput, getDeviceContext()); - } - }); - + return meterStats.handleServiceCall(input); } - } diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OpendaylightPortStatisticsServiceImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OpendaylightPortStatisticsServiceImpl.java index fed18d7f6d..4258c01331 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OpendaylightPortStatisticsServiceImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OpendaylightPortStatisticsServiceImpl.java @@ -7,24 +7,9 @@ */ package org.opendaylight.openflowplugin.impl.statistics.services; -import com.google.common.base.Function; -import com.google.common.util.concurrent.ListenableFuture; import java.util.concurrent.Future; -import org.opendaylight.openflowplugin.api.OFConstants; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; -import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack; -import org.opendaylight.openflowplugin.api.openflow.device.Xid; -import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion; -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.util.InventoryDataServiceUtil; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.port.stats._case.MultipartRequestPortStatsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetAllNodeConnectorsStatisticsInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetAllNodeConnectorsStatisticsOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetNodeConnectorStatisticsInput; @@ -32,74 +17,24 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.G import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.OpendaylightPortStatisticsService; import org.opendaylight.yangtools.yang.common.RpcResult; -/** - * @author joe - */ -public class OpendaylightPortStatisticsServiceImpl extends CommonService implements OpendaylightPortStatisticsService { +public class OpendaylightPortStatisticsServiceImpl implements OpendaylightPortStatisticsService { + private final AllPortStatsService allPortStats; + private final PortStatsService portStats; - public OpendaylightPortStatisticsServiceImpl(final RequestContextStack requestContextStack, DeviceContext deviceContext) { - super(requestContextStack, deviceContext); + public OpendaylightPortStatisticsServiceImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + allPortStats = new AllPortStatsService(requestContextStack, deviceContext); + portStats = new PortStatsService(requestContextStack, deviceContext); } @Override public Future> getAllNodeConnectorsStatistics( final GetAllNodeConnectorsStatisticsInput input) { - return handleServiceCall( - new Function, - ListenableFuture>>() { - - @Override - public ListenableFuture> apply(final RequestContext requestContext) { - - MultipartRequestPortStatsCaseBuilder caseBuilder = - new MultipartRequestPortStatsCaseBuilder(); - MultipartRequestPortStatsBuilder mprPortStatsBuilder = - new MultipartRequestPortStatsBuilder(); - // Select all ports - mprPortStatsBuilder.setPortNo(OFConstants.OFPP_ANY); - caseBuilder.setMultipartRequestPortStats(mprPortStatsBuilder.build()); - - final Xid xid = requestContext.getXid(); - MultipartRequestInputBuilder mprInput = RequestInputUtils - .createMultipartHeader(MultipartType.OFPMPPORTSTATS, xid.getValue(), getVersion()); - mprInput.setMultipartRequestBody(caseBuilder.build()); - MultipartRequestInput multipartRequestInput = mprInput.build(); - return StatisticsServiceUtil.getRpcResultListenableFuture(xid, multipartRequestInput, getDeviceContext()); - } - }); + return allPortStats.handleServiceCall(input); } @Override public Future> getNodeConnectorStatistics( final GetNodeConnectorStatisticsInput input) { - return handleServiceCall( - new Function, - ListenableFuture>>() { - - @Override - public ListenableFuture> apply(final RequestContext requestContext) { - - MultipartRequestPortStatsCaseBuilder caseBuilder = - new MultipartRequestPortStatsCaseBuilder(); - MultipartRequestPortStatsBuilder mprPortStatsBuilder = - new MultipartRequestPortStatsBuilder(); - // Set specific port - final short version = getVersion(); - mprPortStatsBuilder - .setPortNo(InventoryDataServiceUtil.portNumberfromNodeConnectorId( - OpenflowVersion.get(version), - input.getNodeConnectorId())); - caseBuilder.setMultipartRequestPortStats(mprPortStatsBuilder.build()); - - final Xid xid = requestContext.getXid(); - MultipartRequestInputBuilder mprInput = RequestInputUtils - .createMultipartHeader(MultipartType.OFPMPPORTSTATS, xid.getValue(), version); - mprInput.setMultipartRequestBody(caseBuilder.build()); - MultipartRequestInput multipartRequestInput = mprInput.build(); - return StatisticsServiceUtil.getRpcResultListenableFuture(xid, multipartRequestInput, getDeviceContext()); - } - }); - + return portStats.handleServiceCall(input); } - } diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OpendaylightQueueStatisticsServiceImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OpendaylightQueueStatisticsServiceImpl.java index 702c2dd290..adc97cf133 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OpendaylightQueueStatisticsServiceImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/OpendaylightQueueStatisticsServiceImpl.java @@ -7,24 +7,9 @@ */ package org.opendaylight.openflowplugin.impl.statistics.services; -import com.google.common.base.Function; -import com.google.common.util.concurrent.ListenableFuture; import java.util.concurrent.Future; -import org.opendaylight.openflowplugin.api.OFConstants; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; -import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack; -import org.opendaylight.openflowplugin.api.openflow.device.Xid; -import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion; -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.util.InventoryDataServiceUtil; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.queue._case.MultipartRequestQueueBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromAllPortsInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromAllPortsOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromGivenPortInput; @@ -34,107 +19,32 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216. import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.OpendaylightQueueStatisticsService; import org.opendaylight.yangtools.yang.common.RpcResult; -/** - * @author joe - */ -public class OpendaylightQueueStatisticsServiceImpl extends CommonService implements OpendaylightQueueStatisticsService { +public class OpendaylightQueueStatisticsServiceImpl implements OpendaylightQueueStatisticsService { + private final AllQueuesAllPortsService allQueuesAllPorts; + private final AllQueuesOnePortService allQueuesOnePort; + private final OneQueueOnePortService oneQueueOnePort; - public OpendaylightQueueStatisticsServiceImpl(final RequestContextStack requestContextStack, DeviceContext deviceContext) { - super(requestContextStack, deviceContext); + public OpendaylightQueueStatisticsServiceImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + allQueuesAllPorts = new AllQueuesAllPortsService(requestContextStack, deviceContext); + allQueuesOnePort = new AllQueuesOnePortService(requestContextStack, deviceContext); + oneQueueOnePort = new OneQueueOnePortService(requestContextStack, deviceContext); } @Override public Future> getAllQueuesStatisticsFromAllPorts( final GetAllQueuesStatisticsFromAllPortsInput input) { - return handleServiceCall( - new Function, - ListenableFuture>>() { - - @Override - public ListenableFuture> apply(final RequestContext requestContext) { - - - MultipartRequestQueueCaseBuilder caseBuilder = new MultipartRequestQueueCaseBuilder(); - MultipartRequestQueueBuilder mprQueueBuilder = new MultipartRequestQueueBuilder(); - // Select all ports - // Select all the ports - mprQueueBuilder.setQueueId(OFConstants.OFPQ_ALL); - mprQueueBuilder.setPortNo(OFConstants.OFPP_ANY); - caseBuilder.setMultipartRequestQueue(mprQueueBuilder.build()); - - // Set request body to main multipart request - final Xid xid = requestContext.getXid(); - - MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader( - MultipartType.OFPMPQUEUE, xid.getValue(), getVersion()); - mprInput.setMultipartRequestBody(caseBuilder.build()); - MultipartRequestInput multipartRequestInput = mprInput.build(); - - return StatisticsServiceUtil.getRpcResultListenableFuture(xid, multipartRequestInput, getDeviceContext()); - } - }); - + return allQueuesAllPorts.handleServiceCall(input); } @Override public Future> getAllQueuesStatisticsFromGivenPort( final GetAllQueuesStatisticsFromGivenPortInput input) { - return handleServiceCall( - new Function, ListenableFuture>>() { - - @Override - public ListenableFuture> apply(final RequestContext requestContext) { - - MultipartRequestQueueCaseBuilder caseBuilder = new MultipartRequestQueueCaseBuilder(); - MultipartRequestQueueBuilder mprQueueBuilder = new MultipartRequestQueueBuilder(); - // Select all queues - // Select specific port - final short version = getVersion(); - mprQueueBuilder.setPortNo(InventoryDataServiceUtil.portNumberfromNodeConnectorId( - OpenflowVersion.get(version), input.getNodeConnectorId())); - - mprQueueBuilder.setQueueId(OFConstants.OFPQ_ALL); - caseBuilder.setMultipartRequestQueue(mprQueueBuilder.build()); - - // Set request body to main multipart request - final Xid xid = requestContext.getXid(); - MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader( - MultipartType.OFPMPQUEUE, xid.getValue(), version); - mprInput.setMultipartRequestBody(caseBuilder.build()); - MultipartRequestInput multipartRequestInput = mprInput.build(); - return StatisticsServiceUtil.getRpcResultListenableFuture(xid, multipartRequestInput, getDeviceContext()); - } - }); + return allQueuesOnePort.handleServiceCall(input); } @Override public Future> getQueueStatisticsFromGivenPort( final GetQueueStatisticsFromGivenPortInput input) { - return handleServiceCall( - new Function, ListenableFuture>>() { - - @Override - public ListenableFuture> apply(final RequestContext requestContext) { - - MultipartRequestQueueCaseBuilder caseBuilder = new MultipartRequestQueueCaseBuilder(); - MultipartRequestQueueBuilder mprQueueBuilder = new MultipartRequestQueueBuilder(); - // Select specific queue - mprQueueBuilder.setQueueId(input.getQueueId().getValue()); - // Select specific port - final short version = getVersion(); - mprQueueBuilder.setPortNo(InventoryDataServiceUtil.portNumberfromNodeConnectorId( - OpenflowVersion.get(version), input.getNodeConnectorId())); - caseBuilder.setMultipartRequestQueue(mprQueueBuilder.build()); - - // Set request body to main multipart request - final Xid xid = requestContext.getXid(); - MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader( - MultipartType.OFPMPQUEUE, xid.getValue(), version); - mprInput.setMultipartRequestBody(caseBuilder.build()); - MultipartRequestInput multipartRequestInput = mprInput.build(); - return StatisticsServiceUtil.getRpcResultListenableFuture(xid, multipartRequestInput, getDeviceContext()); - } - }); + return oneQueueOnePort.handleServiceCall(input); } - } diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/PortStatsService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/PortStatsService.java new file mode 100644 index 0000000000..6803ba28d2 --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/PortStatsService.java @@ -0,0 +1,51 @@ +/** + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.openflowplugin.impl.statistics.services; + +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.api.openflow.md.util.OpenflowVersion; +import org.opendaylight.openflowplugin.impl.services.AbstractSimpleService; +import org.opendaylight.openflowplugin.impl.services.RequestInputUtils; +import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType; +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.request.multipart.request.body.MultipartRequestPortStatsCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.port.stats._case.MultipartRequestPortStatsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetNodeConnectorStatisticsInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetNodeConnectorStatisticsOutput; + +final class PortStatsService extends AbstractSimpleService { + + protected PortStatsService(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + super(requestContextStack, deviceContext, GetNodeConnectorStatisticsOutput.class); + } + + @Override + protected OfHeader buildRequest(final Xid xid, final GetNodeConnectorStatisticsInput input) { + MultipartRequestPortStatsCaseBuilder caseBuilder = + new MultipartRequestPortStatsCaseBuilder(); + MultipartRequestPortStatsBuilder mprPortStatsBuilder = + new MultipartRequestPortStatsBuilder(); + // Set specific port + final short version = getVersion(); + mprPortStatsBuilder + .setPortNo(InventoryDataServiceUtil.portNumberfromNodeConnectorId( + OpenflowVersion.get(version), + input.getNodeConnectorId())); + caseBuilder.setMultipartRequestPortStats(mprPortStatsBuilder.build()); + + MultipartRequestInputBuilder mprInput = RequestInputUtils + .createMultipartHeader(MultipartType.OFPMPPORTSTATS, xid.getValue(), version); + mprInput.setMultipartRequestBody(caseBuilder.build()); + + return mprInput.build(); + } +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/dedicated/StatisticsGatheringService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/dedicated/StatisticsGatheringService.java index 0516d5d149..deea2e4a74 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/dedicated/StatisticsGatheringService.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/dedicated/StatisticsGatheringService.java @@ -8,87 +8,32 @@ package org.opendaylight.openflowplugin.impl.statistics.services.dedicated; -import com.google.common.base.Function; -import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.ListenableFuture; import java.util.List; import java.util.concurrent.Future; -import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueue; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; -import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack; import org.opendaylight.openflowplugin.api.openflow.device.Xid; -import org.opendaylight.openflowplugin.api.openflow.device.handlers.MultiMsgCollector; import org.opendaylight.openflowplugin.impl.common.MultipartRequestInputFactory; -import org.opendaylight.openflowplugin.impl.services.CommonService; -import org.opendaylight.openflowplugin.impl.services.RequestContextUtil; +import org.opendaylight.openflowplugin.impl.services.AbstractMultipartService; 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.MultipartRequestInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; -import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; -import org.opendaylight.yangtools.yang.common.RpcResultBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Created by Martin Bobak <mbobak@cisco.com> on 4.4.2015. */ -public class StatisticsGatheringService extends CommonService { - - private static final Logger LOG = LoggerFactory.getLogger(StatisticsGatheringService.class); - +public class StatisticsGatheringService extends AbstractMultipartService { public StatisticsGatheringService(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { - super(requestContextStack, deviceContext); } - public Future>> getStatisticsOfType(final MultipartType type) { - return handleServiceCall(new Function>, ListenableFuture>>>() { - @Override - public ListenableFuture>> apply(final RequestContext> requestContext) { - final Xid xid = requestContext.getXid(); - final DeviceContext deviceContext = getDeviceContext(); - final MultiMsgCollector multiMsgCollector = deviceContext.getMultiMsgCollector(requestContext); - - - final MultipartRequestInput multipartRequestInput = MultipartRequestInputFactory. - makeMultipartRequestInput(xid.getValue(), - getVersion(), - type); - final OutboundQueue outboundQueue = deviceContext.getPrimaryConnectionContext().getOutboundQueueProvider(); - outboundQueue.commitEntry(xid.getValue(), multipartRequestInput, new FutureCallback() { - @Override - public void onSuccess(final OfHeader ofHeader) { - if (ofHeader instanceof MultipartReply) { - final MultipartReply multipartReply = (MultipartReply) ofHeader; - multiMsgCollector.addMultipartMsg(multipartReply); - } else { - if (null != ofHeader) { - LOG.info("Unexpected response type received {}.", ofHeader.getClass()); - final RpcResultBuilder> rpcResultBuilder = RpcResultBuilder.>failed().withError(RpcError.ErrorType.APPLICATION, String.format("Unexpected response type received %s.", ofHeader.getClass())); - requestContext.setResult(rpcResultBuilder.build()); - } else { - LOG.info("Ofheader was null."); - multiMsgCollector.endCollecting(); - } - } - } - - @Override - public void onFailure(final Throwable throwable) { - final RpcResultBuilder> rpcResultBuilder = RpcResultBuilder.>failed().withError(RpcError.ErrorType.APPLICATION, throwable.getMessage()); - requestContext.setResult(rpcResultBuilder.build()); - RequestContextUtil.closeRequstContext(requestContext); - } - }); - return requestContext.getFuture(); - } - } - - ); + return handleServiceCall(type); } + @Override + protected OfHeader buildRequest(final Xid xid, final MultipartType input) { + return MultipartRequestInputFactory.makeMultipartRequestInput(xid.getValue(), getVersion(), input); + } } diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/util/StatisticsServiceUtil.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/util/StatisticsServiceUtil.java deleted file mode 100644 index 59b48f4d73..0000000000 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/util/StatisticsServiceUtil.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.openflowplugin.impl.util; - -import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.ListenableFuture; -import com.google.common.util.concurrent.SettableFuture; -import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueue; -import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; -import org.opendaylight.openflowplugin.api.openflow.device.Xid; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; -import org.opendaylight.yangtools.yang.common.RpcResult; - -/** - * Created by Martin Bobak <mbobak@cisco.com> on 18.5.2015. - */ -public class StatisticsServiceUtil { - - private StatisticsServiceUtil() { - throw new IllegalStateException("This class should not be instantiated"); - } - - public static ListenableFuture> getRpcResultListenableFuture(final Xid xid, - final MultipartRequestInput multipartRequestInput, - final DeviceContext deviceContext) { - final SettableFuture> settableFuture = SettableFuture.create(); - final OutboundQueue outboundQueue = deviceContext.getPrimaryConnectionContext().getOutboundQueueProvider(); - outboundQueue.commitEntry(xid.getValue(), multipartRequestInput, new FutureCallback() { - @Override - public void onSuccess(final OfHeader ofHeader) { - } - - @Override - public void onFailure(final Throwable throwable) { - } - }); - return settableFuture; - } - -} -- 2.36.6