X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflowplugin-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fimpl%2Futil%2FMdSalRegistrationUtils.java;h=a1ea39d2dde8603c0ad9ee4694f69d305cbffb70;hb=867da8f64fbc12f407db3d41e96b216f7f62eb5b;hp=70390535baa8042c31b53b368870badeea7e3172;hpb=62e60da3eb606ded7bf443dd025b8de51cb9d2ab;p=openflowplugin.git diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/util/MdSalRegistrationUtils.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/util/MdSalRegistrationUtils.java index 70390535ba..a1ea39d2dd 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/util/MdSalRegistrationUtils.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/util/MdSalRegistrationUtils.java @@ -8,7 +8,6 @@ package org.opendaylight.openflowplugin.impl.util; import com.google.common.base.Preconditions; -import com.google.common.base.Verify; import com.google.common.reflect.TypeToken; import java.util.concurrent.atomic.AtomicLong; import javax.annotation.CheckForNull; @@ -16,14 +15,19 @@ import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; import org.opendaylight.openflowplugin.api.openflow.rpc.RpcContext; import org.opendaylight.openflowplugin.api.openflow.statistics.compatibility.Delegator; +import org.opendaylight.openflowplugin.extension.api.core.extension.ExtensionConverterProvider; import org.opendaylight.openflowplugin.impl.services.FlowCapableTransactionServiceImpl; import org.opendaylight.openflowplugin.impl.services.NodeConfigServiceImpl; import org.opendaylight.openflowplugin.impl.services.PacketProcessingServiceImpl; import org.opendaylight.openflowplugin.impl.services.SalEchoServiceImpl; import org.opendaylight.openflowplugin.impl.services.SalExperimenterMessageServiceImpl; +import org.opendaylight.openflowplugin.impl.services.SalFlatBatchServiceImpl; import org.opendaylight.openflowplugin.impl.services.SalFlowServiceImpl; +import org.opendaylight.openflowplugin.impl.services.SalFlowsBatchServiceImpl; import org.opendaylight.openflowplugin.impl.services.SalGroupServiceImpl; +import org.opendaylight.openflowplugin.impl.services.SalGroupsBatchServiceImpl; import org.opendaylight.openflowplugin.impl.services.SalMeterServiceImpl; +import org.opendaylight.openflowplugin.impl.services.SalMetersBatchServiceImpl; import org.opendaylight.openflowplugin.impl.services.SalPortServiceImpl; import org.opendaylight.openflowplugin.impl.services.SalTableServiceImpl; import org.opendaylight.openflowplugin.impl.statistics.services.OpendaylightFlowStatisticsServiceImpl; @@ -33,8 +37,18 @@ import org.opendaylight.openflowplugin.impl.statistics.services.OpendaylightMete import org.opendaylight.openflowplugin.impl.statistics.services.OpendaylightPortStatisticsServiceImpl; import org.opendaylight.openflowplugin.impl.statistics.services.OpendaylightQueueStatisticsServiceImpl; import org.opendaylight.openflowplugin.impl.statistics.services.compatibility.OpendaylightFlowStatisticsServiceDelegateImpl; +import org.opendaylight.openflowplugin.impl.statistics.services.direct.FlowDirectStatisticsService; +import org.opendaylight.openflowplugin.impl.statistics.services.direct.GroupDirectStatisticsService; +import org.opendaylight.openflowplugin.impl.statistics.services.direct.MeterDirectStatisticsService; +import org.opendaylight.openflowplugin.impl.statistics.services.direct.NodeConnectorDirectStatisticsService; +import org.opendaylight.openflowplugin.impl.statistics.services.direct.OpendaylightDirectStatisticsServiceImpl; +import org.opendaylight.openflowplugin.impl.statistics.services.direct.OpendaylightDirectStatisticsServiceProvider; +import org.opendaylight.openflowplugin.impl.statistics.services.direct.QueueDirectStatisticsService; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor; +import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.OpendaylightDirectStatisticsService; import org.opendaylight.yang.gen.v1.urn.opendaylight.echo.service.rev150305.SalEchoService; import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.SalExperimenterMessageService; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.SalFlatBatchService; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.OpendaylightFlowStatisticsService; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.OpendaylightFlowTableStatisticsService; @@ -50,6 +64,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.O import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.OpendaylightQueueStatisticsService; import org.opendaylight.yang.gen.v1.urn.opendaylight.role.service.rev150727.OfpRole; import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.SalTableService; +import org.opendaylight.yangtools.yang.binding.RpcService; public class MdSalRegistrationUtils { @@ -66,51 +81,60 @@ public class MdSalRegistrationUtils { /** * Method registers all OF services for role {@link OfpRole#BECOMEMASTER} - * @param rpcContext - registration processing is implemented in {@link RpcContext} - * @param deviceContext - every service needs {@link DeviceContext} as input parameter - * @param newRole - role validation for {@link OfpRole#BECOMEMASTER} + * @param rpcContext - registration processing is implemented in {@link org.opendaylight.openflowplugin.api.openflow.rpc.RpcContext} + * @param deviceContext - every service needs {@link org.opendaylight.openflowplugin.api.openflow.device.DeviceContext} as input parameter + * @param convertorExecutor */ - public static void registerMasterServices(@CheckForNull final RpcContext rpcContext, - @CheckForNull final DeviceContext deviceContext, @CheckForNull final OfpRole newRole) { + public static void registerServices(@CheckForNull final RpcContext rpcContext, + @CheckForNull final DeviceContext deviceContext, + final ExtensionConverterProvider extensionConverterProvider, + final ConvertorExecutor convertorExecutor) { Preconditions.checkArgument(rpcContext != null); Preconditions.checkArgument(deviceContext != null); - Preconditions.checkArgument(newRole != null); - Verify.verify(OfpRole.BECOMEMASTER.equals(newRole), "Service call with bad Role {} we expect role BECOMEMASTER", newRole); - rpcContext.registerRpcServiceImplementation(SalEchoService.class, new SalEchoServiceImpl(rpcContext, deviceContext)); + // create service instances + final SalFlowServiceImpl salFlowService = new SalFlowServiceImpl(rpcContext, deviceContext, convertorExecutor); + final FlowCapableTransactionServiceImpl flowCapableTransactionService = new FlowCapableTransactionServiceImpl(rpcContext, deviceContext); + final SalGroupServiceImpl salGroupService = new SalGroupServiceImpl(rpcContext, deviceContext, convertorExecutor); + final SalMeterServiceImpl salMeterService = new SalMeterServiceImpl(rpcContext, deviceContext, convertorExecutor); - rpcContext.registerRpcServiceImplementation(SalFlowService.class, new SalFlowServiceImpl(rpcContext, deviceContext)); + // register routed service instances + rpcContext.registerRpcServiceImplementation(SalEchoService.class, new SalEchoServiceImpl(rpcContext, deviceContext)); + rpcContext.registerRpcServiceImplementation(SalFlowService.class, salFlowService); //TODO: add constructors with rcpContext and deviceContext to meter, group, table constructors - rpcContext.registerRpcServiceImplementation(FlowCapableTransactionService.class, new FlowCapableTransactionServiceImpl(rpcContext, deviceContext)); - rpcContext.registerRpcServiceImplementation(SalMeterService.class, new SalMeterServiceImpl(rpcContext, deviceContext)); - rpcContext.registerRpcServiceImplementation(SalGroupService.class, new SalGroupServiceImpl(rpcContext, deviceContext)); - rpcContext.registerRpcServiceImplementation(SalTableService.class, new SalTableServiceImpl(rpcContext, deviceContext)); - rpcContext.registerRpcServiceImplementation(SalPortService.class, new SalPortServiceImpl(rpcContext, deviceContext)); - rpcContext.registerRpcServiceImplementation(PacketProcessingService.class, new PacketProcessingServiceImpl(rpcContext, deviceContext)); + rpcContext.registerRpcServiceImplementation(FlowCapableTransactionService.class, flowCapableTransactionService); + rpcContext.registerRpcServiceImplementation(SalMeterService.class, salMeterService); + rpcContext.registerRpcServiceImplementation(SalGroupService.class, salGroupService); + rpcContext.registerRpcServiceImplementation(SalTableService.class, new SalTableServiceImpl(rpcContext, deviceContext, convertorExecutor)); + rpcContext.registerRpcServiceImplementation(SalPortService.class, new SalPortServiceImpl(rpcContext, deviceContext, convertorExecutor)); + rpcContext.registerRpcServiceImplementation(PacketProcessingService.class, new PacketProcessingServiceImpl(rpcContext, deviceContext, convertorExecutor)); rpcContext.registerRpcServiceImplementation(NodeConfigService.class, new NodeConfigServiceImpl(rpcContext, deviceContext)); - rpcContext.registerRpcServiceImplementation(OpendaylightFlowStatisticsService.class, new OpendaylightFlowStatisticsServiceImpl(rpcContext, deviceContext)); - // TODO: experimenter symmetric and multipart message services - rpcContext.registerRpcServiceImplementation(SalExperimenterMessageService.class, new SalExperimenterMessageServiceImpl(rpcContext, deviceContext)); - } + rpcContext.registerRpcServiceImplementation(OpendaylightFlowStatisticsService.class, OpendaylightFlowStatisticsServiceImpl.createWithOook(rpcContext, deviceContext, convertorExecutor)); - /** - * Method unregisters all services in first step. So we don't need to call {@link MdSalRegistrationUtils#unregisterServices(RpcContext)} - * directly before by change role from {@link OfpRole#BECOMEMASTER} to {@link OfpRole#BECOMESLAVE}. - * Method registers {@link SalEchoService} in next step only because we would like to have SalEchoService as local service for all apps - * to be able actively check connection status for slave connection too. - * @param rpcContext - registration/unregistration processing is implemented in {@link RpcContext} - * @param newRole - role validation for {@link OfpRole#BECOMESLAVE} - */ - public static void registerSlaveServices(@CheckForNull final RpcContext rpcContext, @CheckForNull final OfpRole newRole) { - Preconditions.checkArgument(rpcContext != null); - Preconditions.checkArgument(newRole != null); - Verify.verify(OfpRole.BECOMESLAVE.equals(newRole), "Service call with bad Role {} we expect role BECOMESLAVE", newRole); + // Direct statistics gathering + final OpendaylightDirectStatisticsServiceProvider statisticsProvider = new OpendaylightDirectStatisticsServiceProvider(); + statisticsProvider.register(FlowDirectStatisticsService.class, new FlowDirectStatisticsService(rpcContext, deviceContext, convertorExecutor)); + statisticsProvider.register(GroupDirectStatisticsService.class, new GroupDirectStatisticsService(rpcContext, deviceContext, convertorExecutor)); + statisticsProvider.register(MeterDirectStatisticsService.class, new MeterDirectStatisticsService(rpcContext, deviceContext, convertorExecutor)); + statisticsProvider.register(NodeConnectorDirectStatisticsService.class, new NodeConnectorDirectStatisticsService(rpcContext, deviceContext, convertorExecutor)); + statisticsProvider.register(QueueDirectStatisticsService.class, new QueueDirectStatisticsService(rpcContext, deviceContext, convertorExecutor)); + rpcContext.registerRpcServiceImplementation(OpendaylightDirectStatisticsService.class, new OpendaylightDirectStatisticsServiceImpl(statisticsProvider)); + + final SalFlatBatchServiceImpl salFlatBatchService = new SalFlatBatchServiceImpl( + new SalFlowsBatchServiceImpl(salFlowService, flowCapableTransactionService), + new SalGroupsBatchServiceImpl(salGroupService, flowCapableTransactionService), + new SalMetersBatchServiceImpl(salMeterService, flowCapableTransactionService) + ); + rpcContext.registerRpcServiceImplementation(SalFlatBatchService.class, salFlatBatchService); - unregisterServices(rpcContext); + // TODO: experimenter symmetric and multipart message services + rpcContext.registerRpcServiceImplementation(SalExperimenterMessageService.class, + new SalExperimenterMessageServiceImpl(rpcContext, deviceContext, extensionConverterProvider)); } /** * Method unregisters all OF services. + * * @param rpcContext - unregistration processing is implemented in {@link RpcContext} */ public static void unregisterServices(@CheckForNull final RpcContext rpcContext) { @@ -127,38 +151,41 @@ public class MdSalRegistrationUtils { rpcContext.unregisterRpcServiceImplementation(PacketProcessingService.class); rpcContext.unregisterRpcServiceImplementation(NodeConfigService.class); rpcContext.unregisterRpcServiceImplementation(OpendaylightFlowStatisticsService.class); + rpcContext.unregisterRpcServiceImplementation(SalFlatBatchService.class); // TODO: experimenter symmetric and multipart message services rpcContext.unregisterRpcServiceImplementation(SalExperimenterMessageService.class); + rpcContext.unregisterRpcServiceImplementation(OpendaylightDirectStatisticsService.class); } /** * Support deprecated statistic related services for backward compatibility. The only exception from deprecation is * the aggregated flow statistic with match criteria input. - * - * @param rpcContext + * @param rpcContext * @param deviceContext * @param notificationPublishService - * @param compatibilityXidSeed + * @param convertorExecutor */ public static void registerStatCompatibilityServices(final RpcContext rpcContext, final DeviceContext deviceContext, final NotificationPublishService notificationPublishService, - final AtomicLong compatibilityXidSeed) { + final ConvertorExecutor convertorExecutor) { + + AtomicLong compatibilityXidSeed = new AtomicLong(); // pickup low statistics service final OpendaylightFlowStatisticsService flowStatisticsService = Preconditions.checkNotNull( rpcContext.lookupRpcService(OpendaylightFlowStatisticsService.class)); Preconditions.checkArgument(COMPOSITE_SERVICE_TYPE_TOKEN.isAssignableFrom(flowStatisticsService.getClass())); // attach delegate to flow statistics service (to cover all but aggregated stats with match filter input) final OpendaylightFlowStatisticsServiceDelegateImpl flowStatisticsDelegate = - new OpendaylightFlowStatisticsServiceDelegateImpl(rpcContext, deviceContext, notificationPublishService, new AtomicLong()); + new OpendaylightFlowStatisticsServiceDelegateImpl(rpcContext, deviceContext, notificationPublishService, new AtomicLong(), convertorExecutor); ((Delegator) flowStatisticsService).setDelegate(flowStatisticsDelegate); // register all statistics (deprecated) services rpcContext.registerRpcServiceImplementation(OpendaylightFlowTableStatisticsService.class, new OpendaylightFlowTableStatisticsServiceImpl(rpcContext, deviceContext, compatibilityXidSeed, notificationPublishService)); rpcContext.registerRpcServiceImplementation(OpendaylightGroupStatisticsService.class, - new OpendaylightGroupStatisticsServiceImpl(rpcContext, deviceContext, compatibilityXidSeed, notificationPublishService)); + new OpendaylightGroupStatisticsServiceImpl(rpcContext, deviceContext, compatibilityXidSeed, notificationPublishService, convertorExecutor)); rpcContext.registerRpcServiceImplementation(OpendaylightMeterStatisticsService.class, - new OpendaylightMeterStatisticsServiceImpl(rpcContext, deviceContext, compatibilityXidSeed, notificationPublishService)); + new OpendaylightMeterStatisticsServiceImpl(rpcContext, deviceContext, compatibilityXidSeed, notificationPublishService, convertorExecutor)); rpcContext.registerRpcServiceImplementation(OpendaylightQueueStatisticsService.class, new OpendaylightQueueStatisticsServiceImpl(rpcContext, deviceContext, compatibilityXidSeed, notificationPublishService)); rpcContext.registerRpcServiceImplementation(OpendaylightPortStatisticsService.class,